@ts-pf/mcp 0.0.0 → 0.2.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/README.md CHANGED
@@ -8,7 +8,7 @@ Three entries:
8
8
 
9
9
  - `@ts-pf/mcp/meta`: `mcp({ effect, description, aliases })`, dependency-free, safe in contract files.
10
10
  - `@ts-pf/mcp`: the toolkit (`createToolkit`, `all`, `bindTools`, `audit`). Depends on `@ts-pf/contract`, `@ts-pf/docs`, `@ts-pf/server`, `@ts-pf/protocol`.
11
- - `@ts-pf/mcp/sdk`: `createMcpFactory`, a per-request `McpServer` factory. Peer **`@modelcontextprotocol/server` >=2.4.0 <3**.
11
+ - `@ts-pf/mcp/sdk`: `createMcpFactory`, a per-request `McpServer` factory. Peer **`@modelcontextprotocol/server` >=2.3.0 <3**; keep one copy of it in the app (two copies break `createMcpHandler`'s `instanceof McpServer` check with an HTTP 500).
12
12
 
13
13
  ## One call
14
14
 
@@ -46,11 +46,11 @@ export const tools = bindTools(planetsMcp, { app, context: () => ({ db }) })
46
46
  export const factory = createMcpFactory(tools, { name: 'planets', version: '1.0.0' })
47
47
  ```
48
48
 
49
- Builder methods: `.describe(text)`, `.effect('read' | 'write' | 'destructive')`, `.inject({ key: fn })` (hidden from the model, filled per call), `.input(schema, map)` (a new model input; exclusive with `.inject`), `.output(map)` / `.output(schema, map)` (mappers get `{ context, info, call }`, `call` a typed client for joins; `outputSchema` and `structuredContent` only with a schema, and results are then checked), `.errors({ CODE: fn })`, `.examples([...])`. `tk.$tool({ description, effect, input, run })` is a composite tool over `call`.
49
+ Builder methods: `.describe(text)`, `.effect('read' | 'write' | 'destructive')`, `.inject({ key: fn })` (hidden from the model, filled per call), `.input(schema, map)` (a new model input; exclusive with `.inject`), `.output(map)` / `.output(schema, map)` (mappers get `{ context, info, call }`, `call` a typed client for joins; `outputSchema` and `structuredContent` only with a schema, and results are then checked), `.errors({ CODE: fn })`, `.examples([...])`, `.visible((info) => boolean)` (per-caller lists, below), `.scopes([...])` (OAuth step-up, below). `tk.$tool({ description, effect, input, run, visible?, scopes? })` is a composite tool over `call`.
50
50
 
51
- `all(node, { effect, tags, exclude, inject })` makes default tools for a node; each `inject` key goes only to tools whose input has it, and a typo or a type conflict is a compile error naming the field.
51
+ `all(node, { effect, tags, exclude, inject, visible, scopes })` makes default tools for a node; each `inject` key goes only to tools whose input has it, and a typo or a type conflict is a compile error naming the field. `tags` and `docs({ hidden: true })` filter in the types too when the contract writes them as literals (`docs({ tags: ['billing'] })`); a widened value (a `string[]` variable) keeps the tool in the type, and `$coverage` still checks at runtime.
52
52
 
53
- Large groups go behind a host: `tk.$host({ description, tools, split })` lists `get_<key>_query_capabilities` / `call_<key>_query_capability` (read) and `get_<key>_operations_capabilities` / `call_<key>_operations_capability` (write + destructive), or `get_<key>_capabilities` / `call_<key>_capability` with `split: false`. Discovery takes `{ query, category, names, detail, limit }` and ranks with BM25. Flat tools do best up to about 15 per toolset; `audit()` warns above that.
53
+ Large groups go behind a host: `tk.$host({ description, tools, split, visible? })` lists `get_<key>_query_capabilities` / `call_<key>_query_capability` (read) and `get_<key>_operations_capabilities` / `call_<key>_operations_capability` (write + destructive), or `get_<key>_capabilities` / `call_<key>_capability` with `split: false`. Discovery takes `{ query, category, names, detail, limit }` and ranks with BM25. Flat tools do best up to about 15 per toolset; `audit()` warns above that.
54
54
 
55
55
  ## Serve
56
56
 
@@ -88,6 +88,7 @@ const resourceServerUrl = new URL('https://api.example.com/mcp')
88
88
 
89
89
  // Your IdP's RFC 8414 metadata, re-served for clients that probe this origin.
90
90
  // Fetched once at startup (fails fast if the IdP is down); hardcode it if you prefer.
91
+ // An IdP that serves only OIDC discovery has it at /.well-known/openid-configuration.
91
92
  const oauthMetadata = (await (
92
93
  await fetch(`${issuer}/.well-known/oauth-authorization-server`)
93
94
  ).json()) as OAuthMetadata
@@ -166,16 +167,49 @@ export async function fetchHandler(request: Request): Promise<Response> {
166
167
  ```
167
168
 
168
169
  - With a toolkit, the same function goes on the binding: `bindTools(toolset, { app, context: (info) => … })`. `.inject()` and output mappers get both the mapped `context` and the raw `info.authInfo`.
169
- - A gateway that calls an upstream ts-pf API as the user builds a client per caller: `bindTools(toolset, { client: (info) => createClient(…) })`, with the token from `info.authInfo` (exchanged for an upstream one when your IdP requires it).
170
- - `context` can reject per tool (`info.tool`), for example when a scope is missing. The model gets the error as text; v1 does not answer it with a `403 insufficient_scope` step-up.
171
- - Every caller gets the same `tools/list`. Enforce roles and scopes in procedure middleware, not by hiding tools.
170
+ - A gateway that calls an upstream ts-pf API as the user builds a client per caller: `bindTools(toolset, { client: (info) => createClient(…) })`, with the token from `info.authInfo` (exchanged for an upstream one when your IdP requires it). The function runs once per tool call; mapper `call` shares that client. Upstream errors map as in-process ones: declared codes through `.errors()`, `VALIDATION` with the model-facing schema, anything else `INTERNAL`.
171
+ - `context` can reject per tool (`info.tool`); the model gets that error as text. To have the client ask the user for a missing scope instead, declare it with `.scopes()` (below).
172
+ - Enforce roles and scopes in procedure middleware. `.visible()` and `.scopes()` shape what the client shows and asks for; they are not the security boundary.
172
173
 
173
- `tools.list(info)` and `tools.call(name, args, info)` work without MCP, in tests or an agent framework. `McpCallInfo` is `{ authInfo?, requestInfo?, signal?, inputResponses?, era?, tool? }`; `tool` (`{ name, path }`) is set before `context` runs, so a project that wants tool-level tracing in interceptors copies it into its own context type.
174
+ ### Scope step-up
175
+
176
+ `tk.admin.purge.scopes(['admin'])` (also `all(node, { scopes })` and `$tool({ scopes })`) declares the OAuth scopes a tool needs. Over HTTP, when the verified token lacks one, the SDK answers `403 insufficient_scope` before the call runs, and the client re-authorizes and retries. The challenge lists the granted scopes plus the required ones, so re-consent keeps what the caller had, and `resource_metadata` comes from `authInfo.resourceMetadataUrl` (set by `requireBearerAuth({ resourceMetadataUrl })`; otherwise derived from `authInfo.resource`). A host's `call_*` challenges per inner tool, so one dispatch tool can front procedures with different scopes; an inner tool hidden from the caller is never challenged (it answers `Unknown capability`). No token means no challenge (that is the authentication gate's job); stdio has no OAuth and is never challenged, and `tools.call()` does not enforce scopes, so middleware still has to. Scopes come from the toolkit (`bindTools`, then `createMcpFactory(tools, …)`); `createMcpFactory(app, …)` declares none. A string that is not an OAuth scope token throws a `TypeError` when the tool is built. `await tools.scopesFor?.(name, args, info)` reports what a call needs.
177
+
178
+ ## Per-caller tool lists
179
+
180
+ ```ts
181
+ import { all, bindTools, createToolkit, type McpCallInfo } from '@ts-pf/mcp'
182
+ import { contract } from './contract.js'
183
+
184
+ const tk = createToolkit(contract)
185
+ const isAdmin = (info: McpCallInfo) => info.authInfo?.scopes.includes('admin') ?? false
186
+
187
+ export const planetsMcp = tk.$toolset({
188
+ tools: [
189
+ all(tk.planet, { exclude: [tk.planet.create] }),
190
+ { planet_create: tk.planet.create.visible(isAdmin) }, // only admins see it
191
+ ],
192
+ })
193
+ export const tools = bindTools(planetsMcp, { app, context: () => ({ db }) })
194
+ ```
195
+
196
+ `.visible(predicate)` (also `all(node, { visible })`, `$tool({ visible })`, and `$host({ visible })` for a whole host) shows a tool only to callers for whom the predicate is true. It gets `McpCallInfo` (`authInfo`, `requestInfo`, `era`), never `context`, and may be async. A hidden tool is left out of that caller's `tools/list` and is not registered on their `McpServer` (a call is `-32602`); `tools.call()` answers `Unknown tool "x"`. Inside a host, discovery, the `get_*` description, the `call_*` name list and annotations follow what the caller may see, and a bucket with nothing visible is not listed. Hide a tool or step up into it with `.scopes()`, not both. The `tools/list` cache hint is always `cacheScope: 'private'`; keep `listTtlMs` low when visibility depends on scopes that can change.
197
+
198
+ ## Calls, options, audit
199
+
200
+ `tools.list(info)` and `tools.call(name, args, info)` work without MCP, in tests or an agent framework. `McpTools` is `{ list, call, scopesFor? }` (`scopesFor` is async). `McpCallInfo` is `{ authInfo?, requestInfo?, signal?, inputResponses?, era?, tool? }`; `tool` (`{ name, path }`) is set before `context` runs, so a project that wants tool-level tracing in interceptors copies it into its own context type.
174
201
 
