tpmkms_4wp 9.5.1 → 9.6.0

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.
Files changed (122) hide show
  1. package/common/animals.instance.json +21 -61
  2. package/common/asking.js +116 -106
  3. package/common/avatar.test.json +1001 -860
  4. package/common/can.instance.json +2174 -0
  5. package/common/can.js +254 -0
  6. package/common/can.test.json +51307 -0
  7. package/common/characters.js +5 -5
  8. package/common/colors.instance.json +12 -12
  9. package/common/comparable.instance.json +3 -3
  10. package/common/concept.js +25 -27
  11. package/common/concept.test.json +180 -144
  12. package/common/conjunction.js +13 -5
  13. package/common/conjunction.test.json +32 -42
  14. package/common/crew.instance.json +196 -160
  15. package/common/crew.js +1 -1
  16. package/common/crew.test.json +4148 -3324
  17. package/common/currency.js +1 -1
  18. package/common/dateTimeSelectors.instance.json +2 -2
  19. package/common/dateTimeSelectors.js +3 -3
  20. package/common/dateTimeSelectors.test.json +76935 -35739
  21. package/common/dates.instance.json +3 -3
  22. package/common/dates.test.json +284 -287
  23. package/common/dialogues.js +41 -119
  24. package/common/dialogues.test.json +1171 -996
  25. package/common/dimension.instance.json +21369 -557
  26. package/common/dimension.js +148 -54
  27. package/common/dimension.test.json +8753 -3495
  28. package/common/drone.instance.json +23712 -0
  29. package/common/drone.js +448 -0
  30. package/common/drone.test.json +66665 -0
  31. package/common/edible.instance.json +32 -32
  32. package/common/emotions.instance.json +75 -76
  33. package/common/emotions.js +1 -1
  34. package/common/emotions.test.json +242 -174
  35. package/common/english_helpers.js +336 -0
  36. package/common/errors.js +6 -6
  37. package/common/evaluate.js +2 -2
  38. package/common/events.js +8 -8
  39. package/common/fastfood.instance.json +389 -245
  40. package/common/fastfood.js +11 -11
  41. package/common/fastfood.test.json +6970 -6829
  42. package/common/formulas.instance.json +1 -1
  43. package/common/formulas.js +1 -1
  44. package/common/gdefaults.js +111 -17
  45. package/common/help.js +12 -12
  46. package/common/help.test.json +65 -11
  47. package/common/helpers/concept.js +1 -1
  48. package/common/helpers/conjunction.js +54 -44
  49. package/common/helpers/dateTimeSelectors.js +2 -2
  50. package/common/helpers/dialogues.js +7 -2
  51. package/common/helpers/formulas.js +13 -11
  52. package/common/helpers/menus.js +12 -12
  53. package/common/helpers/meta.js +9 -9
  54. package/common/helpers/properties.js +185 -62
  55. package/common/helpers.js +167 -48
  56. package/common/hierarchy.js +6 -4
  57. package/common/kirk.instance.json +1 -1
  58. package/common/kirk.test.json +600 -424
  59. package/common/latin.instance.json +12 -12
  60. package/common/latin.js +9 -9
  61. package/common/length.instance.json +27612 -2890
  62. package/common/length.js +6 -1
  63. package/common/length.test.json +45315 -3925
  64. package/common/math.instance.json +29 -29
  65. package/common/math.js +47 -46
  66. package/common/menus.instance.json +7 -10
  67. package/common/menus.js +2 -9
  68. package/common/meta.js +77 -60
  69. package/common/nameable.js +20 -13
  70. package/common/nameable.test.json +436 -0
  71. package/common/numbers.js +1 -1
  72. package/common/ordering.instance.json +87 -19
  73. package/common/ordering.js +1 -1
  74. package/common/ordering.test.json +835 -417
  75. package/common/people.instance.json +96 -348
  76. package/common/people.js +6 -4
  77. package/common/people.test.json +4135 -3606
  78. package/common/pipboy.instance.json +17 -17
  79. package/common/pipboy.js +2 -3
  80. package/common/pokemon.instance.json +13 -13
  81. package/common/pokemon.js +1 -1
  82. package/common/pressure.instance.json +3579 -1610
  83. package/common/pressure.test.json +433 -477
  84. package/common/properties.instance.json +6 -17
  85. package/common/properties.js +25 -7
  86. package/common/properties.test.json +9565 -6951
  87. package/common/rates.instance.json +59 -0
  88. package/common/rates.js +97 -0
  89. package/common/rates.test.json +27702 -0
  90. package/common/reminders.instance.json +4 -4
  91. package/common/reminders.js +5 -5
  92. package/common/reminders.test.json +64635 -25787
  93. package/common/reports.instance.json +3 -3
  94. package/common/reports.js +18 -16
  95. package/common/scorekeeper.js +6 -6
  96. package/common/sdefaults.js +22 -2
  97. package/common/spock.instance.json +1 -1
  98. package/common/spock.test.json +606 -430
  99. package/common/stgame.js +1 -1
  100. package/common/stm.js +17 -6
  101. package/common/tell.js +1 -1
  102. package/common/temperature.instance.json +3659 -1690
  103. package/common/temperature.test.json +433 -477
  104. package/common/tester.js +3 -3
  105. package/common/time.instance.json +24762 -0
  106. package/common/time.js +137 -141
  107. package/common/time.test.json +31876 -3757
  108. package/common/tokenize.js +5 -2
  109. package/common/ui.instance.json +2 -5
  110. package/common/ui.js +1 -8
  111. package/common/weight.instance.json +10360 -4078
  112. package/common/weight.test.json +2601 -2263
  113. package/common/words.instance.json +9 -0
  114. package/common/words.js +53 -0
  115. package/common/words.test.json +2 -0
  116. package/common/wp.instance.json +408 -8
  117. package/common/wp.js +8 -4
  118. package/common/wp.test.json +7385 -6906
  119. package/main.js +4 -2
  120. package/package.json +20 -5
  121. package/common/listener.js +0 -50
  122. package/common/listener.test.json +0 -142
