tpmkms_4wp 9.3.0-beta.31 → 9.3.0-beta.33

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.
@@ -7,24 +7,58 @@
7
7
  "pattern": "([addRemindable] (word)*)",
8
8
  "development": true
9
9
  },
10
- "([remind] (remindable/*) (!@<= 'dateTimeSelector')*)",
11
- "([remind:withDateBridge] (remindable/*) (!@<= 'dateTimeSelector')* (dateTimeSelector))",
12
- "([remind:withDateAndTimeBridge] (remindable/*) (!@<= 'dateTimeSelector')* (dateTimeSelector) (atTime))",
10
+ "([remind:justWhoBridge] (remindable/*))",
11
+ "([remind] (remindable/*) (!@<= 'dateTimeSelector' && !@<= 'inAddition')*)",
12
+ "([remind:withDateBridge] (remindable/*) (!@<= 'dateTimeSelector' && !@<= 'inAddition')* (dateTimeSelector))",
13
+ "([remind:withDateAndTimeBridge] (remindable/*) (!@<= 'dateTimeSelector' && !@<= 'inAddition')* (dateTimeSelector) (atTime))",
13
14
  "([show] ([reminders]))",
14
- "([delete_reminders|delete,cancel] (number/*))"
15
+ "([delete_reminders|delete,cancel] (number/*))",
16
+ "([add] (remindable/*))",
17
+ "([remove|] (remindable/*))",
18
+ "((verb/*) [inAddition|also,too])"
15
19
  ],
16
20
  "bridges": [
21
+ {
22
+ "id": "inAddition",
23
+ "after": [
24
+ "verb"
25
+ ],
26
+ "bridge": "{ ...before[0], inAddition: true, verb: before[0], operator: operator, interpolate: '${verb} ${operator}' }"
27
+ },
28
+ {
29
+ "id": "add",
30
+ "isA": [
31
+ "verb"
32
+ ],
33
+ "bridge": "{ ...next(operator), arg: after[0], operator: operator, interpolate: '${operator} ${arg}' }",
34
+ "semantic": "({api, context}) => {\n api.addUser(api.contextToWho(context.arg))\n }"
35
+ },
36
+ {
37
+ "id": "remove",
38
+ "words": [
39
+ "delete",
40
+ "remove"
41
+ ],
42
+ "isA": [
43
+ "verb"
44
+ ],
45
+ "bridge": "{ ...next(operator), arg: after[0], operator: operator, interpolate: '${operator} ${arg}' }",
46
+ "semantic": "({api, context}) => {\n api.removeUser(api.contextToWho(context.arg))\n }"
47
+ },
17
48
  {
18
49
  "id": "addRemindable",
19
50
  "isA": [
20
51
  "verb"
21
52
  ],
22
53
  "development": true,
23
- "bridge": "{ ...next(operator), arg: after[0], operator: operator, interpolate: '${operator} ${arg}' }",
54
+ "bridge": "{ ...next(operator), flatten: true, arg: after[0], operator: operator, interpolate: '${operator} ${arg}' }",
24
55
  "semantic": "({api, context}) => {\n const name = context.arg.map( (word) => word.text ).join(' ')\n api.addRemindable(name)\n }"
25
56
  },
26
57
  {
27
- "id": "remindable"
58
+ "id": "remindable",
59
+ "isA": [
60
+ "listable"
61
+ ]
28
62
  },
29
63
  {
30
64
  "id": "remind",
@@ -38,9 +72,11 @@
38
72
  ]
39
73
  ],
40
74
  "bridge": "{ ...next(operator), operator: operator, who: after[0], reminder: after[1], interpolate: '${operator} ${who} ${reminder}' }",
75
+ "justWhoBridge": "{ ...next(operator), bridge: 'justWhoBridge', operator: operator, who: after[0], interpolate: '${operator} ${who}' }",
41
76
  "withDateBridge": "{ ...next(operator), operator: operator, who: after[0], reminder: after[1], date: after[2], interpolate: '${operator} ${who} ${reminder} ${date}' }",
42
77
  "withDateAndTimeBridge": "{ ...next(operator), operator: operator, who: after[0], reminder: after[1], date: after[2], time: after[3], interpolate: '${operator} ${who} ${reminder} ${date} ${time}' }",
