@agentproto/tool 0.5.2 → 0.6.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.
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import matter from 'gray-matter';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import { createDoctype } from '@agentproto/
|
|
3
|
+
import { createDoctype } from '@agentproto/doctype';
|
|
4
4
|
import Ajv from 'ajv';
|
|
5
5
|
|
|
6
6
|
/**
|
|
@@ -378,5 +378,5 @@ function toolFromManifest(args) {
|
|
|
378
378
|
}
|
|
379
379
|
|
|
380
380
|
export { ToolError, checkMinimalJsonSchema, defineTool, parseToolManifest, toToolError, toToolResult, toolFromManifest, toolFromManifestOnly, toolManifestFrontmatterSchema, validateContext, validateInput, validateManifestIOBlocks, validateOutput };
|
|
381
|
-
//# sourceMappingURL=chunk-
|
|
382
|
-
//# sourceMappingURL=chunk-
|
|
381
|
+
//# sourceMappingURL=chunk-TABQGCU4.mjs.map
|
|
382
|
+
//# sourceMappingURL=chunk-TABQGCU4.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/json-schema.ts","../src/errors.ts","../src/define-tool.ts","../src/manifest/index.ts"],"names":[],"mappings":"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","file":"chunk-MGCD4RWR.mjs","sourcesContent":["/**\n * Minimal well-formedness check for the AIP-16 `inputs`/`outputs` JSON\n * Schema blocks declared in a TOOL.md frontmatter.\n *\n * This is deliberately NOT a full JSON Schema validator — invocation-time\n * validation against the payload still happens in `define-tool.ts` via\n * `validateJsonSchema` (ajv). This check runs at MANIFEST PARSE time and\n * only catches structurally malformed schemas that no validator could\n * meaningfully compile (e.g. `properties: \"...\"` or `required: \"name\"` —\n * a typo that would otherwise surface as a confusing ajv error deep in a\n * tool invocation, or not at all).\n *\n * Checked keys and their minimal shapes (JSON Schema draft 2020-12):\n * type — string, or non-empty array of strings\n * properties — object\n * required — array of strings\n * items — object, or array of objects (tuple form)\n * $ref — string\n * enum — non-empty array\n */\n\nexport interface MinimalJsonSchemaIssue {\n /** Dotted path of the offending key inside the schema block. */\n path: string\n message: string\n}\n\n/**\n * Check one IO schema block. Returns a list of issues (empty = well-formed\n * enough to hand to ajv later). Values are only checked when the key is\n * PRESENT; an absent key imposes no constraint.\n */\nexport function checkMinimalJsonSchema(\n value: unknown,\n): MinimalJsonSchemaIssue[] {\n const issues: MinimalJsonSchemaIssue[] = []\n if (\n value === null ||\n typeof value !== \"object\" ||\n Array.isArray(value)\n ) {\n return [{ path: \"\", message: \"schema must be an object\" }]\n }\n const schema = value as Record<string, unknown>\n\n if (schema.type !== undefined) {\n const ok =\n typeof schema.type === \"string\" ||\n (Array.isArray(schema.type) &&\n schema.type.length > 0 &&\n schema.type.every(t => typeof t === \"string\"))\n if (!ok) {\n issues.push({\n path: \"type\",\n message: \"type must be a string or array of strings\",\n })\n }\n }\n\n if (schema.properties !== undefined) {\n if (\n schema.properties === null ||\n typeof schema.properties !== \"object\" ||\n Array.isArray(schema.properties)\n ) {\n issues.push({ path: \"properties\", message: \"properties must be an object\" })\n }\n }\n\n if (schema.required !== undefined) {\n const ok =\n Array.isArray(schema.required) &&\n schema.required.every(r => typeof r === \"string\")\n if (!ok) {\n issues.push({ path: \"required\", message: \"required must be an array of strings\" })\n }\n }\n\n if (schema.items !== undefined) {\n const isSchemaObject = (v: unknown) =>\n v !== null && typeof v === \"object\" && !Array.isArray(v)\n const ok =\n isSchemaObject(schema.items) ||\n (Array.isArray(schema.items) && schema.items.every(isSchemaObject))\n if (!ok) {\n issues.push({ path: \"items\", message: \"items must be an object or array of objects\" })\n }\n }\n\n if (schema.$ref !== undefined && typeof schema.$ref !== \"string\") {\n issues.push({ path: \"$ref\", message: \"$ref must be a string\" })\n }\n\n if (schema.enum !== undefined) {\n if (!Array.isArray(schema.enum) || schema.enum.length === 0) {\n issues.push({ path: \"enum\", message: \"enum must be a non-empty array\" })\n }\n }\n\n return issues\n}\n\n/**\n * Validate the `inputs`/`outputs` blocks of a parsed manifest. Throws with\n * a message naming the tool id and the offending block, e.g.\n * `invalid inputs block for tool echo: properties must be an object`.\n */\nexport function validateManifestIOBlocks(\n toolId: string,\n blocks: { inputs?: unknown; outputs?: unknown },\n): void {\n for (const key of [\"inputs\", \"outputs\"] as const) {\n const value = blocks[key]\n if (value === undefined) continue\n const issues = checkMinimalJsonSchema(value)\n if (issues.length > 0) {\n // Each message already names the offending key (e.g. \"properties must\n // be an object\"); the empty-path top-level message reads on its own.\n const detail = issues.map(i => i.message).join(\"; \")\n throw new Error(\n `invalid ${key} block for tool ${toolId}: ${detail}`\n )\n }\n }\n}\n","import type { ToolResult } from \"./types.js\"\n\n/**\n * AIP-14 conventional error codes. Tool-specific codes MAY use a domain\n * prefix (`\"stripe:card_declined\"`).\n */\nexport type ToolErrorCode =\n | \"input_invalid\"\n | \"output_invalid\"\n | \"unauthorised\"\n | \"not_found\"\n | \"rate_limited\"\n | \"timeout\"\n | \"upstream_error\"\n | \"internal\"\n | (string & {})\n\nexport interface ToolErrorPayload {\n code: ToolErrorCode\n message: string\n retryable?: boolean\n cause?: unknown\n}\n\n/**\n * Structured error thrown by tool bodies. Adapters wrap this into the\n * standard {@link ToolResult} envelope; bodies MUST throw it (never\n * return error objects).\n */\nexport class ToolError extends Error {\n readonly code: ToolErrorCode\n readonly retryable: boolean\n readonly cause: unknown\n\n constructor(payload: ToolErrorPayload) {\n super(payload.message)\n this.name = \"ToolError\"\n this.code = payload.code\n this.retryable = payload.retryable ?? false\n this.cause = payload.cause\n }\n\n toJSON(): ToolErrorPayload {\n return {\n code: this.code,\n message: this.message,\n retryable: this.retryable,\n ...(this.cause !== undefined ? { cause: this.cause } : {}),\n }\n }\n}\n\n/**\n * Wrap an unknown thrown value into a {@link ToolError}. Used by adapters\n * to normalise non-ToolError throws into the standard envelope.\n */\nexport function toToolError(thrown: unknown): ToolError {\n if (thrown instanceof ToolError) return thrown\n if (thrown instanceof Error) {\n return new ToolError({\n code: \"internal\",\n message: thrown.message,\n cause: thrown,\n })\n }\n return new ToolError({\n code: \"internal\",\n message: String(thrown),\n cause: thrown,\n })\n}\n\n/**\n * Adapter helper: project a thrown ToolError (or any throw) into the\n * standard {@link ToolResult} envelope. Adapters MUST do this; bodies MUST NOT.\n */\nexport function toToolResult<T>(\n value: T | undefined,\n thrown: unknown\n): ToolResult<T> {\n if (thrown !== undefined) {\n const err = toToolError(thrown)\n return { ok: false, error: err.toJSON() }\n }\n return { ok: true, value: value as T }\n}\n","import { createDoctype } from \"@agentproto/define-doctype\"\nimport Ajv from \"ajv\"\nimport type { ZodType } from \"zod\"\nimport { ToolError } from \"./errors.js\"\nimport type {\n ApprovalClass,\n DriverConstraints,\n DriverKind,\n ToolCapabilities,\n ToolContext,\n ToolDefinition,\n ToolHandle,\n ValidationResult,\n} from \"./types.js\"\n\nconst PROVIDER_KINDS: readonly DriverKind[] = [\n \"cli\",\n \"http\",\n \"mcp\",\n \"sdk\",\n \"builtin\",\n]\n\n/**\n * AIP-14 reference implementation of `defineTool`.\n *\n * Returns a {@link ToolHandle} with defaults applied. The handle is a\n * pure contract — schemas, governance metadata, provider routing\n * hints. Bodies live on AIP-30 PROVIDER manifests; invocation goes\n * through provider-runtime's resolver.\n *\n * Built on `createDoctype` from `@agentproto/define-doctype`: the\n * id-pattern + description-length validation and the top-level\n * `Object.freeze` are shared with every other AIP defineX. The\n * spec-14-specific parts (migration guard for `execute`, defaulting\n * `approval` from `mutates`, freezing nested arrays/objects) live in\n * `validate` and `build` below.\n *\n * Conformance highlights ([§ Conformance rules](https://agentproto.sh/docs/aip-14)):\n * - No `execute` field on the contract — bodies are providers' job.\n * - `defineTool` MUST refuse a definition carrying `execute` (migration error).\n * - No I/O at module load — `defineTool(...)` is pure construction.\n */\nconst constructTool = createDoctype<\n ToolDefinition<unknown, unknown, ToolContext>,\n ToolHandle<unknown, unknown, ToolContext>\n>({\n aip: 14,\n name: \"tool\",\n validate(def) {\n // Migration guard: catch authors trying to ship a body on the contract.\n // The body lives on a PROVIDER (per AIP-30); reject at construction.\n if (\"execute\" in (def as unknown as Record<string, unknown>)) {\n throw new Error(\n `defineTool: id='${def.id}' carries an 'execute' property. ` +\n `Bodies live on AIP-30 PROVIDER manifests, not on the TOOL contract. ` +\n `See https://agentproto.sh/docs/aip-30 for migration.`,\n )\n }\n },\n build(def) {\n return {\n id: def.id,\n name: def.name ?? def.id,\n description: def.description,\n version: def.version,\n inputSchema: def.inputSchema,\n outputSchema: def.outputSchema,\n inputs: def.inputs ? Object.freeze({ ...def.inputs }) : undefined,\n outputs: def.outputs ? Object.freeze({ ...def.outputs }) : undefined,\n contextSchema: def.contextSchema,\n mutates: Object.freeze([...(def.mutates ?? [])]),\n requires: freezeCapabilities(def.requires),\n approval: defaultApproval(def.approval, def.mutates),\n riskLevel: def.riskLevel ?? 0,\n costClass: def.costClass ?? \"trivial\",\n timeoutMs: def.timeoutMs ?? 30_000,\n retry: def.retry,\n tags: Object.freeze([...(def.tags ?? [])]),\n metadata: Object.freeze({ ...(def.metadata ?? {}) }),\n idempotent: def.idempotent ?? false,\n defaultImplementation: def.defaultImplementation,\n driverConstraints: freezeProviderConstraints(def.driverConstraints),\n transformers: def.transformers\n ? Object.freeze([...def.transformers])\n : undefined,\n }\n },\n})\n\n/**\n * Public-facing `defineTool` — typed wrapper around `constructTool`\n * that preserves the per-call `<TInput, TOutput, TContext>` inference\n * so callers don't write any generics. The wrapper exists purely for\n * generic propagation; the runtime body is the meta-factory above.\n */\nexport function defineTool<\n TInput,\n TOutput,\n TContext extends ToolContext = ToolContext,\n>(\n definition: ToolDefinition<TInput, TOutput, TContext>,\n): ToolHandle<TInput, TOutput, TContext> {\n return constructTool(\n definition as ToolDefinition<unknown, unknown, ToolContext>,\n ) as unknown as ToolHandle<TInput, TOutput, TContext>\n}\n\n/**\n * Validate input against a tool's `inputSchema`. Returns a typed\n * {@link ValidationResult}; provider runtimes MUST call this BEFORE\n * dispatching to the provider's body.\n *\n * Priority:\n * 1. zod `inputSchema` (v0.1) — used when present.\n * 2. JSON Schema `inputs` (v0.2) — fallback for manifest-only tools.\n * 3. No schema — passthrough (returns `ok: true`).\n */\nexport function validateInput<TInput>(\n handle: Pick<ToolHandle<TInput>, \"id\" | \"inputSchema\" | \"inputs\">,\n input: unknown,\n): ValidationResult<TInput> {\n if (handle.inputSchema) {\n const result = handle.inputSchema.safeParse(input)\n if (!result.success) {\n return {\n ok: false,\n error: {\n code: \"input_invalid\",\n message: `id='${handle.id}': ${formatZodIssues(result.error.issues)}`,\n cause: result.error.issues,\n },\n }\n }\n return { ok: true, value: result.data as TInput }\n }\n if (handle.inputs) {\n return validateJsonSchema<TInput>(handle.id, handle.inputs, input)\n }\n return { ok: true, value: input as TInput }\n}\n\n/**\n * Validate context against a tool's `contextSchema` (when declared).\n * Returns a typed {@link ValidationResult}; provider runtimes MUST\n * call this BEFORE dispatching when the contract has a contextSchema.\n *\n * Tools without a contextSchema accept any context shape; this helper\n * returns the input verbatim in that case.\n *\n * Context validation uses only zod (no JSON Schema fallback) — context\n * schemas are always authored in TS, never in manifests.\n */\nexport function validateContext<TContext extends ToolContext = ToolContext>(\n handle: Pick<ToolHandle<unknown, unknown, TContext>, \"id\" | \"contextSchema\">,\n context: unknown,\n): ValidationResult<TContext> {\n if (!handle.contextSchema) {\n return { ok: true, value: context as TContext }\n }\n const result = handle.contextSchema.safeParse(context)\n if (!result.success) {\n return {\n ok: false,\n error: {\n code: \"input_invalid\",\n message: `id='${handle.id}': context does not match contextSchema — ${formatZodIssues(result.error.issues)}`,\n field: \"context\",\n cause: result.error.issues,\n },\n }\n }\n return { ok: true, value: result.data as TContext }\n}\n\n/**\n * Validate output against a tool's `outputSchema`. Returns the typed\n * value on success; throws {@link ToolError} with code `\"output_invalid\"`\n * on contract violation.\n *\n * Priority:\n * 1. zod `outputSchema` (v0.1) — used when present.\n * 2. JSON Schema `outputs` (v0.2) — fallback for manifest-only tools.\n * 3. No schema — passthrough (returns the value as-is).\n */\nexport function validateOutput<TOutput>(\n handle: Pick<ToolHandle<unknown, TOutput>, \"id\" | \"outputSchema\" | \"outputs\">,\n output: unknown,\n): TOutput {\n if (handle.outputSchema) {\n const result = handle.outputSchema.safeParse(output)\n if (!result.success) {\n throw new ToolError({\n code: \"output_invalid\",\n message: `id='${handle.id}': provider produced output that does not match outputSchema — ${formatZodIssues(result.error.issues)}`,\n cause: result.error.issues,\n })\n }\n return result.data as TOutput\n }\n if (handle.outputs) {\n const result = validateJsonSchema<TOutput>(handle.id, handle.outputs, output)\n if (!result.ok) {\n throw new ToolError({\n code: \"output_invalid\",\n message: result.error.message,\n cause: result.error.cause,\n })\n }\n return result.value\n }\n return output as TOutput\n}\n\nfunction defaultApproval(\n declared: ApprovalClass | undefined,\n mutates: readonly string[] | undefined,\n): ApprovalClass {\n if (declared) return declared\n return mutates && mutates.length > 0 ? \"on-mutate\" : \"auto\"\n}\n\nfunction freezeCapabilities(\n caps: ToolCapabilities | undefined,\n): Readonly<ToolCapabilities> {\n return Object.freeze({\n network: Object.freeze([...(caps?.network ?? [])]),\n secrets: Object.freeze([...(caps?.secrets ?? [])]),\n tools: Object.freeze([...(caps?.tools ?? [])]),\n })\n}\n\nfunction freezeProviderConstraints(\n c: DriverConstraints | undefined,\n): Required<DriverConstraints> {\n const forbid = (c?.forbid ?? []).filter((k): k is DriverKind =>\n PROVIDER_KINDS.includes(k as DriverKind),\n )\n const requireKind = (c?.requireKind ?? []).filter((k): k is DriverKind =>\n PROVIDER_KINDS.includes(k as DriverKind),\n )\n return Object.freeze({\n forbid: Object.freeze(forbid) as readonly DriverKind[],\n requireKind: Object.freeze(requireKind) as readonly DriverKind[],\n })\n}\n\nfunction formatZodIssues(\n issues: ReadonlyArray<{ path: ReadonlyArray<PropertyKey>; message: string }>,\n): string {\n return issues\n .map((i) => `${i.path.length > 0 ? i.path.join(\".\") + \": \" : \"\"}${i.message}`)\n .join(\"; \")\n}\n\n// Shared Ajv instance — created once at module load.\n// allErrors: true so we surface all violations, not just the first.\nconst _ajv = new Ajv({ allErrors: true })\n\n// Validator cache keyed by schema object identity. Avoids repeated _ajv.compile()\n// calls (which go through Ajv's internal registry) and lets GC collect validators\n// when a tool handle is no longer referenced.\nconst _validatorCache = new WeakMap<\n object,\n ReturnType<typeof _ajv.compile>\n>()\n\nfunction validateJsonSchema<T>(\n toolId: string,\n schema: Record<string, unknown>,\n value: unknown,\n): ValidationResult<T> {\n let validate = _validatorCache.get(schema)\n if (!validate) {\n validate = _ajv.compile(schema as Parameters<typeof _ajv.compile>[0])\n _validatorCache.set(schema, validate)\n }\n const valid = validate(value)\n if (!valid) {\n const errors = validate.errors ?? []\n const message = errors\n .map((e) => `${e.instancePath || \"/\"} ${e.message}`)\n .join(\"; \")\n return {\n ok: false,\n error: {\n code: \"input_invalid\",\n message: `id='${toolId}': ${message}`,\n cause: errors,\n },\n }\n }\n return { ok: true, value: value as T }\n}\n\nexport type { ZodType }\n","import matter from \"gray-matter\"\nimport { z, type ZodType } from \"zod\"\nimport { validateManifestIOBlocks } from \"../json-schema.js\"\nimport { defineTool } from \"../define-tool.js\"\nimport type { ApprovalClass, ToolContext, ToolHandle } from \"../types.js\"\n\n/**\n * AIP-14 TOOL.md sidecar parser.\n *\n * Reads frontmatter (host-relevant metadata) + body (long-form\n * description / examples / errors). The TS module's `defineTool(...)`\n * supplies the schemas and execute body; this manifest supplies the\n * runtime metadata that overrides or augments the in-code defaults.\n *\n * Field set covers AIP-14 §\"Frontmatter\" — required and optional fields\n * normalised to snake_case → camelCase.\n */\n\nexport const toolManifestFrontmatterSchema = z.object({\n schema: z.literal(\"agentproto/tool/v1\").optional(),\n name: z.string().min(1).max(80),\n id: z.string().regex(/^[a-z][a-z0-9._-]{1,63}$/),\n description: z.string().min(1).max(2000),\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+/),\n\n // Optional metadata\n mutates: z.array(z.string()).optional(),\n requires: z\n .object({\n network: z.array(z.string()).optional(),\n secrets: z.array(z.string()).optional(),\n tools: z.array(z.string()).optional(),\n })\n .optional(),\n // `ApprovalClass` is `\"auto\" | \"always\" | \"on-mutate\" | \\`policy:${string}\\``.\n // z.union widens the regex branch to plain `string` (zod can't express\n // template literal types), so we use `z.custom` to keep the inferred\n // type exact — matters because `defineTool` accepts `ApprovalClass`.\n approval: z\n .custom<ApprovalClass>(\n (v): v is ApprovalClass =>\n typeof v === \"string\" &&\n (v === \"auto\" ||\n v === \"always\" ||\n v === \"on-mutate\" ||\n /^policy:/.test(v)),\n { message: \"expected 'auto' | 'always' | 'on-mutate' | 'policy:<name>'\" },\n )\n .optional(),\n risk_level: z\n .union([z.literal(0), z.literal(1), z.literal(2), z.literal(3)])\n .optional(),\n cost_class: z.enum([\"trivial\", \"metered\", \"expensive\"]).optional(),\n timeout_ms: z.number().int().positive().optional(),\n idempotent: z.boolean().optional(),\n tags: z.array(z.string()).optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n\n // AIP-16 IO blocks — `inputs`/`outputs` as JSON Schema objects. Kept\n // structurally loose here (validated as objects, not deep-checked against\n // the AIP-16 meta-schema); preserved so a manifest's declared IO contract\n // survives the parse → handle round-trip instead of being silently dropped.\n // Minimal well-formedness (correct JSON types on type/properties/required/\n // items/$ref/enum) is enforced in `parseToolManifest` via\n // `validateManifestIOBlocks` — see `../json-schema.ts`.\n inputs: z.record(z.string(), z.unknown()).optional(),\n outputs: z.record(z.string(), z.unknown()).optional(),\n\n // AIP-26 / AIP-17 / AIP-19 references — kept loose; validated by their\n // respective AIPs' adapters when consumed.\n code: z.unknown().optional(),\n run: z.unknown().optional(),\n runner: z.unknown().optional(),\n secrets: z.unknown().optional(),\n network: z.unknown().optional(),\n})\n\nexport type ToolManifestFrontmatter = z.infer<\n typeof toolManifestFrontmatterSchema\n>\n\nexport interface ToolManifest {\n frontmatter: ToolManifestFrontmatter\n body: string\n}\n\n/**\n * Parse a TOOL.md source string into structured frontmatter + body.\n * Throws on missing frontmatter or schema-invalid frontmatter.\n */\nexport function parseToolManifest(source: string): ToolManifest {\n const parsed = matter(source)\n if (Object.keys(parsed.data).length === 0) {\n throw new Error(\"parseToolManifest: missing or empty frontmatter\")\n }\n const result = toolManifestFrontmatterSchema.safeParse(parsed.data)\n if (!result.success) {\n throw new Error(\n `parseToolManifest: invalid frontmatter — ${result.error.issues\n .map(i => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \")}`\n )\n }\n // AIP-16 IO blocks: minimal JSON-Schema well-formedness at parse time\n // (typed keys, not full validation — ajv handles that at invocation).\n validateManifestIOBlocks(result.data.id, result.data)\n\n return { frontmatter: result.data, body: parsed.content }\n}\n\nexport { checkMinimalJsonSchema } from \"../json-schema.js\"\n\n/**\n * Build a {@link ToolHandle} from a manifest that has no companion TS module.\n *\n * `inputSchema`/`outputSchema` are omitted; IO validation falls back to the\n * AIP-16 `inputs`/`outputs` JSON Schema blocks declared in the frontmatter\n * (via `validateInput`/`validateOutput`). The returned handle is typed as\n * `ToolHandle<unknown, unknown>` since the generic shapes are not statically\n * known.\n *\n * Use this when loading an agent-generated TOOL.md whose IO contract is\n * expressed in YAML (`inputs:`/`outputs:`) rather than a compiled TS module.\n */\nexport function toolFromManifestOnly(\n manifest: ToolManifest,\n): ToolHandle<unknown, unknown> {\n const fm = manifest.frontmatter\n return defineTool({\n id: fm.id,\n name: fm.name,\n description: fm.description,\n version: fm.version,\n inputs: fm.inputs,\n outputs: fm.outputs,\n mutates: fm.mutates,\n requires: fm.requires,\n approval: fm.approval,\n riskLevel: fm.risk_level,\n costClass: fm.cost_class,\n timeoutMs: fm.timeout_ms,\n idempotent: fm.idempotent,\n tags: fm.tags,\n metadata: fm.metadata,\n })\n}\n\n/**\n * Build a fully-typed {@link ToolHandle} from a parsed `TOOL.md` manifest\n * + caller-supplied schemas. The .md is the single source of truth for\n * metadata (id, name, description, version, mutates, approval, …); the\n * schemas live in the TS module that ships alongside the .md.\n *\n * Both inputs are revalidated by `defineTool`'s shared invariants\n * (id pattern, description length, top-level freeze) — `parseToolManifest`\n * already enforces a stricter id pattern + version semver, so a\n * well-formed manifest passes through cleanly. Mismatches between the\n * manifest's id-shape and `defineTool`'s pattern surface a\n * descriptive error from the same validation pipeline as the TS path.\n *\n * @example\n * const manifest = parseToolManifest(readFileSync(\"./echo/TOOL.md\", \"utf8\"))\n * const echo = toolFromManifest({\n * manifest,\n * inputSchema: z.object({ msg: z.string() }),\n * outputSchema: z.object({ msg: z.string() }),\n * })\n */\nexport function toolFromManifest<\n TInput,\n TOutput,\n TContext extends ToolContext = ToolContext,\n>(args: {\n manifest: ToolManifest\n inputSchema: ZodType<TInput>\n outputSchema: ZodType<TOutput>\n contextSchema?: ZodType<TContext>\n}): ToolHandle<TInput, TOutput, TContext> {\n const fm = args.manifest.frontmatter\n return defineTool<TInput, TOutput, TContext>({\n id: fm.id,\n name: fm.name,\n description: fm.description,\n version: fm.version,\n inputSchema: args.inputSchema,\n outputSchema: args.outputSchema,\n inputs: fm.inputs,\n outputs: fm.outputs,\n contextSchema: args.contextSchema,\n mutates: fm.mutates,\n requires: fm.requires,\n approval: fm.approval,\n riskLevel: fm.risk_level,\n costClass: fm.cost_class,\n timeoutMs: fm.timeout_ms,\n idempotent: fm.idempotent,\n tags: fm.tags,\n metadata: fm.metadata,\n })\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/json-schema.ts","../src/errors.ts","../src/define-tool.ts","../src/manifest/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAgCO,SAAS,uBACd,KAAA,EAC0B;AAC1B,EAAA,MAAM,SAAmC,EAAC;AAC1C,EAAA,IACE,KAAA,KAAU,QACV,OAAO,KAAA,KAAU,YACjB,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EACnB;AACA,IAAA,OAAO,CAAC,EAAE,IAAA,EAAM,EAAA,EAAI,OAAA,EAAS,4BAA4B,CAAA;AAAA,EAC3D;AACA,EAAA,MAAM,MAAA,GAAS,KAAA;AAEf,EAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAW;AAC7B,IAAA,MAAM,EAAA,GACJ,OAAO,MAAA,CAAO,IAAA,KAAS,YACtB,KAAA,CAAM,OAAA,CAAQ,OAAO,IAAI,CAAA,IACxB,OAAO,IAAA,CAAK,MAAA,GAAS,KACrB,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAA,KAAK,OAAO,MAAM,QAAQ,CAAA;AAChD,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,eAAe,MAAA,EAAW;AACnC,IAAA,IACE,MAAA,CAAO,UAAA,KAAe,IAAA,IACtB,OAAO,MAAA,CAAO,UAAA,KAAe,QAAA,IAC7B,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAC/B;AACA,MAAA,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,YAAA,EAAc,OAAA,EAAS,gCAAgC,CAAA;AAAA,IAC7E;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,aAAa,MAAA,EAAW;AACjC,IAAA,MAAM,EAAA,GACJ,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,IAC7B,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,CAAA,CAAA,KAAK,OAAO,CAAA,KAAM,QAAQ,CAAA;AAClD,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,UAAA,EAAY,OAAA,EAAS,wCAAwC,CAAA;AAAA,IACnF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,UAAU,MAAA,EAAW;AAC9B,IAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KACtB,CAAA,KAAM,IAAA,IAAQ,OAAO,CAAA,KAAM,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AACzD,IAAA,MAAM,EAAA,GACJ,cAAA,CAAe,MAAA,CAAO,KAAK,CAAA,IAC1B,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,IAAK,MAAA,CAAO,KAAA,CAAM,MAAM,cAAc,CAAA;AACnE,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,+CAA+C,CAAA;AAAA,IACvF;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,IAAA,KAAS,MAAA,IAAa,OAAO,MAAA,CAAO,SAAS,QAAA,EAAU;AAChE,IAAA,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,yBAAyB,CAAA;AAAA,EAChE;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAW;AAC7B,IAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC3D,MAAA,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,kCAAkC,CAAA;AAAA,IACzE;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,wBAAA,CACd,QACA,MAAA,EACM;AACN,EAAA,KAAA,MAAW,GAAA,IAAO,CAAC,QAAA,EAAU,SAAS,CAAA,EAAY;AAChD,IAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,IAAA,IAAI,UAAU,MAAA,EAAW;AACzB,IAAA,MAAM,MAAA,GAAS,uBAAuB,KAAK,CAAA;AAC3C,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AAGvB,MAAA,MAAM,MAAA,GAAS,OAAO,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AACjD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,QAAA,EAAW,GAAG,CAAA,gBAAA,EAAmB,MAAM,KAAK,MAAM,CAAA;AAAA,OACpD;AAAA,IACF;AAAA,EACF;AACF;;;AC/FO,IAAM,SAAA,GAAN,cAAwB,KAAA,CAAM;AAAA,EAC1B,IAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EAET,YAAY,OAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,QAAQ,OAAO,CAAA;AACrB,IAAA,IAAA,CAAK,IAAA,GAAO,WAAA;AACZ,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AACpB,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,KAAA;AACtC,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AAAA,EACvB;AAAA,EAEA,MAAA,GAA2B;AACzB,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,GAAI,KAAK,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM,GAAI;AAAC,KAC1D;AAAA,EACF;AACF;AAMO,SAAS,YAAY,MAAA,EAA4B;AACtD,EAAA,IAAI,MAAA,YAAkB,WAAW,OAAO,MAAA;AACxC,EAAA,IAAI,kBAAkB,KAAA,EAAO;AAC3B,IAAA,OAAO,IAAI,SAAA,CAAU;AAAA,MACnB,IAAA,EAAM,UAAA;AAAA,MACN,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AACA,EAAA,OAAO,IAAI,SAAA,CAAU;AAAA,IACnB,IAAA,EAAM,UAAA;AAAA,IACN,OAAA,EAAS,OAAO,MAAM,CAAA;AAAA,IACtB,KAAA,EAAO;AAAA,GACR,CAAA;AACH;AAMO,SAAS,YAAA,CACd,OACA,MAAA,EACe;AACf,EAAA,IAAI,WAAW,MAAA,EAAW;AACxB,IAAA,MAAM,GAAA,GAAM,YAAY,MAAM,CAAA;AAC9B,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,GAAA,CAAI,QAAO,EAAE;AAAA,EAC1C;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAkB;AACvC;;;ACtEA,IAAM,cAAA,GAAwC;AAAA,EAC5C,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA;AAsBA,IAAM,gBAAgB,aAAA,CAGpB;AAAA,EACA,GAAA,EAAK,EAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,SAAS,GAAA,EAAK;AAGZ,IAAA,IAAI,aAAc,GAAA,EAA4C;AAC5D,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,gBAAA,EAAmB,IAAI,EAAE,CAAA,yJAAA;AAAA,OAG3B;AAAA,IACF;AAAA,EACF,CAAA;AAAA,EACA,MAAM,GAAA,EAAK;AACT,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,IAAA,EAAM,GAAA,CAAI,IAAA,IAAQ,GAAA,CAAI,EAAA;AAAA,MACtB,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,cAAc,GAAA,CAAI,YAAA;AAAA,MAClB,MAAA,EAAQ,GAAA,CAAI,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,EAAE,GAAG,GAAA,CAAI,MAAA,EAAQ,CAAA,GAAI,MAAA;AAAA,MACxD,OAAA,EAAS,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,EAAE,GAAG,GAAA,CAAI,OAAA,EAAS,CAAA,GAAI,MAAA;AAAA,MAC3D,eAAe,GAAA,CAAI,aAAA;AAAA,MACnB,OAAA,EAAS,OAAO,MAAA,CAAO,CAAC,GAAI,GAAA,CAAI,OAAA,IAAW,EAAG,CAAC,CAAA;AAAA,MAC/C,QAAA,EAAU,kBAAA,CAAmB,GAAA,CAAI,QAAQ,CAAA;AAAA,MACzC,QAAA,EAAU,eAAA,CAAgB,GAAA,CAAI,QAAA,EAAU,IAAI,OAAO,CAAA;AAAA,MACnD,SAAA,EAAW,IAAI,SAAA,IAAa,CAAA;AAAA,MAC5B,SAAA,EAAW,IAAI,SAAA,IAAa,SAAA;AAAA,MAC5B,SAAA,EAAW,IAAI,SAAA,IAAa,GAAA;AAAA,MAC5B,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,IAAA,EAAM,OAAO,MAAA,CAAO,CAAC,GAAI,GAAA,CAAI,IAAA,IAAQ,EAAG,CAAC,CAAA;AAAA,MACzC,QAAA,EAAU,OAAO,MAAA,CAAO,EAAE,GAAI,GAAA,CAAI,QAAA,IAAY,EAAC,EAAI,CAAA;AAAA,MACnD,UAAA,EAAY,IAAI,UAAA,IAAc,KAAA;AAAA,MAC9B,uBAAuB,GAAA,CAAI,qBAAA;AAAA,MAC3B,iBAAA,EAAmB,yBAAA,CAA0B,GAAA,CAAI,iBAAiB,CAAA;AAAA,MAClE,YAAA,EAAc,GAAA,CAAI,YAAA,GACd,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,GAAA,CAAI,YAAY,CAAC,CAAA,GACnC;AAAA,KACN;AAAA,EACF;AACF,CAAC,CAAA;AAQM,SAAS,WAKd,UAAA,EACuC;AACvC,EAAA,OAAO,aAAA;AAAA,IACL;AAAA,GACF;AACF;AAYO,SAAS,aAAA,CACd,QACA,KAAA,EAC0B;AAC1B,EAAA,IAAI,OAAO,WAAA,EAAa;AACtB,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,WAAA,CAAY,SAAA,CAAU,KAAK,CAAA;AACjD,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,eAAA;AAAA,UACN,OAAA,EAAS,OAAO,MAAA,CAAO,EAAE,MAAM,eAAA,CAAgB,MAAA,CAAO,KAAA,CAAM,MAAM,CAAC,CAAA,CAAA;AAAA,UACnE,KAAA,EAAO,OAAO,KAAA,CAAM;AAAA;AACtB,OACF;AAAA,IACF;AACA,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,OAAO,IAAA,EAAe;AAAA,EAClD;AACA,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,OAAO,kBAAA,CAA2B,MAAA,CAAO,EAAA,EAAI,MAAA,CAAO,QAAQ,KAAK,CAAA;AAAA,EACnE;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,KAAA,EAAgB;AAC5C;AAaO,SAAS,eAAA,CACd,QACA,OAAA,EAC4B;AAC5B,EAAA,IAAI,CAAC,OAAO,aAAA,EAAe;AACzB,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,OAAA,EAAoB;AAAA,EAChD;AACA,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,aAAA,CAAc,SAAA,CAAU,OAAO,CAAA;AACrD,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,eAAA;AAAA,QACN,OAAA,EAAS,OAAO,MAAA,CAAO,EAAE,kDAA6C,eAAA,CAAgB,MAAA,CAAO,KAAA,CAAM,MAAM,CAAC,CAAA,CAAA;AAAA,QAC1G,KAAA,EAAO,SAAA;AAAA,QACP,KAAA,EAAO,OAAO,KAAA,CAAM;AAAA;AACtB,KACF;AAAA,EACF;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,OAAO,IAAA,EAAiB;AACpD;AAYO,SAAS,cAAA,CACd,QACA,MAAA,EACS;AACT,EAAA,IAAI,OAAO,YAAA,EAAc;AACvB,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,YAAA,CAAa,SAAA,CAAU,MAAM,CAAA;AACnD,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,MAAM,IAAI,SAAA,CAAU;AAAA,QAClB,IAAA,EAAM,gBAAA;AAAA,QACN,OAAA,EAAS,OAAO,MAAA,CAAO,EAAE,uEAAkE,eAAA,CAAgB,MAAA,CAAO,KAAA,CAAM,MAAM,CAAC,CAAA,CAAA;AAAA,QAC/H,KAAA,EAAO,OAAO,KAAA,CAAM;AAAA,OACrB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AACA,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,MAAM,SAAS,kBAAA,CAA4B,MAAA,CAAO,EAAA,EAAI,MAAA,CAAO,SAAS,MAAM,CAAA;AAC5E,IAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,MAAA,MAAM,IAAI,SAAA,CAAU;AAAA,QAClB,IAAA,EAAM,gBAAA;AAAA,QACN,OAAA,EAAS,OAAO,KAAA,CAAM,OAAA;AAAA,QACtB,KAAA,EAAO,OAAO,KAAA,CAAM;AAAA,OACrB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,MAAA,CAAO,KAAA;AAAA,EAChB;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAA,CACP,UACA,OAAA,EACe;AACf,EAAA,IAAI,UAAU,OAAO,QAAA;AACrB,EAAA,OAAO,OAAA,IAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,WAAA,GAAc,MAAA;AACvD;AAEA,SAAS,mBACP,IAAA,EAC4B;AAC5B,EAAA,OAAO,OAAO,MAAA,CAAO;AAAA,IACnB,OAAA,EAAS,OAAO,MAAA,CAAO,CAAC,GAAI,IAAA,EAAM,OAAA,IAAW,EAAG,CAAC,CAAA;AAAA,IACjD,OAAA,EAAS,OAAO,MAAA,CAAO,CAAC,GAAI,IAAA,EAAM,OAAA,IAAW,EAAG,CAAC,CAAA;AAAA,IACjD,KAAA,EAAO,OAAO,MAAA,CAAO,CAAC,GAAI,IAAA,EAAM,KAAA,IAAS,EAAG,CAAC;AAAA,GAC9C,CAAA;AACH;AAEA,SAAS,0BACP,CAAA,EAC6B;AAC7B,EAAA,MAAM,MAAA,GAAA,CAAU,CAAA,EAAG,MAAA,IAAU,EAAC,EAAG,MAAA;AAAA,IAAO,CAAC,CAAA,KACvC,cAAA,CAAe,QAAA,CAAS,CAAe;AAAA,GACzC;AACA,EAAA,MAAM,WAAA,GAAA,CAAe,CAAA,EAAG,WAAA,IAAe,EAAC,EAAG,MAAA;AAAA,IAAO,CAAC,CAAA,KACjD,cAAA,CAAe,QAAA,CAAS,CAAe;AAAA,GACzC;AACA,EAAA,OAAO,OAAO,MAAA,CAAO;AAAA,IACnB,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAA,IAC5B,WAAA,EAAa,MAAA,CAAO,MAAA,CAAO,WAAW;AAAA,GACvC,CAAA;AACH;AAEA,SAAS,gBACP,MAAA,EACQ;AACR,EAAA,OAAO,MAAA,CACJ,IAAI,CAAC,CAAA,KAAM,GAAG,CAAA,CAAE,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,KAAK,GAAG,CAAA,GAAI,OAAO,EAAE,CAAA,EAAG,EAAE,OAAO,CAAA,CAAE,CAAA,CAC5E,IAAA,CAAK,IAAI,CAAA;AACd;AAIA,IAAM,OAAO,IAAI,GAAA,CAAI,EAAE,SAAA,EAAW,MAAM,CAAA;AAKxC,IAAM,eAAA,uBAAsB,OAAA,EAG1B;AAEF,SAAS,kBAAA,CACP,MAAA,EACA,MAAA,EACA,KAAA,EACqB;AACrB,EAAA,IAAI,QAAA,GAAW,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA;AACzC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,QAAA,GAAW,IAAA,CAAK,QAAQ,MAA4C,CAAA;AACpE,IAAA,eAAA,CAAgB,GAAA,CAAI,QAAQ,QAAQ,CAAA;AAAA,EACtC;AACA,EAAA,MAAM,KAAA,GAAQ,SAAS,KAAK,CAAA;AAC5B,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,IAAU,EAAC;AACnC,IAAA,MAAM,OAAA,GAAU,MAAA,CACb,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAA,CAAE,YAAA,IAAgB,GAAG,IAAI,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CAClD,KAAK,IAAI,CAAA;AACZ,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,eAAA;AAAA,QACN,OAAA,EAAS,CAAA,IAAA,EAAO,MAAM,CAAA,GAAA,EAAM,OAAO,CAAA,CAAA;AAAA,QACnC,KAAA,EAAO;AAAA;AACT,KACF;AAAA,EACF;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAkB;AACvC;;;ACnRO,IAAM,6BAAA,GAAgC,EAAE,MAAA,CAAO;AAAA,EACpD,MAAA,EAAQ,CAAA,CAAE,OAAA,CAAQ,oBAAoB,EAAE,QAAA,EAAS;AAAA,EACjD,IAAA,EAAM,EAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,EAAE,CAAA;AAAA,EAC9B,EAAA,EAAI,CAAA,CAAE,MAAA,EAAO,CAAE,MAAM,0BAA0B,CAAA;AAAA,EAC/C,WAAA,EAAa,EAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,GAAI,CAAA;AAAA,EACvC,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,MAAM,gBAAgB,CAAA;AAAA;AAAA,EAG1C,SAAS,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACtC,QAAA,EAAU,EACP,MAAA,CAAO;AAAA,IACN,SAAS,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,IACtC,SAAS,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,IACtC,OAAO,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA;AAAS,GACrC,EACA,QAAA,EAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAKZ,UAAU,CAAA,CACP,MAAA;AAAA,IACC,CAAC,CAAA,KACC,OAAO,CAAA,KAAM,QAAA,KACZ,CAAA,KAAM,MAAA,IACL,CAAA,KAAM,QAAA,IACN,CAAA,KAAM,WAAA,IACN,UAAA,CAAW,KAAK,CAAC,CAAA,CAAA;AAAA,IACrB,EAAE,SAAS,4DAAA;AAA6D,IAEzE,QAAA,EAAS;AAAA,EACZ,UAAA,EAAY,EACT,KAAA,CAAM,CAAC,EAAE,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,GAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,CAAE,QAAQ,CAAC,CAAC,CAAC,CAAA,CAC9D,QAAA,EAAS;AAAA,EACZ,UAAA,EAAY,EAAE,IAAA,CAAK,CAAC,WAAW,SAAA,EAAW,WAAW,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EACjE,UAAA,EAAY,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACjD,UAAA,EAAY,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EACjC,MAAM,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACnC,QAAA,EAAU,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASrD,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS;AAAA,EACnD,OAAA,EAAS,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS;AAAA;AAAA;AAAA,EAIpD,IAAA,EAAM,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC3B,GAAA,EAAK,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC1B,MAAA,EAAQ,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC7B,OAAA,EAAS,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC9B,OAAA,EAAS,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AACvB,CAAC;AAeM,SAAS,kBAAkB,MAAA,EAA8B;AAC9D,EAAA,MAAM,MAAA,GAAS,OAAO,MAAM,CAAA;AAC5B,EAAA,IAAI,OAAO,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AACzC,IAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,EACnE;AACA,EAAA,MAAM,MAAA,GAAS,6BAAA,CAA8B,SAAA,CAAU,MAAA,CAAO,IAAI,CAAA;AAClE,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,iDAA4C,MAAA,CAAO,KAAA,CAAM,OACtD,GAAA,CAAI,CAAA,CAAA,KAAK,GAAG,CAAA,CAAE,IAAA,CAAK,KAAK,GAAG,CAAC,KAAK,CAAA,CAAE,OAAO,EAAE,CAAA,CAC5C,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KACf;AAAA,EACF;AAGA,EAAA,wBAAA,CAAyB,MAAA,CAAO,IAAA,CAAK,EAAA,EAAI,MAAA,CAAO,IAAI,CAAA;AAEpD,EAAA,OAAO,EAAE,WAAA,EAAa,MAAA,CAAO,IAAA,EAAM,IAAA,EAAM,OAAO,OAAA,EAAQ;AAC1D;AAgBO,SAAS,qBACd,QAAA,EAC8B;AAC9B,EAAA,MAAM,KAAK,QAAA,CAAS,WAAA;AACpB,EAAA,OAAO,UAAA,CAAW;AAAA,IAChB,IAAI,EAAA,CAAG,EAAA;AAAA,IACP,MAAM,EAAA,CAAG,IAAA;AAAA,IACT,aAAa,EAAA,CAAG,WAAA;AAAA,IAChB,SAAS,EAAA,CAAG,OAAA;AAAA,IACZ,QAAQ,EAAA,CAAG,MAAA;AAAA,IACX,SAAS,EAAA,CAAG,OAAA;AAAA,IACZ,SAAS,EAAA,CAAG,OAAA;AAAA,IACZ,UAAU,EAAA,CAAG,QAAA;AAAA,IACb,UAAU,EAAA,CAAG,QAAA;AAAA,IACb,WAAW,EAAA,CAAG,UAAA;AAAA,IACd,WAAW,EAAA,CAAG,UAAA;AAAA,IACd,WAAW,EAAA,CAAG,UAAA;AAAA,IACd,YAAY,EAAA,CAAG,UAAA;AAAA,IACf,MAAM,EAAA,CAAG,IAAA;AAAA,IACT,UAAU,EAAA,CAAG;AAAA,GACd,CAAA;AACH;AAuBO,SAAS,iBAId,IAAA,EAKwC;AACxC,EAAA,MAAM,EAAA,GAAK,KAAK,QAAA,CAAS,WAAA;AACzB,EAAA,OAAO,UAAA,CAAsC;AAAA,IAC3C,IAAI,EAAA,CAAG,EAAA;AAAA,IACP,MAAM,EAAA,CAAG,IAAA;AAAA,IACT,aAAa,EAAA,CAAG,WAAA;AAAA,IAChB,SAAS,EAAA,CAAG,OAAA;AAAA,IACZ,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,cAAc,IAAA,CAAK,YAAA;AAAA,IACnB,QAAQ,EAAA,CAAG,MAAA;AAAA,IACX,SAAS,EAAA,CAAG,OAAA;AAAA,IACZ,eAAe,IAAA,CAAK,aAAA;AAAA,IACpB,SAAS,EAAA,CAAG,OAAA;AAAA,IACZ,UAAU,EAAA,CAAG,QAAA;AAAA,IACb,UAAU,EAAA,CAAG,QAAA;AAAA,IACb,WAAW,EAAA,CAAG,UAAA;AAAA,IACd,WAAW,EAAA,CAAG,UAAA;AAAA,IACd,WAAW,EAAA,CAAG,UAAA;AAAA,IACd,YAAY,EAAA,CAAG,UAAA;AAAA,IACf,MAAM,EAAA,CAAG,IAAA;AAAA,IACT,UAAU,EAAA,CAAG;AAAA,GACd,CAAA;AACH","file":"chunk-TABQGCU4.mjs","sourcesContent":["/**\n * Minimal well-formedness check for the AIP-16 `inputs`/`outputs` JSON\n * Schema blocks declared in a TOOL.md frontmatter.\n *\n * This is deliberately NOT a full JSON Schema validator — invocation-time\n * validation against the payload still happens in `define-tool.ts` via\n * `validateJsonSchema` (ajv). This check runs at MANIFEST PARSE time and\n * only catches structurally malformed schemas that no validator could\n * meaningfully compile (e.g. `properties: \"...\"` or `required: \"name\"` —\n * a typo that would otherwise surface as a confusing ajv error deep in a\n * tool invocation, or not at all).\n *\n * Checked keys and their minimal shapes (JSON Schema draft 2020-12):\n * type — string, or non-empty array of strings\n * properties — object\n * required — array of strings\n * items — object, or array of objects (tuple form)\n * $ref — string\n * enum — non-empty array\n */\n\nexport interface MinimalJsonSchemaIssue {\n /** Dotted path of the offending key inside the schema block. */\n path: string\n message: string\n}\n\n/**\n * Check one IO schema block. Returns a list of issues (empty = well-formed\n * enough to hand to ajv later). Values are only checked when the key is\n * PRESENT; an absent key imposes no constraint.\n */\nexport function checkMinimalJsonSchema(\n value: unknown,\n): MinimalJsonSchemaIssue[] {\n const issues: MinimalJsonSchemaIssue[] = []\n if (\n value === null ||\n typeof value !== \"object\" ||\n Array.isArray(value)\n ) {\n return [{ path: \"\", message: \"schema must be an object\" }]\n }\n const schema = value as Record<string, unknown>\n\n if (schema.type !== undefined) {\n const ok =\n typeof schema.type === \"string\" ||\n (Array.isArray(schema.type) &&\n schema.type.length > 0 &&\n schema.type.every(t => typeof t === \"string\"))\n if (!ok) {\n issues.push({\n path: \"type\",\n message: \"type must be a string or array of strings\",\n })\n }\n }\n\n if (schema.properties !== undefined) {\n if (\n schema.properties === null ||\n typeof schema.properties !== \"object\" ||\n Array.isArray(schema.properties)\n ) {\n issues.push({ path: \"properties\", message: \"properties must be an object\" })\n }\n }\n\n if (schema.required !== undefined) {\n const ok =\n Array.isArray(schema.required) &&\n schema.required.every(r => typeof r === \"string\")\n if (!ok) {\n issues.push({ path: \"required\", message: \"required must be an array of strings\" })\n }\n }\n\n if (schema.items !== undefined) {\n const isSchemaObject = (v: unknown) =>\n v !== null && typeof v === \"object\" && !Array.isArray(v)\n const ok =\n isSchemaObject(schema.items) ||\n (Array.isArray(schema.items) && schema.items.every(isSchemaObject))\n if (!ok) {\n issues.push({ path: \"items\", message: \"items must be an object or array of objects\" })\n }\n }\n\n if (schema.$ref !== undefined && typeof schema.$ref !== \"string\") {\n issues.push({ path: \"$ref\", message: \"$ref must be a string\" })\n }\n\n if (schema.enum !== undefined) {\n if (!Array.isArray(schema.enum) || schema.enum.length === 0) {\n issues.push({ path: \"enum\", message: \"enum must be a non-empty array\" })\n }\n }\n\n return issues\n}\n\n/**\n * Validate the `inputs`/`outputs` blocks of a parsed manifest. Throws with\n * a message naming the tool id and the offending block, e.g.\n * `invalid inputs block for tool echo: properties must be an object`.\n */\nexport function validateManifestIOBlocks(\n toolId: string,\n blocks: { inputs?: unknown; outputs?: unknown },\n): void {\n for (const key of [\"inputs\", \"outputs\"] as const) {\n const value = blocks[key]\n if (value === undefined) continue\n const issues = checkMinimalJsonSchema(value)\n if (issues.length > 0) {\n // Each message already names the offending key (e.g. \"properties must\n // be an object\"); the empty-path top-level message reads on its own.\n const detail = issues.map(i => i.message).join(\"; \")\n throw new Error(\n `invalid ${key} block for tool ${toolId}: ${detail}`\n )\n }\n }\n}\n","import type { ToolResult } from \"./types.js\"\n\n/**\n * AIP-14 conventional error codes. Tool-specific codes MAY use a domain\n * prefix (`\"stripe:card_declined\"`).\n */\nexport type ToolErrorCode =\n | \"input_invalid\"\n | \"output_invalid\"\n | \"unauthorised\"\n | \"not_found\"\n | \"rate_limited\"\n | \"timeout\"\n | \"upstream_error\"\n | \"internal\"\n | (string & {})\n\nexport interface ToolErrorPayload {\n code: ToolErrorCode\n message: string\n retryable?: boolean\n cause?: unknown\n}\n\n/**\n * Structured error thrown by tool bodies. Adapters wrap this into the\n * standard {@link ToolResult} envelope; bodies MUST throw it (never\n * return error objects).\n */\nexport class ToolError extends Error {\n readonly code: ToolErrorCode\n readonly retryable: boolean\n readonly cause: unknown\n\n constructor(payload: ToolErrorPayload) {\n super(payload.message)\n this.name = \"ToolError\"\n this.code = payload.code\n this.retryable = payload.retryable ?? false\n this.cause = payload.cause\n }\n\n toJSON(): ToolErrorPayload {\n return {\n code: this.code,\n message: this.message,\n retryable: this.retryable,\n ...(this.cause !== undefined ? { cause: this.cause } : {}),\n }\n }\n}\n\n/**\n * Wrap an unknown thrown value into a {@link ToolError}. Used by adapters\n * to normalise non-ToolError throws into the standard envelope.\n */\nexport function toToolError(thrown: unknown): ToolError {\n if (thrown instanceof ToolError) return thrown\n if (thrown instanceof Error) {\n return new ToolError({\n code: \"internal\",\n message: thrown.message,\n cause: thrown,\n })\n }\n return new ToolError({\n code: \"internal\",\n message: String(thrown),\n cause: thrown,\n })\n}\n\n/**\n * Adapter helper: project a thrown ToolError (or any throw) into the\n * standard {@link ToolResult} envelope. Adapters MUST do this; bodies MUST NOT.\n */\nexport function toToolResult<T>(\n value: T | undefined,\n thrown: unknown\n): ToolResult<T> {\n if (thrown !== undefined) {\n const err = toToolError(thrown)\n return { ok: false, error: err.toJSON() }\n }\n return { ok: true, value: value as T }\n}\n","import { createDoctype } from \"@agentproto/doctype\"\nimport Ajv from \"ajv\"\nimport type { ZodType } from \"zod\"\nimport { ToolError } from \"./errors.js\"\nimport type {\n ApprovalClass,\n DriverConstraints,\n DriverKind,\n ToolCapabilities,\n ToolContext,\n ToolDefinition,\n ToolHandle,\n ValidationResult,\n} from \"./types.js\"\n\nconst PROVIDER_KINDS: readonly DriverKind[] = [\n \"cli\",\n \"http\",\n \"mcp\",\n \"sdk\",\n \"builtin\",\n]\n\n/**\n * AIP-14 reference implementation of `defineTool`.\n *\n * Returns a {@link ToolHandle} with defaults applied. The handle is a\n * pure contract — schemas, governance metadata, provider routing\n * hints. Bodies live on AIP-30 PROVIDER manifests; invocation goes\n * through provider-runtime's resolver.\n *\n * Built on `createDoctype` from `@agentproto/doctype`: the\n * id-pattern + description-length validation and the top-level\n * `Object.freeze` are shared with every other AIP defineX. The\n * spec-14-specific parts (migration guard for `execute`, defaulting\n * `approval` from `mutates`, freezing nested arrays/objects) live in\n * `validate` and `build` below.\n *\n * Conformance highlights ([§ Conformance rules](https://agentproto.sh/docs/aip-14)):\n * - No `execute` field on the contract — bodies are providers' job.\n * - `defineTool` MUST refuse a definition carrying `execute` (migration error).\n * - No I/O at module load — `defineTool(...)` is pure construction.\n */\nconst constructTool = createDoctype<\n ToolDefinition<unknown, unknown, ToolContext>,\n ToolHandle<unknown, unknown, ToolContext>\n>({\n aip: 14,\n name: \"tool\",\n validate(def) {\n // Migration guard: catch authors trying to ship a body on the contract.\n // The body lives on a PROVIDER (per AIP-30); reject at construction.\n if (\"execute\" in (def as unknown as Record<string, unknown>)) {\n throw new Error(\n `defineTool: id='${def.id}' carries an 'execute' property. ` +\n `Bodies live on AIP-30 PROVIDER manifests, not on the TOOL contract. ` +\n `See https://agentproto.sh/docs/aip-30 for migration.`,\n )\n }\n },\n build(def) {\n return {\n id: def.id,\n name: def.name ?? def.id,\n description: def.description,\n version: def.version,\n inputSchema: def.inputSchema,\n outputSchema: def.outputSchema,\n inputs: def.inputs ? Object.freeze({ ...def.inputs }) : undefined,\n outputs: def.outputs ? Object.freeze({ ...def.outputs }) : undefined,\n contextSchema: def.contextSchema,\n mutates: Object.freeze([...(def.mutates ?? [])]),\n requires: freezeCapabilities(def.requires),\n approval: defaultApproval(def.approval, def.mutates),\n riskLevel: def.riskLevel ?? 0,\n costClass: def.costClass ?? \"trivial\",\n timeoutMs: def.timeoutMs ?? 30_000,\n retry: def.retry,\n tags: Object.freeze([...(def.tags ?? [])]),\n metadata: Object.freeze({ ...(def.metadata ?? {}) }),\n idempotent: def.idempotent ?? false,\n defaultImplementation: def.defaultImplementation,\n driverConstraints: freezeProviderConstraints(def.driverConstraints),\n transformers: def.transformers\n ? Object.freeze([...def.transformers])\n : undefined,\n }\n },\n})\n\n/**\n * Public-facing `defineTool` — typed wrapper around `constructTool`\n * that preserves the per-call `<TInput, TOutput, TContext>` inference\n * so callers don't write any generics. The wrapper exists purely for\n * generic propagation; the runtime body is the meta-factory above.\n */\nexport function defineTool<\n TInput,\n TOutput,\n TContext extends ToolContext = ToolContext,\n>(\n definition: ToolDefinition<TInput, TOutput, TContext>,\n): ToolHandle<TInput, TOutput, TContext> {\n return constructTool(\n definition as ToolDefinition<unknown, unknown, ToolContext>,\n ) as unknown as ToolHandle<TInput, TOutput, TContext>\n}\n\n/**\n * Validate input against a tool's `inputSchema`. Returns a typed\n * {@link ValidationResult}; provider runtimes MUST call this BEFORE\n * dispatching to the provider's body.\n *\n * Priority:\n * 1. zod `inputSchema` (v0.1) — used when present.\n * 2. JSON Schema `inputs` (v0.2) — fallback for manifest-only tools.\n * 3. No schema — passthrough (returns `ok: true`).\n */\nexport function validateInput<TInput>(\n handle: Pick<ToolHandle<TInput>, \"id\" | \"inputSchema\" | \"inputs\">,\n input: unknown,\n): ValidationResult<TInput> {\n if (handle.inputSchema) {\n const result = handle.inputSchema.safeParse(input)\n if (!result.success) {\n return {\n ok: false,\n error: {\n code: \"input_invalid\",\n message: `id='${handle.id}': ${formatZodIssues(result.error.issues)}`,\n cause: result.error.issues,\n },\n }\n }\n return { ok: true, value: result.data as TInput }\n }\n if (handle.inputs) {\n return validateJsonSchema<TInput>(handle.id, handle.inputs, input)\n }\n return { ok: true, value: input as TInput }\n}\n\n/**\n * Validate context against a tool's `contextSchema` (when declared).\n * Returns a typed {@link ValidationResult}; provider runtimes MUST\n * call this BEFORE dispatching when the contract has a contextSchema.\n *\n * Tools without a contextSchema accept any context shape; this helper\n * returns the input verbatim in that case.\n *\n * Context validation uses only zod (no JSON Schema fallback) — context\n * schemas are always authored in TS, never in manifests.\n */\nexport function validateContext<TContext extends ToolContext = ToolContext>(\n handle: Pick<ToolHandle<unknown, unknown, TContext>, \"id\" | \"contextSchema\">,\n context: unknown,\n): ValidationResult<TContext> {\n if (!handle.contextSchema) {\n return { ok: true, value: context as TContext }\n }\n const result = handle.contextSchema.safeParse(context)\n if (!result.success) {\n return {\n ok: false,\n error: {\n code: \"input_invalid\",\n message: `id='${handle.id}': context does not match contextSchema — ${formatZodIssues(result.error.issues)}`,\n field: \"context\",\n cause: result.error.issues,\n },\n }\n }\n return { ok: true, value: result.data as TContext }\n}\n\n/**\n * Validate output against a tool's `outputSchema`. Returns the typed\n * value on success; throws {@link ToolError} with code `\"output_invalid\"`\n * on contract violation.\n *\n * Priority:\n * 1. zod `outputSchema` (v0.1) — used when present.\n * 2. JSON Schema `outputs` (v0.2) — fallback for manifest-only tools.\n * 3. No schema — passthrough (returns the value as-is).\n */\nexport function validateOutput<TOutput>(\n handle: Pick<ToolHandle<unknown, TOutput>, \"id\" | \"outputSchema\" | \"outputs\">,\n output: unknown,\n): TOutput {\n if (handle.outputSchema) {\n const result = handle.outputSchema.safeParse(output)\n if (!result.success) {\n throw new ToolError({\n code: \"output_invalid\",\n message: `id='${handle.id}': provider produced output that does not match outputSchema — ${formatZodIssues(result.error.issues)}`,\n cause: result.error.issues,\n })\n }\n return result.data as TOutput\n }\n if (handle.outputs) {\n const result = validateJsonSchema<TOutput>(handle.id, handle.outputs, output)\n if (!result.ok) {\n throw new ToolError({\n code: \"output_invalid\",\n message: result.error.message,\n cause: result.error.cause,\n })\n }\n return result.value\n }\n return output as TOutput\n}\n\nfunction defaultApproval(\n declared: ApprovalClass | undefined,\n mutates: readonly string[] | undefined,\n): ApprovalClass {\n if (declared) return declared\n return mutates && mutates.length > 0 ? \"on-mutate\" : \"auto\"\n}\n\nfunction freezeCapabilities(\n caps: ToolCapabilities | undefined,\n): Readonly<ToolCapabilities> {\n return Object.freeze({\n network: Object.freeze([...(caps?.network ?? [])]),\n secrets: Object.freeze([...(caps?.secrets ?? [])]),\n tools: Object.freeze([...(caps?.tools ?? [])]),\n })\n}\n\nfunction freezeProviderConstraints(\n c: DriverConstraints | undefined,\n): Required<DriverConstraints> {\n const forbid = (c?.forbid ?? []).filter((k): k is DriverKind =>\n PROVIDER_KINDS.includes(k as DriverKind),\n )\n const requireKind = (c?.requireKind ?? []).filter((k): k is DriverKind =>\n PROVIDER_KINDS.includes(k as DriverKind),\n )\n return Object.freeze({\n forbid: Object.freeze(forbid) as readonly DriverKind[],\n requireKind: Object.freeze(requireKind) as readonly DriverKind[],\n })\n}\n\nfunction formatZodIssues(\n issues: ReadonlyArray<{ path: ReadonlyArray<PropertyKey>; message: string }>,\n): string {\n return issues\n .map((i) => `${i.path.length > 0 ? i.path.join(\".\") + \": \" : \"\"}${i.message}`)\n .join(\"; \")\n}\n\n// Shared Ajv instance — created once at module load.\n// allErrors: true so we surface all violations, not just the first.\nconst _ajv = new Ajv({ allErrors: true })\n\n// Validator cache keyed by schema object identity. Avoids repeated _ajv.compile()\n// calls (which go through Ajv's internal registry) and lets GC collect validators\n// when a tool handle is no longer referenced.\nconst _validatorCache = new WeakMap<\n object,\n ReturnType<typeof _ajv.compile>\n>()\n\nfunction validateJsonSchema<T>(\n toolId: string,\n schema: Record<string, unknown>,\n value: unknown,\n): ValidationResult<T> {\n let validate = _validatorCache.get(schema)\n if (!validate) {\n validate = _ajv.compile(schema as Parameters<typeof _ajv.compile>[0])\n _validatorCache.set(schema, validate)\n }\n const valid = validate(value)\n if (!valid) {\n const errors = validate.errors ?? []\n const message = errors\n .map((e) => `${e.instancePath || \"/\"} ${e.message}`)\n .join(\"; \")\n return {\n ok: false,\n error: {\n code: \"input_invalid\",\n message: `id='${toolId}': ${message}`,\n cause: errors,\n },\n }\n }\n return { ok: true, value: value as T }\n}\n\nexport type { ZodType }\n","import matter from \"gray-matter\"\nimport { z, type ZodType } from \"zod\"\nimport { validateManifestIOBlocks } from \"../json-schema.js\"\nimport { defineTool } from \"../define-tool.js\"\nimport type { ApprovalClass, ToolContext, ToolHandle } from \"../types.js\"\n\n/**\n * AIP-14 TOOL.md sidecar parser.\n *\n * Reads frontmatter (host-relevant metadata) + body (long-form\n * description / examples / errors). The TS module's `defineTool(...)`\n * supplies the schemas and execute body; this manifest supplies the\n * runtime metadata that overrides or augments the in-code defaults.\n *\n * Field set covers AIP-14 §\"Frontmatter\" — required and optional fields\n * normalised to snake_case → camelCase.\n */\n\nexport const toolManifestFrontmatterSchema = z.object({\n schema: z.literal(\"agentproto/tool/v1\").optional(),\n name: z.string().min(1).max(80),\n id: z.string().regex(/^[a-z][a-z0-9._-]{1,63}$/),\n description: z.string().min(1).max(2000),\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+/),\n\n // Optional metadata\n mutates: z.array(z.string()).optional(),\n requires: z\n .object({\n network: z.array(z.string()).optional(),\n secrets: z.array(z.string()).optional(),\n tools: z.array(z.string()).optional(),\n })\n .optional(),\n // `ApprovalClass` is `\"auto\" | \"always\" | \"on-mutate\" | \\`policy:${string}\\``.\n // z.union widens the regex branch to plain `string` (zod can't express\n // template literal types), so we use `z.custom` to keep the inferred\n // type exact — matters because `defineTool` accepts `ApprovalClass`.\n approval: z\n .custom<ApprovalClass>(\n (v): v is ApprovalClass =>\n typeof v === \"string\" &&\n (v === \"auto\" ||\n v === \"always\" ||\n v === \"on-mutate\" ||\n /^policy:/.test(v)),\n { message: \"expected 'auto' | 'always' | 'on-mutate' | 'policy:<name>'\" },\n )\n .optional(),\n risk_level: z\n .union([z.literal(0), z.literal(1), z.literal(2), z.literal(3)])\n .optional(),\n cost_class: z.enum([\"trivial\", \"metered\", \"expensive\"]).optional(),\n timeout_ms: z.number().int().positive().optional(),\n idempotent: z.boolean().optional(),\n tags: z.array(z.string()).optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n\n // AIP-16 IO blocks — `inputs`/`outputs` as JSON Schema objects. Kept\n // structurally loose here (validated as objects, not deep-checked against\n // the AIP-16 meta-schema); preserved so a manifest's declared IO contract\n // survives the parse → handle round-trip instead of being silently dropped.\n // Minimal well-formedness (correct JSON types on type/properties/required/\n // items/$ref/enum) is enforced in `parseToolManifest` via\n // `validateManifestIOBlocks` — see `../json-schema.ts`.\n inputs: z.record(z.string(), z.unknown()).optional(),\n outputs: z.record(z.string(), z.unknown()).optional(),\n\n // AIP-26 / AIP-17 / AIP-19 references — kept loose; validated by their\n // respective AIPs' adapters when consumed.\n code: z.unknown().optional(),\n run: z.unknown().optional(),\n runner: z.unknown().optional(),\n secrets: z.unknown().optional(),\n network: z.unknown().optional(),\n})\n\nexport type ToolManifestFrontmatter = z.infer<\n typeof toolManifestFrontmatterSchema\n>\n\nexport interface ToolManifest {\n frontmatter: ToolManifestFrontmatter\n body: string\n}\n\n/**\n * Parse a TOOL.md source string into structured frontmatter + body.\n * Throws on missing frontmatter or schema-invalid frontmatter.\n */\nexport function parseToolManifest(source: string): ToolManifest {\n const parsed = matter(source)\n if (Object.keys(parsed.data).length === 0) {\n throw new Error(\"parseToolManifest: missing or empty frontmatter\")\n }\n const result = toolManifestFrontmatterSchema.safeParse(parsed.data)\n if (!result.success) {\n throw new Error(\n `parseToolManifest: invalid frontmatter — ${result.error.issues\n .map(i => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \")}`\n )\n }\n // AIP-16 IO blocks: minimal JSON-Schema well-formedness at parse time\n // (typed keys, not full validation — ajv handles that at invocation).\n validateManifestIOBlocks(result.data.id, result.data)\n\n return { frontmatter: result.data, body: parsed.content }\n}\n\nexport { checkMinimalJsonSchema } from \"../json-schema.js\"\n\n/**\n * Build a {@link ToolHandle} from a manifest that has no companion TS module.\n *\n * `inputSchema`/`outputSchema` are omitted; IO validation falls back to the\n * AIP-16 `inputs`/`outputs` JSON Schema blocks declared in the frontmatter\n * (via `validateInput`/`validateOutput`). The returned handle is typed as\n * `ToolHandle<unknown, unknown>` since the generic shapes are not statically\n * known.\n *\n * Use this when loading an agent-generated TOOL.md whose IO contract is\n * expressed in YAML (`inputs:`/`outputs:`) rather than a compiled TS module.\n */\nexport function toolFromManifestOnly(\n manifest: ToolManifest,\n): ToolHandle<unknown, unknown> {\n const fm = manifest.frontmatter\n return defineTool({\n id: fm.id,\n name: fm.name,\n description: fm.description,\n version: fm.version,\n inputs: fm.inputs,\n outputs: fm.outputs,\n mutates: fm.mutates,\n requires: fm.requires,\n approval: fm.approval,\n riskLevel: fm.risk_level,\n costClass: fm.cost_class,\n timeoutMs: fm.timeout_ms,\n idempotent: fm.idempotent,\n tags: fm.tags,\n metadata: fm.metadata,\n })\n}\n\n/**\n * Build a fully-typed {@link ToolHandle} from a parsed `TOOL.md` manifest\n * + caller-supplied schemas. The .md is the single source of truth for\n * metadata (id, name, description, version, mutates, approval, …); the\n * schemas live in the TS module that ships alongside the .md.\n *\n * Both inputs are revalidated by `defineTool`'s shared invariants\n * (id pattern, description length, top-level freeze) — `parseToolManifest`\n * already enforces a stricter id pattern + version semver, so a\n * well-formed manifest passes through cleanly. Mismatches between the\n * manifest's id-shape and `defineTool`'s pattern surface a\n * descriptive error from the same validation pipeline as the TS path.\n *\n * @example\n * const manifest = parseToolManifest(readFileSync(\"./echo/TOOL.md\", \"utf8\"))\n * const echo = toolFromManifest({\n * manifest,\n * inputSchema: z.object({ msg: z.string() }),\n * outputSchema: z.object({ msg: z.string() }),\n * })\n */\nexport function toolFromManifest<\n TInput,\n TOutput,\n TContext extends ToolContext = ToolContext,\n>(args: {\n manifest: ToolManifest\n inputSchema: ZodType<TInput>\n outputSchema: ZodType<TOutput>\n contextSchema?: ZodType<TContext>\n}): ToolHandle<TInput, TOutput, TContext> {\n const fm = args.manifest.frontmatter\n return defineTool<TInput, TOutput, TContext>({\n id: fm.id,\n name: fm.name,\n description: fm.description,\n version: fm.version,\n inputSchema: args.inputSchema,\n outputSchema: args.outputSchema,\n inputs: fm.inputs,\n outputs: fm.outputs,\n contextSchema: args.contextSchema,\n mutates: fm.mutates,\n requires: fm.requires,\n approval: fm.approval,\n riskLevel: fm.risk_level,\n costClass: fm.cost_class,\n timeoutMs: fm.timeout_ms,\n idempotent: fm.idempotent,\n tags: fm.tags,\n metadata: fm.metadata,\n })\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -61,7 +61,7 @@ declare function validateOutput<TOutput>(handle: Pick<ToolHandle<unknown, TOutpu
|
|
|
61
61
|
*
|
|
62
62
|
* Non-frontmatter values that can't appear in YAML (zod schemas,
|
|
63
63
|
* function bodies) are filtered out by `filterSerializable` from
|
|
64
|
-
* `@agentproto/
|
|
64
|
+
* `@agentproto/doctype`; the resulting frontmatter matches
|
|
65
65
|
* what `parseToolManifest` would consume on the way back in.
|
|
66
66
|
*/
|
|
67
67
|
|
|
@@ -257,7 +257,7 @@ declare const pageParamsShape: {
|
|
|
257
257
|
*
|
|
258
258
|
* Spec: https://agentproto.sh/docs/aip-14
|
|
259
259
|
*/
|
|
260
|
-
declare const SPEC_NAME: "
|
|
260
|
+
declare const SPEC_NAME: "tool/v1";
|
|
261
261
|
declare const SPEC_VERSION: "1.0.0-alpha";
|
|
262
262
|
|
|
263
263
|
export { type CreateToolOptions, type CreateToolResult, type CursorPayload, type McpTextResult, type Page, type PageParams, type PaginateOpts, type PaginatedOptions, SPEC_NAME, SPEC_VERSION, ToolContext, ToolDefinition, ToolError, type ToolErrorCode, type ToolErrorPayload, ToolHandle, ToolResult, ToolTransformer, ValidationResult, catchErrors, createTool, decodeCursor, defineTool, encodeCursor, pageParamsShape, paginate, paginated, toToolError, toToolResult, toolSpec, toolText, toolVerbs, validateContext, validateInput, validateOutput };
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { parseToolManifest, defineTool } from './chunk-
|
|
2
|
-
export { ToolError, checkMinimalJsonSchema, defineTool, parseToolManifest, toToolError, toToolResult, toolFromManifest, toolFromManifestOnly, validateContext, validateInput, validateManifestIOBlocks, validateOutput } from './chunk-
|
|
3
|
-
import { filterSerializable } from '@agentproto/
|
|
1
|
+
import { parseToolManifest, defineTool } from './chunk-TABQGCU4.mjs';
|
|
2
|
+
export { ToolError, checkMinimalJsonSchema, defineTool, parseToolManifest, toToolError, toToolResult, toolFromManifest, toolFromManifestOnly, validateContext, validateInput, validateManifestIOBlocks, validateOutput } from './chunk-TABQGCU4.mjs';
|
|
3
|
+
import { filterSerializable } from '@agentproto/doctype';
|
|
4
4
|
import matter from 'gray-matter';
|
|
5
5
|
import { mkdir, writeFile } from 'fs/promises';
|
|
6
6
|
import { join, dirname } from 'path';
|
|
@@ -183,7 +183,7 @@ function catchErrors() {
|
|
|
183
183
|
}
|
|
184
184
|
|
|
185
185
|
// src/index.ts
|
|
186
|
-
var SPEC_NAME = "
|
|
186
|
+
var SPEC_NAME = "tool/v1";
|
|
187
187
|
var SPEC_VERSION = "1.0.0-alpha";
|
|
188
188
|
|
|
189
189
|
export { SPEC_NAME, SPEC_VERSION, catchErrors, createTool, decodeCursor, encodeCursor, pageParamsShape, paginate, paginated, toolSpec, toolText, toolVerbs };
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/create-tool.ts","../src/spec.ts","../src/envelope.ts","../src/transformers.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * `createTool(params, opts)` — write a TOOL.md to disk.\n *\n * Symmetric to `parseToolManifest` (.md → handle) and `defineTool`\n * (params → handle): this takes params, validates via defineTool\n * (single source of truth — same zod schema, same cross-AIP\n * invariants), then serialises the validated frontmatter to YAML\n * and writes it under `<dir>/<id>/TOOL.md`.\n *\n * The author's body markdown is preserved verbatim in `opts.body`.\n * Pass `dryRun: true` to get the rendered string without touching\n * disk — useful for tests, the MCP server's preview, and CI lints.\n *\n * Non-frontmatter values that can't appear in YAML (zod schemas,\n * function bodies) are filtered out by `filterSerializable` from\n * `@agentproto/define-doctype`; the resulting frontmatter matches\n * what `parseToolManifest` would consume on the way back in.\n */\n\nimport { filterSerializable } from \"@agentproto/define-doctype\"\nimport matter from \"gray-matter\"\nimport { mkdir, writeFile } from \"node:fs/promises\"\nimport { dirname, join } from \"node:path\"\nimport { defineTool } from \"./define-tool.js\"\nimport type { ToolContext, ToolDefinition, ToolHandle } from \"./types.js\"\n\nfunction toSnakeCaseKeys(obj: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(obj).map(([k, v]) => [k.replace(/([A-Z])/g, \"_$1\").toLowerCase(), v]),\n )\n}\n\nexport interface CreateToolOptions {\n /** Workspace-relative or absolute directory under which to write `<id>/TOOL.md`. */\n dir: string\n /** Body markdown after the frontmatter. Defaults to a one-line stub. */\n body?: string\n /** Render only — don't write. Returns the rendered string. */\n dryRun?: boolean\n}\n\nexport interface CreateToolResult<\n TInput,\n TOutput,\n TContext extends ToolContext,\n> {\n /** The path where the file was (or would be) written. */\n path: string\n /** The validated handle returned by defineTool. */\n handle: ToolHandle<TInput, TOutput, TContext>\n /** The full rendered file contents (frontmatter + body). */\n rendered: string\n}\n\nexport async function createTool<\n TInput,\n TOutput,\n TContext extends ToolContext = ToolContext,\n>(\n params: ToolDefinition<TInput, TOutput, TContext>,\n opts: CreateToolOptions,\n): Promise<CreateToolResult<TInput, TOutput, TContext>> {\n const handle = defineTool<TInput, TOutput, TContext>(params)\n const path = join(opts.dir, handle.id, \"TOOL.md\")\n const frontmatter = filterSerializable({\n schema: \"agentproto/tool/v1\",\n ...toSnakeCaseKeys(params as unknown as Record<string, unknown>),\n }) as Record<string, unknown>\n const rendered = matter.stringify(\n opts.body ?? `# ${handle.name}\\n\\n${handle.description}\\n`,\n frontmatter,\n )\n if (!opts.dryRun) {\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, rendered, \"utf8\")\n }\n return { path, handle, rendered }\n}\n","/**\n * AIP-14 doctype spec — fed to `@agentproto/manifest.createVerbs`\n * to derive create / load / list / update / resolve / delete in one\n * place. Keeping the spec separate from `define-tool.ts` lets the\n * manifest layer (and the future MCP server) iterate over a uniform\n * descriptor without each package re-implementing the wiring.\n */\n\nimport { createVerbs, type DoctypeSpec } from \"@agentproto/manifest\"\nimport { defineTool } from \"./define-tool.js\"\nimport { parseToolManifest } from \"./manifest/index.js\"\nimport type { ToolDefinition, ToolHandle } from \"./types.js\"\n\nexport const toolSpec: DoctypeSpec<\n ToolDefinition<unknown, unknown>,\n ToolHandle<unknown, unknown>\n> = {\n name: \"tool\",\n aip: 14,\n schemaLiteral: \"agentproto/tool/v1\",\n pathOf: (h) => `${h.id}/TOOL.md`,\n define: (params) =>\n defineTool(params) as ToolHandle<unknown, unknown>,\n parse: (source) => {\n const m = parseToolManifest(source)\n const fm = m.frontmatter\n // `createVerbs.load` feeds this frontmatter straight to `define`\n // (= `defineTool`), which reads camelCase keys. The manifest uses\n // snake_case for multi-word fields, so they must be renamed here or\n // `defineTool` silently falls back to its defaults. Single-word fields\n // (mutates, approval, idempotent, tags, metadata, requires) share the\n // same key in both conventions and pass through unchanged.\n const frontmatter: Record<string, unknown> = {\n id: fm.id,\n name: fm.name,\n description: fm.description,\n version: fm.version,\n ...(fm.mutates !== undefined && { mutates: fm.mutates }),\n ...(fm.requires !== undefined && { requires: fm.requires }),\n ...(fm.approval !== undefined && { approval: fm.approval }),\n ...(fm.risk_level !== undefined && { riskLevel: fm.risk_level }),\n ...(fm.cost_class !== undefined && { costClass: fm.cost_class }),\n ...(fm.timeout_ms !== undefined && { timeoutMs: fm.timeout_ms }),\n ...(fm.idempotent !== undefined && { idempotent: fm.idempotent }),\n ...(fm.tags !== undefined && { tags: fm.tags }),\n ...(fm.metadata !== undefined && { metadata: fm.metadata }),\n // AIP-16 IO blocks pass through under the same keys.\n ...(fm.inputs !== undefined && { inputs: fm.inputs }),\n ...(fm.outputs !== undefined && { outputs: fm.outputs }),\n }\n return { frontmatter, body: m.body }\n },\n}\n\nexport const toolVerbs = createVerbs(toolSpec)\n","import { z } from \"zod\"\n\n/**\n * Shared pagination primitives (moved here from `@agentproto/runtime`'s\n * `tool-envelope.ts` so the `paginated()` ToolTransformer can reuse the\n * exact cursor/limit semantics the daemon's list tools already depend on).\n * `@agentproto/runtime` re-exports this module verbatim, so existing\n * imports are unchanged.\n */\n\n/** Shared pagination params, spread into every list tool's input schema. */\nexport interface PageParams {\n limit?: number\n cursor?: string\n since?: number\n compact?: boolean\n full?: boolean\n fields?: string[]\n}\n\nexport interface Page<T> {\n items: T[]\n nextCursor?: string\n total?: number\n truncated?: boolean\n}\n\n/** Opaque cursor: base64(JSON `{ k: keysetValue, i: index }`). */\nexport interface CursorPayload {\n k: string | number | null\n i: number\n}\n\nexport function encodeCursor(payload: CursorPayload): string {\n return Buffer.from(JSON.stringify(payload), \"utf8\").toString(\"base64url\")\n}\n\nconst cursorPayloadSchema = z.object({\n k: z.union([z.string(), z.number(), z.null()]),\n i: z.number().int().min(0),\n})\n\n/** No `unknown`/`as`: the JSON boundary is typed by zod's safeParse/parse. */\nexport function decodeCursor(token: string): CursorPayload | null {\n let text: string\n try {\n text = Buffer.from(token, \"base64url\").toString(\"utf8\")\n } catch {\n return null\n }\n try {\n return cursorPayloadSchema.parse(JSON.parse(text))\n } catch {\n return null\n }\n}\n\nexport interface PaginateOpts<T> {\n maxLimit: number\n keyOf?: (item: T) => string | number | null\n}\n\nexport function paginate<T>(items: readonly T[], params: PageParams, opts: PaginateOpts<T>): Page<T> {\n const limit = Math.min(Math.max(params.limit ?? 50, 1), opts.maxLimit)\n let start = 0\n if (params.cursor) {\n const decoded = decodeCursor(params.cursor)\n if (decoded && decoded.i >= 0 && decoded.i <= items.length) start = decoded.i\n }\n const end = start + limit\n const slice = items.slice(start, end)\n const keyAt = (idx: number): string | number | null => {\n const item = items[idx]\n return opts.keyOf && item !== undefined ? opts.keyOf(item) : null\n }\n return {\n items: slice,\n ...(end < items.length ? { nextCursor: encodeCursor({ k: keyAt(end), i: end }) } : {}),\n total: items.length,\n }\n}\n\n/**\n * Compact serializer — replaces every `JSON.stringify(x, null, 2)` in list handlers.\n *\n * When `params.fields` is supplied, an explicit allowlist is applied to every\n * item (mechanically, across all call sites): items keep only the named keys.\n * Absent `fields`, the output is byte-identical to `JSON.stringify(page)`.\n */\nexport function toolText<T extends object>(page: Page<T>, params?: Pick<PageParams, \"fields\">): string {\n const fields = params?.fields\n const items =\n fields === undefined\n ? page.items\n : page.items.map(item =>\n Object.fromEntries(\n Object.entries(item).filter(([key]) => fields.includes(key)),\n ),\n )\n return JSON.stringify({ ...page, items })\n}\n\n/** Zod fragment to spread into each list tool's input schema. */\nexport const pageParamsShape = {\n limit: z.number().int().min(1).max(200).optional().describe(\"Max items per page. Default 50.\"),\n cursor: z.string().optional().describe(\"Opaque token from a prior call's `nextCursor`.\"),\n compact: z\n .boolean()\n .optional()\n .describe(\n \"Compact projection (fewer fields per item). Default true on tools \" +\n \"that define a compact projection (session_list); a no-op elsewhere.\",\n ),\n full: z\n .boolean()\n .optional()\n .describe(\n \"Escape hatch — full, unprojected records (opts out of compact). \" +\n \"Default false.\",\n ),\n fields: z.array(z.string()).optional().describe(\"Keep only these fields per item.\"),\n} as const\n","import type { ZodRawShape } from \"zod\"\nimport {\n paginate,\n pageParamsShape,\n type PageParams,\n} from \"./envelope.js\"\nimport type { ToolTransformer } from \"./types.js\"\n\n/**\n * Concrete {@link ToolTransformer}s — cross-cutting concerns composed by\n * MCP-facing adapters (`toMcpTool`) around a tool's handler pipeline.\n */\n\n/** The MCP text-result shape transformers terminate the pipeline into. */\nexport interface McpTextResult {\n content: Array<{ type: \"text\"; text: string }>\n isError?: boolean\n}\n\nfunction textResult(text: string): McpTextResult {\n return { content: [{ type: \"text\", text }] }\n}\n\nexport interface PaginatedOptions<TItem> {\n /**\n * REQUIRED per-item compact projection. Requiring it is the point: there\n * is no code path that accepts the `compact` param without an actual\n * compact projection behind it, killing the \"declared but dead param\"\n * bug class. Pass the identity function only if you truly want\n * `compact` to be a no-op.\n */\n project: (item: TItem) => object\n /** Key function for the opaque pagination cursor. */\n keyOf?: (item: TItem) => string | number | null\n /** Hard ceiling on `limit` (default 200 — matches the daemon tools). */\n maxLimit?: number\n /**\n * Wrapper key for the NON-paginated output. With no `limit`/`cursor`,\n * legacy list tools returned `{ sessions: [...] }` rather than the page\n * envelope; set this to reproduce that wrapper (default `\"items\"`).\n */\n itemKey?: string\n /**\n * Row cap for the NON-paginated (no `limit`/`cursor`) call. Unset = the\n * legacy unbounded `{ [itemKey]: [...] }`. When set and the list is longer,\n * the wrapper carries the first `defaultLimit` rows plus\n * `{ total, truncated: true, nextCursor }` so the caller can page on —\n * keeps a tool whose rows pile up (terminals) under the MCP output cap.\n */\n defaultLimit?: number\n /**\n * Add `total` (the size of the list the handler returned, i.e. after any\n * filtering) to the NON-paginated wrapper too. Default off: the legacy\n * `{ [itemKey]: [...] }` shape stays byte-identical for existing tools.\n */\n includeTotal?: boolean\n}\n\n/**\n * Pagination transformer — adds {@link pageParamsShape} to the input shape\n * and wraps the handler (which must return the FULL, unprojected item\n * array) with the shared cursor/limit semantics:\n *\n * - `limit`/`cursor` present → the `{ items, nextCursor?, total }` page\n * envelope via `paginate` (cursor/limit semantics are the\n * exact ones the daemon's list tools already depend on).\n * - neither present → the legacy `{ [itemKey]: [...] }` wrapper, no\n * envelope fields (unless `includeTotal` adds `total`).\n *\n * Rows are COMPACT by default (`project`); `full: true` / `compact: false`\n * returns the unprojected records. `fields` is a per-item allowlist\n * applied on every branch (paginated, truncated and plain wrapper).\n * An explicit `fields` list is itself a projection, bounded by what the\n * caller names, so on that branch it is applied to the FULL record and the\n * compact projection is skipped (unless `compact: true` is explicit) —\n * otherwise a requested field outside the compact set is silently dropped.\n */\nexport function paginated<TItem extends object>(\n opts: PaginatedOptions<TItem>,\n): ToolTransformer<unknown, readonly TItem[], McpTextResult> {\n const { project, keyOf, maxLimit = 200, itemKey = \"items\", defaultLimit, includeTotal } = opts\n return {\n name: \"paginated\",\n wrapShape: (shape: ZodRawShape): ZodRawShape => ({ ...shape, ...pageParamsShape }),\n wrapHandler: handler => async input => {\n const params = (input ?? {}) as PageParams\n const items = (await handler(input)) as readonly TItem[]\n const full = params.full === true\n const compact = full ? false : params.compact !== false\n const projectRows = compact && (params.fields === undefined || params.compact === true)\n const render = (rows: readonly TItem[]): object[] => {\n const projected = projectRows ? rows.map(project) : [...rows]\n const fields = params.fields\n return fields === undefined\n ? projected\n : projected.map(row => Object.fromEntries(Object.entries(row).filter(([key]) => fields.includes(key))))\n }\n if (params.limit !== undefined || params.cursor !== undefined) {\n const page = paginate(items, params, { maxLimit, keyOf })\n return textResult(JSON.stringify({ ...page, items: render(page.items) }))\n }\n if (defaultLimit !== undefined && items.length > defaultLimit) {\n const page = paginate(items, { limit: defaultLimit }, { maxLimit: Math.max(maxLimit, defaultLimit), keyOf })\n return textResult(\n JSON.stringify({\n [itemKey]: render(page.items),\n total: page.total,\n truncated: true,\n nextCursor: page.nextCursor,\n }),\n )\n }\n return textResult(\n JSON.stringify({ [itemKey]: render(items), ...(includeTotal ? { total: items.length } : {}) }),\n )\n },\n }\n}\n\n/**\n * Error-normalization transformer — wraps the handler so ANY thrown error\n * becomes the single canonical MCP error result\n * `{ content: [{ type: \"text\", text: <message> }], isError: true }`,\n * replacing the ~150 copy-pasted inline catch blocks.\n */\nexport function catchErrors(): ToolTransformer<unknown, unknown, McpTextResult> {\n return {\n name: \"catchErrors\",\n wrapHandler: handler => async input => {\n try {\n return (await handler(input)) as McpTextResult\n } catch (err) {\n const text = err instanceof Error ? err.message : String(err)\n return { content: [{ type: \"text\", text }], isError: true }\n }\n },\n }\n}\n","/**\n * @agentproto/tool — AIP-14 TOOL.md `defineTool` reference impl.\n *\n * Vendor-neutral tool **contract** registration: an author writes\n * `defineTool({...})` and the runtime returns a `ToolHandle` carrying\n * identity, schemas, side-effect profile, approval class, and\n * provider routing hints. Bodies live on AIP-30 PROVIDER manifests;\n * invocation goes through `@agentproto/driver`.\n *\n * Spec: https://agentproto.sh/docs/aip-14\n */\n\nexport const SPEC_NAME = \"agenttool/v1\" as const\nexport const SPEC_VERSION = \"1.0.0-alpha\" as const\n\nexport {\n defineTool,\n validateInput,\n validateContext,\n validateOutput,\n} from \"./define-tool.js\"\n// Standalone create-tool kept for back-compat; new code should import\n// the unified verb surface (`toolVerbs.create`, `.load`, `.list`,\n// `.update`, `.resolve`, `.delete`) from `./spec.js`.\nexport {\n createTool,\n type CreateToolOptions,\n type CreateToolResult,\n} from \"./create-tool.js\"\nexport { toolSpec, toolVerbs } from \"./spec.js\"\nexport {\n parseToolManifest,\n toolFromManifest,\n toolFromManifestOnly,\n type ToolManifest,\n type ToolManifestFrontmatter,\n} from \"./manifest/index.js\"\nexport {\n checkMinimalJsonSchema,\n validateManifestIOBlocks,\n type MinimalJsonSchemaIssue,\n} from \"./json-schema.js\"\nexport {\n ToolError,\n toToolError,\n toToolResult,\n type ToolErrorCode,\n type ToolErrorPayload,\n} from \"./errors.js\"\nexport {\n paginated,\n catchErrors,\n type McpTextResult,\n type PaginatedOptions,\n} from \"./transformers.js\"\nexport {\n paginate,\n toolText,\n encodeCursor,\n decodeCursor,\n pageParamsShape,\n type Page,\n type PageParams,\n type PaginateOpts,\n type CursorPayload,\n} from \"./envelope.js\"\nexport type {\n ToolDefinition,\n ToolHandle,\n ToolTransformer,\n ToolContext,\n ToolCapabilities,\n ApprovalClass,\n DriverConstraints,\n DriverKind,\n RetryPolicy,\n ToolResult,\n ValidationResult,\n ValidationFailure,\n ValidationSuccess,\n} from \"./types.js\"\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/create-tool.ts","../src/spec.ts","../src/envelope.ts","../src/transformers.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * `createTool(params, opts)` — write a TOOL.md to disk.\n *\n * Symmetric to `parseToolManifest` (.md → handle) and `defineTool`\n * (params → handle): this takes params, validates via defineTool\n * (single source of truth — same zod schema, same cross-AIP\n * invariants), then serialises the validated frontmatter to YAML\n * and writes it under `<dir>/<id>/TOOL.md`.\n *\n * The author's body markdown is preserved verbatim in `opts.body`.\n * Pass `dryRun: true` to get the rendered string without touching\n * disk — useful for tests, the MCP server's preview, and CI lints.\n *\n * Non-frontmatter values that can't appear in YAML (zod schemas,\n * function bodies) are filtered out by `filterSerializable` from\n * `@agentproto/doctype`; the resulting frontmatter matches\n * what `parseToolManifest` would consume on the way back in.\n */\n\nimport { filterSerializable } from \"@agentproto/doctype\"\nimport matter from \"gray-matter\"\nimport { mkdir, writeFile } from \"node:fs/promises\"\nimport { dirname, join } from \"node:path\"\nimport { defineTool } from \"./define-tool.js\"\nimport type { ToolContext, ToolDefinition, ToolHandle } from \"./types.js\"\n\nfunction toSnakeCaseKeys(obj: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(obj).map(([k, v]) => [k.replace(/([A-Z])/g, \"_$1\").toLowerCase(), v]),\n )\n}\n\nexport interface CreateToolOptions {\n /** Workspace-relative or absolute directory under which to write `<id>/TOOL.md`. */\n dir: string\n /** Body markdown after the frontmatter. Defaults to a one-line stub. */\n body?: string\n /** Render only — don't write. Returns the rendered string. */\n dryRun?: boolean\n}\n\nexport interface CreateToolResult<\n TInput,\n TOutput,\n TContext extends ToolContext,\n> {\n /** The path where the file was (or would be) written. */\n path: string\n /** The validated handle returned by defineTool. */\n handle: ToolHandle<TInput, TOutput, TContext>\n /** The full rendered file contents (frontmatter + body). */\n rendered: string\n}\n\nexport async function createTool<\n TInput,\n TOutput,\n TContext extends ToolContext = ToolContext,\n>(\n params: ToolDefinition<TInput, TOutput, TContext>,\n opts: CreateToolOptions,\n): Promise<CreateToolResult<TInput, TOutput, TContext>> {\n const handle = defineTool<TInput, TOutput, TContext>(params)\n const path = join(opts.dir, handle.id, \"TOOL.md\")\n const frontmatter = filterSerializable({\n schema: \"agentproto/tool/v1\",\n ...toSnakeCaseKeys(params as unknown as Record<string, unknown>),\n }) as Record<string, unknown>\n const rendered = matter.stringify(\n opts.body ?? `# ${handle.name}\\n\\n${handle.description}\\n`,\n frontmatter,\n )\n if (!opts.dryRun) {\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, rendered, \"utf8\")\n }\n return { path, handle, rendered }\n}\n","/**\n * AIP-14 doctype spec — fed to `@agentproto/manifest.createVerbs`\n * to derive create / load / list / update / resolve / delete in one\n * place. Keeping the spec separate from `define-tool.ts` lets the\n * manifest layer (and the future MCP server) iterate over a uniform\n * descriptor without each package re-implementing the wiring.\n */\n\nimport { createVerbs, type DoctypeSpec } from \"@agentproto/manifest\"\nimport { defineTool } from \"./define-tool.js\"\nimport { parseToolManifest } from \"./manifest/index.js\"\nimport type { ToolDefinition, ToolHandle } from \"./types.js\"\n\nexport const toolSpec: DoctypeSpec<\n ToolDefinition<unknown, unknown>,\n ToolHandle<unknown, unknown>\n> = {\n name: \"tool\",\n aip: 14,\n schemaLiteral: \"agentproto/tool/v1\",\n pathOf: (h) => `${h.id}/TOOL.md`,\n define: (params) =>\n defineTool(params) as ToolHandle<unknown, unknown>,\n parse: (source) => {\n const m = parseToolManifest(source)\n const fm = m.frontmatter\n // `createVerbs.load` feeds this frontmatter straight to `define`\n // (= `defineTool`), which reads camelCase keys. The manifest uses\n // snake_case for multi-word fields, so they must be renamed here or\n // `defineTool` silently falls back to its defaults. Single-word fields\n // (mutates, approval, idempotent, tags, metadata, requires) share the\n // same key in both conventions and pass through unchanged.\n const frontmatter: Record<string, unknown> = {\n id: fm.id,\n name: fm.name,\n description: fm.description,\n version: fm.version,\n ...(fm.mutates !== undefined && { mutates: fm.mutates }),\n ...(fm.requires !== undefined && { requires: fm.requires }),\n ...(fm.approval !== undefined && { approval: fm.approval }),\n ...(fm.risk_level !== undefined && { riskLevel: fm.risk_level }),\n ...(fm.cost_class !== undefined && { costClass: fm.cost_class }),\n ...(fm.timeout_ms !== undefined && { timeoutMs: fm.timeout_ms }),\n ...(fm.idempotent !== undefined && { idempotent: fm.idempotent }),\n ...(fm.tags !== undefined && { tags: fm.tags }),\n ...(fm.metadata !== undefined && { metadata: fm.metadata }),\n // AIP-16 IO blocks pass through under the same keys.\n ...(fm.inputs !== undefined && { inputs: fm.inputs }),\n ...(fm.outputs !== undefined && { outputs: fm.outputs }),\n }\n return { frontmatter, body: m.body }\n },\n}\n\nexport const toolVerbs = createVerbs(toolSpec)\n","import { z } from \"zod\"\n\n/**\n * Shared pagination primitives (moved here from `@agentproto/runtime`'s\n * `tool-envelope.ts` so the `paginated()` ToolTransformer can reuse the\n * exact cursor/limit semantics the daemon's list tools already depend on).\n * `@agentproto/runtime` re-exports this module verbatim, so existing\n * imports are unchanged.\n */\n\n/** Shared pagination params, spread into every list tool's input schema. */\nexport interface PageParams {\n limit?: number\n cursor?: string\n since?: number\n compact?: boolean\n full?: boolean\n fields?: string[]\n}\n\nexport interface Page<T> {\n items: T[]\n nextCursor?: string\n total?: number\n truncated?: boolean\n}\n\n/** Opaque cursor: base64(JSON `{ k: keysetValue, i: index }`). */\nexport interface CursorPayload {\n k: string | number | null\n i: number\n}\n\nexport function encodeCursor(payload: CursorPayload): string {\n return Buffer.from(JSON.stringify(payload), \"utf8\").toString(\"base64url\")\n}\n\nconst cursorPayloadSchema = z.object({\n k: z.union([z.string(), z.number(), z.null()]),\n i: z.number().int().min(0),\n})\n\n/** No `unknown`/`as`: the JSON boundary is typed by zod's safeParse/parse. */\nexport function decodeCursor(token: string): CursorPayload | null {\n let text: string\n try {\n text = Buffer.from(token, \"base64url\").toString(\"utf8\")\n } catch {\n return null\n }\n try {\n return cursorPayloadSchema.parse(JSON.parse(text))\n } catch {\n return null\n }\n}\n\nexport interface PaginateOpts<T> {\n maxLimit: number\n keyOf?: (item: T) => string | number | null\n}\n\nexport function paginate<T>(items: readonly T[], params: PageParams, opts: PaginateOpts<T>): Page<T> {\n const limit = Math.min(Math.max(params.limit ?? 50, 1), opts.maxLimit)\n let start = 0\n if (params.cursor) {\n const decoded = decodeCursor(params.cursor)\n if (decoded && decoded.i >= 0 && decoded.i <= items.length) start = decoded.i\n }\n const end = start + limit\n const slice = items.slice(start, end)\n const keyAt = (idx: number): string | number | null => {\n const item = items[idx]\n return opts.keyOf && item !== undefined ? opts.keyOf(item) : null\n }\n return {\n items: slice,\n ...(end < items.length ? { nextCursor: encodeCursor({ k: keyAt(end), i: end }) } : {}),\n total: items.length,\n }\n}\n\n/**\n * Compact serializer — replaces every `JSON.stringify(x, null, 2)` in list handlers.\n *\n * When `params.fields` is supplied, an explicit allowlist is applied to every\n * item (mechanically, across all call sites): items keep only the named keys.\n * Absent `fields`, the output is byte-identical to `JSON.stringify(page)`.\n */\nexport function toolText<T extends object>(page: Page<T>, params?: Pick<PageParams, \"fields\">): string {\n const fields = params?.fields\n const items =\n fields === undefined\n ? page.items\n : page.items.map(item =>\n Object.fromEntries(\n Object.entries(item).filter(([key]) => fields.includes(key)),\n ),\n )\n return JSON.stringify({ ...page, items })\n}\n\n/** Zod fragment to spread into each list tool's input schema. */\nexport const pageParamsShape = {\n limit: z.number().int().min(1).max(200).optional().describe(\"Max items per page. Default 50.\"),\n cursor: z.string().optional().describe(\"Opaque token from a prior call's `nextCursor`.\"),\n compact: z\n .boolean()\n .optional()\n .describe(\n \"Compact projection (fewer fields per item). Default true on tools \" +\n \"that define a compact projection (session_list); a no-op elsewhere.\",\n ),\n full: z\n .boolean()\n .optional()\n .describe(\n \"Escape hatch — full, unprojected records (opts out of compact). \" +\n \"Default false.\",\n ),\n fields: z.array(z.string()).optional().describe(\"Keep only these fields per item.\"),\n} as const\n","import type { ZodRawShape } from \"zod\"\nimport {\n paginate,\n pageParamsShape,\n type PageParams,\n} from \"./envelope.js\"\nimport type { ToolTransformer } from \"./types.js\"\n\n/**\n * Concrete {@link ToolTransformer}s — cross-cutting concerns composed by\n * MCP-facing adapters (`toMcpTool`) around a tool's handler pipeline.\n */\n\n/** The MCP text-result shape transformers terminate the pipeline into. */\nexport interface McpTextResult {\n content: Array<{ type: \"text\"; text: string }>\n isError?: boolean\n}\n\nfunction textResult(text: string): McpTextResult {\n return { content: [{ type: \"text\", text }] }\n}\n\nexport interface PaginatedOptions<TItem> {\n /**\n * REQUIRED per-item compact projection. Requiring it is the point: there\n * is no code path that accepts the `compact` param without an actual\n * compact projection behind it, killing the \"declared but dead param\"\n * bug class. Pass the identity function only if you truly want\n * `compact` to be a no-op.\n */\n project: (item: TItem) => object\n /** Key function for the opaque pagination cursor. */\n keyOf?: (item: TItem) => string | number | null\n /** Hard ceiling on `limit` (default 200 — matches the daemon tools). */\n maxLimit?: number\n /**\n * Wrapper key for the NON-paginated output. With no `limit`/`cursor`,\n * legacy list tools returned `{ sessions: [...] }` rather than the page\n * envelope; set this to reproduce that wrapper (default `\"items\"`).\n */\n itemKey?: string\n /**\n * Row cap for the NON-paginated (no `limit`/`cursor`) call. Unset = the\n * legacy unbounded `{ [itemKey]: [...] }`. When set and the list is longer,\n * the wrapper carries the first `defaultLimit` rows plus\n * `{ total, truncated: true, nextCursor }` so the caller can page on —\n * keeps a tool whose rows pile up (terminals) under the MCP output cap.\n */\n defaultLimit?: number\n /**\n * Add `total` (the size of the list the handler returned, i.e. after any\n * filtering) to the NON-paginated wrapper too. Default off: the legacy\n * `{ [itemKey]: [...] }` shape stays byte-identical for existing tools.\n */\n includeTotal?: boolean\n}\n\n/**\n * Pagination transformer — adds {@link pageParamsShape} to the input shape\n * and wraps the handler (which must return the FULL, unprojected item\n * array) with the shared cursor/limit semantics:\n *\n * - `limit`/`cursor` present → the `{ items, nextCursor?, total }` page\n * envelope via `paginate` (cursor/limit semantics are the\n * exact ones the daemon's list tools already depend on).\n * - neither present → the legacy `{ [itemKey]: [...] }` wrapper, no\n * envelope fields (unless `includeTotal` adds `total`).\n *\n * Rows are COMPACT by default (`project`); `full: true` / `compact: false`\n * returns the unprojected records. `fields` is a per-item allowlist\n * applied on every branch (paginated, truncated and plain wrapper).\n * An explicit `fields` list is itself a projection, bounded by what the\n * caller names, so on that branch it is applied to the FULL record and the\n * compact projection is skipped (unless `compact: true` is explicit) —\n * otherwise a requested field outside the compact set is silently dropped.\n */\nexport function paginated<TItem extends object>(\n opts: PaginatedOptions<TItem>,\n): ToolTransformer<unknown, readonly TItem[], McpTextResult> {\n const { project, keyOf, maxLimit = 200, itemKey = \"items\", defaultLimit, includeTotal } = opts\n return {\n name: \"paginated\",\n wrapShape: (shape: ZodRawShape): ZodRawShape => ({ ...shape, ...pageParamsShape }),\n wrapHandler: handler => async input => {\n const params = (input ?? {}) as PageParams\n const items = (await handler(input)) as readonly TItem[]\n const full = params.full === true\n const compact = full ? false : params.compact !== false\n const projectRows = compact && (params.fields === undefined || params.compact === true)\n const render = (rows: readonly TItem[]): object[] => {\n const projected = projectRows ? rows.map(project) : [...rows]\n const fields = params.fields\n return fields === undefined\n ? projected\n : projected.map(row => Object.fromEntries(Object.entries(row).filter(([key]) => fields.includes(key))))\n }\n if (params.limit !== undefined || params.cursor !== undefined) {\n const page = paginate(items, params, { maxLimit, keyOf })\n return textResult(JSON.stringify({ ...page, items: render(page.items) }))\n }\n if (defaultLimit !== undefined && items.length > defaultLimit) {\n const page = paginate(items, { limit: defaultLimit }, { maxLimit: Math.max(maxLimit, defaultLimit), keyOf })\n return textResult(\n JSON.stringify({\n [itemKey]: render(page.items),\n total: page.total,\n truncated: true,\n nextCursor: page.nextCursor,\n }),\n )\n }\n return textResult(\n JSON.stringify({ [itemKey]: render(items), ...(includeTotal ? { total: items.length } : {}) }),\n )\n },\n }\n}\n\n/**\n * Error-normalization transformer — wraps the handler so ANY thrown error\n * becomes the single canonical MCP error result\n * `{ content: [{ type: \"text\", text: <message> }], isError: true }`,\n * replacing the ~150 copy-pasted inline catch blocks.\n */\nexport function catchErrors(): ToolTransformer<unknown, unknown, McpTextResult> {\n return {\n name: \"catchErrors\",\n wrapHandler: handler => async input => {\n try {\n return (await handler(input)) as McpTextResult\n } catch (err) {\n const text = err instanceof Error ? err.message : String(err)\n return { content: [{ type: \"text\", text }], isError: true }\n }\n },\n }\n}\n","/**\n * @agentproto/tool — AIP-14 TOOL.md `defineTool` reference impl.\n *\n * Vendor-neutral tool **contract** registration: an author writes\n * `defineTool({...})` and the runtime returns a `ToolHandle` carrying\n * identity, schemas, side-effect profile, approval class, and\n * provider routing hints. Bodies live on AIP-30 PROVIDER manifests;\n * invocation goes through `@agentproto/driver`.\n *\n * Spec: https://agentproto.sh/docs/aip-14\n */\n\nexport const SPEC_NAME = \"tool/v1\" as const\nexport const SPEC_VERSION = \"1.0.0-alpha\" as const\n\nexport {\n defineTool,\n validateInput,\n validateContext,\n validateOutput,\n} from \"./define-tool.js\"\n// Standalone create-tool kept for back-compat; new code should import\n// the unified verb surface (`toolVerbs.create`, `.load`, `.list`,\n// `.update`, `.resolve`, `.delete`) from `./spec.js`.\nexport {\n createTool,\n type CreateToolOptions,\n type CreateToolResult,\n} from \"./create-tool.js\"\nexport { toolSpec, toolVerbs } from \"./spec.js\"\nexport {\n parseToolManifest,\n toolFromManifest,\n toolFromManifestOnly,\n type ToolManifest,\n type ToolManifestFrontmatter,\n} from \"./manifest/index.js\"\nexport {\n checkMinimalJsonSchema,\n validateManifestIOBlocks,\n type MinimalJsonSchemaIssue,\n} from \"./json-schema.js\"\nexport {\n ToolError,\n toToolError,\n toToolResult,\n type ToolErrorCode,\n type ToolErrorPayload,\n} from \"./errors.js\"\nexport {\n paginated,\n catchErrors,\n type McpTextResult,\n type PaginatedOptions,\n} from \"./transformers.js\"\nexport {\n paginate,\n toolText,\n encodeCursor,\n decodeCursor,\n pageParamsShape,\n type Page,\n type PageParams,\n type PaginateOpts,\n type CursorPayload,\n} from \"./envelope.js\"\nexport type {\n ToolDefinition,\n ToolHandle,\n ToolTransformer,\n ToolContext,\n ToolCapabilities,\n ApprovalClass,\n DriverConstraints,\n DriverKind,\n RetryPolicy,\n ToolResult,\n ValidationResult,\n ValidationFailure,\n ValidationSuccess,\n} from \"./types.js\"\n"]}
|
package/dist/manifest/index.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { checkMinimalJsonSchema, parseToolManifest, toolFromManifest, toolFromManifestOnly, toolManifestFrontmatterSchema } from '../chunk-
|
|
1
|
+
export { checkMinimalJsonSchema, parseToolManifest, toolFromManifest, toolFromManifestOnly, toolManifestFrontmatterSchema } from '../chunk-TABQGCU4.mjs';
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
|
3
3
|
//# sourceMappingURL=index.mjs.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentproto/tool",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "agentproto/tool-runtime — reference implementation of AIP-14 TOOL.md `defineTool` contract. Vendor-neutral tool registration with validated input/output schemas, structured error envelopes, and side-effect declarations. Per-framework adapters (Mastra, LangChain, A2A) consume the produced ToolHandle.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agentproto",
|
|
@@ -49,8 +49,8 @@
|
|
|
49
49
|
"ajv": "^8.20.0",
|
|
50
50
|
"gray-matter": "^4.0.3",
|
|
51
51
|
"zod": "^4.6.7",
|
|
52
|
-
"@agentproto/
|
|
53
|
-
"@agentproto/manifest": "0.2.
|
|
52
|
+
"@agentproto/doctype": "0.2.0",
|
|
53
|
+
"@agentproto/manifest": "0.2.5"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@types/node": "^25.9.9",
|