@@ -86,8 +86,8 @@ function getTime(time) {
86
86
  return { hour, minute, second }
87
87
  }
88
88
 
89
- instantiate = (isA, now, context) => {
90
- const getType = (context, type) => {
89
+ function instantiate(isA, now, context) {
90
+ function getType(context, type) {
91
91
  if (context.marker == 'onDate_dates' && context.date?.marker == type) {
92
92
  return context.date
93
93
  } if (context.marker == type) {
@@ -86,13 +86,18 @@ class API {
86
86
  return
87
87
  }
88
88
  // const concept = pluralize.singular(value)
89
- const concept = this.toScopedId(context)
89
+ let concept = this.toScopedId(context)
90
+ const extraTypes = []
91
+ if (concept == 'unit' && context.objects) {
92
+ concept = context.objects.map((c) => this.toScopedId(c)).join("_")
93
+ types.push(this.toScopedId(context.objects[0]))
94
+ }
90
95
  if (config.exists(concept)) {
91
96
  return concept
92
97
  }
93
98
 
94
99
  // TODO handle the general case
95
- const fixUps = (concept) => {
100
+ function fixUps(concept) {
96
101
  if (concept == '*') {
97
102
  return '\\*'
98
103
  }
@@ -13,7 +13,7 @@ function getVariables(expression, isVariable = (expression) => typeof expression
13
13
  return []
14
14
  }
15
15
 
16
- const match = (values, head, value) => {
16
+ function match(values, head, value) {
17
17
  for (const prop in head) {
18
18
  if (head[prop] instanceof Function) {
19
19
  if (!head[prop](value[prop])) {
@@ -33,22 +33,24 @@ const match = (values, head, value) => {
33
33
  return true
34
34
  }
35
35
 
36
- const unify = (rule, value) => {
36
+ function unify(rule, value) {
37
37
  const values = { ...rule.values }
38
38
  if (match(values, rule.head(values), value)) {
39
39
  return rule.body(values)
40
40
  }
41
41
  }
42
42
 
43
- const f = (values, variable) => (value) => {
44
- if (!value) {
45
- throw new Error("Value not present")
46
- }
47
- if (values[variable] && values[variable] != value) {
48
- throw new Error("Variable already set to different value")
43
+ function f(values, variable) {
44
+ return (value) => {
45
+ if (!value) {
46
+ throw new Error("Value not present")
47
+ }
48
+ if (values[variable] && values[variable] != value) {
49
+ throw new Error("Variable already set to different value")
50
+ }
51
+ values[variable] = value
52
+ return true
49
53
  }
50
- values[variable] = value
51
- return true
52
54
  }
53
55
 
54
56
  const rules = [
@@ -74,7 +76,7 @@ const rules = [
74
76
  ]
75
77
 
76
78
  function solveFor(expression, variable, isVariable = (expression) => typeof expression.value != 'number') {
77
- const sameVar = (c1, c2) => {
79
+ function sameVar(c1, c2) {
78
80
  return c1.value == c2.value
79
81
  }
80
82
 
@@ -1,10 +1,10 @@
1
- const calculateLefts = (defs) => {
1
+ function calculateLefts(defs) {
2
2
  const lefts = {}
3
3
  calculateLeftsHelper(defs, lefts)
4
4
  return lefts
5
5
  }
6
6
 
7
- const calculateLeftsHelper = (defs, lefts) => {
7
+ function calculateLeftsHelper(defs, lefts) {
8
8
  if (Array.isArray(defs)) {
9
9
  let previous
10
10
  for (const def of defs) {
@@ -19,13 +19,13 @@ const calculateLeftsHelper = (defs, lefts) => {
19
19
  return lefts
20
20
  }
21
21
 
22
- const calculateRights = (defs) => {
22
+ function calculateRights(defs) {
23
23
  const rights = {}
24
24
  calculateRightsHelper(defs, rights)
25
25
  return rights
26
26
  }
27
27
 
28
- const calculateRightsHelper = (defs, rights) => {
28
+ function calculateRightsHelper(defs, rights) {
29
29
  if (Array.isArray(defs)) {
30
30
  let previous
31
31
  for (const def of defs) {
@@ -40,13 +40,13 @@ const calculateRightsHelper = (defs, rights) => {
40
40
  return rights
41
41
  }
42
42
 
43
- const calculateDowns = (defs) => {
43
+ function calculateDowns(defs) {
44
44
  const downs = {}
45
45
  calculateDownsHelper(defs, downs)
46
46
  return downs
47
47
  }
48
48
 
49
- const calculateDownsHelper = (defs, downs) => {
49
+ function calculateDownsHelper(defs, downs) {
50
50
  if (Array.isArray(defs)) {
51
51
  for (const def of defs) {
52
52
  calculateDownsHelper(def, downs)
@@ -72,13 +72,13 @@ const calculateDownsHelper = (defs, downs) => {
72
72
  return downs
73
73
  }
74
74
 
75
- const calculateUps = (defs) => {
75
+ function calculateUps(defs) {
76
76
  const ups = {}
77
77
  calculateUpsHelper(defs, ups)
78
78
  return ups
79
79
  }
80
80
 
81
- const calculateUpsHelper = (defs, ups) => {
81
+ function calculateUpsHelper(defs, ups) {
82
82
  if (Array.isArray(defs)) {
83
83
  for (const def of defs) {
84
84
  calculateUpsHelper(def, ups)
@@ -100,13 +100,13 @@ const calculateUpsHelper = (defs, ups) => {
100
100
  return ups
101
101
  }
102
102
 
103
- const calculateParents = (defs) => {
103
+ function calculateParents(defs) {
104
104
  const parents = {}
105
105
  calculateParentsHelper(defs, parents)
106
106
  return parents
107
107
  }
108
108
 
109
- const calculateParentsHelper = (defs, parents) => {
109
+ function calculateParentsHelper(defs, parents) {
110
110
  if (Array.isArray(defs)) {
111
111
  for (const def of defs) {
112
112
  parents[def.key] = def.key
@@ -123,13 +123,13 @@ const calculateParentsHelper = (defs, parents) => {
123
123
  return parents
124
124
  }
125
125
 
126
- const calculatePaths = (defs) => {
126
+ function calculatePaths(defs) {
127
127
  const paths = {}
128
128
  calculatePathsHelper(defs, paths)
129
129
  return paths
130
130
  }
131
131
 
132
- const calculatePathsHelper = (defs, paths) => {
132
+ function calculatePathsHelper(defs, paths) {
133
133
  if (Array.isArray(defs)) {
134
134
  for (const def of defs) {
135
135
  calculatePathsHelper(def, paths)
@@ -1,6 +1,6 @@
1
1
  const _ = require('lodash')
2
2
 
3
- const hashIndexesGet = (hash, indexes) => {
3
+ function hashIndexesGet(hash, indexes) {
4
4
  let value = hash
5
5
  for (const i of indexes) {
6
6
  value = value[i]
@@ -8,7 +8,7 @@ const hashIndexesGet = (hash, indexes) => {
8
8
  return value
9
9
  }
10
10
 
11
- const hashIndexesSet = (hash, indexes, value) => {
11
+ function hashIndexesSet(hash, indexes, value) {
12
12
  let currentValue = hash
13
13
  for (const i of indexes.slice(0, -1)) {
14
14
  if (!currentValue[i]) {
@@ -19,7 +19,7 @@ const hashIndexesSet = (hash, indexes, value) => {
19
19
  currentValue[indexes[indexes.length-1]] = value
20
20
  }
21
21
 
22
- const isPrefix = (prefix, fix) => {
22
+ function isPrefix(prefix, fix) {
23
23
  return prefix.every((element, index) => {
24
24
  return prefix[index] === fix[index]
25
25
  })
@@ -27,11 +27,11 @@ const isPrefix = (prefix, fix) => {
27
27
  }
28
28
 
29
29
  // assumes isPrefix is true
30
- const replacePrefix = (prefix, prefixPrime, fix) => {
30
+ function replacePrefix(prefix, prefixPrime, fix) {
31
31
  return prefixPrime.concat(fix.slice(prefix.length))
32
32
  }
33
33
 
34
- const compose = (m1s, m2s) => {
34
+ function compose(m1s, m2s) {
35
35
  return m2s.map( (m2) => {
36
36
  m1 = m1s.find( (m1) => isPrefix(m1.from, m2.from) )
37
37
  if (m1) {
@@ -48,7 +48,7 @@ const compose = (m1s, m2s) => {
48
48
  '[{"from":["two"],"to":["owner"]},{"from":["one"],"to":["ownee"]},{"from":["number"],"to":["number"]}]'
49
49
  */
50
50
 
51
- const translationMapping = (from, to) => {
51
+ function translationMapping(from, to) {
52
52
  const mappings = []
53
53
  if (from.atomic) {
54
54
  return mappings
@@ -65,7 +65,7 @@ const translationMapping = (from, to) => {
65
65
  if (matchField) {
66
66
  let found = false
67
67
  const todo = Object.keys(to).map( (key) => [key] )
68
- while (!found) {
68
+ while (!found && todo.length > 0) {
69
69
  const tkey = todo.shift()
70
70
  const tvalue = hashIndexesGet(to, tkey);
71
71
  const fvalue = hashIndexesGet(from, [fkey]);
@@ -89,7 +89,7 @@ const translationMapping = (from, to) => {
89
89
  return mappings
90
90
  }
91
91
 
92
- const translationMappings = (froms, to) => {
92
+ function translationMappings(froms, to) {
93
93
  const mappingss = []
94
94
  for (const from of froms) {
95
95
  mappingss.push(translationMapping(from, to))
@@ -97,7 +97,7 @@ const translationMappings = (froms, to) => {
97
97
  return mappingss
98
98
  }
99
99
 
100
- const translationMappingToInstantiatorMappings = (translationMapping, from , to) => {
100
+ function translationMappingToInstantiatorMappings(translationMapping, from , to) {
101
101
  return translationMapping.map( (tm) => {
102
102
  return {
103
103
  // match: ({context}) => context.value == to[tm.to].value,
@@ -1,14 +1,33 @@
1
1
  const pluralize = require('pluralize')
2
+ const { conjugateVerb } = require('../english_helpers')
2
3
  const { unflatten, flattens, Digraph } = require('../runtime').theprogrammablemind
3
4
  const _ = require('lodash')
4
5
  const deepEqual = require('deep-equal')
5
- const { chooseNumber } = require('../helpers.js')
6
+ const { chooseNumber, removeProp } = require('../helpers.js')
6
7
  const { Frankenhash } = require('./frankenhash.js')
7
8
  const { compose, translationMapping, translationMappingToInstantiatorMappings } = require('./meta.js')
8
9
 
9
10
  class API {
10
11
  constructor() {
11
12
  this.digraph = new Digraph()
13
+ this.hierarchyWatchers = []
14
+ }
15
+
16
+ addHierarchyWatcher(watcher) {
17
+ this.hierarchyWatchers.push(watcher)
18
+ }
19
+
20
+ removeHierarchyWatcher(watcher) {
21
+ this.hierarchyWatchers = this.hierarchyWatchers.filter((w) => w.id == watcher.id)
22
+ }
23
+
24
+ seenHierarchyWatcher(watcherArgs) {
25
+ const args = { ...this.args, ...watcherArgs }
26
+ for (const { match, apply } of this.hierarchyWatchers) {
27
+ if (match(args)) {
28
+ apply(args)
29
+ }
30
+ }
12
31
  }
13
32
 
14
33
  initialize({ km, objects, config }) {
@@ -28,7 +47,7 @@ class API {
28
47
  this._km = km
29
48
  this.__config = config
30
49
  this.digraph = new Digraph()
31
- const toJSON = (h) => {
50
+ function toJSON(h) {
32
51
  if (h.child && h.parent) {
33
52
  return h
34
53
  } else {
@@ -228,8 +247,8 @@ class API {
228
247
  match: ({context, hierarchy}) => hierarchy.isA(context.marker, 'is') && context.one && context.one.marker == after[0].tag && context.one.constraints && context.one.constraints[0] && context.one.constraints[0].constraint.marker == edAble.operator && context.one.constraints[0].constraint[before[0].tag].implicit,
229
248
  apply: async ({context, fragments, g, gs, callId}) => {
230
249
  const isToFromM = [{"from":["one"],"to":["two"]},{"from":["two"],"to":["one"]}]
231
- const fromF = fragments(whoIsWhatVerbedBy).contexts()[0]
232
- const toF = fragments(thisIsVerbedByThat)
250
+ const fromF = (await fragments(whoIsWhatVerbedBy)).contexts()[0]
251
+ const toF = await fragments(thisIsVerbedByThat)
233
252
  const to = toF.contexts()[0]
234
253
  const tm = translationMapping(fromF, to)
235
254
  /*
@@ -263,12 +282,35 @@ class API {
263
282
  // relation -> the semantics will be implements using relations
264
283
  // edable: "y is owned by x" edable = { operator: 'owned' }
265
284
  createActionPrefix(args, semanticApply) {
266
- const { operator, before=[], after=[], create=[], config, localHierarchy=[], relation, ordering, doAble, words = [], unflatten:unflattenArgs = [], focusable = [], edAble } = args;
267
- // const before = [...]
268
- // const after = [{tag: 'weapon', id: 'weapon'}]
269
- // const create = ['arm', 'weapon']
285
+ const {
286
+ operator,
287
+ before=[],
288
+ after=[],
289
+ create:createInit=[],
290
+ hierarchy=[],
291
+ config,
292
+ localHierarchy=[],
293
+ relation,
294
+ ordering,
295
+ doAble,
296
+ flatten,
297
+ can,
298
+ words = [],
299
+ unflatten:unflattenArgs = [],
300
+ focusable = [],
301
+ edAble } = args;
302
+
303
+ function createToCanonical(concept) {
304
+ if (typeof concept == 'string') {
305
+ return { id: concept, isA: [] }
306
+ } else {
307
+ return { isA: [], ...concept }
308
+ }
309
+ }
270
310
 
271
- if (doAble) {
311
+ const create = createInit.map(createToCanonical)
312
+
313
+ if (doAble) {
272
314
  if (before.length != 1) {
273
315
  throw "Expected exactly one before argument"
274
316
  }
@@ -287,7 +329,6 @@ class API {
287
329
  pattern: `([(${beforeOperators} [${operator}|] ${afterOperators}^)])`,
288
330
  allowDups: true,
289
331
  })
290
- // config.addOperator({ id: operator, level: 1, words: [operator] })
291
332
  config.addBridge({
292
333
  id: operator,
293
334
  level: 1,
@@ -307,7 +348,6 @@ class API {
307
348
  if (create.includes(argument.id)) {
308
349
  // config.addHierarchy('unknown', argument.id)
309
350
  // config.addHierarchy('what', argument.id)
310
- // greg23 <<<<<<<<<<<< doing this
311
351
  config.addHierarchy(argument.id, 'unknown')
312
352
  config.addHierarchy(argument.id, 'what')
313
353
  }
@@ -323,9 +363,9 @@ class API {
323
363
  }
324
364
  }
325
365
 
326
- create.map( (id) => {
366
+ create.map( ({ id, isA }) => {
327
367
  if (id === operator) {
328
- const tagsToProps = (where, args, suffix='') => {
368
+ function tagsToProps(where, args, suffix='') {
329
369
  const i = 0;
330
370
  let r = ''
331
371
  for (const arg of args) {
@@ -341,13 +381,30 @@ class API {
341
381
  afterArgs = tagsToProps('after', after, '*')
342
382
  }
343
383
 
384
+ // const subjectContext = before[0].tag
385
+ // const interpolate = "[" + before.map((arg) => `{ property: '${arg.tag}' }`).concat(`{ ...operator, evaluateWord: true, number: ${subjectContext}.number }`).concat(after.map((arg) => `{ property: '${arg.tag}' }`)).join(',') + "]"
386
+ const imperative = (before.length == 0) ? "true" : "false"
387
+ // const interpolate = "[" + before.map((arg) => `{ property: '${arg.tag}' }`).concat(`{ ...operator, evaluateWord: true, imperative: ${imperative}, isVerb: true, number: 'one' }`).concat(after.map((arg) => `{ property: '${arg.tag}' }`)).join(',') + "]"
388
+ // const interpolateVerb = `{ property: "operator", context: { evaluateWord: true, imperative: ${imperative}, isVerb: true, number: 'one' } }`
389
+ let interpolateVerb
390
+ if (before.length > 0) {
391
+ interpolateVerb = `{ property: "operator", number: '${before[0].tag}' }`
392
+ } else {
393
+ interpolateVerb = `{ property: "operator" }`
394
+ }
395
+ const interpolate = "[" + before.map((arg) => `{ property: '${arg.tag}' }`).concat(interpolateVerb).concat(after.map((arg) => `{ property: '${arg.tag}' }`)).join(',') + "]"
396
+
344
397
  const unflattenArgs = [ ...before.map( (arg) => arg.tag ), ...after.map( (arg) => arg.tag ) ]
345
398
  const focusable = [ ...before.map( (arg) => arg.tag ), ...after.map( (arg) => arg.tag ) ]
399
+ let flattenProperty = ''
400
+ if (flatten) {
401
+ flattenProperty = ", flatten: true, relation: true "
402
+ }
346
403
  config.addBridge({
347
404
  id: operator,
348
405
  level: 0,
349
406
  localHierarchy: [...localHierarchy, ['object', 'unknown']],
350
- bridge: `{ ... next(operator) ${doParams} ${beforeArgs} ${afterArgs}, unflatten: ${JSON.stringify(unflattenArgs)}, focusable: ${JSON.stringify(focusable)} }`,
407
+ bridge: `{ ... next(operator) ${flattenProperty} ${doParams} ${beforeArgs} ${afterArgs}, operator: { ...operator, evaluateWord: true, imperative: ${imperative}, isVerb: true, number: 'one' }, unflatten: ${JSON.stringify(unflattenArgs)}, focusable: ${JSON.stringify(focusable)}, interpolate: ${interpolate} }`,
351
408
  allowDups: true
352
409
  })
353
410
  if (words.length > 0) {
@@ -360,13 +417,30 @@ class API {
360
417
  } else {
361
418
  config.addBridge({ id: id, allowDups: true })
362
419
  }
420
+
421
+ for (const parentId of isA) {
422
+ config.addHierarchy(id, parentId)
423
+ }
363
424
  })
364
425
 
365
426
  if (words.length == 0) {
427
+ const createDef = createInit.find((def) => def.id == operator)
428
+ if (createDef && createDef.infinitive) {
429
+ const conjugation = conjugateVerb(createDef.infinitive)
430
+ if (can) {
431
+ const def = conjugation.find((def) => def.form == "pastParticiple")
432
+ config.addWord(def.word, { id: operator, initial: `{ value: '${operator}', isVerb: true, tense: '${def.tense}' }`})
433
+ }
434
+ }
435
+
366
436
  const operatorPlural = pluralize.singular(operator)
367
437
  const operatorSingular = pluralize.plural(operator)
368
- config.addWord(operatorSingular, { id: operator, initial: `{ value: '${operator}', number: 'one' }`})
369
- config.addWord(operatorPlural, { id: operator, initial: `{ value: '${operator}', number: 'many' }`})
438
+ config.addWord(operatorSingular, { id: operator, initial: `{ value: '${operator}', isVerb: true, number: 'one' }`})
439
+ config.addWord(operatorPlural, { id: operator, initial: `{ value: '${operator}', isVerb: true, number: 'many' }`})
440
+ }
441
+
442
+ for (const { child, parent } of hierarchy) {
443
+ config.addHierarchy(child, parent)
370
444
  }
371
445
 
372
446
  if (doAble) {
@@ -376,49 +450,97 @@ class API {
376
450
  config.addPriority({ "context": [[operator, 0], ['means', 0], ], "choose": [0] })
377
451
  config.addPriority({ "context": [['article', 0], [operator, 0], ], "choose": [0] })
378
452
 
379
- config.addGenerator({
380
- notes: 'ordering generator for paraphrase',
381
- match: ({context}) => context.marker == operator && context.paraphrase && !context.query,
382
- apply: async ({context, gp, g}) => {
383
- const beforeGenerator = []
384
- for (const arg of before) {
385
- beforeGenerator.push(await g(context[arg.tag]))
386
- }
387
- const afterGenerator = []
388
- for (const arg of after) {
389
- afterGenerator.push(await gp(context[arg.tag]))
390
- }
391
- const word = context.word
392
- const sub = []
393
- if (context.subphrase) {
394
- sub.push(['that'])
395
- }
396
- return beforeGenerator.concat(sub).concat([word]).concat(afterGenerator).join(' ')
397
- }
398
- })
453
+ if (can) {
454
+ const beforeIds = before.map((def) => def.id)
455
+ const afterIds = after.map((def) => def.id)
456
+ config.addHierarchy(operator, 'canableAction')
457
+ config.addAssociation({ context: [[afterIds[0], 0], ['whatCanQuestion', 0], [beforeIds[0], 0], [operator, 0]], choose: 1 })
458
+ config.addAssociation({ context: [[afterIds[0], 1], ['whatCanQuestion', 0], [beforeIds[0], 0], [operator, 0]], choose: 1 })
459
+ config.addAssociation({ context: [[afterIds[0], 0], ['whatCanQuestionPassive', 0], [beforeIds[0], 0], ['beCanPassive', 0], [operator, 0], ['byCanPassive', 0]], choose: 1 })
460
+ config.addAssociation({ context: [[afterIds[0], 1], ['whatCanQuestionPassive', 0], [beforeIds[0], 0], ['beCanPassive', 0], [operator, 0], ['byCanPassive', 0]], choose: 1 })
461
+ config.addAssociation({ context: [[afterIds[0], 0], ['canPassive', 0], ['beCanPassive', 0], [operator, 0], ['byCanPassive', 0], [beforeIds[0], 0]], choose: 1 })
462
+ config.addAssociation({ context: [[afterIds[0], 1], ['canPassive', 0], ['beCanPassive', 0], [operator, 0], ['byCanPassive', 0], [beforeIds[0], 0]], choose: 1 })
463
+ }
399
464
 
400
- config.addGenerator({
401
- notes: 'ordering generator for response',
402
- match: ({context}) => context.marker == operator && context.evalue && context.isResponse,
403
- apply: async ({context, g, km}) => {
404
- const brief = km("dialogues").api.getBrief()
405
-
406
- const { evalue } = context
407
- let yesno = ''
408
- if (!context.do.query || evalue.truthValueOnly || brief) {
409
- if (evalue.truthValue) {
410
- yesno = 'yes'
411
- } else if (evalue.truthValue === false) {
412
- yesno = 'no'
465
+ if (false) {
466
+ config.addGenerator({
467
+ notes: 'ordering generator for paraphrase',
468
+ match: ({context}) => context.marker == operator && context.paraphrase && !context.query,
469
+ apply: async ({context, gp, g}) => {
470
+ const beforeGenerator = []
471
+ for (const arg of before) {
472
+ beforeGenerator.push(await g(context[arg.tag]))
413
473
  }
474
+ const afterGenerator = []
475
+ for (const arg of after) {
476
+ afterGenerator.push(await gp(context[arg.tag]))
477
+ }
478
+ const word = context.word
479
+ const sub = []
480
+ if (context.subphrase) {
481
+ sub.push(['that'])
482
+ }
483
+ return beforeGenerator.concat(sub).concat([word]).concat(afterGenerator).join(' ')
414
484
  }
415
- if (evalue.truthValueOnly || brief) {
416
- return `${yesno}`
417
- } else {
418
- return `${yesno} ${await g(Object.assign({}, evalue, { paraphrase: true }))}`
485
+ })
486
+ }
487
+
488
+ if (true) {
489
+ config.addGenerator({
490
+ notes: 'ordering generator for response',
491
+ match: ({context}) => context.marker == operator && context.evalue && context.isResponse,
492
+ apply: async ({context, s, g, km, flatten}) => {
493
+ const brief = km("dialogues").api.getBrief()
494
+
495
+ let { evalue } = context
496
+ let yesno = ''
497
+ let hasVariables = false
498
+ if (context.focusable) {
499
+ for (const f of context.focusable) {
500
+ if (context[f].query) {
501
+ hasVariables = true
502
+ break
503
+ }
504
+ }
505
+ }
506
+
507
+ // if (!context.do?.query || evalue.truthValueOnly || context.truthValueOnly || brief) {
508
+ if (evalue.truthValueOnly || context.truthValueOnly || context.wantsTruthValue || !hasVariables) {
509
+ function any(value, test) {
510
+ if (test(value)) {
511
+ return true
512
+ }
513
+ const values = flatten(['list'], value)[0]
514
+ for (const value of values) {
515
+ if (test(value)) {
516
+ return true
517
+ }
518
+ }
519
+ }
520
+ if (any(evalue, (value) => value.truthValue)) {
521
+ yesno = 'yes'
522
+ } else if (evalue.truthValue === false || context.truthValueOnly) {
523
+ yesno = 'no'
524
+ }
525
+ }
526
+ if (evalue.truthValueOnly) {
527
+ return `${yesno}`
528
+ } else {
529
+ if (context.voice) {
530
+ evalue = await s({ ...evalue, toVoice: context.voice, flatten: false})
531
+ }
532
+
533
+ const details = await g(Object.assign({}, evalue, { paraphrase: true }))
534
+ if (yesno) {
535
+ return `${yesno} ${details}`
536
+ }
537
+ else {
538
+ return details
539
+ }
540
+ }
419
541
  }
420
- }
421
- })
542
+ })
543
+ }
422
544
 
423
545
  if (ordering) {
424
546
  config.addSemantic({
@@ -494,7 +616,7 @@ class API {
494
616
  if (relation) {
495
617
  config.addSemantic({
496
618
  notes: `setter for ${operator}`,
497
- match: ({context}) => context.marker == operator,
619
+ match: ({context}) => context.marker == operator && !context.toVoice,
498
620
  apply: ({context, km, hierarchy, config}) => {
499
621
  const api = km('properties').api
500
622
  // add types for arguments
@@ -515,9 +637,8 @@ class API {
515
637
  config.addSemantic({
516
638
  notes: `getter for ${operator}`,
517
639
  match: ({context}) => context.marker == operator && context.query,
518
- apply: ({context, km}) => {
640
+ apply: ({context, km, callId}) => {
519
641
  const api = km('properties').api
520
-
521
642
  context.evalue = {
522
643
  marker: 'list',
523
644
  value: unflatten(api.relation_get(context, before.concat(after).map( (arg) => arg.tag ) ))
@@ -527,8 +648,8 @@ class API {
527
648
  if (context.evalue.value.length == 0) {
528
649
  context.evalue.marker = 'answerNotKnown';
529
650
  context.evalue.value = [];
530
- context.evalue.marker = 'answerNotKnown';
531
- context.evalue.value = [];
651
+ } else {
652
+ // context.evalue.truthValue = true
532
653
  }
533
654
  }
534
655
  })
@@ -552,10 +673,13 @@ class API {
552
673
  }
553
674
 
554
675
  relation_add (relations) {
676
+ removeProp(relations, (val, prop, obj) => prop === 'range')
677
+
555
678
  if (!Array.isArray(relations)) {
556
679
  relations = [relations]
557
680
  }
558
681
  for (const relation of relations) {
682
+ relation.truthValue = true
559
683
  this._objects.relations.push(relation)
560
684
  }
561
685
  }
@@ -599,7 +723,7 @@ class API {
599
723
  return value
600
724
  }
601
725
 
602
- relation_get(context, args) {
726
+ relation_get (context, args) {
603
727
  const andTheAnswerIs = []
604
728
  for (const relation of this._objects.relations) {
605
729
  if (this.relation_match(args, context, relation)) {
@@ -703,7 +827,6 @@ class API {
703
827
  }
704
828
 
705
829
  setProperty(object, property, value, has, skipHandler) {
706
- // debugger
707
830
  if (!skipHandler) {
708
831
  const handler = this.propertiesFH.getHandler([object, property])
709
832
  if (handler) {