43
- "semantic": "async ({api, gsp, gp, context}) => {\n const text = await gsp(context.reminder.slice(1));\n const who = { id: context.who.value || context.who.text, text: context.who.text }\n const reminder = { text, dateTimeSelector: context.date, who }\n if (context.date) {\n reminder.dateTimeSelector = context.date\n reminder.dateTimeSelectorText = await gp(context.date)\n }\n // await api.instantiate(reminder)\n await api.add(reminder)\n }"
78
+ "semantics": "[object Object]",
79
+ "semantic": "async ({ask, api, gsp, gp, context}) => {\n const who = api.contextToWho(context.who)\n let text;\n if (context.reminder) {\n text = await gsp(context.reminder.slice(1));\n }\n const reminder = { text, dateTimeSelector: context.date, who }\n if (context.date) {\n reminder.dateTimeSelector = context.date\n reminder.dateTimeSelectorText = await gp(context.date)\n }\n // await api.instantiate(reminder)\n await api.add(reminder)\n ask([\n query('missingReminder', reminder),\n query('missingDate', reminder),\n ])\n }"
44
80
  },
45
81
  {
46
82
  "id": "reminders",
@@ -65,9 +101,6 @@
65
101
  "semantic": "({context, api, verbatim}) => {\n const s = api.delete_reminder(context.reminders.value)\n if (s) {\n verbatim(s)\n }\n }"
66
102
  }
67
103
  ]
68
- },
69
- {
70
- "apply": "({ask, api}) => {\n ask([\n {\n where: where(),\n oneShot: false,\n onNevermind: ({verbatim, ...args}) => {\n // this is cross km boundaries from the dialogues km to this one so the api if for dialogs.\n // i need to get the one for fastfood here.\n const api = args.kms.fastfood.api\n const needsDrink = askAbout({ args, api })\n for (const item of needsDrink) {\n api.remove(item)\n }\n },\n\n matchq: ({ api, context }) => api.askAbout().length > 0 && context.marker == 'controlEnd',\n applyq: ({ api, context }) => {\n context.cascade = false\n const items = api.askAbout()\n const item = items[0]\n return 'When should I remind you to ' + item.text;\n },\n\n matchr: ({ isA, api, context }) => {\n if ((isA(context.marker, 'onDateValue_dates') || isA(context.marker, 'dateTimeSelector')) && api.askAbout().length > 0) {\n return true\n }\n return false\n },\n applyr: async ({ context, api, gp }) => {\n const items = api.askAbout()\n await api.update({ id: items[0].id, dateTimeSelector: context, dateTimeSelectorText: await gp(context) })\n }\n },\n ])\n }"
71
104
  }
72
105
  ],
73
106
  "resultss": [
@@ -79,23 +112,55 @@
79
112
  "pattern": "([addRemindable] (word)*)",
80
113
  "development": true
81
114
  },
82
- "([remind] (remindable/*) (!@<= 'dateTimeSelector')*)",
83
- "([remind:withDateBridge] (remindable/*) (!@<= 'dateTimeSelector')* (dateTimeSelector))",
84
- "([remind:withDateAndTimeBridge] (remindable/*) (!@<= 'dateTimeSelector')* (dateTimeSelector) (atTime))",
115
+ "([remind:justWhoBridge] (remindable/*))",
116
+ "([remind] (remindable/*) (!@<= 'dateTimeSelector' && !@<= 'inAddition')*)",
117
+ "([remind:withDateBridge] (remindable/*) (!@<= 'dateTimeSelector' && !@<= 'inAddition')* (dateTimeSelector))",
118
+ "([remind:withDateAndTimeBridge] (remindable/*) (!@<= 'dateTimeSelector' && !@<= 'inAddition')* (dateTimeSelector) (atTime))",
85
119
  "([show] ([reminders]))",
86
- "([delete_reminders|delete,cancel] (number/*))"
120
+ "([delete_reminders|delete,cancel] (number/*))",
121
+ "([add] (remindable/*))",
122
+ "([remove|] (remindable/*))",
123
+ "((verb/*) [inAddition|also,too])"
87
124
  ],
