agentfootprint 9.97.0 → 9.98.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.
Files changed (136) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/dist/artifacts/datasetResult.js +119 -0
  3. package/dist/artifacts/datasetResult.js.map +1 -0
  4. package/dist/artifacts/index.js +4 -1
  5. package/dist/artifacts/index.js.map +1 -1
  6. package/dist/conventions.js +10 -0
  7. package/dist/conventions.js.map +1 -1
  8. package/dist/core/agent/buildAgentChart.js +3 -1
  9. package/dist/core/agent/buildAgentChart.js.map +1 -1
  10. package/dist/core/agent/buildAgentMessageApiChart.js +1 -1
  11. package/dist/core/agent/buildAgentMessageApiChart.js.map +1 -1
  12. package/dist/core/agent/buildDynamicAgentChart.js +3 -1
  13. package/dist/core/agent/buildDynamicAgentChart.js.map +1 -1
  14. package/dist/esm/artifacts/datasetResult.d.ts +44 -0
  15. package/dist/esm/artifacts/datasetResult.js +114 -0
  16. package/dist/esm/artifacts/datasetResult.js.map +1 -0
  17. package/dist/esm/artifacts/index.d.ts +1 -0
  18. package/dist/esm/artifacts/index.js +1 -0
  19. package/dist/esm/artifacts/index.js.map +1 -1
  20. package/dist/esm/conventions.d.ts +2 -0
  21. package/dist/esm/conventions.js +10 -0
  22. package/dist/esm/conventions.js.map +1 -1
  23. package/dist/esm/core/agent/buildAgentChart.js +3 -1
  24. package/dist/esm/core/agent/buildAgentChart.js.map +1 -1
  25. package/dist/esm/core/agent/buildAgentMessageApiChart.js +1 -1
  26. package/dist/esm/core/agent/buildAgentMessageApiChart.js.map +1 -1
  27. package/dist/esm/core/agent/buildDynamicAgentChart.js +3 -1
  28. package/dist/esm/core/agent/buildDynamicAgentChart.js.map +1 -1
  29. package/dist/esm/index.d.ts +2 -2
  30. package/dist/esm/index.js +1 -1
  31. package/dist/esm/index.js.map +1 -1
  32. package/dist/esm/integrity/assertion/conflicts.d.ts +5 -32
  33. package/dist/esm/integrity/assertion/conflicts.js +6 -69
  34. package/dist/esm/integrity/assertion/conflicts.js.map +1 -1
  35. package/dist/esm/integrity/assertion/types.d.ts +8 -69
  36. package/dist/esm/integrity/assertion/types.js +0 -0
  37. package/dist/esm/integrity/assertion/types.js.map +1 -1
  38. package/dist/esm/lib/injection-engine/factories/defineMenuHint.js +3 -5
  39. package/dist/esm/lib/injection-engine/factories/defineMenuHint.js.map +1 -1
  40. package/dist/esm/lib/injection-engine/skillToolDescriptors.d.ts +4 -2
  41. package/dist/esm/lib/injection-engine/skillToolDescriptors.js +17 -8
  42. package/dist/esm/lib/injection-engine/skillToolDescriptors.js.map +1 -1
  43. package/dist/esm/lib/mcp/mcpClient.js +5 -97
  44. package/dist/esm/lib/mcp/mcpClient.js.map +1 -1
  45. package/dist/esm/lib/mcp/mockMcpClient.d.ts +8 -4
  46. package/dist/esm/lib/mcp/mockMcpClient.js +6 -5
  47. package/dist/esm/lib/mcp/mockMcpClient.js.map +1 -1
  48. package/dist/esm/lib/mcp/toolResult.d.ts +8 -0
  49. package/dist/esm/lib/mcp/toolResult.js +244 -0
  50. package/dist/esm/lib/mcp/toolResult.js.map +1 -0
  51. package/dist/esm/lib/mcp/types.d.ts +15 -0
  52. package/dist/esm/lib/semantics/check.d.ts +7 -1
  53. package/dist/esm/lib/semantics/check.js +16 -0
  54. package/dist/esm/lib/semantics/check.js.map +1 -1
  55. package/dist/esm/lib/semantics/cli.js +3 -0
  56. package/dist/esm/lib/semantics/cli.js.map +1 -1
  57. package/dist/esm/lib/semantics/projection.d.ts +15 -0
  58. package/dist/esm/lib/semantics/projection.js +186 -0
  59. package/dist/esm/lib/semantics/projection.js.map +1 -0
  60. package/dist/esm/lib/time-travel/index.d.ts +1 -1
  61. package/dist/esm/lib/time-travel/index.js.map +1 -1
  62. package/dist/esm/lib/time-travel/receipt.d.ts +5 -0
  63. package/dist/esm/lib/time-travel/receipt.js +2 -0
  64. package/dist/esm/lib/time-travel/receipt.js.map +1 -1
  65. package/dist/esm/lib/time-travel/requestMeasurement.d.ts +33 -0
  66. package/dist/esm/lib/time-travel/requestMeasurement.js +120 -0
  67. package/dist/esm/lib/time-travel/requestMeasurement.js.map +1 -0
  68. package/dist/esm/lib/time-travel/servedView.js +8 -1
  69. package/dist/esm/lib/time-travel/servedView.js.map +1 -1
  70. package/dist/index.js +4 -2
  71. package/dist/index.js.map +1 -1
  72. package/dist/integrity/assertion/conflicts.js +6 -69
  73. package/dist/integrity/assertion/conflicts.js.map +1 -1
  74. package/dist/integrity/assertion/types.js +0 -0
  75. package/dist/integrity/assertion/types.js.map +1 -1
  76. package/dist/lib/injection-engine/factories/defineMenuHint.js +3 -5
  77. package/dist/lib/injection-engine/factories/defineMenuHint.js.map +1 -1
  78. package/dist/lib/injection-engine/skillToolDescriptors.js +17 -8
  79. package/dist/lib/injection-engine/skillToolDescriptors.js.map +1 -1
  80. package/dist/lib/mcp/mcpClient.js +5 -97
  81. package/dist/lib/mcp/mcpClient.js.map +1 -1
  82. package/dist/lib/mcp/mockMcpClient.js +6 -5
  83. package/dist/lib/mcp/mockMcpClient.js.map +1 -1
  84. package/dist/lib/mcp/toolResult.js +249 -0
  85. package/dist/lib/mcp/toolResult.js.map +1 -0
  86. package/dist/lib/semantics/check.js +16 -0
  87. package/dist/lib/semantics/check.js.map +1 -1
  88. package/dist/lib/semantics/cli.js +3 -0
  89. package/dist/lib/semantics/cli.js.map +1 -1
  90. package/dist/lib/semantics/projection.js +191 -0
  91. package/dist/lib/semantics/projection.js.map +1 -0
  92. package/dist/lib/time-travel/index.js.map +1 -1
  93. package/dist/lib/time-travel/receipt.js +2 -0
  94. package/dist/lib/time-travel/receipt.js.map +1 -1
  95. package/dist/lib/time-travel/requestMeasurement.js +124 -0
  96. package/dist/lib/time-travel/requestMeasurement.js.map +1 -0
  97. package/dist/lib/time-travel/servedView.js +8 -1
  98. package/dist/lib/time-travel/servedView.js.map +1 -1
  99. package/dist/types/artifacts/datasetResult.d.ts +45 -0
  100. package/dist/types/artifacts/datasetResult.d.ts.map +1 -0
  101. package/dist/types/artifacts/index.d.ts +1 -0
  102. package/dist/types/artifacts/index.d.ts.map +1 -1
  103. package/dist/types/conventions.d.ts +2 -0
  104. package/dist/types/conventions.d.ts.map +1 -1
  105. package/dist/types/core/agent/buildAgentChart.d.ts.map +1 -1
  106. package/dist/types/core/agent/buildAgentMessageApiChart.d.ts.map +1 -1
  107. package/dist/types/core/agent/buildDynamicAgentChart.d.ts.map +1 -1
  108. package/dist/types/index.d.ts +2 -2
  109. package/dist/types/index.d.ts.map +1 -1
  110. package/dist/types/integrity/assertion/conflicts.d.ts +5 -32
  111. package/dist/types/integrity/assertion/conflicts.d.ts.map +1 -1
  112. package/dist/types/integrity/assertion/types.d.ts +8 -69
  113. package/dist/types/integrity/assertion/types.d.ts.map +1 -1
  114. package/dist/types/lib/injection-engine/factories/defineMenuHint.d.ts.map +1 -1
  115. package/dist/types/lib/injection-engine/skillToolDescriptors.d.ts +4 -2
  116. package/dist/types/lib/injection-engine/skillToolDescriptors.d.ts.map +1 -1
  117. package/dist/types/lib/mcp/mcpClient.d.ts.map +1 -1
  118. package/dist/types/lib/mcp/mockMcpClient.d.ts +8 -4
  119. package/dist/types/lib/mcp/mockMcpClient.d.ts.map +1 -1
  120. package/dist/types/lib/mcp/toolResult.d.ts +9 -0
  121. package/dist/types/lib/mcp/toolResult.d.ts.map +1 -0
  122. package/dist/types/lib/mcp/types.d.ts +15 -0
  123. package/dist/types/lib/mcp/types.d.ts.map +1 -1
  124. package/dist/types/lib/semantics/check.d.ts +7 -1
  125. package/dist/types/lib/semantics/check.d.ts.map +1 -1
  126. package/dist/types/lib/semantics/cli.d.ts.map +1 -1
  127. package/dist/types/lib/semantics/projection.d.ts +16 -0
  128. package/dist/types/lib/semantics/projection.d.ts.map +1 -0
  129. package/dist/types/lib/time-travel/index.d.ts +1 -1
  130. package/dist/types/lib/time-travel/index.d.ts.map +1 -1
  131. package/dist/types/lib/time-travel/receipt.d.ts +5 -0
  132. package/dist/types/lib/time-travel/receipt.d.ts.map +1 -1
  133. package/dist/types/lib/time-travel/requestMeasurement.d.ts +34 -0
  134. package/dist/types/lib/time-travel/requestMeasurement.d.ts.map +1 -0
  135. package/dist/types/lib/time-travel/servedView.d.ts.map +1 -1
  136. package/package.json +6 -2