175
202
  Call pipeline options live on the executor: `bindTools(toolset, { app, context, interceptors?, onError?, maxResultChars? })` or `bindTools(toolset, { client, context?, onError?, maxResultChars? })` (`client` may be `(info) => client`; `context` is required when the toolkit's `$context<C>()` type has required keys). `createMcpFactory(app, …)` takes the same options plus `name`, `version`, `instructions`, `listTtlMs`. Unknown throws become `INTERNAL: Internal server error` and are logged with `console.error` unless `onError` is set, like `FetchHandler`. Text results are cut at `maxResultChars` (default 25,000).
176
203
 
177
204
  `audit(toolsets, { maxTools?, maxNameLength?, missingDescription? })` returns `AuditFinding[]` (`{ level, tool, message }`) for CI: missing descriptions (`missingDescription`, default `'error'`), unclassified tools, schema roots, more than `maxTools` (15) listed tools, and names over `maxNameLength` (60) characters or outside the MCP name charset.
178
205
 
206
+ ## Clients
207
+
208
+ Checked against MCP Inspector 2.12 (CLI, HTTP and stdio, both protocol eras) and Claude Code 2.1 (HTTP and stdio; it negotiates 2026-07-28). Tool lists, host tools, `structuredContent`, error text, truncation, OAuth sign-in, and scope step-up behave as described above. Client quirks worth knowing:
209
+
210
+ - The Inspector coerces arguments to the schema's type before sending (`"x"` for an integer becomes `null`), so the `VALIDATION` text reports the coerced value.
211
+ - Claude Code does not show annotations to the model or use `readOnlyHint` to skip permission prompts, and it cannot send a value of the wrong JSON type, so the model mostly sees range and format `VALIDATION` errors. It passes `structuredContent` to the model as text.
212
+
179
213
  ## API
180
214
 
181
215
  - `mcp`
package/dist/all.d.ts CHANGED
@@ -2,7 +2,7 @@ import type { DistOmit, FieldOf, KeysOfUnion, Meta } from './infer.js';
2
2
  import type { Effect } from './meta.js';
3
3
  import { type ToolName } from './names.js';
4
4
  import { type AnyNode, type NodeBrand, type NodeCtx } from './node.js';
5
- import { type AnyTool, type ToolBuilder } from './tool.js';
5
+ import { type AnyTool, type ToolBuilder, type Visibility } from './tool.js';
6
6
  import type { McpCallInfo } from './types.js';
7
7
  type LeafTools<N> = {
8
8
  [K in Exclude<keyof N, NodeBrand>]: N[K] extends AnyTool ? N[K] : LeafTools<N[K]>;
@@ -19,6 +19,22 @@ type ToolEffect<Tl> = Tl extends ToolBuilder<infer _T, infer P, infer _C, infer
19
19
  effect: infer E extends Effect;
20
20
  };
21
21
  } ? E : 'write' : 'write';
