tpmkms
Version:
Reusable libraries for Entodicton, a natural language to json converter
145 lines (132 loc) • 4.08 kB
JavaScript
const { knowledgeModule, where } = require('./runtime').theprogrammablemind
const { defaultContextCheck } = require('./helpers')
const helpers = require('./helpers')
const stm = require('./stm')
const nameable_tests = require('./nameable.test.json')
// TODO but "remember the m1\n call the m1 banana" <- the on the first one
class API {
initialize({ objects, km, kms }) {
this.objects = objects
this.objects.named = {}
}
// report is a context
setName(context, name) {
if (!context.stm) {
context.stm = {}
}
if (!context.stm.names) {
context.stm.names = []
}
context.stm.names.push(name)
}
get(type, name) {
return this.args.kms.stm.api.mentions({
context: type,
condition: (context) => {
if (context.stm && context.stm.names) {
return context.stm.names.includes(name)
}
}
})
}
getNamesByType(type) {
const contexts = this.args.kms.stm.api.getByType(type)
const names = new Set()
for (const context of contexts) {
if (context.stm.names) {
for (const name of context.stm.names) {
names.add(name)
}
}
}
return [...names]
}
getNames(nameable) {
return (nameable.stm && nameable.stm.names) || []
}
/*
getNames() {
const current = this.current()
console.log('getReportNames current', JSON.stringify(current, null, 2))
return Object.keys(this.objects.namedReports).map( (name) => {
const selected = (current.names || []).includes(name)
return { name, selected, id: name }
})
}
*/
setCurrent(name) {
const context = this.objects.named[name]
if (context) {
this.args.km('stm').api.mentioned({ context })
}
}
}
const api = new API()
const config = {
name: 'nameable',
operators: [
// "([call] ([nameable]) (name))",
"([call] ([nameable]) (!@<=endOfSentence)*)",
{ pattern: "([getNamesByType] (type))", development: true },
{ pattern: "([m1])", development: true },
// { pattern: "([testPullFromContext] ([memorable]))", development: true }
],
words: {
literals: {
// "m1": [{"id": "memorable", development: true, "initial": "{ value: 'm1' }" }],
// "m2": [{"id": "memorable", development: true, "initial": "{ value: 'm2' }" }],
},
},
bridges: [
{
id: 'm1',
isA: ['memorable', 'nameable'],
development: true,
},
{
id: 'getNamesByType',
development: true,
isA: ['verb'],
bridge: "{ ...next(operator), type: after[0] }",
semantic: async ({context, api}) => {
context.response = api.getNamesByType(context.type.value).join(" ")
context.isResponse = true
}
},
{
id: 'call',
isA: ['verb'],
bridge: "{ ...next(operator), nameable: after[0], name: after[1:][0] }",
// bridge: "{ ...next(operator), nameable: after[0], name: after[1] }",
// generatorp: async ({context, g}) => `call ${await g(context.nameable)} ${await g(context.name)}`,
generatorp: async ({context, g, gs}) => `call ${await g(context.nameable)} ${await gs(context.name)}`,
semantic: async ({config, context, api, e}) => {
// TODO find report being referred to
const nameable = (await e(context.nameable)).evalue
const name = context.name.map((n) => n.text).join(' ')
// const name = context.name.text
config.addWord(name, { id: nameable.marker, initial: `{ value: "${name}", pullFromContext: true, nameable_named: true }` })
api.setName(nameable, name)
}
},
{ id: 'nameable', words: helpers.words('nameable')},
]
}
knowledgeModule( {
config,
api: () => new API(),
includes: [stm],
module,
description: 'namable objects',
test: {
name: './nameable.test.json',
contents: nameable_tests,
checks: {
context: [...defaultContextCheck(), 'pullFromContext'],
objects: ['mentioned', { km: 'stm' }],
},
include: {
words: [ "peter james chunkington", "banana" ],
}
},
})