88
125
  "bridges": [
126
+ {
127
+ "id": "inAddition",
128
+ "after": [
129
+ "verb"
130
+ ],
131
+ "bridge": "{ ...before[0], inAddition: true, verb: before[0], operator: operator, interpolate: '${verb} ${operator}' }"
132
+ },
133
+ {
134
+ "id": "add",
135
+ "isA": [
136
+ "verb"
137
+ ],
138
+ "bridge": "{ ...next(operator), arg: after[0], operator: operator, interpolate: '${operator} ${arg}' }"
139
+ },
140
+ {
141
+ "id": "remove",
142
+ "words": [
143
+ "delete",
144
+ "remove"
145
+ ],
146
+ "isA": [
147
+ "verb"
148
+ ],
149
+ "bridge": "{ ...next(operator), arg: after[0], operator: operator, interpolate: '${operator} ${arg}' }"
150
+ },
89
151
  {
90
152
  "id": "addRemindable",
91
153
  "isA": [
92
154
  "verb"
93
155
  ],
94
156
  "development": true,
95
- "bridge": "{ ...next(operator), arg: after[0], operator: operator, interpolate: '${operator} ${arg}' }"
157
+ "bridge": "{ ...next(operator), flatten: true, arg: after[0], operator: operator, interpolate: '${operator} ${arg}' }"
96
158
  },
97
159
  {
98
- "id": "remindable"
160
+ "id": "remindable",
161
+ "isA": [
162
+ "listable"
163
+ ]
99
164
  },
100
165
  {
101
166
  "id": "remind",
@@ -109,8 +174,12 @@
109
174
  ]
110
175
  ],
111
176
  "bridge": "{ ...next(operator), operator: operator, who: after[0], reminder: after[1], interpolate: '${operator} ${who} ${reminder}' }",
177
+ "justWhoBridge": "{ ...next(operator), bridge: 'justWhoBridge', operator: operator, who: after[0], interpolate: '${operator} ${who}' }",
112
178
  "withDateBridge": "{ ...next(operator), operator: operator, who: after[0], reminder: after[1], date: after[2], interpolate: '${operator} ${who} ${reminder} ${date}' }",
113
- "withDateAndTimeBridge": "{ ...next(operator), operator: operator, who: after[0], reminder: after[1], date: after[2], time: after[3], interpolate: '${operator} ${who} ${reminder} ${date} ${time}' }"
179
+ "withDateAndTimeBridge": "{ ...next(operator), operator: operator, who: after[0], reminder: after[1], date: after[2], time: after[3], interpolate: '${operator} ${who} ${reminder} ${date} ${time}' }",
180
+ "semantics": [
181
+ {}
182
+ ]
114
183
  },
115
184
  {
116
185
  "id": "reminders",
@@ -133,9 +202,6 @@
133
202
  "bridge": "{ ...next(operator), operator: operator, reminders: after[0], interpolate: '${operator} ${reminders}' }"
134
203
  }
135
204
  ]
136
- },
137
- {
138
- "apply": "({ask, api}) => {\n ask([\n {\n where: where(),\n oneShot: false,\n onNevermind: ({verbatim, ...args}) => {\n // this is cross km boundaries from the dialogues km to this one so the api if for dialogs.\n // i need to get the one for fastfood here.\n const api = args.kms.fastfood.api\n const needsDrink = askAbout({ args, api })\n for (const item of needsDrink) {\n api.remove(item)\n }\n },\n\n matchq: ({ api, context }) => api.askAbout().length > 0 && context.marker == 'controlEnd',\n applyq: ({ api, context }) => {\n context.cascade = false\n const items = api.askAbout()\n const item = items[0]\n return 'When should I remind you to ' + item.text;\n },\n\n matchr: ({ isA, api, context }) => {\n if ((isA(context.marker, 'onDateValue_dates') || isA(context.marker, 'dateTimeSelector')) && api.askAbout().length > 0) {\n return true\n }\n return false\n },\n applyr: async ({ context, api, gp }) => {\n const items = api.askAbout()\n await api.update({ id: items[0].id, dateTimeSelector: context, dateTimeSelectorText: await gp(context) })\n }\n },\n ])\n }"
139
205
  }