22
+ /** Typed `docs()` meta; `{}` when the procedure has none. */
23
+ type DocsOf<Tl> = Tl extends ToolBuilder<infer _T, infer P, infer _C, infer _Path, infer _S> ? Meta<P> extends {
24
+ docs: infer D;
25
+ } ? D : string extends keyof Meta<P> ? {
26
+ tags?: string[];
27
+ } : {} : {};
28
+ /**
29
+ * Mirrors the runtime filter where the types know: a literal `hidden: true` is
30
+ * dropped; with a tags filter, literal tags must intersect it and no tags is
31
+ * dropped. Widened `string[]` tags or a widened filter keep the tool.
32
+ */
33
+ type Visible<Tl, Tg extends string> = DocsOf<Tl> extends infer D ? D extends {
34
+ hidden: true;
35
+ } ? false : [Tg] extends [never] ? true : string extends Tg ? true : D extends {
36
+ tags?: infer L extends readonly string[];
37
+ } ? string extends L[number] ? true : [Extract<L[number], Tg>] extends [never] ? false : true : false : true;
22
38
  type Injected<Tl, IK extends PropertyKey> = [IK] extends [never] ? Tl : Tl extends ToolBuilder<infer T, infer P, infer C, infer Path, infer S> ? [IK & KeysOfUnion<S['model']>] extends [never] ? Tl : ToolBuilder<T, P, C, Path, {
23
39
  model: DistOmit<S['model'], IK>;
24
40
  mode: 'inject';
@@ -28,8 +44,8 @@ type Injected<Tl, IK extends PropertyKey> = [IK] extends [never] ? Tl : Tl exten
28
44
  * filtering `as` clause here would re-run over every leaf on each `keyof`,
29
45
  * which the toolset name checks take several times.
30
46
  */
31
- export type AllTools<N, X, E, IK extends PropertyKey> = {
32
- [Tl in Selected<N, X, E> as ToolName<Tl['~tool']['path']>]: Injected<Tl, IK>;
47
+ export type AllTools<N, X, E, IK extends PropertyKey, Tg extends string = never> = {
48
+ [Tl in Selected<N, X, E, Tg> as ToolName<Tl['~tool']['path']>]: Injected<Tl, IK>;
33
49
  };
34
50
  type ModelOf<Tl> = Tl extends AnyTool ? Tl['~tool']['model'] : never;
35
51
  /** Concrete (`N` is fixed before `inject` is checked), so it contextually types `context`. */
@@ -39,25 +55,29 @@ type InjectCtx<N> = {
39
55
  info: McpCallInfo;
40
56
  }) => unknown;
41
57
  };