@@ -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 the string result the agent
72
- * sees as the tool-result message.
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
- return await handler(argsObj);
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":"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"}
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 {};
@@ -0,0 +1,244 @@
1
+ /** Validate before opening a transport; a misspelled opt-in must not disappear. */
2
+ export function resultModeOf(value, name) {
3
+ if (value === undefined)
4
+ return 'text';
5
+ if (value === 'text' || value === 'structured' || value === 'structured-or-json')
6
+ return value;
7
+ throw new Error(`mcpClient[${name}]: resultMode must be 'text', 'structured' or 'structured-or-json'.`);
8
+ }
9
+ /** Internal shared decoder for the real connection and curated mock. */
10
+ export function readToolResult(result, toolName, serverName, mode = 'text') {
11
+ if (mode === 'text')
12
+ return readTextResult(result, toolName, serverName);
13
+ const prefix = `MCP tool '${toolName}' (server '${serverName}')`;
14
+ const invalid = () => new Error(`${prefix} did not provide valid structuredContent. ` +
15
+ (mode === 'structured-or-json'
16
+ ? 'Expected a JSON object in structuredContent or, when absent, exactly one JSON-object text block. '
17
+ : 'Expected a JSON object in structuredContent. ') +
18
+ 'Malformed, cyclic or over-limit data is refused; result data is not included in this error.');
19
+ if (typeof result !== 'object' || result === null)
20
+ throw invalid();
21
+ // Error status belongs to the tool, even if it also returned a usable object
22
+ // or a legacy arm. Never launder a failed call into successful data.
23
+ let isError;
24
+ try {
25
+ isError = ownValue(result, 'isError');
26
+ }
27
+ catch {
28
+ throw invalid();
29
+ }
30
+ if (isError === true) {
31
+ const diagnostic = errorDiagnostic(result);
32
+ throw new Error(diagnostic === undefined
33
+ ? `${prefix} returned an error; its structured result was not read.`
34
+ : `${prefix} returned an error: ${diagnostic}`);
35
+ }
36
+ try {
37
+ const structured = Object.getOwnPropertyDescriptor(result, 'structuredContent');
38
+ if (structured !== undefined) {
39
+ if (!('value' in structured) || !jsonObject(structured.value))
40
+ throw invalid();
41
+ return structured.value;
42
+ }
43
+ if (mode !== 'structured-or-json')
44
+ throw invalid();
45
+ const content = ownValue(result, 'content');
46
+ if (!Array.isArray(content) || content.length !== 1)
47
+ throw invalid();
48
+ const block = ownValue(content, '0');
49
+ if (typeof block !== 'object' || block === null || ownValue(block, 'type') !== 'text')
50
+ throw invalid();
51
+ const text = ownValue(block, 'text');
52
+ if (typeof text !== 'string' || text.length > 16_000_000)
53
+ throw invalid();
54
+ const parsed = JSON.parse(text);
55
+ if (!jsonObject(parsed))
56
+ throw invalid();
57
+ return parsed;
58
+ }
59
+ catch {
60
+ // Parser and getter exceptions may echo source bytes. Keep the refusal
61
+ // authored here rather than forwarding arbitrary transport payloads.
62
+ throw invalid();
63
+ }
64
+ }
65
+ /** Tool-authored error text is corrective evidence, not a successful result.
66
+ * Read only own data properties; never inspect structuredContent, invoke a
67
+ * getter/toJSON or stringify a non-string diagnostic. Over-limit/malformed
68
+ * diagnostics use the generic refusal rather than partial advice. */
69
+ function errorDiagnostic(result) {
70
+ try {
71
+ const content = ownValue(result, 'content');
72
+ if (!Array.isArray(content))
73
+ return undefined;
74
+ const length = ownValue(content, 'length');
75
+ if (typeof length !== 'number' || length < 1 || length > 32)
76
+ return undefined;
77
+ const texts = [];
78
+ let chars = 0;
79
+ for (let index = 0; index < length; index++) {
80
+ const block = ownValue(content, String(index));
81
+ if (typeof block !== 'object' || block === null || ownValue(block, 'type') !== 'text')
82
+ return undefined;
83
+ const text = ownValue(block, 'text');
84
+ if (typeof text !== 'string')
85
+ return undefined;
86
+ chars += text.length + (index === 0 ? 0 : 1);
87
+ if (chars > 8_192)
88
+ return undefined;
89
+ texts.push(text);
90
+ }
91
+ const diagnostic = texts.join('\n');
92
+ return diagnostic.trim() ? diagnostic : undefined;
93
+ }
94
+ catch {
95
+ return undefined;
96
+ }
97
+ }
98
+ function ownValue(value, key) {
99
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
100
+ if (descriptor !== undefined && !('value' in descriptor))
101
+ throw new Error('Accessor is not JSON data');
102
+ return descriptor?.value;
103
+ }
104
+ /** Validate the JSON data domain without invoking toJSON/getters, converting
105
+ * unknown to null or dropping unsupported fields. No clone or normalization. */
106
+ function jsonObject(value) {
107
+ if (value === null || typeof value !== 'object' || Array.isArray(value))
108
+ return false;
109
+ const ancestors = new Set();
110
+ let visited = 0;
111
+ function visit(item, depth) {
112
+ if (++visited > 1_000_000)
113
+ return false;
114
+ if (item === null || typeof item === 'string' || typeof item === 'boolean')
115
+ return true;
116
+ if (typeof item === 'number')
117
+ return Number.isFinite(item);
118
+ if (typeof item !== 'object' || depth >= 64 || ancestors.has(item))
119
+ return false;
120
+ const array = Array.isArray(item);
121
+ const prototype = Object.getPrototypeOf(item);
122
+ if (array ? prototype !== Array.prototype : prototype !== Object.prototype && prototype !== null)
123
+ return false;
124
+ ancestors.add(item);
125
+ try {
126
+ const keys = Reflect.ownKeys(item);
127
+ if (array && keys.length !== item.length + 1)
128
+ return false;
129
+ for (const key of keys) {
130
+ if (array && key === 'length')
131
+ continue;
132
+ if (typeof key !== 'string')
133
+ return false;
134
+ if (array && (!/^(0|[1-9]\d*)$/.test(key) || Number(key) >= item.length))
135
+ return false;
136
+ const descriptor = Object.getOwnPropertyDescriptor(item, key);
137
+ if (!descriptor.enumerable ||
138
+ !('value' in descriptor) ||
139
+ !visit(descriptor.value, depth + 1))
140
+ return false;
141
+ }
142
+ return true;
143
+ }
144
+ finally {
145
+ ancestors.delete(item);
146
+ }
147
+ }
148
+ return visit(value, 0);
149
+ }
150
+ // ─── Reading a tools/call answer (both arms of the protocol) ───────
151
+ /**
152
+ * Turn a `tools/call` answer into the text the agent hands the model.
153
+ *
154
+ * Three cases, because the protocol has three and pretending otherwise is what
155
+ * broke on a server that answered the old way:
156
+ *
157
+ * 1. **content blocks** — today's shape. Text blocks are concatenated;
158
+ * non-text blocks (images, resources) are summarized with their type.
159
+ * `isError: true` becomes a thrown tool error, exactly as before.
160
+ * 2. **`toolResult`** — the 2024-10-07 shape, which carries no `content` and
161
+ * no `isError`. The value BECOMES the tool text: a string verbatim,
162
+ * anything else JSON-stringified. That conversion is stated here and in
163
+ * the docs rather than left to be inferred from a mangled answer.
164
+ * 3. **neither** — a corrective error naming the SHAPE that arrived (its
165
+ * type, or its keys) and never the payload: an unrecognised answer is
166
+ * still somebody's data, and a tool error is read by the model.
167
+ *
168
+ * **Order matters, and here is why the legacy check runs first.** The SDK's
169
+ * default result schema declares `content` with a default of `[]`, so a legacy
170
+ * `{ toolResult }` payload arrives here wearing an empty `content` it never
171
+ * sent. Reading that array first would answer a real result with an empty
172
+ * string — the same silence in a friendlier coat. So a `toolResult` beside an
173
+ * EMPTY `content` is read as the legacy answer it is. A NON-empty `content`
174
+ * always wins: a server that sent blocks meant the blocks.
175
+ */
176
+ function readTextResult(result, toolName, serverName) {
177
+ if (isLegacyResult(result) && !hasNonEmptyContent(result)) {
178
+ return stringifyLegacyResult(result.toolResult);
179
+ }
180
+ if (hasContentBlocks(result)) {
181
+ const text = result.content
182
+ .map((c) => (c.type === 'text' && c.text ? c.text : `[${c.type}]`))
183
+ .join('\n');
184
+ if (result.isError) {
185
+ throw new Error(`MCP tool '${toolName}' (server '${serverName}') returned an error: ${text}`);
186
+ }
187
+ return text;
188
+ }
189
+ throw new Error(`MCP tool '${toolName}' (server '${serverName}') answered with a shape this client does ` +
190
+ `not understand: ${describeShape(result)}. A tools/call result carries either 'content' ` +
191
+ `blocks or a legacy 'toolResult'; this had neither.`);
192
+ }
193
+ /**
194
+ * The current arm. Checked on the wire value, not on the declared type — and
195
+ * defensively, because a `null` or a scalar is exactly the kind of answer that
196
+ * has to reach the corrective error rather than crash on the way to it.
197
+ */
198
+ function hasContentBlocks(result) {
199
+ return Array.isArray(contentOf(result));
200
+ }
201
+ /** Blocks the server actually sent, as opposed to the schema's default `[]`. */
202
+ function hasNonEmptyContent(result) {
203
+ const content = contentOf(result);
204
+ return Array.isArray(content) && content.length > 0;
205
+ }
206
+ function contentOf(result) {
207
+ if (typeof result !== 'object' || result === null)
208
+ return undefined;
209
+ return result.content;
210
+ }
211
+ /** The 2024-10-07 arm — the key's PRESENCE is the signal; its value may be anything. */
212
+ function isLegacyResult(result) {
213
+ return typeof result === 'object' && result !== null && 'toolResult' in result;
214
+ }
215
+ /** A legacy `toolResult` as tool text: a string verbatim, anything else as JSON. */
216
+ function stringifyLegacyResult(value) {
217
+ if (typeof value === 'string')
218
+ return value;
219
+ if (value === undefined)
220
+ return '';
221
+ try {
222
+ return JSON.stringify(value) ?? String(value);
223
+ }
224
+ catch {
225
+ // Circular or otherwise unserializable — say what we can rather than
226
+ // throwing from a path whose whole job is to report an answer.
227
+ return String(value);
228
+ }
229
+ }
230
+ /** Name a value's SHAPE for an error message. Never its contents. */
231
+ function describeShape(value) {
232
+ if (value === null)
233
+ return 'null';
234
+ if (Array.isArray(value))
235
+ return `an array of ${value.length} item(s)`;
236
+ if (typeof value !== 'object')
237
+ return `a ${typeof value}`;
238
+ const keys = Object.keys(value);
239
+ if (keys.length === 0)
240
+ return 'an object with no keys';
241
+ const shown = keys.slice(0, 8);
242
+ return `an object with keys [${shown.join(', ')}${keys.length > shown.length ? ', …' : ''}]`;
243
+ }
244
+ //# sourceMappingURL=toolResult.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolResult.js","sourceRoot":"","sources":["../../../../src/lib/mcp/toolResult.ts"],"names":[],"mappings":"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"}
@@ -154,6 +154,16 @@ export interface McpClientOptions {
154
154
  * connect to multiple servers.
155
155
  */
156
156
  readonly name?: string;
157
+ /** How successful tool results are read. Omitted or `text` preserves the
158
+ * existing text/legacy reader. `structured` requires a JSON object in
159
+ * structuredContent. `structured-or-json` also accepts exactly one text
160
+ * block containing a JSON object when structuredContent is absent. Neither
161
+ * mode infers datasets, provenance or truth; use an execution adapter for
162
+ * declared dataset handling. Malformed structured content never falls back.
163
+ * Validation caps: 64 nested containers, 1,000,000 values; JSON text fallback
164
+ * additionally caps input at 16,000,000 UTF-16 characters. These are result
165
+ * decoding limits, not transport/download limits. */
166
+ readonly resultMode?: 'text' | 'structured' | 'structured-or-json';
157
167
  /** Transport configuration — stdio or http. */
158
168
  readonly transport: McpTransport;
159
169
  /**
@@ -250,6 +260,8 @@ export interface McpConnectionOptions {
250
260
  * {@link McpClientOptions}. Defaults to `'mcp'`.
251
261
  */
252
262
  readonly name?: string;
263
+ /** Same decoding contract as McpClientOptions.resultMode; transport-independent. */
264
+ readonly resultMode?: McpClientOptions['resultMode'];
253
265
  /**
254
266
  * A connection you already opened. The library never calls `connect()` on it;
255
267
  * `close()` on the returned client closes it exactly once.
@@ -434,6 +446,9 @@ export type McpCallToolResult = {
434
446
  readonly text?: string;
435
447
  }>;
436
448
  readonly isError?: boolean;
449
+ /** MCP's optional object result. Ignored by the default text reader;
450
+ * validated before return when a structured resultMode is selected. */
451
+ readonly structuredContent?: Readonly<Record<string, unknown>>;
437
452
  }
