@ts-pf/mcp 0.0.0-stage → 0.1.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 (100) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +191 -2
  3. package/dist/all.d.ts +63 -0
  4. package/dist/all.d.ts.map +1 -0
  5. package/dist/all.js +55 -0
  6. package/dist/all.js.map +1 -0
  7. package/dist/audit.d.ts +21 -0
  8. package/dist/audit.d.ts.map +1 -0
  9. package/dist/audit.js +85 -0
  10. package/dist/audit.js.map +1 -0
  11. package/dist/bind.d.ts +42 -0
  12. package/dist/bind.d.ts.map +1 -0
  13. package/dist/bind.js +46 -0
  14. package/dist/bind.js.map +1 -0
  15. package/dist/bound-tool.d.ts +18 -0
  16. package/dist/bound-tool.d.ts.map +1 -0
  17. package/dist/bound-tool.js +31 -0
  18. package/dist/bound-tool.js.map +1 -0
  19. package/dist/call.d.ts +12 -0
  20. package/dist/call.d.ts.map +1 -0
  21. package/dist/call.js +104 -0
  22. package/dist/call.js.map +1 -0
  23. package/dist/composite.d.ts +17 -0
  24. package/dist/composite.d.ts.map +1 -0
  25. package/dist/composite.js +14 -0
  26. package/dist/composite.js.map +1 -0
  27. package/dist/coverage.d.ts +11 -0
  28. package/dist/coverage.d.ts.map +1 -0
  29. package/dist/coverage.js +35 -0
  30. package/dist/coverage.js.map +1 -0
  31. package/dist/error-text.d.ts +25 -0
  32. package/dist/error-text.d.ts.map +1 -0
  33. package/dist/error-text.js +56 -0
  34. package/dist/error-text.js.map +1 -0
  35. package/dist/executor.d.ts +19 -0
  36. package/dist/executor.d.ts.map +1 -0
  37. package/dist/executor.js +49 -0
  38. package/dist/executor.js.map +1 -0
  39. package/dist/host.d.ts +13 -0
  40. package/dist/host.d.ts.map +1 -0
  41. package/dist/host.js +226 -0
  42. package/dist/host.js.map +1 -0
  43. package/dist/index.d.ts +11 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +5 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/infer.d.ts +17 -0
  48. package/dist/infer.d.ts.map +1 -0
  49. package/dist/infer.js +2 -0
  50. package/dist/infer.js.map +1 -0
  51. package/dist/meta.d.ts +20 -0
  52. package/dist/meta.d.ts.map +1 -0
  53. package/dist/meta.js +10 -0
  54. package/dist/meta.js.map +1 -0
  55. package/dist/names.d.ts +22 -0
  56. package/dist/names.d.ts.map +1 -0
  57. package/dist/names.js +14 -0
  58. package/dist/names.js.map +1 -0
  59. package/dist/node.d.ts +41 -0
  60. package/dist/node.d.ts.map +1 -0
  61. package/dist/node.js +47 -0
  62. package/dist/node.js.map +1 -0
  63. package/dist/result.d.ts +7 -0
  64. package/dist/result.d.ts.map +1 -0
  65. package/dist/result.js +31 -0
  66. package/dist/result.js.map +1 -0
  67. package/dist/schema.d.ts +23 -0
  68. package/dist/schema.d.ts.map +1 -0
  69. package/dist/schema.js +172 -0
  70. package/dist/schema.js.map +1 -0
  71. package/dist/sdk.d.ts +31 -0
  72. package/dist/sdk.d.ts.map +1 -0
  73. package/dist/sdk.js +87 -0
  74. package/dist/sdk.js.map +1 -0
  75. package/dist/search.d.ts +13 -0
  76. package/dist/search.d.ts.map +1 -0
  77. package/dist/search.js +52 -0
  78. package/dist/search.js.map +1 -0
  79. package/dist/tool-meta.d.ts +14 -0
  80. package/dist/tool-meta.d.ts.map +1 -0
  81. package/dist/tool-meta.js +44 -0
  82. package/dist/tool-meta.js.map +1 -0
  83. package/dist/tool.d.ts +102 -0
  84. package/dist/tool.d.ts.map +1 -0
  85. package/dist/tool.js +30 -0
  86. package/dist/tool.js.map +1 -0
  87. package/dist/toolkit.d.ts +36 -0
  88. package/dist/toolkit.d.ts.map +1 -0
  89. package/dist/toolkit.js +22 -0
  90. package/dist/toolkit.js.map +1 -0
  91. package/dist/toolset.d.ts +89 -0
  92. package/dist/toolset.d.ts.map +1 -0
  93. package/dist/toolset.js +67 -0
  94. package/dist/toolset.js.map +1 -0
  95. package/dist/types.d.ts +57 -0
  96. package/dist/types.d.ts.map +1 -0
  97. package/dist/types.js +2 -0
  98. package/dist/types.js.map +1 -0
  99. package/package.json +80 -4
  100. package/skills/ts-pf-mcp/SKILL.md +134 -0
