agentfootprint 9.69.0 → 9.71.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.
Files changed (84) hide show
  1. package/CLAUDE.md +2 -0
  2. package/canonical-notes.json +16 -0
  3. package/dist/artifacts/placement.js +21 -7
  4. package/dist/artifacts/placement.js.map +1 -1
  5. package/dist/core/agent/stages/toolCalls.js +7 -1
  6. package/dist/core/agent/stages/toolCalls.js.map +1 -1
  7. package/dist/core/tools.js +102 -29
  8. package/dist/core/tools.js.map +1 -1
  9. package/dist/esm/artifacts/placement.d.ts +22 -7
  10. package/dist/esm/artifacts/placement.js +21 -7
  11. package/dist/esm/artifacts/placement.js.map +1 -1
  12. package/dist/esm/core/agent/stages/toolCalls.d.ts +3 -2
  13. package/dist/esm/core/agent/stages/toolCalls.js +7 -1
  14. package/dist/esm/core/agent/stages/toolCalls.js.map +1 -1
  15. package/dist/esm/core/agent/types.d.ts +3 -2
  16. package/dist/esm/core/tools.d.ts +80 -0
  17. package/dist/esm/core/tools.js +98 -28
  18. package/dist/esm/core/tools.js.map +1 -1
  19. package/dist/esm/index.d.ts +1 -1
  20. package/dist/esm/index.js +6 -1
  21. package/dist/esm/index.js.map +1 -1
  22. package/dist/esm/lib/injection-engine/types.d.ts +2 -1
  23. package/dist/esm/lib/injection-engine/types.js.map +1 -1
  24. package/dist/esm/lib/mcp/index.d.ts +1 -0
  25. package/dist/esm/lib/mcp/index.js +3 -0
  26. package/dist/esm/lib/mcp/index.js.map +1 -1
  27. package/dist/esm/lib/mcp/mcpClient.d.ts +6 -0
  28. package/dist/esm/lib/mcp/mcpClient.js +14 -0
  29. package/dist/esm/lib/mcp/mcpClient.js.map +1 -1
  30. package/dist/esm/lib/mcp/mcpServe.d.ts +8 -0
  31. package/dist/esm/lib/mcp/mcpServe.js +23 -5
  32. package/dist/esm/lib/mcp/mcpServe.js.map +1 -1
  33. package/dist/esm/lib/mcp/mockMcpClient.d.ts +26 -0
  34. package/dist/esm/lib/mcp/mockMcpClient.js +5 -0
  35. package/dist/esm/lib/mcp/mockMcpClient.js.map +1 -1
  36. package/dist/esm/lib/mcp/toolExtras.d.ts +129 -0
  37. package/dist/esm/lib/mcp/toolExtras.js +198 -0
  38. package/dist/esm/lib/mcp/toolExtras.js.map +1 -0
  39. package/dist/esm/lib/mcp/types.d.ts +18 -5
  40. package/dist/esm/tool-providers/index.d.ts +2 -2
  41. package/dist/esm/tool-providers/index.js +5 -1
  42. package/dist/esm/tool-providers/index.js.map +1 -1
  43. package/dist/index.js +8 -3
  44. package/dist/index.js.map +1 -1
  45. package/dist/lib/injection-engine/types.js.map +1 -1
  46. package/dist/lib/mcp/index.js +5 -1
  47. package/dist/lib/mcp/index.js.map +1 -1
  48. package/dist/lib/mcp/mcpClient.js +14 -0
  49. package/dist/lib/mcp/mcpClient.js.map +1 -1
  50. package/dist/lib/mcp/mcpServe.js +23 -5
  51. package/dist/lib/mcp/mcpServe.js.map +1 -1
  52. package/dist/lib/mcp/mockMcpClient.js +5 -0
  53. package/dist/lib/mcp/mockMcpClient.js.map +1 -1
  54. package/dist/lib/mcp/toolExtras.js +204 -0
  55. package/dist/lib/mcp/toolExtras.js.map +1 -0
  56. package/dist/tool-providers/index.js +5 -1
  57. package/dist/tool-providers/index.js.map +1 -1
  58. package/dist/types/artifacts/placement.d.ts +22 -7
  59. package/dist/types/artifacts/placement.d.ts.map +1 -1
  60. package/dist/types/core/agent/stages/toolCalls.d.ts +3 -2
  61. package/dist/types/core/agent/stages/toolCalls.d.ts.map +1 -1
  62. package/dist/types/core/agent/types.d.ts +3 -2
  63. package/dist/types/core/agent/types.d.ts.map +1 -1
  64. package/dist/types/core/tools.d.ts +80 -0
  65. package/dist/types/core/tools.d.ts.map +1 -1
  66. package/dist/types/index.d.ts +1 -1
  67. package/dist/types/index.d.ts.map +1 -1
  68. package/dist/types/lib/injection-engine/types.d.ts +2 -1
  69. package/dist/types/lib/injection-engine/types.d.ts.map +1 -1
  70. package/dist/types/lib/mcp/index.d.ts +1 -0
  71. package/dist/types/lib/mcp/index.d.ts.map +1 -1
  72. package/dist/types/lib/mcp/mcpClient.d.ts +6 -0
  73. package/dist/types/lib/mcp/mcpClient.d.ts.map +1 -1
  74. package/dist/types/lib/mcp/mcpServe.d.ts +8 -0
  75. package/dist/types/lib/mcp/mcpServe.d.ts.map +1 -1
  76. package/dist/types/lib/mcp/mockMcpClient.d.ts +26 -0
  77. package/dist/types/lib/mcp/mockMcpClient.d.ts.map +1 -1
  78. package/dist/types/lib/mcp/toolExtras.d.ts +130 -0
  79. package/dist/types/lib/mcp/toolExtras.d.ts.map +1 -0
  80. package/dist/types/lib/mcp/types.d.ts +18 -5
  81. package/dist/types/lib/mcp/types.d.ts.map +1 -1
  82. package/dist/types/tool-providers/index.d.ts +2 -2
  83. package/dist/types/tool-providers/index.d.ts.map +1 -1
  84. package/package.json +5 -3
