Versie 0.2.0
This commit is contained in:
commit
e77d8fd373
495 files changed
+81026
No files matched your search
@@ -0,0 +1,106 @@
|
||||
// Generated, do not edit. sha256:588c505552ce949b88f55a05209c95d02e3be8d37929538a9fb8ef9f58643cd2
|
||||
import { CONFIG, TARGETS, targetHash } from '../../shared/config.js';
|
||||
import { placeLabel } from '../../shared/places.js';
|
||||
import { installLocale } from '../installation.mjs';
|
||||
import { assertScope } from '../ai/gate.js';
|
||||
import { createCommand, getCommand } from '../data/commands.js';
|
||||
import { flushChanges } from '../data/bus.js';
|
||||
|
||||
const DOELEN = Object.keys(TARGETS);
|
||||
|
||||
const doelenTekst = () => DOELEN
|
||||
.map(naam => `${naam} - ${placeLabel(naam, installLocale())} (${targetHash(TARGETS[naam])})`).join(', ');
|
||||
|
||||
const KIJK_INTERVAL_MS = 400;
|
||||
|
||||
const wacht = (ms) => new Promise(r => setTimeout(r, ms));
|
||||
|
||||
async function wachtOpUitkomst(id, seconden) {
|
||||
const einde = Date.now() + seconden * 1000;
|
||||
let c = getCommand(id);
|
||||
while (c && c.resolvedAt == null && Date.now() < einde) {
|
||||
await wacht(KIJK_INTERVAL_MS);
|
||||
c = getCommand(id);
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
async function stuurOpdracht(kind, payload = null) {
|
||||
const verloopt = new Date(Date.now() + CONFIG.COMMANDS.CLAIM_SECONDS * 1000).toISOString();
|
||||
const id = await createCommand({ kind, payload, expiresAt: verloopt });
|
||||
|
||||
flushChanges();
|
||||
|
||||
return wachtOpUitkomst(id, CONFIG.COMMANDS.CLAIM_SECONDS);
|
||||
}
|
||||
|
||||
const NIET_OPEN =
|
||||
'De app lijkt niet open te staan. Vraag de gebruiker of hij AssetApp opent en probeer het daarna '
|
||||
+ 'opnieuw.';
|
||||
|
||||
const navigeerNaar = Object.freeze({
|
||||
name: 'navigate_to',
|
||||
title: 'Naar een plek in de app gaan, of zien waar de gebruiker is',
|
||||
description:
|
||||
'Brengt de gebruiker naar een plek in AssetApp; zonder target zegt hij waar de gebruiker nu kijkt, '
|
||||
+ 'met de naam van die plek. Een sprong ziet de gebruiker aankomen en kan hij tegenhouden. Leest en '
|
||||
+ 'wijzigt de administratie niet. Staat de app niet open, dan zegt het antwoord dat.',
|
||||
inputSchema: Object.freeze({
|
||||
type: 'object',
|
||||
properties: {
|
||||
target: {
|
||||
type: 'string',
|
||||
enum: DOELEN,
|
||||
description: 'De plek. Weglaten om te horen waar de gebruiker is.',
|
||||
},
|
||||
},
|
||||
additionalProperties: false,
|
||||
}),
|
||||
scope: 'control',
|
||||
|
||||
async run(args) {
|
||||
assertScope('control');
|
||||
if (!args || args.target === undefined) return waarKijktDeGebruiker();
|
||||
const naam = typeof args.target === 'string' ? args.target : '';
|
||||
if (!Object.hasOwn(TARGETS, naam)) {
|
||||
return {
|
||||
text: `'${naam}' is geen bekende plek. Kies er een uit: ${doelenTekst()}.`,
|
||||
fieldsShared: [],
|
||||
};
|
||||
}
|
||||
|
||||
const doel = TARGETS[naam];
|
||||
const uit = await stuurOpdracht('navigate',
|
||||
{ route: doel.route, tab: doel.tab, sub: doel.sub, hash: targetHash(doel) });
|
||||
const stand = uit ? uit.state : 'expired';
|
||||
if (stand === 'done') {
|
||||
return { text: `Gedaan. De gebruiker kijkt nu naar ${targetHash(doel)}.`, fieldsShared: [] };
|
||||
}
|
||||
if (stand === 'rejected') {
|
||||
return {
|
||||
text: `Niet uitgevoerd: ${uit.detail || 'de opdracht is afgewezen.'} Er is niet genavigeerd.`,
|
||||
fieldsShared: [],
|
||||
};
|
||||
}
|
||||
return { text: `Er is niet genavigeerd. ${NIET_OPEN}`, fieldsShared: [] };
|
||||
},
|
||||
});
|
||||
|
||||
const NAAM_PER_HASH = new Map(DOELEN.map(naam => [targetHash(TARGETS[naam]), naam]));
|
||||
|
||||
async function waarKijktDeGebruiker() {
|
||||
const uit = await stuurOpdracht('locate');
|
||||
if (!uit || uit.state !== 'done') return { text: NIET_OPEN, fieldsShared: [] };
|
||||
|
||||
const hash = typeof uit.detail === 'string' ? uit.detail : '';
|
||||
const naam = NAAM_PER_HASH.get(hash);
|
||||
if (naam) return { text: `De gebruiker kijkt naar ${naam}: ${placeLabel(naam, installLocale())} (${hash}).`, fieldsShared: [] };
|
||||
return {
|
||||
text: hash
|
||||
? `De gebruiker kijkt naar ${hash}. Dat is geen van de plekken die navigate_to kent.`
|
||||
: 'De app staat open, maar liet niet weten waar de gebruiker kijkt.',
|
||||
fieldsShared: [],
|
||||
};
|
||||
}
|
||||
|
||||
export const CONTROL_TOOLS = Object.freeze([navigeerNaar]);
|
||||
Reference in new issue
Block a user