42
- type Selected<N, X, E> = LeafTools<N> extends infer Tl ? Tl extends AnyTool ? Tl['~tool']['path'] extends ExcludedPath<X> ? never : ToolEffect<Tl> extends E ? Tl : never : never : never;
58
+ type Selected<N, X, E, Tg extends string> = LeafTools<N> extends infer Tl ? Tl extends AnyTool ? Tl['~tool']['path'] extends ExcludedPath<X> ? never : ToolEffect<Tl> extends E ? Visible<Tl, Tg> extends true ? Tl : never : never : never : never;
43
59
  type ConflictPaths<Tl, K extends PropertyKey, V> = Tl extends AnyTool ? K extends KeysOfUnion<Tl['~tool']['model']> ? [V] extends [FieldOf<Tl['~tool']['model'], K>] ? never : `${Tl['~tool']['path']}.${K & string}` : never : never;
44
60
  /** Per key: not an input field anywhere → message; value does not fit some field → message naming it. */
45
61
  type AllInjectCheck<Tls, Inj> = {
46
62
  [K in keyof Inj]: K extends KeysOfUnion<ModelOf<Tls>> ? ConflictPaths<Tls, K, Inj[K] extends (...a: never[]) => infer R ? Awaited<R> : never> extends infer C extends string ? [C] extends [never] ? unknown : `Injected "${K & string}" does not fit field ${C}` : unknown : `"${K & string}" is not an input field of any selected procedure`;
47
63
  };
