theprogrammablemind 7.5.7 → 7.5.8-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/client.js CHANGED
@@ -58,10 +58,10 @@ const vimdiff = (actualJSON, expectedJSON) => {
58
58
  // console.log(`vimdiff ${path}/actual.json ${path}/expected.json`)
59
59
  {
60
60
  const editor = runtime.process.env.EDITOR || 'vimdiff'
61
- const child = runtime.child_process.spawn(editor, [`${path}/expected.json`, `${path}/actual.json`], { stdio: 'inherit' })
62
- child.on('exit', function (e, code) {
63
- console.log('finished')
64
- })
61
+ debugger
62
+ // const child = runtime.child_process.spawn(editor, [`${path}/expected.json`, `${path}/actual.json`], { stdio: 'inherit' })
63
+ console.log(`${editor} ${path}/expected.json ${path}/actual.json`)
64
+ runtime.child_process.execSync(`${editor} ${path}/expected.json ${path}/actual.json`, {stdio: 'inherit'})
65
65
  }
66
66
  }
67
67
 
@@ -100,10 +100,23 @@ const asList = (context) => {
100
100
  }
101
101
  }
102
102
 
103
+ class ErrorReason extends Error {
104
+ constructor(context) {
105
+ super(JSON.stringify(context))
106
+ this.reason = context
107
+ }
108
+ }
109
+
103
110
  const setupArgs = (args, config, logs, hierarchy) => {
104
111
  config.setArgs(args)
105
- args.calls = new InitCalls()
112
+ args.calls = new InitCalls(config.name)
113
+ if (global.theprogrammablemind && global.theprogrammablemind.loadForTesting) {
114
+ args.calls = new InitCalls(Object.keys(global.theprogrammablemind.loadForTesting)[0])
115
+ }
106
116
  args.km = (name) => config.getConfig(name)
117
+ args.error = (context) => {
118
+ throw new ErrorReason(context)
119
+ }
107
120
  args.kms = config.getConfigs()
108
121
  args.config = config
109
122
  args.hierarchy = hierarchy
@@ -139,7 +152,10 @@ const setupArgs = (args, config, logs, hierarchy) => {
139
152
  args.g = (c) => config.getGenerators(logs).apply(args, c)
140
153
  args.gp = (c) => config.getGenerators(logs).apply(args, { ...c, paraphrase: true, isResponse: false, response: false})
141
154
  args.gr = (c) => config.getGenerators(logs).apply(args, { ...c, paraphrase: false, isResponse: true })
142
- args.e = (c) => config.getEvaluator(args.s, logs, c)
155
+ if (!logs) {
156
+ debugger
157
+ }
158
+ args.e = (c) => config.getEvaluator(args.s, args.calls, logs, c)
143
159
  args.log = (message) => logs.push(message)
144
160
  // config.getAddedArgs(args)
145
161
  args.gs = gs(args.g)
@@ -349,6 +365,9 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
349
365
 
350
366
  const objects = config.get('objects')
351
367
  const args = { objects, isResponse: true, response: json, isTest, getObjects: getObjects(objects) }
368
+ if (!json.logs) {
369
+ json.logs = []
370
+ }
352
371
  setupArgs(args, config, json.logs, hierarchy)
353
372
  const toDo = [...contexts]
354
373
  args.insert = (context) => toDo.unshift(context)
@@ -395,7 +414,8 @@ const processContextsB = ({ config, hierarchy, semantics, generators, json, isTe
395
414
  const mostCalled = semantics.getMostCalled()
396
415
  e.message += `\nThe most called semantic was:\nnotes: ${mostCalled.notes}\nmatch: ${mostCalled.matcher.toString()}\napply: ${mostCalled._apply.toString()}\n`
397
416
  }
398
- throw e;
417
+ // contextPrime = semantics.apply(args, { marker: 'error', context, error: e })
418
+ contextPrime = semantics.apply(args, { marker: 'error', context, reason: e.reason })
399
419
  }
400
420
  }
401
421
  }
@@ -846,10 +866,12 @@ const saveTest = async (testFile, config, test, expected, testConfig, saveDevelo
846
866
  const args = {
847
867
  }
848
868
  const saveObjects = {...config.config.objects}
869
+ /*
849
870
  saveObjects.nameToUUID = {}
850
871
  for (let km of config.configs) {
851
872
  saveObjects.nameToUUID[km.name] = km.uuid
852
873
  }
874
+ */
853
875
  writeTest(testFile, test, saveObjects, result.generated, result.paraphrases, result.responses, result.contexts, result.associations, result.metadata, actualConfig, saveDeveloper)
854
876
  }
855
877
 