@@ -8,7 +8,7 @@
8
8
  * Emits: N/A (types only).
9
9
  */
10
10
  Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.defineTool = exports.warnIfInvalidToolName = exports.assertValidToolName = exports.assertResultClass = exports.assertResultCeiling = void 0;
11
+ exports.defineTool = exports.warnIfInvalidToolName = exports.assertValidToolName = exports.assertArgumentsFrom = exports.assertToolOwner = exports.assertResultKind = exports.assertResultClass = exports.assertResultCeiling = void 0;
12
12
  const footprintjs_1 = require("footprintjs");
13
13
  const wants_js_1 = require("../artifacts/wants.js");
14
14
  const types_js_1 = require("../lib/semantics/types.js");
@@ -22,7 +22,11 @@ const askComponent_js_1 = require("./askComponent.js");
22
22
  function assertResultCeiling(toolName, ceiling) {
23
23
  if (ceiling === undefined)
24
24
  return;
25
- const { maxChars, narrowBy } = ceiling;
25
+ // Destructured through a fallback because this rule is also asked about
26
+ // values NO COMPILER vetted — a `_meta` bag from a foreign MCP server
27
+ // (`readToolExtras`). A `null` or a number must reach the teaching refusal
28
+ // below, not blow up on the destructuring on the way to it.
29
+ const { maxChars, narrowBy } = (ceiling ?? {});
26
30
  if (!Number.isFinite(maxChars) || !Number.isInteger(maxChars) || maxChars <= 0) {
27
31
  throw new Error(`defineTool: tool '${toolName}' declares resultCeiling.maxChars = ${String(maxChars)}, ` +
28
32
  `which is not a positive whole number of characters. The ceiling is the size over ` +
@@ -61,6 +65,96 @@ function assertResultClass(toolName, resultClass) {
61
65
  }
62
66
  }
63
67
  exports.assertResultClass = assertResultClass;
68
+ /**
69
+ * Refuse a `resultKind` that could never be redeemed, at definition time —
70
+ * naming the tool and the fix (the `assertResultCeiling` / `assertResultClass`
71
+ * law: a declaration this library cannot honor fails HERE, never at the first
72
+ * oversized result of the first run). Exported beside them for consumers
73
+ * assembling `Tool` objects by hand.
74
+ *
75
+ * The one rule is non-blankness, and it is not a formality: the kind is what a
76
+ * `wants` argument is matched against by exact string equality, so a blank or
77
+ * whitespace-only kind mints a ticket no declaration can ever name — the same
78
+ * refusal `assertToolWants` raises on the consuming end, raised on the
79
+ * producing end too. There is deliberately NO charset or shape rule: the kind
80
+ * is the consumer's vocabulary, and the library does not own it.
81
+ */
82
+ function assertResultKind(toolName, resultKind) {
83
+ if (resultKind === undefined)
84
+ return;
85
+ if (typeof resultKind !== 'string' || resultKind.trim().length === 0) {
86
+ throw new Error(`defineTool: tool '${toolName}' declares resultKind ${JSON.stringify(resultKind)}, which ` +
87
+ `is not a kind anything could want. It is the artifact kind a PLACED result is minted ` +
88
+ `under, matched by exact string equality against a consuming tool's ` +
89
+ `\`wants\` (e.g. 'dataset/rows'), so a blank kind is a ticket no argument can redeem. ` +
90
+ `Name the kind your consumers declare, or omit the field — omitting it mints ` +
91
+ `\`tool-result/${toolName}\`, exactly as before.`);
92
+ }
93
+ }
94
+ exports.assertResultKind = assertResultKind;
95
+ /**
96
+ * Refuse an `owner` stamp with a blank half, at definition time — naming the
97
+ * tool and what a blank half would do.
98
+ *
99
+ * An identity edge with a blank half is worse than none: the Context Integrity
100
+ * checks JOIN on it, so a blank `kind` or `id` joins the wrong subjects rather
101
+ * than no subjects. Extracted from `defineTool` (9.71.0) so the MCP ingest
102
+ * boundary can hold the SAME line on a declaration that arrived over the wire —
103
+ * one rule, one message, two doors.
104
+ *
105
+ * Deliberately NOT a closed-set check on `kind`: the union is enforced by the
106
+ * compiler for anyone calling `defineTool`, and the value is only ever read
107
+ * into a prose reason (`owned by <kind> '<id>'`), never switched on.
108
+ */
109
+ function assertToolOwner(toolName, owner) {
110
+ if (owner === undefined)
111
+ return;
112
+ // Same reason as `assertResultCeiling`: this is also asked about untyped
113
+ // values from a foreign MCP server, so a scalar or a `null` must land on the
114
+ // message rather than on a TypeError from the destructuring.
115
+ const { kind, id } = (owner ?? {});
116
+ if (typeof owner !== 'object' ||
117
+ typeof kind !== 'string' ||
118
+ kind.length === 0 ||
119
+ typeof id !== 'string' ||
120
+ id.length === 0) {
121
+ throw new Error(`defineTool('${toolName}'): \`owner\` must carry a non-empty kind and id — it is ` +
122
+ `the identity edge integrity checks join on, and a blank half joins the wrong ` +
123
+ `subjects. Got ${JSON.stringify(owner)}.`);
124
+ }
125
+ }
126
+ exports.assertToolOwner = assertToolOwner;
127
+ /**
128
+ * Refuse an `argumentsFrom` edge that could never join, at definition time.
129
+ *
130
+ * The dangling-reference and unsupported-argument checks join on these names,
131
+ * so a blank one — or a tool grounded by itself — would join the wrong subjects
132
+ * or none at all. Extracted from `defineTool` (9.71.0) for the same reason as
133
+ * {@link assertToolOwner}: the MCP ingest boundary enforces the identical rule
134
+ * on a declaration a remote server sent.
135
+ */
136
+ function assertArgumentsFrom(toolName, argumentsFrom) {
137
+ if (argumentsFrom === undefined)
138
+ return;
139
+ // The array check is part of the rule, not a formality: a foreign server can
140
+ // put a bare string here, and `for…of` over one would walk its CHARACTERS
141
+ // and refuse them one letter at a time.
142
+ if (!Array.isArray(argumentsFrom) || argumentsFrom.length === 0) {
143
+ throw new Error(`defineTool('${toolName}'): \`argumentsFrom\` must name at least one tool — ` +
144
+ `omitting the field is how "no grounds" is said.`);
145
+ }
146
+ for (const ground of argumentsFrom) {
147
+ if (typeof ground !== 'string' || ground.length === 0) {
148
+ throw new Error(`defineTool('${toolName}'): \`argumentsFrom\` entries must be non-empty tool ` +
149
+ `names. Got ${JSON.stringify(ground)}.`);
150
+ }
151
+ if (ground === toolName) {
152
+ throw new Error(`defineTool('${toolName}'): \`argumentsFrom\` names the tool itself — a tool ` +
153
+ `cannot be its own argument ground.`);
154
+ }
155
+ }
156
+ }
157
+ exports.assertArgumentsFrom = assertArgumentsFrom;
64
158
  /**
65
159
  * Ergonomic builder for `Tool`. Equivalent to constructing an object
66
160
  * literal with `schema` + `execute`, but flatter and safer — the name
@@ -138,6 +232,9 @@ function defineTool(options) {
138
232
  // A class outside the closed set fails HERE too — not at the first
139
233
  // `check:semantics` run of the first CI pipeline.
140
234
  assertResultClass(options.name, options.resultClass);
235
+ // A placed-result kind nothing could want fails HERE too — not at the first
236
+ // oversized result of the first run with placement configured.
237
+ assertResultKind(options.name, options.resultKind);
141
238
  // A decision component for a gate that never fires is configuration that
142
239
  // lies — configured-and-inert looks exactly like configured-and-working
143
240
  // (the `.checkIn({ scorer })`-with-minimal-evidence precedent). And a
@@ -159,36 +256,11 @@ function defineTool(options) {
159
256
  (0, wants_js_1.assertToolWants)(options.name, options.wants, options.inputSchema ?? { type: 'object', properties: {} });
160
257
  // An identity edge with a blank half is worse than none: a checker would
161
258
  // join on it and compare the wrong subjects. Refused HERE, naming the tool.
162
- if (options.owner !== undefined) {
163
- const { kind, id } = options.owner;
164
- if (typeof kind !== 'string' ||
165
- kind.length === 0 ||
166
- typeof id !== 'string' ||
167
- id.length === 0) {
168
- throw new Error(`defineTool('${options.name}'): \`owner\` must carry a non-empty kind and id — it is ` +
169
- `the identity edge integrity checks join on, and a blank half joins the wrong ` +
170
- `subjects. Got ${JSON.stringify(options.owner)}.`);
171
- }
172
- }
259
+ assertToolOwner(options.name, options.owner);
173
260
  // The grounds edge is judged at the same door and for the same reason: the
174
261
  // dangling-reference check joins on these names, and a blank one — or a
175
262
  // tool grounded by itself — would join the wrong subjects or none.
176
- if (options.argumentsFrom !== undefined) {
177
- if (options.argumentsFrom.length === 0) {
178
- throw new Error(`defineTool('${options.name}'): \`argumentsFrom\` must name at least one tool — ` +
179
- `omitting the field is how "no grounds" is said.`);
180
- }
181
- for (const ground of options.argumentsFrom) {
182
- if (typeof ground !== 'string' || ground.length === 0) {
183
- throw new Error(`defineTool('${options.name}'): \`argumentsFrom\` entries must be non-empty tool ` +
184
- `names. Got ${JSON.stringify(ground)}.`);
185
- }
186
- if (ground === options.name) {
187
- throw new Error(`defineTool('${options.name}'): \`argumentsFrom\` names the tool itself — a tool ` +
188
- `cannot be its own argument ground.`);
189
- }
190
- }
191
- }
263
+ assertArgumentsFrom(options.name, options.argumentsFrom);
192
264
  return {
193
265
  schema: {
194
266
  name: options.name,
@@ -206,6 +278,7 @@ function defineTool(options) {
206
278
  ...(options.capabilities !== undefined && { capabilities: options.capabilities }),
207
279
  ...(options.resultCeiling !== undefined && { resultCeiling: options.resultCeiling }),
208
280
  ...(options.resultClass !== undefined && { resultClass: options.resultClass }),
281
+ ...(options.resultKind !== undefined && { resultKind: options.resultKind }),
209
282
  ...(options.owner !== undefined && { owner: options.owner }),
210
283
  ...(options.argumentsFrom !== undefined && { argumentsFrom: options.argumentsFrom }),
211
284
  ...(options.repeatedWhen !== undefined && { repeatedWhen: options.repeatedWhen }),
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/core/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/core/tools.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,8 @@
4
4
  * An OPTIONAL operator dial on the agent's artifacts wiring:
5
5
  * `Agent.create({ artifacts: { store, placement: { maxInlineChars: N } } })`.
6
6
  * A tool result whose finalized text exceeds the threshold is checked into
7
- * the store (kind `tool-result/<toolName>`) and the model receives the claim
7
+ * the store (kind `tool-result/<toolName>`, or the tool's declared
8
+ * `resultKind` — see `placedResultKind`) and the model receives the claim
8
9
  * ticket instead — a SHORT substitute naming ref + meta + how to consume it.
9
10
  * The whole 879,073-token failure class, retired by configuration.
10
11
  *
@@ -55,11 +56,24 @@ export interface ArtifactPlacement {
55
56
  * — never at the first oversized result of the first run.
56
57
  */
57
58
  export declare function assertArtifactPlacement(site: string, placement: ArtifactPlacement | undefined): void;
58
- /** The kind vocabulary a placement mint declares: `tool-result/<toolName>`.
59
- * Honest — it says exactly what the payload is and which tool produced it —
60
- * and it is what a `wants` declaration or a `present` call names to consume
61
- * the placed result. */
62
- export declare function placedResultKind(toolName: string): string;
59
+ /**
60
+ * The kind vocabulary a placement mint declares — THE one decision, and the
61
+ * only place it is made.
62
+ *
63
+ * Default: `tool-result/<toolName>`. Honest — it says exactly what the payload
64
+ * is and which tool produced it — and it is what a `wants` declaration or a
65
+ * `present` call names to consume the placed result.
66
+ *
67
+ * `declared` is the tool's own `Tool.resultKind` (9.70.0), and when a tool
68
+ * declares one it WINS. The reason is the exact-match law on the consuming
69
+ * end: `wants` matches kinds by exact string equality — no wildcards, no
70
+ * hierarchy — so the framework's default vocabulary is a ticket a
71
+ * `wants: { dataset: 'dataset/rows' }` argument must refuse. Rather than
72
+ * loosen the matcher (a ticket would stop being a promise) or make consumers
73
+ * re-mint at the seam (the framework declining to carry its own ref), the
74
+ * MINT speaks the author's vocabulary. Absent → today's bytes exactly.
75
+ */
76
+ export declare function placedResultKind(toolName: string, declared?: string): string;
63
77
  /**
64
78
  * The substitute the model reads in place of the payload — ONE shape, always
65
79
  * the object (the `TruncatedToolResult` law: a consumer branches on
@@ -70,7 +84,8 @@ export interface PlacedToolResult {
70
84
  /** Always `true`. The field a consumer branches on. */
71
85
  readonly placed: true;
72
86
  readonly ref: string;
73
- /** `tool-result/<toolName>` — what a consumer names to want it. */
87
+ /** The minted kind — what a consumer names to want it. The tool's declared
88
+ * `Tool.resultKind` when it has one, `tool-result/<toolName>` otherwise. */
74
89
  readonly kind: string;
75
90
  readonly mediaType: string;
76
91
  /** The stored payload's true size — the chars the window did NOT pay. */
@@ -4,7 +4,8 @@
4
4
  * An OPTIONAL operator dial on the agent's artifacts wiring:
5
5
  * `Agent.create({ artifacts: { store, placement: { maxInlineChars: N } } })`.
6
6
  * A tool result whose finalized text exceeds the threshold is checked into
7
- * the store (kind `tool-result/<toolName>`) and the model receives the claim
7
+ * the store (kind `tool-result/<toolName>`, or the tool's declared
8
+ * `resultKind` — see `placedResultKind`) and the model receives the claim
8
9
  * ticket instead — a SHORT substitute naming ref + meta + how to consume it.
9
10
  * The whole 879,073-token failure class, retired by configuration.
10
11
  *
@@ -45,12 +46,25 @@ export function assertArtifactPlacement(site, placement) {
45
46
  `measured and never placed, exactly as before.`);
46
47
  }
47
48
  }
