@sharpee/parser-en-us 0.9.60-beta
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/LICENSE +21 -0
- package/README.md +123 -0
- package/dist/direction-mappings.d.ts +24 -0
- package/dist/direction-mappings.d.ts.map +1 -0
- package/dist/direction-mappings.js +82 -0
- package/dist/direction-mappings.js.map +1 -0
- package/dist/english-grammar-engine.d.ts +85 -0
- package/dist/english-grammar-engine.d.ts.map +1 -0
- package/dist/english-grammar-engine.js +562 -0
- package/dist/english-grammar-engine.js.map +1 -0
- package/dist/english-parser.d.ts +184 -0
- package/dist/english-parser.d.ts.map +1 -0
- package/dist/english-parser.js +1268 -0
- package/dist/english-parser.js.map +1 -0
- package/dist/english-pattern-compiler.d.ts +29 -0
- package/dist/english-pattern-compiler.d.ts.map +1 -0
- package/dist/english-pattern-compiler.js +211 -0
- package/dist/english-pattern-compiler.js.map +1 -0
- package/dist/grammar.d.ts +19 -0
- package/dist/grammar.d.ts.map +1 -0
- package/dist/grammar.js +620 -0
- package/dist/grammar.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/parse-failure.d.ts +59 -0
- package/dist/parse-failure.d.ts.map +1 -0
- package/dist/parse-failure.js +132 -0
- package/dist/parse-failure.js.map +1 -0
- package/dist/parser-types.d.ts +185 -0
- package/dist/parser-types.d.ts.map +1 -0
- package/dist/parser-types.js +134 -0
- package/dist/parser-types.js.map +1 -0
- package/dist/pronoun-context.d.ts +119 -0
- package/dist/pronoun-context.d.ts.map +1 -0
- package/dist/pronoun-context.js +249 -0
- package/dist/pronoun-context.js.map +1 -0
- package/dist/scope-evaluator.d.ts +58 -0
- package/dist/scope-evaluator.d.ts.map +1 -0
- package/dist/scope-evaluator.js +205 -0
- package/dist/scope-evaluator.js.map +1 -0
- package/dist/slot-consumers/entity-slot-consumer.d.ts +36 -0
- package/dist/slot-consumers/entity-slot-consumer.d.ts.map +1 -0
- package/dist/slot-consumers/entity-slot-consumer.js +413 -0
- package/dist/slot-consumers/entity-slot-consumer.js.map +1 -0
- package/dist/slot-consumers/index.d.ts +43 -0
- package/dist/slot-consumers/index.d.ts.map +1 -0
- package/dist/slot-consumers/index.js +78 -0
- package/dist/slot-consumers/index.js.map +1 -0
- package/dist/slot-consumers/slot-consumer.d.ts +61 -0
- package/dist/slot-consumers/slot-consumer.d.ts.map +1 -0
- package/dist/slot-consumers/slot-consumer.js +31 -0
- package/dist/slot-consumers/slot-consumer.js.map +1 -0
- package/dist/slot-consumers/text-slot-consumer.d.ts +33 -0
- package/dist/slot-consumers/text-slot-consumer.d.ts.map +1 -0
- package/dist/slot-consumers/text-slot-consumer.js +157 -0
- package/dist/slot-consumers/text-slot-consumer.js.map +1 -0
- package/dist/slot-consumers/typed-slot-consumer.d.ts +35 -0
- package/dist/slot-consumers/typed-slot-consumer.d.ts.map +1 -0
- package/dist/slot-consumers/typed-slot-consumer.js +151 -0
- package/dist/slot-consumers/typed-slot-consumer.js.map +1 -0
- package/dist/slot-consumers/vocabulary-slot-consumer.d.ts +42 -0
- package/dist/slot-consumers/vocabulary-slot-consumer.d.ts.map +1 -0
- package/dist/slot-consumers/vocabulary-slot-consumer.js +186 -0
- package/dist/slot-consumers/vocabulary-slot-consumer.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Entity Slot Consumer
|
|
3
|
+
* @description Handles entity resolution slots including multi-object parsing (ADR-088)
|
|
4
|
+
* and pronoun resolution (ADR-089)
|
|
5
|
+
*/
|
|
6
|
+
import { SlotType, SlotMatch } from '@sharpee/if-domain';
|
|
7
|
+
import { SlotConsumer, SlotConsumerContext } from './slot-consumer';
|
|
8
|
+
/**
|
|
9
|
+
* Consumer for entity slots (ENTITY, INSTRUMENT)
|
|
10
|
+
* Handles multi-object parsing: "all", "all but X", "X and Y"
|
|
11
|
+
*/
|
|
12
|
+
export declare class EntitySlotConsumer implements SlotConsumer {
|
|
13
|
+
readonly slotTypes: SlotType[];
|
|
14
|
+
consume(ctx: SlotConsumerContext): SlotMatch | null;
|
|
15
|
+
/**
|
|
16
|
+
* Try to resolve a pronoun token using the pronoun context (ADR-089)
|
|
17
|
+
*/
|
|
18
|
+
private tryResolvePronoun;
|
|
19
|
+
/**
|
|
20
|
+
* Consume "all" and optionally "all but/except X"
|
|
21
|
+
*/
|
|
22
|
+
private consumeAllSlot;
|
|
23
|
+
/**
|
|
24
|
+
* Consume entities after "but/except" with "and" support
|
|
25
|
+
*/
|
|
26
|
+
private consumeExcludedEntities;
|
|
27
|
+
/**
|
|
28
|
+
* Consume entity slot with "and" list detection
|
|
29
|
+
*/
|
|
30
|
+
private consumeEntityWithListDetection;
|
|
31
|
+
/**
|
|
32
|
+
* Evaluate slot constraints and return confidence
|
|
33
|
+
*/
|
|
34
|
+
private evaluateSlotConstraints;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=entity-slot-consumer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-slot-consumer.d.ts","sourceRoot":"","sources":["../../src/slot-consumers/entity-slot-consumer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,QAAQ,EACR,SAAS,EAKV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAA2C,MAAM,iBAAiB,CAAC;AAI7G;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,YAAY;IACrD,QAAQ,CAAC,SAAS,aAA0C;IAE5D,OAAO,CAAC,GAAG,EAAE,mBAAmB,GAAG,SAAS,GAAG,IAAI;IAsCnD;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgEzB;;OAEG;IACH,OAAO,CAAC,cAAc;IA2CtB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAiE/B;;OAEG;IACH,OAAO,CAAC,8BAA8B;IA0KtC;;OAEG;IACH,OAAO,CAAC,uBAAuB;CAuEhC"}
|
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file Entity Slot Consumer
|
|
4
|
+
* @description Handles entity resolution slots including multi-object parsing (ADR-088)
|
|
5
|
+
* and pronoun resolution (ADR-089)
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.EntitySlotConsumer = void 0;
|
|
9
|
+
const if_domain_1 = require("@sharpee/if-domain");
|
|
10
|
+
const slot_consumer_1 = require("./slot-consumer");
|
|
11
|
+
const scope_evaluator_1 = require("../scope-evaluator");
|
|
12
|
+
const pronoun_context_1 = require("../pronoun-context");
|
|
13
|
+
/**
|
|
14
|
+
* Consumer for entity slots (ENTITY, INSTRUMENT)
|
|
15
|
+
* Handles multi-object parsing: "all", "all but X", "X and Y"
|
|
16
|
+
*/
|
|
17
|
+
class EntitySlotConsumer {
|
|
18
|
+
slotTypes = [if_domain_1.SlotType.ENTITY, if_domain_1.SlotType.INSTRUMENT];
|
|
19
|
+
consume(ctx) {
|
|
20
|
+
const { tokens, startIndex, slotType } = ctx;
|
|
21
|
+
const DEBUG = ctx.DEBUG || false;
|
|
22
|
+
const nextPatternToken = (0, slot_consumer_1.getNextPatternToken)(ctx);
|
|
23
|
+
// Check for pronoun at start (ADR-089)
|
|
24
|
+
if (startIndex < tokens.length) {
|
|
25
|
+
const firstWord = tokens[startIndex].normalized;
|
|
26
|
+
if (DEBUG) {
|
|
27
|
+
console.log(`consumeEntitySlot: startIndex=${startIndex}, token.word='${tokens[startIndex]?.word}', token.normalized='${firstWord}'`);
|
|
28
|
+
}
|
|
29
|
+
// Try to resolve as pronoun first
|
|
30
|
+
if ((0, pronoun_context_1.isRecognizedPronoun)(firstWord)) {
|
|
31
|
+
const pronounResult = this.tryResolvePronoun(ctx, firstWord, DEBUG);
|
|
32
|
+
if (pronounResult) {
|
|
33
|
+
return pronounResult;
|
|
34
|
+
}
|
|
35
|
+
// If pronoun resolution failed, fall through to standard entity resolution
|
|
36
|
+
// This handles cases like "take it" when there's no previous object
|
|
37
|
+
if (DEBUG) {
|
|
38
|
+
console.log(`Pronoun '${firstWord}' could not be resolved, trying standard entity resolution`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Check for "all" keyword at start
|
|
43
|
+
if (startIndex < tokens.length && tokens[startIndex].normalized === 'all') {
|
|
44
|
+
if (DEBUG) {
|
|
45
|
+
console.log('Detected "all" keyword, calling consumeAllSlot');
|
|
46
|
+
}
|
|
47
|
+
return this.consumeAllSlot(ctx, nextPatternToken, DEBUG);
|
|
48
|
+
}
|
|
49
|
+
// Standard entity consumption with "and" list detection
|
|
50
|
+
return this.consumeEntityWithListDetection(ctx, DEBUG);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Try to resolve a pronoun token using the pronoun context (ADR-089)
|
|
54
|
+
*/
|
|
55
|
+
tryResolvePronoun(ctx, pronoun, DEBUG) {
|
|
56
|
+
const { tokens, startIndex, slotType, context } = ctx;
|
|
57
|
+
const pronounContext = (0, pronoun_context_1.getPronounContextManager)();
|
|
58
|
+
if (!pronounContext) {
|
|
59
|
+
if (DEBUG) {
|
|
60
|
+
console.log('No pronoun context manager available');
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
const resolved = pronounContext.resolve(pronoun);
|
|
65
|
+
if (!resolved || resolved.length === 0) {
|
|
66
|
+
if (DEBUG) {
|
|
67
|
+
console.log(`Pronoun '${pronoun}' did not resolve to any entity`);
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
if (DEBUG) {
|
|
72
|
+
console.log(`Pronoun '${pronoun}' resolved to: ${resolved.map(r => r.entityId).join(', ')}`);
|
|
73
|
+
}
|
|
74
|
+
// Single entity resolution
|
|
75
|
+
if (resolved.length === 1) {
|
|
76
|
+
const ref = resolved[0];
|
|
77
|
+
// Use resolved entity's original text for entity resolution
|
|
78
|
+
// Store pronoun metadata as extended properties
|
|
79
|
+
const result = {
|
|
80
|
+
tokens: [startIndex],
|
|
81
|
+
text: ref.text, // Use resolved entity text for entity resolution
|
|
82
|
+
confidence: 1.0,
|
|
83
|
+
slotType
|
|
84
|
+
};
|
|
85
|
+
// Extended properties for pronoun tracking
|
|
86
|
+
result.entityId = ref.entityId;
|
|
87
|
+
result.resolvedText = ref.text;
|
|
88
|
+
result.isPronoun = true;
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
// Multiple entities (e.g., "them" referring to multiple objects)
|
|
92
|
+
// Use extended type for items with entityId
|
|
93
|
+
const result = {
|
|
94
|
+
tokens: [startIndex],
|
|
95
|
+
text: pronoun,
|
|
96
|
+
confidence: 1.0,
|
|
97
|
+
slotType,
|
|
98
|
+
isList: true,
|
|
99
|
+
items: resolved.map(ref => ({
|
|
100
|
+
tokens: [startIndex],
|
|
101
|
+
text: ref.text,
|
|
102
|
+
entityId: ref.entityId
|
|
103
|
+
}))
|
|
104
|
+
};
|
|
105
|
+
// Mark as pronoun resolution
|
|
106
|
+
result.isPronoun = true;
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Consume "all" and optionally "all but/except X"
|
|
111
|
+
*/
|
|
112
|
+
consumeAllSlot(ctx, nextPatternToken, DEBUG) {
|
|
113
|
+
const { tokens, startIndex, slotType } = ctx;
|
|
114
|
+
const consumedIndices = [startIndex];
|
|
115
|
+
let currentIndex = startIndex + 1;
|
|
116
|
+
const excluded = [];
|
|
117
|
+
// Check for "but" or "except" after "all"
|
|
118
|
+
if (currentIndex < tokens.length) {
|
|
119
|
+
const nextWord = tokens[currentIndex].normalized;
|
|
120
|
+
if (nextWord === 'but' || nextWord === 'except') {
|
|
121
|
+
consumedIndices.push(currentIndex);
|
|
122
|
+
currentIndex++;
|
|
123
|
+
// Consume excluded entities (handles "X and Y" in exclusions)
|
|
124
|
+
const excludedResult = this.consumeExcludedEntities(ctx, currentIndex, nextPatternToken, DEBUG);
|
|
125
|
+
if (excludedResult) {
|
|
126
|
+
consumedIndices.push(...excludedResult.tokens);
|
|
127
|
+
excluded.push(...excludedResult.items);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (DEBUG) {
|
|
132
|
+
console.log(`Consumed "all" slot with ${excluded.length} exclusions`);
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
tokens: consumedIndices,
|
|
136
|
+
text: 'all',
|
|
137
|
+
confidence: 1.0,
|
|
138
|
+
slotType,
|
|
139
|
+
isAll: true,
|
|
140
|
+
excluded: excluded.length > 0 ? excluded : undefined
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Consume entities after "but/except" with "and" support
|
|
145
|
+
*/
|
|
146
|
+
consumeExcludedEntities(ctx, startIndex, nextPatternToken, DEBUG) {
|
|
147
|
+
const { tokens } = ctx;
|
|
148
|
+
const items = [];
|
|
149
|
+
const allTokens = [];
|
|
150
|
+
let currentIndex = startIndex;
|
|
151
|
+
while (currentIndex < tokens.length) {
|
|
152
|
+
// Check for pattern delimiter
|
|
153
|
+
if (nextPatternToken) {
|
|
154
|
+
const currentWord = tokens[currentIndex].normalized;
|
|
155
|
+
if (nextPatternToken.type === 'literal' && currentWord === nextPatternToken.value) {
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
if (nextPatternToken.type === 'alternates' &&
|
|
159
|
+
nextPatternToken.alternates.includes(currentWord)) {
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Skip "and" conjunctions
|
|
164
|
+
if (tokens[currentIndex].normalized === 'and') {
|
|
165
|
+
allTokens.push(currentIndex);
|
|
166
|
+
currentIndex++;
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
// Consume entity tokens (noun phrase)
|
|
170
|
+
const entityTokens = [];
|
|
171
|
+
const entityWords = [];
|
|
172
|
+
while (currentIndex < tokens.length) {
|
|
173
|
+
const word = tokens[currentIndex].normalized;
|
|
174
|
+
// Stop at "and", pattern delimiter, or other keywords
|
|
175
|
+
if (word === 'and')
|
|
176
|
+
break;
|
|
177
|
+
if (nextPatternToken?.type === 'literal' && word === nextPatternToken.value)
|
|
178
|
+
break;
|
|
179
|
+
if (nextPatternToken?.type === 'alternates' &&
|
|
180
|
+
nextPatternToken.alternates.includes(word))
|
|
181
|
+
break;
|
|
182
|
+
entityTokens.push(currentIndex);
|
|
183
|
+
entityWords.push(tokens[currentIndex].word);
|
|
184
|
+
currentIndex++;
|
|
185
|
+
}
|
|
186
|
+
if (entityTokens.length > 0) {
|
|
187
|
+
items.push({
|
|
188
|
+
tokens: entityTokens,
|
|
189
|
+
text: entityWords.join(' ')
|
|
190
|
+
});
|
|
191
|
+
allTokens.push(...entityTokens);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (items.length === 0) {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
return { tokens: allTokens, items };
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Consume entity slot with "and" list detection
|
|
201
|
+
*/
|
|
202
|
+
consumeEntityWithListDetection(ctx, DEBUG) {
|
|
203
|
+
const { slotName, tokens, startIndex, pattern, slotTokenIndex, rule, context, slotType } = ctx;
|
|
204
|
+
const nextPatternToken = pattern.tokens[slotTokenIndex + 1];
|
|
205
|
+
const items = [];
|
|
206
|
+
const allTokens = [];
|
|
207
|
+
const allWords = [];
|
|
208
|
+
let currentIndex = startIndex;
|
|
209
|
+
// When next pattern token is a slot (consecutive slots like "give :recipient :item"),
|
|
210
|
+
// we need to be conservative and find entity boundaries via constraint matching
|
|
211
|
+
const nextIsSlot = nextPatternToken?.type === 'slot';
|
|
212
|
+
// Main loop: consume entity, check for "and", repeat
|
|
213
|
+
while (currentIndex < tokens.length) {
|
|
214
|
+
// Check for pattern delimiter first
|
|
215
|
+
if (nextPatternToken) {
|
|
216
|
+
const currentWord = tokens[currentIndex].normalized;
|
|
217
|
+
if (nextPatternToken.type === 'literal' && currentWord === nextPatternToken.value) {
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
if (nextPatternToken.type === 'alternates' &&
|
|
221
|
+
nextPatternToken.alternates.includes(currentWord)) {
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// Consume entity tokens (single noun phrase until "and" or delimiter)
|
|
226
|
+
const entityTokens = [];
|
|
227
|
+
const entityWords = [];
|
|
228
|
+
// For consecutive slots, use constraint-aware consumption
|
|
229
|
+
if (nextIsSlot && items.length === 0) {
|
|
230
|
+
// Try to find the shortest match that satisfies constraints
|
|
231
|
+
const slotConstraints = rule.slots.get(slotName);
|
|
232
|
+
let bestMatch = null;
|
|
233
|
+
// Try progressively longer phrases until we find a match or run out
|
|
234
|
+
for (let tryLength = 1; tryLength <= tokens.length - currentIndex; tryLength++) {
|
|
235
|
+
const tryTokens = [];
|
|
236
|
+
const tryWords = [];
|
|
237
|
+
for (let i = 0; i < tryLength && currentIndex + i < tokens.length; i++) {
|
|
238
|
+
const word = tokens[currentIndex + i].normalized;
|
|
239
|
+
// Stop at "and" - that would indicate a list
|
|
240
|
+
if (word === 'and')
|
|
241
|
+
break;
|
|
242
|
+
tryTokens.push(currentIndex + i);
|
|
243
|
+
tryWords.push(tokens[currentIndex + i].word);
|
|
244
|
+
}
|
|
245
|
+
if (tryTokens.length === 0)
|
|
246
|
+
break;
|
|
247
|
+
const tryText = tryWords.join(' ');
|
|
248
|
+
// Check if this matches constraints
|
|
249
|
+
if (slotConstraints && slotConstraints.constraints.length > 0 && context.world) {
|
|
250
|
+
const confidence = this.evaluateSlotConstraints(tryText, slotConstraints, context);
|
|
251
|
+
if (confidence > 0) {
|
|
252
|
+
bestMatch = { tokens: tryTokens, words: tryWords, confidence };
|
|
253
|
+
// Found a match - use it (greedy: first match wins)
|
|
254
|
+
break;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
// No constraints - take first word only for consecutive slots
|
|
259
|
+
bestMatch = { tokens: tryTokens, words: tryWords, confidence: 1.0 };
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
if (bestMatch) {
|
|
264
|
+
entityTokens.push(...bestMatch.tokens);
|
|
265
|
+
entityWords.push(...bestMatch.words);
|
|
266
|
+
allTokens.push(...bestMatch.tokens);
|
|
267
|
+
allWords.push(...bestMatch.words);
|
|
268
|
+
currentIndex += bestMatch.tokens.length;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
// Standard consumption with delimiter detection
|
|
273
|
+
while (currentIndex < tokens.length) {
|
|
274
|
+
const word = tokens[currentIndex].normalized;
|
|
275
|
+
// Stop at "and" or pattern delimiter
|
|
276
|
+
if (word === 'and')
|
|
277
|
+
break;
|
|
278
|
+
if (nextPatternToken?.type === 'literal' && word === nextPatternToken.value)
|
|
279
|
+
break;
|
|
280
|
+
if (nextPatternToken?.type === 'alternates' &&
|
|
281
|
+
nextPatternToken.alternates.includes(word))
|
|
282
|
+
break;
|
|
283
|
+
entityTokens.push(currentIndex);
|
|
284
|
+
entityWords.push(tokens[currentIndex].word);
|
|
285
|
+
allTokens.push(currentIndex);
|
|
286
|
+
allWords.push(tokens[currentIndex].word);
|
|
287
|
+
currentIndex++;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
if (entityTokens.length > 0) {
|
|
291
|
+
items.push({
|
|
292
|
+
tokens: entityTokens,
|
|
293
|
+
text: entityWords.join(' ')
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
// Check if next token is "and" - if so, consume it and continue
|
|
297
|
+
if (currentIndex < tokens.length && tokens[currentIndex].normalized === 'and') {
|
|
298
|
+
allTokens.push(currentIndex);
|
|
299
|
+
allWords.push(tokens[currentIndex].word);
|
|
300
|
+
currentIndex++;
|
|
301
|
+
// Continue the outer loop to consume more items
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
// No more "and", we're done
|
|
305
|
+
break;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
// Must consume at least one token
|
|
309
|
+
if (allTokens.length === 0) {
|
|
310
|
+
return null;
|
|
311
|
+
}
|
|
312
|
+
// Check constraints on each item
|
|
313
|
+
const slotConstraints = rule.slots.get(slotName);
|
|
314
|
+
let confidence = 1.0;
|
|
315
|
+
if (DEBUG) {
|
|
316
|
+
console.log(`Checking constraints for slot '${slotName}':`);
|
|
317
|
+
console.log(` slotConstraints exists: ${!!slotConstraints}`);
|
|
318
|
+
console.log(` constraints count: ${slotConstraints?.constraints?.length ?? 0}`);
|
|
319
|
+
console.log(` context.world exists: ${!!context.world}`);
|
|
320
|
+
}
|
|
321
|
+
if (slotConstraints && slotConstraints.constraints.length > 0 && context.world) {
|
|
322
|
+
// For lists, check constraints on each item
|
|
323
|
+
for (const item of items) {
|
|
324
|
+
const itemConfidence = this.evaluateSlotConstraints(item.text, slotConstraints, context);
|
|
325
|
+
confidence = Math.min(confidence, itemConfidence);
|
|
326
|
+
}
|
|
327
|
+
if (confidence === 0) {
|
|
328
|
+
if (DEBUG) {
|
|
329
|
+
console.log(`Failed to consume slot '${slotName}'`);
|
|
330
|
+
}
|
|
331
|
+
return null;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
const result = {
|
|
335
|
+
tokens: allTokens,
|
|
336
|
+
text: allWords.join(' '),
|
|
337
|
+
confidence,
|
|
338
|
+
slotType
|
|
339
|
+
};
|
|
340
|
+
// If we have multiple items, mark as list
|
|
341
|
+
if (items.length > 1) {
|
|
342
|
+
result.isList = true;
|
|
343
|
+
result.items = items;
|
|
344
|
+
if (DEBUG) {
|
|
345
|
+
console.log(`Consumed list slot with ${items.length} items: ${items.map(i => i.text).join(', ')}`);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
return result;
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Evaluate slot constraints and return confidence
|
|
352
|
+
*/
|
|
353
|
+
evaluateSlotConstraints(slotText, slotConstraints, context // GrammarContext
|
|
354
|
+
) {
|
|
355
|
+
// For each constraint, check if any entities match
|
|
356
|
+
let hasMatchingEntity = false;
|
|
357
|
+
if (process.env.PARSER_DEBUG === 'true') {
|
|
358
|
+
console.log(`Evaluating constraints for slot text: "${slotText}"`);
|
|
359
|
+
}
|
|
360
|
+
for (const constraint of slotConstraints.constraints) {
|
|
361
|
+
if (typeof constraint === 'function') {
|
|
362
|
+
// Check if it's a ScopeConstraintBuilder (1 arg) vs FunctionConstraint (2 args)
|
|
363
|
+
if (constraint.length === 1) {
|
|
364
|
+
// ScopeConstraintBuilder
|
|
365
|
+
const scopeBuilder = new if_domain_1.ScopeBuilderImpl();
|
|
366
|
+
const scope = constraint(scopeBuilder);
|
|
367
|
+
const scopeConstraint = scope.build();
|
|
368
|
+
// Find entities matching the text within the scope
|
|
369
|
+
const matchingEntities = scope_evaluator_1.ScopeEvaluator.findEntitiesByName(slotText, scopeConstraint, context);
|
|
370
|
+
if (process.env.PARSER_DEBUG === 'true') {
|
|
371
|
+
console.log(`Found ${matchingEntities.length} matching entities for "${slotText}"`);
|
|
372
|
+
// Show scope details
|
|
373
|
+
console.log(` Scope base: ${scopeConstraint.base}, filters: ${scopeConstraint.filters.length}`);
|
|
374
|
+
// Show what entities are in scope before filtering
|
|
375
|
+
const allInScope = scope_evaluator_1.ScopeEvaluator.getEntitiesInScope({ ...scopeConstraint, filters: [] }, // Without filters
|
|
376
|
+
context);
|
|
377
|
+
console.log(` Entities in ${scopeConstraint.base} scope: ${allInScope.length}`);
|
|
378
|
+
for (const e of allInScope.slice(0, 5)) {
|
|
379
|
+
const identity = e.get?.('identity');
|
|
380
|
+
const name = identity?.name || e.id;
|
|
381
|
+
const enterable = e.enterable;
|
|
382
|
+
console.log(` - ${name} (enterable=${enterable})`);
|
|
383
|
+
}
|
|
384
|
+
if (allInScope.length > 5) {
|
|
385
|
+
console.log(` ... and ${allInScope.length - 5} more`);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
if (matchingEntities.length > 0) {
|
|
389
|
+
hasMatchingEntity = true;
|
|
390
|
+
// Store matched entities in context for later resolution
|
|
391
|
+
const existingEntities = context.slots.get(slotText) || [];
|
|
392
|
+
context.slots.set(slotText, [...existingEntities, ...matchingEntities]);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
// FunctionConstraint - needs entity and context
|
|
397
|
+
// For now, we'll need to get candidate entities first
|
|
398
|
+
// This is a limitation - we'd need to refactor to support this properly
|
|
399
|
+
console.warn('FunctionConstraint in slot constraints not yet supported');
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
else {
|
|
403
|
+
// PropertyConstraint
|
|
404
|
+
// TODO: Handle property constraints
|
|
405
|
+
console.warn('PropertyConstraint in slot constraints not yet supported');
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
// Return confidence based on whether we found matching entities
|
|
409
|
+
return hasMatchingEntity ? 1.0 : 0.0;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
exports.EntitySlotConsumer = EntitySlotConsumer;
|
|
413
|
+
//# sourceMappingURL=entity-slot-consumer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-slot-consumer.js","sourceRoot":"","sources":["../../src/slot-consumers/entity-slot-consumer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Slot Consumer Registry
|
|
3
|
+
* @description Registry for slot consumption strategies (ADR-088)
|
|
4
|
+
*/
|
|
5
|
+
import { SlotType, SlotMatch } from '@sharpee/if-domain';
|
|
6
|
+
import { SlotConsumer, SlotConsumerContext } from './slot-consumer';
|
|
7
|
+
export { SlotConsumer, SlotConsumerContext, getNextPatternToken, isPatternDelimiter } from './slot-consumer';
|
|
8
|
+
export { EntitySlotConsumer } from './entity-slot-consumer';
|
|
9
|
+
export { TextSlotConsumer } from './text-slot-consumer';
|
|
10
|
+
export { TypedSlotConsumer } from './typed-slot-consumer';
|
|
11
|
+
export { VocabularySlotConsumer } from './vocabulary-slot-consumer';
|
|
12
|
+
/**
|
|
13
|
+
* Registry for slot consumers
|
|
14
|
+
* Maps slot types to their consumer implementations
|
|
15
|
+
*/
|
|
16
|
+
export declare class SlotConsumerRegistry {
|
|
17
|
+
private consumers;
|
|
18
|
+
/**
|
|
19
|
+
* Register a consumer for its declared slot types
|
|
20
|
+
*/
|
|
21
|
+
register(consumer: SlotConsumer): void;
|
|
22
|
+
/**
|
|
23
|
+
* Check if a consumer is registered for a slot type
|
|
24
|
+
*/
|
|
25
|
+
hasConsumer(slotType: SlotType): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Consume tokens for a slot type
|
|
28
|
+
* @param ctx The consumption context
|
|
29
|
+
* @returns SlotMatch if successful, null if no match
|
|
30
|
+
* @throws Error if no consumer registered for the slot type
|
|
31
|
+
*/
|
|
32
|
+
consume(ctx: SlotConsumerContext): SlotMatch | null;
|
|
33
|
+
/**
|
|
34
|
+
* Get all registered slot types
|
|
35
|
+
*/
|
|
36
|
+
getRegisteredTypes(): SlotType[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Create a default registry with all standard consumers
|
|
40
|
+
* This will be populated as consumers are extracted
|
|
41
|
+
*/
|
|
42
|
+
export declare function createDefaultRegistry(): SlotConsumerRegistry;
|
|
43
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/slot-consumers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAMpE,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC7G,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEpE;;;GAGG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,SAAS,CAA0C;IAE3D;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAMtC;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO;IAIxC;;;;;OAKG;IACH,OAAO,CAAC,GAAG,EAAE,mBAAmB,GAAG,SAAS,GAAG,IAAI;IAQnD;;OAEG;IACH,kBAAkB,IAAI,QAAQ,EAAE;CAGjC;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,oBAAoB,CAQ5D"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file Slot Consumer Registry
|
|
4
|
+
* @description Registry for slot consumption strategies (ADR-088)
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.SlotConsumerRegistry = exports.VocabularySlotConsumer = exports.TypedSlotConsumer = exports.TextSlotConsumer = exports.EntitySlotConsumer = exports.isPatternDelimiter = exports.getNextPatternToken = void 0;
|
|
8
|
+
exports.createDefaultRegistry = createDefaultRegistry;
|
|
9
|
+
const entity_slot_consumer_1 = require("./entity-slot-consumer");
|
|
10
|
+
const text_slot_consumer_1 = require("./text-slot-consumer");
|
|
11
|
+
const typed_slot_consumer_1 = require("./typed-slot-consumer");
|
|
12
|
+
const vocabulary_slot_consumer_1 = require("./vocabulary-slot-consumer");
|
|
13
|
+
var slot_consumer_1 = require("./slot-consumer");
|
|
14
|
+
Object.defineProperty(exports, "getNextPatternToken", { enumerable: true, get: function () { return slot_consumer_1.getNextPatternToken; } });
|
|
15
|
+
Object.defineProperty(exports, "isPatternDelimiter", { enumerable: true, get: function () { return slot_consumer_1.isPatternDelimiter; } });
|
|
16
|
+
var entity_slot_consumer_2 = require("./entity-slot-consumer");
|
|
17
|
+
Object.defineProperty(exports, "EntitySlotConsumer", { enumerable: true, get: function () { return entity_slot_consumer_2.EntitySlotConsumer; } });
|
|
18
|
+
var text_slot_consumer_2 = require("./text-slot-consumer");
|
|
19
|
+
Object.defineProperty(exports, "TextSlotConsumer", { enumerable: true, get: function () { return text_slot_consumer_2.TextSlotConsumer; } });
|
|
20
|
+
var typed_slot_consumer_2 = require("./typed-slot-consumer");
|
|
21
|
+
Object.defineProperty(exports, "TypedSlotConsumer", { enumerable: true, get: function () { return typed_slot_consumer_2.TypedSlotConsumer; } });
|
|
22
|
+
var vocabulary_slot_consumer_2 = require("./vocabulary-slot-consumer");
|
|
23
|
+
Object.defineProperty(exports, "VocabularySlotConsumer", { enumerable: true, get: function () { return vocabulary_slot_consumer_2.VocabularySlotConsumer; } });
|
|
24
|
+
/**
|
|
25
|
+
* Registry for slot consumers
|
|
26
|
+
* Maps slot types to their consumer implementations
|
|
27
|
+
*/
|
|
28
|
+
class SlotConsumerRegistry {
|
|
29
|
+
consumers = new Map();
|
|
30
|
+
/**
|
|
31
|
+
* Register a consumer for its declared slot types
|
|
32
|
+
*/
|
|
33
|
+
register(consumer) {
|
|
34
|
+
for (const type of consumer.slotTypes) {
|
|
35
|
+
this.consumers.set(type, consumer);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Check if a consumer is registered for a slot type
|
|
40
|
+
*/
|
|
41
|
+
hasConsumer(slotType) {
|
|
42
|
+
return this.consumers.has(slotType);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Consume tokens for a slot type
|
|
46
|
+
* @param ctx The consumption context
|
|
47
|
+
* @returns SlotMatch if successful, null if no match
|
|
48
|
+
* @throws Error if no consumer registered for the slot type
|
|
49
|
+
*/
|
|
50
|
+
consume(ctx) {
|
|
51
|
+
const consumer = this.consumers.get(ctx.slotType);
|
|
52
|
+
if (!consumer) {
|
|
53
|
+
throw new Error(`No consumer registered for slot type: ${ctx.slotType}`);
|
|
54
|
+
}
|
|
55
|
+
return consumer.consume(ctx);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get all registered slot types
|
|
59
|
+
*/
|
|
60
|
+
getRegisteredTypes() {
|
|
61
|
+
return Array.from(this.consumers.keys());
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.SlotConsumerRegistry = SlotConsumerRegistry;
|
|
65
|
+
/**
|
|
66
|
+
* Create a default registry with all standard consumers
|
|
67
|
+
* This will be populated as consumers are extracted
|
|
68
|
+
*/
|
|
69
|
+
function createDefaultRegistry() {
|
|
70
|
+
const registry = new SlotConsumerRegistry();
|
|
71
|
+
// ADR-088: All slot consumers extracted
|
|
72
|
+
registry.register(new entity_slot_consumer_1.EntitySlotConsumer());
|
|
73
|
+
registry.register(new text_slot_consumer_1.TextSlotConsumer());
|
|
74
|
+
registry.register(new typed_slot_consumer_1.TypedSlotConsumer());
|
|
75
|
+
registry.register(new vocabulary_slot_consumer_1.VocabularySlotConsumer());
|
|
76
|
+
return registry;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/slot-consumers/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAgEH,sDAQC;AApED,iEAA4D;AAC5D,6DAAwD;AACxD,+DAA0D;AAC1D,yEAAoE;AAEpE,iDAA6G;AAAjE,oHAAA,mBAAmB,OAAA;AAAE,mHAAA,kBAAkB,OAAA;AACnF,+DAA4D;AAAnD,0HAAA,kBAAkB,OAAA;AAC3B,2DAAwD;AAA/C,sHAAA,gBAAgB,OAAA;AACzB,6DAA0D;AAAjD,wHAAA,iBAAiB,OAAA;AAC1B,uEAAoE;AAA3D,kIAAA,sBAAsB,OAAA;AAE/B;;;GAGG;AACH,MAAa,oBAAoB;IACvB,SAAS,GAAgC,IAAI,GAAG,EAAE,CAAC;IAE3D;;OAEG;IACH,QAAQ,CAAC,QAAsB;QAC7B,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,QAAkB;QAC5B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,GAAwB;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,yCAAyC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;CACF;AAvCD,oDAuCC;AAED;;;GAGG;AACH,SAAgB,qBAAqB;IACnC,MAAM,QAAQ,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC5C,wCAAwC;IACxC,QAAQ,CAAC,QAAQ,CAAC,IAAI,yCAAkB,EAAE,CAAC,CAAC;IAC5C,QAAQ,CAAC,QAAQ,CAAC,IAAI,qCAAgB,EAAE,CAAC,CAAC;IAC1C,QAAQ,CAAC,QAAQ,CAAC,IAAI,uCAAiB,EAAE,CAAC,CAAC;IAC3C,QAAQ,CAAC,QAAQ,CAAC,IAAI,iDAAsB,EAAE,CAAC,CAAC;IAChD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|