@ts-pf/mcp 0.0.0-stage → 0.0.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/LICENSE +21 -0
- package/README.md +191 -2
- package/dist/all.d.ts +63 -0
- package/dist/all.d.ts.map +1 -0
- package/dist/all.js +55 -0
- package/dist/all.js.map +1 -0
- package/dist/audit.d.ts +21 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +85 -0
- package/dist/audit.js.map +1 -0
- package/dist/bind.d.ts +42 -0
- package/dist/bind.d.ts.map +1 -0
- package/dist/bind.js +46 -0
- package/dist/bind.js.map +1 -0
- package/dist/bound-tool.d.ts +18 -0
- package/dist/bound-tool.d.ts.map +1 -0
- package/dist/bound-tool.js +31 -0
- package/dist/bound-tool.js.map +1 -0
- package/dist/call.d.ts +12 -0
- package/dist/call.d.ts.map +1 -0
- package/dist/call.js +104 -0
- package/dist/call.js.map +1 -0
- package/dist/composite.d.ts +17 -0
- package/dist/composite.d.ts.map +1 -0
- package/dist/composite.js +14 -0
- package/dist/composite.js.map +1 -0
- package/dist/coverage.d.ts +11 -0
- package/dist/coverage.d.ts.map +1 -0
- package/dist/coverage.js +35 -0
- package/dist/coverage.js.map +1 -0
- package/dist/error-text.d.ts +25 -0
- package/dist/error-text.d.ts.map +1 -0
- package/dist/error-text.js +56 -0
- package/dist/error-text.js.map +1 -0
- package/dist/executor.d.ts +19 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +49 -0
- package/dist/executor.js.map +1 -0
- package/dist/host.d.ts +13 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +226 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/infer.d.ts +17 -0
- package/dist/infer.d.ts.map +1 -0
- package/dist/infer.js +2 -0
- package/dist/infer.js.map +1 -0
- package/dist/meta.d.ts +20 -0
- package/dist/meta.d.ts.map +1 -0
- package/dist/meta.js +10 -0
- package/dist/meta.js.map +1 -0
- package/dist/names.d.ts +22 -0
- package/dist/names.d.ts.map +1 -0
- package/dist/names.js +14 -0
- package/dist/names.js.map +1 -0
- package/dist/node.d.ts +41 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +47 -0
- package/dist/node.js.map +1 -0
- package/dist/result.d.ts +7 -0
- package/dist/result.d.ts.map +1 -0
- package/dist/result.js +31 -0
- package/dist/result.js.map +1 -0
- package/dist/schema.d.ts +23 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +172 -0
- package/dist/schema.js.map +1 -0
- package/dist/sdk.d.ts +31 -0
- package/dist/sdk.d.ts.map +1 -0
- package/dist/sdk.js +87 -0
- package/dist/sdk.js.map +1 -0
- package/dist/search.d.ts +13 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +52 -0
- package/dist/search.js.map +1 -0
- package/dist/tool-meta.d.ts +14 -0
- package/dist/tool-meta.d.ts.map +1 -0
- package/dist/tool-meta.js +44 -0
- package/dist/tool-meta.js.map +1 -0
- package/dist/tool.d.ts +102 -0
- package/dist/tool.d.ts.map +1 -0
- package/dist/tool.js +30 -0
- package/dist/tool.js.map +1 -0
- package/dist/toolkit.d.ts +36 -0
- package/dist/toolkit.d.ts.map +1 -0
- package/dist/toolkit.js +22 -0
- package/dist/toolkit.js.map +1 -0
- package/dist/toolset.d.ts +89 -0
- package/dist/toolset.d.ts.map +1 -0
- package/dist/toolset.js +67 -0
- package/dist/toolset.js.map +1 -0
- package/dist/types.d.ts +57 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +80 -4
- package/skills/ts-pf-mcp/SKILL.md +134 -0
package/dist/schema.js
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { toJsonSchema } from '@ts-pf/docs';
|
|
2
|
+
const emptyObject = () => ({ type: 'object', properties: {} });
|
|
3
|
+
const cache = new WeakMap();
|
|
4
|
+
function isObject(value) {
|
|
5
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
6
|
+
}
|
|
7
|
+
function branchesOf(schema) {
|
|
8
|
+
const branches = schema.anyOf ?? schema.oneOf;
|
|
9
|
+
return Array.isArray(branches) ? branches.filter(isObject) : undefined;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Inline local `$ref`s (`#/$defs/X`, `#/definitions/X`) so clients that do not
|
|
13
|
+
* resolve references still see the full shape. A recursive reference stays a
|
|
14
|
+
* `$ref` (its definitions are kept) and is reported.
|
|
15
|
+
*/
|
|
16
|
+
function inlineRefs(root) {
|
|
17
|
+
const defs = {
|
|
18
|
+
...(isObject(root.definitions) ? root.definitions : {}),
|
|
19
|
+
...(isObject(root.$defs) ? root.$defs : {}),
|
|
20
|
+
};
|
|
21
|
+
let recursive = false;
|
|
22
|
+
const visit = (node, stack) => {
|
|
23
|
+
if (Array.isArray(node))
|
|
24
|
+
return node.map((item) => visit(item, stack));
|
|
25
|
+
if (!isObject(node))
|
|
26
|
+
return node;
|
|
27
|
+
const ref = node.$ref;
|
|
28
|
+
if (typeof ref === 'string') {
|
|
29
|
+
const name = /^#\/(?:\$defs|definitions)\/(.+)$/.exec(ref)?.[1];
|
|
30
|
+
if (ref === '#' || (name !== undefined && stack.includes(name))) {
|
|
31
|
+
recursive = true;
|
|
32
|
+
return node;
|
|
33
|
+
}
|
|
34
|
+
if (name !== undefined && Object.hasOwn(defs, name)) {
|
|
35
|
+
const { $ref: _ref, ...rest } = node;
|
|
36
|
+
const resolved = visit(defs[name], [...stack, name]);
|
|
37
|
+
return Object.keys(rest).length > 0
|
|
38
|
+
? { ...resolved, ...visit(rest, stack) }
|
|
39
|
+
: resolved;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const out = {};
|
|
43
|
+
for (const [key, value] of Object.entries(node)) {
|
|
44
|
+
if (key === '$schema' || key === '$defs' || key === 'definitions')
|
|
45
|
+
continue;
|
|
46
|
+
out[key] = visit(value, stack);
|
|
47
|
+
}
|
|
48
|
+
return out;
|
|
49
|
+
};
|
|
50
|
+
const schema = visit(root, []);
|
|
51
|
+
if (!recursive)
|
|
52
|
+
return { schema, issues: [] };
|
|
53
|
+
return {
|
|
54
|
+
schema: { ...schema, $defs: root.$defs ?? root.definitions },
|
|
55
|
+
issues: [
|
|
56
|
+
{
|
|
57
|
+
level: 'warn',
|
|
58
|
+
message: 'schema is recursive; references stay as $ref',
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/** JSON Schema of a contract / tool schema, inlined; memoized per schema object. */
|
|
64
|
+
function convert(schema, io) {
|
|
65
|
+
const key = schema;
|
|
66
|
+
const hit = io === 'input' ? cache.get(key) : undefined;
|
|
67
|
+
if (hit)
|
|
68
|
+
return hit;
|
|
69
|
+
let result;
|
|
70
|
+
try {
|
|
71
|
+
result = inlineRefs(toJsonSchema(schema, { io }));
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
75
|
+
result = {
|
|
76
|
+
schema: emptyObject(),
|
|
77
|
+
issues: [{ level: 'error', message: `no JSON Schema: ${reason}` }],
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
if (io === 'input')
|
|
81
|
+
cache.set(key, result);
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
/** Top-level keys a model may send: object properties, or the union of a union root's branches. */
|
|
85
|
+
export function inputKeys(schema) {
|
|
86
|
+
const branches = branchesOf(schema);
|
|
87
|
+
if (branches)
|
|
88
|
+
return [...new Set(branches.flatMap(inputKeys))];
|
|
89
|
+
return isObject(schema.properties) ? Object.keys(schema.properties) : [];
|
|
90
|
+
}
|
|
91
|
+
function withoutKeys(schema, keys, issues) {
|
|
92
|
+
const branches = branchesOf(schema);
|
|
93
|
+
if (branches) {
|
|
94
|
+
const which = schema.anyOf ? 'anyOf' : 'oneOf';
|
|
95
|
+
return {
|
|
96
|
+
...schema,
|
|
97
|
+
[which]: branches.map((b) => withoutKeys(b, keys, issues)),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
if (!isObject(schema.properties)) {
|
|
101
|
+
if (Array.isArray(schema.allOf)) {
|
|
102
|
+
issues.push({
|
|
103
|
+
level: 'error',
|
|
104
|
+
message: `allOf root: injected ${keys.join(', ')} cannot be removed; use .input(schema, map)`,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return schema;
|
|
108
|
+
}
|
|
109
|
+
const properties = { ...schema.properties };
|
|
110
|
+
for (const key of keys)
|
|
111
|
+
delete properties[key];
|
|
112
|
+
const out = { ...schema, properties };
|
|
113
|
+
if (Array.isArray(schema.required)) {
|
|
114
|
+
out.required = schema.required.filter((key) => !keys.includes(key));
|
|
115
|
+
}
|
|
116
|
+
return out;
|
|
117
|
+
}
|
|
118
|
+
/** MCP tool arguments are always an object, so the advertised root is `type: 'object'`. */
|
|
119
|
+
function objectRoot(schema, issues) {
|
|
120
|
+
if (schema.type === 'object')
|
|
121
|
+
return schema;
|
|
122
|
+
if (branchesOf(schema) || Array.isArray(schema.allOf)) {
|
|
123
|
+
issues.push({
|
|
124
|
+
level: 'warn',
|
|
125
|
+
message: 'input root is a union / allOf; some clients only read top-level properties. Consider .input(schema, map)',
|
|
126
|
+
});
|
|
127
|
+
return { type: 'object', ...schema };
|
|
128
|
+
}
|
|
129
|
+
issues.push({
|
|
130
|
+
level: 'error',
|
|
131
|
+
message: `input root is not an object (${JSON.stringify(schema.type ?? 'any')}); the model cannot call it. Use .input(schema, map)`,
|
|
132
|
+
});
|
|
133
|
+
return emptyObject();
|
|
134
|
+
}
|
|
135
|
+
/** The JSON Schema of what the model sends: `.input()` schema, or the procedure input minus injected keys. */
|
|
136
|
+
export function modelInputSchema(spec) {
|
|
137
|
+
const source = spec.input?.schema ?? spec.procedure?.['~pf'].input;
|
|
138
|
+
if (source === undefined)
|
|
139
|
+
return { schema: emptyObject(), issues: [] };
|
|
140
|
+
const base = convert(source, 'input');
|
|
141
|
+
const issues = [...base.issues];
|
|
142
|
+
const injected = Object.keys(spec.inject);
|
|
143
|
+
const schema = injected.length > 0
|
|
144
|
+
? withoutKeys(base.schema, injected, issues)
|
|
145
|
+
: base.schema;
|
|
146
|
+
return { schema: objectRoot(schema, issues), issues };
|
|
147
|
+
}
|
|
148
|
+
/** Input keys of a procedure, for `all({ inject })` (each key goes only to tools that have it). */
|
|
149
|
+
export function procedureInputKeys(spec) {
|
|
150
|
+
const source = spec.procedure?.['~pf'].input;
|
|
151
|
+
return source === undefined ? [] : inputKeys(convert(source, 'input').schema);
|
|
152
|
+
}
|
|
153
|
+
/** The advertised `outputSchema`: only for `.output(schema, map)` with an object root. */
|
|
154
|
+
export function modelOutputSchema(spec) {
|
|
155
|
+
const source = spec.output?.schema;
|
|
156
|
+
if (source === undefined)
|
|
157
|
+
return { issues: [] };
|
|
158
|
+
const { schema, issues } = convert(source, 'output');
|
|
159
|
+
if (schema.type !== 'object') {
|
|
160
|
+
return {
|
|
161
|
+
issues: [
|
|
162
|
+
...issues,
|
|
163
|
+
{
|
|
164
|
+
level: 'warn',
|
|
165
|
+
message: 'output schema root is not an object; outputSchema is not advertised',
|
|
166
|
+
},
|
|
167
|
+
],
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
return { schema, issues };
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/sdk.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type McpServerFactory } from '@modelcontextprotocol/server';
|
|
2
|
+
import { type CallInterceptor, type ImplementedRouter } from '@ts-pf/server';
|
|
3
|
+
import { type CallPipelineOptions } from './bind.js';
|
|
4
|
+
import type { MaybePromise } from './infer.js';
|
|
5
|
+
import type { McpCallInfo, McpTools } from './types.js';
|
|
6
|
+
/** Server identity and listing options, for both forms. */
|
|
7
|
+
export type McpFactoryOptions = {
|
|
8
|
+
name: string;
|
|
9
|
+
version: string;
|
|
10
|
+
instructions?: string;
|
|
11
|
+
/** `tools/list` cache hint (`cacheScope: 'private'`). Default 0. */
|
|
12
|
+
listTtlMs?: number;
|
|
13
|
+
};
|
|
14
|
+
/** `context` is required when the app carries a `$context` brand; optional for an unbranded tree. */
|
|
15
|
+
type ContextOption<Ctx> = unknown extends Ctx ? {
|
|
16
|
+
context?: (info: McpCallInfo) => unknown;
|
|
17
|
+
} : {
|
|
18
|
+
context: (info: McpCallInfo) => MaybePromise<Ctx>;
|
|
19
|
+
};
|
|
20
|
+
type AppFactoryOptions<Ctx> = McpFactoryOptions & CallPipelineOptions & {
|
|
21
|
+
interceptors?: readonly CallInterceptor[];
|
|
22
|
+
} & ContextOption<Ctx>;
|
|
23
|
+
/**
|
|
24
|
+
* A per-request `McpServer` factory for `createMcpHandler` / `serveStdio`.
|
|
25
|
+
* Pass bound `McpTools` (shaped), or an `app` to expose every procedure.
|
|
26
|
+
* A fresh server per request: one instance cannot serve overlapping requests.
|
|
27
|
+
*/
|
|
28
|
+
export declare function createMcpFactory(source: McpTools, options: McpFactoryOptions): McpServerFactory;
|
|
29
|
+
export declare function createMcpFactory<T, Ctx>(source: ImplementedRouter<T, Ctx>, options: AppFactoryOptions<NoInfer<Ctx>>): McpServerFactory;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=sdk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EAEtB,MAAM,8BAA8B,CAAA;AAGrC,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EAEvB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAe,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAK9C,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAEvD,2DAA2D;AAC3D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,qGAAqG;AACrG,KAAK,aAAa,CAAC,GAAG,IAAI,OAAO,SAAS,GAAG,GACzC;IAAE,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,CAAA;CAAE,GAC5C;IAAE,OAAO,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,YAAY,CAAC,GAAG,CAAC,CAAA;CAAE,CAAA;AAEzD,KAAK,iBAAiB,CAAC,GAAG,IAAI,iBAAiB,GAC7C,mBAAmB,GAAG;IACpB,YAAY,CAAC,EAAE,SAAS,eAAe,EAAE,CAAA;CAC1C,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;AAwDxB;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,QAAQ,EAChB,OAAO,EAAE,iBAAiB,GACzB,gBAAgB,CAAA;AACnB,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,GAAG,EACrC,MAAM,EAAE,iBAAiB,CAAC,CAAC,EAAE,GAAG,CAAC,EACjC,OAAO,EAAE,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GACvC,gBAAgB,CAAA"}
|
package/dist/sdk.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { McpServer, } from '@modelcontextprotocol/server';
|
|
2
|
+
import { defined } from '@ts-pf/protocol';
|
|
3
|
+
import { isImplementedProcedure, } from '@ts-pf/server';
|
|
4
|
+
import { bindToolset } from './bind.js';
|
|
5
|
+
import { appExecutor } from './executor.js';
|
|
6
|
+
import { toolName } from './names.js';
|
|
7
|
+
import { DEFAULT_MAX_RESULT_CHARS } from './result.js';
|
|
8
|
+
import { procedureSpec } from './tool.js';
|
|
9
|
+
import { isHidden } from './tool-meta.js';
|
|
10
|
+
/** Advertise our JSON Schema, never re-validate: one validation pass, our messages. */
|
|
11
|
+
function passthrough(schema) {
|
|
12
|
+
return {
|
|
13
|
+
'~standard': {
|
|
14
|
+
version: 1,
|
|
15
|
+
vendor: 'ts-pf',
|
|
16
|
+
validate: (value) => ({ value }),
|
|
17
|
+
jsonSchema: { input: () => schema, output: () => schema },
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function isMcpTools(source) {
|
|
22
|
+
const s = source;
|
|
23
|
+
return typeof s.list === 'function' && typeof s.call === 'function';
|
|
24
|
+
}
|
|
25
|
+
/** One tool per implemented procedure, named by path; `docs({ hidden: true })` is skipped. */
|
|
26
|
+
function appToolSpecs(app) {
|
|
27
|
+
const tools = {};
|
|
28
|
+
const visit = (node, path) => {
|
|
29
|
+
if (isImplementedProcedure(node)) {
|
|
30
|
+
const spec = procedureSpec(path.join('.'), node['~pf'].contract);
|
|
31
|
+
if (isHidden(spec))
|
|
32
|
+
return;
|
|
33
|
+
const name = toolName(spec.path);
|
|
34
|
+
if (Object.hasOwn(tools, name)) {
|
|
35
|
+
throw new Error(`createMcpFactory(): duplicate tool name "${name}"`);
|
|
36
|
+
}
|
|
37
|
+
tools[name] = spec;
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (typeof node !== 'object' || node === null)
|
|
41
|
+
return;
|
|
42
|
+
for (const [key, child] of Object.entries(node)) {
|
|
43
|
+
if (key !== '~pf')
|
|
44
|
+
visit(child, [...path, key]);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
visit(app, []);
|
|
48
|
+
return tools;
|
|
49
|
+
}
|
|
50
|
+
function appTools(app, options) {
|
|
51
|
+
return bindToolset({ contract: undefined, tools: appToolSpecs(app), hosts: {} }, {
|
|
52
|
+
executor: appExecutor(app, options.context, options.interceptors),
|
|
53
|
+
onError: options.onError,
|
|
54
|
+
maxResultChars: options.maxResultChars ?? DEFAULT_MAX_RESULT_CHARS,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
export function createMcpFactory(source, options) {
|
|
58
|
+
const tools = isMcpTools(source) ? source : appTools(source, options);
|
|
59
|
+
return async ({ authInfo, requestInfo, era }) => {
|
|
60
|
+
const server = new McpServer({ name: options.name, version: options.version }, defined({
|
|
61
|
+
instructions: options.instructions,
|
|
62
|
+
cacheHints: {
|
|
63
|
+
'tools/list': {
|
|
64
|
+
ttlMs: options.listTtlMs ?? 0,
|
|
65
|
+
cacheScope: 'private',
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
}));
|
|
69
|
+
const base = defined({ authInfo, requestInfo, era });
|
|
70
|
+
for (const tool of await tools.list(base)) {
|
|
71
|
+
server.registerTool(tool.name, defined({
|
|
72
|
+
description: tool.description,
|
|
73
|
+
annotations: tool.annotations,
|
|
74
|
+
inputSchema: passthrough(tool.inputSchema),
|
|
75
|
+
outputSchema: tool.outputSchema && passthrough(tool.outputSchema),
|
|
76
|
+
}), (args, ctx) => tools.call(tool.name, args, defined({
|
|
77
|
+
...base,
|
|
78
|
+
authInfo: ctx.http?.authInfo ?? authInfo,
|
|
79
|
+
requestInfo: ctx.http?.req ?? requestInfo,
|
|
80
|
+
signal: ctx.mcpReq.signal,
|
|
81
|
+
inputResponses: ctx.mcpReq.inputResponses,
|
|
82
|
+
})));
|
|
83
|
+
}
|
|
84
|
+
return server;
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=sdk.js.map
|
package/dist/sdk.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"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"}
|
package/dist/search.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type SearchDocument = {
|
|
2
|
+
id: string;
|
|
3
|
+
text: string;
|
|
4
|
+
};
|
|
5
|
+
export interface SearchIndex {
|
|
6
|
+
/** Ids with a positive BM25 score, best first. */
|
|
7
|
+
search(query: string): string[];
|
|
8
|
+
}
|
|
9
|
+
/** Lower-case word tokens; splits `snake_case`, `camelCase`, and punctuation. */
|
|
10
|
+
export declare function tokenize(text: string): string[];
|
|
11
|
+
/** BM25 over small documents (name, description, tags, aliases). Built once per host bucket. */
|
|
12
|
+
export declare function createSearchIndex(documents: readonly SearchDocument[]): SearchIndex;
|
|
13
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAEzD,MAAM,WAAW,WAAW;IAC1B,kDAAkD;IAClD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAChC;AAKD,iFAAiF;AACjF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAM/C;AAED,gGAAgG;AAChG,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,SAAS,cAAc,EAAE,GACnC,WAAW,CAsCb"}
|
package/dist/search.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const K1 = 1.2;
|
|
2
|
+
const B = 0.75;
|
|
3
|
+
/** Lower-case word tokens; splits `snake_case`, `camelCase`, and punctuation. */
|
|
4
|
+
export function tokenize(text) {
|
|
5
|
+
return text
|
|
6
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1 $2')
|
|
7
|
+
.toLowerCase()
|
|
8
|
+
.split(/[^a-z0-9]+/)
|
|
9
|
+
.filter((token) => token.length > 0);
|
|
10
|
+
}
|
|
11
|
+
/** BM25 over small documents (name, description, tags, aliases). Built once per host bucket. */
|
|
12
|
+
export function createSearchIndex(documents) {
|
|
13
|
+
const docs = documents.map((doc) => {
|
|
14
|
+
const terms = new Map();
|
|
15
|
+
const tokens = tokenize(doc.text);
|
|
16
|
+
for (const token of tokens)
|
|
17
|
+
terms.set(token, (terms.get(token) ?? 0) + 1);
|
|
18
|
+
return { id: doc.id, terms, length: tokens.length };
|
|
19
|
+
});
|
|
20
|
+
const avgLength = docs.reduce((sum, doc) => sum + doc.length, 0) / Math.max(docs.length, 1);
|
|
21
|
+
const docFreq = new Map();
|
|
22
|
+
for (const doc of docs) {
|
|
23
|
+
for (const term of doc.terms.keys()) {
|
|
24
|
+
docFreq.set(term, (docFreq.get(term) ?? 0) + 1);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const idf = (term) => {
|
|
28
|
+
const n = docFreq.get(term) ?? 0;
|
|
29
|
+
return Math.log(1 + (docs.length - n + 0.5) / (n + 0.5));
|
|
30
|
+
};
|
|
31
|
+
return {
|
|
32
|
+
search(query) {
|
|
33
|
+
const terms = [...new Set(tokenize(query))];
|
|
34
|
+
return docs
|
|
35
|
+
.map((doc) => {
|
|
36
|
+
let score = 0;
|
|
37
|
+
for (const term of terms) {
|
|
38
|
+
const tf = doc.terms.get(term) ?? 0;
|
|
39
|
+
if (tf === 0)
|
|
40
|
+
continue;
|
|
41
|
+
const norm = 1 - B + (B * doc.length) / (avgLength || 1);
|
|
42
|
+
score += (idf(term) * tf * (K1 + 1)) / (tf + K1 * norm);
|
|
43
|
+
}
|
|
44
|
+
return { id: doc.id, score };
|
|
45
|
+
})
|
|
46
|
+
.filter((hit) => hit.score > 0)
|
|
47
|
+
.sort((a, b) => b.score - a.score)
|
|
48
|
+
.map((hit) => hit.id);
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type Effect } from './meta.js';
|
|
2
|
+
import type { ToolSpec } from './tool.js';
|
|
3
|
+
import type { McpToolAnnotations } from './types.js';
|
|
4
|
+
/** `.effect()` → `mcp({ effect })`; `undefined` when neither classifies the tool. */
|
|
5
|
+
export declare function declaredEffect(spec: ToolSpec): Effect | undefined;
|
|
6
|
+
/** Unclassified tools count as `write`: they never claim to be harmless. */
|
|
7
|
+
export declare function effectOf(spec: ToolSpec): Effect;
|
|
8
|
+
/** `.describe()` → `mcp({ description })` → `docs().description` → `docs().summary`. */
|
|
9
|
+
export declare function descriptionOf(spec: ToolSpec): string;
|
|
10
|
+
export declare function tagsOf(spec: ToolSpec): readonly string[];
|
|
11
|
+
export declare function aliasesOf(spec: ToolSpec): readonly string[];
|
|
12
|
+
export declare function isHidden(spec: ToolSpec): boolean;
|
|
13
|
+
export declare function annotationsFor(effect: Effect): McpToolAnnotations;
|
|
14
|
+
//# sourceMappingURL=tool-meta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-meta.d.ts","sourceRoot":"","sources":["../src/tool-meta.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAyB,MAAM,WAAW,CAAA;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAcpD,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAEjE;AAED,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAE/C;AAED,wFAAwF;AACxF,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CASpD;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,MAAM,EAAE,CAExD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,MAAM,EAAE,CAE3D;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAEhD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAGjE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { getDocs } from '@ts-pf/docs';
|
|
2
|
+
import { MCP_KEY } from './meta.js';
|
|
3
|
+
function contractMeta(spec) {
|
|
4
|
+
return (spec.procedure?.['~pf'].meta ?? {});
|
|
5
|
+
}
|
|
6
|
+
function mcpMeta(spec) {
|
|
7
|
+
const value = contractMeta(spec)[MCP_KEY];
|
|
8
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
/** `.effect()` → `mcp({ effect })`; `undefined` when neither classifies the tool. */
|
|
14
|
+
export function declaredEffect(spec) {
|
|
15
|
+
return spec.effect ?? mcpMeta(spec)?.effect;
|
|
16
|
+
}
|
|
17
|
+
/** Unclassified tools count as `write`: they never claim to be harmless. */
|
|
18
|
+
export function effectOf(spec) {
|
|
19
|
+
return declaredEffect(spec) ?? 'write';
|
|
20
|
+
}
|
|
21
|
+
/** `.describe()` → `mcp({ description })` → `docs().description` → `docs().summary`. */
|
|
22
|
+
export function descriptionOf(spec) {
|
|
23
|
+
const docs = getDocs(contractMeta(spec));
|
|
24
|
+
return (spec.description ??
|
|
25
|
+
mcpMeta(spec)?.description ??
|
|
26
|
+
docs?.description ??
|
|
27
|
+
docs?.summary ??
|
|
28
|
+
'');
|
|
29
|
+
}
|
|
30
|
+
export function tagsOf(spec) {
|
|
31
|
+
return getDocs(contractMeta(spec))?.tags ?? [];
|
|
32
|
+
}
|
|
33
|
+
export function aliasesOf(spec) {
|
|
34
|
+
return mcpMeta(spec)?.aliases ?? [];
|
|
35
|
+
}
|
|
36
|
+
export function isHidden(spec) {
|
|
37
|
+
return getDocs(contractMeta(spec))?.hidden === true;
|
|
38
|
+
}
|
|
39
|
+
export function annotationsFor(effect) {
|
|
40
|
+
if (effect === 'read')
|
|
41
|
+
return { readOnlyHint: true };
|
|
42
|
+
return { readOnlyHint: false, destructiveHint: effect === 'destructive' };
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=tool-meta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-meta.js","sourceRoot":"","sources":["../src/tool-meta.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAe,OAAO,EAAgB,MAAM,WAAW,CAAA;AAI9D,SAAS,YAAY,CAAC,IAAc;IAClC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAA;AACxE,CAAC;AAED,SAAS,OAAO,CAAC,IAAc;IAC7B,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAA;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,OAAO,KAAgB,CAAA;AACzB,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,cAAc,CAAC,IAAc;IAC3C,OAAO,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;AAC7C,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,QAAQ,CAAC,IAAc;IACrC,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,OAAO,CAAA;AACxC,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,aAAa,CAAC,IAAc;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;IACxC,OAAO,CACL,IAAI,CAAC,WAAW;QAChB,OAAO,CAAC,IAAI,CAAC,EAAE,WAAW;QAC1B,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,OAAO;QACb,EAAE,CACH,CAAA;AACH,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAc;IACnC,OAAO,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;AAChD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,OAAO,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,IAAI,EAAE,CAAA;AACrC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAc;IACrC,OAAO,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;AACrD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,CAAA;IACpD,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,KAAK,aAAa,EAAE,CAAA;AAC3E,CAAC"}
|
package/dist/tool.d.ts
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type { AnySchema, ContractClient, ContractProcedure, ErrorDef, InferErrorData, InferSchemaInput, InferSchemaOutput } from '@ts-pf/contract';
|
|
2
|
+
import type { DistOmit, Err, FieldOf, In, KeysOfUnion, MaybePromise, Out } from './infer.js';
|
|
3
|
+
import type { Effect } from './meta.js';
|
|
4
|
+
import type { McpCallInfo } from './types.js';
|
|
5
|
+
/** Type-only view of the required `'~tool'` brand. At runtime the key holds a `ToolSpec`. */
|
|
6
|
+
export type ToolPhantom<Path extends string, Ctx, Model> = {
|
|
7
|
+
path: Path;
|
|
8
|
+
ctx: (context: Ctx) => void;
|
|
9
|
+
model: Model;
|
|
10
|
+
};
|
|
11
|
+
/** `never` context: a tool built for any context is assignable. */
|
|
12
|
+
export type AnyTool<Ctx = never> = {
|
|
13
|
+
readonly '~tool': ToolPhantom<string, Ctx, unknown>;
|
|
14
|
+
};
|
|
15
|
+
export type MapperOpts<T, Ctx> = {
|
|
16
|
+
context: Ctx;
|
|
17
|
+
info: McpCallInfo;
|
|
18
|
+
/** A typed client on the same executor, for joins across procedures. */
|
|
19
|
+
call: ContractClient<T>;
|
|
20
|
+
};
|
|
21
|
+
export type InjectFn = (o: {
|
|
22
|
+
context: unknown;
|
|
23
|
+
info: McpCallInfo;
|
|
24
|
+
}) => unknown;
|
|
25
|
+
type RuntimeOpts = MapperOpts<unknown, unknown>;
|
|
26
|
+
type Mapper = (value: unknown, o: RuntimeOpts) => unknown;
|
|
27
|
+
export type ErrorText = (o: {
|
|
28
|
+
data: unknown;
|
|
29
|
+
message: string;
|
|
30
|
+
context: unknown;
|
|
31
|
+
}) => string;
|
|
32
|
+
/** Runtime description of one tool; what `'~tool'` holds. */
|
|
33
|
+
export interface ToolSpec {
|
|
34
|
+
/** Procedure path (`user.find`); `''` for a `$tool` composite. */
|
|
35
|
+
readonly path: string;
|
|
36
|
+
readonly procedure?: ContractProcedure;
|
|
37
|
+
readonly description?: string;
|
|
38
|
+
readonly effect?: Effect;
|
|
39
|
+
readonly inject: Readonly<Record<string, InjectFn>>;
|
|
40
|
+
/** `.input(schema, map)`, or a composite's input schema (no `map`). */
|
|
41
|
+
readonly input?: {
|
|
42
|
+
schema: AnySchema;
|
|
43
|
+
map?: Mapper;
|
|
44
|
+
};
|
|
45
|
+
readonly output?: {
|
|
46
|
+
schema?: AnySchema;
|
|
47
|
+
map: Mapper;
|
|
48
|
+
};
|
|
49
|
+
readonly errors: Readonly<Record<string, ErrorText>>;
|
|
50
|
+
readonly examples: readonly unknown[];
|
|
51
|
+
/** `$tool` composites run this instead of a procedure. */
|
|
52
|
+
readonly run?: (o: RuntimeOpts & {
|
|
53
|
+
input: unknown;
|
|
54
|
+
}) => unknown;
|
|
55
|
+
}
|
|
56
|
+
export declare function toolSpec(tool: AnyTool): ToolSpec;
|
|
57
|
+
export declare function isTool(value: unknown): value is AnyTool;
|
|
58
|
+
type Mode = 'none' | 'inject' | 'input';
|
|
59
|
+
export type BuilderState = {
|
|
60
|
+
model: unknown;
|
|
61
|
+
mode: Mode;
|
|
62
|
+
};
|
|
63
|
+
export interface ToolBuilder<T, P, Ctx, Path extends string, S extends BuilderState> {
|
|
64
|
+
readonly '~tool': ToolPhantom<Path, Ctx, S['model']>;
|
|
65
|
+
describe(text: string): ToolBuilder<T, P, Ctx, Path, S>;
|
|
66
|
+
/** Overrides `mcp({ effect })`. Unclassified tools are treated as `write`. */
|
|
67
|
+
effect(effect: Effect): ToolBuilder<T, P, Ctx, Path, S>;
|
|
68
|
+
/** Hide input keys from the model and fill them per call (tenant ids, forced safe defaults). */
|
|
69
|
+
inject: S['mode'] extends 'input' ? (error: '.inject() cannot be combined with .input(); inject inside the input map', ...rest: unknown[]) => never : [S['model']] extends [object] ? <K extends KeysOfUnion<S['model']>>(map: {
|
|
70
|
+
[Q in K]: (o: {
|
|
71
|
+
context: Ctx;
|
|
72
|
+
info: McpCallInfo;
|
|
73
|
+
}) => MaybePromise<FieldOf<S['model'], Q>>;
|
|
74
|
+
}) => ToolBuilder<T, P, Ctx, Path, {
|
|
75
|
+
model: DistOmit<S['model'], K>;
|
|
76
|
+
mode: 'inject';
|
|
77
|
+
}> : (error: '.inject() needs an object input') => never;
|
|
78
|
+
/** A new model-facing input; `map` must return the procedure input. */
|
|
79
|
+
input: S['mode'] extends 'none' ? <Sch extends AnySchema, A = InferSchemaOutput<Sch>>(schema: Sch, map: (args: A, o: MapperOpts<T, Ctx>) => MaybePromise<In<P>>) => ToolBuilder<T, P, Ctx, Path, {
|
|
80
|
+
model: InferSchemaInput<Sch>;
|
|
81
|
+
mode: 'input';
|
|
82
|
+
}> : (error: '.input() cannot be combined with .inject(); inject inside the input map', ...rest: unknown[]) => never;
|
|
83
|
+
/** Reshape the result. No `outputSchema` is advertised without a schema. */
|
|
84
|
+
output<R>(map: (out: Out<P>, o: MapperOpts<T, Ctx>) => MaybePromise<R>): ToolBuilder<T, P, Ctx, Path, S>;
|
|
85
|
+
/** Reshape the result and advertise `schema` as `outputSchema`; results are checked against it. */
|
|
86
|
+
output<Sch extends AnySchema, R extends InferSchemaInput<Sch>>(schema: Sch, map: (out: Out<P>, o: MapperOpts<T, Ctx>) => MaybePromise<R>): ToolBuilder<T, P, Ctx, Path, S>;
|
|
87
|
+
/** Rewrite declared errors into a next step for the model. */
|
|
88
|
+
errors(map: {
|
|
89
|
+
[K in keyof Err<P> & string]?: (o: {
|
|
90
|
+
data: Err<P>[K] extends infer D extends ErrorDef ? InferErrorData<D> : never;
|
|
91
|
+
message: string;
|
|
92
|
+
context: Ctx;
|
|
93
|
+
}) => string;
|
|
94
|
+
}): ToolBuilder<T, P, Ctx, Path, S>;
|
|
95
|
+
/** Appended to the description; returned by hosts at `detail: 'full'`. */
|
|
96
|
+
examples(list: readonly S['model'][]): ToolBuilder<T, P, Ctx, Path, S>;
|
|
97
|
+
}
|
|
98
|
+
/** Immutable builder: each method returns a new builder over a copied spec. */
|
|
99
|
+
export declare function createToolBuilder(spec: ToolSpec): unknown;
|
|
100
|
+
export declare function procedureSpec(path: string, procedure: ContractProcedure): ToolSpec;
|
|
101
|
+
export {};
|
|
102
|
+
//# sourceMappingURL=tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"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"}
|
package/dist/tool.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export function toolSpec(tool) {
|
|
2
|
+
return tool['~tool'];
|
|
3
|
+
}
|
|
4
|
+
export function isTool(value) {
|
|
5
|
+
return (typeof value === 'object' &&
|
|
6
|
+
value !== null &&
|
|
7
|
+
typeof value['~tool'] === 'object');
|
|
8
|
+
}
|
|
9
|
+
/** Immutable builder: each method returns a new builder over a copied spec. */
|
|
10
|
+
export function createToolBuilder(spec) {
|
|
11
|
+
const next = (patch) => createToolBuilder({ ...spec, ...patch });
|
|
12
|
+
return {
|
|
13
|
+
'~tool': spec,
|
|
14
|
+
describe: (description) => next({ description }),
|
|
15
|
+
effect: (effect) => next({ effect }),
|
|
16
|
+
inject: (map) => next({ inject: { ...spec.inject, ...map } }),
|
|
17
|
+
input: (schema, map) => next({ input: { schema, map } }),
|
|
18
|
+
output: (schemaOrMap, map) => next({
|
|
19
|
+
output: map
|
|
20
|
+
? { schema: schemaOrMap, map }
|
|
21
|
+
: { map: schemaOrMap },
|
|
22
|
+
}),
|
|
23
|
+
errors: (errors) => next({ errors: { ...spec.errors, ...errors } }),
|
|
24
|
+
examples: (examples) => next({ examples }),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export function procedureSpec(path, procedure) {
|
|
28
|
+
return { path, procedure, inject: {}, errors: {}, examples: [] };
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=tool.js.map
|
package/dist/tool.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"AAmEA,MAAM,UAAU,QAAQ,CAAC,IAAa;IACpC,OAAO,IAAI,CAAC,OAAO,CAAwB,CAAA;AAC7C,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAc;IACnC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAQ,KAAiC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAChE,CAAA;AACH,CAAC;AA+ED,+EAA+E;AAC/E,MAAM,UAAU,iBAAiB,CAAC,IAAc;IAC9C,MAAM,IAAI,GAAG,CAAC,KAAwB,EAAE,EAAE,CACxC,iBAAiB,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC,CAAA;IAC1C,OAAO;QACL,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,CAAC,WAAmB,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC;QACxD,MAAM,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAC5C,MAAM,EAAE,CAAC,GAA6B,EAAE,EAAE,CACxC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC;QAC9C,KAAK,EAAE,CAAC,MAAiB,EAAE,GAAW,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QAC3E,MAAM,EAAE,CAAC,WAA+B,EAAE,GAAY,EAAE,EAAE,CACxD,IAAI,CAAC;YACH,MAAM,EAAE,GAAG;gBACT,CAAC,CAAC,EAAE,MAAM,EAAE,WAAwB,EAAE,GAAG,EAAE;gBAC3C,CAAC,CAAC,EAAE,GAAG,EAAE,WAAqB,EAAE;SACnC,CAAC;QACJ,MAAM,EAAE,CAAC,MAAiC,EAAE,EAAE,CAC5C,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC;QACjD,QAAQ,EAAE,CAAC,QAA4B,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;KAC/D,CAAA;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,SAA4B;IAE5B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;AAClE,CAAC"}
|