438
453
  /** The 2024-10-07 arm. No `content`, and no `isError` — the shape predates it. */
439
454
  | {
@@ -28,6 +28,7 @@
28
28
  * inventory whose facts carry no render hint (useful, not provably harmful).
29
29
  */
30
30
  import { type ToolResultClass } from './types.js';
31
+ import { type ProjectionIssue } from './projection.js';
31
32
  /**
32
33
  * One tool's row in the semantics catalog: its name, its DECLARED result
33
34
  * class (from `defineTool({ resultClass })`), and sample results to judge —
@@ -38,10 +39,15 @@ export interface SemanticsCatalogEntry {
38
39
  readonly name: string;
39
40
  readonly resultClass?: ToolResultClass;
40
41
  readonly results: readonly unknown[];
42
+ /** Optional paired adapter fixtures. Exact preservation, not inference or factual validation. */
43
+ readonly projections?: readonly {
44
+ readonly before: unknown;
45
+ readonly after: unknown;
46
+ }[];
41
47
  }
42
48
  /** Every code one finding can carry. The four envelope codes are the
43
49
  * recognizer's own (`SemanticIssueCode`); the rest are the class rules. */
44
- export type SemanticsFindingCode = 'malformed-semantics' | 'series-without-grain' | 'counter-aggregation-unstated' | 'data-without-provenance' | 'triage-without-coverage' | 'inventory-without-coverage' | 'inventory-without-render' | 'unsampled-tool-class';
50
+ export type SemanticsFindingCode = 'malformed-semantics' | 'series-without-grain' | 'counter-aggregation-unstated' | 'data-without-provenance' | 'triage-without-coverage' | 'inventory-without-coverage' | 'inventory-without-render' | 'unsampled-tool-class' | ProjectionIssue['code'];
45
51
  /** One finding — names the TOOL and the FIELD, so the build log points at
46
52
  * the line to fix, never at the suite. */
