tpmkms_4wp 9.3.0-beta.6 → 9.3.0-beta.61

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 (111) hide show
  1. package/common/animals.instance.json +0 -65
  2. package/common/animals.js +2 -3
  3. package/common/animals.test.json +1607 -1
  4. package/common/articles.js +2 -4
  5. package/common/asking.js +21 -5
  6. package/common/avatar.js +2 -2
  7. package/common/characters.js +2 -2
  8. package/common/colors.instance.json +28 -70
  9. package/common/colors.js +2 -2
  10. package/common/comparable.instance.json +0 -15
  11. package/common/comparable.js +2 -2
  12. package/common/concept.js +1 -2
  13. package/common/concept.test.json +279 -193
  14. package/common/conjunction.js +3 -5
  15. package/common/countable.js +2 -14
  16. package/common/crew.instance.json +72 -130
  17. package/common/crew.js +2 -2
  18. package/common/currency.js +2 -3
  19. package/common/dateTimeSelectors.instance.json +175 -0
  20. package/common/dateTimeSelectors.js +168 -0
  21. package/common/dateTimeSelectors.test.json +85622 -0
  22. package/common/dates.instance.json +538 -506
  23. package/common/dates.js +112 -15
  24. package/common/dates.test.json +11021 -514
  25. package/common/dialogues.js +13 -49
  26. package/common/dimension.instance.json +0 -5
  27. package/common/dimension.js +4 -4
  28. package/common/edible.instance.json +56 -160
  29. package/common/edible.js +2 -2
  30. package/common/emotions.instance.json +0 -5
  31. package/common/emotions.js +2 -2
  32. package/common/errors.js +3 -0
  33. package/common/evaluate.js +2 -2
  34. package/common/events.js +1 -2
  35. package/common/fastfood.instance.json +172 -435
  36. package/common/fastfood.js +2 -4
  37. package/common/fastfood.test.json +16291 -6597
  38. package/common/formulas.instance.json +0 -5
  39. package/common/formulas.js +3 -1
  40. package/common/gdefaults.js +2 -3
  41. package/common/help.js +2 -2
  42. package/common/helpers/dateTimeSelectors.js +198 -0
  43. package/common/helpers/dialogues.js +11 -8
  44. package/common/helpers/properties.js +2 -2
  45. package/common/helpers.js +23 -47
  46. package/common/hierarchy.js +12 -13
  47. package/common/javascript.js +2 -3
  48. package/common/kirk.instance.json +0 -5
  49. package/common/kirk.js +2 -3
  50. package/common/length.instance.json +0 -75
  51. package/common/length.js +2 -3
  52. package/common/listener.js +3 -1
  53. package/common/math.instance.json +0 -5
  54. package/common/math.js +2 -3
  55. package/common/menus.instance.json +0 -35
  56. package/common/menus.js +3 -1
  57. package/common/meta.js +4 -5
  58. package/common/nameable.js +3 -1
  59. package/common/negation.js +2 -2
  60. package/common/numbers.js +7 -4
  61. package/common/numbers.test.json +89 -23
  62. package/common/ordering.instance.json +0 -10
  63. package/common/ordering.js +2 -3
  64. package/common/ordinals.js +2 -3
  65. package/common/people.instance.json +0 -40
  66. package/common/people.js +2 -3
  67. package/common/percentages.js +3 -4
  68. package/common/percentages.test.json +57 -11
  69. package/common/pipboy.instance.json +84 -85
  70. package/common/pipboy.js +1 -1
  71. package/common/pipboy.test.json +4377 -3386
  72. package/common/pokemon.instance.json +0 -65
  73. package/common/pokemon.js +1 -2
  74. package/common/pos.js +2 -2
  75. package/common/pressure.instance.json +0 -20
  76. package/common/pressure.js +2 -2
  77. package/common/properties.instance.json +0 -5
  78. package/common/properties.js +11 -13
  79. package/common/punctuation.js +2 -2
  80. package/common/reminders.instance.json +153 -23
  81. package/common/reminders.js +275 -82
  82. package/common/reminders.test.json +75654 -37
  83. package/common/reports.instance.json +1 -11
  84. package/common/reports.js +1 -1
  85. package/common/scorekeeper.js +2 -2
  86. package/common/scorekeeper.test.json +3565 -7550
  87. package/common/sdefaults.js +1 -1
  88. package/common/self.js +1 -1
  89. package/common/sizeable.js +2 -2
  90. package/common/spock.instance.json +0 -5
  91. package/common/spock.js +1 -1
  92. package/common/stgame.js +1 -1
  93. package/common/stm.js +1 -1
  94. package/common/tell.js +2 -2
  95. package/common/temperature.instance.json +84 -20
  96. package/common/temperature.js +2 -2
  97. package/common/tester.js +0 -1
  98. package/common/testing.js +0 -1
  99. package/common/time.js +57 -30
  100. package/common/time.test.json +4159 -205
  101. package/common/tokenize.js +1 -1
  102. package/common/ui.instance.json +0 -5
  103. package/common/ui.js +4 -2
  104. package/common/weight.instance.json +0 -112
  105. package/common/weight.js +2 -2
  106. package/common/wp.instance.json +56 -70
  107. package/common/wp.js +1 -3
  108. package/common/wp.test.json +8057 -3867
  109. package/common/yesno.js +2 -2
  110. package/main.js +2 -0
  111. package/package.json +8 -4
