tpmkms_4wp 9.3.0-beta.9 → 9.4.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 (106) 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/conjunction.js +3 -5
  14. package/common/countable.js +2 -14
  15. package/common/crew.instance.json +0 -130
  16. package/common/crew.js +2 -2
  17. package/common/currency.js +2 -3
  18. package/common/dateTimeSelectors.instance.json +175 -0
  19. package/common/dateTimeSelectors.js +168 -0
  20. package/common/dateTimeSelectors.test.json +85622 -0
  21. package/common/dates.instance.json +538 -506
  22. package/common/dates.js +112 -15
  23. package/common/dates.test.json +11021 -514
  24. package/common/dialogues.js +8 -47
  25. package/common/dimension.instance.json +0 -5
  26. package/common/dimension.js +4 -4
  27. package/common/edible.instance.json +56 -160
  28. package/common/edible.js +2 -2
  29. package/common/emotions.instance.json +0 -5
  30. package/common/emotions.js +2 -2
  31. package/common/errors.js +3 -0
  32. package/common/evaluate.js +2 -2
  33. package/common/events.js +1 -2
  34. package/common/fastfood.instance.json +262 -713
  35. package/common/fastfood.js +2 -4
  36. package/common/formulas.instance.json +0 -5
  37. package/common/formulas.js +3 -1
  38. package/common/gdefaults.js +2 -3
  39. package/common/help.js +2 -2
  40. package/common/helpers/dateTimeSelectors.js +198 -0
  41. package/common/helpers/dialogues.js +11 -8
  42. package/common/helpers/properties.js +2 -2
  43. package/common/helpers.js +22 -63
  44. package/common/hierarchy.js +12 -13
  45. package/common/javascript.js +2 -3
  46. package/common/kirk.instance.json +0 -5
  47. package/common/kirk.js +2 -3
  48. package/common/length.instance.json +0 -75
  49. package/common/length.js +2 -3
  50. package/common/listener.js +3 -1
  51. package/common/math.instance.json +0 -5
  52. package/common/math.js +2 -3
  53. package/common/menus.instance.json +0 -35
  54. package/common/menus.js +3 -1
  55. package/common/meta.js +4 -5
  56. package/common/nameable.js +3 -1
  57. package/common/negation.js +2 -2
  58. package/common/numbers.js +6 -3
  59. package/common/ordering.instance.json +0 -10
  60. package/common/ordering.js +2 -3
  61. package/common/ordinals.js +2 -3
  62. package/common/people.instance.json +0 -40
  63. package/common/people.js +2 -3
  64. package/common/percentages.js +2 -3
  65. package/common/percentages.test.json +57 -11
  66. package/common/pipboy.instance.json +84 -85
  67. package/common/pipboy.js +1 -1
  68. package/common/pokemon.instance.json +0 -65
  69. package/common/pokemon.js +1 -2
  70. package/common/pos.js +2 -2
  71. package/common/pressure.instance.json +0 -20
  72. package/common/pressure.js +2 -2
  73. package/common/properties.instance.json +0 -5
  74. package/common/properties.js +11 -13
  75. package/common/punctuation.js +2 -2
  76. package/common/reminders.instance.json +145 -35
  77. package/common/reminders.js +264 -82
  78. package/common/reminders.test.json +69523 -970
  79. package/common/reports.instance.json +2 -12
  80. package/common/reports.js +1 -1
  81. package/common/scorekeeper.js +2 -2
  82. package/common/sdefaults.js +1 -1
  83. package/common/self.js +1 -1
  84. package/common/sizeable.js +2 -2
  85. package/common/spock.instance.json +0 -5
  86. package/common/spock.js +1 -1
  87. package/common/stgame.js +1 -1
  88. package/common/stm.js +1 -1
  89. package/common/tell.js +2 -2
  90. package/common/temperature.instance.json +84 -20
  91. package/common/temperature.js +2 -2
  92. package/common/tester.js +0 -1
  93. package/common/testing.js +0 -1
  94. package/common/time.js +10 -8
  95. package/common/time.test.json +73 -119
  96. package/common/tokenize.js +1 -1
  97. package/common/ui.instance.json +0 -5
  98. package/common/ui.js +1 -1
  99. package/common/weight.instance.json +0 -60
  100. package/common/weight.js +2 -2
  101. package/common/wp.instance.json +56 -70
  102. package/common/wp.js +1 -3
  103. package/common/yesno.js +2 -2
  104. package/main.js +2 -0
  105. package/package.json +8 -4
  106. package/common/helpers/reminders.js +0 -48