48
- /** The kind vocabulary a placement mint declares: `tool-result/<toolName>`.
49
- * Honest — it says exactly what the payload is and which tool produced it —
50
- * and it is what a `wants` declaration or a `present` call names to consume
51
- * the placed result. */
52
- export function placedResultKind(toolName) {
53
- return `tool-result/${toolName}`;
49
+ /**
50
+ * The kind vocabulary a placement mint declares — THE one decision, and the
51
+ * only place it is made.
52
+ *
53
+ * Default: `tool-result/<toolName>`. Honest — it says exactly what the payload
54
+ * is and which tool produced it — and it is what a `wants` declaration or a
55
+ * `present` call names to consume the placed result.
56
+ *
57
+ * `declared` is the tool's own `Tool.resultKind` (9.70.0), and when a tool
58
+ * declares one it WINS. The reason is the exact-match law on the consuming
59
+ * end: `wants` matches kinds by exact string equality — no wildcards, no
60
+ * hierarchy — so the framework's default vocabulary is a ticket a
61
+ * `wants: { dataset: 'dataset/rows' }` argument must refuse. Rather than
62
+ * loosen the matcher (a ticket would stop being a promise) or make consumers
63
+ * re-mint at the seam (the framework declining to carry its own ref), the
64
+ * MINT speaks the author's vocabulary. Absent → today's bytes exactly.
65
+ */
66
+ export function placedResultKind(toolName, declared) {
67
+ return declared ?? `tool-result/${toolName}`;
54
68
  }
55
69
  /** Type guard for consumers reading `tool_end.result` or a tool message. */
56
70
  export function isPlacedToolResult(value) {
@@ -1 +1 @@
1
- {"version":3,"file":"placement.js","sourceRoot":"","sources":["../../../src/artifacts/placement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAyBH;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,IAAY,EACZ,SAAwC;IAExC,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO;IACpC,MAAM,KAAK,GAAG,SAAS,CAAC,cAAc,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACtE,MAAM,IAAI,KAAK,CACb,GAAG,IAAI,0EAA0E;YAC/E,mBAAmB,MAAM,CAAC,KAAK,CAAC,qDAAqD;YACrF,iFAAiF;YACjF,sFAAsF;YACtF,+CAA+C,CAClD,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;yBAGyB;AACzB,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,eAAe,QAAQ,EAAE,CAAC;AACnC,CAAC;AAqBD,4EAA4E;AAC5E,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACb,KAA8B,CAAC,MAAM,KAAK,IAAI;QAC/C,OAAQ,KAA2B,CAAC,GAAG,KAAK,QAAQ;QACpD,OAAQ,KAA8B,CAAC,MAAM,KAAK,QAAQ,CAC3D,CAAC;AACJ,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,IAAkB,EAClB,SAAiB,EACjB,cAAsB;IAEtB,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EACJ,GAAG,QAAQ,aAAa,SAAS,oBAAoB,cAAc,kBAAkB;YACrF,yDAAyD,IAAI,CAAC,GAAG,IAAI;YACrE,IAAI,IAAI,CAAC,IAAI,mEAAmE;YAChF,WAAW,IAAI,CAAC,GAAG,qCAAqC,IAAI,CAAC,IAAI,aAAa;YAC9E,mBAAmB,IAAI,CAAC,GAAG,yDAAyD;YACpF,sCAAsC;KACzC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"placement.js","sourceRoot":"","sources":["../../../src/artifacts/placement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAyBH;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,IAAY,EACZ,SAAwC;IAExC,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO;IACpC,MAAM,KAAK,GAAG,SAAS,CAAC,cAAc,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACtE,MAAM,IAAI,KAAK,CACb,GAAG,IAAI,0EAA0E;YAC/E,mBAAmB,MAAM,CAAC,KAAK,CAAC,qDAAqD;YACrF,iFAAiF;YACjF,sFAAsF;YACtF,+CAA+C,CAClD,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,QAAiB;IAClE,OAAO,QAAQ,IAAI,eAAe,QAAQ,EAAE,CAAC;AAC/C,CAAC;AAsBD,4EAA4E;AAC5E,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACb,KAA8B,CAAC,MAAM,KAAK,IAAI;QAC/C,OAAQ,KAA2B,CAAC,GAAG,KAAK,QAAQ;QACpD,OAAQ,KAA8B,CAAC,MAAM,KAAK,QAAQ,CAC3D,CAAC;AACJ,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,IAAkB,EAClB,SAAiB,EACjB,cAAsB;IAEtB,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EACJ,GAAG,QAAQ,aAAa,SAAS,oBAAoB,cAAc,kBAAkB;YACrF,yDAAyD,IAAI,CAAC,GAAG,IAAI;YACrE,IAAI,IAAI,CAAC,IAAI,mEAAmE;YAChF,WAAW,IAAI,CAAC,GAAG,qCAAqC,IAAI,CAAC,IAAI,aAAa;YAC9E,mBAAmB,IAAI,CAAC,GAAG,yDAAyD;YACpF,sCAAsC;KACzC,CAAC;AACJ,CAAC"}
@@ -103,8 +103,9 @@ export interface ToolCallsHandlerDeps {
103
103
  * The placement threshold (9.22.0) — the operator's ref-ing dial. When set
104
104
  * (only ever beside `artifactStore`; the Agent option's shape enforces it),
105
105
  * every finalized tool result on every dispatch path is measured, and one
106
- * whose text exceeds `maxInlineChars` is checked into the store (kind
107
- * `tool-result/<toolName>`) with the model reading the claim ticket
106
+ * whose text exceeds `maxInlineChars` is checked into the store (under the
107
+ * tool's declared `resultKind`, or `tool-result/<toolName>` when it
108
+ * declares none) with the model reading the claim ticket
108
109
  * instead. Judged AFTER the tool's own `resultCeiling` and the after-tool
109
110
  * chain, BEFORE the `maxToolResultChars` truncation net. Undefined — the
110
111
  * default — and results are never measured against it (zero-cost).
@@ -1155,7 +1155,13 @@ export function buildToolCallsHandler(deps) {
1155
1155
  // `mediaType` states what that text is: a JSON serialization when the
1156
1156
  // tool returned a value, plain text when it returned a string.
1157
1157
  meta = await bound.artifacts.put({
1158
- kind: placedResultKind(call.toolName),
1158
+ // The tool's own `resultKind` when it declared one (9.70.0), the
1159
+ // framework's `tool-result/<name>` when it did not. Resolved HERE
1160
+ // rather than threaded through the five dispatch doors: `lookupTool`
1161
+ // is the closure's one resolver (registry + this iteration's cached
1162
+ // provider list), so a sixth door added later cannot forget to carry
1163
+ // the declaration — the `capResults` landmine, avoided by shape.
1164
+ kind: placedResultKind(call.toolName, lookupTool(call.toolName)?.resultKind),
1159
1165
  mediaType: typeof values.modelResult === 'string' ? 'text/plain' : 'application/json',
1160
1166
  data: text,
1161
1167
  label: `${call.toolName} result`,