@@ -3,38 +3,182 @@ const { defaultContextCheck } = require('./helpers')
3
3
  const reminders_tests = require('./reminders.test.json')
4
4
  const reminders_instance = require('./reminders.instance.json')
5
5
  const selfKM = require('./self')
6
- const dates = require('./dates')
6
+ const dateTimeSelectors = require('./dateTimeSelectors')
7
7
  const helpers = require('./helpers')
8
8
 
9
+ /*
10
+ friday instead
11
+ change it to friday
12
+ delete it
13
+ make it friday instead
14
+ 2 sundays from now
15
+ the sunday after july 1st
16
+ remind every truck driver to whatever tomorrow at 8 am
17
+ add the user greg
18
+ add greg as a user
19
+ */
20
+
21
+ const query = (missing, reminder_id) => {
22
+ return {
23
+ where: where(),
24
+ // oneShot: false,
25
+ onNevermind: ({verbatim, ...args}) => {
26
+ const api = args.kms.reminders.api
27
+ api.delete_reminder(reminder_id)
28
+ },
29
+
30
+ matchq: ({ api, context }) => api.missing(missing, reminder_id) && context.marker == 'controlEnd',
31
+ applyq: async ({ api, context, gs, enable }) => {
32
+ context.cascade = false
33
+ const item = api.missing(missing, reminder_id)
34
+ let who
35
+ if (Array.isArray(item.who)) {
36
+ who = await gs(item.who.map((who) => who.text), ', ', ' and ')
37
+ } else {
38
+ if (item.who.text == 'me') {
39
+ who = 'you'
40
+ } else {
41
+ who = item.who.text
42
+ }
43
+ }
44
+ if (item.missingDate) {
45
+ return `When should I remind ${who} to ${item.text}`
46
+ }
47
+ if (item.missingReminder) {
48
+ enable(['remindResponse', 0])
49
+ return `What should I remind ${who} to do?`
50
+ }
51
+ },
52
+
53
+ matchr: ({ isA, api, context }) => {
54
+ if (context.evaluate || context.isControl || context.isResponse) {
55
+ return false
56
+ }
57
+ const gotADate = ((isA(context.marker, 'onDateValue_dates') || isA(context.marker, 'dateTimeSelector')) && api.missing(missing, reminder_id))
58
+ if (missing == 'missingDate') {
59
+ return gotADate
60
+ } else {
61
+ // return !gotADate && !context.isControl
62
+ }
63
+ return false
64
+ },
65
+ applyr: async ({ context, api, gp }) => {
66
+ const item = api.missing(missing, reminder_id)
67
+ await api.update({ id: item.id, dateTimeSelector: context, dateTimeSelectorText: await gp(context) })
68
+ }
69
+ }
70
+ }
71
+
9
72
  class API {
10
73
  initialize({ objects }) {
11
74
  this._objects = objects
12
75
  this._objects.reminders = []
13
76
  this._objects.id = 0
77
+ this._objects.current = null
78
+ this._objects.defaultTime = { hour: 9, minute: 0, second: 0, millisecond: 0 }
14
79
  }
15
80
 
16
- add(reminder) {
81
+ async add(reminder) {
82
+ await this.instantiate(reminder)
17
83
  const id = ++this._objects.id
18
- this._objects.reminders.push({ ...reminder, id })
84
+ reminder.id = id
85
+ this._objects.reminders.push(reminder)
86
+ this.args.mentioned({ context: reminder })
87
+ this._objects.current = id
88
+ }
89
+
90
+ getCurrentId() {
91
+ return this._objects.current
92
+ }
93
+
94
+ // addUser to current
95
+ addUser(user) {
96
+ const reminder = this.reminders().find((r) => r.id == this._objects.current)
97
+ if (reminder) {
98
+ if (Array.isArray(reminder.who)) {
99
+ reminder.who = [...reminder.who, user]
100
+ } else {
101
+ reminder.who = [reminder.who, user]
102
+ }
103
+ }
104
+ }
105
+
106
+ removeUser(user) {
107
+ const reminder = this.reminders().find((r) => r.id == this._objects.current)
108
+ if (reminder) {
109
+ reminder.who = reminder.who.filter((who) => who.remindee_id != user.remindee_id)
110
+ }
111
+ }
112
+
113
+ async addRemindable(id, text) {
114
+ if (!text) {
115
+ text = id
116
+ }
117
+ await this.args.makeObject({ ...this.args, context: { word: text, value: id, number: 'one', remindee_id: id }, initial: { remindee_id: `${id}` }, types: ['remindable'] })
118
+ }
119
+
120
+ async instantiate(reminder) {
121
+ if (reminder.dateTimeSelector) {
122
+ reminder.dateTimeSelector.defaultTime = this._objects.defaultTime
123
+ }
124
+ const value = await this.args.e(reminder.dateTimeSelector)
125
+ reminder.nextISODate = value?.evalue
126
+ }
127
+
128
+ contextToWho(who) {
129
+ if (who.isList) {
130
+ const whos = []
131
+ for (const element of this.args.values(who)) {
132
+ whos.push(this.contextToWho(element))
133
+ }
134
+ return whos
135
+ } else {
136
+ return { id: who.value || who.text, text: who.text, remindee_id: who.remindee_id }
137
+ }
138
+ }
139
+
140
+ missing(what, reminder_id) {
141
+ const reminder = this.reminder(reminder_id)
142
+ if (what == 'missingReminder' && !reminder.text) {
143
+ return { when: true, who: reminder.who, text: reminder.text, id: reminder.id, missingReminder: true }
144
+ }
145
+ if (what == 'missingDate' && !reminder.dateTimeSelector) {
146
+ return { when: true, who: reminder.who, text: reminder.text, id: reminder.id, missingDate: true }
147
+ }
148
+ }
149
+
150
+ reminder(id) {
151
+ return this._objects.reminders.find((reminder) => reminder.id == id)
152
+ }
153
+
154
+ reminders() {
155
+ return this._objects.reminders
156
+ }
157
+
158
+ setReminders(reminders) {
159
+ this._objects.reminders = reminders
19
160
  }
20
161
 
21
- askAbout() {
162
+ askAbout(what) {
22
163
  const items = []
23
- for (const item of this._objects.reminders) {
24
- if (!item.when) {
25
- items.push({ when: true, text: item.text, id: item.id })
164
+ for (const item of this.reminders()) {
165
+ if (this.missing('missingReminder', item.id)) {
166
+ items.push(this.missing('missingReminder', item.id))
167
+ }
168
+ if (this.missing('missingDate', item.id)) {
169
+ items.push(this.missing('missingDate', item.id))
26
170
  }
27
171
  }
28
172
  return items
29
173
  }
30
174
 
31
175
  show() {
32
- if (this._objects.reminders.length == 0) {
176
+ if (this.reminders().length == 0) {
33
177
  return "There are no reminders"
34
178
  }
35
179
  let s = 'The reminders are\n'
36
180
  let counter = 1
37
- for (const item of this._objects.reminders) {
181
+ for (const item of this.reminders()) {
38
182
  s += ` ${counter}. ${item.text}\n`
39
183
  counter += 1
40
184
  }
@@ -42,21 +186,27 @@ class API {
42
186
  // -> return a table object. then have ability to talk about the table. maybe later let's focus on this for now
43
187
  }
44
188
 
45
- delete_reminder(ordinal) {
46
- if (ordinal < 1 || ordinal > this._objects.reminders.length) {
47
- return `Not possible`
189
+ delete_reminder(id) {
190
+ const reminder = this.reminders().find((reminder) => reminder.id)
191
+ if (reminder) {
192
+ if (reminder.cleanUp) {
193
+ reminder.cleanUp()
194
+ }
195
+ this.setReminders(this.reminders().filter((reminder) => reminder.id != id))
48
196
  }
49
- this._objects.reminders = this._objects.reminders.splice(ordinal, 1)
50
197
  }
51
198
 
52
- update(update) {
199
+ async update(update) {
200
+ if (!update.id) {
201
+ update.id = this.getCurrentId()
202
+ }
53
203
  for (const item of this._objects.reminders) {
54
204
  if (item.id == update.id) {
55
205
  Object.assign(item, update)
206
+ await this.instantiate(item)
56
207
  return
57
208
  }
58
209
  }
59
-
60
210
  }
61
211
  }
62
212
 
@@ -67,27 +217,108 @@ const template = {
67
217
  configs: [
68
218
  {
69
219
  operators: [
70
- "([remind] (self/*) (*)*)",
71
- "([reminderTime|])",
220
+ "([remindable])",
221
+ { pattern: "([addRemindable] (word)*)", development: true },
222
+ "([remind:justWhoBridge] (remindable/*))",
223
+ "([remind] (remindable/*) (!@<= 'dateTimeSelector' && !@<= 'inAddition')*)",
224
+ "([remind:withDateBridge] (remindable/*) (!@<= 'dateTimeSelector' && !@<= 'inAddition')* (dateTimeSelector))",
225
+ "([remind:withDateFirstBridge] (remindable/*) (dateTimeSelector) (!@<= 'dateTimeSelector' && !@<= 'inAddition')*)",
226
+ "([remind:withDateAndTimeBridge] (remindable/*) (!@<= 'dateTimeSelector' && !@<= 'inAddition')* (dateTimeSelector) (atTime))",
227
+ "([remindResponse] (!@<= 'remindResponse' && !@<= 'dateTimeSelector' && !@<= 'inAddition')+ (dateTimeSelector))",
72
228
  "([show] ([reminders]))",
73
229
  "([delete_reminders|delete,cancel] (number/*))",
230
+ "([add] (remindable/*))",
231
+ "([remove|] (remindable/*))",
232
+ "((verb/*) [inAddition|also,too])",
74
233
  ],
75
234
  bridges: [
76
235
  {
77
- id: 'remind',
236
+ id: 'inAddition',
237
+ after: ['verb'],
238
+ bridge: "{ ...before[0], inAddition: true, verb: before[0], operator: operator, interpolate: '${verb} ${operator}' }",
239
+ },
240
+ {
241
+ id: 'add',
78
242
  isA: ['verb'],
79
- bridge: "{ ...next(operator), operator: operator, who: after[0], reminder: after[1], interpolate: '${operator} ${who} ${reminder}' }",
80
- semantic: async ({api, gsp, context}) => {
81
- const text = await gsp(context.reminder.slice(1));
82
- api.add({ text });
83
- },
243
+ bridge: "{ ...next(operator), arg: after[0], operator: operator, interpolate: '${operator} ${arg}' }",
244
+ semantic: ({api, context}) => {
245
+ api.addUser(api.contextToWho(context.arg))
246
+ }
84
247
  },
85
248
  {
86
- id: 'reminderTime',
87
- children: [
88
- 'day_dates',
89
- 'month_dates',
249
+ id: 'remove',
250
+ words: ['delete', 'remove'],
251
+ isA: ['verb'],
252
+ bridge: "{ ...next(operator), arg: after[0], operator: operator, interpolate: '${operator} ${arg}' }",
253
+ semantic: ({api, context}) => {
254
+ api.removeUser(api.contextToWho(context.arg))
255
+ }
256
+ },
257
+ {
258
+ id: 'addRemindable',
259
+ isA: ['verb'],
260
+ development: true,
261
+ bridge: "{ ...next(operator), flatten: true, arg: after[0], operator: operator, interpolate: '${operator} ${arg}' }",
262
+ semantic: async ({api, context}) => {
263
+ const name = context.arg.map( (word) => word.text ).join(' ')
264
+ await api.addRemindable(name)
265
+ }
266
+ },
267
+ {
268
+ id: 'remindable',
269
+ isA: ['listable'],
270
+ },
271
+ {
272
+ id: 'remindResponse',
273
+ isA: ['verb'],
274
+ convolution: true,
275
+ disabled: true,
276
+ bridge: "{ ...next(operator), operator: operator, reminder: after[0], date: after[1], interpolate: '${reminder} ${date}' }",
277
+ semantic: async ({context, api, gp, gsp}) => {
278
+ const text = await gsp(context.reminder.slice(0));
279
+ const update = { text }
280
+ if (context.date) {
281
+ update.dateTimeSelector = context.date
282
+ update.dateTimeSelectorText = await gp(context.date)
283
+ }
284
+ await api.update(update)
285
+ }
286
+ },
287
+ {
288
+ id: 'remind',
289
+ isA: ['verb'],
290
+ localHierarchy: [['self', 'remindable']],
291
+ bridge: "{ ...next(operator), operator: operator, who: after[0], reminder: after[1], interpolate: '${operator} ${who} ${reminder}' }",
292
+ justWhoBridge: "{ ...next(operator), bridge: 'justWhoBridge', operator: operator, who: after[0], interpolate: '${operator} ${who}' }",
293
+ withDateBridge: "{ ...next(operator), operator: operator, who: after[0], reminder: after[1], date: after[2], interpolate: '${operator} ${who} ${reminder} ${date}' }",
294
+ withDateFirstBridge: "{ ...next(operator), operator: operator, who: after[0], reminder: after[2], date: after[1], interpolate: '${operator} ${who} ${date} ${reminder}' }",
295
+ withDateAndTimeBridge: "{ ...next(operator), operator: operator, who: after[0], reminder: after[1], date: after[2], time: after[3], interpolate: '${operator} ${who} ${reminder} ${date} ${time}' }",
296
+ semantics: [
297
+ {
298
+ match: ({context}) => context.marker == 'remind' && context.inAddition,
299
+ apply: ({context, api}) => {
300
+ api.addUser(api.contextToWho(context.who))
301
+ }
302
+ },
90
303
  ],
304
+ semantic: async ({ask, api, gsp, gp, context}) => {
305
+ const who = api.contextToWho(context.who)
306
+ let text;
307
+ if (context.reminder) {
308
+ text = await gsp(context.reminder.slice(1));
309
+ }
310
+ const reminder = { text, dateTimeSelector: context.date, who }
311
+ if (context.date) {
312
+ reminder.dateTimeSelector = context.date
313
+ reminder.dateTimeSelectorText = await gp(context.date)
314
+ }
315
+ // await api.instantiate(reminder)
316
+ await api.add(reminder)
317
+ reminder.cleanUp = ask([
318
+ query('missingReminder', reminder.id),
319
+ query('missingDate', reminder.id),
320
+ ])
321
+ },
91
322
  },
92
323
  {
93
324
  id: 'reminders',
@@ -114,68 +345,20 @@ const template = {
114
345
  },
115
346
  ]
116
347
  },
348
+ /*
117
349
  ({ask, api}) => {
118
350
  ask([
119
- {
120
- where: where(),
121
- oneShot: false,
122
- onNevermind: ({verbatim, ...args}) => {
123
- // this is cross km boundaries from the dialogues km to this one so the api if for dialogs.
124
- // i need to get the one for fastfood here.
125
- const api = args.kms.fastfood.api
126
- const needsDrink = askAbout({ args, api })
127
- for (const item of needsDrink) {
128
- api.remove(item)
129
- }
130
- },
131
-
132
- matchq: ({ api, context }) => api.askAbout().length > 0 && context.marker == 'controlEnd',
133
- applyq: ({ api, context }) => {
134
- context.cascade = false
135
- const items = api.askAbout()
136
- const item = items[0]
137
- return 'When should I remind you to ' + item.text;
138
- },
139
-
140
- matchr: ({ isA, api, context }) => {
141
- debugger
142
- if (isA(context.marker, 'reminderTime') && api.askAbout().length > 0) {
143
- return true
144
- }
145
- return false
146
- },
147
- applyr: ({ context, api }) => {
148
- const items = api.askAbout()
149
- debugger
150
- api.update({ id: items[0].id, when: context })
151
- // TODO check for is available for all modifications
152
- /*
153
- const needsDrink = askAbout(args)
154
- const { api, context } = args
155
- if (isMany(context)) {
156
- let count = getCount(context) || Number.MAX_SAFE_INTEGER
157
- for (const item of needsDrink) {
158
- if (count < 1) {
159
- break
160
- }
161
- count -= 1
162
- api.addDrink(item.item_id, { id: context.value })
163
- }
164
- } else {
165
- const item_id = needsDrink[0].item_id
166
- api.addDrink(item_id, { id: context.value })
167
- }
168
- */
169
- }
170
- },
351
+ query('missingReminder'),
352
+ query('missingDate'),
171
353
  ])
172
354
  }
355
+ */
173
356
  ],
174
357
  }
175
358
 
176
359
  knowledgeModule( {
177
360
  config: { name: 'reminders' },
178
- includes: [dates, selfKM],
361
+ includes: [dateTimeSelectors, selfKM],
179
362
  api: () => new API(),
180
363
 
181
364
  module,
@@ -184,11 +367,21 @@ knowledgeModule( {
184
367
  name: './reminders.test.json',
185
368
  contents: reminders_tests,
186
369
  checks: {
187
- context: defaultContextCheck(['who', 'reminder']),
370
+ context: [defaultContextCheck({ extra: ['who', 'reminder'] })],
188
371
  objects: [
189
372
  {
190
373
  property: 'reminders',
191
- filter: [ 'text', 'when' ],
374
+ filter: [
375
+ 'text',
376
+ 'dateTimeSelectorText',
377
+ 'nextISODate',
378
+ 'who',
379
+ 'stm',
380
+ {
381
+ property: 'dateTimeSelector',
382
+ filter: ['marker', 'text', 'value'],
383
+ },
384
+ ],
192
385
  }
193
386
  ],
194
387
  },