stitchkit 0.118.1 → 0.120.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 (180) hide show
  1. package/CHANGELOG.md +92 -0
  2. package/README.md +10 -7
  3. package/dist/browser/http.d.ts.map +1 -1
  4. package/dist/contract/client-types.d.ts +6 -3
  5. package/dist/contract/client-types.d.ts.map +1 -1
  6. package/dist/contract/define-validation.d.ts.map +1 -1
  7. package/dist/contract/define.d.ts +18 -12
  8. package/dist/contract/define.d.ts.map +1 -1
  9. package/dist/contract/endpoint-capabilities.d.ts +28 -0
  10. package/dist/contract/endpoint-capabilities.d.ts.map +1 -0
  11. package/dist/contract/factory.d.ts +49 -19
  12. package/dist/contract/factory.d.ts.map +1 -1
  13. package/dist/contract/tool-view.d.ts +1 -1
  14. package/dist/contract/tool-view.d.ts.map +1 -1
  15. package/dist/contract/transports.d.ts +5 -0
  16. package/dist/contract/transports.d.ts.map +1 -0
  17. package/dist/entrypoints/agent-runtime/coding-tools.js +9 -8
  18. package/dist/entrypoints/agent-runtime/harness.js +9 -8
  19. package/dist/entrypoints/agent-runtime/realtime.js +3 -3
  20. package/dist/entrypoints/agent-runtime/sandbox.js +10 -9
  21. package/dist/entrypoints/agent-runtime/sqlite/bun.js +12 -11
  22. package/dist/entrypoints/agent-runtime/sqlite/node.js +12 -11
  23. package/dist/entrypoints/agent-runtime/testing.js +12 -11
  24. package/dist/entrypoints/agent-runtime.js +22 -19
  25. package/dist/entrypoints/application/diagnostic-journal.js +3 -3
  26. package/dist/entrypoints/application/directory-inbox.js +4 -4
  27. package/dist/entrypoints/application/opentelemetry.js +1 -1
  28. package/dist/entrypoints/application.js +10 -10
  29. package/dist/entrypoints/cli/publish.js +4 -4
  30. package/dist/entrypoints/cli.js +13 -12
  31. package/dist/entrypoints/contract.d.ts +1 -1
  32. package/dist/entrypoints/contract.d.ts.map +1 -1
  33. package/dist/entrypoints/contract.js +6 -4
  34. package/dist/entrypoints/files.js +3 -3
  35. package/dist/entrypoints/geo/contract.d.ts +7 -0
  36. package/dist/entrypoints/geo/contract.d.ts.map +1 -0
  37. package/dist/entrypoints/geo/contract.js +6 -0
  38. package/dist/entrypoints/geo.js +60 -23
  39. package/dist/entrypoints/http.js +3 -3
  40. package/dist/entrypoints/index.js +9 -7
  41. package/dist/entrypoints/live.js +1 -1
  42. package/dist/entrypoints/node.js +7 -6
  43. package/dist/entrypoints/primitives.js +1 -1
  44. package/dist/entrypoints/process/owner-loss.js +1 -1
  45. package/dist/entrypoints/process.js +3 -3
  46. package/dist/entrypoints/react.js +1 -1
  47. package/dist/entrypoints/remote.js +4 -3
  48. package/dist/entrypoints/server.js +16 -15
  49. package/dist/entrypoints/telegram/screens.js +5 -5
  50. package/dist/entrypoints/telegram.js +7 -7
  51. package/dist/entrypoints/testing.js +7 -6
  52. package/dist/entrypoints/tools/agent.d.ts +9 -0
  53. package/dist/entrypoints/tools/agent.d.ts.map +1 -0
  54. package/dist/entrypoints/tools/agent.js +16 -0
  55. package/dist/entrypoints/tools/connections.js +7 -6
  56. package/dist/entrypoints/tools/contract.js +1 -1
  57. package/dist/entrypoints/tools/invoker.js +5 -4
  58. package/dist/entrypoints/tools/mcp.js +110 -9
  59. package/dist/entrypoints/tools/toolkit.d.ts +9 -0
  60. package/dist/entrypoints/tools/toolkit.d.ts.map +1 -0
  61. package/dist/entrypoints/tools/toolkit.js +40 -0
  62. package/dist/entrypoints/tools.d.ts +0 -10
  63. package/dist/entrypoints/tools.d.ts.map +1 -1
  64. package/dist/entrypoints/tools.js +38 -80
  65. package/dist/entrypoints/tracking/contract.js +5 -3
  66. package/dist/entrypoints/tracking/performance.js +3 -3
  67. package/dist/entrypoints/tracking.d.ts +1 -1
  68. package/dist/entrypoints/tracking.d.ts.map +1 -1
  69. package/dist/entrypoints/tracking.js +63 -83
  70. package/dist/entrypoints/xlsx.js +1 -1
  71. package/dist/geo/index.d.ts +2 -1
  72. package/dist/geo/index.d.ts.map +1 -1
  73. package/dist/geo/record.d.ts +8 -0
  74. package/dist/geo/record.d.ts.map +1 -0
  75. package/dist/geo/resolver.d.ts +1 -3
  76. package/dist/geo/resolver.d.ts.map +1 -1
  77. package/dist/geo/schema.d.ts +44 -0
  78. package/dist/geo/schema.d.ts.map +1 -0
  79. package/dist/geo/types.d.ts +2 -13
  80. package/dist/geo/types.d.ts.map +1 -1
  81. package/dist/{index-n5sv4z0w.js → index-0qyrcjfs.js} +16 -18
  82. package/dist/index-1psbyyhj.js +21 -0
  83. package/dist/{index-tsngj2b5.js → index-2fc1k9k2.js} +206 -206
  84. package/dist/index-3prvb42w.js +30 -0
  85. package/dist/{index-073nw9qr.js → index-3yb5kft5.js} +524 -522
  86. package/dist/{index-d9hq291n.js → index-4jpykzvw.js} +70 -81
  87. package/dist/index-568w258r.js +76 -0
  88. package/dist/index-69t14s4a.js +39 -0
  89. package/dist/{index-dky0dcmf.js → index-72r9k0av.js} +6 -2
  90. package/dist/{index-6p3frkv5.js → index-7zwtbak8.js} +9 -50
  91. package/dist/{index-90p34rts.js → index-8ryydawp.js} +7 -5
  92. package/dist/{index-vv1sch8a.js → index-8vzh5wpv.js} +13 -8
  93. package/dist/{index-75ns2ybj.js → index-8xyf8h2k.js} +1 -1
  94. package/dist/{index-xx1j310k.js → index-8yxgcyt6.js} +171 -169
  95. package/dist/{index-p6apg0jg.js → index-9frf01t9.js} +16 -9
  96. package/dist/{index-q0th8q0z.js → index-9mjrnqxs.js} +1 -3
  97. package/dist/{index-6f49krb5.js → index-aa50qwv4.js} +1 -1
  98. package/dist/{index-ega3yz4c.js → index-aqwg2dm5.js} +1 -1
  99. package/dist/{index-p0rf7sq9.js → index-bgcwxhxh.js} +225 -223
  100. package/dist/index-bph35vpy.js +77 -0
  101. package/dist/{index-tdpmfks8.js → index-bz479f0x.js} +1 -1
  102. package/dist/index-d3xdyjt6.js +38 -0
  103. package/dist/{index-q968hy6y.js → index-e452syyh.js} +1 -1
  104. package/dist/{index-86nbfysb.js → index-ff39f9dr.js} +3 -3
  105. package/dist/index-h1j71dr1.js +48 -0
  106. package/dist/{index-mgb7r8b8.js → index-jswst0h3.js} +1 -1
  107. package/dist/{index-095ya5hm.js → index-knmnj11j.js} +22 -191
  108. package/dist/{index-vwhrnp67.js → index-kz9734jc.js} +3 -3
  109. package/dist/{index-txg1npmg.js → index-mtwh9hyp.js} +1 -1
  110. package/dist/{index-dr3t5n1v.js → index-nn9qvkww.js} +46 -46
  111. package/dist/{index-ghtpfz4z.js → index-nyyam9ce.js} +2 -2
  112. package/dist/{index-qezhmp51.js → index-nz06qw5a.js} +3 -1
  113. package/dist/{index-1bx1xv1k.js → index-pfvde2fz.js} +5 -2
  114. package/dist/{index-w7jq3fz9.js → index-pq2m7t46.js} +1142 -1212
  115. package/dist/{index-yk4g8805.js → index-pq7rkwkk.js} +1 -30
  116. package/dist/{index-s80awwsw.js → index-qch1vcaa.js} +3 -1
  117. package/dist/{index-hdjmdwsj.js → index-qctbzmg9.js} +521 -511
  118. package/dist/{index-n8z3rvzw.js → index-qevqn3d3.js} +3 -5
  119. package/dist/{index-nqxrm176.js → index-r3db01kh.js} +1 -1
  120. package/dist/{index-v6vb5qx8.js → index-s3yxw6kt.js} +1 -1
  121. package/dist/{index-cqmqyjax.js → index-sa99p98w.js} +1 -1
  122. package/dist/index-sb9dr3tq.js +14 -0
  123. package/dist/{index-0gxvns6s.js → index-sba3e6m4.js} +1 -0
  124. package/dist/{index-f24bdt13.js → index-v1swr26p.js} +3 -1
  125. package/dist/{index-rhzkndr5.js → index-x4p3kw1p.js} +533 -530
  126. package/dist/{index-cycp3r3e.js → index-yb9n4pgj.js} +2 -2
  127. package/dist/{index-htxh46ej.js → index-ycqhyars.js} +2 -2
  128. package/dist/{index-9bwcthxw.js → index-yj6saztf.js} +31 -13
  129. package/dist/{index-f6m4c545.js → index-zrdcmg6j.js} +4 -6
  130. package/dist/{index-tvtacc9a.js → index-zyc64nbh.js} +1 -34
  131. package/dist/process/bun-child.d.ts +3 -2
  132. package/dist/process/bun-child.d.ts.map +1 -1
  133. package/dist/server/contract-method.d.ts.map +1 -1
  134. package/dist/tools/internal/surface-projector.d.ts.map +1 -1
  135. package/dist/tools/operations/async-operation-canonical-types.d.ts +1 -1
  136. package/dist/tracking/attribution.d.ts +21 -25
  137. package/dist/tracking/attribution.d.ts.map +1 -1
  138. package/dist/tracking/client-visit.d.ts +5 -7
  139. package/dist/tracking/client-visit.d.ts.map +1 -1
  140. package/dist/tracking/client.d.ts +2 -2
  141. package/dist/tracking/client.d.ts.map +1 -1
  142. package/dist/tracking/contract.d.ts +1 -1
  143. package/dist/tracking/host.d.ts +0 -1
  144. package/dist/tracking/host.d.ts.map +1 -1
  145. package/dist/tracking/privacy.d.ts +6 -0
  146. package/dist/tracking/privacy.d.ts.map +1 -1
  147. package/dist/tracking/schemas.d.ts +2 -2
  148. package/dist/tracking/schemas.d.ts.map +1 -1
  149. package/llms/agent-runtime-harness.txt +4 -3
  150. package/llms/agent-runtime-sandbox.txt +1 -1
  151. package/llms/agent-runtime.2.txt +3 -2
  152. package/llms/agent-runtime.3.txt +4 -46
  153. package/llms/agent-runtime.4.txt +113 -0
  154. package/llms/agent-runtime.txt +11 -13
  155. package/llms/cli.txt +1 -1
  156. package/llms/contract.txt +46 -24
  157. package/llms/geo-contract.txt +23 -0
  158. package/llms/geo.txt +40 -4
  159. package/llms/stitchkit.txt +16 -9
  160. package/llms/testing.txt +4 -6
  161. package/llms/tools-agent.txt +24 -0
  162. package/llms/tools-mcp.txt +71 -6
  163. package/llms/tools-toolkit.txt +23 -0
  164. package/llms/tools.2.txt +8 -5
  165. package/llms/tools.3.txt +9 -78
  166. package/llms/tools.txt +8 -8
  167. package/llms/tracking-contract.txt +1 -1
  168. package/llms/tracking.txt +27 -5
  169. package/llms/{upgrading-0.105.0-0.118.0.txt → upgrading-0.106.0-0.120.0.txt} +152 -410
  170. package/llms/upgrading-0.37.0-0.53.0.txt +969 -0
  171. package/llms/{upgrading-0.44.0-0.62.0.txt → upgrading-0.55.0-0.68.0.txt} +509 -528
  172. package/llms/{upgrading-0.63.0-0.83.0.txt → upgrading-0.69.0-0.95.0.txt} +506 -509
  173. package/llms/{upgrading-0.84.0-0.104.0.txt → upgrading-0.96.0-0.105.0.txt} +410 -506
  174. package/llms/upgrading.txt +5 -5
  175. package/llms-full.txt +475 -154
  176. package/llms.txt +17 -14
  177. package/package.json +32 -20
  178. package/llms/upgrading-0.37.0-0.44.0.txt +0 -444
  179. package/dist/{index-arjmb6de.js → index-1jwsfkfz.js} +0 -0
  180. package/dist/{index-qndsr7f0.js → index-5efrpfmj.js} +3 -3
