ekms 8.0.0-beta.77 → 8.0.0-beta.79
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/common/asking.instance.json +2 -0
- package/common/asking.js +253 -0
- package/common/asking.test.json +2290 -0
- package/common/colors.instance.json +0 -28
- package/common/conjunction.instance.json +2 -0
- package/common/conjunction.js +104 -0
- package/common/conjunction.test.json +322 -0
- package/common/crew.instance.json +36 -0
- package/common/dialogues.js +14 -173
- package/common/dialogues.test.json +0 -786
- package/common/edible.instance.json +2 -58
- package/common/fastfood.instance.json +259 -979
- package/common/help.test.json +20 -26
- package/common/helpers.js +7 -0
- package/common/ordering.instance.json +0 -68
- package/common/ordinals.instance.json +2 -0
- package/common/ordinals.js +60 -0
- package/common/ordinals.test.json +306 -0
- package/common/pipboy.instance.json +0 -56
- package/common/reports.instance.json +1 -1
- package/main.js +6 -0
- package/package.json +14 -2
package/common/asking.js
ADDED
@@ -0,0 +1,253 @@
|
|
1
|
+
const { knowledgeModule, where, stableId } = require('./runtime').theprogrammablemind
|
2
|
+
const meta = require('./meta.js')
|
3
|
+
const gdefaults = require('./gdefaults.js')
|
4
|
+
const sdefaults = require('./sdefaults.js')
|
5
|
+
const conjunction = require('./conjunction.js')
|
6
|
+
const asking_tests = require('./asking.test.json')
|
7
|
+
const { defaultContextCheck, indent, focus, requiredArgument } = require('./helpers')
|
8
|
+
const pluralize = require('pluralize')
|
9
|
+
|
10
|
+
// TODO implement what / what did you say ...
|
11
|
+
let config = {
|
12
|
+
name: 'asking',
|
13
|
+
operators: [
|
14
|
+
"([nevermind])",
|
15
|
+
{ pattern: "([nevermindTestSetup] (allowed))", development: true },
|
16
|
+
{ pattern: "([whichOnesTestSetup] (choices)*)", development: true },
|
17
|
+
],
|
18
|
+
bridges: [
|
19
|
+
{
|
20
|
+
id: "nevermind",
|
21
|
+
bridge: "{ ...next(operator) }",
|
22
|
+
semantic: (args) => {
|
23
|
+
const {config, context} = args
|
24
|
+
// stop asking all questions
|
25
|
+
for (const semantic of config.semantics) {
|
26
|
+
if (semantic.isQuestion) {
|
27
|
+
let doRemove = true
|
28
|
+
if (semantic.onNevermind && semantic.getWasAsked() && !semantic.getWasApplied()) {
|
29
|
+
doRemove = semantic.onNevermind(args)
|
30
|
+
}
|
31
|
+
if (doRemove) {
|
32
|
+
config.removeSemantic(semantic)
|
33
|
+
}
|
34
|
+
}
|
35
|
+
}
|
36
|
+
}
|
37
|
+
},
|
38
|
+
|
39
|
+
{
|
40
|
+
id: "whichOnesTestSetup",
|
41
|
+
development: true,
|
42
|
+
generatorp: async ({context, gs}) => `${context.marker} ${await gs(context.choices)}`,
|
43
|
+
bridge: "{ ...next(operator), choices: after }",
|
44
|
+
semantic: ({askWhich, context}) => {
|
45
|
+
const choices = context.choices
|
46
|
+
const chosen = ({ choice, objects }) => {
|
47
|
+
objects.choice = choice
|
48
|
+
}
|
49
|
+
|
50
|
+
const question = async ({choices, g, gs, wasAsked, state}) => {
|
51
|
+
if (wasAsked) {
|
52
|
+
return `${await g(state.lastChoice)} is not a choice. The choices are: ${await gs(choices, ' ', ' or ')}`
|
53
|
+
} else {
|
54
|
+
return `Which value do you want: ${await gs(choices, ' ', ' or ')}`
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
58
|
+
const isChoice = ({context, choices, state}) => {
|
59
|
+
state.lastChoice = context
|
60
|
+
for (const choice of choices) {
|
61
|
+
if (choice.value == context.value) {
|
62
|
+
return true
|
63
|
+
}
|
64
|
+
}
|
65
|
+
}
|
66
|
+
|
67
|
+
const onNevermind = ({objects, context}) => {
|
68
|
+
objects.onNevermindWasCalled = true
|
69
|
+
return true
|
70
|
+
}
|
71
|
+
|
72
|
+
askWhich({ choices, chosen, question, isChoice, onNevermind })
|
73
|
+
}
|
74
|
+
},
|
75
|
+
|
76
|
+
{
|
77
|
+
id: "nevermindTestSetup",
|
78
|
+
development: true,
|
79
|
+
bridge: "{ ...next(operator), type: after[0], postModifiers: ['type'] }",
|
80
|
+
semantic: ({ask, context}) => {
|
81
|
+
const nevermindType = context.type.value
|
82
|
+
ask({
|
83
|
+
applyq: () => 'the test question?',
|
84
|
+
onNevermind: ({objects, context}) => {
|
85
|
+
objects.onNevermindWasCalled = true
|
86
|
+
objects.nevermindType = nevermindType
|
87
|
+
return nevermindType == 'accept'
|
88
|
+
},
|
89
|
+
matchr: () => false,
|
90
|
+
applyr: () => {},
|
91
|
+
})
|
92
|
+
}
|
93
|
+
},
|
94
|
+
],
|
95
|
+
};
|
96
|
+
|
97
|
+
const getAsk = (config) => (uuid) => {
|
98
|
+
return (asks) => {
|
99
|
+
const ask = (ask) => {
|
100
|
+
let oneShot = true // default
|
101
|
+
if (ask.oneShot === false) {
|
102
|
+
oneShot = false
|
103
|
+
}
|
104
|
+
|
105
|
+
const id_q = stableId('semantic')
|
106
|
+
const id_rs = []
|
107
|
+
let wasAsked = false
|
108
|
+
let wasApplied = false
|
109
|
+
const getWasAsked = () => {
|
110
|
+
return wasAsked
|
111
|
+
}
|
112
|
+
const setWasAsked = (value) => {
|
113
|
+
wasAsked = value
|
114
|
+
}
|
115
|
+
const getWasApplied = () => {
|
116
|
+
return wasApplied
|
117
|
+
}
|
118
|
+
const setWasApplied = (value) => {
|
119
|
+
wasApplied = value
|
120
|
+
}
|
121
|
+
|
122
|
+
const semanticsr = ask.semanticsr || []
|
123
|
+
if (semanticsr.length == 0) {
|
124
|
+
semanticsr.push({ match: ask.matchr, apply: ask.applyr })
|
125
|
+
}
|
126
|
+
for (const semantic of semanticsr) {
|
127
|
+
const id_r = stableId('semantic')
|
128
|
+
id_rs.push(id_r)
|
129
|
+
config.addSemantic({
|
130
|
+
uuid,
|
131
|
+
id: id_r,
|
132
|
+
tied_ids: [id_q],
|
133
|
+
oneShot,
|
134
|
+
where: semantic.where || ask.where || where(2),
|
135
|
+
source: 'response',
|
136
|
+
match: (args) => semantic.match(args),
|
137
|
+
apply: async (args) => {
|
138
|
+
setWasApplied(true)
|
139
|
+
await semantic.apply(args)
|
140
|
+
},
|
141
|
+
})
|
142
|
+
}
|
143
|
+
|
144
|
+
config.addSemantic({
|
145
|
+
uuid,
|
146
|
+
oneShot,
|
147
|
+
id: id_q,
|
148
|
+
tied_ids: id_rs,
|
149
|
+
where: ask.where,
|
150
|
+
isQuestion: true, // do one question at a time
|
151
|
+
getWasAsked,
|
152
|
+
getWasApplied,
|
153
|
+
onNevermind: ask.onNevermind,
|
154
|
+
source: 'question',
|
155
|
+
match: ({ context }) => context.marker == 'controlEnd' || context.marker == 'controlBetween',
|
156
|
+
apply: async (args) => {
|
157
|
+
let matchq = ask.matchq
|
158
|
+
let applyq = ask.applyq
|
159
|
+
if (!matchq) {
|
160
|
+
let wasAsked = false
|
161
|
+
matchq = () => !wasAsked,
|
162
|
+
applyq = (args) => {
|
163
|
+
wasAsked = true
|
164
|
+
return ask.applyq(args)
|
165
|
+
}
|
166
|
+
}
|
167
|
+
if (await matchq(args)) {
|
168
|
+
setWasApplied(false)
|
169
|
+
// args.context.motivationKeep = true
|
170
|
+
args.verbatim(await applyq({ ...args, wasAsked: getWasAsked() }))
|
171
|
+
setWasAsked(true)
|
172
|
+
args.context.controlKeepMotivation = true
|
173
|
+
}
|
174
|
+
args.context.cascade = true
|
175
|
+
}
|
176
|
+
})
|
177
|
+
}
|
178
|
+
if (!Array.isArray(asks)) {
|
179
|
+
asks = [asks]
|
180
|
+
}
|
181
|
+
|
182
|
+
[...asks].reverse().forEach( (a) => ask(a) )
|
183
|
+
}
|
184
|
+
}
|
185
|
+
|
186
|
+
|
187
|
+
const initializer = ({objects, config, isModule}) => {
|
188
|
+
config.addArgs(({config, api, isA}) => ({
|
189
|
+
getUUIDScoped: (uuid) => {
|
190
|
+
const ask = getAsk(config)(uuid)
|
191
|
+
return {
|
192
|
+
ask,
|
193
|
+
askWhich: ({ choices, chosen, question, isChoice, onNevermind }) => {
|
194
|
+
let state = {}
|
195
|
+
|
196
|
+
requiredArgument(choices, 'choices')
|
197
|
+
requiredArgument(chosen, 'chosen')
|
198
|
+
|
199
|
+
if (!onNevermind) {
|
200
|
+
onNevermind = ({objects, context}) => {
|
201
|
+
return true
|
202
|
+
}
|
203
|
+
}
|
204
|
+
|
205
|
+
if (!question) {
|
206
|
+
const question = async ({choices, g, gs, wasAsked, state}) => {
|
207
|
+
if (wasAsked) {
|
208
|
+
return `${await g(state.lastChoice)} is not a choice. The choices are: ${await gs(choices, ' ', ' or ')}`
|
209
|
+
} else {
|
210
|
+
return `Which value do you want: ${await gs(choices, ' ', ' or ')}`
|
211
|
+
}
|
212
|
+
}
|
213
|
+
}
|
214
|
+
|
215
|
+
if (!isChoice) {
|
216
|
+
const isChoice = ({context, choices, state}) => {
|
217
|
+
state.lastChoice = context
|
218
|
+
for (const choice of choices) {
|
219
|
+
if (choice.value == context.value) {
|
220
|
+
return true
|
221
|
+
}
|
222
|
+
}
|
223
|
+
}
|
224
|
+
}
|
225
|
+
|
226
|
+
ask({
|
227
|
+
applyq: async (args) => await question({...args, choices, state}),
|
228
|
+
onNevermind,
|
229
|
+
matchr: (args) => isChoice({...args, choices, state}),
|
230
|
+
applyr: (args) => chosen({...args, choice: args.context}),
|
231
|
+
})
|
232
|
+
}
|
233
|
+
}
|
234
|
+
},
|
235
|
+
}))
|
236
|
+
}
|
237
|
+
|
238
|
+
knowledgeModule( {
|
239
|
+
config,
|
240
|
+
includes: [conjunction, gdefaults, sdefaults],
|
241
|
+
initializer,
|
242
|
+
module,
|
243
|
+
description: 'asking the user questions',
|
244
|
+
newWay: true,
|
245
|
+
test: {
|
246
|
+
name: './asking.test.json',
|
247
|
+
contents: asking_tests,
|
248
|
+
checks: {
|
249
|
+
objects: ['onNevermindWasCalled', 'nevermindType', 'choice'],
|
250
|
+
context: defaultContextCheck,
|
251
|
+
},
|
252
|
+
},
|
253
|
+
})
|