@@ -1333,7 +1355,11 @@ const knowledgeModule = async ({
1333
1355
  if (config.needsRebuild(template.template, template.instance)) {
1334
1356
  throw `This module "${config.name}" cannot be used because the instance file needs rebuilding. Run on the command line with no arguements or the -rt argument to rebuild.`
1335
1357
  }
1336
- config.load(template.template, template.instance)
1358
+ try {
1359
+ config.load(template.template, template.instance)
1360
+ } catch( e ) {
1361
+ errorHandler(e)
1362
+ }
1337
1363
  }
1338
1364
  }
1339
1365
  if (isProcess) {
@@ -1576,11 +1602,6 @@ const knowledgeModule = async ({
1576
1602
 
1577
1603
  }
1578
1604
  runTests(config, test, { debug: args.debug, testConfig: useTestConfig, verbose: args.testVerbose || args.testAllVerbose, stopAtFirstError: !args.testAllVerbose }).then((results) => {
1579
- if (results.length > 0 && args.vimdiff) {
1580
- for (const result of results) {
1581
- vimdiff(result.expected, result.actual)
1582
- }
1583
- }
1584
1605
  let newError = false
1585
1606
  if (results.length > 0) {
1586
1607
  let headerShown = false
@@ -1632,10 +1653,19 @@ const knowledgeModule = async ({
1632
1653
  lines.setElement(1, 1, 'actual checked')
1633
1654
  lines.setElement(2, 2, JSON.stringify(result.actual.checked, null, 2))
1634
1655
  lines.log()
1656
+ if (args.vimdiff) {
1657
+ vimdiff(result.actual.checked, result.expected.checked)
1658
+ }
1635
1659
  newError = true
1636
1660
  headerShown = true
1637
1661
  }
1638
1662
  }
1663
+ } else {
1664
+ if (results.length > 0 && args.vimdiff) {
1665
+ for (const result of results) {
1666
+ vimdiff(result.actual, result.expected)
1667
+ }
1668
+ }
1639
1669
  }
1640
1670
  if (!headerShown) {
1641
1671
  if (!(useTestConfig.check && useTestConfig.check.length > 0)) {
package/package.json CHANGED
@@ -44,6 +44,7 @@
44
44
  "src/config.js",
45
45
  "src/copy.js",
46
46
  "src/digraph.js",
47
+ "src/digraph_internal.js",
47
48
  "src/generators.js",
48
49
  "src/semantics.js"
49
50
  ],
@@ -62,6 +63,6 @@
62
63
  "json-stable-stringify": "^1.0.1",
63
64
  "node-fetch": "^2.6.1"
64
65
  },
65
- "version": "7.5.7",
66
+ "version": "7.5.8-beta.1",
66
67
  "license": "ISC"
67
68
  }
package/runtime.js CHANGED
@@ -8,7 +8,7 @@ module.exports = {
8
8
  stdin: process.stdin,
9
9
  stdout: process.stdout,
10
10
  },
11
- child_process: 'wtf',
11
+ child_process: require('child_process'),
12
12
  fs,
13
13
  ArgumentParser,
14
14
  readline: require('readline'),
package/src/config.js CHANGED
@@ -79,7 +79,8 @@ const handleBridgeProps = (config, bridge) => {
79
79
  if (bridge.generatorp) {
80
80
  config.config.generators.unshift({
81
81
  where: bridge.generatorp.where || bridge.where || client.where(4),
82
- match: ({context}) => bridge.id == context.marker && context.paraphrase,
82
+ // match: ({context}) => bridge.id == context.marker && context.paraphrase,
83
+ match: ({context}) => bridge.id == context.marker && context.level == bridge.level + 1 && context.paraphrase,
83
84
  apply: (args) => bridge.generatorp(args),
84
85
  applyWrapped: bridge.generatorp,
85
86
  property: 'generatorp',
@@ -614,8 +615,9 @@ class Config {
614
615
  return instance
615
616
  }
616
617
  */
617
- getEvaluator (s, log, context) {
618
+ getEvaluator (s, calls, log, context) {
618
619
  const instance = s({ ...context, evaluate: true })
620
+ calls.touch(instance)
619
621
  if (!instance.evalue && !instance.verbatim && !instance.value) {
620
622
  this.warningNotEvaluated(log, context);
621
623
  }
@@ -0,0 +1,131 @@
1
+ const toA = (edge) => {
2
+ if (Array.isArray(edge)) {
3
+ return edge
4
+ } else {
5
+ return [edge.child, edge.parent]
6
+ }
7
+ }
8
+
9
+ class DigraphInternal {
10
+ // edges maybe either [child, parent] or { child, parent }
11
+ constructor (edges = []) {
12
+ // dont make a copy of edges. this is shared and that breaks stuff. TODO fix this
13
+ this._edges = edges
14
+ }
15
+
16
+ addEdges(edges) {
17
+ for (let edge of edges) {
18
+ this.addEdge(edge)
19
+ }
20
+ }
21
+
22
+ addEdge(edge) {
23
+ edge = toA(edge)
24
+ this._edges.push(edge)
25
+ }
26
+
27
+ get edges() {
28
+ return this._edges
29
+ }
30
+
31
+ set edges(edges) {
32
+ this._edges = edges
33
+ }
34
+
35
+ /*
36
+ set edges(edges) {
37
+ this._edges = edges.map( toA )
38
+ }
39
+ */
40
+
41
+ acdcs (s, from, to) {
42
+ const todo = [s]
43
+ const seen = new Set([s])
44
+ const acdcs = new Set([])
45
+ while (todo.length > 0) {
46
+ const n = todo.pop()
47
+ this._edges.forEach((e) => {
48
+ e = toA(e)
49
+ if (e[from] === n) {
50
+ acdcs.add(e[to])
51
+ if (!seen.has(e[to])) {
52
+ todo.push(e[to])
53
+ seen.add(e[to])
54
+ }
55
+ }
56
+ })
57
+ }
58
+ return acdcs
59
+ }
60
+
61
+ isA (low, high) {
62
+ if (low === high) {
63
+ return true
64
+ }
65
+ return this.ancestors(low).has(high)
66
+ }
67
+
68
+ lessThan (low, high) {
69
+ if (low === high) {
70
+ return false
71
+ }
72
+ return this.ancestors(low).has(high)
73
+ }
74
+
75
+ descendants (s) {
76
+ return this.acdcs(s, 1, 0)
77
+ }
78
+
79
+ ancestors (s) {
80
+ return this.acdcs(s, 0, 1)
81
+ }
82
+
83
+ minima (nodes) {
84
+ let minima = new Set(nodes)
85
+ const ancestors = new Set([])
86
+ nodes.forEach((node) => {
87
+ this.ancestors(node).forEach((n) => ancestors.add(n))
88
+ })
89
+ ancestors.forEach((n) => minima.delete(n))
90
+ if (minima.size === 0) {
91
+ // all unrelated
92
+ minima = new Set(nodes)
93
+ }
94
+ return minima
95
+ }
96
+
97
+ maxima (nodes) {
98
+ const maxima = new Set(nodes)
99
+ const descendants = new Set([])
100
+ nodes.forEach((node) => {
101
+ this.descendants(node).forEach((n) => descendants.add(n))
102
+ })
103
+ descendants.forEach((n) => maxima.delete(n))
104
+ return maxima
105
+ }
106
+
107
+ add (child, parent) {
108
+ this._edges.push([child, parent])
109
+ }
110
+
111
+ addList (l) {
112
+ for (let i = 1; i < l.length; ++i) {
113
+ this._edges.push([l[i - 1], l[i]])
114
+ }
115
+ }
116
+
117
+ order (todo) {
118
+ const ordered = []
119
+ while (todo.length > 0) {
120
+ const nodes = this.minima(todo)
121
+ todo = todo.filter((e) => !nodes.has(e))
122
+ for (const node of nodes) {
123
+ ordered.push(node)
124
+ }
125
+ // ordered = ordered.concat([...nodes])
126
+ }
127
+ return ordered
128
+ }
129
+ }
130
+
131
+ module.exports = DigraphInternal
package/src/helpers.js CHANGED
@@ -172,10 +172,11 @@ nextContextId = 0
172
172
 
173
173
  class InitCalls {
174
174
 
175
- constructor() {
175
+ constructor(name) {
176
176
  this.nextCallId = 0
177
177
  this.nextContextId = 0
178
178
  this.stack = []
179
+ this.name = name
179
180
  }
180
181
 
181
182
  start() {
@@ -192,13 +193,13 @@ class InitCalls {
192
193
  // this.nextCallId += 1
193
194
  // this.stack.push(this.nextCallId)
194
195
  this.stack.push(this.nextCallId)
195
- const calls = this.stack.map( (call) => `call${call}` )
196
+ const calls = this.stack.map( (call) => `${this.name}#call${call}` )
196
197
  // return `Context#${this.nextContextId}: ${calls}`
197
198
  return `Context#${nextContextId}: ${calls}`
198
199
  }
199
200
 
200
201
  current() {
201
- return `call${this.stack[this.stack.length-1]}`
202
+ return `${this.name}#call${this.stack[this.stack.length-1]}`
202
203
  }
203
204
 
204
205
  touch(context) {
package/src/semantics.js CHANGED
@@ -237,7 +237,7 @@ class Semantics {
237
237
  // this.logs.push(message)
238
238
  // return [message]
239
239
  args.calls.pop()
240
- throw { error: [message], logs: this.logs }
240
+ throw { error: [message], logs: this.logs, reason: e.reason }
241
241
  }
242
242
  args.calls.touch(contextPrime)
243
243
  // this.logs.push(`Semantics: applied ${semantic.toString()}\n to\n ${JSON.stringify(context)}\n the result was ${JSON.stringify(contextPrime)}\n`)