@@ -1,6 +1,11 @@
1
1
  import {
2
2
  resolveRouteParamsSchema
3
3
  } from "./index-m38ej7e5.js";
4
+ import {
5
+ TOOL_TRANSPORTS2,
6
+ isHttpOnlyEndpoint,
7
+ assertEndpointExposure
8
+ } from "./index-69t14s4a.js";
4
9
  import {
5
10
  isUnsafeKey
6
11
  } from "./index-zsarb5xp.js";
@@ -11,71 +16,10 @@ import {
11
16
  isRecord
12
17
  } from "./index-9jfdm5tg.js";
13
18
 
14
- // src/contract/tool-view.ts
15
- import { z } from "zod";
16
- var DECLARED_TOOL_VIEW = Symbol.for("stitchkit.toolView");
17
- function withToolView2(endpoint, view) {
18
- const declared = { ...view, [DECLARED_TOOL_VIEW]: true };
19
- return { ...endpoint, tool: { ...endpoint.tool, view: declared } };
20
- }
21
- function objectKeys(schema) {
22
- return schema instanceof z.ZodObject ? new Set(Object.keys(schema.shape)) : new Set;
23
- }
24
- function assertToolView(prefix, key, ep) {
25
- const where = `Contract "${prefix}": endpoint "${key}" tool.view`;
26
- const tool = Reflect.get(ep, "tool");
27
- const view = isRecord(tool) ? tool.view : undefined;
28
- if (!isRecord(view))
29
- throw new Error(`${where} must be an object`);
30
- if (Reflect.get(view, DECLARED_TOOL_VIEW) !== true) {
31
- throw new Error(`${where} must be declared with withToolView, which types its project`);
32
- }
33
- if (ep.rawResponse || ep.rawBody || ep.multipart || "responseMeta" in ep || "stream" in ep) {
34
- throw new Error(`${where} is only for a JSON tool endpoint — this one is HTTP-only by kind`);
35
- }
36
- if (!ep.output) {
37
- throw new Error(`${where} needs the endpoint's full output — the view is derived from it`);
38
- }
39
- const output = view.output;
40
- const project = view.project;
41
- if (output !== undefined && !(output instanceof z.ZodType)) {
42
- throw new Error(`${where}.output must be a Zod schema`);
43
- }
44
- if (project !== undefined && typeof project !== "function") {
45
- throw new Error(`${where}.project must be a function`);
46
- }
47
- const defaults = view.defaults;
48
- if (defaults !== undefined && !isRecord(defaults)) {
49
- throw new Error(`${where}.defaults must be an object`);
50
- }
51
- const entries = defaults === undefined ? [] : Object.entries(defaults);
52
- if (output === undefined && project === undefined && entries.length === 0) {
53
- throw new Error(`${where} declares no defaults, output or project — it would change nothing`);
54
- }
55
- if (entries.length === 0)
56
- return;
57
- if (!(ep.input instanceof z.ZodObject)) {
58
- throw new Error(`${where}.defaults needs an object input schema to name keys of`);
59
- }
60
- const inputKeys = objectKeys(ep.input);
61
- const paramKeys = objectKeys(ep.params);
62
- for (const [name, value] of entries) {
63
- if (paramKeys.has(name)) {
64
- throw new Error(`${where}.defaults.${name} is a path param — a route segment has no default`);
65
- }
66
- if (!inputKeys.has(name)) {
67
- throw new Error(`${where}.defaults.${name} is not a key of the endpoint's input`);
68
- }
69
- const field = ep.input.shape[name];
70
- if (field === undefined || !z.safeParse(field, value).success) {
71
- throw new Error(`${where}.defaults.${name} is not a valid value for that input key`);
72
- }
73
- }
74
- }
75
-
76
19
  // src/contract/define-validation.ts