47
53
  export interface SemanticsFinding {
@@ -30,6 +30,7 @@
30
30
  import { readCoverageResult } from '../../core/agent/coverage/read.js';
31
31
  import { explainSemantics, readSemantics } from './envelope.js';
32
32
  import { RESULT_CLASSES } from './types.js';
33
+ import { projectionSemanticsIssues, snapshotProjectionSemantics, } from './projection.js';
33
34
  const isPlainObject = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
34
35
  /** True when a result states its boundary through ANY recognized door: a
35
36
  * semantic envelope with `coverage`, a `coverage()` ledger, or an
@@ -100,6 +101,21 @@ export function checkSemantics(entries) {
100
101
  `nobody is keeping. Add one sample result (a mock return is enough).`,
101
102
  });
102
103
  }
104
+ if (entry.projections !== undefined) {
105
+ if (!Array.isArray(entry.projections))
106
+ throw new Error(`checkSemantics: tool '${entry.name}' projections must be an array of { before, after } fixtures.`);
107
+ entry.projections.forEach((pair, index) => {
108
+ if (!isPlainObject(pair) || !Object.hasOwn(pair, 'before') || !Object.hasOwn(pair, 'after'))
109
+ throw new Error(`checkSemantics: tool '${entry.name}' projection ${index + 1} requires before and after values.`);
110
+ for (const issue of projectionSemanticsIssues(snapshotProjectionSemantics(pair.before), pair.after))
111
+ findings.push({
112
+ tool: entry.name,
113
+ ...issue,
114
+ field: `projections[${index}].${issue.field}`,
115
+ severity: 'error',
116
+ });
117
+ });
118
+ }
103
119
  results.forEach((result, resultIndex) => {
104
120
  checkedResults += 1;
105
121
  // A marker-bearing value with faults: every fault becomes a finding
@@ -1 +1 @@
1
- {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../../src/lib/semantics/check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../../src/lib/semantics/check.ts"],"names":[],"mappings":"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"}
@@ -81,6 +81,9 @@ export function coerceSemanticsCatalog(json) {
81
81
  ? { resultClass: entry.resultClass }
82
82
  : {}),
83
83
  results,
84
+ ...(entry.projections !== undefined
85
+ ? { projections: entry.projections }
86
+ : {}),
84
87
  };
85
88
  });
86
89
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../../src/lib/semantics/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../../src/lib/semantics/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface ProjectionIssue {
2
+ readonly code: 'projection-declaration-changed' | 'projection-declaration-unreadable';
3
+ readonly field: string;
4
+ readonly message: string;
5
+ }
6
+ export interface ProjectionSnapshot {
7
+ readonly fields: ReadonlyMap<string, string>;
8
+ readonly issues: readonly ProjectionIssue[];
9
+ }
10
+ /** Capture before calling an adapter: it might mutate the original result.
11
+ * Only reserved declarations and the framework's documented wrapper spine are
12
+ * inspected. Raw facts/series/rows and arbitrary nested objects are not read. */
13
+ export declare function snapshotProjectionSemantics(result: unknown): ProjectionSnapshot;
14
+ /** Exact preservation of original fields; unrelated new declarations may be added. */
15
+ export declare function projectionSemanticsIssues(before: ProjectionSnapshot, after: unknown): readonly ProjectionIssue[];