48
- export type AllOptions<N, X extends readonly unknown[], E, Inj> = {
64
+ export type AllOptions<N, X extends readonly unknown[], E, Inj, Tg extends string = never> = {
49
65
  exclude?: X;
50
66
  effect?: E | readonly E[];
51
- /** `docs()` tags; a procedure matches when it has any of them. Filtered at runtime only. */
52
- tags?: readonly string[];
67
+ /** `docs()` tags; a procedure matches when it has any of them. An empty list filters nothing. */
68
+ tags?: readonly Tg[];
69
+ /** Per-caller listing hint for every selected tool, as `.visible()`. */
70
+ visible?: Visibility;
71
+ /** OAuth scopes every selected tool requires, as `.scopes()`. */
72
+ scopes?: readonly string[];
53
73
  /** Each key goes only to tools whose input has it. */
54
- inject?: Inj & InjectCtx<N> & AllInjectCheck<Selected<N, X[number], E>, Inj>;
74
+ inject?: Inj & InjectCtx<N> & AllInjectCheck<Selected<N, X[number], E, Tg>, Inj>;
55
75
  };
56
76
  /**
57
77
  * Default tools for every procedure under `node`, named by path. Skips
58
78
  * `docs({ hidden: true })` procedures, then filters by `exclude`, `effect`,
59
- * and `tags`, and applies `inject` per tool.
79
+ * and `tags`, and applies `inject`, `visible`, and `scopes` per tool.
60
80
  */
61
- export declare function all<N extends AnyNode, const X extends readonly (AnyTool | AnyNode)[] = [], const E extends Effect = Effect, Inj extends object = {}>(node: N, options?: AllOptions<N, X, E, Inj>): AllTools<N, X[number], E, keyof Inj>;
81
+ export declare function all<N extends AnyNode, const X extends readonly (AnyTool | AnyNode)[] = [], const E extends Effect = Effect, Inj extends object = {}, const Tg extends string = never>(node: N, options?: AllOptions<N, X, E, Inj, Tg>): AllTools<N, X[number], E, keyof Inj, Tg>;
62
82
  export {};
63
83
  //# sourceMappingURL=all.d.ts.map
package/dist/all.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"all.d.ts","sourceRoot":"","sources":["../src/all.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"all.d.ts","sourceRoot":"","sources":["../src/all.ts"],"names":[],"mappings":"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"}
package/dist/all.js CHANGED
@@ -1,7 +1,9 @@
1
1
  import { walkContract } from '@ts-pf/docs';
2
+ import { defined } from '@ts-pf/protocol';
2
3
  import { toolName } from './names.js';
3
4
  import { nodeInfo } from './node.js';
4
5
  import { procedureInputKeys } from './schema.js';
6
+ import { checkScopes } from './scopes.js';
5
7
  import { createToolBuilder, isTool, procedureSpec, toolSpec, } from './tool.js';
6
8
  import { effectOf, isHidden, tagsOf } from './tool-meta.js';
7
9
  function exclusion(value) {
@@ -19,7 +21,7 @@ function isExcluded(path, exclusions) {
19
21
  /**
20
22
  * Default tools for every procedure under `node`, named by path. Skips
21
23
  * `docs({ hidden: true })` procedures, then filters by `exclude`, `effect`,
22
- * and `tags`, and applies `inject` per tool.
24
+ * and `tags`, and applies `inject`, `visible`, and `scopes` per tool.
23
25
  */
24
26
  export function all(node, options) {
25
27
  const info = nodeInfo(node);
@@ -29,6 +31,10 @@ export function all(node, options) {
29
31
  const exclusions = (options?.exclude ?? []).map(exclusion);
30
32
  const effects = options?.effect === undefined ? undefined : [options.effect].flat();
31
33
  const tags = options?.tags;
34
+ const shared = defined({
35
+ visible: options?.visible,
36
+ scopes: options?.scopes && checkScopes(options.scopes, 'all()'),
37
+ });
32
38
  const inject = (options?.inject ?? {});
33
39
  const tools = {};
34
40
  for (const entry of walkContract(info.contract)) {
@@ -38,7 +44,7 @@ export function all(node, options) {
38
44
  continue;
39
45
  if (effects && !effects.includes(effectOf(spec)))
40
46
  continue;
41
- if (tags && !tagsOf(spec).some((tag) => tags.includes(tag)))
47
+ if (tags?.length && !tagsOf(spec).some((tag) => tags.includes(tag)))
42
48
  continue;
43
49
  const keys = procedureInputKeys(spec).filter((key) => Object.hasOwn(inject, key));
44
50
  const name = toolName(path);
@@ -47,6 +53,7 @@ export function all(node, options) {
47
53
  }
48
54
  tools[name] = createToolBuilder({
49
55
  ...spec,
56
+ ...shared,
50
57
  inject: Object.fromEntries(keys.map((key) => [key, inject[key]])),
51
58
  });
52
59
  }
package/dist/all.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"all.js","sourceRoot":"","sources":["../src/all.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"all.js","sourceRoot":"","sources":["../src/all.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bind.d.ts","sourceRoot":"","sources":["../src/bind.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEvE,OAAO,EAAE,KAAK,WAAW,EAAY,MAAM,WAAW,CAAA;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAGjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,WAAW,EAAe,MAAM,cAAc,CAAA;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAEvD,mEAAmE;AACnE,MAAM,MAAM,mBAAmB,GAAG;IAChC,2EAA2E;IAC3E,OAAO,CAAC,EAAE,UAAU,CAAA;IACpB,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,UAAU,CAAC,CAAC,EAAE,GAAG,IAAI,mBAAmB,GAAG;IACrD,GAAG,EAAE,iBAAiB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC9B,gDAAgD;IAChD,OAAO,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,YAAY,CAAC,GAAG,CAAC,CAAA;IACjD,oEAAoE;IACpE,YAAY,CAAC,EAAE,SAAS,eAAe,EAAE,CAAA;CAC1C,CAAA;AAED;;;;GAIG;AACH,KAAK,aAAa,CAAC,GAAG,IAAI,EAAE,SAAS,GAAG,GACpC;IAAE,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,YAAY,CAAC,GAAG,CAAC,CAAA;CAAE,GACtD;IAAE,OAAO,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,YAAY,CAAC,GAAG,CAAC,CAAA;CAAE,CAAA;AAEzD,MAAM,MAAM,aAAa,CAAC,CAAC,EAAE,GAAG,IAAI,mBAAmB,GAAG;IACxD,wFAAwF;IACxF,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,KAAK,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;CACvE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;AAEtB,oGAAoG;AACpG,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,GAAG,QAAQ,CAoC7E;AAED,iGAAiG;AACjG,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAC9B,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAChC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,GAC5C,QAAQ,CAAA;AACX,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAC9B,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAChC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,GAC/C,QAAQ,CAAA"}
1
+ {"version":3,"file":"bind.d.ts","sourceRoot":"","sources":["../src/bind.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEvE,OAAO,EAAE,KAAK,WAAW,EAAY,MAAM,WAAW,CAAA;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAGjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,WAAW,EAAe,MAAM,cAAc,CAAA;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAiB,QAAQ,EAAE,MAAM,YAAY,CAAA;AAEtE,mEAAmE;AACnE,MAAM,MAAM,mBAAmB,GAAG;IAChC,2EAA2E;IAC3E,OAAO,CAAC,EAAE,UAAU,CAAA;IACpB,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,UAAU,CAAC,CAAC,EAAE,GAAG,IAAI,mBAAmB,GAAG;IACrD,GAAG,EAAE,iBAAiB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC9B,gDAAgD;IAChD,OAAO,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,YAAY,CAAC,GAAG,CAAC,CAAA;IACjD,oEAAoE;IACpE,YAAY,CAAC,EAAE,SAAS,eAAe,EAAE,CAAA;CAC1C,CAAA;AAED;;;;GAIG;AACH,KAAK,aAAa,CAAC,GAAG,IAAI,EAAE,SAAS,GAAG,GACpC;IAAE,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,YAAY,CAAC,GAAG,CAAC,CAAA;CAAE,GACtD;IAAE,OAAO,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,YAAY,CAAC,GAAG,CAAC,CAAA;CAAE,CAAA;AAEzD,MAAM,MAAM,aAAa,CAAC,CAAC,EAAE,GAAG,IAAI,mBAAmB,GAAG;IACxD,wFAAwF;IACxF,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,KAAK,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;CACvE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;AAyBtB,oGAAoG;AACpG,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,GAAG,QAAQ,CA+C7E;AAED,iGAAiG;AACjG,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAC9B,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAChC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,GAC5C,QAAQ,CAAA;AACX,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAC9B,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAChC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,GAC/C,QAAQ,CAAA"}
package/dist/bind.js CHANGED
@@ -4,32 +4,57 @@ import { appExecutor, clientExecutor } from './executor.js';
4
4
  import { hostEntries } from './host.js';
5
5
  import { DEFAULT_MAX_RESULT_CHARS, errorResult } from './result.js';
6
6
  import { toolsetSpec } from './toolset.js';
7
+ /** A flat tool's entry: one fixed view, hidden per caller only by its own `visible`. */
8
+ function flatEntry(tool, invoke) {
9
+ const view = {
10
+ definition: tool.definition,
11
+ invoke: (args, info) => invoke(tool, args, info),
12
+ };
13
+ const { visible, scopes = [] } = tool.spec;
14
+ return {
15
+ name: tool.name,
16
+ dynamic: visible !== undefined,
17
+ resolve: async (info) => !visible || (await visible(info)) ? view : undefined,
18
+ scopes: async () => scopes,
19
+ };
20
+ }
7
21
  /** Bound tools from runtime specs; definitions, schemas, and search indexes are built once here. */
8
22
  export function bindToolset(spec, options) {
9
23
  const entries = new Map();
10
24
  const invoke = (tool, args, info) => callTool(tool, args, info, options);
11
25
  for (const [name, toolSpec] of Object.entries(spec.tools)) {
12
- const tool = bindTool(name, toolSpec);
13
- entries.set(name, {
14
- definition: tool.definition,
15
- invoke: (args, info) => invoke(tool, args, info),
16
- });
26
+ entries.set(name, flatEntry(bindTool(name, toolSpec), invoke));
17
27
  }
18
28
  for (const [key, host] of Object.entries(spec.hosts)) {
19
29
  const inner = Object.entries(host.tools).map(([name, s]) => bindTool(name, s));
20
30
  for (const entry of hostEntries(key, host, inner, invoke, options.maxResultChars)) {
21
- entries.set(entry.definition.name, entry);
31
+ entries.set(entry.name, entry);
22
32
  }
23
33
  }
24
- const definitions = [...entries.values()].map((entry) => entry.definition);
34
+ const all = [...entries.values()];
35
+ // Nothing varies per caller: list the precomputed definitions.
36
+ const fixed = all.some((entry) => entry.dynamic)
37
+ ? undefined
38
+ : Promise.all(all.map((entry) => entry.resolve({}))).then((views) => views.flatMap((view) => (view ? [view.definition] : [])));
25
39
  return {
26
- list: async () => [...definitions],
40
+ async list(info = {}) {
41
+ if (fixed)
42
+ return [...(await fixed)];
43
+ const views = await Promise.all(all.map((entry) => entry.resolve(info)));
44
+ return views.flatMap((view) => (view ? [view.definition] : []));
45
+ },
27
46
  async call(name, args, info = {}) {
28
- const entry = entries.get(name);
29
- if (!entry) {
47
+ const view = await entries.get(name)?.resolve(info);
48
+ if (!view) {
30
49
  return errorResult(`Unknown tool "${name}"`, options.maxResultChars);
31
50
  }
32
- return entry.invoke(args, info);
51
+ return view.invoke(args, info);
52
+ },
53
+ async scopesFor(name, args, info = {}) {
54
+ const entry = entries.get(name);
55
+ if (!entry || !(await entry.resolve(info)))
56
+ return [];
57
+ return entry.scopes(args, info);
33
58
  },
34
59
  };
35
60
  }
package/dist/bind.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bind.js","sourceRoot":"","sources":["../src/bind.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bind.js","sourceRoot":"","sources":["../src/bind.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { AnySchema, InferSchemaInput, InferSchemaOutput } from '@ts-pf/contract';
2
2
  import type { Effect } from './meta.js';
3
- import type { MapperOpts, ToolPhantom } from './tool.js';
3
+ import type { MapperOpts, ToolPhantom, Visibility } from './tool.js';
4
4
  export type CompositeToolDef<T, Ctx, Sch extends AnySchema> = {
5
5
  description: string;
6
6
  effect: Effect;
@@ -8,6 +8,10 @@ export type CompositeToolDef<T, Ctx, Sch extends AnySchema> = {
8
8
  run: (o: MapperOpts<T, Ctx> & {
9
9
  input: InferSchemaOutput<Sch>;
10
10
  }) => unknown;
11
+ /** Per-caller listing hint, as `.visible()`. */
12
+ visible?: Visibility;
13
+ /** OAuth scopes the caller must hold, as `.scopes()`. */
14
+ scopes?: readonly string[];
11
15
  };
12
16
  /** An N→1 tool: no procedure path, so `$coverage` never counts it. */
13
17
  export type CompositeTool<Ctx, Model> = {
@@ -1 +1 @@
1
- {"version":3,"file":"composite.d.ts","sourceRoot":"","sources":["../src/composite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAY,MAAM,WAAW,CAAA;AAElE,MAAM,MAAM,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,SAAS,SAAS,IAAI;IAC5D,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,GAAG,CAAA;IACV,GAAG,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG;QAAE,KAAK,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAA;KAAE,KAAK,OAAO,CAAA;CAC5E,CAAA;AAED,sEAAsE;AACtE,MAAM,MAAM,aAAa,CAAC,GAAG,EAAE,KAAK,IAAI;IACtC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;CACjD,CAAA;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,SAAS,SAAS,EAC/D,GAAG,EAAE,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GACjC,aAAa,CAAC,GAAG,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAY3C"}
1
+ {"version":3,"file":"composite.d.ts","sourceRoot":"","sources":["../src/composite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,iBAAiB,CAAA;AAExB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAEvC,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAY,UAAU,EAAE,MAAM,WAAW,CAAA;AAE9E,MAAM,MAAM,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,SAAS,SAAS,IAAI;IAC5D,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,GAAG,CAAA;IACV,GAAG,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG;QAAE,KAAK,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAA;KAAE,KAAK,OAAO,CAAA;IAC3E,gDAAgD;IAChD,OAAO,CAAC,EAAE,UAAU,CAAA;IACpB,yDAAyD;IACzD,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC3B,CAAA;AAED,sEAAsE;AACtE,MAAM,MAAM,aAAa,CAAC,GAAG,EAAE,KAAK,IAAI;IACtC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;CACjD,CAAA;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,SAAS,SAAS,EAC/D,GAAG,EAAE,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GACjC,aAAa,CAAC,GAAG,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAgB3C"}
package/dist/composite.js CHANGED
@@ -1,5 +1,11 @@
1
+ import { defined } from '@ts-pf/protocol';
2
+ import { checkScopes } from './scopes.js';
1
3
  export function createCompositeTool(def) {
2
4
  const spec = {
5
+ ...defined({
6
+ visible: def.visible,
7
+ scopes: def.scopes && checkScopes(def.scopes, '$tool()'),
8
+ }),
3
9
  path: '',
4
10
  description: def.description,
5
11
  effect: def.effect,
@@ -1 +1 @@
1
- {"version":3,"file":"composite.js","sourceRoot":"","sources":["../src/composite.ts"],"names":[],"mappings":"AAoBA,MAAM,UAAU,mBAAmB,CACjC,GAAkC;IAElC,MAAM,IAAI,GAAa;QACrB,IAAI,EAAE,EAAE;QACR,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,MAAM,EAAE,EAAE;QACV,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE;QAC5B,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE,EAAE;QACZ,GAAG,EAAE,GAAG,CAAC,GAAmC;KAC7C,CAAA;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAW,CAAA;AACnC,CAAC"}
1
+ {"version":3,"file":"composite.js","sourceRoot":"","sources":["../src/composite.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAmBzC,MAAM,UAAU,mBAAmB,CACjC,GAAkC;IAElC,MAAM,IAAI,GAAa;QACrB,GAAG,OAAO,CAAC;YACT,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;SACzD,CAAC;QACF,IAAI,EAAE,EAAE;QACR,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,MAAM,EAAE,EAAE;QACV,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE;QAC5B,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE,EAAE;QACZ,GAAG,EAAE,GAAG,CAAC,GAAmC;KAC7C,CAAA;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAW,CAAA;AACnC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAErD,OAAO,EACL,KAAK,eAAe,EAEpB,KAAK,iBAAiB,EAGvB,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,8EAA8E;AAC9E,MAAM,WAAW,QAAQ;IACvB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC5C,GAAG,CACD,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,OAAO,CAAC,CAAA;IACnB,iEAAiE;IACjE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;CACrE;AAED,qGAAqG;AACrG,wBAAgB,WAAW,CACzB,GAAG,EAAE,iBAAiB,EACtB,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,EACnE,YAAY,EAAE,SAAS,eAAe,EAAE,GAAG,SAAS,GACnD,QAAQ,CAsBV;AAED,KAAK,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;AACxC,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,KAAK,CAAC,CAAC,CAAA;AA4B5D,4GAA4G;AAC5G,wBAAgB,cAAc,CAC5B,MAAM,EAAE,YAAY,CAAC,SAAS,CAAC,EAC/B,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,GAClE,QAAQ,CASV"}
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAErD,OAAO,EACL,KAAK,eAAe,EAEpB,KAAK,iBAAiB,EAGvB,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,8EAA8E;AAC9E,MAAM,WAAW,QAAQ;IACvB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC5C,GAAG,CACD,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,OAAO,CAAC,CAAA;IACnB,iEAAiE;IACjE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;CACrE;AAED,qGAAqG;AACrG,wBAAgB,WAAW,CACzB,GAAG,EAAE,iBAAiB,EACtB,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,EACnE,YAAY,EAAE,SAAS,eAAe,EAAE,GAAG,SAAS,GACnD,QAAQ,CAsBV;AAED,KAAK,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;AACxC,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,KAAK,CAAC,CAAC,CAAA;AA6B5D,4GAA4G;AAC5G,wBAAgB,cAAc,CAC5B,MAAM,EAAE,YAAY,CAAC,SAAS,CAAC,EAC/B,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,GAClE,QAAQ,CAmBV"}
package/dist/executor.js CHANGED
@@ -30,7 +30,8 @@ function procedureAt(client, path) {
30
30
  /**
31
31
  * `createClient()` returns a callable proxy, so `typeof` cannot tell it from a
32
32
  * per-caller `(info) => client`. A client answers every key with a callable
33
- * child; a plain factory function has no such key.
33
+ * child whatever its `Link`; a plain factory function has no such key, and
34
+ * `createLocalClient()` is a plain object.
34
35
  */
35
36
  function isClientFactory(source) {
36
37
  return (typeof source === 'function' &&
@@ -39,7 +40,18 @@ function isClientFactory(source) {
39
40
  }
40
41
  /** Remote: calls a typed client, which may be built per caller (a gateway calling upstream as the user). */
41
42
  export function clientExecutor(source, context) {
42
- const resolve = (info) => isClientFactory(source) ? source(info) : source;
43
+ // One client per tool call: `run` and the mappers' `call` share it.
44
+ const perCall = new WeakMap();
45
+ const resolve = isClientFactory(source)
46
+ ? (info) => {
47
+ let client = perCall.get(info);
48
+ if (!client) {
49
+ client = source(info);
50
+ perCall.set(info, client);
51
+ }
52
+ return client;
53
+ }
54
+ : () => source;
43
55
  return {
44
56
  context: async (info) => (context ? context(info) : {}),
45
57
  run: async (path, input, _ctx, info) => procedureAt(resolve(info), path)(input, defined({ signal: info.signal })),
@@ -1 +1 @@
1
- {"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
package/dist/host.d.ts CHANGED
@@ -1,11 +1,21 @@
1
1
  import type { BoundTool } from './bound-tool.js';
2
2
  import type { HostSpec } from './toolset.js';
3
3
  import type { McpCallInfo, McpToolDefinition, McpToolResult } from './types.js';
4
- /** A listed MCP tool and how to run it. */
5
- export type ToolEntry = {
4
+ /** What one caller sees of an MCP tool, and how to run it for them. */
5
+ export type ToolView = {
6
6
  readonly definition: McpToolDefinition;
7
7
  invoke(args: unknown, info: McpCallInfo): Promise<McpToolResult>;
8
8
  };
9
+ /** A listed MCP tool. */
10
+ export type ToolEntry = {
11
+ readonly name: string;
12
+ /** True when a `visible` predicate can change this entry per caller. */
13
+ readonly dynamic: boolean;
14
+ /** The caller's view; `undefined` when the tool is hidden from them. */
15
+ resolve(info: McpCallInfo): Promise<ToolView | undefined>;
16
+ /** Scopes a call with `args` needs; for a dispatch tool, the inner tool's if this caller may see it. */
17
+ scopes(args: unknown, info: McpCallInfo): Promise<readonly string[]>;
18
+ };
9
19
  type Invoke = (tool: BoundTool, args: unknown, info: McpCallInfo) => Promise<McpToolResult>;
10
20
  /** The `get_*_capabilities` / `call_*_capability` pairs of one host; empty buckets list nothing. */
11
21
  export declare function hostEntries(key: string, host: HostSpec, tools: readonly BoundTool[], invoke: Invoke, maxChars: number): ToolEntry[];
@@ -1 +1 @@
1
- {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAWhD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,KAAK,EACV,WAAW,EAEX,iBAAiB,EACjB,aAAa,EACd,MAAM,YAAY,CAAA;AAEnB,2CAA2C;AAC3C,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAA;IACtC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;CACjE,CAAA;AAED,KAAK,MAAM,GAAG,CACZ,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,WAAW,KACd,OAAO,CAAC,aAAa,CAAC,CAAA;AAqP3B,oGAAoG;AACpG,wBAAgB,WAAW,CACzB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,SAAS,EAAE,CAoBb"}
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAWhD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,KAAK,EACV,WAAW,EAEX,iBAAiB,EACjB,aAAa,EACd,MAAM,YAAY,CAAA;AAEnB,uEAAuE;AACvE,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAA;IACtC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;CACjE,CAAA;AAED,yBAAyB;AACzB,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,wEAAwE;IACxE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,wEAAwE;IACxE,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAA;IACzD,wGAAwG;IACxG,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAA;CACrE,CAAA;AAED,KAAK,MAAM,GAAG,CACZ,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,WAAW,KACd,OAAO,CAAC,aAAa,CAAC,CAAA;AAwT3B,oGAAoG;AACpG,wBAAgB,WAAW,CACzB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,SAAS,EAAE,CAwCb"}