77
20
  function assertMultipartEndpoint(prefix, key, ep) {
78
21
  const where = `Contract "${prefix}": multipart endpoint "${key}"`;
22
+ assertNoToolOptions(where, ep);
79
23
  if (ep.method !== "POST" && ep.method !== "PUT" && ep.method !== "PATCH") {
80
24
  throw new Error(`${where} must use POST, PUT or PATCH`);
81
25
  }
@@ -113,10 +57,6 @@ function assertRawEndpoint(prefix, key, ep) {
113
57
  if (ep.output)
114
58
  throw new Error(`${where} cannot declare an output schema`);
115
59
  assertNoToolOptions(where, ep);
116
- const nonHttp = (ep.expose ?? []).filter((t) => t !== "HTTP");
117
- if (nonHttp.length > 0) {
118
- throw new Error(`${where} is HTTP-only — remove ${nonHttp.join(", ")} from expose`);
119
- }
120
60
  }
121
61
  function assertStreamingResponseEndpoint(prefix, key, ep) {
122
62
  const where = `Contract "${prefix}": streaming endpoint "${key}"`;
@@ -153,10 +93,6 @@ function assertStreamingResponseEndpoint(prefix, key, ep) {
153
93
  if (ep.multipart)
154
94
  throw new Error(`${where} cannot be multipart`);
155
95
  assertNoToolOptions(where, ep);
156
- const nonHttp = (ep.expose ?? []).filter((transport) => transport !== "HTTP");
157
- if (nonHttp.length > 0) {
158
- throw new Error(`${where} is HTTP-only — remove ${nonHttp.join(", ")} from expose`);
159
- }
160
96
  }
161
97
  var UNGROUPED_TOOL_OPTIONS = {
162
98
  toolName: "tool.name",
@@ -214,10 +150,6 @@ function assertRawBodyEndpoint(prefix, key, ep) {
214
150
  throw new Error(`${where} must use POST, PUT or PATCH`);
215
151
  }
216
152
  assertNoToolOptions(where, ep);
217
- const nonHttp = (ep.expose ?? []).filter((transport) => transport !== "HTTP");
218
- if (nonHttp.length > 0) {
219
- throw new Error(`${where} is HTTP-only — remove ${nonHttp.join(", ")} from expose`);
220
- }
221
153
  }
222
154
  function assertSafelistedBodyEndpoint(prefix, key, ep) {
223
155
  const where = `Contract "${prefix}": safelistedBody endpoint "${key}"`;
@@ -245,15 +177,71 @@ function assertResponseMetaEndpoint(prefix, key, ep) {
245
177
  if (ep.rawResponse)
246
178
  throw new Error(`${where} cannot also be a rawResponse endpoint`);
247
179
  assertNoToolOptions(where, ep);
248
- const nonHttp = (ep.expose ?? []).filter((transport) => transport !== "HTTP");
249
- if (nonHttp.length > 0) {
250
- throw new Error(`${where} is HTTP-only — remove ${nonHttp.join(", ")} from expose`);
180
+ }
181
+
182
+ // src/contract/tool-view.ts
183
+ import { z } from "zod";
184
+ var DECLARED_TOOL_VIEW = Symbol.for("stitchkit.toolView");
185
+ function withToolView2(endpoint, view) {
186
+ const declared = { ...view, [DECLARED_TOOL_VIEW]: true };
187
+ return { ...endpoint, tool: { ...endpoint.tool, view: declared } };
188
+ }
189
+ function objectKeys(schema) {
190
+ return schema instanceof z.ZodObject ? new Set(Object.keys(schema.shape)) : new Set;
191
+ }
192
+ function assertToolView(prefix, key, ep) {
193
+ const where = `Contract "${prefix}": endpoint "${key}" tool.view`;
194
+ const tool = Reflect.get(ep, "tool");
195
+ const view = isRecord(tool) ? tool.view : undefined;
196
+ if (!isRecord(view))
197
+ throw new Error(`${where} must be an object`);
198
+ if (Reflect.get(view, DECLARED_TOOL_VIEW) !== true) {
199
+ throw new Error(`${where} must be declared with withToolView, which types its project`);
200
+ }
201
+ if (isHttpOnlyEndpoint(ep)) {
202
+ throw new Error(`${where} is only for a JSON tool endpoint — this one is HTTP-only by kind`);
203
+ }
204
+ if (!ep.output) {
205
+ throw new Error(`${where} needs the endpoint's full output — the view is derived from it`);
206
+ }
207
+ const output = view.output;
208
+ const project = view.project;
209
+ if (output !== undefined && !(output instanceof z.ZodType)) {
210
+ throw new Error(`${where}.output must be a Zod schema`);
211
+ }
212
+ if (project !== undefined && typeof project !== "function") {
213
+ throw new Error(`${where}.project must be a function`);
214
+ }
215
+ const defaults = view.defaults;
216
+ if (defaults !== undefined && !isRecord(defaults)) {
217
+ throw new Error(`${where}.defaults must be an object`);
218
+ }
219
+ const entries = defaults === undefined ? [] : Object.entries(defaults);
220
+ if (output === undefined && project === undefined && entries.length === 0) {
221
+ throw new Error(`${where} declares no defaults, output or project — it would change nothing`);
222
+ }
223
+ if (entries.length === 0)
224
+ return;
225
+ if (!(ep.input instanceof z.ZodObject)) {
226
+ throw new Error(`${where}.defaults needs an object input schema to name keys of`);
227
+ }
228
+ const inputKeys = objectKeys(ep.input);
229
+ const paramKeys = objectKeys(ep.params);
230
+ for (const [name, value] of entries) {
231
+ if (paramKeys.has(name)) {
232
+ throw new Error(`${where}.defaults.${name} is a path param — a route segment has no default`);
233
+ }
234
+ if (!inputKeys.has(name)) {
235
+ throw new Error(`${where}.defaults.${name} is not a key of the endpoint's input`);
236
+ }
237
+ const field = ep.input.shape[name];
238
+ if (field === undefined || !z.safeParse(field, value).success) {
239
+ throw new Error(`${where}.defaults.${name} is not a valid value for that input key`);
240
+ }
251
241
  }
252
242
  }
253
243
 
254
244
  // src/contract/define.ts
255
- var ALL_TRANSPORTS2 = ["HTTP", "MCP", "AGENT", "CLI"];
256
- var TOOL_TRANSPORTS2 = ["MCP", "AGENT", "CLI"];
257
245
  function defineContract2(meta, endpoints) {
258
246
  const materializedEndpoints = {};
259
247
  for (const [key, endpoint] of Object.entries(endpoints)) {
@@ -262,6 +250,7 @@ function defineContract2(meta, endpoints) {
262
250
  }
263
251
  const toolTransports = new Map;
264
252
  for (const [key, ep] of Object.entries(materializedEndpoints)) {
253
+ assertEndpointExposure(meta.prefix, key, ep);
265
254
  if (ep.desc.trim() === "") {
266
255
  throw new Error(`Contract "${meta.prefix}": endpoint "${key}" has an empty desc`);
267
256
  }
@@ -289,7 +278,7 @@ function defineContract2(meta, endpoints) {
289
278
  }
290
279
  const transports = new Set(ep.expose ? ep.expose.filter((t) => t !== "HTTP") : ["MCP", "AGENT"]);
291
280
  if (transports.size === 0) {
292
- throw new Error(`Contract "${meta.prefix}": endpoint "${key}" sets tool options but is not exposed on any tool transport (${TOOL_TRANSPORTS2.join(" / ")}) — a contract factory with toolExposure 'explicit' makes an omitted expose HTTP-only`);
281
+ throw new Error(`Contract "${meta.prefix}": endpoint "${key}" sets tool options but is not exposed on any tool transport (${TOOL_TRANSPORTS2.join(" / ")}) — add a tool transport to expose or the factory default`);
293
282
  }
294
283
  if (tool.view !== undefined)
295
284
  assertToolView(meta.prefix, key, ep);
@@ -310,4 +299,4 @@ function defineContract2(meta, endpoints) {
310
299
  return { meta, endpoints: materializedEndpoints };
311
300
  }
312
301
 
313
- export { withToolView2, ALL_TRANSPORTS2, TOOL_TRANSPORTS2, defineContract2 };
302
+ export { withToolView2, defineContract2 };
@@ -0,0 +1,76 @@
1
+ import {
2
+ DEFAULT_CORS_ALLOW_HEADERS2
3
+ } from "./index-pq7rkwkk.js";
4
+
5
+ // src/server/oauth/metadata.ts
6
+ var PROTECTED_RESOURCE_PATH2 = "/.well-known/oauth-protected-resource";
7
+ function metadataPath(resource) {
8
+ const { pathname } = new URL(resource);
9
+ return pathname === "/" ? PROTECTED_RESOURCE_PATH2 : `${PROTECTED_RESOURCE_PATH2}${pathname}`;
10
+ }
11
+ function protectedResourceMetadataUrl2(resource) {
12
+ return `${new URL(resource).origin}${metadataPath(resource)}`;
13
+ }
14
+ function wwwAuthenticateHeader2(resource) {
15
+ return `Bearer resource_metadata="${protectedResourceMetadataUrl2(resource)}"`;
16
+ }
17
+ var PUBLIC_CORS = {
18
+ "Access-Control-Allow-Origin": "*",
19
+ "Access-Control-Allow-Methods": "GET, OPTIONS",
20
+ "Access-Control-Allow-Headers": DEFAULT_CORS_ALLOW_HEADERS2
21
+ };
22
+ function oauthProtectedResourceRoute2(config) {
23
+ const body = JSON.stringify({
24
+ resource: config.resource,
25
+ authorization_servers: config.authorizationServers,
26
+ ...config.scopesSupported && { scopes_supported: config.scopesSupported },
27
+ bearer_methods_supported: ["header"]
28
+ });
29
+ return {
30
+ method: "ALL",
31
+ path: metadataPath(config.resource),
32
+ handler: (req) => {
33
+ if (req.method === "OPTIONS")
34
+ return new Response(null, { status: 204, headers: PUBLIC_CORS });
35
+ if (req.method !== "GET")
36
+ return new Response("Method Not Allowed", { status: 405 });
37
+ return new Response(body, {
38
+ status: 200,
39
+ headers: { "Content-Type": "application/json", ...PUBLIC_CORS }
40
+ });
41
+ }
42
+ };
43
+ }
44
+
45
+ // src/tools/mcp/progress.ts
46
+ function mcpProgressToken(context) {
47
+ const token = context.mcpReq._meta?.progressToken;
48
+ return typeof token === "string" || typeof token === "number" ? token : undefined;
49
+ }
50
+ function createMcpProgressReporter(context) {
51
+ const token = mcpProgressToken(context);
52
+ if (token === undefined)
53
+ return async () => {
54
+ return;
55
+ };
56
+ let sent = 0;
57
+ let highWater = 0;
58
+ return async (update) => {
59
+ sent += 1;
60
+ const value = update.progress ?? Math.max(sent, highWater + 1);
61
+ highWater = Math.max(highWater, value);
62
+ try {
63
+ await context.mcpReq.notify({
64
+ method: "notifications/progress",
65
+ params: {
66
+ progressToken: token,
67
+ progress: value,
68
+ ...update.total !== undefined && { total: update.total },
69
+ ...update.message !== undefined && { message: update.message }
70
+ }
71
+ });
72
+ } catch {}
73
+ };
74
+ }
75
+
76
+ export { PROTECTED_RESOURCE_PATH2, protectedResourceMetadataUrl2, wwwAuthenticateHeader2, oauthProtectedResourceRoute2, mcpProgressToken, createMcpProgressReporter };
@@ -0,0 +1,39 @@
1
+ // src/contract/endpoint-capabilities.ts
2
+ import { z } from "zod";
3
+
4
+ // src/contract/transports.ts
5
+ var ALL_TRANSPORTS2 = ["HTTP", "MCP", "AGENT", "CLI"];
6
+ var TOOL_TRANSPORTS2 = ["MCP", "AGENT", "CLI"];
7
+
8
+ // src/contract/endpoint-capabilities.ts
9
+ var HTTP_ONLY_FEATURES = [
10
+ "rawResponse",
11
+ "rawBody",
12
+ "responseMeta",
13
+ "multipart",
14
+ "stream"
15
+ ];
16
+ var HTTP_ONLY_EXPOSURE = Object.freeze(["HTTP"]);
17
+ var ExposureSchema = z.array(z.enum(ALL_TRANSPORTS2)).refine((transports) => new Set(transports).size === transports.length, {
18
+ message: "Each transport appears at most once"
19
+ }).readonly();
20
+ function isHttpOnlyEndpoint(endpoint) {
21
+ return endpoint.method === "HEAD" || HTTP_ONLY_FEATURES.some((feature) => Boolean(endpoint[feature]));
22
+ }
23
+ function assertEndpointExposure(prefix, key, endpoint) {
24
+ if (endpoint.expose === undefined)
25
+ return;
26
+ const exposure = ExposureSchema.safeParse(endpoint.expose);
27
+ const where = `Contract "${prefix}": endpoint "${key}"`;
28
+ if (!exposure.success) {
29
+ throw new Error(`${where} expose must be an array of distinct transports: ${ALL_TRANSPORTS2.join(" / ")}`);
30
+ }
31
+ if (isHttpOnlyEndpoint(endpoint)) {
32
+ const unsupported = exposure.data.filter((transport) => transport !== "HTTP");
33
+ if (unsupported.length > 0) {
34
+ throw new Error(`${where} is HTTP-only — remove ${unsupported.join(", ")} from expose`);
35
+ }
36
+ }
37
+ }
38
+
39
+ export { ALL_TRANSPORTS2, TOOL_TRANSPORTS2, HTTP_ONLY_EXPOSURE, ExposureSchema, isHttpOnlyEndpoint, assertEndpointExposure };
@@ -2,6 +2,12 @@ import {
2
2
  isRecord
3
3
  } from "./index-9jfdm5tg.js";
4
4
 
5
+ // src/application/diagnostic-journal-contract.ts
6
+ import { z as z3 } from "zod";
7
+
8
+ // src/application/diagnostic-journal-read-contract.ts
9
+ import { z as z2 } from "zod";
10
+
5
11
  // src/application/diagnostic-journal-frame.ts
6
12
  import { z } from "zod";
7
13
  var DiagnosticJournalFrameSchema2 = z.object({
@@ -12,7 +18,6 @@ var DiagnosticJournalFrameSchema2 = z.object({
12
18
  }).strict().readonly();
13
19
 
14
20
  // src/application/diagnostic-journal-read-contract.ts
15
- import { z as z2 } from "zod";
16
21
  var ByteCountSchema = z2.number().int().nonnegative();
17
22
  var LocationSchema = z2.object({
18
23
  file: z2.string(),
@@ -88,7 +93,6 @@ class DiagnosticJournalRecoveryError2 extends Error {
88
93
  }
89
94
 
90
95
  // src/application/diagnostic-journal-contract.ts
91
- import { z as z3 } from "zod";
92
96
  var PositiveSafeIntegerSchema = z3.number().int().positive();
93
97
  var FileModeSchema = z3.number().int().min(0).max(511);
94
98
  var DiagnosticJournalLimitsSchema2 = z3.object({
@@ -2,21 +2,23 @@ import {
2
2
  toolResultFromError,
3
3
  toolCauseFromResult,
4
4
  isToolExecutionControlError2
5
- } from "./index-v6vb5qx8.js";
5
+ } from "./index-s3yxw6kt.js";
6
6
  import {
7
7
  createToolRunner,
8
8
  formatToolError
9
- } from "./index-htxh46ej.js";
9
+ } from "./index-ycqhyars.js";
10
10
  import {
11
- AgentToolError2,
12
11
  resolveToolDurability
13
- } from "./index-tvtacc9a.js";
12
+ } from "./index-sb9dr3tq.js";
13
+ import {
14
+ AgentToolError2
15
+ } from "./index-1psbyyhj.js";
14
16
  import {
15
17
  collectToolSurface
16
- } from "./index-86nbfysb.js";
18
+ } from "./index-ff39f9dr.js";
17
19
  import {
18
20
  agentPresenterOf
19
- } from "./index-ega3yz4c.js";
21
+ } from "./index-aqwg2dm5.js";
20
22
  import {
21
23
  isRecord
22
24
  } from "./index-9jfdm5tg.js";
@@ -111,47 +113,4 @@ function mountAgent2(services, config = {}) {
111
113
  return tools;
112
114
  }
113
115
 
114
- // src/tools/manifest.ts
115
- function utf8Length(value) {
116
- return new TextEncoder().encode(JSON.stringify(value)).byteLength;
117
- }
118
- function describeToolCatalog2(config) {
119
- const deferred = new Set(config.deferredNames ?? []);
120
- const entries = collectToolSurface({
121
- surface: config,
122
- transport: config.transport,
123
- extend: config.extend,
124
- flattenUnionInput: config.flattenUnionInput
125
- }).map(({ kind, service, action, mountable }) => {
126
- const schemaBytes = utf8Length(mountable.presentationSchema);
127
- return {
128
- name: mountable.name,
129
- description: mountable.method.desc,
130
- inputSchema: mountable.presentationSchema,
131
- source: { kind, service, action },
132
- schemaBytes,
133
- deferred: deferred.has(mountable.name)
134
- };
135
- });
136
- if (config.maxSchemaBytes !== undefined) {
137
- const total = entries.reduce((sum, entry) => sum + entry.schemaBytes, 0);
138
- if (total > config.maxSchemaBytes) {
139
- throw new TypeError(`Tool catalog schemas use ${total} bytes, exceeding maxSchemaBytes ${config.maxSchemaBytes}`);
140
- }
141
- }
142
- return entries;
143
- }
144
- function buildToolManifest2(config) {
145
- return collectToolSurface({
146
- surface: config,
147
- transport: config.transport,
148
- extend: config.extend,
149
- flattenUnionInput: config.flattenUnionInput
150
- }).map(({ mountable }) => ({
151
- name: mountable.name,
152
- description: mountable.method.desc,
153
- inputSchema: mountable.presentationSchema
154
- }));
155
- }
156
-
157
- export { mountAgent2, describeToolCatalog2, buildToolManifest2 };
116
+ export { mountAgent2 };
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  withSignalDeadline
3
3
  } from "./index-9tqbxv5p.js";
4
+ import {
5
+ writeFileAtomicSync2
6
+ } from "./index-ac6vvm30.js";
4
7
  import {
5
8
  fetchGuarded,
6
9
  PrivateAddressRefusal,
7
10
  readCapped
8
- } from "./index-mgb7r8b8.js";
9
- import {
10
- writeFileAtomicSync2
11
- } from "./index-ac6vvm30.js";
11
+ } from "./index-jswst0h3.js";
12
12
  import {
13
13
  raceAbort
14
14
  } from "./index-b0kddvzw.js";
@@ -19,6 +19,9 @@ import {
19
19
  serializeCanonicalJson
20
20
  } from "./index-zsvzhjtk.js";
21
21
 
22
+ // src/tools/cli/manifest.ts
23
+ import { z as z2 } from "zod";
24
+
22
25
  // src/tools/cli/signature.ts
23
26
  import {
24
27
  createPrivateKey,
@@ -87,7 +90,6 @@ function cliSignatureAccepted2(verdict) {
87
90
  }
88
91
 
89
92
  // src/tools/cli/manifest.ts
90
- import { z as z2 } from "zod";
91
93
  var CliBuildTargetSchema2 = z2.object({
92
94
  platform: z2.string().min(1),
93
95
  arch: z2.string().min(1)
@@ -1,10 +1,3 @@
1
- // src/tracking/beacon.ts
2
- function sendUnloadBeacon2(url, body, sender = typeof navigator === "undefined" ? undefined : navigator) {
3
- if (!sender || typeof sender.sendBeacon !== "function")
4
- return false;
5
- return sender.sendBeacon(url, body);
6
- }
7
-
8
1
  // src/tracking/privacy.ts
9
2
  var MASK = "[masked]";
10
3
  var MAX_REDACTED_CHARS = 16384;
@@ -77,6 +70,11 @@ function redactTrackingText2(input) {
77
70
  }
78
71
  }).replace(ASSIGNMENT, (whole, prefix, key, assignment) => isSecretField(key.replace(/^["']|["']$/g, "")) ? `${prefix}${key}${assignment}${MASK}` : whole);
79
72
  }
73
+ function maskTrackingParameters(input, names) {
74
+ if (names.size === 0)
75
+ return input;
76
+ return input.replace(PARAMETER, (whole, separator, key) => names.has(decodeKey(key)) ? `${separator}${key}=${MASK}` : whole);
77
+ }
80
78
  function redactTrackingValue2(value) {
81
79
  if (typeof value === "string")
82
80
  return redactTrackingText2(value);
@@ -91,4 +89,11 @@ function redactTrackingValue2(value) {
91
89
  return value;
92
90
  }
93
91
 
94
- export { sendUnloadBeacon2, redactTrackingText2, redactTrackingValue2 };
92
+ // src/tracking/beacon.ts
93
+ function sendUnloadBeacon2(url, body, sender = typeof navigator === "undefined" ? undefined : navigator) {
94
+ if (!sender || typeof sender.sendBeacon !== "function")
95
+ return false;
96
+ return sender.sendBeacon(url, body);
97
+ }
98
+
99
+ export { redactTrackingText2, maskTrackingParameters, redactTrackingValue2, sendUnloadBeacon2 };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  withExclusiveLock2
3
- } from "./index-nqxrm176.js";
3
+ } from "./index-r3db01kh.js";
4
4
  import {
5
5
  readBoundedFile
6
6
  } from "./index-m616f0yz.js";