140
206
  ],
141
207
  "fragments": [],
@@ -16,6 +16,54 @@ const helpers = require('./helpers')
16
16
  remind every truck driver to whatever tomorrow at 8 am
17
17
  */
18
18
 
19
+ const query = (missing, reminder) => {
20
+ return {
21
+ where: where(),
22
+ // oneShot: false,
23
+ onNevermind: ({verbatim, ...args}) => {
24
+ const api = args.kms.reminders.api
25
+ api.delete_reminder(reminder.id)
26
+ },
27
+
28
+ matchq: ({ api, context }) => api.missing(missing, reminder) && context.marker == 'controlEnd',
29
+ applyq: async ({ api, context, gs }) => {
30
+ context.cascade = false
31
+ const item = api.missing(missing, reminder)
32
+ let who
33
+ if (Array.isArray(item.who)) {
34
+ who = await gs(item.who.map((who) => who.text), ', ', ' and ')
35
+ } else {
36
+ if (item.who.text == 'me') {
37
+ who = 'you'
38
+ } else {
39
+ who = item.who.text
40
+ }
41
+ }
42
+ if (item.missingDate) {
43
+ return `When should I remind ${who} to ${item.text}`
44
+ }
45
+ if (item.missingReminder) {
46
+ return `What should I remind ${who} to do?`
47
+ }
48
+ },
49
+
50
+ matchr: ({ isA, api, context }) => {
51
+ const gotADate = ((isA(context.marker, 'onDateValue_dates') || isA(context.marker, 'dateTimeSelector')) && api.missing(missing, reminder))
52
+ if (missing == 'missingDate') {
53
+ return gotADate
54
+ } else {
55
+ // debugger
56
+ // return !gotADate && !context.isControl
57
+ }
58
+ return false
59
+ },
60
+ applyr: async ({ context, api, gp }) => {
61
+ const item = api.missing(missing, reminder)
62
+ await api.update({ id: item.id, dateTimeSelector: context, dateTimeSelectorText: await gp(context) })
63
+ }
64
+ }
65
+ }
66
+
19
67
  class API {
20
68
  initialize({ objects }) {
21
69
  this._objects = objects
@@ -39,7 +87,7 @@ class API {
39
87
 
40
88
  // addUser to current
41
89
  addUser(user) {
42
- const reminder = this._objects.reminders.find((r) => r.id == this._objects.current)
90
+ const reminder = this.reminders().find((r) => r.id == this._objects.current)
43
91
  if (reminder) {
44
92
  if (Array.isArray(reminder.who)) {
45
93
  reminder.who = [...reminder.who, user]
@@ -50,7 +98,7 @@ class API {
50
98
  }
51
99
 
52
100
  removeUser(user) {
53
- const reminder = this._objects.reminders.find((r) => r.id == this._objects.current)
101
+ const reminder = this.reminders().find((r) => r.id == this._objects.current)
54
102
  if (reminder) {
55
103
  reminder.who = reminder.who.filter((who) => who.remindee_id != user.remindee_id)
56
104
  }
@@ -84,23 +132,43 @@ class API {
84
132
  getCurrent() {
85
133
  }
86
134
 
87
- askAbout() {
135
+ missing(what, reminder) {
136
+ if (what == 'missingReminder' && !reminder.text) {
137
+ return { when: true, who: reminder.who, text: reminder.text, id: reminder.id, missingReminder: true }
138
+ }
139
+ if (what == 'missingDate' && !reminder.dateTimeSelector) {
140
+ return { when: true, who: reminder.who, text: reminder.text, id: reminder.id, missingDate: true }
141
+ }
142
+ }
143
+
144
+ reminders() {
145
+ return this._objects.reminders
146
+ }
147
+
148
+ setReminders(reminders) {
149
+ this._objects.reminders = reminders
150
+ }
151
+
152
+ askAbout(what) {
88
153
  const items = []
89
- for (const item of this._objects.reminders) {
90
- if (!item.dateTimeSelector) {
91
- items.push({ when: true, who: item.who, text: item.text, id: item.id })
154
+ for (const item of this.reminders()) {
155
+ if (this.missing('missingReminder', item)) {
156
+ items.push(this.missing('missingReminder', item))
157
+ }
158
+ if (this.missing('missingDate', item)) {
159
+ items.push(this.missing('missingDate', item))
92
160
  }
93
161
  }
94
162
  return items
95
163
  }
96
164
 
97
165
  show() {
98
- if (this._objects.reminders.length == 0) {
166
+ if (this.reminders().length == 0) {
99
167
  return "There are no reminders"
100
168
  }
101
169
  let s = 'The reminders are\n'
102
170
  let counter = 1
103
- for (const item of this._objects.reminders) {
171
+ for (const item of this.reminders()) {
104
172
  s += ` ${counter}. ${item.text}\n`
105
173
  counter += 1
106
174
  }
@@ -108,11 +176,14 @@ class API {
108
176
  // -> return a table object. then have ability to talk about the table. maybe later let's focus on this for now
109
177
  }
110
178
 
111
- delete_reminder(ordinal) {
112
- if (ordinal < 1 || ordinal > this._objects.reminders.length) {
113
- return `Not possible`
179
+ delete_reminder(id) {
180
+ const reminder = this.reminders().find((reminder) => reminder.id)
181
+ if (reminder) {
182
+ if (reminder.cleanUp) {
183
+ reminder.cleanUp()
184
+ }
185
+ this.setReminders(this._objects.reminders.filter((reminder) => reminder.id != id))
114
186
  }
115
- this._objects.reminders = this._objects.reminders.splice(ordinal, 1)
116
187
  }
117
188
 
118
189
  async update(update) {
@@ -198,7 +269,7 @@ const template = {
198
269
  }
199
270
  },
200
271
  ],
201
- semantic: async ({api, gsp, gp, context}) => {
272
+ semantic: async ({ask, api, gsp, gp, context}) => {
202
273
  const who = api.contextToWho(context.who)
203
274
  let text;
204
275
  if (context.reminder) {
@@ -211,6 +282,10 @@ const template = {
211
282
  }
212
283
  // await api.instantiate(reminder)
213
284
  await api.add(reminder)
285
+ reminder.cleanUp = ask([
286
+ query('missingReminder', reminder),
287
+ query('missingDate', reminder),
288
+ ])
214
289
  },
215
290
  },
216
291
  {
@@ -238,52 +313,14 @@ const template = {
238
313
  },
239
314
  ]
240
315
  },
316
+ /*
241
317
  ({ask, api}) => {
242
318
  ask([
243
- {
244
- where: where(),
245
- oneShot: false,
246
- onNevermind: ({verbatim, ...args}) => {
247
- // this is cross km boundaries from the dialogues km to this one so the api if for dialogs.
248
- // i need to get the one for fastfood here.
249
- const api = args.kms.fastfood.api
250
- const needsDrink = askAbout({ args, api })
251
- for (const item of needsDrink) {
252
- api.remove(item)
253
- }
254
- },
255
-
256
- matchq: ({ api, context }) => api.askAbout().length > 0 && context.marker == 'controlEnd',
257
- applyq: async ({ api, context, gs }) => {
258
- context.cascade = false
259
- const items = api.askAbout()
260
- const item = items[0]
261
- let who
262
- if (Array.isArray(item.who)) {
263
- who = await gs(item.who.map((who) => who.text), ', ', ' and ')
264
- } else {
265
- if (item.who.text == 'me') {
266
- who = 'you'
267
- } else {
268
- who = item.who.text
269
- }
270
- }
271
- return `When should I remind ${who} to ${item.text}`
272
- },
273
-
274
- matchr: ({ isA, api, context }) => {
275
- if ((isA(context.marker, 'onDateValue_dates') || isA(context.marker, 'dateTimeSelector')) && api.askAbout().length > 0) {
276
- return true
277
- }
278
- return false
279
- },
280
- applyr: async ({ context, api, gp }) => {
281
- const items = api.askAbout()
282
- await api.update({ id: items[0].id, dateTimeSelector: context, dateTimeSelectorText: await gp(context) })
283
- }
284
- },
319
+ query('missingReminder'),
320
+ query('missingDate'),
285
321
  ])
286
322
  }
323
+ */
287
324
  ],
288
325
  }
289
326