package/dist/host.js ADDED
@@ -0,0 +1,226 @@
1
+ import { discoverToolName, dispatchToolName, hostScope, } from './names.js';
2
+ import { errorResult, successResult } from './result.js';
3
+ import { createSearchIndex } from './search.js';
4
+ import { aliasesOf, descriptionOf, effectOf, tagsOf } from './tool-meta.js';
5
+ /** Descriptions list inner names up to this many, otherwise categories. */
6
+ const LIST_NAMES_MAX = 30;
7
+ /** `call_*` advertises `name` as an enum up to this many, otherwise a plain string. */
8
+ const NAME_ENUM_MAX = 100;
9
+ const DEFAULT_LIMIT = 5;
10
+ /** Segment-wise common prefix of the inner procedure paths: the host's node. */
11
+ function commonPrefix(paths) {
12
+ const [first, ...rest] = paths;
13
+ if (!first)
14
+ return [];
15
+ let length = first.length;
16
+ for (const path of rest) {
17
+ let i = 0;
18
+ while (i < length && path[i] === first[i])
19
+ i += 1;
20
+ length = i;
21
+ }
22
+ return first.slice(0, length);
23
+ }
24
+ /** The first path segment under the host node, when the tool sits below one. */
25
+ function categories(tools) {
26
+ const paths = tools.map((tool) => tool.spec.path ? tool.spec.path.split('.') : []);
27
+ const prefix = commonPrefix(paths.filter((path) => path.length > 0));
28
+ return paths.map((path) => path.length > prefix.length + 1 ? path[prefix.length] : undefined);
29
+ }
30
+ function dispatchAnnotations(inner) {
31
+ if (inner.every((t) => t.effect === 'read'))
32
+ return { readOnlyHint: true };
33
+ return {
34
+ readOnlyHint: false,
35
+ destructiveHint: inner.some((t) => t.effect === 'destructive'),
36
+ };
37
+ }
38
+ function strongestEffect(inner) {
39
+ if (inner.some((t) => t.effect === 'destructive'))
40
+ return 'destructive';
41
+ return inner.some((t) => t.effect === 'write') ? 'write' : 'read';
42
+ }
43
+ function invalidDiscover(name, message, max) {
44
+ return errorResult(`Invalid input for ${name}: ${message}`, max);
45
+ }
46
+ /** Lenient check of discovery arguments (the schema is advertised, never enforced by the SDK). */
47
+ function readDiscoverArgs(args) {
48
+ if (args === undefined || args === null)
49
+ return {};
50
+ if (typeof args !== 'object' || Array.isArray(args))
51
+ return 'expected an object';
52
+ const a = args;
53
+ if (a.query !== undefined && typeof a.query !== 'string')
54
+ return 'query must be a string';
55
+ if (a.category !== undefined && typeof a.category !== 'string')
56
+ return 'category must be a string';
57
+ if (a.names !== undefined &&
58
+ !(Array.isArray(a.names) && a.names.every((n) => typeof n === 'string')))
59
+ return 'names must be an array of strings';
60
+ if (a.detail !== undefined &&
61
+ a.detail !== 'name' &&
62
+ a.detail !== 'summary' &&
63
+ a.detail !== 'full')
64
+ return 'detail must be "name", "summary", or "full"';
65
+ if (a.limit !== undefined &&
66
+ !(Number.isInteger(a.limit) && a.limit >= 1))
67
+ return 'limit must be a positive integer';
68
+ return a;
69
+ }
70
+ function describeInner(t, detail) {
71
+ if (detail === 'name')
72
+ return { name: t.tool.name };
73
+ const out = {
74
+ name: t.tool.name,
75
+ description: t.description,
76
+ effect: t.effect,
77
+ };
78
+ if (t.category)
79
+ out.category = t.category;
80
+ if (detail === 'full') {
81
+ out.inputSchema = t.tool.inputSchema;
82
+ if (t.tool.spec.examples.length > 0)
83
+ out.examples = t.tool.spec.examples;
84
+ }
85
+ return out;
86
+ }
87
+ function bucketEntries(key, bucket, host, inner, invoke, maxChars) {
88
+ const scope = hostScope(key, bucket);
89
+ const getName = discoverToolName(scope);
90
+ const callName = dispatchToolName(scope);
91
+ const names = inner.map((t) => t.tool.name);
92
+ const byName = new Map(inner.map((t) => [t.tool.name, t]));
93
+ const cats = [
94
+ ...new Set(inner.flatMap((t) => (t.category ? [t.category] : []))),
95
+ ].sort();
96
+ const index = createSearchIndex(inner.map((t) => ({
97
+ id: t.tool.name,
98
+ text: [
99
+ t.tool.name,
100
+ t.description,
101
+ ...tagsOf(t.tool.spec),
102
+ ...aliasesOf(t.tool.spec),
103
+ t.category ?? '',
104
+ ].join(' '),
105
+ })));
106
+ const kind = bucket === 'query' ? 'read-only ' : '';
107
+ const catalog = inner.length <= LIST_NAMES_MAX || cats.length === 0
108
+ ? `Capabilities: ${names.join(', ')}.`
109
+ : `Categories: ${cats.join(', ')}.`;
110
+ const discover = {
111
+ definition: {
112
+ name: getName,
113
+ description: `${host.description}\nSearch these ${inner.length} ${kind}capabilities, then run one with ${callName}. ${catalog}`,
114
+ inputSchema: {
115
+ type: 'object',
116
+ properties: {
117
+ query: {
118
+ type: 'string',
119
+ description: 'Words to rank capabilities by.',
120
+ },
121
+ ...(cats.length > 0
122
+ ? { category: { type: 'string', enum: cats } }
123
+ : {}),
124
+ names: {
125
+ type: 'array',
126
+ items: { type: 'string' },
127
+ description: 'Exact capability names.',
128
+ },
129
+ detail: {
130
+ type: 'string',
131
+ enum: ['name', 'summary', 'full'],
132
+ description: '"full" adds the input schema and examples.',
133
+ },
134
+ limit: { type: 'integer', minimum: 1 },
135
+ },
136
+ additionalProperties: false,
137
+ },
138
+ annotations: { readOnlyHint: true },
139
+ effect: 'read',
140
+ },
141
+ async invoke(args) {
142
+ const parsed = readDiscoverArgs(args);
143
+ if (typeof parsed === 'string') {
144
+ return invalidDiscover(getName, parsed, maxChars);
145
+ }
146
+ let matches = parsed.names
147
+ ? parsed.names.flatMap((name) => byName.get(name) ?? [])
148
+ : [...inner];
149
+ if (parsed.category !== undefined) {
150
+ matches = matches.filter((t) => t.category === parsed.category);
151
+ }
152
+ if (parsed.query) {
153
+ const allowed = new Set(matches);
154
+ matches = index
155
+ .search(parsed.query)
156
+ .flatMap((name) => byName.get(name) ?? [])
157
+ .filter((t) => allowed.has(t));
158
+ }
159
+ if (!parsed.names)
160
+ matches = matches.slice(0, parsed.limit ?? DEFAULT_LIMIT);
161
+ const detail = parsed.detail ?? 'summary';
162
+ const result = {
163
+ scope,
164
+ total: inner.length,
165
+ categories: cats,
166
+ tools: matches.map((t) => describeInner(t, detail)),
167
+ };
168
+ const unknown = parsed.names?.filter((name) => !byName.has(name)) ?? [];
169
+ if (unknown.length > 0)
170
+ result.unknown = unknown;
171
+ return successResult(result, maxChars, false);
172
+ },
173
+ };
174
+ const dispatch = {
175
+ definition: {
176
+ name: callName,
177
+ description: `Run one ${kind}${scope} capability by name. Find names and input schemas with ${getName}.`,
178
+ inputSchema: {
179
+ type: 'object',
180
+ properties: {
181
+ name: {
182
+ type: 'string',
183
+ ...(names.length <= NAME_ENUM_MAX ? { enum: names } : {}),
184
+ },
185
+ input: {
186
+ type: 'object',
187
+ description: `The capability input (see ${getName} with detail "full").`,
188
+ },
189
+ },
190
+ required: ['name'],
191
+ additionalProperties: false,
192
+ },
193
+ annotations: dispatchAnnotations(inner),
194
+ effect: strongestEffect(inner),
195
+ },
196
+ async invoke(args, info) {
197
+ const name = args?.name;
198
+ const target = typeof name === 'string' ? byName.get(name) : undefined;
199
+ if (!target) {
200
+ return errorResult(`Unknown capability ${JSON.stringify(name)}. Valid: ${names.join(', ')}`, maxChars);
201
+ }
202
+ return invoke(target.tool, args.input, info);
203
+ },
204
+ };
205
+ return [discover, dispatch];
206
+ }
207
+ /** The `get_*_capabilities` / `call_*_capability` pairs of one host; empty buckets list nothing. */
208
+ export function hostEntries(key, host, tools, invoke, maxChars) {
209
+ const cats = categories(tools);
210
+ const inner = tools.map((tool, i) => ({
211
+ tool,
212
+ effect: effectOf(tool.spec),
213
+ description: descriptionOf(tool.spec),
214
+ category: cats[i],
215
+ }));
216
+ const buckets = host.split === 'effect'
217
+ ? [
218
+ ['query', inner.filter((t) => t.effect === 'read')],
219
+ ['operations', inner.filter((t) => t.effect !== 'read')],
220
+ ]
221
+ : [[undefined, inner]];
222
+ return buckets
223
+ .filter(([, list]) => list.length > 0)
224
+ .flatMap(([bucket, list]) => bucketEntries(key, bucket, host, list, invoke, maxChars));
225
+ }
226
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export type { AllTools } from './all.js';
2
+ export { all } from './all.js';
3
+ export { type AuditFinding, type AuditOptions, audit } from './audit.js';
4
+ export { bindTools } from './bind.js';
5
+ export type { CompositeTool } from './composite.js';
6
+ export type { ToolkitNode } from './node.js';
7
+ export type { BuilderState, MapperOpts, ToolBuilder, ToolPhantom, } from './tool.js';
8
+ export { createToolkit, type Toolkit } from './toolkit.js';
9
+ export type { Host, Toolset } from './toolset.js';
10
+ export type { McpCallInfo, McpToolDefinition, McpToolResult, McpTools, } from './types.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,YAAY,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACnD,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAC5C,YAAY,EACV,YAAY,EACZ,UAAU,EACV,WAAW,EACX,WAAW,GACZ,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,aAAa,EAAE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAA;AAC1D,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACjD,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,aAAa,EACb,QAAQ,GACT,MAAM,YAAY,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { all } from './all.js';
2
+ export { audit } from './audit.js';
3
+ export { bindTools } from './bind.js';
4
+ export { createToolkit } from './toolkit.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAwC,KAAK,EAAE,MAAM,YAAY,CAAA;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AASrC,OAAO,EAAE,aAAa,EAAgB,MAAM,cAAc,CAAA"}
@@ -0,0 +1,17 @@
1
+ import type { ErrorMap, InferContractProcedure, IsContractProcedure } from '@ts-pf/contract';
2
+ export type MaybePromise<T> = T | Promise<T>;
3
+ /** Router keys without the `~pf` brand. */
4
+ export type Keys<T> = Exclude<keyof T & string, '~pf'>;
5
+ export type KeysOfUnion<T> = T extends unknown ? keyof T : never;
6
+ export type FieldOf<T, K extends PropertyKey> = T extends unknown ? K extends keyof T ? T[K] : never : never;
7
+ /** `Omit` per union member, so a union input keeps its branches. */
8
+ export type DistOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;
9
+ export type In<P> = InferContractProcedure<P>['input'];
10
+ export type Out<P> = InferContractProcedure<P>['output'];
11
+ export type Meta<P> = InferContractProcedure<P>['meta'];
12
+ export type Err<P> = InferContractProcedure<P>['errors'] extends infer E extends ErrorMap ? E : {};
13
+ /** Every procedure path of a contract, dot-joined. */
14
+ export type ProcPaths<T, P extends string = ''> = {
15
+ [K in Keys<T>]: IsContractProcedure<T[K]> extends true ? `${P}${K}` : ProcPaths<T[K], `${P}${K}.`>;
16
+ }[Keys<T>];
17
+ //# sourceMappingURL=infer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infer.d.ts","sourceRoot":"","sources":["../src/infer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,sBAAsB,EACtB,mBAAmB,EACpB,MAAM,iBAAiB,CAAA;AAExB,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;AAE5C,2CAA2C;AAC3C,MAAM,MAAM,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,CAAA;AAEtD,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,OAAO,GAAG,MAAM,CAAC,GAAG,KAAK,CAAA;AAChE,MAAM,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,SAAS,WAAW,IAAI,CAAC,SAAS,OAAO,GAC7D,CAAC,SAAS,MAAM,CAAC,GACf,CAAC,CAAC,CAAC,CAAC,GACJ,KAAK,GACP,KAAK,CAAA;AACT,oEAAoE;AACpE,MAAM,MAAM,QAAQ,CAAC,CAAC,EAAE,CAAC,SAAS,WAAW,IAAI,CAAC,SAAS,OAAO,GAC9D,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GACV,KAAK,CAAA;AAET,MAAM,MAAM,EAAE,CAAC,CAAC,IAAI,sBAAsB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;AACtD,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,sBAAsB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;AACxD,MAAM,MAAM,IAAI,CAAC,CAAC,IAAI,sBAAsB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;AACvD,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,sBAAsB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,MAAM,CAAC,SACtE,QAAQ,GACN,CAAC,GACD,EAAE,CAAA;AAEN,sDAAsD;AACtD,MAAM,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,EAAE,IAAI;KAC/C,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,GAClD,GAAG,CAAC,GAAG,CAAC,EAAE,GACV,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;CACjC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA"}
package/dist/infer.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=infer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infer.js","sourceRoot":"","sources":["../src/infer.ts"],"names":[],"mappings":""}
package/dist/meta.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ /** How a tool affects the world. Drives annotations, host buckets, and `all({ effect })`. */
2
+ export type Effect = 'read' | 'write' | 'destructive';
3
+ export declare const MCP_KEY: "mcp";
4
+ export interface McpMeta {
5
+ /** Unclassified procedures count as `write`. */
6
+ effect?: Effect;
7
+ /** Model-facing description; wins over `docs()` description / summary. */
8
+ description?: string;
9
+ /** Extra search terms for tool-host discovery. */
10
+ aliases?: readonly string[];
11
+ }
12
+ /**
13
+ * Contract-level MCP hints, merged into `.meta()` like `docs()`.
14
+ * The `const` type parameter keeps `effect` a literal so `all(node, { effect })`
15
+ * can filter at the type level.
16
+ */
17
+ export declare function mcp<const M extends McpMeta>(value: M): {
18
+ [MCP_KEY]: M;
19
+ };
20
+ //# sourceMappingURL=meta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../src/meta.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,aAAa,CAAA;AAErD,eAAO,MAAM,OAAO,EAAG,KAAc,CAAA;AAErC,MAAM,WAAW,OAAO;IACtB,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kDAAkD;IAClD,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,GAAG,CAAC,KAAK,CAAC,CAAC,SAAS,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG;IAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;CAAE,CAEvE"}
package/dist/meta.js ADDED
@@ -0,0 +1,10 @@
1
+ export const MCP_KEY = 'mcp';
2
+ /**
3
+ * Contract-level MCP hints, merged into `.meta()` like `docs()`.
4
+ * The `const` type parameter keeps `effect` a literal so `all(node, { effect })`
5
+ * can filter at the type level.
6
+ */
7
+ export function mcp(value) {
8
+ return { [MCP_KEY]: value };
9
+ }
10
+ //# sourceMappingURL=meta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.js","sourceRoot":"","sources":["../src/meta.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,OAAO,GAAG,KAAc,CAAA;AAWrC;;;;GAIG;AACH,MAAM,UAAU,GAAG,CAA0B,KAAQ;IACnD,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAA;AAC7B,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { IsContractProcedure } from '@ts-pf/contract';
2
+ import type { Keys } from './infer.js';
3
+ /** `user.listActive` → `user_listActive`. */
4
+ export type ToolName<P extends string> = P extends `${infer A}.${infer B}` ? `${A}_${ToolName<B>}` : P;
5
+ export declare function toolName(path: string): string;
6
+ export type Split = 'effect' | false;
7
+ /** The MCP tools a host generates, from its key exactly. */
8
+ export type HostToolNames<K extends string, Sp> = Sp extends 'effect' ? `get_${K}_query_capabilities` | `call_${K}_query_capability` | `get_${K}_operations_capabilities` | `call_${K}_operations_capability` : `get_${K}_capabilities` | `call_${K}_capability`;
9
+ export type HostBucket = 'query' | 'operations';
10
+ /** `admin` + `query` → `admin_query`; unsplit hosts have one scope named by the key. */
11
+ export declare function hostScope(key: string, bucket: HostBucket | undefined): string;
12
+ export declare function discoverToolName(scope: string): string;
13
+ export declare function dispatchToolName(scope: string): string;
14
+ type DollarPaths<T, P extends string = ''> = {
15
+ [K in Keys<T>]: K extends `$${string}` ? `${P}${K}` : IsContractProcedure<T[K]> extends true ? never : DollarPaths<T[K], `${P}${K}.`>;
16
+ }[Keys<T>];
17
+ /** `$` is reserved for toolkit root members, so a contract key starting with it is an error naming the key. */
18
+ export type DollarGuard<T> = [DollarPaths<T>] extends [never] ? unknown : {
19
+ '~error': `Contract key "${DollarPaths<T>}" starts with "$", which createToolkit reserves for $context/$toolset/$host/$tool/$coverage. Rename it.`;
20
+ };
21
+ export {};
22
+ //# sourceMappingURL=names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"names.d.ts","sourceRoot":"","sources":["../src/names.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAC1D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAEtC,6CAA6C;AAC7C,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,MAAM,CAAC,EAAE,GACtE,GAAG,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,GACrB,CAAC,CAAA;AAEL,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,MAAM,MAAM,KAAK,GAAG,QAAQ,GAAG,KAAK,CAAA;AAEpC,4DAA4D;AAC5D,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,QAAQ,GAE7D,OAAO,CAAC,qBAAqB,GAC7B,QAAQ,CAAC,mBAAmB,GAC5B,OAAO,CAAC,0BAA0B,GAClC,QAAQ,CAAC,wBAAwB,GACrC,OAAO,CAAC,eAAe,GAAG,QAAQ,CAAC,aAAa,CAAA;AAEpD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,YAAY,CAAA;AAE/C,wFAAwF;AACxF,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAE7E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,KAAK,WAAW,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,EAAE,IAAI;KAC1C,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,EAAE,GAClC,GAAG,CAAC,GAAG,CAAC,EAAE,GACV,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,GACpC,KAAK,GACL,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;CACrC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;AAEV,+GAA+G;AAC/G,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GACzD,OAAO,GACP;IACE,QAAQ,EAAE,iBAAiB,WAAW,CAAC,CAAC,CAAC,yGAAyG,CAAA;CACnJ,CAAA"}
package/dist/names.js ADDED
@@ -0,0 +1,14 @@
1
+ export function toolName(path) {
2
+ return path.replaceAll('.', '_');
3
+ }
4
+ /** `admin` + `query` → `admin_query`; unsplit hosts have one scope named by the key. */
5
+ export function hostScope(key, bucket) {
6
+ return bucket ? `${key}_${bucket}` : key;
7
+ }
8
+ export function discoverToolName(scope) {
9
+ return `get_${scope}_capabilities`;
10
+ }
11
+ export function dispatchToolName(scope) {
12
+ return `call_${scope}_capability`;
13
+ }
14
+ //# sourceMappingURL=names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"names.js","sourceRoot":"","sources":["../src/names.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;AAClC,CAAC;AAeD,wFAAwF;AACxF,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,MAA8B;IACnE,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,OAAO,KAAK,eAAe,CAAA;AACpC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,QAAQ,KAAK,aAAa,CAAA;AACnC,CAAC"}
package/dist/node.d.ts ADDED
@@ -0,0 +1,41 @@
1
+ import type { IsContractProcedure } from '@ts-pf/contract';
2
+ import type { In, Keys } from './infer.js';
3
+ import { type ToolBuilder } from './tool.js';
4
+ declare const nodeBrand: unique symbol;
5
+ export type NodeBrand = typeof nodeBrand;
6
+ /** A contract router node mirrored as tool builders; leaves are `ToolBuilder`s. */
7
+ export type ToolkitNode<T, Sub, Ctx, Prefix extends string> = {
8
+ readonly [nodeBrand]?: {
9
+ prefix: Prefix;
10
+ ctx: (c: Ctx) => void;
11
+ };
12
+ } & {
13
+ [K in Keys<Sub>]: IsContractProcedure<Sub[K]> extends true ? ToolBuilder<T, Sub[K], Ctx, `${Prefix}${K}`, {
14
+ model: In<Sub[K]>;
15
+ mode: 'none';
16
+ }> : ToolkitNode<T, Sub[K], Ctx, `${Prefix}${K}.`>;
17
+ };
18
+ export type AnyNode = {
19
+ readonly [nodeBrand]?: {
20
+ prefix: string;
21
+ ctx: (c: never) => void;
22
+ };
23
+ };
24
+ export type NodeCtx<N> = N extends {
25
+ readonly [nodeBrand]?: {
26
+ ctx: (c: infer C) => void;
27
+ };
28
+ } ? C : never;
29
+ export type NodeInfo = {
30
+ contract: unknown;
31
+ path: readonly string[];
32
+ };
33
+ export declare function nodeInfo(value: unknown): NodeInfo | undefined;
34
+ /**
35
+ * A lazy proxy over one contract router node. Children are created on first
36
+ * access and memoized, so `tk.user.find` is the same builder every time.
37
+ * `members` are extra root keys (`$context`, `$toolset`, …).
38
+ */
39
+ export declare function createNode(contract: unknown, path: readonly string[], members?: Readonly<Record<string, unknown>>): unknown;
40
+ export {};
41
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAE1D,OAAO,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAoC,KAAK,WAAW,EAAE,MAAM,WAAW,CAAA;AAE9E,OAAO,CAAC,MAAM,SAAS,EAAE,OAAO,MAAM,CAAA;AACtC,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAA;AAExC,mFAAmF;AACnF,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,SAAS,MAAM,IAAI;IAC5D,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;KAAE,CAAA;CACjE,GAAG;KACD,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,GACtD,WAAW,CACT,CAAC,EACD,GAAG,CAAC,CAAC,CAAC,EACN,GAAG,EACH,GAAG,MAAM,GAAG,CAAC,EAAE,EACf;QAAE,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CACpC,GACD,WAAW,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC;CAClD,CAAA;AAED,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;KAAE,CAAA;CACnE,CAAA;AACD,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS;IACjC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE;QAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,CAAA;KAAE,CAAA;CACrD,GACG,CAAC,GACD,KAAK,CAAA;AAIT,MAAM,MAAM,QAAQ,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAA;AAErE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,CAG7D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,OAAO,EACjB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM,GAC9C,OAAO,CAgCT"}
package/dist/node.js ADDED
@@ -0,0 +1,47 @@
1
+ import { isContractProcedure } from '@ts-pf/contract';
2
+ import { createToolBuilder, procedureSpec } from './tool.js';
3
+ const NODE_KEY = '~node';
4
+ export function nodeInfo(value) {
5
+ if (typeof value !== 'object' || value === null)
6
+ return undefined;
7
+ return value[NODE_KEY];
8
+ }
9
+ /**
10
+ * A lazy proxy over one contract router node. Children are created on first
11
+ * access and memoized, so `tk.user.find` is the same builder every time.
12
+ * `members` are extra root keys (`$context`, `$toolset`, …).
13
+ */
14
+ export function createNode(contract, path, members = {}) {
15
+ const info = { contract, path };
16
+ const children = new Map();
17
+ const child = (key) => {
18
+ if (children.has(key))
19
+ return children.get(key);
20
+ const value = contract[key];
21
+ const childPath = [...path, key];
22
+ const created = isContractProcedure(value)
23
+ ? createToolBuilder(procedureSpec(childPath.join('.'), value))
24
+ : createNode(value, childPath);
25
+ children.set(key, created);
26
+ return created;
27
+ };
28
+ return new Proxy({}, {
29
+ get(_target, key) {
30
+ if (typeof key !== 'string')
31
+ return undefined;
32
+ if (key === NODE_KEY)
33
+ return info;
34
+ if (Object.hasOwn(members, key))
35
+ return members[key];
36
+ if (key.startsWith('~'))
37
+ return undefined;
38
+ if (typeof contract !== 'object' ||
39
+ contract === null ||
40
+ !Object.hasOwn(contract, key)) {
41
+ return undefined;
42
+ }
43
+ return child(key);
44
+ },
45
+ });
46
+ }
47
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAErD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAoB,MAAM,WAAW,CAAA;AA6B9E,MAAM,QAAQ,GAAG,OAAO,CAAA;AAIxB,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAA;IACjE,OAAQ,KAA8C,CAAC,QAAQ,CAAC,CAAA;AAClE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,QAAiB,EACjB,IAAuB,EACvB,UAA6C,EAAE;IAE/C,MAAM,IAAI,GAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IACzC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAA;IAC3C,MAAM,KAAK,GAAG,CAAC,GAAW,EAAW,EAAE;QACrC,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC/C,MAAM,KAAK,GAAI,QAAoC,CAAC,GAAG,CAAC,CAAA;QACxD,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAA;QAChC,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC;YACxC,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;YAC9D,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;QAChC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QAC1B,OAAO,OAAO,CAAA;IAChB,CAAC,CAAA;IACD,OAAO,IAAI,KAAK,CACd,EAAE,EACF;QACE,GAAG,CAAC,OAAO,EAAE,GAAG;YACd,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAA;YAC7C,IAAI,GAAG,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAA;YACjC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC;gBAAE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAA;YACpD,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,OAAO,SAAS,CAAA;YACzC,IACE,OAAO,QAAQ,KAAK,QAAQ;gBAC5B,QAAQ,KAAK,IAAI;gBACjB,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,EAC7B,CAAC;gBACD,OAAO,SAAS,CAAA;YAClB,CAAC;YACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAA;QACnB,CAAC;KACF,CACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { McpToolResult } from './types.js';
2
+ export declare const DEFAULT_MAX_RESULT_CHARS = 25000;
3
+ /** Strings pass through; `undefined` becomes `OK`; anything else is JSON. */
4
+ export declare function valueText(value: unknown): string;
5
+ export declare function successResult(value: unknown, maxChars: number, structured: boolean): McpToolResult;
6
+ export declare function errorResult(text: string, maxChars: number): McpToolResult;
7
+ //# sourceMappingURL=result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C,eAAO,MAAM,wBAAwB,QAAS,CAAA;AAQ9C,6EAA6E;AAC7E,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIhD;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,OAAO,GAClB,aAAa,CAQf;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,CAKzE"}
package/dist/result.js ADDED
@@ -0,0 +1,31 @@
1
+ export const DEFAULT_MAX_RESULT_CHARS = 25_000;
2
+ function truncate(text, maxChars) {
3
+ if (text.length <= maxChars)
4
+ return text;
5
+ const rest = text.length - maxChars;
6
+ return `${text.slice(0, maxChars)}\n\n[Truncated: ${rest} more characters. Narrow the request to see the rest.]`;
7
+ }
8
+ /** Strings pass through; `undefined` becomes `OK`; anything else is JSON. */
9
+ export function valueText(value) {
10
+ if (typeof value === 'string')
11
+ return value;
12
+ if (value === undefined)
13
+ return 'OK';
14
+ return JSON.stringify(value) ?? 'OK';
15
+ }
16
+ export function successResult(value, maxChars, structured) {
17
+ const result = {
18
+ content: [{ type: 'text', text: truncate(valueText(value), maxChars) }],
19
+ };
20
+ if (structured && typeof value === 'object' && value !== null) {
21
+ result.structuredContent = value;
22
+ }
23
+ return result;
24
+ }
25
+ export function errorResult(text, maxChars) {
26
+ return {
27
+ content: [{ type: 'text', text: truncate(text, maxChars) }],
28
+ isError: true,
29
+ };
30
+ }
31
+ //# sourceMappingURL=result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.js","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAA;AAE9C,SAAS,QAAQ,CAAC,IAAY,EAAE,QAAgB;IAC9C,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,IAAI,CAAA;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAA;IACnC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,mBAAmB,IAAI,wDAAwD,CAAA;AAClH,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC3C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IACpC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,IAAI,CAAA;AACtC,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,KAAc,EACd,QAAgB,EAChB,UAAmB;IAEnB,MAAM,MAAM,GAAkB;QAC5B,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC;KACxE,CAAA;IACD,IAAI,UAAU,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC9D,MAAM,CAAC,iBAAiB,GAAG,KAAgC,CAAA;IAC7D,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,QAAgB;IACxD,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC3D,OAAO,EAAE,IAAI;KACd,CAAA;AACH,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { type JsonSchema } from '@ts-pf/docs';
2
+ import type { ToolSpec } from './tool.js';
3
+ export type SchemaIssue = {
4
+ level: 'error' | 'warn';
5
+ message: string;
6
+ };
7
+ /** A model-facing JSON Schema plus what `audit()` should report about it. */
8
+ export type ModelSchema = {
9
+ schema: JsonSchema;
10
+ issues: SchemaIssue[];
11
+ };
12
+ /** Top-level keys a model may send: object properties, or the union of a union root's branches. */
13
+ export declare function inputKeys(schema: JsonSchema): string[];
14
+ /** The JSON Schema of what the model sends: `.input()` schema, or the procedure input minus injected keys. */
15
+ export declare function modelInputSchema(spec: ToolSpec): ModelSchema;
16
+ /** Input keys of a procedure, for `all({ inject })` (each key goes only to tools that have it). */
17
+ export declare function procedureInputKeys(spec: ToolSpec): string[];
18
+ /** The advertised `outputSchema`: only for `.output(schema, map)` with an object root. */
19
+ export declare function modelOutputSchema(spec: ToolSpec): {
20
+ schema?: JsonSchema;
21
+ issues: SchemaIssue[];
22
+ };
23
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAgB,MAAM,aAAa,CAAA;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEzC,MAAM,MAAM,WAAW,GAAG;IAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AACtE,6EAA6E;AAC7E,MAAM,MAAM,WAAW,GAAG;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,WAAW,EAAE,CAAA;CAAE,CAAA;AAmFvE,mGAAmG;AACnG,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,CAItD;AAqDD,8GAA8G;AAC9G,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,WAAW,CAW5D;AAED,mGAAmG;AACnG,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE,CAG3D;AAED,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG;IACjD,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,MAAM,EAAE,WAAW,EAAE,CAAA;CACtB,CAiBA"}