@@ -3,57 +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')
7
- const time = require('./time')
8
- const reminders_helpers = require('./helpers/reminders')
6
+ const dateTimeSelectors = require('./dateTimeSelectors')
9
7
  const helpers = require('./helpers')
10
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
+
11
72
  class API {
12
73
  initialize({ objects }) {
13
74
  this._objects = objects
14
75
  this._objects.reminders = []
15
76
  this._objects.id = 0
77
+ this._objects.current = null
78
+ this._objects.defaultTime = { hour: 9, minute: 0, second: 0, millisecond: 0 }
16
79
  }
17
80
 
18
- add(reminder) {
81
+ async add(reminder) {
82
+ await this.instantiate(reminder)
19
83
  const id = ++this._objects.id
20
84
  reminder.id = id
21
85
  this._objects.reminders.push(reminder)
22
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
23
126
  }
24
127
 
25
- instantiate(reminder) {
26
- let now;
27
- if (this.args.isProcess) {
28
- // so the unit tests work consistently
29
- now = new Date(2025, 6, 29, 14, 52, 0)
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
30
135
  } else {
31
- now = new Date()
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 }
32
147
  }
33
- reminder.nextISODate = reminders_helpers.instantiate(now, reminder)
34
148
  }
35
149
 
36
- // the user of the KM can override this. this can be used to sync the GUI and the LUI
37
- getCurrent() {
150
+ reminder(id) {
151
+ return this._objects.reminders.find((reminder) => reminder.id == id)
38
152
  }
39
153
 
40
- askAbout() {
154
+ reminders() {
155
+ return this._objects.reminders
156
+ }
157
+
158
+ setReminders(reminders) {
159
+ this._objects.reminders = reminders
160
+ }
161
+
162
+ askAbout(what) {
41
163
  const items = []
42
- for (const item of this._objects.reminders) {
43
- if (!item.date) {
44
- 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))
45
170
  }
46
171
  }
47
172
  return items
48
173
  }
49
174
 
50
175
  show() {
51
- if (this._objects.reminders.length == 0) {
176
+ if (this.reminders().length == 0) {
52
177
  return "There are no reminders"
53
178
  }
54
179
  let s = 'The reminders are\n'
55
180
  let counter = 1
56
- for (const item of this._objects.reminders) {
181
+ for (const item of this.reminders()) {
57
182
  s += ` ${counter}. ${item.text}\n`
58
183
  counter += 1
59
184
  }
@@ -61,21 +186,27 @@ class API {
61
186
  // -> return a table object. then have ability to talk about the table. maybe later let's focus on this for now
62
187
  }
63
188
 
64
- delete_reminder(ordinal) {
65
- if (ordinal < 1 || ordinal > this._objects.reminders.length) {
66
- 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))
67
196
  }
68
- this._objects.reminders = this._objects.reminders.splice(ordinal, 1)
69
197
  }
70
198
 
71
- update(update) {
199
+ async update(update) {
200
+ if (!update.id) {
201
+ update.id = this.getCurrentId()
202
+ }
72
203
  for (const item of this._objects.reminders) {
73
204
  if (item.id == update.id) {
74
205
  Object.assign(item, update)
206
+ await this.instantiate(item)
75
207
  return
76
208
  }
77
209
  }
78
-
79
210
  }
80
211
  }
81
212
 
@@ -86,39 +217,108 @@ const template = {
86
217
  configs: [
87
218
  {
88
219
  operators: [
89
- "([reminderTime|])",
90
- "([remind] (self/*) (!@<= 'onDate')*)",
91
- "([onDate|on] (reminderTime))",
92
- "([remind:withDateBridge] (self/*) (!@<= 'onDate')* (onDate))",
93
- "([remind:withDateAndTimeBridge] (self/*) (!@<= 'onDate')* (onDate) (atTime))",
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))",
94
228
  "([show] ([reminders]))",
95
229
  "([delete_reminders|delete,cancel] (number/*))",
230
+ "([add] (remindable/*))",
231
+ "([remove|] (remindable/*))",
232
+ "((verb/*) [inAddition|also,too])",
96
233
  ],
97
234
  bridges: [
235
+ {
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',
242
+ isA: ['verb'],
243
+ bridge: "{ ...next(operator), arg: after[0], operator: operator, interpolate: '${operator} ${arg}' }",
244
+ semantic: ({api, context}) => {
245
+ api.addUser(api.contextToWho(context.arg))
246
+ }
247
+ },
248
+ {
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
+ },
98
287
  {
99
288
  id: 'remind',
100
289
  isA: ['verb'],
290
+ localHierarchy: [['self', 'remindable']],
101
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}' }",
102
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}' }",
103
295
  withDateAndTimeBridge: "{ ...next(operator), operator: operator, who: after[0], reminder: after[1], date: after[2], time: after[3], interpolate: '${operator} ${who} ${reminder} ${date} ${time}' }",
104
- semantic: async ({api, gsp, context}) => {
105
- const text = await gsp(context.reminder.slice(1));
106
- const reminder = { text, date: context.date, time: context.time }
107
- api.instantiate(reminder)
108
- api.add(reminder)
109
- },
110
- },
111
- {
112
- id: 'reminderTime',
113
- children: [
114
- 'day_dates',
115
- 'month_dates',
296
+ semantics: [
297
+ {
298
+ match: ({context}) => context.marker == 'remind' && context.inAddition,
299
+ apply: ({context, api}) => {
300
+ api.addUser(api.contextToWho(context.who))
301
+ }
302
+ },
116
303
  ],
117
- },
118
- {
119
- id: 'onDate',
120
- isA: ['preposition'],
121
- bridge: "{ ...next(operator), date: after[0], onDate: operator, interpolate: '${onDate} ${date}' }",
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
+ },
122
322
  },
123
323
  {
124
324
  id: 'reminders',
@@ -145,48 +345,20 @@ const template = {
145
345
  },
146
346
  ]
147
347
  },
348
+ /*
148
349
  ({ask, api}) => {
149
350
  ask([
150
- {
151
- where: where(),
152
- oneShot: false,
153
- onNevermind: ({verbatim, ...args}) => {
154
- // this is cross km boundaries from the dialogues km to this one so the api if for dialogs.
155
- // i need to get the one for fastfood here.
156
- const api = args.kms.fastfood.api
157
- const needsDrink = askAbout({ args, api })
158
- for (const item of needsDrink) {
159
- api.remove(item)
160
- }
161
- },
162
-
163
- matchq: ({ api, context }) => api.askAbout().length > 0 && context.marker == 'controlEnd',
164
- applyq: ({ api, context }) => {
165
- context.cascade = false
166
- const items = api.askAbout()
167
- const item = items[0]
168
- return 'When should I remind you to ' + item.text;
169
- },
170
-
171
- matchr: ({ isA, api, context }) => {
172
- if (isA(context.marker, 'reminderTime') && api.askAbout().length > 0) {
173
- return true
174
- }
175
- return false
176
- },
177
- applyr: ({ context, api }) => {
178
- const items = api.askAbout()
179
- api.update({ id: items[0].id, date: context })
180
- }
181
- },
351
+ query('missingReminder'),
352
+ query('missingDate'),
182
353
  ])
183
354
  }
355
+ */
184
356
  ],
185
357
  }
186
358
 
187
359
  knowledgeModule( {
188
360
  config: { name: 'reminders' },
189
- includes: [time, dates, selfKM],
361
+ includes: [dateTimeSelectors, selfKM],
190
362
  api: () => new API(),
191
363
 
192
364
  module,
@@ -195,11 +367,21 @@ knowledgeModule( {
195
367
  name: './reminders.test.json',
196
368
  contents: reminders_tests,
197
369
  checks: {
198
- context: defaultContextCheck(['who', 'reminder']),
370
+ context: [defaultContextCheck({ extra: ['who', 'reminder'] })],
199
371
  objects: [
200
372
  {
201
373
  property: 'reminders',
202
- filter: [ 'text', 'date', 'time', 'nextISODate', 'stm' ],
374
+ filter: [
375
+ 'text',
376
+ 'dateTimeSelectorText',
377
+ 'nextISODate',
378
+ 'who',
379
+ 'stm',
380
+ {
381
+ property: 'dateTimeSelector',
382
+ filter: ['marker', 'text', 'value'],
383
+ },
384
+ ],
203
385
  }
204
386
  ],
205
387
  },