@kindgi/tools 0.1.1 → 0.1.3
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 +2 -0
- package/dist/define.d.ts.map +1 -1
- package/dist/define.js +11 -18
- package/dist/define.js.map +1 -1
- package/dist/invoke.d.ts +8 -0
- package/dist/invoke.d.ts.map +1 -1
- package/dist/invoke.js +24 -20
- package/dist/invoke.js.map +1 -1
- package/dist/tool.schema.json +2 -2
- package/dist/types.d.ts +14 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +7 -6
- package/src/define.ts +11 -21
- package/src/invoke.ts +32 -24
- package/src/tool.schema.json +2 -2
- package/src/types.ts +14 -1
package/README.md
CHANGED
|
@@ -6,6 +6,8 @@ Author, register, and invoke tools for Kindgi. A tool is a typed, effect-declare
|
|
|
6
6
|
|
|
7
7
|
Tools declare their `input` and `output` shapes as **either** JSON Schema Draft 2020-12 objects **or** Zod v4 schemas. The wire form is always JSON Schema — Zod authoring is TS-user sugar the framework converts at author time via `z.toJSONSchema()`.
|
|
8
8
|
|
|
9
|
+
A tool's schemas compile as Draft 2020-12 in Ajv's strict mode, which refuses loosely written JSON Schema (unknown keywords, union `type`s, open tuples). An MCP server's tools (`transport: 'mcp'`) are the exception: their schemas are the server's, compiled in the dialect they declare in `$schema` (draft-06, draft-07, 2019-09 or 2020-12) and without strict mode. Servers built with the TypeScript MCP SDK declare draft-07.
|
|
10
|
+
|
|
9
11
|
### Authoring with JSON Schema
|
|
10
12
|
|
|
11
13
|
The wire form, portable to Python / Go / Rust pack authors publishing over MCP.
|
package/dist/define.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"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"}
|
package/dist/define.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import { createSpecRegistry, isZodSchema, loadZodConverter, loadZodConverterSync, toJSONSchemaSync, } from '@kindgi/schema';
|
|
3
|
+
import { compileJsonSchema, createSpecRegistry, isZodSchema, loadZodConverter, loadZodConverterSync, toJSONSchemaSync, } from '@kindgi/schema';
|
|
4
|
+
import { schemaOptions } from './invoke.js';
|
|
6
5
|
import { getToolSpecSynthesizer } from './spec-registry.js';
|
|
7
6
|
import toolSchema from './tool.schema.json' with { type: 'json' };
|
|
8
7
|
import { EFFECT_KINDS, } from './types.js';
|
|
@@ -15,10 +14,6 @@ const TOOL_SCHEMA_URI = 'https://kindgi.com/schemas/v1/tool.schema.json';
|
|
|
15
14
|
* dispatch time).
|
|
16
15
|
*/
|
|
17
16
|
const SEMVER_EXACT_RE = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/;
|
|
18
|
-
const addFormatsRaw = addFormatsModule;
|
|
19
|
-
const addFormats = typeof addFormatsRaw === 'function'
|
|
20
|
-
? addFormatsRaw
|
|
21
|
-
: addFormatsRaw.default;
|
|
22
17
|
let cachedRegistry;
|
|
23
18
|
function registry() {
|
|
24
19
|
if (cachedRegistry !== undefined)
|
|
@@ -40,15 +35,13 @@ function resolveZodConverterSync() {
|
|
|
40
35
|
return loadZodConverterSync();
|
|
41
36
|
}
|
|
42
37
|
/**
|
|
43
|
-
* Sanity-check that a candidate JSON Schema compiles
|
|
44
|
-
*
|
|
45
|
-
*
|
|
38
|
+
* Sanity-check that a candidate JSON Schema compiles as the tool's
|
|
39
|
+
* schemas do (`schemaOptions`): a pack's own tool's as Draft 2020-12 in
|
|
40
|
+
* Ajv's strict mode, an MCP server's in the dialect it declares.
|
|
46
41
|
*/
|
|
47
|
-
function compilesAsSchema(schema, where) {
|
|
48
|
-
const ajv = new Ajv2020({ strict: true, allErrors: true, allowUnionTypes: false });
|
|
49
|
-
addFormats(ajv);
|
|
42
|
+
function compilesAsSchema(schema, where, tool) {
|
|
50
43
|
try {
|
|
51
|
-
|
|
44
|
+
compileJsonSchema(schema, schemaOptions(tool));
|
|
52
45
|
return undefined;
|
|
53
46
|
}
|
|
54
47
|
catch (cause) {
|
|
@@ -193,10 +186,10 @@ function finalizeDefinition(spec, converter, options) {
|
|
|
193
186
|
const badEffect = checkEffectKinds(manifest);
|
|
194
187
|
if (badEffect)
|
|
195
188
|
return { kind: 'err', error: badEffect };
|
|
196
|
-
const badInput = compilesAsSchema(manifest.input, 'input');
|
|
189
|
+
const badInput = compilesAsSchema(manifest.input, 'input', manifest);
|
|
197
190
|
if (badInput)
|
|
198
191
|
return { kind: 'err', error: badInput };
|
|
199
|
-
const badOutput = compilesAsSchema(manifest.output, 'output');
|
|
192
|
+
const badOutput = compilesAsSchema(manifest.output, 'output', manifest);
|
|
200
193
|
if (badOutput)
|
|
201
194
|
return { kind: 'err', error: badOutput };
|
|
202
195
|
const tool = {
|
|
@@ -273,10 +266,10 @@ export function validateToolManifest(manifest) {
|
|
|
273
266
|
const badEffect = checkEffectKinds(parsed);
|
|
274
267
|
if (badEffect)
|
|
275
268
|
return { kind: 'err', error: badEffect };
|
|
276
|
-
const badInput = compilesAsSchema(parsed.input, 'input');
|
|
269
|
+
const badInput = compilesAsSchema(parsed.input, 'input', parsed);
|
|
277
270
|
if (badInput)
|
|
278
271
|
return { kind: 'err', error: badInput };
|
|
279
|
-
const badOutput = compilesAsSchema(parsed.output, 'output');
|
|
272
|
+
const badOutput = compilesAsSchema(parsed.output, 'output', parsed);
|
|
280
273
|
if (badOutput)
|
|
281
274
|
return { kind: 'err', error: badOutput };
|
|
282
275
|
const badUrl = checkHttpUrlTemplate(parsed);
|
package/dist/define.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define.js","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAEjC,OAAO,
|
|
1
|
+
{"version":3,"file":"define.js","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"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"}
|
package/dist/invoke.d.ts
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
|
+
import type { CompileJsonSchemaOptions } from '@kindgi/schema';
|
|
1
2
|
import type { Result } from '@kindgi/types';
|
|
2
3
|
import type { ToolError } from './errors.js';
|
|
3
4
|
import type { Tool, ToolContext } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* How a tool's schemas compile. A pack's own tools: Draft 2020-12, in
|
|
7
|
+
* Ajv's strict mode (an authoring lint). An MCP server's (`transport:
|
|
8
|
+
* 'mcp'`): in the dialect the server declares, without strict mode — the
|
|
9
|
+
* schema is valid JSON Schema without being written to that lint.
|
|
10
|
+
*/
|
|
11
|
+
export declare function schemaOptions(tool: Pick<Tool, 'transport'>): CompileJsonSchemaOptions;
|
|
4
12
|
export interface InvokeToolOptions {
|
|
5
13
|
/**
|
|
6
14
|
* Skip validation of the handler's return value against `tool.output`.
|
package/dist/invoke.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invoke.d.ts","sourceRoot":"","sources":["../src/invoke.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"invoke.d.ts","sourceRoot":"","sources":["../src/invoke.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,KAAK,EAKV,SAAS,EACV,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAc,IAAI,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAgBhE;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,wBAAwB,CAErF;AA8DD,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;CACzC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,UAAU,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAClE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3B,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,WAAW,EAChB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAyCrC"}
|
package/dist/invoke.js
CHANGED
|
@@ -1,38 +1,42 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
-
import
|
|
4
|
-
import { Ajv2020 } from 'ajv/dist/2020.js';
|
|
5
|
-
import { parseWithSchema } from '@kindgi/schema';
|
|
3
|
+
import { compileJsonSchema, parseWithSchema } from '@kindgi/schema';
|
|
6
4
|
import { isToolPreconditionError } from './precondition.js';
|
|
7
|
-
const addFormatsRaw = addFormatsModule;
|
|
8
|
-
const addFormats = typeof addFormatsRaw === 'function'
|
|
9
|
-
? addFormatsRaw
|
|
10
|
-
: addFormatsRaw.default;
|
|
11
5
|
/**
|
|
12
6
|
* Cache compiled validators keyed by the schema *object reference*. Tools
|
|
13
7
|
* are defined once and reused, so schema identity is stable — the WeakMap
|
|
14
|
-
* releases entries when the tool is dropped.
|
|
8
|
+
* releases entries when the tool is dropped. A pack's tools' validators
|
|
9
|
+
* and an MCP server's are cached apart (`schemaOptions`).
|
|
15
10
|
*/
|
|
16
|
-
const
|
|
17
|
-
|
|
11
|
+
const caches = {
|
|
12
|
+
input: { pack: new WeakMap(), mcp: new WeakMap() },
|
|
13
|
+
output: { pack: new WeakMap(), mcp: new WeakMap() },
|
|
14
|
+
};
|
|
15
|
+
const PACK_SCHEMAS = { dialects: ['2020-12'] };
|
|
16
|
+
const MCP_SCHEMAS = { strict: false };
|
|
17
|
+
/**
|
|
18
|
+
* How a tool's schemas compile. A pack's own tools: Draft 2020-12, in
|
|
19
|
+
* Ajv's strict mode (an authoring lint). An MCP server's (`transport:
|
|
20
|
+
* 'mcp'`): in the dialect the server declares, without strict mode — the
|
|
21
|
+
* schema is valid JSON Schema without being written to that lint.
|
|
22
|
+
*/
|
|
23
|
+
export function schemaOptions(tool) {
|
|
24
|
+
return tool.transport === 'mcp' ? MCP_SCHEMAS : PACK_SCHEMAS;
|
|
25
|
+
}
|
|
18
26
|
/**
|
|
19
27
|
* A compiled validator. Input validators fill in each property's JSON
|
|
20
28
|
* Schema `default` (`useDefaults`) — the data they check is a copy of the
|
|
21
29
|
* caller's.
|
|
22
30
|
*/
|
|
23
|
-
function compile(schema, side) {
|
|
24
|
-
const cache = side === '
|
|
31
|
+
function compile(schema, side, tool) {
|
|
32
|
+
const cache = caches[side][tool.transport === 'mcp' ? 'mcp' : 'pack'];
|
|
25
33
|
const cached = cache.get(schema);
|
|
26
34
|
if (cached !== undefined)
|
|
27
35
|
return cached;
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
allErrors: true,
|
|
31
|
-
allowUnionTypes: false,
|
|
36
|
+
const validator = compileJsonSchema(schema, {
|
|
37
|
+
...schemaOptions(tool),
|
|
32
38
|
...(side === 'input' && { useDefaults: true }),
|
|
33
39
|
});
|
|
34
|
-
addFormats(ajv);
|
|
35
|
-
const validator = ajv.compile(schema);
|
|
36
40
|
cache.set(schema, validator);
|
|
37
41
|
return validator;
|
|
38
42
|
}
|
|
@@ -44,7 +48,7 @@ function compile(schema, side) {
|
|
|
44
48
|
*/
|
|
45
49
|
async function prepareInput(tool, input) {
|
|
46
50
|
const candidate = structuredClone(input);
|
|
47
|
-
const validator = compile(tool.input, 'input');
|
|
51
|
+
const validator = compile(tool.input, 'input', tool);
|
|
48
52
|
if (!validator(candidate)) {
|
|
49
53
|
return { kind: 'err', error: inputError(tool.id, validator.errors ?? []) };
|
|
50
54
|
}
|
|
@@ -111,7 +115,7 @@ export async function invokeTool(tool, input, ctx, options = {}) {
|
|
|
111
115
|
return { kind: 'err', error: err };
|
|
112
116
|
}
|
|
113
117
|
if (!options.skipOutputValidation) {
|
|
114
|
-
const outputValidator = compile(tool.output, 'output');
|
|
118
|
+
const outputValidator = compile(tool.output, 'output', tool);
|
|
115
119
|
if (!outputValidator(output)) {
|
|
116
120
|
const err = {
|
|
117
121
|
code: 'output-validation-failed',
|
package/dist/invoke.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invoke.js","sourceRoot":"","sources":["../src/invoke.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;
|
|
1
|
+
{"version":3,"file":"invoke.js","sourceRoot":"","sources":["../src/invoke.ts"],"names":[],"mappings":"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"}
|
package/dist/tool.schema.json
CHANGED
|
@@ -24,11 +24,11 @@
|
|
|
24
24
|
},
|
|
25
25
|
"input": {
|
|
26
26
|
"type": "object",
|
|
27
|
-
"description": "JSON Schema for the tool input. MUST validate under Draft 2020-12."
|
|
27
|
+
"description": "JSON Schema for the tool input. MUST validate under Draft 2020-12, except on an MCP server's tool (`transport: \"mcp\"`), whose schemas are in the dialect their `$schema` declares: draft-06, draft-07, 2019-09 or 2020-12."
|
|
28
28
|
},
|
|
29
29
|
"output": {
|
|
30
30
|
"type": "object",
|
|
31
|
-
"description": "JSON Schema for the tool output. MUST validate under Draft 2020-12."
|
|
31
|
+
"description": "JSON Schema for the tool output. MUST validate under Draft 2020-12, except on an MCP server's tool (`transport: \"mcp\"`), whose schemas are in the dialect their `$schema` declares: draft-06, draft-07, 2019-09 or 2020-12."
|
|
32
32
|
},
|
|
33
33
|
"needs": {
|
|
34
34
|
"type": "array",
|
package/dist/types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ZodLikeSchema } from '@kindgi/schema';
|
|
2
|
-
import type { TenantId, ToolId, UserId } from '@kindgi/types';
|
|
2
|
+
import type { OrgId, ProjectId, TenantId, ToolId, UserId } from '@kindgi/types';
|
|
3
3
|
/**
|
|
4
4
|
* JSON Schema for a tool's input/output. Author-supplied, Draft 2020-12.
|
|
5
5
|
* Kept as `unknown` here — the loader validates that the provided value is
|
|
@@ -61,6 +61,19 @@ export interface ToolContext {
|
|
|
61
61
|
* agent turn or a flow step. Stable across every call the run makes.
|
|
62
62
|
*/
|
|
63
63
|
readonly runId?: string;
|
|
64
|
+
/**
|
|
65
|
+
* The project of the run the call belongs to. The runtime sets it from
|
|
66
|
+
* the run, never from the run's input or a model's arguments, so a tool
|
|
67
|
+
* can check an id in its input against it. Absent outside a run (a unit
|
|
68
|
+
* test passes its own).
|
|
69
|
+
*/
|
|
70
|
+
readonly projectId?: ProjectId;
|
|
71
|
+
/**
|
|
72
|
+
* The org of that project, when the project belongs to one. The runtime
|
|
73
|
+
* sets it from the project, never from input. Absent when the project
|
|
74
|
+
* has no org, and outside a run.
|
|
75
|
+
*/
|
|
76
|
+
readonly orgId?: OrgId;
|
|
64
77
|
/**
|
|
65
78
|
* Correlation id for this individual call (the model's tool-call id,
|
|
66
79
|
* an MCP request id, a webhook id). Opaque to tools; useful for logs,
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kindgi/tools",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Tool authoring shape + registry + invocation for Kindgi. A tool is a typed, effect-declared unit of work — the same definition runs in-process for one flow, over MCP for another. Pure — no kernel dependency; the kernel bridges tools to node handlers separately.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -18,7 +18,8 @@
|
|
|
18
18
|
"exports": {
|
|
19
19
|
".": {
|
|
20
20
|
"types": "./dist/index.d.ts",
|
|
21
|
-
"import": "./dist/index.js"
|
|
21
|
+
"import": "./dist/index.js",
|
|
22
|
+
"default": "./dist/index.js"
|
|
22
23
|
}
|
|
23
24
|
},
|
|
24
25
|
"files": [
|
|
@@ -29,8 +30,8 @@
|
|
|
29
30
|
"type-manifest.json"
|
|
30
31
|
],
|
|
31
32
|
"dependencies": {
|
|
32
|
-
"@kindgi/schema": "0.1.
|
|
33
|
-
"@kindgi/types": "0.1.
|
|
33
|
+
"@kindgi/schema": "0.1.3",
|
|
34
|
+
"@kindgi/types": "0.1.3",
|
|
34
35
|
"ajv": "^8.17.1",
|
|
35
36
|
"ajv-formats": "^3.0.1",
|
|
36
37
|
"semver": "^7.6.3"
|
|
@@ -44,7 +45,7 @@
|
|
|
44
45
|
}
|
|
45
46
|
},
|
|
46
47
|
"devDependencies": {
|
|
47
|
-
"@kindgi/specs": "0.1.
|
|
48
|
+
"@kindgi/specs": "0.1.3",
|
|
48
49
|
"@types/node": "^22.10.5",
|
|
49
50
|
"@types/semver": "^7.5.8",
|
|
50
51
|
"typescript": "^5.7.3",
|
|
@@ -52,7 +53,7 @@
|
|
|
52
53
|
"zod": "^4.6.5"
|
|
53
54
|
},
|
|
54
55
|
"engines": {
|
|
55
|
-
"node": ">=22.
|
|
56
|
+
"node": ">=22.12.0"
|
|
56
57
|
},
|
|
57
58
|
"publishConfig": {
|
|
58
59
|
"access": "public",
|
package/src/define.ts
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
// Copyright (C) 2026 Kindgi Inc.
|
|
3
3
|
|
|
4
|
-
import * as addFormatsModule from 'ajv-formats';
|
|
5
|
-
import { Ajv2020 } from 'ajv/dist/2020.js';
|
|
6
|
-
|
|
7
4
|
import {
|
|
5
|
+
compileJsonSchema,
|
|
8
6
|
createSpecRegistry,
|
|
9
7
|
isZodSchema,
|
|
10
8
|
loadZodConverter,
|
|
@@ -26,6 +24,7 @@ import type {
|
|
|
26
24
|
ToolError,
|
|
27
25
|
UnknownEffectError,
|
|
28
26
|
} from './errors.js';
|
|
27
|
+
import { schemaOptions } from './invoke.js';
|
|
29
28
|
import { type ToolSpecSynthesizerOptions, getToolSpecSynthesizer } from './spec-registry.js';
|
|
30
29
|
import toolSchema from './tool.schema.json' with { type: 'json' };
|
|
31
30
|
import {
|
|
@@ -47,14 +46,6 @@ const TOOL_SCHEMA_URI = 'https://kindgi.com/schemas/v1/tool.schema.json';
|
|
|
47
46
|
*/
|
|
48
47
|
const SEMVER_EXACT_RE = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/;
|
|
49
48
|
|
|
50
|
-
// ajv-formats CJS/ESM interop — same trick used in @kindgi/schema.
|
|
51
|
-
type AddFormatsFn = (ajv: InstanceType<typeof Ajv2020>, opts?: unknown) => unknown;
|
|
52
|
-
const addFormatsRaw = addFormatsModule as unknown;
|
|
53
|
-
const addFormats: AddFormatsFn =
|
|
54
|
-
typeof addFormatsRaw === 'function'
|
|
55
|
-
? (addFormatsRaw as AddFormatsFn)
|
|
56
|
-
: (addFormatsRaw as { default: AddFormatsFn }).default;
|
|
57
|
-
|
|
58
49
|
let cachedRegistry: SpecRegistry | undefined;
|
|
59
50
|
function registry(): SpecRegistry {
|
|
60
51
|
if (cachedRegistry !== undefined) return cachedRegistry;
|
|
@@ -77,18 +68,17 @@ function resolveZodConverterSync(): ZodConverter | undefined {
|
|
|
77
68
|
}
|
|
78
69
|
|
|
79
70
|
/**
|
|
80
|
-
* Sanity-check that a candidate JSON Schema compiles
|
|
81
|
-
*
|
|
82
|
-
*
|
|
71
|
+
* Sanity-check that a candidate JSON Schema compiles as the tool's
|
|
72
|
+
* schemas do (`schemaOptions`): a pack's own tool's as Draft 2020-12 in
|
|
73
|
+
* Ajv's strict mode, an MCP server's in the dialect it declares.
|
|
83
74
|
*/
|
|
84
75
|
function compilesAsSchema(
|
|
85
76
|
schema: unknown,
|
|
86
77
|
where: 'input' | 'output',
|
|
78
|
+
tool: Pick<ToolManifest, 'transport'>,
|
|
87
79
|
): InvalidSchemaError | undefined {
|
|
88
|
-
const ajv = new Ajv2020({ strict: true, allErrors: true, allowUnionTypes: false });
|
|
89
|
-
addFormats(ajv);
|
|
90
80
|
try {
|
|
91
|
-
|
|
81
|
+
compileJsonSchema(schema as Readonly<Record<string, unknown>>, schemaOptions(tool));
|
|
92
82
|
return undefined;
|
|
93
83
|
} catch (cause) {
|
|
94
84
|
return {
|
|
@@ -406,9 +396,9 @@ function finalizeDefinition<
|
|
|
406
396
|
const badEffect = checkEffectKinds(manifest);
|
|
407
397
|
if (badEffect) return { kind: 'err', error: badEffect };
|
|
408
398
|
|
|
409
|
-
const badInput = compilesAsSchema(manifest.input, 'input');
|
|
399
|
+
const badInput = compilesAsSchema(manifest.input, 'input', manifest);
|
|
410
400
|
if (badInput) return { kind: 'err', error: badInput };
|
|
411
|
-
const badOutput = compilesAsSchema(manifest.output, 'output');
|
|
401
|
+
const badOutput = compilesAsSchema(manifest.output, 'output', manifest);
|
|
412
402
|
if (badOutput) return { kind: 'err', error: badOutput };
|
|
413
403
|
|
|
414
404
|
const tool = {
|
|
@@ -494,9 +484,9 @@ export function validateToolManifest(
|
|
|
494
484
|
const parsed = candidate as unknown as ToolManifest;
|
|
495
485
|
const badEffect = checkEffectKinds(parsed);
|
|
496
486
|
if (badEffect) return { kind: 'err', error: badEffect };
|
|
497
|
-
const badInput = compilesAsSchema(parsed.input, 'input');
|
|
487
|
+
const badInput = compilesAsSchema(parsed.input, 'input', parsed);
|
|
498
488
|
if (badInput) return { kind: 'err', error: badInput };
|
|
499
|
-
const badOutput = compilesAsSchema(parsed.output, 'output');
|
|
489
|
+
const badOutput = compilesAsSchema(parsed.output, 'output', parsed);
|
|
500
490
|
if (badOutput) return { kind: 'err', error: badOutput };
|
|
501
491
|
const badUrl = checkHttpUrlTemplate(parsed);
|
|
502
492
|
if (badUrl) return { kind: 'err', error: badUrl };
|
package/src/invoke.ts
CHANGED
|
@@ -2,10 +2,9 @@
|
|
|
2
2
|
// Copyright (C) 2026 Kindgi Inc.
|
|
3
3
|
|
|
4
4
|
import type { ValidateFunction } from 'ajv';
|
|
5
|
-
import * as addFormatsModule from 'ajv-formats';
|
|
6
|
-
import { Ajv2020 } from 'ajv/dist/2020.js';
|
|
7
5
|
|
|
8
|
-
import { parseWithSchema } from '@kindgi/schema';
|
|
6
|
+
import { compileJsonSchema, parseWithSchema } from '@kindgi/schema';
|
|
7
|
+
import type { CompileJsonSchemaOptions } from '@kindgi/schema';
|
|
9
8
|
import type { Result } from '@kindgi/types';
|
|
10
9
|
|
|
11
10
|
import type {
|
|
@@ -18,38 +17,47 @@ import type {
|
|
|
18
17
|
import { isToolPreconditionError } from './precondition.js';
|
|
19
18
|
import type { JsonSchema, Tool, ToolContext } from './types.js';
|
|
20
19
|
|
|
21
|
-
type AddFormatsFn = (ajv: InstanceType<typeof Ajv2020>, opts?: unknown) => unknown;
|
|
22
|
-
const addFormatsRaw = addFormatsModule as unknown;
|
|
23
|
-
const addFormats: AddFormatsFn =
|
|
24
|
-
typeof addFormatsRaw === 'function'
|
|
25
|
-
? (addFormatsRaw as AddFormatsFn)
|
|
26
|
-
: (addFormatsRaw as { default: AddFormatsFn }).default;
|
|
27
|
-
|
|
28
20
|
/**
|
|
29
21
|
* Cache compiled validators keyed by the schema *object reference*. Tools
|
|
30
22
|
* are defined once and reused, so schema identity is stable — the WeakMap
|
|
31
|
-
* releases entries when the tool is dropped.
|
|
23
|
+
* releases entries when the tool is dropped. A pack's tools' validators
|
|
24
|
+
* and an MCP server's are cached apart (`schemaOptions`).
|
|
25
|
+
*/
|
|
26
|
+
const caches = {
|
|
27
|
+
input: { pack: new WeakMap<JsonSchema, ValidateFunction>(), mcp: new WeakMap() },
|
|
28
|
+
output: { pack: new WeakMap<JsonSchema, ValidateFunction>(), mcp: new WeakMap() },
|
|
29
|
+
} as const;
|
|
30
|
+
|
|
31
|
+
const PACK_SCHEMAS: CompileJsonSchemaOptions = { dialects: ['2020-12'] };
|
|
32
|
+
const MCP_SCHEMAS: CompileJsonSchemaOptions = { strict: false };
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* How a tool's schemas compile. A pack's own tools: Draft 2020-12, in
|
|
36
|
+
* Ajv's strict mode (an authoring lint). An MCP server's (`transport:
|
|
37
|
+
* 'mcp'`): in the dialect the server declares, without strict mode — the
|
|
38
|
+
* schema is valid JSON Schema without being written to that lint.
|
|
32
39
|
*/
|
|
33
|
-
|
|
34
|
-
|
|
40
|
+
export function schemaOptions(tool: Pick<Tool, 'transport'>): CompileJsonSchemaOptions {
|
|
41
|
+
return tool.transport === 'mcp' ? MCP_SCHEMAS : PACK_SCHEMAS;
|
|
42
|
+
}
|
|
35
43
|
|
|
36
44
|
/**
|
|
37
45
|
* A compiled validator. Input validators fill in each property's JSON
|
|
38
46
|
* Schema `default` (`useDefaults`) — the data they check is a copy of the
|
|
39
47
|
* caller's.
|
|
40
48
|
*/
|
|
41
|
-
function compile(
|
|
42
|
-
|
|
49
|
+
function compile(
|
|
50
|
+
schema: JsonSchema,
|
|
51
|
+
side: 'input' | 'output',
|
|
52
|
+
tool: Pick<Tool, 'transport'>,
|
|
53
|
+
): ValidateFunction {
|
|
54
|
+
const cache = caches[side][tool.transport === 'mcp' ? 'mcp' : 'pack'];
|
|
43
55
|
const cached = cache.get(schema);
|
|
44
56
|
if (cached !== undefined) return cached;
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
allErrors: true,
|
|
48
|
-
allowUnionTypes: false,
|
|
57
|
+
const validator = compileJsonSchema(schema as Readonly<Record<string, unknown>>, {
|
|
58
|
+
...schemaOptions(tool),
|
|
49
59
|
...(side === 'input' && { useDefaults: true }),
|
|
50
60
|
});
|
|
51
|
-
addFormats(ajv);
|
|
52
|
-
const validator = ajv.compile(schema as object);
|
|
53
61
|
cache.set(schema, validator);
|
|
54
62
|
return validator;
|
|
55
63
|
}
|
|
@@ -61,11 +69,11 @@ function compile(schema: JsonSchema, side: 'input' | 'output'): ValidateFunction
|
|
|
61
69
|
* gets what its `z.infer` type says.
|
|
62
70
|
*/
|
|
63
71
|
async function prepareInput(
|
|
64
|
-
tool: Pick<Tool, 'id' | 'input' | 'inputZod'>,
|
|
72
|
+
tool: Pick<Tool, 'id' | 'input' | 'inputZod' | 'transport'>,
|
|
65
73
|
input: unknown,
|
|
66
74
|
): Promise<Result<unknown, InputValidationError>> {
|
|
67
75
|
const candidate = structuredClone(input);
|
|
68
|
-
const validator = compile(tool.input, 'input');
|
|
76
|
+
const validator = compile(tool.input, 'input', tool);
|
|
69
77
|
if (!validator(candidate)) {
|
|
70
78
|
return { kind: 'err', error: inputError(tool.id, validator.errors ?? []) };
|
|
71
79
|
}
|
|
@@ -149,7 +157,7 @@ export async function invokeTool<TInput = unknown, TOutput = unknown>(
|
|
|
149
157
|
}
|
|
150
158
|
|
|
151
159
|
if (!options.skipOutputValidation) {
|
|
152
|
-
const outputValidator = compile(tool.output, 'output');
|
|
160
|
+
const outputValidator = compile(tool.output, 'output', tool);
|
|
153
161
|
if (!outputValidator(output)) {
|
|
154
162
|
const err: OutputValidationError = {
|
|
155
163
|
code: 'output-validation-failed',
|
package/src/tool.schema.json
CHANGED
|
@@ -24,11 +24,11 @@
|
|
|
24
24
|
},
|
|
25
25
|
"input": {
|
|
26
26
|
"type": "object",
|
|
27
|
-
"description": "JSON Schema for the tool input. MUST validate under Draft 2020-12."
|
|
27
|
+
"description": "JSON Schema for the tool input. MUST validate under Draft 2020-12, except on an MCP server's tool (`transport: \"mcp\"`), whose schemas are in the dialect their `$schema` declares: draft-06, draft-07, 2019-09 or 2020-12."
|
|
28
28
|
},
|
|
29
29
|
"output": {
|
|
30
30
|
"type": "object",
|
|
31
|
-
"description": "JSON Schema for the tool output. MUST validate under Draft 2020-12."
|
|
31
|
+
"description": "JSON Schema for the tool output. MUST validate under Draft 2020-12, except on an MCP server's tool (`transport: \"mcp\"`), whose schemas are in the dialect their `$schema` declares: draft-06, draft-07, 2019-09 or 2020-12."
|
|
32
32
|
},
|
|
33
33
|
"needs": {
|
|
34
34
|
"type": "array",
|
package/src/types.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Copyright (C) 2026 Kindgi Inc.
|
|
3
3
|
|
|
4
4
|
import type { ZodLikeSchema } from '@kindgi/schema';
|
|
5
|
-
import type { TenantId, ToolId, UserId } from '@kindgi/types';
|
|
5
|
+
import type { OrgId, ProjectId, TenantId, ToolId, UserId } from '@kindgi/types';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* JSON Schema for a tool's input/output. Author-supplied, Draft 2020-12.
|
|
@@ -79,6 +79,19 @@ export interface ToolContext {
|
|
|
79
79
|
* agent turn or a flow step. Stable across every call the run makes.
|
|
80
80
|
*/
|
|
81
81
|
readonly runId?: string;
|
|
82
|
+
/**
|
|
83
|
+
* The project of the run the call belongs to. The runtime sets it from
|
|
84
|
+
* the run, never from the run's input or a model's arguments, so a tool
|
|
85
|
+
* can check an id in its input against it. Absent outside a run (a unit
|
|
86
|
+
* test passes its own).
|
|
87
|
+
*/
|
|
88
|
+
readonly projectId?: ProjectId;
|
|
89
|
+
/**
|
|
90
|
+
* The org of that project, when the project belongs to one. The runtime
|
|
91
|
+
* sets it from the project, never from input. Absent when the project
|
|
92
|
+
* has no org, and outside a run.
|
|
93
|
+
*/
|
|
94
|
+
readonly orgId?: OrgId;
|
|
82
95
|
/**
|
|
83
96
|
* Correlation id for this individual call (the model's tool-call id,
|
|
84
97
|
* an MCP request id, a webhook id). Opaque to tools; useful for logs,
|