agentfootprint 9.112.0 → 9.112.1
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/CHANGELOG.md +19 -0
- package/dist/esm/lib/injection-engine/intentScorer.js +15 -4
- package/dist/esm/lib/injection-engine/intentScorer.js.map +1 -1
- package/dist/esm/lib/injection-engine/routingPolicy.d.ts +3 -1
- package/dist/esm/lib/injection-engine/routingPolicy.js +15 -3
- package/dist/esm/lib/injection-engine/routingPolicy.js.map +1 -1
- package/dist/lib/injection-engine/intentScorer.js +15 -4
- package/dist/lib/injection-engine/intentScorer.js.map +1 -1
- package/dist/lib/injection-engine/routingPolicy.js +15 -3
- package/dist/lib/injection-engine/routingPolicy.js.map +1 -1
- package/dist/types/lib/injection-engine/intentScorer.d.ts.map +1 -1
- package/dist/types/lib/injection-engine/routingPolicy.d.ts +3 -1
- package/dist/types/lib/injection-engine/routingPolicy.d.ts.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,25 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [9.112.1] - 2026-09-22
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- **A near-tie no longer clings to an incumbent the scorer put out.**
|
|
13
|
+
`decideTier2` kept the incumbent on ANY near-tie, even when the scorer had
|
|
14
|
+
scored that incumbent at or below the declared floor and the tie was between
|
|
15
|
+
two new candidates — so an ambiguous new topic silently stayed on a skill the
|
|
16
|
+
scorer said the message did not match. It now offers the tied cluster as a
|
|
17
|
+
`menu` in exactly that case — the same mid-conversation menu an `unmatched`
|
|
18
|
+
turn already produced, so staying is still offered as an explicit choice; the
|
|
19
|
+
model decides in-band instead of the policy deciding silently. Unchanged: an incumbent the scorer never scored
|
|
20
|
+
(unknown, not out) still stays, and a scorer with no floor (the embedding
|
|
21
|
+
default) still stays on a contentless follow-up.
|
|
22
|
+
- **`validateIntentScores` refuses a candidate scored twice.** It stored rows
|
|
23
|
+
in a map, so a duplicate id silently replaced the earlier score (last row
|
|
24
|
+
wins, in whatever order the scorer iterated). A repeated id is now refused by
|
|
25
|
+
name beside the existing missing / foreign refusals.
|
|
26
|
+
|
|
8
27
|
## [9.112.0] - 2026-09-18
|
|
9
28
|
|
|
10
29
|
### Added — bringing your own taxonomy: SKOS in, our map out
|
|
@@ -32,19 +32,30 @@
|
|
|
32
32
|
export function validateIntentScores(scorerName, candidates, result) {
|
|
33
33
|
const byId = new Map();
|
|
34
34
|
const foreign = [];
|
|
35
|
+
// A candidate scored twice is refused like a missing or foreign one: a Map
|
|
36
|
+
// would otherwise let the LAST row win silently, and which row that is
|
|
37
|
+
// depends on the scorer's iteration order (2026-09-22 review, S8).
|
|
38
|
+
const repeated = [];
|
|
35
39
|
for (const s of result) {
|
|
36
|
-
if (candidates.some((c) => c.id === s.id))
|
|
37
|
-
byId.set(s.id, s);
|
|
38
|
-
else
|
|
40
|
+
if (!candidates.some((c) => c.id === s.id))
|
|
39
41
|
foreign.push(s.id);
|
|
42
|
+
else if (byId.has(s.id)) {
|
|
43
|
+
if (!repeated.includes(s.id))
|
|
44
|
+
repeated.push(s.id);
|
|
45
|
+
}
|
|
46
|
+
else
|
|
47
|
+
byId.set(s.id, s);
|
|
40
48
|
}
|
|
41
49
|
const missing = candidates.filter((c) => !byId.has(c.id)).map((c) => c.id);
|
|
42
|
-
if (foreign.length > 0 || missing.length > 0) {
|
|
50
|
+
if (foreign.length > 0 || missing.length > 0 || repeated.length > 0) {
|
|
43
51
|
const clauses = [
|
|
44
52
|
...(missing.length > 0 ? [`omitted ${missing.map((m) => `"${m}"`).join(', ')}`] : []),
|
|
45
53
|
...(foreign.length > 0
|
|
46
54
|
? [`named ${foreign.map((f) => `"${f}"`).join(', ')} which it was not given`]
|
|
47
55
|
: []),
|
|
56
|
+
...(repeated.length > 0
|
|
57
|
+
? [`scored ${repeated.map((r) => `"${r}"`).join(', ')} more than once`]
|
|
58
|
+
: []),
|
|
48
59
|
];
|
|
49
60
|
throw new Error(`IntentScorer '${scorerName}' returned an unusable result: it ${clauses.join(' and ')}. ` +
|
|
50
61
|
`A scorer must return one score per candidate it was given — every candidate, no ` +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intentScorer.js","sourceRoot":"","sources":["../../../../src/lib/injection-engine/intentScorer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAwDH;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAAkB,EAClB,UAAsC,EACtC,MAA8B;IAE9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC5C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC
|
|
1
|
+
{"version":3,"file":"intentScorer.js","sourceRoot":"","sources":["../../../../src/lib/injection-engine/intentScorer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAwDH;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAAkB,EAClB,UAAsC,EACtC,MAA8B;IAE9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC5C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,2EAA2E;IAC3E,uEAAuE;IACvE,mEAAmE;IACnE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aAC1D,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;;YAAM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC;IACD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpE,MAAM,OAAO,GAAG;YACd,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrF,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;gBACpB,CAAC,CAAC,CAAC,SAAS,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC;gBAC7E,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACrB,CAAC,CAAC,CAAC,UAAU,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;gBACvE,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;QACF,MAAM,IAAI,KAAK,CACb,iBAAiB,UAAU,qCAAqC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI;YACvF,kFAAkF;YAClF,gFAAgF;YAChF,2DAA2D,CAC9D,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -103,7 +103,9 @@ export interface Tier2Numbers {
|
|
|
103
103
|
*
|
|
104
104
|
* • decisive winner ≠ incumbent → `move`;
|
|
105
105
|
* • decisive winner = incumbent, or a near-tie WITH an incumbent → `stay`
|
|
106
|
-
* (ambiguity mid-conversation = stay; the menu is not opened)
|
|
106
|
+
* (ambiguity mid-conversation = stay; the menu is not opened) — unless
|
|
107
|
+
* the scorer scored that incumbent and put it at/below the floor, when
|
|
108
|
+
* the near-tie is between new candidates only → `menu` of the tied cluster;
|
|
107
109
|
* • near-tie with NO incumbent (cold start) → `menu` of the tied cluster
|
|
108
110
|
* (every candidate within the margin of the top, capped at `menuSize`);
|
|
109
111
|
* • every candidate at/below the floor → `unmatched` (the caller offers the
|
|
@@ -65,7 +65,9 @@ function pairwiseGap(a, b) {
|
|
|
65
65
|
*
|
|
66
66
|
* • decisive winner ≠ incumbent → `move`;
|
|
67
67
|
* • decisive winner = incumbent, or a near-tie WITH an incumbent → `stay`
|
|
68
|
-
* (ambiguity mid-conversation = stay; the menu is not opened)
|
|
68
|
+
* (ambiguity mid-conversation = stay; the menu is not opened) — unless
|
|
69
|
+
* the scorer scored that incumbent and put it at/below the floor, when
|
|
70
|
+
* the near-tie is between new candidates only → `menu` of the tied cluster;
|
|
69
71
|
* • near-tie with NO incumbent (cold start) → `menu` of the tied cluster
|
|
70
72
|
* (every candidate within the margin of the top, capped at `menuSize`);
|
|
71
73
|
* • every candidate at/below the floor → `unmatched` (the caller offers the
|
|
@@ -103,8 +105,18 @@ export function decideTier2(scores, incumbentId, policy, scorer = {}) {
|
|
|
103
105
|
return { kind: 'move', to: top.id, ...numbers };
|
|
104
106
|
}
|
|
105
107
|
// Near-tie. Mid-conversation the incumbent holds (ambiguity = stay);
|
|
106
|
-
// cold start opens the menu of the tied cluster.
|
|
107
|
-
|
|
108
|
+
// cold start opens the menu of the tied cluster. ONE exception: the scorer
|
|
109
|
+
// scored the incumbent ITSELF and put it out (at/below the floor, or
|
|
110
|
+
// non-finite) — then the ambiguity is between new candidates only, and
|
|
111
|
+
// staying would cling to a skill the scorer says this message does not
|
|
112
|
+
// match, so the tied cluster is offered instead. An incumbent the scorer
|
|
113
|
+
// never scored is UNKNOWN, not out: it still holds. With no floor declared
|
|
114
|
+
// (the embedding default) every finite score is alive, so a contentless
|
|
115
|
+
// follow-up ("and yesterday?") still stays exactly as before.
|
|
116
|
+
const incumbentScoredOut = incumbentId !== undefined &&
|
|
117
|
+
safeOf.has(incumbentId) &&
|
|
118
|
+
!alive.some((r) => r.id === incumbentId);
|
|
119
|
+
if (incumbentId !== undefined && !incumbentScoredOut)
|
|
108
120
|
return { kind: 'stay', ...numbers };
|
|
109
121
|
const tied = alive
|
|
110
122
|
.filter((r) => pairwiseGap(safeOf.get(top.id), safeOf.get(r.id)) < policy.nearTieMargin)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routingPolicy.js","sourceRoot":"","sources":["../../../../src/lib/injection-engine/routingPolicy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAIvC,qEAAqE;AACrE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AAEpC,wEAAwE;AACxE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;AAY3B,0EAA0E;AAC1E,MAAM,CAAC,MAAM,sBAAsB,GAAkB;IACnD,aAAa,EAAE,eAAe;IAC9B,QAAQ,EAAE,SAAS;CACpB,CAAC;AAEF,0DAA0D;AAC1D,MAAM,UAAU,oBAAoB,CAAC,MAA+B;IAClE,OAAO;QACL,aAAa,EAAE,MAAM,EAAE,aAAa,IAAI,eAAe;QACvD,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,SAAS;QACvC,GAAG,CAAC,MAAM,EAAE,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;KAC5D,CAAC;AACJ,CAAC;AAsCD,wFAAwF;AACxF,SAAS,WAAW,CAAC,CAAS,EAAE,CAAS;IACvC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAChC,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"routingPolicy.js","sourceRoot":"","sources":["../../../../src/lib/injection-engine/routingPolicy.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,19 +35,30 @@ exports.validateIntentScores = void 0;
|
|
|
35
35
|
function validateIntentScores(scorerName, candidates, result) {
|
|
36
36
|
const byId = new Map();
|
|
37
37
|
const foreign = [];
|
|
38
|
+
// A candidate scored twice is refused like a missing or foreign one: a Map
|
|
39
|
+
// would otherwise let the LAST row win silently, and which row that is
|
|
40
|
+
// depends on the scorer's iteration order (2026-09-22 review, S8).
|
|
41
|
+
const repeated = [];
|
|
38
42
|
for (const s of result) {
|
|
39
|
-
if (candidates.some((c) => c.id === s.id))
|
|
40
|
-
byId.set(s.id, s);
|
|
41
|
-
else
|
|
43
|
+
if (!candidates.some((c) => c.id === s.id))
|
|
42
44
|
foreign.push(s.id);
|
|
45
|
+
else if (byId.has(s.id)) {
|
|
46
|
+
if (!repeated.includes(s.id))
|
|
47
|
+
repeated.push(s.id);
|
|
48
|
+
}
|
|
49
|
+
else
|
|
50
|
+
byId.set(s.id, s);
|
|
43
51
|
}
|
|
44
52
|
const missing = candidates.filter((c) => !byId.has(c.id)).map((c) => c.id);
|
|
45
|
-
if (foreign.length > 0 || missing.length > 0) {
|
|
53
|
+
if (foreign.length > 0 || missing.length > 0 || repeated.length > 0) {
|
|
46
54
|
const clauses = [
|
|
47
55
|
...(missing.length > 0 ? [`omitted ${missing.map((m) => `"${m}"`).join(', ')}`] : []),
|
|
48
56
|
...(foreign.length > 0
|
|
49
57
|
? [`named ${foreign.map((f) => `"${f}"`).join(', ')} which it was not given`]
|
|
50
58
|
: []),
|
|
59
|
+
...(repeated.length > 0
|
|
60
|
+
? [`scored ${repeated.map((r) => `"${r}"`).join(', ')} more than once`]
|
|
61
|
+
: []),
|
|
51
62
|
];
|
|
52
63
|
throw new Error(`IntentScorer '${scorerName}' returned an unusable result: it ${clauses.join(' and ')}. ` +
|
|
53
64
|
`A scorer must return one score per candidate it was given — every candidate, no ` +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intentScorer.js","sourceRoot":"","sources":["../../../src/lib/injection-engine/intentScorer.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;;;AAwDH;;;;;;;;GAQG;AACH,SAAgB,oBAAoB,CAClC,UAAkB,EAClB,UAAsC,EACtC,MAA8B;IAE9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC5C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC
|
|
1
|
+
{"version":3,"file":"intentScorer.js","sourceRoot":"","sources":["../../../src/lib/injection-engine/intentScorer.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;;;AAwDH;;;;;;;;GAQG;AACH,SAAgB,oBAAoB,CAClC,UAAkB,EAClB,UAAsC,EACtC,MAA8B;IAE9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC5C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,2EAA2E;IAC3E,uEAAuE;IACvE,mEAAmE;IACnE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aAC1D,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;;YAAM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC;IACD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpE,MAAM,OAAO,GAAG;YACd,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrF,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;gBACpB,CAAC,CAAC,CAAC,SAAS,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC;gBAC7E,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACrB,CAAC,CAAC,CAAC,UAAU,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;gBACvE,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;QACF,MAAM,IAAI,KAAK,CACb,iBAAiB,UAAU,qCAAqC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI;YACvF,kFAAkF;YAClF,gFAAgF;YAChF,2DAA2D,CAC9D,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAC,CAAC;AAChD,CAAC;AApCD,oDAoCC"}
|
|
@@ -69,7 +69,9 @@ function pairwiseGap(a, b) {
|
|
|
69
69
|
*
|
|
70
70
|
* • decisive winner ≠ incumbent → `move`;
|
|
71
71
|
* • decisive winner = incumbent, or a near-tie WITH an incumbent → `stay`
|
|
72
|
-
* (ambiguity mid-conversation = stay; the menu is not opened)
|
|
72
|
+
* (ambiguity mid-conversation = stay; the menu is not opened) — unless
|
|
73
|
+
* the scorer scored that incumbent and put it at/below the floor, when
|
|
74
|
+
* the near-tie is between new candidates only → `menu` of the tied cluster;
|
|
73
75
|
* • near-tie with NO incumbent (cold start) → `menu` of the tied cluster
|
|
74
76
|
* (every candidate within the margin of the top, capped at `menuSize`);
|
|
75
77
|
* • every candidate at/below the floor → `unmatched` (the caller offers the
|
|
@@ -107,8 +109,18 @@ function decideTier2(scores, incumbentId, policy, scorer = {}) {
|
|
|
107
109
|
return { kind: 'move', to: top.id, ...numbers };
|
|
108
110
|
}
|
|
109
111
|
// Near-tie. Mid-conversation the incumbent holds (ambiguity = stay);
|
|
110
|
-
// cold start opens the menu of the tied cluster.
|
|
111
|
-
|
|
112
|
+
// cold start opens the menu of the tied cluster. ONE exception: the scorer
|
|
113
|
+
// scored the incumbent ITSELF and put it out (at/below the floor, or
|
|
114
|
+
// non-finite) — then the ambiguity is between new candidates only, and
|
|
115
|
+
// staying would cling to a skill the scorer says this message does not
|
|
116
|
+
// match, so the tied cluster is offered instead. An incumbent the scorer
|
|
117
|
+
// never scored is UNKNOWN, not out: it still holds. With no floor declared
|
|
118
|
+
// (the embedding default) every finite score is alive, so a contentless
|
|
119
|
+
// follow-up ("and yesterday?") still stays exactly as before.
|
|
120
|
+
const incumbentScoredOut = incumbentId !== undefined &&
|
|
121
|
+
safeOf.has(incumbentId) &&
|
|
122
|
+
!alive.some((r) => r.id === incumbentId);
|
|
123
|
+
if (incumbentId !== undefined && !incumbentScoredOut)
|
|
112
124
|
return { kind: 'stay', ...numbers };
|
|
113
125
|
const tied = alive
|
|
114
126
|
.filter((r) => pairwiseGap(safeOf.get(top.id), safeOf.get(r.id)) < policy.nearTieMargin)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routingPolicy.js","sourceRoot":"","sources":["../../../src/lib/injection-engine/routingPolicy.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;;;AAEH,6CAAuC;AAIvC,qEAAqE;AACxD,QAAA,eAAe,GAAG,IAAI,CAAC;AAEpC,wEAAwE;AAC3D,QAAA,SAAS,GAAG,CAAC,CAAC;AAY3B,0EAA0E;AAC7D,QAAA,sBAAsB,GAAkB;IACnD,aAAa,EAAE,uBAAe;IAC9B,QAAQ,EAAE,iBAAS;CACpB,CAAC;AAEF,0DAA0D;AAC1D,SAAgB,oBAAoB,CAAC,MAA+B;IAClE,OAAO;QACL,aAAa,EAAE,MAAM,EAAE,aAAa,IAAI,uBAAe;QACvD,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,iBAAS;QACvC,GAAG,CAAC,MAAM,EAAE,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;KAC5D,CAAC;AACJ,CAAC;AAND,oDAMC;AAsCD,wFAAwF;AACxF,SAAS,WAAW,CAAC,CAAS,EAAE,CAAS;IACvC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAChC,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"routingPolicy.js","sourceRoot":"","sources":["../../../src/lib/injection-engine/routingPolicy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intentScorer.d.ts","sourceRoot":"","sources":["../../../../src/lib/injection-engine/intentScorer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;;+DAE+D;AAC/D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED;uEACuE;AACvE,MAAM,WAAW,iBAAiB;IAChC,mDAAmD;IACnD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC;QACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,CAAC,CAAC;CACJ;AAED;;6EAE6E;AAC7E,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,sEAAsE;IACtE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;6EACyE;IACzE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;+DAC2D;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;uDACmD;IACnD,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,KAAK,CACH,KAAK,EAAE,iBAAiB,EACxB,UAAU,EAAE,SAAS,eAAe,EAAE,EACtC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC,GAAG,SAAS,WAAW,EAAE,CAAC;CAC7D;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,SAAS,eAAe,EAAE,EACtC,MAAM,EAAE,SAAS,WAAW,EAAE,GAC7B,SAAS,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"intentScorer.d.ts","sourceRoot":"","sources":["../../../../src/lib/injection-engine/intentScorer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;;+DAE+D;AAC/D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED;uEACuE;AACvE,MAAM,WAAW,iBAAiB;IAChC,mDAAmD;IACnD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC;QACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,CAAC,CAAC;CACJ;AAED;;6EAE6E;AAC7E,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,sEAAsE;IACtE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;6EACyE;IACzE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;+DAC2D;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;uDACmD;IACnD,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,KAAK,CACH,KAAK,EAAE,iBAAiB,EACxB,UAAU,EAAE,SAAS,eAAe,EAAE,EACtC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC,GAAG,SAAS,WAAW,EAAE,CAAC;CAC7D;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,SAAS,eAAe,EAAE,EACtC,MAAM,EAAE,SAAS,WAAW,EAAE,GAC7B,SAAS,WAAW,EAAE,CAgCxB"}
|
|
@@ -103,7 +103,9 @@ export interface Tier2Numbers {
|
|
|
103
103
|
*
|
|
104
104
|
* • decisive winner ≠ incumbent → `move`;
|
|
105
105
|
* • decisive winner = incumbent, or a near-tie WITH an incumbent → `stay`
|
|
106
|
-
* (ambiguity mid-conversation = stay; the menu is not opened)
|
|
106
|
+
* (ambiguity mid-conversation = stay; the menu is not opened) — unless
|
|
107
|
+
* the scorer scored that incumbent and put it at/below the floor, when
|
|
108
|
+
* the near-tie is between new candidates only → `menu` of the tied cluster;
|
|
107
109
|
* • near-tie with NO incumbent (cold start) → `menu` of the tied cluster
|
|
108
110
|
* (every candidate within the margin of the top, capped at `menuSize`);
|
|
109
111
|
* • every candidate at/below the floor → `unmatched` (the caller offers the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routingPolicy.d.ts","sourceRoot":"","sources":["../../../../src/lib/injection-engine/routingPolicy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,qEAAqE;AACrE,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC,wEAAwE;AACxE,eAAO,MAAM,SAAS,IAAI,CAAC;AAE3B,2EAA2E;AAC3E,MAAM,WAAW,aAAa;IAC5B,8EAA8E;IAC9E,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,iFAAiF;IACjF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,0EAA0E;AAC1E,eAAO,MAAM,sBAAsB,EAAE,aAGpC,CAAC;AAEF,0DAA0D;AAC1D,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAMnF;AAED;;;kDAGkD;AAClD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,0EAA0E;AAC1E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,6DAA6D;AAC7D,MAAM,MAAM,YAAY,GACpB,CAAC,YAAY,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,GAC/D,CAAC,YAAY,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAC1C,CAAC,YAAY,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC,GAC/E,CAAC,YAAY,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,CAAC;AAEpD,mDAAmD;AACnD,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,QAAQ,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC9C;sCACkC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAOD
|
|
1
|
+
{"version":3,"file":"routingPolicy.d.ts","sourceRoot":"","sources":["../../../../src/lib/injection-engine/routingPolicy.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentfootprint",
|
|
3
|
-
"version": "9.112.
|
|
3
|
+
"version": "9.112.1",
|
|
4
4
|
"description": "The explainable agent framework — backtrack a wrong answer to the exact context that caused it (evidence, not guesses). Built on footprintjs.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "commonjs",
|