agentfootprint 9.97.0 → 9.98.0
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 +56 -0
- package/dist/artifacts/datasetResult.js +119 -0
- package/dist/artifacts/datasetResult.js.map +1 -0
- package/dist/artifacts/index.js +4 -1
- package/dist/artifacts/index.js.map +1 -1
- package/dist/esm/artifacts/datasetResult.d.ts +44 -0
- package/dist/esm/artifacts/datasetResult.js +114 -0
- package/dist/esm/artifacts/datasetResult.js.map +1 -0
- package/dist/esm/artifacts/index.d.ts +1 -0
- package/dist/esm/artifacts/index.js +1 -0
- package/dist/esm/artifacts/index.js.map +1 -1
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/integrity/assertion/conflicts.d.ts +5 -32
- package/dist/esm/integrity/assertion/conflicts.js +6 -69
- package/dist/esm/integrity/assertion/conflicts.js.map +1 -1
- package/dist/esm/integrity/assertion/types.d.ts +8 -69
- package/dist/esm/integrity/assertion/types.js +0 -0
- package/dist/esm/integrity/assertion/types.js.map +1 -1
- package/dist/esm/lib/injection-engine/factories/defineMenuHint.js +3 -5
- package/dist/esm/lib/injection-engine/factories/defineMenuHint.js.map +1 -1
- package/dist/esm/lib/injection-engine/skillToolDescriptors.d.ts +4 -2
- package/dist/esm/lib/injection-engine/skillToolDescriptors.js +17 -8
- package/dist/esm/lib/injection-engine/skillToolDescriptors.js.map +1 -1
- package/dist/esm/lib/mcp/mcpClient.js +5 -97
- package/dist/esm/lib/mcp/mcpClient.js.map +1 -1
- package/dist/esm/lib/mcp/mockMcpClient.d.ts +8 -4
- package/dist/esm/lib/mcp/mockMcpClient.js +6 -5
- package/dist/esm/lib/mcp/mockMcpClient.js.map +1 -1
- package/dist/esm/lib/mcp/toolResult.d.ts +8 -0
- package/dist/esm/lib/mcp/toolResult.js +244 -0
- package/dist/esm/lib/mcp/toolResult.js.map +1 -0
- package/dist/esm/lib/mcp/types.d.ts +15 -0
- package/dist/esm/lib/semantics/check.d.ts +7 -1
- package/dist/esm/lib/semantics/check.js +16 -0
- package/dist/esm/lib/semantics/check.js.map +1 -1
- package/dist/esm/lib/semantics/cli.js +3 -0
- package/dist/esm/lib/semantics/cli.js.map +1 -1
- package/dist/esm/lib/semantics/projection.d.ts +15 -0
- package/dist/esm/lib/semantics/projection.js +186 -0
- package/dist/esm/lib/semantics/projection.js.map +1 -0
- package/dist/esm/lib/time-travel/index.d.ts +1 -1
- package/dist/esm/lib/time-travel/index.js.map +1 -1
- package/dist/esm/lib/time-travel/receipt.d.ts +5 -0
- package/dist/esm/lib/time-travel/receipt.js +2 -0
- package/dist/esm/lib/time-travel/receipt.js.map +1 -1
- package/dist/esm/lib/time-travel/requestMeasurement.d.ts +33 -0
- package/dist/esm/lib/time-travel/requestMeasurement.js +120 -0
- package/dist/esm/lib/time-travel/requestMeasurement.js.map +1 -0
- package/dist/esm/lib/time-travel/servedView.js +8 -1
- package/dist/esm/lib/time-travel/servedView.js.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/integrity/assertion/conflicts.js +6 -69
- package/dist/integrity/assertion/conflicts.js.map +1 -1
- package/dist/integrity/assertion/types.js +0 -0
- package/dist/integrity/assertion/types.js.map +1 -1
- package/dist/lib/injection-engine/factories/defineMenuHint.js +3 -5
- package/dist/lib/injection-engine/factories/defineMenuHint.js.map +1 -1
- package/dist/lib/injection-engine/skillToolDescriptors.js +17 -8
- package/dist/lib/injection-engine/skillToolDescriptors.js.map +1 -1
- package/dist/lib/mcp/mcpClient.js +5 -97
- package/dist/lib/mcp/mcpClient.js.map +1 -1
- package/dist/lib/mcp/mockMcpClient.js +6 -5
- package/dist/lib/mcp/mockMcpClient.js.map +1 -1
- package/dist/lib/mcp/toolResult.js +249 -0
- package/dist/lib/mcp/toolResult.js.map +1 -0
- package/dist/lib/semantics/check.js +16 -0
- package/dist/lib/semantics/check.js.map +1 -1
- package/dist/lib/semantics/cli.js +3 -0
- package/dist/lib/semantics/cli.js.map +1 -1
- package/dist/lib/semantics/projection.js +191 -0
- package/dist/lib/semantics/projection.js.map +1 -0
- package/dist/lib/time-travel/index.js.map +1 -1
- package/dist/lib/time-travel/receipt.js +2 -0
- package/dist/lib/time-travel/receipt.js.map +1 -1
- package/dist/lib/time-travel/requestMeasurement.js +124 -0
- package/dist/lib/time-travel/requestMeasurement.js.map +1 -0
- package/dist/lib/time-travel/servedView.js +8 -1
- package/dist/lib/time-travel/servedView.js.map +1 -1
- package/dist/types/artifacts/datasetResult.d.ts +45 -0
- package/dist/types/artifacts/datasetResult.d.ts.map +1 -0
- package/dist/types/artifacts/index.d.ts +1 -0
- package/dist/types/artifacts/index.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/integrity/assertion/conflicts.d.ts +5 -32
- package/dist/types/integrity/assertion/conflicts.d.ts.map +1 -1
- package/dist/types/integrity/assertion/types.d.ts +8 -69
- package/dist/types/integrity/assertion/types.d.ts.map +1 -1
- package/dist/types/lib/injection-engine/factories/defineMenuHint.d.ts.map +1 -1
- package/dist/types/lib/injection-engine/skillToolDescriptors.d.ts +4 -2
- package/dist/types/lib/injection-engine/skillToolDescriptors.d.ts.map +1 -1
- package/dist/types/lib/mcp/mcpClient.d.ts.map +1 -1
- package/dist/types/lib/mcp/mockMcpClient.d.ts +8 -4
- package/dist/types/lib/mcp/mockMcpClient.d.ts.map +1 -1
- package/dist/types/lib/mcp/toolResult.d.ts +9 -0
- package/dist/types/lib/mcp/toolResult.d.ts.map +1 -0
- package/dist/types/lib/mcp/types.d.ts +15 -0
- package/dist/types/lib/mcp/types.d.ts.map +1 -1
- package/dist/types/lib/semantics/check.d.ts +7 -1
- package/dist/types/lib/semantics/check.d.ts.map +1 -1
- package/dist/types/lib/semantics/cli.d.ts.map +1 -1
- package/dist/types/lib/semantics/projection.d.ts +16 -0
- package/dist/types/lib/semantics/projection.d.ts.map +1 -0
- package/dist/types/lib/time-travel/index.d.ts +1 -1
- package/dist/types/lib/time-travel/index.d.ts.map +1 -1
- package/dist/types/lib/time-travel/receipt.d.ts +5 -0
- package/dist/types/lib/time-travel/receipt.d.ts.map +1 -1
- package/dist/types/lib/time-travel/requestMeasurement.d.ts +34 -0
- package/dist/types/lib/time-travel/requestMeasurement.d.ts.map +1 -0
- package/dist/types/lib/time-travel/servedView.d.ts.map +1 -1
- package/package.json +6 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conflicts.js","sourceRoot":"","sources":["../../../../src/integrity/assertion/conflicts.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"conflicts.js","sourceRoot":"","sources":["../../../../src/integrity/assertion/conflicts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,WAAW,IAAI,iBAAiB,EAAiC,MAAM,kBAAkB,CAAC;AACnG,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI1C,iFAAiF;AACjF,MAAM,UAAU,WAAW,CACzB,UAAgC,EAChC,cAAmC,IAAI,GAAG,EAAE;IAE5C,OAAO,iBAAiB,CAAC,UAAU,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -1,74 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* Pattern: plain data + a keyed identity. Pure, structuredClone-safe.
|
|
6
|
-
* Role: the Context Integrity substrate. Everything a seam adapter
|
|
7
|
-
* hands a check is first normalised into assertions keyed by
|
|
8
|
-
* `(subject, predicate, epoch)`, so every check compares one
|
|
9
|
-
* shape and subject identity is READ off stamps, never inferred.
|
|
10
|
-
*
|
|
11
|
-
* THE TWO RULES:
|
|
12
|
-
*
|
|
13
|
-
* **Serving is asserting; history is quotation.** A tool schema on the
|
|
14
|
-
* wire asserts "available now"; a block labelled current-state asserts its
|
|
15
|
-
* contents as current. Transcript history is `quoted` — it legitimately
|
|
16
|
-
* holds superseded values, and checks never fire across the quoted
|
|
17
|
-
* stratum. This one distinction eliminates the false-positive class of
|
|
18
|
-
* stale-but-honest history with no judgment call.
|
|
19
|
-
*
|
|
20
|
-
* **Single-valued by default.** Two `asserted` assertions on one key with
|
|
21
|
-
* different values contradict; multi-valued predicates are the declared
|
|
22
|
-
* exception. Exemptions are declared, rules are never authored.
|
|
23
|
-
*
|
|
24
|
-
* Honest absence: a value that IS an unknown (a `Claim` whose kind is not
|
|
25
|
-
* `'known'`) never participates in a comparison — an unknown can neither
|
|
26
|
-
* corroborate nor contradict, and anything derived from it is unknown.
|
|
2
|
+
* Agent's assertion types and value conventions are shared with ContextFootprint.
|
|
3
|
+
* Collection, current/quoted stamping and diagnostic disposition remain here.
|
|
27
4
|
*/
|
|
5
|
+
import type { Assertion } from 'contextfootprint';
|
|
6
|
+
export type { Assertion, AssertionStratum, SubjectRef } from 'contextfootprint';
|
|
7
|
+
export { sameSubject, participates, comparableValueOf } from 'contextfootprint';
|
|
28
8
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* shared stamped subject are incomparable, and incomparable means silent —
|
|
33
|
-
* which is why the disposition ledger counts `unreachable`.
|
|
9
|
+
* Preserve Agent's recorded identity encoding across the extraction.
|
|
10
|
+
* This legacy delimiter format retains its existing collision behavior; new
|
|
11
|
+
* consumers use ContextFootprint's tuple key. Recording migration is separate.
|
|
34
12
|
*/
|
|
35
|
-
export interface SubjectRef {
|
|
36
|
-
/** What kind of thing — 'map' | 'skill' | 'tool' | 'action' | app kinds. Open by design. */
|
|
37
|
-
readonly kind: string;
|
|
38
|
-
readonly id: string;
|
|
39
|
-
}
|
|
40
|
-
/** The strata rule, as a type: only `asserted` facts can contradict. */
|
|
41
|
-
export type AssertionStratum = 'asserted' | 'quoted';
|
|
42
|
-
/** One typed claim about one subject. */
|
|
43
|
-
export interface Assertion {
|
|
44
|
-
readonly subject: SubjectRef;
|
|
45
|
-
/** The relation this asserts — 'status', 'offered', 'position', … */
|
|
46
|
-
readonly predicate: string;
|
|
47
|
-
/**
|
|
48
|
-
* The claimed value. May be a plain value or a `Claim<T>`; a non-`known`
|
|
49
|
-
* Claim never participates in any comparison (honest absence).
|
|
50
|
-
*/
|
|
51
|
-
readonly value: unknown;
|
|
52
|
-
/**
|
|
53
|
-
* The epoch this was asserted UNDER — a monotonic version from the
|
|
54
|
-
* subject's own counter (a session version, a cursor version). Two
|
|
55
|
-
* assertions at DIFFERENT epochs are history, not contradiction; absent
|
|
56
|
-
* means "the current, unversioned world", and only matches absent.
|
|
57
|
-
*/
|
|
58
|
-
readonly epoch?: number;
|
|
59
|
-
readonly stratum: AssertionStratum;
|
|
60
|
-
/** Where this came from — one plain sentence or a source ref. */
|
|
61
|
-
readonly provenance: string;
|
|
62
|
-
/** The universal join key into commit logs and recordings, when known. */
|
|
63
|
-
readonly runtimeStageId?: string;
|
|
64
|
-
/** Dev-posture canary material — quarantined from every real count. */
|
|
65
|
-
readonly synthetic?: true;
|
|
66
|
-
}
|
|
67
|
-
/** The identity a single-valued comparison runs over. */
|
|
68
13
|
export declare function assertionKey(a: Assertion): string;
|
|
69
|
-
/** Same stamped subject — the only identity the algebra ever claims. */
|
|
70
|
-
export declare function sameSubject(a: SubjectRef, b: SubjectRef): boolean;
|
|
71
|
-
/** Does this value participate in comparisons? Unknowns never do. */
|
|
72
|
-
export declare function participates(value: unknown): boolean;
|
|
73
|
-
/** The comparable face of a value: a known Claim compares by its value. */
|
|
74
|
-
export declare function comparableValueOf(value: unknown): unknown;
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/integrity/assertion/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/integrity/assertion/types.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEhF;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,CAAY;IACvC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC3D,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC,SAAS,SAAS,KAAK,EAAE,CAAC;AACpF,CAAC"}
|
|
@@ -28,12 +28,10 @@
|
|
|
28
28
|
* false-positive on somebody else's injection of that name.
|
|
29
29
|
*/
|
|
30
30
|
export const MENU_HINT_METADATA_KEY = 'skillMenuHint';
|
|
31
|
-
const DEFAULT_BODY =
|
|
32
|
-
|
|
33
|
-
'candidate skills (with advisory relevance where a scorer ran). Read it and activate the ' +
|
|
31
|
+
const DEFAULT_BODY = "Note: a routing menu is open for this turn. The `read_skill` tool's description begins " +
|
|
32
|
+
'with candidate skills (with advisory relevance when supplied). Read it and activate the ' +
|
|
34
33
|
'one that actually fits, or answer directly WITHOUT calling read_skill to stay where you ' +
|
|
35
|
-
'are.
|
|
36
|
-
'your judgment wins.';
|
|
34
|
+
'are. Use the conversation to decide; the menu is guidance, not an instruction to pick.';
|
|
37
35
|
export function defineMenuHint(options = {}) {
|
|
38
36
|
return {
|
|
39
37
|
id: options.id ?? 'skill-menu-hint',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defineMenuHint.js","sourceRoot":"","sources":["../../../../../src/lib/injection-engine/factories/defineMenuHint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAYH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,eAAwB,CAAC;AAE/D,MAAM,YAAY,GAChB,
|
|
1
|
+
{"version":3,"file":"defineMenuHint.js","sourceRoot":"","sources":["../../../../../src/lib/injection-engine/factories/defineMenuHint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAYH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,eAAwB,CAAC;AAE/D,MAAM,YAAY,GAChB,yFAAyF;IACzF,0FAA0F;IAC1F,0FAA0F;IAC1F,wFAAwF,CAAC;AAE3F,MAAM,UAAU,cAAc,CAAC,UAA2B,EAAE;IAC1D,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,iBAAiB;QACnC,MAAM,EAAE,cAAc;QACtB,WAAW,EAAE,gEAAgE;QAC7E,OAAO,EAAE;YACP,IAAI,EAAE,MAAM;YACZ,yEAAyE;YACzE,wEAAwE;YACxE,kEAAkE;YAClE,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,GAAG,CAAC,SAAS,EAAE,OAAO,KAAK,SAAS;SACjF;QACD,QAAQ,EAAE,EAAE,CAAC,sBAAsB,CAAC,EAAE,IAAI,EAAE;QAC5C,MAAM,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,IAAI,IAAI,YAAY,EAAE;KACvD,CAAC;AACJ,CAAC"}
|
|
@@ -79,8 +79,8 @@ export interface ReadSkillOffer {
|
|
|
79
79
|
readonly cursorId?: string;
|
|
80
80
|
/**
|
|
81
81
|
* Turn-start MENU (SG-C): when set, the description LEADS with these
|
|
82
|
-
* candidates (id + one-line description; advisory relevance %s
|
|
83
|
-
*
|
|
82
|
+
* candidates (id + one-line description; supplied advisory relevance %s),
|
|
83
|
+
* names the cursor, and states STAY as a first-class
|
|
84
84
|
* option ("answer without calling read_skill to stay in '<cursor>'").
|
|
85
85
|
*
|
|
86
86
|
* Set only while the turn's menu verdict is outstanding (turn start, before
|
|
@@ -90,6 +90,8 @@ export interface ReadSkillOffer {
|
|
|
90
90
|
* retire four honesty mechanisms), and {@link ReadSkillOffer.hiddenIds}
|
|
91
91
|
* filters menu rows exactly as it filters every other list: a role-hidden
|
|
92
92
|
* skill is never NAMED, menu or no menu.
|
|
93
|
+
* Descriptions appear once per skill id in this offer. Later catalog or
|
|
94
|
+
* reachability rows retain the id and refer to its description above.
|
|
93
95
|
*/
|
|
94
96
|
readonly menu?: {
|
|
95
97
|
readonly candidates: ReadonlyArray<{
|
|
@@ -133,6 +133,16 @@ function describeOffer(allSkills, line, fullCatalog, offer) {
|
|
|
133
133
|
// the "not reachable" list and the plain catalog all read from this.
|
|
134
134
|
const hidden = new Set(offer.hiddenIds ?? []);
|
|
135
135
|
const skills = visibleSkills(allSkills, offer);
|
|
136
|
+
// One description per id, local to THIS offer. Membership still appears in
|
|
137
|
+
// every applicable section: relevance is not reachability. Never deduplicate
|
|
138
|
+
// by description text — distinct skills can legitimately share that text.
|
|
139
|
+
const described = new Set();
|
|
140
|
+
const describeOnce = (s) => {
|
|
141
|
+
if (described.has(s.id))
|
|
142
|
+
return ` - ${s.id}`;
|
|
143
|
+
described.add(s.id);
|
|
144
|
+
return line(s);
|
|
145
|
+
};
|
|
136
146
|
// The turn-start MENU leads (SG-C) — rendered from the turn verdict, ids
|
|
137
147
|
// resolved against the (hidden-filtered) catalog so an id this description
|
|
138
148
|
// may not name, or one that is not a skill here, is silently skipped rather
|
|
@@ -142,7 +152,7 @@ function describeOffer(allSkills, line, fullCatalog, offer) {
|
|
|
142
152
|
.filter((c) => byId.has(c.id))
|
|
143
153
|
.map((c) => {
|
|
144
154
|
const pct = c.relevance !== undefined ? ` (relevance ~${Math.round(c.relevance * 100)}%)` : '';
|
|
145
|
-
return `${
|
|
155
|
+
return `${describeOnce(byId.get(c.id))}${pct}`;
|
|
146
156
|
});
|
|
147
157
|
// ── THE CURSOR IS NAMED ON EVERY CALL THAT HAS ONE (9.84.0) ─────────
|
|
148
158
|
// This used to be the STAY clause and nothing else, so it appeared only while
|
|
@@ -206,9 +216,8 @@ function describeOffer(allSkills, line, fullCatalog, offer) {
|
|
|
206
216
|
// rides; the gate's self-call notice names tools because it reads the merged
|
|
207
217
|
// list after the fact.
|
|
208
218
|
const menuLead = offer.menu !== undefined && menuRows.length > 0
|
|
209
|
-
? `This turn needs a routing choice
|
|
210
|
-
`
|
|
211
|
-
`conversation):\n${menuRows.join('\n')}\n` +
|
|
219
|
+
? `This turn needs a routing choice. Candidates for this turn ` +
|
|
220
|
+
`(advisory; use the conversation to choose):\n${menuRows.join('\n')}\n` +
|
|
212
221
|
(staying
|
|
213
222
|
? cursorLead
|
|
214
223
|
: `Answering WITHOUT calling read_skill is also allowed.\n\n${cursorLead}`)
|
|
@@ -220,7 +229,7 @@ function describeOffer(allSkills, line, fullCatalog, offer) {
|
|
|
220
229
|
? `Activate a skill for the next iteration. No skills are available to you — ` +
|
|
221
230
|
`answer without one, or say what you are unable to do.\n\n${tail}`
|
|
222
231
|
: `${menuLead}Activate a skill for the next iteration. Available skills:\n${skills
|
|
223
|
-
.map(
|
|
232
|
+
.map(describeOnce)
|
|
224
233
|
.join('\n')}\n\n${tail}`;
|
|
225
234
|
}
|
|
226
235
|
// The four target classes, from their ONE owner (9.86.0). `grantable` is the
|
|
@@ -256,7 +265,7 @@ function describeOffer(allSkills, line, fullCatalog, offer) {
|
|
|
256
265
|
return (`${menuLead}Activate a skill for the next iteration. This map is a decision TREE: ` +
|
|
257
266
|
`it routes by predicate on every iteration and keeps no cursor, so read_skill ` +
|
|
258
267
|
`cannot move it — a pick of a routed skill is refused. What a pick CAN open are ` +
|
|
259
|
-
`the skills the tree does not route:\n${open.map(
|
|
268
|
+
`the skills the tree does not route:\n${open.map(describeOnce).join('\n')}\n\n${tail}`);
|
|
260
269
|
}
|
|
261
270
|
// The cursor is never in `grantable` — `makeReachableSkills` filters it out of
|
|
262
271
|
// its own successor set, because a MOVE to where you already are is not a move.
|
|
@@ -270,7 +279,7 @@ function describeOffer(allSkills, line, fullCatalog, offer) {
|
|
|
270
279
|
const shut = skills.filter((s) => classOf(s.id) === 'unreachable');
|
|
271
280
|
const parts = [];
|
|
272
281
|
if (open.length > 0) {
|
|
273
|
-
parts.push(`Reachable from here:\n${open.map(
|
|
282
|
+
parts.push(`Reachable from here:\n${open.map(describeOnce).join('\n')}`);
|
|
274
283
|
}
|
|
275
284
|
else if (!hopsSpoken.held) {
|
|
276
285
|
// Nothing was wired out of here at all — an absence this description holds
|
|
@@ -279,7 +288,7 @@ function describeOffer(allSkills, line, fullCatalog, offer) {
|
|
|
279
288
|
}
|
|
280
289
|
if (offer.showRefusable !== false && shut.length > 0) {
|
|
281
290
|
parts.push(`Not reachable from here (read_skill for these will be refused):\n${shut
|
|
282
|
-
.map(
|
|
291
|
+
.map(describeOnce)
|
|
283
292
|
.join('\n')}`);
|
|
284
293
|
}
|
|
285
294
|
// With every clause omitted the description names the cursor and stops, which
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillToolDescriptors.js","sourceRoot":"","sources":["../../../../src/lib/injection-engine/skillToolDescriptors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"skillToolDescriptors.js","sourceRoot":"","sources":["../../../../src/lib/injection-engine/skillToolDescriptors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAoGzC,iHAAiH;AACjH,kGAAkG;AAClG,+DAA+D;AAC/D,gGAAgG;AAChG;;;;;;GAMG;AACH,SAAS,aAAa,CACpB,SAA+B,EAC/B,KAAsB;IAEtB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAClF,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,aAAa,CACpB,SAA+B,EAC/B,KAAqB;IAErB,OAAO,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,MAAM,CAC3C,CAAC,CAAC,EAAE,EAAE,CACJ,mBAAmB,CAAC;QAClB,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC/D,MAAM,EAAE,CAAC,CAAC,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE;KAC5B,CAAC,KAAK,KAAK,CACf,CAAC;AACJ,CAAC;AAED,8CAA8C;AAC9C,6HAA6H;AAC7H,qHAAqH;AACrH,4GAA4G;AAC5G,iGAAiG;AACjG,mFAAmF;AACnF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,SAAS,aAAa,CACpB,SAA+B,EAC/B,IAA8B,EAC9B,WAAmB,EACnB,KAAsB;IAEtB,MAAM,IAAI,GACR,kFAAkF;QAClF,gDAAgD,CAAC;IACnD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,+DAA+D,WAAW,OAAO,IAAI,EAAE,CAAC;IACjG,CAAC;IACD,2EAA2E;IAC3E,qEAAqE;IACrE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC/C,2EAA2E;IAC3E,6EAA6E;IAC7E,0EAA0E;IAC1E,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,MAAM,YAAY,GAAG,CAAC,CAAY,EAAU,EAAE;QAC5C,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAAE,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC;QAC9C,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC,CAAC;IACF,yEAAyE;IACzE,2EAA2E;IAC3E,4EAA4E;IAC5E,8BAA8B;IAC9B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAU,CAAC,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,IAAI,EAAE,CAAC;SAC5C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SAC7B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,GAAG,GACP,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACrF,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAC,GAAG,GAAG,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;IACL,uEAAuE;IACvE,8EAA8E;IAC9E,0EAA0E;IAC1E,8EAA8E;IAC9E,yEAAyE;IACzE,6EAA6E;IAC7E,8EAA8E;IAC9E,gCAAgC;IAChC,EAAE;IACF,yEAAyE;IACzE,kEAAkE;IAClE,yEAAyE;IACzE,4EAA4E;IAC5E,wEAAwE;IACxE,2EAA2E;IAC3E,4EAA4E;IAC5E,kCAAkC;IAClC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC;IACrD,MAAM,QAAQ,GAAG,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/E,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,CAAC;IACpE,sEAAsE;IACtE,EAAE;IACF,6EAA6E;IAC7E,4EAA4E;IAC5E,4EAA4E;IAC5E,uEAAuE;IACvE,2EAA2E;IAC3E,2EAA2E;IAC3E,2EAA2E;IAC3E,4EAA4E;IAC5E,wEAAwE;IACxE,4EAA4E;IAC5E,4EAA4E;IAC5E,2EAA2E;IAC3E,wEAAwE;IACxE,wCAAwC;IACxC,EAAE;IACF,4EAA4E;IAC5E,4EAA4E;IAC5E,4EAA4E;IAC5E,2EAA2E;IAC3E,6EAA6E;IAC7E,8EAA8E;IAC9E,0EAA0E;IAC1E,2EAA2E;IAC3E,yEAAyE;IACzE,2EAA2E;IAC3E,uEAAuE;IACvE,0EAA0E;IAC1E,iCAAiC;IACjC,MAAM,UAAU,GACd,QAAQ,KAAK,SAAS;QACpB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,eAAe,QAAQ,IAAI;YAC3B,CAAC,OAAO;gBACN,CAAC,CAAC,yEAAyE;oBACzE,YAAY,QAAQ,QAAQ;gBAC9B,CAAC,CAAC,MAAM,CAAC,CAAC;IAClB,8EAA8E;IAC9E,8EAA8E;IAC9E,6EAA6E;IAC7E,uBAAuB;IACvB,MAAM,QAAQ,GACZ,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAC7C,CAAC,CAAC,6DAA6D;YAC7D,gDAAgD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YACvE,CAAC,OAAO;gBACN,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,4DAA4D,UAAU,EAAE,CAAC;QAC/E,CAAC,CAAC,UAAU,CAAC;IACjB,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAClC,2EAA2E;QAC3E,yDAAyD;QACzD,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC;YACxB,CAAC,CAAC,4EAA4E;gBAC1E,4DAA4D,IAAI,EAAE;YACtE,CAAC,CAAC,GAAG,QAAQ,+DAA+D,MAAM;iBAC7E,GAAG,CAAC,YAAY,CAAC;iBACjB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IACjC,CAAC;IACD,6EAA6E;IAC7E,6EAA6E;IAC7E,6EAA6E;IAC7E,4EAA4E;IAC5E,qEAAqE;IACrE,MAAM,OAAO,GAAG,CAAC,EAAU,EAA0C,EAAE,CACrE,mBAAmB,CAAC;QAClB,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QACnD,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE;KAC5B,CAAC,CAAC;IACL,uEAAuE;IACvE,4EAA4E;IAC5E,4EAA4E;IAC5E,8EAA8E;IAC9E,4EAA4E;IAC5E,8EAA8E;IAC9E,4EAA4E;IAC5E,2EAA2E;IAC3E,wDAAwD;IACxD,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,MAAM,CACvB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EACxB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CACxB,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvD,uEAAuE;IACvE,4EAA4E;IAC5E,6EAA6E;IAC7E,6EAA6E;IAC7E,wEAAwE;IACxE,yEAAyE;IACzE,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAC9B,OAAO,CACL,GAAG,QAAQ,wEAAwE;YACnF,+EAA+E;YAC/E,iFAAiF;YACjF,wCAAwC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CACvF,CAAC;IACJ,CAAC;IACD,+EAA+E;IAC/E,gFAAgF;IAChF,kEAAkE;IAClE,8EAA8E;IAC9E,8EAA8E;IAC9E,6EAA6E;IAC7E,0EAA0E;IAC1E,0EAA0E;IAC1E,uDAAuD;IACvD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,aAAa,CAAC,CAAC;IACnE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,yBAAyB,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;SAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAC5B,2EAA2E;QAC3E,uEAAuE;QACvE,KAAK,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,KAAK,CAAC,aAAa,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrD,KAAK,CAAC,IAAI,CACR,oEAAoE,IAAI;aACrE,GAAG,CAAC,YAAY,CAAC;aACjB,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;IACJ,CAAC;IACD,8EAA8E;IAC9E,2EAA2E;IAC3E,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACjE,OAAO,GAAG,QAAQ,2CAA2C,IAAI,OAAO,IAAI,EAAE,CAAC;AACjF,CAAC;AAED,0CAA0C;AAC1C,sGAAsG;AACtG,6FAA6F;AAC7F,2GAA2G;AAC3G,0EAA0E;AAC1E,mFAAmF;AACnF;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAA4B;IAE5B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAE1C,+DAA+D;IAC/D,mEAAmE;IACnE,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjC,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,kBAAkB;KACjD,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,WAAW,EACT,6DAA6D;YAC7D,mEAAmE;QACrE,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE;QAC5E,OAAO,EAAE,GAAG,EAAE;YACZ,kEAAkE;YAClE,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1C,CAAC;KACF,CAAC;AACJ,CAAC;AAED,8CAA8C;AAC9C,qGAAqG;AACrG,2CAA2C;AAC3C,yGAAyG;AACzG,2GAA2G;AAC3G,iFAAiF;AACjF,mFAAmF;AACnF;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAA4B,EAC5B,KAAsB;IAEtB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1C,uEAAuE;IACvE,2EAA2E;IAC3E,4EAA4E;IAC5E,4EAA4E;IAC5E,0EAA0E;IAC1E,6EAA6E;IAC7E,2EAA2E;IAC3E,IAAI,KAAK,EAAE,UAAU,KAAK,IAAI,IAAI,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAE9F,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,CAAC,CAAY,EAAU,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,WAAW,IAAI,kBAAkB,EAAE,CAAC;IAC7F,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAQjD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,CAAC,CAAC,QAAgD,CAAC;QAChE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACb,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE;YACjC,WAAW,EAAE,IAAI,EAAE,WAAW,IAAI,MAAM;SACzC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC;QAC7D,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,EAAE,EAAE;oBACF,IAAI,EAAE,QAAQ;oBACd,wEAAwE;oBACxE,2EAA2E;oBAC3E,uEAAuE;oBACvE,sEAAsE;oBACtE,yDAAyD;oBACzD,0EAA0E;oBAC1E,uEAAuE;oBACvE,0EAA0E;oBAC1E,8CAA8C;oBAC9C,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2BAA2B;iBACzC;aACF;YACD,QAAQ,EAAE,CAAC,IAAI,CAAC;SACjB;QACD,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;YAClB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,kBAAkB,EAAE,iBAAiB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACpE,CAAC;YACD,2CAA2C;YAC3C,iEAAiE;YACjE,6DAA6D;YAC7D,mEAAmE;YACnE,8DAA8D;YAC9D,IAAI,CAAC,KAAK,CAAC,WAAW,KAAK,WAAW,IAAI,KAAK,CAAC,WAAW,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACtF,OAAO,KAAK,CAAC,IAAI,CAAC;YACpB,CAAC;YACD,OAAO,2BAA2B,CAAC,EAAE,CAAC,CAAC;QACzC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,0CAA0C;AAC1C,kGAAkG;AAClG,mFAAmF;AACnF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,2BAA2B,CAAC,EAAU;IACpD,OAAO,UAAU,EAAE,qCAAqC,CAAC;AAC3D,CAAC"}
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
* inject `_client` and skip the import path entirely.
|
|
41
41
|
*/
|
|
42
42
|
import { readToolExtras } from './toolExtras.js';
|
|
43
|
+
import { readToolResult, resultModeOf } from './toolResult.js';
|
|
43
44
|
import { createVendingFetch } from './gatewayTransport.js';
|
|
44
45
|
import { retryingFetch } from './throttleRetry.js';
|
|
45
46
|
import { refuseConflictingOptions } from './connectionRefusals.js';
|
|
@@ -77,6 +78,7 @@ const DEFAULT_CLIENT_INFO = {
|
|
|
77
78
|
*/
|
|
78
79
|
export async function mcpClient(opts) {
|
|
79
80
|
const name = opts.name ?? 'mcp';
|
|
81
|
+
const resultMode = resultModeOf(opts.resultMode, name);
|
|
80
82
|
// Before anything connects: an option that names a behaviour which cannot
|
|
81
83
|
// happen on the chosen arm is a defect, not a preference.
|
|
82
84
|
refuseConflictingOptions(opts, name);
|
|
@@ -96,7 +98,7 @@ export async function mcpClient(opts) {
|
|
|
96
98
|
const listed = opts.signal
|
|
97
99
|
? await connection.listTools(undefined, { signal: opts.signal })
|
|
98
100
|
: await connection.listTools();
|
|
99
|
-
return listed.tools.map((t) => wrapMcpTool(name, connection, t, opts.signal));
|
|
101
|
+
return listed.tools.map((t) => wrapMcpTool(name, connection, t, opts.signal, resultMode));
|
|
100
102
|
};
|
|
101
103
|
return {
|
|
102
104
|
name,
|
|
@@ -245,7 +247,7 @@ function loadHttpModule(transport) {
|
|
|
245
247
|
}
|
|
246
248
|
}
|
|
247
249
|
// ─── Tool wrapping ─────────────────────────────────────────────────
|
|
248
|
-
function wrapMcpTool(serverName, connection, mcp, signal) {
|
|
250
|
+
function wrapMcpTool(serverName, connection, mcp, signal, resultMode) {
|
|
249
251
|
const tool = {
|
|
250
252
|
schema: {
|
|
251
253
|
name: mcp.name,
|
|
@@ -279,103 +281,9 @@ function wrapMcpTool(serverName, connection, mcp, signal) {
|
|
|
279
281
|
const result = signal
|
|
280
282
|
? await connection.callTool(params, undefined, { signal })
|
|
281
283
|
: await connection.callTool(params);
|
|
282
|
-
return readToolResult(result, mcp.name, serverName);
|
|
284
|
+
return readToolResult(result, mcp.name, serverName, resultMode);
|
|
283
285
|
},
|
|
284
286
|
};
|
|
285
287
|
return tool;
|
|
286
288
|
}
|
|
287
|
-
// ─── Reading a tools/call answer (both arms of the protocol) ───────
|
|
288
|
-
/**
|
|
289
|
-
* Turn a `tools/call` answer into the text the agent hands the model.
|
|
290
|
-
*
|
|
291
|
-
* Three cases, because the protocol has three and pretending otherwise is what
|
|
292
|
-
* broke on a server that answered the old way:
|
|
293
|
-
*
|
|
294
|
-
* 1. **content blocks** — today's shape. Text blocks are concatenated;
|
|
295
|
-
* non-text blocks (images, resources) are summarized with their type.
|
|
296
|
-
* `isError: true` becomes a thrown tool error, exactly as before.
|
|
297
|
-
* 2. **`toolResult`** — the 2024-10-07 shape, which carries no `content` and
|
|
298
|
-
* no `isError`. The value BECOMES the tool text: a string verbatim,
|
|
299
|
-
* anything else JSON-stringified. That conversion is stated here and in
|
|
300
|
-
* the docs rather than left to be inferred from a mangled answer.
|
|
301
|
-
* 3. **neither** — a corrective error naming the SHAPE that arrived (its
|
|
302
|
-
* type, or its keys) and never the payload: an unrecognised answer is
|
|
303
|
-
* still somebody's data, and a tool error is read by the model.
|
|
304
|
-
*
|
|
305
|
-
* **Order matters, and here is why the legacy check runs first.** The SDK's
|
|
306
|
-
* default result schema declares `content` with a default of `[]`, so a legacy
|
|
307
|
-
* `{ toolResult }` payload arrives here wearing an empty `content` it never
|
|
308
|
-
* sent. Reading that array first would answer a real result with an empty
|
|
309
|
-
* string — the same silence in a friendlier coat. So a `toolResult` beside an
|
|
310
|
-
* EMPTY `content` is read as the legacy answer it is. A NON-empty `content`
|
|
311
|
-
* always wins: a server that sent blocks meant the blocks.
|
|
312
|
-
*/
|
|
313
|
-
function readToolResult(result, toolName, serverName) {
|
|
314
|
-
if (isLegacyResult(result) && !hasNonEmptyContent(result)) {
|
|
315
|
-
return stringifyLegacyResult(result.toolResult);
|
|
316
|
-
}
|
|
317
|
-
if (hasContentBlocks(result)) {
|
|
318
|
-
const text = result.content
|
|
319
|
-
.map((c) => (c.type === 'text' && c.text ? c.text : `[${c.type}]`))
|
|
320
|
-
.join('\n');
|
|
321
|
-
if (result.isError) {
|
|
322
|
-
throw new Error(`MCP tool '${toolName}' (server '${serverName}') returned an error: ${text}`);
|
|
323
|
-
}
|
|
324
|
-
return text;
|
|
325
|
-
}
|
|
326
|
-
throw new Error(`MCP tool '${toolName}' (server '${serverName}') answered with a shape this client does ` +
|
|
327
|
-
`not understand: ${describeShape(result)}. A tools/call result carries either 'content' ` +
|
|
328
|
-
`blocks or a legacy 'toolResult'; this had neither.`);
|
|
329
|
-
}
|
|
330
|
-
/**
|
|
331
|
-
* The current arm. Checked on the wire value, not on the declared type — and
|
|
332
|
-
* defensively, because a `null` or a scalar is exactly the kind of answer that
|
|
333
|
-
* has to reach the corrective error rather than crash on the way to it.
|
|
334
|
-
*/
|
|
335
|
-
function hasContentBlocks(result) {
|
|
336
|
-
return Array.isArray(contentOf(result));
|
|
337
|
-
}
|
|
338
|
-
/** Blocks the server actually sent, as opposed to the schema's default `[]`. */
|
|
339
|
-
function hasNonEmptyContent(result) {
|
|
340
|
-
const content = contentOf(result);
|
|
341
|
-
return Array.isArray(content) && content.length > 0;
|
|
342
|
-
}
|
|
343
|
-
function contentOf(result) {
|
|
344
|
-
if (typeof result !== 'object' || result === null)
|
|
345
|
-
return undefined;
|
|
346
|
-
return result.content;
|
|
347
|
-
}
|
|
348
|
-
/** The 2024-10-07 arm — the key's PRESENCE is the signal; its value may be anything. */
|
|
349
|
-
function isLegacyResult(result) {
|
|
350
|
-
return typeof result === 'object' && result !== null && 'toolResult' in result;
|
|
351
|
-
}
|
|
352
|
-
/** A legacy `toolResult` as tool text: a string verbatim, anything else as JSON. */
|
|
353
|
-
function stringifyLegacyResult(value) {
|
|
354
|
-
if (typeof value === 'string')
|
|
355
|
-
return value;
|
|
356
|
-
if (value === undefined)
|
|
357
|
-
return '';
|
|
358
|
-
try {
|
|
359
|
-
return JSON.stringify(value) ?? String(value);
|
|
360
|
-
}
|
|
361
|
-
catch {
|
|
362
|
-
// Circular or otherwise unserializable — say what we can rather than
|
|
363
|
-
// throwing from a path whose whole job is to report an answer.
|
|
364
|
-
return String(value);
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
/** Name a value's SHAPE for an error message. Never its contents. */
|
|
368
|
-
function describeShape(value) {
|
|
369
|
-
if (value === null)
|
|
370
|
-
return 'null';
|
|
371
|
-
if (Array.isArray(value))
|
|
372
|
-
return `an array of ${value.length} item(s)`;
|
|
373
|
-
if (typeof value !== 'object')
|
|
374
|
-
return `a ${typeof value}`;
|
|
375
|
-
const keys = Object.keys(value);
|
|
376
|
-
if (keys.length === 0)
|
|
377
|
-
return 'an object with no keys';
|
|
378
|
-
const shown = keys.slice(0, 8);
|
|
379
|
-
return `an object with keys [${shown.join(', ')}${keys.length > shown.length ? ', …' : ''}]`;
|
|
380
|
-
}
|
|
381
289
|
//# sourceMappingURL=mcpClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcpClient.js","sourceRoot":"","sources":["../../../../src/lib/mcp/mcpClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;
|
|
1
|
+
{"version":3,"file":"mcpClient.js","sourceRoot":"","sources":["../../../../src/lib/mcp/mcpClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
* — stable, documented, and the right level of abstraction for
|
|
29
29
|
* mock-first development.
|
|
30
30
|
*/
|
|
31
|
-
import type { McpClient } from './types.js';
|
|
31
|
+
import type { McpClient, McpClientOptions, McpCallToolResult } from './types.js';
|
|
32
32
|
/** A scripted tool exposed by the mock MCP server. */
|
|
33
33
|
export interface MockMcpTool {
|
|
34
34
|
/** Tool name as the LLM sees it. */
|
|
@@ -68,19 +68,23 @@ export interface MockMcpTool {
|
|
|
68
68
|
readonly _meta?: Readonly<Record<string, unknown>>;
|
|
69
69
|
/**
|
|
70
70
|
* Async handler that runs when the agent calls this tool. Receives
|
|
71
|
-
* the args the LLM produced; returns
|
|
72
|
-
*
|
|
71
|
+
* the args the LLM produced; returns a string or an MCP result envelope.
|
|
72
|
+
* Strings retain the existing behavior in text mode; envelopes use the
|
|
73
|
+
* same result decoder as the real client.
|
|
73
74
|
*
|
|
74
75
|
* Defaults to `async () => '[mock result]'` when omitted — useful
|
|
75
76
|
* when the consumer cares about wiring not behavior.
|
|
76
77
|
*/
|
|
77
|
-
readonly handler?: (args: Record<string, unknown>) => Promise<string>;
|
|
78
|
+
readonly handler?: (args: Record<string, unknown>) => Promise<string | McpCallToolResult>;
|
|
78
79
|
}
|
|
79
80
|
export interface MockMcpClientOptions {
|
|
80
81
|
/** Logical server name. Surfaces in observability + error messages. */
|
|
81
82
|
readonly name?: string;
|
|
82
83
|
/** Tools exposed by the mock server. */
|
|
83
84
|
readonly tools: readonly MockMcpTool[];
|
|
85
|
+
/** Same result decoding as mcpClient. A string handler becomes one text
|
|
86
|
+
* block; return McpCallToolResult to exercise structuredContent or isError. */
|
|
87
|
+
readonly resultMode?: McpClientOptions['resultMode'];
|
|
84
88
|
}
|
|
85
89
|
/**
|
|
86
90
|
* Build an in-memory `McpClient`. Useful when you want to develop
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
* mock-first development.
|
|
30
30
|
*/
|
|
31
31
|
import { readToolExtras } from './toolExtras.js';
|
|
32
|
+
import { readToolResult, resultModeOf } from './toolResult.js';
|
|
32
33
|
/**
|
|
33
34
|
* Build an in-memory `McpClient`. Useful when you want to develop
|
|
34
35
|
* against MCP semantics without spawning subprocesses, hitting the
|
|
@@ -37,6 +38,7 @@ import { readToolExtras } from './toolExtras.js';
|
|
|
37
38
|
*/
|
|
38
39
|
export function mockMcpClient(options) {
|
|
39
40
|
const name = options.name ?? 'mock-mcp';
|
|
41
|
+
const resultMode = resultModeOf(options.resultMode, name);
|
|
40
42
|
const toolMap = new Map(options.tools.map((t) => [t.name, t]));
|
|
41
43
|
let cache = null;
|
|
42
44
|
let closed = false;
|
|
@@ -45,7 +47,7 @@ export function mockMcpClient(options) {
|
|
|
45
47
|
throw new Error(`mockMcpClient[${name}].${op}() called after close(). Construct a new client to reuse.`);
|
|
46
48
|
}
|
|
47
49
|
};
|
|
48
|
-
const buildTools = () => options.tools.map((mcp) => wrapMockTool(name, toolMap, mcp));
|
|
50
|
+
const buildTools = () => options.tools.map((mcp) => wrapMockTool(name, toolMap, mcp, resultMode));
|
|
49
51
|
return {
|
|
50
52
|
name,
|
|
51
53
|
async tools() {
|
|
@@ -67,7 +69,7 @@ export function mockMcpClient(options) {
|
|
|
67
69
|
},
|
|
68
70
|
};
|
|
69
71
|
}
|
|
70
|
-
function wrapMockTool(serverName, toolMap, mcp) {
|
|
72
|
+
function wrapMockTool(serverName, toolMap, mcp, resultMode) {
|
|
71
73
|
const tool = {
|
|
72
74
|
schema: {
|
|
73
75
|
name: mcp.name,
|
|
@@ -90,10 +92,9 @@ function wrapMockTool(serverName, toolMap, mcp) {
|
|
|
90
92
|
// mutable Map could be supported later. For now `toolMap` is
|
|
91
93
|
// built once at factory time.
|
|
92
94
|
const handler = toolMap.get(mcp.name)?.handler;
|
|
93
|
-
if (!handler)
|
|
94
|
-
return '[mock result]';
|
|
95
95
|
try {
|
|
96
|
-
|
|
96
|
+
const result = handler ? await handler(argsObj) : '[mock result]';
|
|
97
|
+
return readToolResult(typeof result === 'string' ? { content: [{ type: 'text', text: result }] } : result, mcp.name, serverName, resultMode);
|
|
97
98
|
}
|
|
98
99
|
catch (err) {
|
|
99
100
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mockMcpClient.js","sourceRoot":"","sources":["../../../../src/lib/mcp/mockMcpClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"mockMcpClient.js","sourceRoot":"","sources":["../../../../src/lib/mcp/mockMcpClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** MCP result decoding; default text is unchanged, structured data is opt-in. */
|
|
2
|
+
import type { McpCallToolResult, McpClientOptions } from './types.js';
|
|
3
|
+
type ResultMode = NonNullable<McpClientOptions['resultMode']>;
|
|
4
|
+
/** Validate before opening a transport; a misspelled opt-in must not disappear. */
|
|
5
|
+
export declare function resultModeOf(value: unknown, name: string): ResultMode;
|
|
6
|
+
/** Internal shared decoder for the real connection and curated mock. */
|
|
7
|
+
export declare function readToolResult(result: McpCallToolResult, toolName: string, serverName: string, mode?: ResultMode): unknown;
|
|
8
|
+
export {};
|