diff --git a/package-lock.json b/package-lock.json index c4635e5b..413bf705 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "pino-pretty": "^13.1.3", "uuid": "^13.0.0", "yaml": "^2.9.0", - "zod": "^3.25.76" + "zod": "^4.4.3" }, "bin": { "rikune": "bin/rikune.js", @@ -8228,9 +8228,9 @@ } }, "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -8253,7 +8253,7 @@ "@rikune/shared": "1.1.0" }, "peerDependencies": { - "zod": "^3.0.0" + "zod": "^3.0.0 || ^4.0.0" } }, "packages/runtime-node": { @@ -8263,7 +8263,7 @@ "@rikune/shared": "1.1.0", "pino": "^10.3.1", "uuid": "^13.0.0", - "zod": "^3.25.76" + "zod": "^4.4.3" }, "devDependencies": { "@types/node": "^25.3.5", @@ -8279,7 +8279,7 @@ "version": "1.1.0", "license": "MIT", "dependencies": { - "zod": "^3.25.76" + "zod": "^4.4.3" } }, "packages/tsconfig": { @@ -8292,7 +8292,7 @@ "dependencies": { "@rikune/shared": "1.1.0", "pino": "^10.3.1", - "zod": "^3.25.76" + "zod": "^4.4.3" }, "devDependencies": { "@types/node": "^25.3.5", diff --git a/package.json b/package.json index c2c90907..965f19ed 100644 --- a/package.json +++ b/package.json @@ -124,7 +124,7 @@ "pino-pretty": "^13.1.3", "uuid": "^13.0.0", "yaml": "^2.9.0", - "zod": "^3.25.76" + "zod": "^4.4.3" }, "devDependencies": { "@eslint/js": "^10.0.1", diff --git a/packages/plugin-sdk/package.json b/packages/plugin-sdk/package.json index df9b14c8..2cebdbb7 100644 --- a/packages/plugin-sdk/package.json +++ b/packages/plugin-sdk/package.json @@ -29,7 +29,7 @@ ], "license": "MIT", "peerDependencies": { - "zod": "^3.0.0" + "zod": "^3.0.0 || ^4.0.0" }, "dependencies": { "@rikune/shared": "1.1.0" diff --git a/packages/plugin-sdk/src/index.ts b/packages/plugin-sdk/src/index.ts index d94c24f4..a2d82d37 100644 --- a/packages/plugin-sdk/src/index.ts +++ b/packages/plugin-sdk/src/index.ts @@ -2277,8 +2277,8 @@ export const PluginSystemDepSchema = z dockerFeature: z.string().optional(), aptPackages: z.array(z.string()).optional(), dockerValidation: z.array(z.string()).optional(), - extraEnv: z.record(z.string()).optional(), - buildArgs: z.record(z.string()).optional(), + extraEnv: z.record(z.string(), z.string()).optional(), + buildArgs: z.record(z.string(), z.string()).optional(), directories: z.array(z.object({ path: z.string(), chown: z.string().optional() })).optional(), volumes: z .array( @@ -2309,7 +2309,7 @@ export const SurfaceRulesSchema = z }) .optional(), category: z.string().optional(), - signalMap: z.record(z.union([z.string(), z.array(z.string())])).optional(), + signalMap: z.record(z.string(), z.union([z.string(), z.array(z.string())])).optional(), }) .passthrough() @@ -2376,7 +2376,7 @@ export const BackendWorkerContractSchema = z defaultMode: z.string().optional().default('builtin'), inputArtifactTypes: z.array(z.string()).optional().default([]), outputArtifactTypes: z.array(z.string()).optional().default([]), - policy: BackendWorkerPolicySchema.optional().default({}), + policy: BackendWorkerPolicySchema.optional().prefault({}), readiness: z .object({ doesNotStartBackend: z.boolean().optional().default(true), @@ -2385,7 +2385,7 @@ export const BackendWorkerContractSchema = z }) .passthrough() .optional() - .default({}), + .prefault({}), packaging: z .object({ installRoute: z @@ -2592,7 +2592,7 @@ export const ArtifactRefSchema = z path: z.string(), sha256: z.string(), mime: z.string().optional(), - metadata: z.record(z.any()).optional(), + metadata: z.record(z.string(), z.any()).optional(), }) .passthrough() @@ -2612,7 +2612,7 @@ export const EvidenceRefSchema = z sampleId: z.string().optional(), artifactRefs: z.array(ArtifactRefSchema).optional(), confidence: z.number().min(0).max(1).optional(), - metadata: z.record(z.any()).optional(), + metadata: z.record(z.string(), z.any()).optional(), }) .passthrough() @@ -2628,7 +2628,7 @@ export const EvidenceTimelineEntrySchema = z target: z.string().optional(), confidence: z.number().min(0).max(1).optional(), artifactRefs: z.array(ArtifactRefSchema).optional(), - metadata: z.record(z.any()).optional(), + metadata: z.record(z.string(), z.any()).optional(), }) .passthrough() diff --git a/packages/runtime-node/package.json b/packages/runtime-node/package.json index 739cfe51..6d24bb8c 100644 --- a/packages/runtime-node/package.json +++ b/packages/runtime-node/package.json @@ -21,7 +21,7 @@ "@rikune/shared": "1.1.0", "pino": "^10.3.1", "uuid": "^13.0.0", - "zod": "^3.25.76" + "zod": "^4.4.3" }, "devDependencies": { "@types/node": "^25.3.5", diff --git a/packages/runtime-node/src/config.ts b/packages/runtime-node/src/config.ts index bddb5519..d19483e6 100644 --- a/packages/runtime-node/src/config.ts +++ b/packages/runtime-node/src/config.ts @@ -10,7 +10,7 @@ export const ConfigSchema = z.object({ port: z.number().int().min(1).max(65535).default(18081), host: z.string().default('127.0.0.1'), }) - .default({}), + .prefault({}), runtime: z .object({ mode: z.enum(['sandbox', 'manual', 'disabled']).default('sandbox'), @@ -23,12 +23,12 @@ export const ConfigSchema = z.object({ maxRssBytes: z.number().default(2 * 1024 * 1024 * 1024), minDiskSpaceBytes: z.number().default(5 * 1024 * 1024 * 1024), }) - .default({}), + .prefault({}), logging: z .object({ level: z.enum(['trace', 'debug', 'info', 'warn', 'error', 'fatal']).default('info'), }) - .default({}), + .prefault({}), }) export type Config = z.infer diff --git a/packages/shared/package.json b/packages/shared/package.json index f975ff00..e94daba9 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -24,6 +24,6 @@ }, "license": "MIT", "dependencies": { - "zod": "^3.25.76" + "zod": "^4.4.3" } } diff --git a/packages/shared/src/runtime-contract.ts b/packages/shared/src/runtime-contract.ts index fbbd57c4..7db758e2 100644 --- a/packages/shared/src/runtime-contract.ts +++ b/packages/shared/src/runtime-contract.ts @@ -400,5 +400,5 @@ export const RuntimeDelegationFailureResultSchema = z.object({ artifacts: z.array(z.any()).optional(), setup_actions: z.array(z.any()).optional(), required_user_inputs: z.array(z.any()).optional(), - metrics: z.record(z.any()).optional(), + metrics: z.record(z.string(), z.any()).optional(), }) diff --git a/packages/shared/src/runtime-control-plane.ts b/packages/shared/src/runtime-control-plane.ts index eb7f4084..cc7330be 100644 --- a/packages/shared/src/runtime-control-plane.ts +++ b/packages/shared/src/runtime-control-plane.ts @@ -6,7 +6,7 @@ export const RuntimeTaskStatusSchema = z.enum([ 'completed', 'failed', 'cancelled', -]) +] as const) export type RuntimeTaskStatus = z.infer export const RuntimeTaskLifecycleEventTypeSchema = z.enum([ @@ -141,7 +141,7 @@ export const RuntimeDynamicArtifactFamilySchema = z.enum([ 'sandbox_trace', 'runtime_debug', 'runtime_analysis', -]) +] as const) export type RuntimeDynamicArtifactFamily = z.infer export const RUNTIME_DYNAMIC_TRACE_ARTIFACT_TYPES = [ PRIMARY_RUNTIME_DYNAMIC_TRACE_ARTIFACT_TYPE, diff --git a/packages/windows-host-agent/package.json b/packages/windows-host-agent/package.json index 6bd933f9..c92140b7 100644 --- a/packages/windows-host-agent/package.json +++ b/packages/windows-host-agent/package.json @@ -20,7 +20,7 @@ "dependencies": { "@rikune/shared": "1.1.0", "pino": "^10.3.1", - "zod": "^3.25.76" + "zod": "^4.4.3" }, "devDependencies": { "@types/node": "^25.3.5", diff --git a/src/analysis/analysis-evidence.ts b/src/analysis/analysis-evidence.ts index 1adceab5..db5c869c 100644 --- a/src/analysis/analysis-evidence.ts +++ b/src/analysis/analysis-evidence.ts @@ -51,8 +51,8 @@ export const AnalysisEvidenceRecordSchema = z.object({ freshness_marker: z.string().nullable(), created_at: z.string(), updated_at: z.string(), - provenance: z.record(z.any()).optional(), - metadata: z.record(z.any()).optional(), + provenance: z.record(z.string(), z.any()).optional(), + metadata: z.record(z.string(), z.any()).optional(), artifact_refs: z.array(z.any()), result: z.any(), }) diff --git a/src/analysis/analysis-run-state.ts b/src/analysis/analysis-run-state.ts index 7f310185..d1d61c24 100644 --- a/src/analysis/analysis-run-state.ts +++ b/src/analysis/analysis-run-state.ts @@ -112,7 +112,7 @@ export const AnalysisRunStageViewSchema = z.object({ finished_at: z.string().nullable().optional(), artifact_refs: z.array(z.any()), result: z.any().optional(), - metadata: z.record(z.any()).optional(), + metadata: z.record(z.string(), z.any()).optional(), }) export const RecoverableStageSchema = z.object({ diff --git a/src/artifacts/crypto-breakpoint-analysis.ts b/src/artifacts/crypto-breakpoint-analysis.ts index 5c878b05..d023ec16 100644 --- a/src/artifacts/crypto-breakpoint-analysis.ts +++ b/src/artifacts/crypto-breakpoint-analysis.ts @@ -67,7 +67,7 @@ export const ArtifactRefSchema = z.object({ path: z.string(), sha256: z.string(), mime: z.string().optional(), - metadata: z.record(z.any()).optional(), + metadata: z.record(z.string(), z.any()).optional(), }) export const CryptoEvidenceSchema = z.object({ diff --git a/src/artifacts/explanation-graphs.ts b/src/artifacts/explanation-graphs.ts index 0accff0c..3056b672 100644 --- a/src/artifacts/explanation-graphs.ts +++ b/src/artifacts/explanation-graphs.ts @@ -38,7 +38,7 @@ export const ExplanationArtifactRefSchema = z.object({ path: z.string(), sha256: z.string(), mime: z.string().optional(), - metadata: z.record(z.any()).optional(), + metadata: z.record(z.string(), z.any()).optional(), }) export const ExplanationGraphProvenanceSchema = z.object({ diff --git a/src/artifacts/summary-digests.ts b/src/artifacts/summary-digests.ts index b2c4e855..4d68cfc1 100644 --- a/src/artifacts/summary-digests.ts +++ b/src/artifacts/summary-digests.ts @@ -22,7 +22,7 @@ export const SummaryArtifactRefSchema = z.object({ path: z.string(), sha256: z.string(), mime: z.string().optional(), - metadata: z.record(z.any()).optional(), + metadata: z.record(z.string(), z.any()).optional(), }) export const DigestBudgetSchema = z.object({ @@ -33,7 +33,7 @@ export const DigestBudgetSchema = z.object({ omitted: z.number().int().nonnegative(), }) -export const DigestTruncationSchema = z.record(DigestBudgetSchema) +export const DigestTruncationSchema = z.record(z.string(), DigestBudgetSchema) const DetailLevelSchema = z.enum(['compact', 'full']) diff --git a/src/config/index.ts b/src/config/index.ts index 667f93b6..8acb7b59 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -62,7 +62,7 @@ export const ConfigSchema = z port: z.number().int().min(1).max(65535).default(3000), host: z.string().default('localhost'), }) - .default({}), + .prefault({}), database: z .object({ type: z.enum(['sqlite', 'postgresql']).default('sqlite'), @@ -73,7 +73,7 @@ export const ConfigSchema = z user: z.string().optional(), password: z.string().optional(), }) - .default({}), + .prefault({}), workspace: z .object({ root: z.string().default(getDefaultWorkspaceRoot()), @@ -83,7 +83,7 @@ export const ConfigSchema = z .min(1) .default(500 * 1024 * 1024), // 500MB }) - .default({}), + .prefault({}), workers: z .object({ ghidra: z @@ -98,7 +98,7 @@ export const ConfigSchema = z maxConcurrent: z.number().int().min(1).max(16).default(4), timeout: z.number().int().min(1).default(300), }) - .default({}), + .prefault({}), static: z .object({ enabled: z.boolean().default(true), @@ -115,14 +115,14 @@ export const ConfigSchema = z dieTimeout: z.number().int().min(1).default(30), timeout: z.number().int().min(1).default(60), }) - .default({}), + .prefault({}), dotnet: z .object({ enabled: z.boolean().default(true), ilspyPath: z.string().optional(), timeout: z.number().int().min(1).default(60), }) - .default({}), + .prefault({}), sandbox: z .object({ enabled: z.boolean().default(true), @@ -134,7 +134,7 @@ export const ConfigSchema = z pandaPythonPath: z.string().optional(), timeout: z.number().int().min(1).default(120), }) - .default({}), + .prefault({}), frida: z .object({ enabled: z.boolean().default(true), @@ -142,9 +142,9 @@ export const ConfigSchema = z scriptRoot: z.string().optional(), timeout: z.number().int().min(1).default(30), }) - .default({}), + .prefault({}), }) - .default({}), + .prefault({}), cache: z .object({ enabled: z.boolean().default(true), @@ -155,14 +155,14 @@ export const ConfigSchema = z .min(0) .default(30 * 24 * 60 * 60), // 30 days }) - .default({}), + .prefault({}), logging: z .object({ level: z.enum(['trace', 'debug', 'info', 'warn', 'error', 'fatal']).default('info'), pretty: z.boolean().default(false), auditPath: z.string().default(getDefaultAuditLogPath()), }) - .default({}), + .prefault({}), api: z .object({ enabled: z.boolean().default(true), // Default: enabled @@ -190,7 +190,7 @@ export const ConfigSchema = z .object({ role: z.enum(['analyzer', 'runtime', 'hybrid']).default('analyzer'), }) - .default({}), + .prefault({}), runtime: z .object({ mode: z.enum(['auto-sandbox', 'remote-sandbox', 'manual', 'disabled']).default('disabled'), @@ -202,7 +202,7 @@ export const ConfigSchema = z heartbeatIntervalMs: z.number().int().min(1000).default(30000), healthCheckTimeoutMs: z.number().int().min(1000).default(60000), }) - .default({}), + .prefault({}), }) .superRefine((data, ctx) => { // Cross-field validations diff --git a/src/core/tool-executor.ts b/src/core/tool-executor.ts index 2dcbfd13..b7369949 100644 --- a/src/core/tool-executor.ts +++ b/src/core/tool-executor.ts @@ -186,7 +186,7 @@ export class ToolExecutor { } catch (error) { if (error instanceof z.ZodError) { // Build detailed validation error message - const errorDetails = error.errors.map((e) => { + const errorDetails = error.issues.map((e) => { const path = e.path.length > 0 ? e.path.join('.') : 'root' return ` - ${path}: ${e.message}` }) diff --git a/src/core/zod-schema-converter.ts b/src/core/zod-schema-converter.ts index 23c2eb94..d2587e9b 100644 --- a/src/core/zod-schema-converter.ts +++ b/src/core/zod-schema-converter.ts @@ -7,6 +7,15 @@ import { z } from 'zod' +/** + * Resolve a (possibly lazy) zod default value. zod4 stores the default as a + * value on `_zod.def.defaultValue`; a thunk is still supported for lazy defaults. + */ +function resolveDefaultValue(schema: { _zod: { def: { defaultValue: unknown } } }): unknown { + const dv: unknown = schema._zod.def.defaultValue + return typeof dv === 'function' ? (dv as () => unknown)() : dv +} + /** * Convert Zod schema to JSON Schema format * Basic implementation for common Zod types @@ -34,17 +43,15 @@ export function isFieldRequired(schema: z.ZodTypeAny): boolean { if (schema instanceof z.ZodCatch) { return false } - if (schema instanceof z.ZodEffects) { - return isFieldRequired(schema._def.schema) + // zod4: .transform() yields a ZodPipe (ZodEffects was removed); follow its input schema. + if (schema instanceof z.ZodPipe) { + return isFieldRequired(schema._zod.def.in as z.ZodTypeAny) } if (schema instanceof z.ZodNullable) { - return isFieldRequired(schema._def.innerType) - } - if (schema instanceof z.ZodBranded) { - return isFieldRequired(schema._def.type) + return isFieldRequired(schema.unwrap() as z.ZodTypeAny) } if (schema instanceof z.ZodReadonly) { - return isFieldRequired(schema._def.innerType) + return isFieldRequired(schema.unwrap() as z.ZodTypeAny) } return true @@ -75,8 +82,22 @@ export function withSchemaMetadata( } } +/** Read the zod4 internal check list off any schema. */ +function getZodChecks(schema: z.ZodTypeAny): Array<{ _zod?: { def?: Record } }> { + return ( + (schema._zod.def as unknown as { checks?: Array<{ _zod?: { def?: Record } }> }) + .checks || [] + ) +} + export function getSchemaGuidance(schema: z.ZodTypeAny): string[] { - if (schema instanceof z.ZodEffects && schema.description) { + if (!schema.description) { + return [] + } + // zod4: refinements attach a `custom` check (ZodEffects was removed); transforms + // are ZodPipe. Surface the description as guidance to mirror the old behavior. + const hasRefinement = getZodChecks(schema).some((c) => c._zod?.def?.check === 'custom') + if (hasRefinement || schema instanceof z.ZodPipe) { return [schema.description] } @@ -87,32 +108,38 @@ export function applyStringChecks( jsonSchema: Record, schema: z.ZodString ): Record { - const checks = ((schema as any)._def?.checks || []) as Array> const result: Record = { ...jsonSchema } - for (const check of checks) { - switch (check.kind) { - case 'min': - result.minLength = check.value - break - case 'max': - result.maxLength = check.value - break - case 'email': - result.format = 'email' + for (const c of getZodChecks(schema)) { + const def = (c._zod?.def || {}) as Record + switch (def.check) { + case 'min_length': + result.minLength = def.minimum break - case 'url': - result.format = 'uri' + case 'max_length': + result.maxLength = def.maximum break - case 'uuid': - result.format = 'uuid' - break - case 'datetime': - result.format = 'date-time' - break - case 'regex': - if (check.regex instanceof RegExp) { - result.pattern = check.regex.source + case 'string_format': + switch (def.format) { + case 'email': + result.format = 'email' + break + case 'url': + result.format = 'uri' + break + case 'uuid': + case 'guid': + result.format = 'uuid' + break + case 'datetime': + case 'iso_datetime': + result.format = 'date-time' + break + case 'regex': + if (def.pattern instanceof RegExp) { + result.pattern = def.pattern.source + } + break } break } @@ -125,30 +152,32 @@ export function applyNumberChecks( jsonSchema: Record, schema: z.ZodNumber ): Record { - const checks = ((schema as any)._def?.checks || []) as Array> const result: Record = { ...jsonSchema } - for (const check of checks) { - switch (check.kind) { - case 'int': - result.type = 'integer' + for (const c of getZodChecks(schema)) { + const def = (c._zod?.def || {}) as Record + switch (def.check) { + case 'number_format': + if (def.format === 'safeint' || def.format === 'int' || def.format === 'int32') { + result.type = 'integer' + } break - case 'min': - if (check.inclusive === false) { - result.exclusiveMinimum = check.value + case 'greater_than': + if (def.inclusive === false) { + result.exclusiveMinimum = def.value } else { - result.minimum = check.value + result.minimum = def.value } break - case 'max': - if (check.inclusive === false) { - result.exclusiveMaximum = check.value + case 'less_than': + if (def.inclusive === false) { + result.exclusiveMaximum = def.value } else { - result.maximum = check.value + result.maximum = def.value } break - case 'multipleOf': - result.multipleOf = check.value + case 'multiple_of': + result.multipleOf = def.value break } } @@ -158,14 +187,20 @@ export function applyNumberChecks( export function applyArrayChecks( jsonSchema: Record, - schema: z.ZodArray + schema: z.ZodTypeAny ): Record { - const def = (schema as any)._def || {} - return { - ...jsonSchema, - ...(def.minLength?.value !== undefined ? { minItems: def.minLength.value } : {}), - ...(def.maxLength?.value !== undefined ? { maxItems: def.maxLength.value } : {}), + const result: Record = { ...jsonSchema } + + for (const c of getZodChecks(schema)) { + const def = (c._zod?.def || {}) as Record + if (def.check === 'min_length') { + result.minItems = def.minimum + } else if (def.check === 'max_length') { + result.maxItems = def.maximum + } } + + return result } export function isNeverSchema(schema: z.ZodTypeAny): boolean { @@ -178,24 +213,21 @@ export function isNeverSchema(schema: z.ZodTypeAny): boolean { */ export function generateSchemaExample(schema: z.ZodTypeAny): Record | null { try { - if (schema instanceof z.ZodEffects) { - return generateSchemaExample(schema._def.schema) + if (schema instanceof z.ZodPipe) { + return generateSchemaExample(schema._zod.def.in as z.ZodTypeAny) } if ( schema instanceof z.ZodOptional || schema instanceof z.ZodNullable || schema instanceof z.ZodCatch ) { - return generateSchemaExample(schema._def.innerType) + return generateSchemaExample(schema.unwrap() as z.ZodTypeAny) } if (schema instanceof z.ZodDefault) { - return generateSchemaExample(schema._def.innerType) - } - if (schema instanceof z.ZodBranded) { - return generateSchemaExample(schema._def.type) + return generateSchemaExample(schema.unwrap() as z.ZodTypeAny) } if (schema instanceof z.ZodReadonly) { - return generateSchemaExample(schema._def.innerType) + return generateSchemaExample(schema.unwrap() as z.ZodTypeAny) } // Handle ZodObject @@ -222,33 +254,30 @@ export function generateSchemaExample(schema: z.ZodTypeAny): Record { // Handle optional if (schema instanceof z.ZodOptional) { - return withSchemaMetadata(zodFieldToJsonSchema(schema._def.innerType), schema) + return withSchemaMetadata(zodFieldToJsonSchema(schema.unwrap() as z.ZodTypeAny), schema) } // Handle nullable if (schema instanceof z.ZodNullable) { - const innerSchema = zodFieldToJsonSchema(schema._def.innerType) + const innerSchema = zodFieldToJsonSchema(schema.unwrap() as z.ZodTypeAny) return withSchemaMetadata( { anyOf: [innerSchema, { type: 'null' }], @@ -325,12 +354,12 @@ export function zodFieldToJsonSchema(schema: z.ZodTypeAny): Record = { type: 'array' } @@ -400,7 +424,7 @@ export function zodFieldToJsonSchema(schema: z.ZodTypeAny): Record 0 ? { required } : {}), ...(catchall && !isNeverSchema(catchall) ? { additionalProperties: zodFieldToJsonSchema(catchall) } - : unknownKeys === 'passthrough' - ? { additionalProperties: true } - : { additionalProperties: false }), + : { additionalProperties: false }), }, schema ) @@ -452,7 +475,7 @@ export function zodFieldToJsonSchema(schema: z.ZodTypeAny): Record zodFieldToJsonSchema(option)), @@ -463,7 +486,7 @@ export function zodFieldToJsonSchema(schema: z.ZodTypeAny): Record) return withSchemaMetadata( { anyOf: options.map((option) => zodFieldToJsonSchema(option)), @@ -477,7 +500,7 @@ export function zodFieldToJsonSchema(schema: z.ZodTypeAny): Record zodFieldToJsonSchema(item)), + items: items.map((item: z.ZodTypeAny) => zodFieldToJsonSchema(item)), }, schema ) diff --git a/src/plugins/android/tools/android-behavior-graph.ts b/src/plugins/android/tools/android-behavior-graph.ts index 8868ffb0..cd2a3ce4 100644 --- a/src/plugins/android/tools/android-behavior-graph.ts +++ b/src/plugins/android/tools/android-behavior-graph.ts @@ -16,7 +16,7 @@ export const AndroidBehaviorGraphInputSchema = z export const AndroidBehaviorGraphOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), errors: z.array(z.string()).optional(), metrics: z.object({ elapsed_ms: z.number(), tool: z.string() }).optional(), }) diff --git a/src/plugins/angr/tools/angr-analyze.ts b/src/plugins/angr/tools/angr-analyze.ts index 4bdca998..4df47495 100644 --- a/src/plugins/angr/tools/angr-analyze.ts +++ b/src/plugins/angr/tools/angr-analyze.ts @@ -81,11 +81,11 @@ export const angrAnalyzeOutputSchema = z.object({ edge_count: z.number().int().nonnegative().optional(), function_count: z.number().int().nonnegative().optional(), functions: z.array(z.any()).optional(), - raw_angr_result: z.record(z.any()).optional(), + raw_angr_result: z.record(z.string(), z.any()).optional(), artifact: ArtifactRefSchema.optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), diff --git a/src/plugins/api-hash/tools/hash-identify.ts b/src/plugins/api-hash/tools/hash-identify.ts index 3d9e7535..e71b62d5 100644 --- a/src/plugins/api-hash/tools/hash-identify.ts +++ b/src/plugins/api-hash/tools/hash-identify.ts @@ -68,10 +68,10 @@ export const hashIdentifyOutputSchema = z.object({ }) ) .optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), - raw_identify_result: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), + raw_identify_result: z.record(z.string(), z.any()).optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), diff --git a/src/plugins/api-hash/tools/hash-resolve.ts b/src/plugins/api-hash/tools/hash-resolve.ts index e787681a..eb60ede5 100644 --- a/src/plugins/api-hash/tools/hash-resolve.ts +++ b/src/plugins/api-hash/tools/hash-resolve.ts @@ -96,11 +96,11 @@ export const hashResolveOutputSchema = z.object({ }) ) .optional(), - raw_hash_result: z.record(z.any()).optional(), + raw_hash_result: z.record(z.string(), z.any()).optional(), artifact: ArtifactRefSchema.optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), diff --git a/src/plugins/apk-smali/tools/apk-disassemble.ts b/src/plugins/apk-smali/tools/apk-disassemble.ts index f6db0de8..58378eff 100644 --- a/src/plugins/apk-smali/tools/apk-disassemble.ts +++ b/src/plugins/apk-smali/tools/apk-disassemble.ts @@ -85,9 +85,9 @@ export const apkDisassembleOutputSchema = z.object({ ) .optional(), artifact: ArtifactRefSchema.optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), diff --git a/src/plugins/apk-smali/tools/apk-manifest-parse.ts b/src/plugins/apk-smali/tools/apk-manifest-parse.ts index 2b824907..a88ad558 100644 --- a/src/plugins/apk-smali/tools/apk-manifest-parse.ts +++ b/src/plugins/apk-smali/tools/apk-manifest-parse.ts @@ -73,9 +73,9 @@ export const apkManifestParseOutputSchema = z.object({ providers: z.array(z.string()).optional(), manifest_xml: z.string().optional(), artifact: ArtifactRefSchema.optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), diff --git a/src/plugins/apk-smali/tools/apk-resources-decode.ts b/src/plugins/apk-smali/tools/apk-resources-decode.ts index 3cebdba0..9cf015e6 100644 --- a/src/plugins/apk-smali/tools/apk-resources-decode.ts +++ b/src/plugins/apk-smali/tools/apk-resources-decode.ts @@ -70,9 +70,9 @@ export const apkResourcesDecodeOutputSchema = z.object({ ) .optional(), artifact: ArtifactRefSchema.optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), diff --git a/src/plugins/apple-objc-swift/tools/apple-objc-swift-metadata-inspect.ts b/src/plugins/apple-objc-swift/tools/apple-objc-swift-metadata-inspect.ts index 1ead6a58..ecb333b5 100644 --- a/src/plugins/apple-objc-swift/tools/apple-objc-swift-metadata-inspect.ts +++ b/src/plugins/apple-objc-swift/tools/apple-objc-swift-metadata-inspect.ts @@ -138,7 +138,7 @@ const AppleObjcSwiftInventorySchema = z.object({ is_fat: z.boolean(), parsed_slice_offset: z.number().nullable(), slice_count: z.number(), - architectures: z.array(z.record(z.any())), + architectures: z.array(z.record(z.string(), z.any())), cputype: z.string().nullable(), filetype: z.string().nullable(), is_64: z.boolean().nullable(), @@ -150,8 +150,8 @@ const AppleObjcSwiftInventorySchema = z.object({ }), objc: z.object({ present: z.boolean(), - section_counts: z.record(z.number()), - pointer_reference_counts: z.record(z.number()), + section_counts: z.record(z.string(), z.number()), + pointer_reference_counts: z.record(z.string(), z.number()), class_name_hints: z.array(z.string()), selector_hints: z.array(z.string()), protocol_hints: z.array(z.string()), @@ -161,7 +161,7 @@ const AppleObjcSwiftInventorySchema = z.object({ swift: z.object({ present: z.boolean(), standalone_metadata: z.boolean(), - section_counts: z.record(z.number()), + section_counts: z.record(z.string(), z.number()), section_hints: z.array(z.string()), module_hints: z.array(z.string()), mangled_symbol_hints: z.array(z.string()), @@ -203,9 +203,9 @@ const AppleObjcSwiftInventorySchema = z.object({ notes: z.array(z.string()), }), policy: AppleObjcSwiftPolicySchema, - evidence_summary: z.record(z.any()), - workflow_handoff: z.record(z.any()), - quality_gates: z.record(z.any()), + evidence_summary: z.record(z.string(), z.any()), + workflow_handoff: z.record(z.string(), z.any()), + quality_gates: z.record(z.string(), z.any()), summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), diff --git a/src/plugins/apple-signing/tools/apple-security-profile.ts b/src/plugins/apple-signing/tools/apple-security-profile.ts index 8bab713d..61746858 100644 --- a/src/plugins/apple-signing/tools/apple-security-profile.ts +++ b/src/plugins/apple-signing/tools/apple-security-profile.ts @@ -15,7 +15,7 @@ export const AppleSecurityProfileInputSchema = z export const AppleSecurityProfileOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), errors: z.array(z.string()).optional(), metrics: z.object({ elapsed_ms: z.number(), tool: z.string() }).optional(), }) diff --git a/src/plugins/backend-plan.ts b/src/plugins/backend-plan.ts index 0a0cb640..fdedd25e 100644 --- a/src/plugins/backend-plan.ts +++ b/src/plugins/backend-plan.ts @@ -73,12 +73,12 @@ export const BackendPlanInputSchema = z.object({ export const BackendPlanOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), warnings: z.array(z.string()).optional(), errors: z.array(z.string()).optional(), artifacts: z.array(z.any()).optional(), evidence: z.array(z.any()).optional(), - metrics: z.record(z.any()).optional(), + metrics: z.record(z.string(), z.any()).optional(), }) function uniqueStrings(values: string[]): string[] { diff --git a/src/plugins/behavior-first/tools/behavior-ioc.ts b/src/plugins/behavior-first/tools/behavior-ioc.ts index 2dda1a0a..5c05eca3 100644 --- a/src/plugins/behavior-first/tools/behavior-ioc.ts +++ b/src/plugins/behavior-first/tools/behavior-ioc.ts @@ -24,7 +24,7 @@ const TOOL_NAME = 'behavior.ioc' export const behaviorIocInputSchema = z.object({ sample_id: z.string().describe('Sample ID for artifact association'), behavior_data: z - .record(z.any()) + .record(z.string(), z.any()) .describe('Behavioral capture data from behavior.capture tool output'), persist_artifact: z.boolean().default(true), session_tag: z.string().optional(), diff --git a/src/plugins/behavior-first/tools/behavior-network.ts b/src/plugins/behavior-first/tools/behavior-network.ts index 35485308..0da23f73 100644 --- a/src/plugins/behavior-first/tools/behavior-network.ts +++ b/src/plugins/behavior-first/tools/behavior-network.ts @@ -23,7 +23,9 @@ const TOOL_NAME = 'behavior.network' export const behaviorNetworkInputSchema = z.object({ sample_id: z.string().describe('Sample ID for artifact association'), - behavior_data: z.record(z.any()).describe('Behavioral capture data from behavior.capture'), + behavior_data: z + .record(z.string(), z.any()) + .describe('Behavioral capture data from behavior.capture'), persist_artifact: z.boolean().default(true), session_tag: z.string().optional(), }) diff --git a/src/plugins/binary-hardening/tools/binary-hardening-inventory.ts b/src/plugins/binary-hardening/tools/binary-hardening-inventory.ts index 006d8dc4..b865fc03 100644 --- a/src/plugins/binary-hardening/tools/binary-hardening-inventory.ts +++ b/src/plugins/binary-hardening/tools/binary-hardening-inventory.ts @@ -210,20 +210,20 @@ const BinaryHardeningInventorySchema = z.object({ confidence: z.enum(['low', 'medium', 'high']), size: z.number().optional(), preview_size: z.number(), - container: z.record(z.any()), - mitigation_summary: z.record(z.any()), - mitigations: z.array(z.record(z.any())), - hardware_features: z.array(z.record(z.any())), - section_risks: z.array(z.record(z.any())), - risk_flags: z.array(z.record(z.any())), - posture: z.record(z.any()), + container: z.record(z.string(), z.any()), + mitigation_summary: z.record(z.string(), z.any()), + mitigations: z.array(z.record(z.string(), z.any())), + hardware_features: z.array(z.record(z.string(), z.any())), + section_risks: z.array(z.record(z.string(), z.any())), + risk_flags: z.array(z.record(z.string(), z.any())), + posture: z.record(z.string(), z.any()), policy: BinaryHardeningPolicySchema, summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), - evidence_summary: z.record(z.any()), - workflow_handoff: z.record(z.any()), - quality_gates: z.record(z.any()), + evidence_summary: z.record(z.string(), z.any()), + workflow_handoff: z.record(z.string(), z.any()), + quality_gates: z.record(z.string(), z.any()), }) export const BinaryHardeningInventoryInputSchema = z.object({ diff --git a/src/plugins/btf/tools/btf-type-inventory.ts b/src/plugins/btf/tools/btf-type-inventory.ts index 70d1a9eb..c95ec3b7 100644 --- a/src/plugins/btf/tools/btf-type-inventory.ts +++ b/src/plugins/btf/tools/btf-type-inventory.ts @@ -137,19 +137,19 @@ const BtfInventorySchema = z.object({ confidence: z.enum(['low', 'medium', 'high']), size: z.number().optional(), preview_size: z.number(), - container: z.record(z.any()), - btf: z.record(z.any()), - btf_ext: z.record(z.any()), - string_table: z.record(z.any()), - risk_flags: z.array(z.record(z.any())), - risk_summary: z.record(z.any()), + container: z.record(z.string(), z.any()), + btf: z.record(z.string(), z.any()), + btf_ext: z.record(z.string(), z.any()), + string_table: z.record(z.string(), z.any()), + risk_flags: z.array(z.record(z.string(), z.any())), + risk_summary: z.record(z.string(), z.any()), policy: BtfPolicySchema, summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), - evidence_summary: z.record(z.any()), - workflow_handoff: z.record(z.any()), - quality_gates: z.record(z.any()), + evidence_summary: z.record(z.string(), z.any()), + workflow_handoff: z.record(z.string(), z.any()), + quality_gates: z.record(z.string(), z.any()), }) export const BtfTypeInventoryInputSchema = z.object({ diff --git a/src/plugins/bytecode/tools/bytecode-metadata-inspect.ts b/src/plugins/bytecode/tools/bytecode-metadata-inspect.ts index 9aec1c25..266388a5 100644 --- a/src/plugins/bytecode/tools/bytecode-metadata-inspect.ts +++ b/src/plugins/bytecode/tools/bytecode-metadata-inspect.ts @@ -46,7 +46,7 @@ const BytecodeMetadataSchema = z.object({ format: z.string(), detected_by: z.array(z.string()), size: z.number().optional(), - header: z.record(z.any()), + header: z.record(z.string(), z.any()), version_hints: z.array(z.string()), string_hints: z.array(z.string()), decompile_plan: z.object({ @@ -58,9 +58,9 @@ const BytecodeMetadataSchema = z.object({ summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), - evidence_summary: z.record(z.any()), - workflow_handoff: z.record(z.any()), - quality_gates: z.record(z.any()), + evidence_summary: z.record(z.string(), z.any()), + workflow_handoff: z.record(z.string(), z.any()), + quality_gates: z.record(z.string(), z.any()), }) export const BytecodeMetadataInspectInputSchema = z.object({ diff --git a/src/plugins/code-analysis/tools/code-function-cfg.ts b/src/plugins/code-analysis/tools/code-function-cfg.ts index 6007ab77..a03a6ede 100644 --- a/src/plugins/code-analysis/tools/code-function-cfg.ts +++ b/src/plugins/code-analysis/tools/code-function-cfg.ts @@ -172,7 +172,7 @@ export const codeFunctionCFGOutputSchema = z.object({ address: z.string(), node_count: z.number().int().nonnegative(), edge_count: z.number().int().nonnegative(), - block_type_counts: z.record(z.number()), + block_type_counts: z.record(z.string(), z.number()), entry_node_count: z.number().int().nonnegative(), exit_node_count: z.number().int().nonnegative(), }), diff --git a/src/plugins/code-analysis/tools/cross-decompiler-consensus.ts b/src/plugins/code-analysis/tools/cross-decompiler-consensus.ts index e8343961..e95b1b4e 100644 --- a/src/plugins/code-analysis/tools/cross-decompiler-consensus.ts +++ b/src/plugins/code-analysis/tools/cross-decompiler-consensus.ts @@ -180,9 +180,9 @@ export const CrossDecompilerConsensusOutputSchema = createWorkerResultOutputSche recommended_tools: z.array(z.string()), }) ), - backend_coverage: z.record(z.any()), - evidence_summary: z.record(z.any()), - function_evidence_handoff: z.record(z.any()), + backend_coverage: z.record(z.string(), z.any()), + evidence_summary: z.record(z.string(), z.any()), + function_evidence_handoff: z.record(z.string(), z.any()), evidence_graph: z .object({ nodes: z.array(z.object({ id: z.string(), type: z.string(), label: z.string() })), @@ -191,7 +191,7 @@ export const CrossDecompilerConsensusOutputSchema = createWorkerResultOutputSche ), }) .optional(), - quality_gates: z.record(z.any()), + quality_gates: z.record(z.string(), z.any()), follow_up_recommendations: z.array(z.string()), }) ) diff --git a/src/plugins/compiler-codegen/tools/compiler-codegen-fingerprint.ts b/src/plugins/compiler-codegen/tools/compiler-codegen-fingerprint.ts index 0cfe6f8d..90cbde90 100644 --- a/src/plugins/compiler-codegen/tools/compiler-codegen-fingerprint.ts +++ b/src/plugins/compiler-codegen/tools/compiler-codegen-fingerprint.ts @@ -86,22 +86,22 @@ const CompilerCodegenFingerprintSchema = z.object({ confidence: z.enum(['low', 'medium', 'high']), size: z.number().optional(), preview_size: z.number(), - container: z.record(z.any()), - compiler_candidates: z.array(z.record(z.any())), - linker_candidates: z.array(z.record(z.any())), - language_runtime_hints: z.array(z.record(z.any())), - optimization_hints: z.array(z.record(z.any())), - codegen_features: z.array(z.record(z.any())), - provenance_markers: z.array(z.record(z.any())), - section_layout: z.record(z.any()), - risk_flags: z.array(z.record(z.any())), + container: z.record(z.string(), z.any()), + compiler_candidates: z.array(z.record(z.string(), z.any())), + linker_candidates: z.array(z.record(z.string(), z.any())), + language_runtime_hints: z.array(z.record(z.string(), z.any())), + optimization_hints: z.array(z.record(z.string(), z.any())), + codegen_features: z.array(z.record(z.string(), z.any())), + provenance_markers: z.array(z.record(z.string(), z.any())), + section_layout: z.record(z.string(), z.any()), + risk_flags: z.array(z.record(z.string(), z.any())), policy: CompilerCodegenPolicySchema, summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), - evidence_summary: z.record(z.any()), - workflow_handoff: z.record(z.any()), - quality_gates: z.record(z.any()), + evidence_summary: z.record(z.string(), z.any()), + workflow_handoff: z.record(z.string(), z.any()), + quality_gates: z.record(z.string(), z.any()), }) export const CompilerCodegenFingerprintInputSchema = z.object({ diff --git a/src/plugins/container-analysis/tools/container-image-security-profile.ts b/src/plugins/container-analysis/tools/container-image-security-profile.ts index 1c5bfca5..1916787f 100644 --- a/src/plugins/container-analysis/tools/container-image-security-profile.ts +++ b/src/plugins/container-analysis/tools/container-image-security-profile.ts @@ -40,18 +40,18 @@ const ContainerImageSecurityProfileDataSchema = z.object({ image_format: z.string(), detected_by: z.array(z.string()), sha256_preview: z.string(), - selected_image: z.record(z.any()), + selected_image: z.record(z.string(), z.any()), config_digest: z.string().optional(), - platform: z.record(z.any()), - runtime_config: z.record(z.any()), - layer_summary: z.record(z.any()), - history_summary: z.record(z.any()), + platform: z.record(z.string(), z.any()), + runtime_config: z.record(z.string(), z.any()), + layer_summary: z.record(z.string(), z.any()), + history_summary: z.record(z.string(), z.any()), risk_flags: z.array(z.string()), risk_score: z.number(), policy: ContainerImagePolicySchema, - evidence_summary: z.record(z.any()), - workflow_handoff: z.record(z.any()), - quality_gates: z.record(z.any()), + evidence_summary: z.record(z.string(), z.any()), + workflow_handoff: z.record(z.string(), z.any()), + quality_gates: z.record(z.string(), z.any()), unsupported_detail: z.string().optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), diff --git a/src/plugins/container-analysis/tools/container-structure-analyze.ts b/src/plugins/container-analysis/tools/container-structure-analyze.ts index b62c4eb3..ecfe9af7 100644 --- a/src/plugins/container-analysis/tools/container-structure-analyze.ts +++ b/src/plugins/container-analysis/tools/container-structure-analyze.ts @@ -62,10 +62,10 @@ const ContainerStructureDataSchema = z.object({ notes: z.array(z.string()), }), policy: ContainerPolicySchema, - container_profile: z.record(z.any()).optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + container_profile: z.record(z.string(), z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), unsupported_detail: z.string().optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), diff --git a/src/plugins/cpp-abi-layout/tools/cpp-abi-layout-inventory.ts b/src/plugins/cpp-abi-layout/tools/cpp-abi-layout-inventory.ts index ccae2bdd..d9fe97e3 100644 --- a/src/plugins/cpp-abi-layout/tools/cpp-abi-layout-inventory.ts +++ b/src/plugins/cpp-abi-layout/tools/cpp-abi-layout-inventory.ts @@ -144,23 +144,23 @@ const CppAbiLayoutInventorySchema = z.object({ confidence: z.enum(['low', 'medium', 'high']), size: z.number().optional(), preview_size: z.number(), - container: z.record(z.any()), - abi_families: z.record(z.any()), - evidence: z.array(z.record(z.any())), - class_hints: z.array(z.record(z.any())), - vtable_hints: z.array(z.record(z.any())), - rtti_hints: z.array(z.record(z.any())), - exception_profile: z.record(z.any()), - layout_seeds: z.record(z.any()), - risk_flags: z.array(z.record(z.any())), - risk_summary: z.record(z.any()), + container: z.record(z.string(), z.any()), + abi_families: z.record(z.string(), z.any()), + evidence: z.array(z.record(z.string(), z.any())), + class_hints: z.array(z.record(z.string(), z.any())), + vtable_hints: z.array(z.record(z.string(), z.any())), + rtti_hints: z.array(z.record(z.string(), z.any())), + exception_profile: z.record(z.string(), z.any()), + layout_seeds: z.record(z.string(), z.any()), + risk_flags: z.array(z.record(z.string(), z.any())), + risk_summary: z.record(z.string(), z.any()), policy: CppAbiPolicySchema, summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), - evidence_summary: z.record(z.any()), - workflow_handoff: z.record(z.any()), - quality_gates: z.record(z.any()), + evidence_summary: z.record(z.string(), z.any()), + workflow_handoff: z.record(z.string(), z.any()), + quality_gates: z.record(z.string(), z.any()), }) export const CppAbiLayoutInventoryInputSchema = z.object({ diff --git a/src/plugins/crackme/tools/keygen-verify.ts b/src/plugins/crackme/tools/keygen-verify.ts index 1f6ef2f5..16d69958 100644 --- a/src/plugins/crackme/tools/keygen-verify.ts +++ b/src/plugins/crackme/tools/keygen-verify.ts @@ -36,7 +36,9 @@ export const KeygenVerifyInputSchema = z.object({ .describe('Approval token issued by PolicyGuard for dynamic execution'), }) -export const KeygenVerifyOutputSchema = createWorkerResultOutputSchema(z.record(z.any())) +export const KeygenVerifyOutputSchema = createWorkerResultOutputSchema( + z.record(z.string(), z.any()) +) export const keygenVerifyToolDefinition: ToolDefinition = { name: TOOL_NAME, diff --git a/src/plugins/crackme/tools/symbolic-explore.ts b/src/plugins/crackme/tools/symbolic-explore.ts index f3adc3f7..10cfadfe 100644 --- a/src/plugins/crackme/tools/symbolic-explore.ts +++ b/src/plugins/crackme/tools/symbolic-explore.ts @@ -55,7 +55,9 @@ export const SymbolicExploreInputSchema = z.object({ .describe('Approval token issued by PolicyGuard for dynamic execution'), }) -export const SymbolicExploreOutputSchema = createWorkerResultOutputSchema(z.record(z.any())) +export const SymbolicExploreOutputSchema = createWorkerResultOutputSchema( + z.record(z.string(), z.any()) +) export const symbolicExploreToolDefinition: ToolDefinition = { name: TOOL_NAME, diff --git a/src/plugins/cuda-binary/tools/cuda-binary-inventory.ts b/src/plugins/cuda-binary/tools/cuda-binary-inventory.ts index 44ea4add..b91afbdb 100644 --- a/src/plugins/cuda-binary/tools/cuda-binary-inventory.ts +++ b/src/plugins/cuda-binary/tools/cuda-binary-inventory.ts @@ -134,9 +134,9 @@ const CudaBinaryInventoryDataSchema = z.object({ .object({ schema: z.literal(CUDA_WORKFLOW_HANDOFF_SCHEMA), handoff_mode: z.literal('cuda_binary_inventory_to_gpu_lift_and_host_correlation'), - artifact_contract: z.record(z.any()), - dynamic_boundary: z.record(z.any()), - routing: z.array(z.record(z.any())), + artifact_contract: z.record(z.string(), z.any()), + dynamic_boundary: z.record(z.string(), z.any()), + routing: z.array(z.record(z.string(), z.any())), }) .passthrough(), quality_gates: z diff --git a/src/plugins/die/tools/die-scan.ts b/src/plugins/die/tools/die-scan.ts index 56d1ae39..894a15d8 100644 --- a/src/plugins/die/tools/die-scan.ts +++ b/src/plugins/die/tools/die-scan.ts @@ -107,9 +107,9 @@ export const dieScanOutputSchema = z.object({ stdout_preview: z.string().optional(), stderr_preview: z.string().optional(), artifact: ArtifactRefSchema.optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), diff --git a/src/plugins/docker-shared.ts b/src/plugins/docker-shared.ts index 03e76d8a..ccc45b70 100644 --- a/src/plugins/docker-shared.ts +++ b/src/plugins/docker-shared.ts @@ -95,7 +95,7 @@ export const ArtifactRefSchema = z.object({ path: z.string(), sha256: z.string(), mime: z.string().optional(), - metadata: z.record(z.any()).optional(), + metadata: z.record(z.string(), z.any()).optional(), }) export const BackendSchema = z.object({ diff --git a/src/plugins/dotnet-managed/tools/dotnet-assembly-inspect.ts b/src/plugins/dotnet-managed/tools/dotnet-assembly-inspect.ts index 38ddde04..fb219b00 100644 --- a/src/plugins/dotnet-managed/tools/dotnet-assembly-inspect.ts +++ b/src/plugins/dotnet-managed/tools/dotnet-assembly-inspect.ts @@ -68,9 +68,9 @@ const DotnetAssemblyInventorySchema = z.object({ workflow_handoff: z .object({ schema: z.literal(DOTNET_ASSEMBLY_WORKFLOW_HANDOFF_SCHEMA), - artifact_contract: z.record(z.any()), - dynamic_boundary: z.record(z.any()), - routing: z.array(z.record(z.any())), + artifact_contract: z.record(z.string(), z.any()), + dynamic_boundary: z.record(z.string(), z.any()), + routing: z.array(z.record(z.string(), z.any())), }) .passthrough() .optional(), diff --git a/src/plugins/dynamic/tools/debug-cdb-plan.ts b/src/plugins/dynamic/tools/debug-cdb-plan.ts index 35d561e6..4291d3e8 100644 --- a/src/plugins/dynamic/tools/debug-cdb-plan.ts +++ b/src/plugins/dynamic/tools/debug-cdb-plan.ts @@ -53,10 +53,10 @@ export const DebugCdbPlanInputSchema = z.object({ const DebugCdbPlanOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), warnings: z.array(z.string()).optional(), errors: z.array(z.string()).optional(), - metrics: z.record(z.any()).optional(), + metrics: z.record(z.string(), z.any()).optional(), }) export const debugCdbPlanToolDefinition: ToolDefinition = { diff --git a/src/plugins/dynamic/tools/debug-gui-handoff.ts b/src/plugins/dynamic/tools/debug-gui-handoff.ts index 01fd41e1..0517d37e 100644 --- a/src/plugins/dynamic/tools/debug-gui-handoff.ts +++ b/src/plugins/dynamic/tools/debug-gui-handoff.ts @@ -44,11 +44,11 @@ export const DebugGuiHandoffInputSchema = z.object({ const DebugGuiHandoffOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), warnings: z.array(z.string()).optional(), errors: z.array(z.string()).optional(), artifacts: z.array(z.any()).optional(), - metrics: z.record(z.any()).optional(), + metrics: z.record(z.string(), z.any()).optional(), }) export const debugGuiHandoffToolDefinition: ToolDefinition = { diff --git a/src/plugins/dynamic/tools/debug-managed-plan.ts b/src/plugins/dynamic/tools/debug-managed-plan.ts index bd033d3b..ffd11fd9 100644 --- a/src/plugins/dynamic/tools/debug-managed-plan.ts +++ b/src/plugins/dynamic/tools/debug-managed-plan.ts @@ -52,11 +52,11 @@ export const DebugManagedPlanInputSchema = z.object({ const DebugManagedPlanOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), warnings: z.array(z.string()).optional(), errors: z.array(z.string()).optional(), artifacts: z.array(z.any()).optional(), - metrics: z.record(z.any()).optional(), + metrics: z.record(z.string(), z.any()).optional(), }) export const debugManagedPlanToolDefinition: ToolDefinition = { diff --git a/src/plugins/dynamic/tools/debug-network-plan.ts b/src/plugins/dynamic/tools/debug-network-plan.ts index 3076837b..7c5675f6 100644 --- a/src/plugins/dynamic/tools/debug-network-plan.ts +++ b/src/plugins/dynamic/tools/debug-network-plan.ts @@ -55,11 +55,11 @@ export const DebugNetworkPlanInputSchema = z.object({ const DebugNetworkPlanOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), warnings: z.array(z.string()).optional(), errors: z.array(z.string()).optional(), artifacts: z.array(z.any()).optional(), - metrics: z.record(z.any()).optional(), + metrics: z.record(z.string(), z.any()).optional(), }) export const debugNetworkPlanToolDefinition: ToolDefinition = { diff --git a/src/plugins/dynamic/tools/debug-procdump-plan.ts b/src/plugins/dynamic/tools/debug-procdump-plan.ts index b4cd9abd..a51fd462 100644 --- a/src/plugins/dynamic/tools/debug-procdump-plan.ts +++ b/src/plugins/dynamic/tools/debug-procdump-plan.ts @@ -57,10 +57,10 @@ export const DebugProcDumpPlanInputSchema = z.object({ const DebugProcDumpPlanOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), warnings: z.array(z.string()).optional(), errors: z.array(z.string()).optional(), - metrics: z.record(z.any()).optional(), + metrics: z.record(z.string(), z.any()).optional(), }) export const debugProcDumpPlanToolDefinition: ToolDefinition = { diff --git a/src/plugins/dynamic/tools/debug-telemetry-plan.ts b/src/plugins/dynamic/tools/debug-telemetry-plan.ts index d2acf2da..df023f80 100644 --- a/src/plugins/dynamic/tools/debug-telemetry-plan.ts +++ b/src/plugins/dynamic/tools/debug-telemetry-plan.ts @@ -54,11 +54,11 @@ export const DebugTelemetryPlanInputSchema = z.object({ const DebugTelemetryPlanOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), warnings: z.array(z.string()).optional(), errors: z.array(z.string()).optional(), artifacts: z.array(z.any()).optional(), - metrics: z.record(z.any()).optional(), + metrics: z.record(z.string(), z.any()).optional(), }) export const debugTelemetryPlanToolDefinition: ToolDefinition = { diff --git a/src/plugins/dynamic/tools/dynamic-behavior-capture.ts b/src/plugins/dynamic/tools/dynamic-behavior-capture.ts index 92715ce3..24d9715c 100644 --- a/src/plugins/dynamic/tools/dynamic-behavior-capture.ts +++ b/src/plugins/dynamic/tools/dynamic-behavior-capture.ts @@ -54,11 +54,11 @@ export const DynamicBehaviorCaptureInputSchema = z.object({ const DynamicBehaviorCaptureOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), warnings: z.array(z.string()).optional(), errors: z.array(z.string()).optional(), artifacts: z.array(z.any()).optional(), - metrics: z.record(z.any()).optional(), + metrics: z.record(z.string(), z.any()).optional(), }) export const dynamicBehaviorCaptureToolDefinition: ToolDefinition = { diff --git a/src/plugins/dynamic/tools/dynamic-deep-plan.ts b/src/plugins/dynamic/tools/dynamic-deep-plan.ts index d68806dd..a097c630 100644 --- a/src/plugins/dynamic/tools/dynamic-deep-plan.ts +++ b/src/plugins/dynamic/tools/dynamic-deep-plan.ts @@ -52,10 +52,10 @@ export const DynamicDeepPlanInputSchema = z.object({ const DynamicDeepPlanOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), warnings: z.array(z.string()).optional(), errors: z.array(z.string()).optional(), - metrics: z.record(z.any()).optional(), + metrics: z.record(z.string(), z.any()).optional(), }) export const dynamicDeepPlanToolDefinition: ToolDefinition = { diff --git a/src/plugins/dynamic/tools/dynamic-dependencies.ts b/src/plugins/dynamic/tools/dynamic-dependencies.ts index 1a3193f6..4e48d373 100644 --- a/src/plugins/dynamic/tools/dynamic-dependencies.ts +++ b/src/plugins/dynamic/tools/dynamic-dependencies.ts @@ -41,7 +41,7 @@ export const DynamicDependenciesOutputSchema = z.object({ .object({ status: z.enum(['ready', 'partial', 'bootstrap_required']), available_components: z.array(z.string()), - components: z.record(z.any()), + components: z.record(z.string(), z.any()), recommendations: z.array(z.string()), setup_actions: z.array(SetupActionSchema).optional(), required_user_inputs: z.array(RequiredUserInputSchema).optional(), diff --git a/src/plugins/dynamic/tools/dynamic-persona-plan.ts b/src/plugins/dynamic/tools/dynamic-persona-plan.ts index fc0d26ac..2a469078 100644 --- a/src/plugins/dynamic/tools/dynamic-persona-plan.ts +++ b/src/plugins/dynamic/tools/dynamic-persona-plan.ts @@ -47,11 +47,11 @@ export const DynamicPersonaPlanInputSchema = z.object({ const DynamicPersonaPlanOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), warnings: z.array(z.string()).optional(), errors: z.array(z.string()).optional(), artifacts: z.array(z.any()).optional(), - metrics: z.record(z.any()).optional(), + metrics: z.record(z.string(), z.any()).optional(), }) export const dynamicPersonaPlanToolDefinition: ToolDefinition = { diff --git a/src/plugins/dynamic/tools/dynamic-runtime-status.ts b/src/plugins/dynamic/tools/dynamic-runtime-status.ts index ca5d41b2..1b98e275 100644 --- a/src/plugins/dynamic/tools/dynamic-runtime-status.ts +++ b/src/plugins/dynamic/tools/dynamic-runtime-status.ts @@ -82,10 +82,10 @@ export const DynamicRuntimeStatusInputSchema = z.object({ const DynamicRuntimeStatusOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), warnings: z.array(z.string()).optional(), errors: z.array(z.string()).optional(), - metrics: z.record(z.any()).optional(), + metrics: z.record(z.string(), z.any()).optional(), }) export const dynamicRuntimeStatusToolDefinition: ToolDefinition = { diff --git a/src/plugins/dynamic/tools/dynamic-toolkit-status.ts b/src/plugins/dynamic/tools/dynamic-toolkit-status.ts index f2d2c803..ad6f65c5 100644 --- a/src/plugins/dynamic/tools/dynamic-toolkit-status.ts +++ b/src/plugins/dynamic/tools/dynamic-toolkit-status.ts @@ -49,10 +49,10 @@ export const DynamicToolkitStatusInputSchema = z.object({ const DynamicToolkitStatusOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), warnings: z.array(z.string()).optional(), errors: z.array(z.string()).optional(), - metrics: z.record(z.any()).optional(), + metrics: z.record(z.string(), z.any()).optional(), }) export const dynamicToolkitStatusToolDefinition: ToolDefinition = { diff --git a/src/plugins/dynamic/tools/runtime-debug-session.ts b/src/plugins/dynamic/tools/runtime-debug-session.ts index e04f0206..8cc90092 100644 --- a/src/plugins/dynamic/tools/runtime-debug-session.ts +++ b/src/plugins/dynamic/tools/runtime-debug-session.ts @@ -264,11 +264,11 @@ export const RuntimeDebugCommandInputSchema = z.object({ const RuntimeDebugOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), warnings: z.array(z.string()).optional(), errors: z.array(z.string()).optional(), artifacts: z.array(z.any()).optional(), - metrics: z.record(z.any()).optional(), + metrics: z.record(z.string(), z.any()).optional(), }) export const runtimeDebugSessionStartToolDefinition: ToolDefinition = { diff --git a/src/plugins/dynamic/tools/runtime-hyperv-control.ts b/src/plugins/dynamic/tools/runtime-hyperv-control.ts index 3df2affc..7be42e74 100644 --- a/src/plugins/dynamic/tools/runtime-hyperv-control.ts +++ b/src/plugins/dynamic/tools/runtime-hyperv-control.ts @@ -60,10 +60,10 @@ export const RuntimeHyperVControlInputSchema = z.object({ const RuntimeHyperVControlOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), warnings: z.array(z.string()).optional(), errors: z.array(z.string()).optional(), - metrics: z.record(z.any()).optional(), + metrics: z.record(z.string(), z.any()).optional(), }) export const runtimeHyperVControlToolDefinition: ToolDefinition = { diff --git a/src/plugins/dynamic/tools/sandbox-execute.ts b/src/plugins/dynamic/tools/sandbox-execute.ts index 5872665c..e657dc21 100644 --- a/src/plugins/dynamic/tools/sandbox-execute.ts +++ b/src/plugins/dynamic/tools/sandbox-execute.ts @@ -152,7 +152,7 @@ const SandboxExecuteSuccessResultSchema = z.object({ timeout_sec: z.number(), event_count: z.number(), timeline: z.array(TimelineEventSchema), - iocs: z.record(z.array(z.string())), + iocs: z.record(z.string(), z.array(z.string())), capabilities: z.array(CapabilitySchema), memory_regions: z.array(MemoryRegionSchema).optional(), api_resolution: z.array(APIResolutionSchema).optional(), @@ -177,11 +177,11 @@ const SandboxExecuteSuccessResultSchema = z.object({ explanation: z.string(), }) .optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), recommended_next_tools: z.array(z.string()).optional(), - evidence: z.record(z.any()), + evidence: z.record(z.string(), z.any()), inference: z.object({ classification: z.string(), summary: z.string(), diff --git a/src/plugins/ebpf-bytecode/tools/ebpf-bytecode-inventory.ts b/src/plugins/ebpf-bytecode/tools/ebpf-bytecode-inventory.ts index 4874d8ca..8ceb087f 100644 --- a/src/plugins/ebpf-bytecode/tools/ebpf-bytecode-inventory.ts +++ b/src/plugins/ebpf-bytecode/tools/ebpf-bytecode-inventory.ts @@ -139,21 +139,21 @@ const EbpfInventorySchema = z.object({ instruction_count: z.number(), decoded_instruction_count: z.number(), instruction_preview_truncated: z.boolean(), - elf_header: z.record(z.any()).optional(), - sections: z.array(z.record(z.any())), + elf_header: z.record(z.string(), z.any()).optional(), + sections: z.array(z.record(z.string(), z.any())), instructions: z.array(EbpfInstructionSchema), - helper_calls: z.array(z.record(z.any())), - map_references: z.array(z.record(z.any())), - control_flow: z.record(z.any()), - verifier_precheck: z.record(z.any()), - risk_summary: z.record(z.any()), + helper_calls: z.array(z.record(z.string(), z.any())), + map_references: z.array(z.record(z.string(), z.any())), + control_flow: z.record(z.string(), z.any()), + verifier_precheck: z.record(z.string(), z.any()), + risk_summary: z.record(z.string(), z.any()), policy: EbpfPolicySchema, summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), - evidence_summary: z.record(z.any()), - workflow_handoff: z.record(z.any()), - quality_gates: z.record(z.any()), + evidence_summary: z.record(z.string(), z.any()), + workflow_handoff: z.record(z.string(), z.any()), + quality_gates: z.record(z.string(), z.any()), }) export const EbpfBytecodeInventoryInputSchema = z.object({ diff --git a/src/plugins/external-re-bridge/index.ts b/src/plugins/external-re-bridge/index.ts index 2cf5ddb0..706bbc05 100644 --- a/src/plugins/external-re-bridge/index.ts +++ b/src/plugins/external-re-bridge/index.ts @@ -181,7 +181,7 @@ const ExternalReBridgeInputSchema = z.object({ backend_version: z.string().optional(), sidecar_version: z.string().optional(), requested_operations: z.array(z.string()).optional().default([]), - artifact_manifest: ArtifactManifestSchema.optional().default({}), + artifact_manifest: ArtifactManifestSchema.optional().prefault({}), }) const ARTIFACT_TYPES = [ diff --git a/src/plugins/firmware/tools/firmware-workflow-plan.ts b/src/plugins/firmware/tools/firmware-workflow-plan.ts index e8eae477..53b63325 100644 --- a/src/plugins/firmware/tools/firmware-workflow-plan.ts +++ b/src/plugins/firmware/tools/firmware-workflow-plan.ts @@ -6,7 +6,7 @@ const TOOL_NAME = 'firmware.workflow.plan' export const FirmwareWorkflowPlanInputSchema = z .object({ sample_id: z.string().optional(), - signatures: z.array(z.record(z.any())).optional().default([]), + signatures: z.array(z.record(z.string(), z.any())).optional().default([]), firmware_scan: z.any().optional(), container_inventory: z.any().optional(), package_inventory: z.any().optional(), @@ -17,7 +17,7 @@ export const FirmwareWorkflowPlanInputSchema = z export const FirmwareWorkflowPlanOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), errors: z.array(z.string()).optional(), metrics: z.object({ elapsed_ms: z.number(), tool: z.string() }).optional(), }) diff --git a/src/plugins/frida/tools/frida-runtime-instrument.ts b/src/plugins/frida/tools/frida-runtime-instrument.ts index a2fe3257..e5d74f65 100644 --- a/src/plugins/frida/tools/frida-runtime-instrument.ts +++ b/src/plugins/frida/tools/frida-runtime-instrument.ts @@ -47,7 +47,7 @@ export const FridaRuntimeInstrumentInputSchema = z.object({ .optional() .describe('Custom Frida JavaScript script content (overrides script_name)'), script_parameters: z - .record(z.any()) + .record(z.string(), z.any()) .optional() .describe('Parameters to pass to the Frida script'), speed_factor: z diff --git a/src/plugins/frida/tools/frida-script-generate.ts b/src/plugins/frida/tools/frida-script-generate.ts index cee29a75..e0c3ce22 100644 --- a/src/plugins/frida/tools/frida-script-generate.ts +++ b/src/plugins/frida/tools/frida-script-generate.ts @@ -71,9 +71,9 @@ export const FridaScriptGenerateOutputSchema = z.object({ ), combined_script: z.string(), total_hooks: z.number(), - evidence_summary: z.record(z.any()), - workflow_handoff: z.record(z.any()), - quality_gates: z.record(z.any()), + evidence_summary: z.record(z.string(), z.any()), + workflow_handoff: z.record(z.string(), z.any()), + quality_gates: z.record(z.string(), z.any()), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), }) diff --git a/src/plugins/frida/tools/frida-script-inject.ts b/src/plugins/frida/tools/frida-script-inject.ts index 604ef7e0..44dfee9d 100644 --- a/src/plugins/frida/tools/frida-script-inject.ts +++ b/src/plugins/frida/tools/frida-script-inject.ts @@ -45,7 +45,7 @@ export const FridaScriptInjectInputSchema = z.object({ .optional() .describe('Path to a custom Frida script file (overrides script_name and script_content)'), script_parameters: z - .record(z.any()) + .record(z.string(), z.any()) .optional() .describe('Parameters to pass to the Frida script (e.g., module filters, function patterns)'), timeout_sec: z diff --git a/src/plugins/frida/tools/frida-trace-capture.ts b/src/plugins/frida/tools/frida-trace-capture.ts index bc4ba11b..64cd1119 100644 --- a/src/plugins/frida/tools/frida-trace-capture.ts +++ b/src/plugins/frida/tools/frida-trace-capture.ts @@ -85,9 +85,9 @@ export const FridaTraceCaptureOutputSchema = z.object({ events: z.array(FridaTraceEventSchema), aggregation: z .object({ - by_type: z.record(z.number()), - by_module: z.record(z.number()), - by_function: z.record(z.number()), + by_type: z.record(z.string(), z.number()), + by_module: z.record(z.string(), z.number()), + by_function: z.record(z.string(), z.number()), }) .optional(), warnings: z.array(z.string()), diff --git a/src/plugins/frontier-worker-tools.ts b/src/plugins/frontier-worker-tools.ts index 25ffea2b..a213eec0 100644 --- a/src/plugins/frontier-worker-tools.ts +++ b/src/plugins/frontier-worker-tools.ts @@ -22,7 +22,7 @@ export const FrontierWorkerInputSchema = z.object({ max_input_bytes: z.number().int().positive().optional(), goals: z.array(z.string()).optional().default([]), artifacts: z.array(z.string()).optional().default([]), - profile: z.record(z.any()).optional(), + profile: z.record(z.string(), z.any()).optional(), passes: z.array(z.string()).optional().default([]), target: z .object({ @@ -39,12 +39,12 @@ export const FrontierWorkerInputSchema = z.object({ export const FrontierWorkerOutputSchema = z .object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), warnings: z.array(z.string()).optional(), errors: z.array(z.string()).optional(), artifacts: z.array(z.any()).optional(), evidence: z.array(z.any()).optional(), - metrics: z.record(z.any()).optional(), + metrics: z.record(z.string(), z.any()).optional(), }) .passthrough() diff --git a/src/plugins/ghidra/tools/ghidra-health.ts b/src/plugins/ghidra/tools/ghidra-health.ts index 3dc95c5b..e1aa55bc 100644 --- a/src/plugins/ghidra/tools/ghidra-health.ts +++ b/src/plugins/ghidra/tools/ghidra-health.ts @@ -44,7 +44,7 @@ export const ghidraHealthOutputSchema = z.object({ data: z .object({ environment: z.any(), - downstream: z.record(z.any()).optional(), + downstream: z.record(z.string(), z.any()).optional(), reaped_persisted_analysis_ids: z.array(z.string()), reaped_persisted_analysis_count: z.number().int().nonnegative(), setup_actions: z.array(z.any()), diff --git a/src/plugins/jvm/tools/jvm-structure-analyze.ts b/src/plugins/jvm/tools/jvm-structure-analyze.ts index 2064c9f6..b9b16cdf 100644 --- a/src/plugins/jvm/tools/jvm-structure-analyze.ts +++ b/src/plugins/jvm/tools/jvm-structure-analyze.ts @@ -77,7 +77,7 @@ const JvmStructureDataSchema = z.object({ format: z.string(), detected_by: z.array(z.string()), size: z.number().optional(), - manifest: z.record(z.string()).optional(), + manifest: z.record(z.string(), z.string()).optional(), archive_members: z.array(z.string()), class_files: z.array(z.string()), packages: z.array(z.string()), @@ -90,9 +90,9 @@ const JvmStructureDataSchema = z.object({ }), policy: JvmPolicySchema, unsupported_detail: z.string().optional(), - evidence_summary: z.record(z.any()), - workflow_handoff: z.record(z.any()), - quality_gates: z.record(z.any()), + evidence_summary: z.record(z.string(), z.any()), + workflow_handoff: z.record(z.string(), z.any()), + quality_gates: z.record(z.string(), z.any()), summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), diff --git a/src/plugins/kb-collaboration/tools/analysis-template.ts b/src/plugins/kb-collaboration/tools/analysis-template.ts index 402b1472..2625b1ba 100644 --- a/src/plugins/kb-collaboration/tools/analysis-template.ts +++ b/src/plugins/kb-collaboration/tools/analysis-template.ts @@ -40,7 +40,7 @@ const TemplateStepOutputSchema = z description: z.string(), required: z.boolean(), depends_on: z.array(z.string()).optional(), - args_hint: z.record(z.any()).optional(), + args_hint: z.record(z.string(), z.any()).optional(), status: z.enum(['completed', 'pending']), }) .passthrough() diff --git a/src/plugins/kb-collaboration/tools/kb-context-suggest.ts b/src/plugins/kb-collaboration/tools/kb-context-suggest.ts index ff49b94e..9b5b0efe 100644 --- a/src/plugins/kb-collaboration/tools/kb-context-suggest.ts +++ b/src/plugins/kb-collaboration/tools/kb-context-suggest.ts @@ -20,9 +20,9 @@ export const KbContextSuggestOutputSchema = createWorkerResultOutputSchema( z.object({ result_mode: z.literal('kb_context_suggest'), sample_id: z.string(), - analysis_memory: z.record(z.any()), - recommendations: z.array(z.record(z.any())), - provenance: z.array(z.record(z.any())), + analysis_memory: z.record(z.string(), z.any()), + recommendations: z.array(z.record(z.string(), z.any())), + provenance: z.array(z.record(z.string(), z.any())), recommended_next_tools: z.array(z.string()), }) ) diff --git a/src/plugins/kb-collaboration/tools/kb-function-match.ts b/src/plugins/kb-collaboration/tools/kb-function-match.ts index 34f43963..9438bd93 100644 --- a/src/plugins/kb-collaboration/tools/kb-function-match.ts +++ b/src/plugins/kb-collaboration/tools/kb-function-match.ts @@ -124,10 +124,10 @@ export const KbFunctionMatchOutputSchema = createWorkerResultOutputSchema( workflowRecipes: z.array(z.any()).optional(), formats: z.array(z.string()).optional(), evidence: z.array(z.string()).optional(), - policy: z.record(z.any()).optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + policy: z.record(z.string(), z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), recommended_next_tools: z.array(z.string()).optional(), next_actions: z.array(z.string()).optional(), matches: z.array( diff --git a/src/plugins/kernel-driver-surface/tools/kernel-driver-surface-inventory.ts b/src/plugins/kernel-driver-surface/tools/kernel-driver-surface-inventory.ts index 96a6d145..b04e5ff2 100644 --- a/src/plugins/kernel-driver-surface/tools/kernel-driver-surface-inventory.ts +++ b/src/plugins/kernel-driver-surface/tools/kernel-driver-surface-inventory.ts @@ -385,24 +385,24 @@ const KernelDriverSurfaceInventorySchema = z.object({ confidence: z.enum(['low', 'medium', 'high']), size: z.number().optional(), preview_size: z.number(), - container: z.record(z.any()), - evidence: z.array(z.record(z.any())), - windows_surface: z.record(z.any()), - linux_surface: z.record(z.any()), - ioctl_candidates: z.array(z.record(z.any())), - device_interfaces: z.array(z.record(z.any())), - dispatch_hints: z.array(z.record(z.any())), - module_metadata: z.array(z.record(z.any())), - risky_primitives: z.array(z.record(z.any())), - risk_flags: z.array(z.record(z.any())), - risk_summary: z.record(z.any()), + container: z.record(z.string(), z.any()), + evidence: z.array(z.record(z.string(), z.any())), + windows_surface: z.record(z.string(), z.any()), + linux_surface: z.record(z.string(), z.any()), + ioctl_candidates: z.array(z.record(z.string(), z.any())), + device_interfaces: z.array(z.record(z.string(), z.any())), + dispatch_hints: z.array(z.record(z.string(), z.any())), + module_metadata: z.array(z.record(z.string(), z.any())), + risky_primitives: z.array(z.record(z.string(), z.any())), + risk_flags: z.array(z.record(z.string(), z.any())), + risk_summary: z.record(z.string(), z.any()), policy: KernelDriverPolicySchema, summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), - evidence_summary: z.record(z.any()), - workflow_handoff: z.record(z.any()), - quality_gates: z.record(z.any()), + evidence_summary: z.record(z.string(), z.any()), + workflow_handoff: z.record(z.string(), z.any()), + quality_gates: z.record(z.string(), z.any()), }) export const KernelDriverSurfaceInventoryInputSchema = z.object({ diff --git a/src/plugins/linux-binary/tools/linux-binary-inventory.ts b/src/plugins/linux-binary/tools/linux-binary-inventory.ts index d0b66c5b..91ebd5dd 100644 --- a/src/plugins/linux-binary/tools/linux-binary-inventory.ts +++ b/src/plugins/linux-binary/tools/linux-binary-inventory.ts @@ -104,9 +104,9 @@ const LinuxBinaryInventoryDataSchema = z.object({ nested_binary_candidates: z.array(LinuxBinaryCandidateSchema), policy: LinuxBinaryPolicySchema, unsupported_detail: z.string().optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), diff --git a/src/plugins/llvm-bitcode/tools/llvm-bitcode-inventory.ts b/src/plugins/llvm-bitcode/tools/llvm-bitcode-inventory.ts index 3d59dd57..d5c222ca 100644 --- a/src/plugins/llvm-bitcode/tools/llvm-bitcode-inventory.ts +++ b/src/plugins/llvm-bitcode/tools/llvm-bitcode-inventory.ts @@ -80,19 +80,19 @@ const LlvmBitcodeInventorySchema = z.object({ confidence: z.enum(['low', 'medium', 'high']), size: z.number().optional(), preview_size: z.number(), - container: z.record(z.any()), - bitstream: z.record(z.any()), - llvm_ir_hints: z.record(z.any()), - embedded_strings: z.record(z.any()), - risk_flags: z.array(z.record(z.any())), - risk_summary: z.record(z.any()), + container: z.record(z.string(), z.any()), + bitstream: z.record(z.string(), z.any()), + llvm_ir_hints: z.record(z.string(), z.any()), + embedded_strings: z.record(z.string(), z.any()), + risk_flags: z.array(z.record(z.string(), z.any())), + risk_summary: z.record(z.string(), z.any()), policy: LlvmBitcodePolicySchema, summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), - evidence_summary: z.record(z.any()), - workflow_handoff: z.record(z.any()), - quality_gates: z.record(z.any()), + evidence_summary: z.record(z.string(), z.any()), + workflow_handoff: z.record(z.string(), z.any()), + quality_gates: z.record(z.string(), z.any()), }) export const LlvmBitcodeInventoryInputSchema = z.object({ diff --git a/src/plugins/malware/tools/malware-intel-loop.ts b/src/plugins/malware/tools/malware-intel-loop.ts index cabc4030..e84af61b 100644 --- a/src/plugins/malware/tools/malware-intel-loop.ts +++ b/src/plugins/malware/tools/malware-intel-loop.ts @@ -17,7 +17,7 @@ export const MalwareIntelLoopInputSchema = z export const MalwareIntelLoopOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), errors: z.array(z.string()).optional(), metrics: z.object({ elapsed_ms: z.number(), tool: z.string() }).optional(), }) diff --git a/src/plugins/managed-fake-c2/tools/fake-c2.ts b/src/plugins/managed-fake-c2/tools/fake-c2.ts index 872d415c..f3ae4536 100644 --- a/src/plugins/managed-fake-c2/tools/fake-c2.ts +++ b/src/plugins/managed-fake-c2/tools/fake-c2.ts @@ -105,7 +105,7 @@ export const FakeC2InputSchema = z.object({ .describe('Required true after reviewing debug.network.plan/tool.readiness.'), }) -export const FakeC2OutputSchema = createWorkerResultOutputSchema(z.record(z.any())) +export const FakeC2OutputSchema = createWorkerResultOutputSchema(z.record(z.string(), z.any())) export const FAKE_C2_RUNTIME_POLICY: FakeC2RuntimePolicy = { passiveByDefault: true, diff --git a/src/plugins/managed-il-xrefs/tools/il-xrefs.ts b/src/plugins/managed-il-xrefs/tools/il-xrefs.ts index 83a82255..8b7aff3f 100644 --- a/src/plugins/managed-il-xrefs/tools/il-xrefs.ts +++ b/src/plugins/managed-il-xrefs/tools/il-xrefs.ts @@ -47,7 +47,7 @@ export const IlXrefsInputSchema = z.object({ .describe('Maximum cross-references to return'), }) -export const IlXrefsOutputSchema = createWorkerResultOutputSchema(z.record(z.any())) +export const IlXrefsOutputSchema = createWorkerResultOutputSchema(z.record(z.string(), z.any())) export const ilXrefsToolDefinition: ToolDefinition = { name: TOOL_NAME, diff --git a/src/plugins/managed-il-xrefs/tools/token-xrefs.ts b/src/plugins/managed-il-xrefs/tools/token-xrefs.ts index ac1cb1f1..9ee4a109 100644 --- a/src/plugins/managed-il-xrefs/tools/token-xrefs.ts +++ b/src/plugins/managed-il-xrefs/tools/token-xrefs.ts @@ -51,7 +51,7 @@ export const TokenXrefsInputSchema = z.object({ max_nodes: z.number().min(1).max(2000).default(500).describe('Maximum graph nodes to return'), }) -export const TokenXrefsOutputSchema = createWorkerResultOutputSchema(z.record(z.any())) +export const TokenXrefsOutputSchema = createWorkerResultOutputSchema(z.record(z.string(), z.any())) export const tokenXrefsToolDefinition: ToolDefinition = { name: TOOL_NAME, diff --git a/src/plugins/managed-sandbox/tools/safe-run.ts b/src/plugins/managed-sandbox/tools/safe-run.ts index bcd311fc..3ff1ce7d 100644 --- a/src/plugins/managed-sandbox/tools/safe-run.ts +++ b/src/plugins/managed-sandbox/tools/safe-run.ts @@ -71,7 +71,7 @@ export const SafeRunInputSchema = z.object({ export const SafeRunSuccessOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.unknown()).optional(), + data: z.record(z.string(), z.unknown()).optional(), warnings: z.array(z.string()).optional(), errors: z.array(z.string()).optional(), artifacts: z.array(z.any()).optional(), diff --git a/src/plugins/memory-forensics/memory-correlation.ts b/src/plugins/memory-forensics/memory-correlation.ts index f33b33b4..bcd89e00 100644 --- a/src/plugins/memory-forensics/memory-correlation.ts +++ b/src/plugins/memory-forensics/memory-correlation.ts @@ -9,7 +9,7 @@ export const MemoryCorrelationInputSchema = z netscan: z.any().optional(), hivelist: z.any().optional(), cmdline: z.any().optional(), - sources: z.record(z.any()).optional(), + sources: z.record(z.string(), z.any()).optional(), }) .passthrough() @@ -17,14 +17,14 @@ export const MemoryCorrelationOutputSchema = z .object({ result_mode: z.literal('memory_forensics_correlation'), sample_id: z.string().nullable(), - finding_bundle: z.record(z.any()), - ioc_candidates: z.array(z.record(z.any())), - behavior_timeline: z.array(z.record(z.any())), - correlation_graph: z.record(z.any()), - provenance_graph: z.record(z.any()), - evidence_summary: z.record(z.any()), - workflow_handoff: z.record(z.any()), - quality_gates: z.record(z.any()), + finding_bundle: z.record(z.string(), z.any()), + ioc_candidates: z.array(z.record(z.string(), z.any())), + behavior_timeline: z.array(z.record(z.string(), z.any())), + correlation_graph: z.record(z.string(), z.any()), + provenance_graph: z.record(z.string(), z.any()), + evidence_summary: z.record(z.string(), z.any()), + workflow_handoff: z.record(z.string(), z.any()), + quality_gates: z.record(z.string(), z.any()), recommended_next_tools: z.array(z.string()), safety_notes: z.array(z.string()), }) diff --git a/src/plugins/metadata/tools/metadata-extract.ts b/src/plugins/metadata/tools/metadata-extract.ts index b7992596..25e63479 100644 --- a/src/plugins/metadata/tools/metadata-extract.ts +++ b/src/plugins/metadata/tools/metadata-extract.ts @@ -148,11 +148,11 @@ export const metadataExtractOutputSchema = z.object({ file_type: z.string().optional(), mime_type: z.string().optional(), file_size: z.string().optional(), - metadata: z.record(z.any()).optional(), + metadata: z.record(z.string(), z.any()).optional(), artifact: ArtifactRefSchema.optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), diff --git a/src/plugins/ml-model/tools/ml-model-inventory.ts b/src/plugins/ml-model/tools/ml-model-inventory.ts index 5fd14ac4..83c63bae 100644 --- a/src/plugins/ml-model/tools/ml-model-inventory.ts +++ b/src/plugins/ml-model/tools/ml-model-inventory.ts @@ -95,20 +95,20 @@ const MlModelInventorySchema = z.object({ size: z.number().optional(), preview_size: z.number(), sha256_preview: z.string(), - file_profile: z.record(z.any()), - inventory: z.record(z.any()), - metadata: z.record(z.any()), - structure: z.record(z.any()), - pickle_profile: z.record(z.any()), - risk_signals: z.array(z.record(z.any())), - risk_summary: z.record(z.any()), + file_profile: z.record(z.string(), z.any()), + inventory: z.record(z.string(), z.any()), + metadata: z.record(z.string(), z.any()), + structure: z.record(z.string(), z.any()), + pickle_profile: z.record(z.string(), z.any()), + risk_signals: z.array(z.record(z.string(), z.any())), + risk_summary: z.record(z.string(), z.any()), policy: MlModelPolicySchema, summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), - evidence_summary: z.record(z.any()), - workflow_handoff: z.record(z.any()), - quality_gates: z.record(z.any()), + evidence_summary: z.record(z.string(), z.any()), + workflow_handoff: z.record(z.string(), z.any()), + quality_gates: z.record(z.string(), z.any()), }) export const MlModelInventoryInputSchema = z.object({ diff --git a/src/plugins/native-debug-types/tools/native-debug-types-inventory.ts b/src/plugins/native-debug-types/tools/native-debug-types-inventory.ts index df96481b..00574ecb 100644 --- a/src/plugins/native-debug-types/tools/native-debug-types-inventory.ts +++ b/src/plugins/native-debug-types/tools/native-debug-types-inventory.ts @@ -116,23 +116,23 @@ const NativeDebugTypesInventorySchema = z.object({ confidence: z.enum(['low', 'medium', 'high']), size: z.number().optional(), preview_size: z.number(), - container: z.record(z.any()), - debug_sections: z.record(z.any()), - dwarf: z.record(z.any()), - split_dwarf: z.record(z.any()), - ctf: z.record(z.any()), - source_profile: z.record(z.any()), - type_graph_seeds: z.record(z.any()), - risk_flags: z.array(z.record(z.any())), - risk_summary: z.record(z.any()), - symbol_server_plan: z.record(z.any()), + container: z.record(z.string(), z.any()), + debug_sections: z.record(z.string(), z.any()), + dwarf: z.record(z.string(), z.any()), + split_dwarf: z.record(z.string(), z.any()), + ctf: z.record(z.string(), z.any()), + source_profile: z.record(z.string(), z.any()), + type_graph_seeds: z.record(z.string(), z.any()), + risk_flags: z.array(z.record(z.string(), z.any())), + risk_summary: z.record(z.string(), z.any()), + symbol_server_plan: z.record(z.string(), z.any()), policy: NativeDebugTypesPolicySchema, summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), - evidence_summary: z.record(z.any()), - workflow_handoff: z.record(z.any()), - quality_gates: z.record(z.any()), + evidence_summary: z.record(z.string(), z.any()), + workflow_handoff: z.record(z.string(), z.any()), + quality_gates: z.record(z.string(), z.any()), }) export const NativeDebugTypesInventoryInputSchema = z.object({ diff --git a/src/plugins/native-object/tools/native-object-inventory.ts b/src/plugins/native-object/tools/native-object-inventory.ts index 07296140..487b8ecc 100644 --- a/src/plugins/native-object/tools/native-object-inventory.ts +++ b/src/plugins/native-object/tools/native-object-inventory.ts @@ -68,7 +68,7 @@ const NativeObjectInventoryDataSchema = z.object({ workflow_handoff: z .object({ schema: z.literal(NATIVE_OBJECT_WORKFLOW_HANDOFF_SCHEMA), - artifact_contract: z.record(z.any()), + artifact_contract: z.record(z.string(), z.any()), dynamic_boundary: z .object({ sample_execution_allowed: z.literal(false), @@ -85,7 +85,7 @@ const NativeObjectInventoryDataSchema = z.object({ network_used_by_tool: z.literal(false), }) .passthrough(), - routing: z.array(z.record(z.any())), + routing: z.array(z.record(z.string(), z.any())), }) .passthrough() .optional(), diff --git a/src/plugins/office-analysis/tools/office-behavior-profile.ts b/src/plugins/office-analysis/tools/office-behavior-profile.ts index 62b35761..0eafa949 100644 --- a/src/plugins/office-analysis/tools/office-behavior-profile.ts +++ b/src/plugins/office-analysis/tools/office-behavior-profile.ts @@ -32,7 +32,7 @@ export const OfficeBehaviorProfileInputSchema = z export const OfficeBehaviorProfileOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), errors: z.array(z.string()).optional(), metrics: z.object({ elapsed_ms: z.number(), tool: z.string() }).optional(), }) diff --git a/src/plugins/office-analysis/tools/office-macro-detect.ts b/src/plugins/office-analysis/tools/office-macro-detect.ts index 4a8d5d6b..b40a9c43 100644 --- a/src/plugins/office-analysis/tools/office-macro-detect.ts +++ b/src/plugins/office-analysis/tools/office-macro-detect.ts @@ -65,9 +65,9 @@ export const officeMacroDetectOutputSchema = z.object({ }) .optional(), risk_level: z.enum(['safe', 'low', 'medium', 'high']).optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), artifact: ArtifactRefSchema.optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), diff --git a/src/plugins/office-analysis/tools/office-ole-analyze.ts b/src/plugins/office-analysis/tools/office-ole-analyze.ts index 9ba5b249..10190004 100644 --- a/src/plugins/office-analysis/tools/office-ole-analyze.ts +++ b/src/plugins/office-analysis/tools/office-ole-analyze.ts @@ -64,9 +64,9 @@ export const officeOleAnalyzeOutputSchema = z.object({ ) .optional(), rtf_objects: z.array(z.any()).optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), artifact: ArtifactRefSchema.optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), diff --git a/src/plugins/office-analysis/tools/office-vba-extract.ts b/src/plugins/office-analysis/tools/office-vba-extract.ts index bf40b697..8b8dc2a6 100644 --- a/src/plugins/office-analysis/tools/office-vba-extract.ts +++ b/src/plugins/office-analysis/tools/office-vba-extract.ts @@ -58,9 +58,9 @@ export const officeVbaExtractOutputSchema = z.object({ ) .optional(), suspicious_keywords: z.array(z.string()).optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), artifact: ArtifactRefSchema.optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), diff --git a/src/plugins/panda/tools/panda-inspect.ts b/src/plugins/panda/tools/panda-inspect.ts index 3dd2cd13..be532120 100644 --- a/src/plugins/panda/tools/panda-inspect.ts +++ b/src/plugins/panda/tools/panda-inspect.ts @@ -42,13 +42,13 @@ export const pandaInspectOutputSchema = z.object({ status: z.enum(['ready', 'setup_required']), backend: BackendSchema, sample_id: z.string().nullable().optional(), - readiness: z.record(z.any()).optional(), - policy: z.record(z.any()).optional(), - execution_semantics: z.record(z.any()).optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), - details: z.record(z.any()).optional(), + readiness: z.record(z.string(), z.any()).optional(), + policy: z.record(z.string(), z.any()).optional(), + execution_semantics: z.record(z.string(), z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), + details: z.record(z.string(), z.any()).optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), diff --git a/src/plugins/pcap-analysis/tools/pcap-analyze.ts b/src/plugins/pcap-analysis/tools/pcap-analyze.ts index c8d299e0..443aa0bf 100644 --- a/src/plugins/pcap-analysis/tools/pcap-analyze.ts +++ b/src/plugins/pcap-analysis/tools/pcap-analyze.ts @@ -43,9 +43,9 @@ export const pcapAnalyzeOutputSchema = z.object({ conversations: z.string().optional(), endpoints: z.string().optional(), artifact: ArtifactRefSchema.optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), diff --git a/src/plugins/pcap-analysis/tools/pcap-dns-list.ts b/src/plugins/pcap-analysis/tools/pcap-dns-list.ts index 45156e99..d9f7bfcf 100644 --- a/src/plugins/pcap-analysis/tools/pcap-dns-list.ts +++ b/src/plugins/pcap-analysis/tools/pcap-dns-list.ts @@ -49,9 +49,9 @@ export const pcapDnsListOutputSchema = z.object({ ) .optional(), artifact: ArtifactRefSchema.optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), diff --git a/src/plugins/pcap-analysis/tools/pcap-extract-streams.ts b/src/plugins/pcap-analysis/tools/pcap-extract-streams.ts index d0ba6d44..f6929d74 100644 --- a/src/plugins/pcap-analysis/tools/pcap-extract-streams.ts +++ b/src/plugins/pcap-analysis/tools/pcap-extract-streams.ts @@ -59,9 +59,9 @@ export const pcapExtractStreamsOutputSchema = z.object({ ) .optional(), artifact: ArtifactRefSchema.optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), diff --git a/src/plugins/pe-analysis/tools/pe-pdata-extract.ts b/src/plugins/pe-analysis/tools/pe-pdata-extract.ts index b912f88d..0deebf0b 100644 --- a/src/plugins/pe-analysis/tools/pe-pdata-extract.ts +++ b/src/plugins/pe-analysis/tools/pe-pdata-extract.ts @@ -115,9 +115,9 @@ export const pePdataExtractOutputSchema = z.object({ skipped_existing_function_count: z.number().int().nonnegative().optional(), function_index_status: z.enum(['ready', 'unchanged', 'empty', 'skipped']).optional(), analysis_id: z.string().optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), recommended_next_tools: z.array(z.string()).optional(), next_actions: z.array(z.string()).optional(), }) diff --git a/src/plugins/pe-analysis/tools/pe-security-profile.ts b/src/plugins/pe-analysis/tools/pe-security-profile.ts index accc9cd4..cac452c2 100644 --- a/src/plugins/pe-analysis/tools/pe-security-profile.ts +++ b/src/plugins/pe-analysis/tools/pe-security-profile.ts @@ -119,7 +119,7 @@ const PESecurityProfileDataSchema = z.object({ characteristics: z.number(), dll_characteristics: z.number(), dll_characteristics_flags: z.array(z.string()), - mitigations: z.record(MitigationSchema), + mitigations: z.record(z.string(), MitigationSchema), data_directories: z.object({ exception: DirectorySchema, security: DirectorySchema, @@ -143,10 +143,10 @@ const PESecurityProfileDataSchema = z.object({ callback_rvas: z.array(z.number()), }), sections: z.array(SectionSchema), - section_risks: z.array(z.record(z.any())), + section_risks: z.array(z.record(z.string(), z.any())), risk_score: z.number(), posture: z.enum(['low-risk', 'medium-risk', 'high-risk']), - risk_factors: z.array(z.record(z.any())), + risk_factors: z.array(z.record(z.string(), z.any())), policy: z.object({ passive: z.literal(true), no_execute: z.literal(true), @@ -154,9 +154,9 @@ const PESecurityProfileDataSchema = z.object({ no_network: z.literal(true), no_mutation: z.literal(true), }), - evidence_summary: z.record(z.any()), - workflow_handoff: z.record(z.any()), - quality_gates: z.record(z.any()), + evidence_summary: z.record(z.string(), z.any()), + workflow_handoff: z.record(z.string(), z.any()), + quality_gates: z.record(z.string(), z.any()), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), }) diff --git a/src/plugins/pe-analysis/tools/pe-structure-analyze.ts b/src/plugins/pe-analysis/tools/pe-structure-analyze.ts index e02322c0..737bbe62 100644 --- a/src/plugins/pe-analysis/tools/pe-structure-analyze.ts +++ b/src/plugins/pe-analysis/tools/pe-structure-analyze.ts @@ -63,7 +63,7 @@ export const PEStructureAnalyzeDataSchema = z.object({ exports: z.any(), resources: z.any(), overlay: z.any(), - backend_details: z.record(z.any()), + backend_details: z.record(z.string(), z.any()), confidence_semantics: ConfidenceSemanticsSchema.nullable(), analysis_id: z.string().optional(), artifact: z diff --git a/src/plugins/pe-analysis/tools/pe-symbols-recover.ts b/src/plugins/pe-analysis/tools/pe-symbols-recover.ts index b65278f8..b4537e94 100644 --- a/src/plugins/pe-analysis/tools/pe-symbols-recover.ts +++ b/src/plugins/pe-analysis/tools/pe-symbols-recover.ts @@ -94,9 +94,9 @@ export const peSymbolsRecoverOutputSchema = z.object({ count: z.number(), symbols: z.array(recoveredSymbolSchema), warnings: z.array(z.string()), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), recommended_next_tools: z.array(z.string()).optional(), next_actions: z.array(z.string()).optional(), }) diff --git a/src/plugins/qiling/tools/qiling-inspect.ts b/src/plugins/qiling/tools/qiling-inspect.ts index 569d3279..cd5870d5 100644 --- a/src/plugins/qiling/tools/qiling-inspect.ts +++ b/src/plugins/qiling/tools/qiling-inspect.ts @@ -63,13 +63,13 @@ export const qilingInspectOutputSchema = z.object({ rootfs_exists: z.boolean().optional(), rootfs_path: z.string().nullable().optional(), windows_rootfs_kernel32_present: z.boolean().optional(), - readiness: z.record(z.any()).optional(), - policy: z.record(z.any()).optional(), - execution_semantics: z.record(z.any()).optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), - details: z.record(z.any()).optional(), + readiness: z.record(z.string(), z.any()).optional(), + policy: z.record(z.string(), z.any()).optional(), + execution_semantics: z.record(z.string(), z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), + details: z.record(z.string(), z.any()).optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), diff --git a/src/plugins/reporting/tools/report-summarize.ts b/src/plugins/reporting/tools/report-summarize.ts index fee2bdf0..1fbe5623 100644 --- a/src/plugins/reporting/tools/report-summarize.ts +++ b/src/plugins/reporting/tools/report-summarize.ts @@ -2480,7 +2480,7 @@ export function createReportSummarizeHandler( const unpackDebugDiffs = unpackDebugDiffSelection.artifacts .map((item) => AnalysisDiffDigestSchema.safeParse(item.payload)) .filter( - (parsed): parsed is z.SafeParseSuccess> => + (parsed): parsed is z.ZodSafeParseSuccess> => parsed.success ) .map((parsed) => parsed.data) @@ -2971,7 +2971,7 @@ export function createReportSummarizeHandler( } catch (error) { if (error instanceof z.ZodError) { const invalidMode = error.issues.find( - (issue) => issue.path[0] === 'mode' && issue.code === z.ZodIssueCode.invalid_enum_value + (issue) => issue.path[0] === 'mode' && issue.code === 'invalid_value' ) if (invalidMode) { return { diff --git a/src/plugins/retdec/tools/retdec-decompile.ts b/src/plugins/retdec/tools/retdec-decompile.ts index d162be90..378c3b67 100644 --- a/src/plugins/retdec/tools/retdec-decompile.ts +++ b/src/plugins/retdec/tools/retdec-decompile.ts @@ -83,9 +83,9 @@ export const retdecDecompileOutputSchema = z.object({ .optional(), artifact: ArtifactRefSchema.optional(), supporting_artifacts: z.array(ArtifactRefSchema).optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), diff --git a/src/plugins/rizin/tools/rizin-analyze.ts b/src/plugins/rizin/tools/rizin-analyze.ts index ba13543c..d6680ddd 100644 --- a/src/plugins/rizin/tools/rizin-analyze.ts +++ b/src/plugins/rizin/tools/rizin-analyze.ts @@ -91,9 +91,9 @@ export const rizinAnalyzeOutputSchema = z.object({ item_count: z.number().int().nonnegative().optional(), preview: z.any().optional(), artifact: ArtifactRefSchema.optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), diff --git a/src/plugins/runtime-plan.ts b/src/plugins/runtime-plan.ts index 5a68aaca..31706f09 100644 --- a/src/plugins/runtime-plan.ts +++ b/src/plugins/runtime-plan.ts @@ -94,12 +94,12 @@ export const RuntimePlanInputSchema = z.object({ export const RuntimePlanOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), warnings: z.array(z.string()).optional(), errors: z.array(z.string()).optional(), artifacts: z.array(z.any()).optional(), evidence: z.array(z.any()).optional(), - metrics: z.record(z.any()).optional(), + metrics: z.record(z.string(), z.any()).optional(), }) export type RuntimePlanInput = z.infer diff --git a/src/plugins/rust-binary/tools/rust-binary-inventory.ts b/src/plugins/rust-binary/tools/rust-binary-inventory.ts index 064823a6..bf8b63af 100644 --- a/src/plugins/rust-binary/tools/rust-binary-inventory.ts +++ b/src/plugins/rust-binary/tools/rust-binary-inventory.ts @@ -85,24 +85,24 @@ const RustBinaryInventorySchema = z.object({ confidence: z.enum(['low', 'medium', 'high']), size: z.number().optional(), preview_size: z.number(), - container: z.record(z.any()), - rustc_candidates: z.array(z.record(z.any())), - cargo_markers: z.array(z.record(z.any())), - crate_candidates: z.array(z.record(z.any())), - target_triples: z.array(z.record(z.any())), - symbol_mangling: z.record(z.any()), - runtime_markers: z.array(z.record(z.any())), - panic_profile: z.record(z.any()), - ecosystem_markers: z.array(z.record(z.any())), - provenance_markers: z.array(z.record(z.any())), - risk_flags: z.array(z.record(z.any())), + container: z.record(z.string(), z.any()), + rustc_candidates: z.array(z.record(z.string(), z.any())), + cargo_markers: z.array(z.record(z.string(), z.any())), + crate_candidates: z.array(z.record(z.string(), z.any())), + target_triples: z.array(z.record(z.string(), z.any())), + symbol_mangling: z.record(z.string(), z.any()), + runtime_markers: z.array(z.record(z.string(), z.any())), + panic_profile: z.record(z.string(), z.any()), + ecosystem_markers: z.array(z.record(z.string(), z.any())), + provenance_markers: z.array(z.record(z.string(), z.any())), + risk_flags: z.array(z.record(z.string(), z.any())), policy: RustBinaryPolicySchema, summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), - evidence_summary: z.record(z.any()), - workflow_handoff: z.record(z.any()), - quality_gates: z.record(z.any()), + evidence_summary: z.record(z.string(), z.any()), + workflow_handoff: z.record(z.string(), z.any()), + quality_gates: z.record(z.string(), z.any()), }) export const RustBinaryInventoryInputSchema = z.object({ diff --git a/src/plugins/sbom/tools/sbom-provenance-graph.ts b/src/plugins/sbom/tools/sbom-provenance-graph.ts index b157e258..982ad73d 100644 --- a/src/plugins/sbom/tools/sbom-provenance-graph.ts +++ b/src/plugins/sbom/tools/sbom-provenance-graph.ts @@ -7,12 +7,12 @@ export const SbomProvenanceGraphInputSchema = z .object({ sample_id: z.string().optional().describe('Optional sample ID for graph metadata.'), sources: z - .record(z.any()) + .record(z.string(), z.any()) .optional() .default({}) .describe('Inventory outputs keyed by source tool or inventory family.'), components: z - .array(z.record(z.any())) + .array(z.record(z.string(), z.any())) .optional() .default([]) .describe('Optional explicit component rows to merge into the graph.'), @@ -26,7 +26,7 @@ export const SbomProvenanceGraphInputSchema = z export const SbomProvenanceGraphOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), warnings: z.array(z.string()).optional(), errors: z.array(z.string()).optional(), metrics: z.object({ elapsed_ms: z.number(), tool: z.string() }).optional(), diff --git a/src/plugins/sdk.ts b/src/plugins/sdk.ts index 4f9825ba..03662d15 100644 --- a/src/plugins/sdk.ts +++ b/src/plugins/sdk.ts @@ -16,7 +16,7 @@ export const ArtifactRefSchema = z path: z.string(), sha256: z.string(), mime: z.string().optional(), - metadata: z.record(z.any()).optional(), + metadata: z.record(z.string(), z.any()).optional(), }) .passthrough() @@ -36,7 +36,7 @@ export const EvidenceRefSchema = z sampleId: z.string().optional(), artifactRefs: z.array(ArtifactRefSchema).optional(), confidence: z.number().min(0).max(1).optional(), - metadata: z.record(z.any()).optional(), + metadata: z.record(z.string(), z.any()).optional(), }) .passthrough() @@ -52,7 +52,7 @@ export const EvidenceTimelineEntrySchema = z target: z.string().optional(), confidence: z.number().min(0).max(1).optional(), artifactRefs: z.array(ArtifactRefSchema).optional(), - metadata: z.record(z.any()).optional(), + metadata: z.record(z.string(), z.any()).optional(), }) .passthrough() diff --git a/src/plugins/shader-ir/tools/shader-ir-inventory.ts b/src/plugins/shader-ir/tools/shader-ir-inventory.ts index 9b90b894..a12ea203 100644 --- a/src/plugins/shader-ir/tools/shader-ir-inventory.ts +++ b/src/plugins/shader-ir/tools/shader-ir-inventory.ts @@ -207,20 +207,20 @@ const ShaderIrInventorySchema = z.object({ is_shader_candidate: z.boolean(), confidence: z.number().min(0).max(1), detected_by: z.array(z.string()), - structure: z.record(z.any()), + structure: z.record(z.string(), z.any()), shader_stages: z.array(z.string()), - entry_points: z.array(z.record(z.any())), - resource_hints: z.array(z.record(z.any())), - embedded_strings: z.record(z.any()), - risk_flags: z.array(z.record(z.any())), - risk_summary: z.record(z.any()), + entry_points: z.array(z.record(z.string(), z.any())), + resource_hints: z.array(z.record(z.string(), z.any())), + embedded_strings: z.record(z.string(), z.any()), + risk_flags: z.array(z.record(z.string(), z.any())), + risk_summary: z.record(z.string(), z.any()), policy: ShaderIrPolicySchema, summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), - evidence_summary: z.record(z.any()), - workflow_handoff: z.record(z.any()), - quality_gates: z.record(z.any()), + evidence_summary: z.record(z.string(), z.any()), + workflow_handoff: z.record(z.string(), z.any()), + quality_gates: z.record(z.string(), z.any()), }) export const ShaderIrInventoryInputSchema = z.object({ diff --git a/src/plugins/similarity/tools/sample-family-cluster.ts b/src/plugins/similarity/tools/sample-family-cluster.ts index b420c94e..afbf1487 100644 --- a/src/plugins/similarity/tools/sample-family-cluster.ts +++ b/src/plugins/similarity/tools/sample-family-cluster.ts @@ -14,8 +14,8 @@ const SAMPLE_FAMILY_CLUSTER_RECOMMENDED_NEXT_TOOLS = [ export const SampleFamilyClusterInputSchema = z .object({ - samples: z.array(z.record(z.any())).min(1).default([]), - binary_diffs: z.array(z.record(z.any())).optional().default([]), + samples: z.array(z.record(z.string(), z.any())).min(1).default([]), + binary_diffs: z.array(z.record(z.string(), z.any())).optional().default([]), kb_context: z.any().optional(), min_shared_features: z.number().int().min(1).max(20).optional().default(2), }) @@ -27,14 +27,14 @@ const SampleFamilyClusterDataSchema = z tool_version: z.string(), result_mode: z.literal('sample_family_cluster'), cluster_count: z.number().int().nonnegative(), - clusters: z.array(z.record(z.any())), - relationships: z.array(z.record(z.any())), - evidence_summary: z.record(z.any()), - workflow_handoff: z.record(z.any()), - route_profile: z.record(z.any()), - quality_gates: z.record(z.any()), - kb_handoff: z.record(z.any()), - reporting_handoff: z.record(z.any()), + clusters: z.array(z.record(z.string(), z.any())), + relationships: z.array(z.record(z.string(), z.any())), + evidence_summary: z.record(z.string(), z.any()), + workflow_handoff: z.record(z.string(), z.any()), + route_profile: z.record(z.string(), z.any()), + quality_gates: z.record(z.string(), z.any()), + kb_handoff: z.record(z.string(), z.any()), + reporting_handoff: z.record(z.string(), z.any()), recommended_next_tools: z.array(z.string()), safety_notes: z.array(z.string()), }) diff --git a/src/plugins/speakeasy/tools/speakeasy-api-trace.ts b/src/plugins/speakeasy/tools/speakeasy-api-trace.ts index ef033620..79f3e5d4 100644 --- a/src/plugins/speakeasy/tools/speakeasy-api-trace.ts +++ b/src/plugins/speakeasy/tools/speakeasy-api-trace.ts @@ -58,7 +58,7 @@ export const speakeasyApiTraceOutputSchema = z.object({ filtered_count: z.number().optional(), api_trace: z.array(z.any()).optional(), unique_apis: z.array(z.string()).optional(), - module_histogram: z.record(z.number()).optional(), + module_histogram: z.record(z.string(), z.number()).optional(), artifact: ArtifactRefSchema.optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), diff --git a/src/plugins/static-triage/tools/compiler-packer-detect.ts b/src/plugins/static-triage/tools/compiler-packer-detect.ts index d93df2b8..edabc917 100644 --- a/src/plugins/static-triage/tools/compiler-packer-detect.ts +++ b/src/plugins/static-triage/tools/compiler-packer-detect.ts @@ -94,9 +94,9 @@ export const CompilerPackerDetectDataSchema = z.object({ }) .optional(), raw_backend: z.any().nullable().optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), recommended_next_tools: z.array(z.string()).optional(), next_actions: z.array(z.string()).optional(), }) diff --git a/src/plugins/static-triage/tools/entropy-analyze.ts b/src/plugins/static-triage/tools/entropy-analyze.ts index 4e0b7da4..7e10e761 100644 --- a/src/plugins/static-triage/tools/entropy-analyze.ts +++ b/src/plugins/static-triage/tools/entropy-analyze.ts @@ -98,9 +98,9 @@ const EntropyAnalyzeDataSchema = z.object({ crypto_data_likelihood: z.string(), is_pe: z.boolean(), }), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), source_recommended_next_tools: z.array(z.string()).optional(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()).optional(), diff --git a/src/plugins/static-triage/tools/obfuscation-detect.ts b/src/plugins/static-triage/tools/obfuscation-detect.ts index 0123f023..4b54c6f4 100644 --- a/src/plugins/static-triage/tools/obfuscation-detect.ts +++ b/src/plugins/static-triage/tools/obfuscation-detect.ts @@ -40,7 +40,7 @@ export const ObfuscationDetectOutputSchema = z.object({ name: z.string(), confidence: z.number(), description: z.string(), - indicators: z.record(z.any()), + indicators: z.record(z.string(), z.any()), }) ), dotnet_specific: z.array(z.any()), diff --git a/src/plugins/static-triage/tools/packer-detect.ts b/src/plugins/static-triage/tools/packer-detect.ts index 702d4c24..1f55964a 100644 --- a/src/plugins/static-triage/tools/packer-detect.ts +++ b/src/plugins/static-triage/tools/packer-detect.ts @@ -78,14 +78,14 @@ export const PackerDetectOutputSchema = z.object({ method: z.string(), name: z.string(), confidence: z.number(), - details: z.record(z.any()), + details: z.record(z.string(), z.any()), }) ), methods: z.array(z.string()), - confidence_breakdown: z.record(z.number()).optional(), - feature_fusion: z.record(z.any()).optional(), - evidence: z.record(z.any()).optional(), - inference: z.record(z.any()).optional(), + confidence_breakdown: z.record(z.string(), z.number()).optional(), + feature_fusion: z.record(z.string(), z.any()).optional(), + evidence: z.record(z.string(), z.any()).optional(), + inference: z.record(z.string(), z.any()).optional(), }) .optional(), warnings: z.array(z.string()).optional(), diff --git a/src/plugins/static-triage/tools/static-behavior-classify.ts b/src/plugins/static-triage/tools/static-behavior-classify.ts index f9ace870..a06727ba 100644 --- a/src/plugins/static-triage/tools/static-behavior-classify.ts +++ b/src/plugins/static-triage/tools/static-behavior-classify.ts @@ -97,13 +97,13 @@ export const StaticBehaviorClassifyOutputSchema = createWorkerResultOutputSchema summary: z.object({ finding_count: z.number().int().nonnegative(), high_or_critical_count: z.number().int().nonnegative(), - by_category: z.record(z.number()), - by_severity: z.record(z.number()), + by_category: z.record(z.string(), z.number()), + by_severity: z.record(z.string(), z.number()), max_confidence: z.number(), }), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), findings: z.array( z .object({ diff --git a/src/plugins/static-triage/tools/static-capability-triage.ts b/src/plugins/static-triage/tools/static-capability-triage.ts index 53ae91e2..731ba2ce 100644 --- a/src/plugins/static-triage/tools/static-capability-triage.ts +++ b/src/plugins/static-triage/tools/static-capability-triage.ts @@ -85,7 +85,7 @@ export const StaticCapabilityTriageDataSchema = z.object({ sample_id: z.string(), capability_count: z.number().int().nonnegative(), behavior_namespaces: z.array(z.string()), - capability_groups: z.record(z.number().int().nonnegative()), + capability_groups: z.record(z.string(), z.number().int().nonnegative()), capabilities: z.array(CapabilityFindingSchema), summary: z.string(), backend: CapabilityBackendSchema, @@ -101,11 +101,11 @@ export const StaticCapabilityTriageDataSchema = z.object({ }) .optional(), raw_backend: z.any().nullable().optional(), - raw_backend_summary: z.record(z.unknown()).optional(), - evidence_summary: z.record(z.any()).optional(), - correlation_bundle: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + raw_backend_summary: z.record(z.string(), z.unknown()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + correlation_bundle: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), }) export const staticCapabilityTriageOutputSchema = z.object({ diff --git a/src/plugins/static-triage/tools/static-config-carver.ts b/src/plugins/static-triage/tools/static-config-carver.ts index 85a06403..a2a82906 100644 --- a/src/plugins/static-triage/tools/static-config-carver.ts +++ b/src/plugins/static-triage/tools/static-config-carver.ts @@ -29,11 +29,11 @@ export const StaticConfigCarverInputSchema = z.object({ export const StaticConfigCarverOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), warnings: z.array(z.string()).optional(), errors: z.array(z.string()).optional(), artifacts: z.array(z.any()).optional(), - metrics: z.record(z.any()).optional(), + metrics: z.record(z.string(), z.any()).optional(), }) export const staticConfigCarverToolDefinition: ToolDefinition = { diff --git a/src/plugins/static-triage/tools/static-resource-graph.ts b/src/plugins/static-triage/tools/static-resource-graph.ts index 0f9749ab..9d8c234c 100644 --- a/src/plugins/static-triage/tools/static-resource-graph.ts +++ b/src/plugins/static-triage/tools/static-resource-graph.ts @@ -83,11 +83,11 @@ export const StaticResourceGraphInputSchema = z.object({ export const StaticResourceGraphOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), warnings: z.array(z.string()).optional(), errors: z.array(z.string()).optional(), artifacts: z.array(z.any()).optional(), - metrics: z.record(z.any()).optional(), + metrics: z.record(z.string(), z.any()).optional(), }) export const staticResourceGraphToolDefinition: ToolDefinition = { diff --git a/src/plugins/strings/tools/strings-extract.ts b/src/plugins/strings/tools/strings-extract.ts index 8bc70710..a8ddecf0 100644 --- a/src/plugins/strings/tools/strings-extract.ts +++ b/src/plugins/strings/tools/strings-extract.ts @@ -178,9 +178,9 @@ export const StringsExtractOutputSchema = z.object({ evidence_state: z.array(AnalysisEvidenceStateSchema).optional(), recommended_next_tools: z.array(z.string()).optional(), next_actions: z.array(z.string()).optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), strings: z .array( z.object({ diff --git a/src/plugins/strings/tools/strings-floss-decode.ts b/src/plugins/strings/tools/strings-floss-decode.ts index 75bdde62..22df623d 100644 --- a/src/plugins/strings/tools/strings-floss-decode.ts +++ b/src/plugins/strings/tools/strings-floss-decode.ts @@ -108,9 +108,9 @@ export const StringsFlossDecodeOutputSchema = z.object({ polling_guidance: z.any().optional(), recommended_next_tools: z.array(z.string()).optional(), next_actions: z.array(z.string()).optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), decoded_strings: z .array( z.object({ diff --git a/src/plugins/syscall-abi-surface/tools/syscall-abi-surface-inventory.ts b/src/plugins/syscall-abi-surface/tools/syscall-abi-surface-inventory.ts index 4c82698c..cba078c6 100644 --- a/src/plugins/syscall-abi-surface/tools/syscall-abi-surface-inventory.ts +++ b/src/plugins/syscall-abi-surface/tools/syscall-abi-surface-inventory.ts @@ -214,23 +214,23 @@ const SyscallAbiInventorySchema = z.object({ confidence: z.enum(['low', 'medium', 'high']), size: z.number().optional(), preview_size: z.number(), - container: z.record(z.any()), - instruction_evidence: z.array(z.record(z.any())), - string_evidence: z.array(z.record(z.any())), - syscall_stubs: z.array(z.record(z.any())), - windows_nt_surface: z.record(z.any()), - linux_syscall_surface: z.record(z.any()), - mach_trap_surface: z.record(z.any()), - anti_analysis_surface: z.record(z.any()), - risk_flags: z.array(z.record(z.any())), - risk_summary: z.record(z.any()), + container: z.record(z.string(), z.any()), + instruction_evidence: z.array(z.record(z.string(), z.any())), + string_evidence: z.array(z.record(z.string(), z.any())), + syscall_stubs: z.array(z.record(z.string(), z.any())), + windows_nt_surface: z.record(z.string(), z.any()), + linux_syscall_surface: z.record(z.string(), z.any()), + mach_trap_surface: z.record(z.string(), z.any()), + anti_analysis_surface: z.record(z.string(), z.any()), + risk_flags: z.array(z.record(z.string(), z.any())), + risk_summary: z.record(z.string(), z.any()), policy: SyscallAbiPolicySchema, summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), - evidence_summary: z.record(z.any()), - workflow_handoff: z.record(z.any()), - quality_gates: z.record(z.any()), + evidence_summary: z.record(z.string(), z.any()), + workflow_handoff: z.record(z.string(), z.any()), + quality_gates: z.record(z.string(), z.any()), }) export const SyscallAbiSurfaceInventoryInputSchema = z.object({ diff --git a/src/plugins/tee-enclave/tools/tee-enclave-inventory.ts b/src/plugins/tee-enclave/tools/tee-enclave-inventory.ts index 138799ea..fbcd3798 100644 --- a/src/plugins/tee-enclave/tools/tee-enclave-inventory.ts +++ b/src/plugins/tee-enclave/tools/tee-enclave-inventory.ts @@ -135,23 +135,23 @@ const TeeEnclaveInventorySchema = z.object({ confidence: z.enum(['low', 'medium', 'high']), size: z.number().optional(), preview_size: z.number(), - container: z.record(z.any()), - enclave_families: z.array(z.record(z.any())), - attestation_hints: z.array(z.record(z.any())), - measurement_hints: z.array(z.record(z.any())), - entrypoint_hints: z.array(z.record(z.any())), - manifest_hints: z.array(z.record(z.any())), - boundary_hints: z.array(z.record(z.any())), - uuids: z.array(z.record(z.any())), - risk_flags: z.array(z.record(z.any())), - runtime_risk: z.record(z.any()), + container: z.record(z.string(), z.any()), + enclave_families: z.array(z.record(z.string(), z.any())), + attestation_hints: z.array(z.record(z.string(), z.any())), + measurement_hints: z.array(z.record(z.string(), z.any())), + entrypoint_hints: z.array(z.record(z.string(), z.any())), + manifest_hints: z.array(z.record(z.string(), z.any())), + boundary_hints: z.array(z.record(z.string(), z.any())), + uuids: z.array(z.record(z.string(), z.any())), + risk_flags: z.array(z.record(z.string(), z.any())), + runtime_risk: z.record(z.string(), z.any()), policy: TeePolicySchema, summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), - evidence_summary: z.record(z.any()), - workflow_handoff: z.record(z.any()), - quality_gates: z.record(z.any()), + evidence_summary: z.record(z.string(), z.any()), + workflow_handoff: z.record(z.string(), z.any()), + quality_gates: z.record(z.string(), z.any()), }) export const TeeEnclaveInventoryInputSchema = z.object({ diff --git a/src/plugins/threat-intel/tools/attack-map.ts b/src/plugins/threat-intel/tools/attack-map.ts index ca7f8177..1eb29a5d 100644 --- a/src/plugins/threat-intel/tools/attack-map.ts +++ b/src/plugins/threat-intel/tools/attack-map.ts @@ -77,7 +77,7 @@ export const AttackMapOutputSchema = z.object({ sample_id: z.string(), techniques: z.array(AttackTechniqueSchema), capability_clusters: z.array(CapabilityClusterSchema), - tactic_summary: z.record(z.number()), + tactic_summary: z.record(z.string(), z.number()), inference: z.object({ classification: z.enum(['benign', 'suspicious', 'malicious', 'unknown']), summary: z.string(), @@ -86,9 +86,9 @@ export const AttackMapOutputSchema = z.object({ execution_state: z.literal('completed').optional(), recommended_next_tools: z.array(z.string()).optional(), next_actions: z.array(z.string()).optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), }), z.object({ status: z.literal('queued'), @@ -100,7 +100,7 @@ export const AttackMapOutputSchema = z.object({ summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), - metadata: z.record(z.any()).optional(), + metadata: z.record(z.string(), z.any()).optional(), }), ]) .optional(), diff --git a/src/plugins/threat-intel/tools/ioc-export.ts b/src/plugins/threat-intel/tools/ioc-export.ts index cd06ce6e..0e86b783 100644 --- a/src/plugins/threat-intel/tools/ioc-export.ts +++ b/src/plugins/threat-intel/tools/ioc-export.ts @@ -80,9 +80,9 @@ export const IOCExportOutputSchema = z.object({ content: z.string(), mime_type: z.string(), attack_technique_count: z.number(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), recommended_next_tools: z.array(z.string()).optional(), next_actions: z.array(z.string()).optional(), artifact: z diff --git a/src/plugins/threat-intel/tools/sigma-rule-generate.ts b/src/plugins/threat-intel/tools/sigma-rule-generate.ts index 8103a032..a9e0c00c 100644 --- a/src/plugins/threat-intel/tools/sigma-rule-generate.ts +++ b/src/plugins/threat-intel/tools/sigma-rule-generate.ts @@ -58,9 +58,9 @@ export const SigmaRuleGenerateOutputSchema = z.object({ rules: z.array(GeneratedSigmaRuleSchema).optional(), total_rules: z.number().optional(), total_indicators: z.number().optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), recommended_next_tools: z.array(z.string()).optional(), next_actions: z.array(z.string()).optional(), }) diff --git a/src/plugins/uefi-smm-surface/tools/uefi-smm-surface-inventory.ts b/src/plugins/uefi-smm-surface/tools/uefi-smm-surface-inventory.ts index 08db7d98..6224b82d 100644 --- a/src/plugins/uefi-smm-surface/tools/uefi-smm-surface-inventory.ts +++ b/src/plugins/uefi-smm-surface/tools/uefi-smm-surface-inventory.ts @@ -192,23 +192,23 @@ const UefiSmmSurfaceInventorySchema = z.object({ confidence: z.enum(['low', 'medium', 'high']), size: z.number().optional(), preview_size: z.number(), - container: z.record(z.any()), - evidence: z.array(z.record(z.any())), - smm_surface: z.record(z.any()), - protocol_references: z.array(z.record(z.any())), - service_references: z.record(z.any()), - variable_surface: z.record(z.any()), - guid_references: z.array(z.record(z.any())), - low_level_primitives: z.array(z.record(z.any())), - risk_flags: z.array(z.record(z.any())), - risk_summary: z.record(z.any()), + container: z.record(z.string(), z.any()), + evidence: z.array(z.record(z.string(), z.any())), + smm_surface: z.record(z.string(), z.any()), + protocol_references: z.array(z.record(z.string(), z.any())), + service_references: z.record(z.string(), z.any()), + variable_surface: z.record(z.string(), z.any()), + guid_references: z.array(z.record(z.string(), z.any())), + low_level_primitives: z.array(z.record(z.string(), z.any())), + risk_flags: z.array(z.record(z.string(), z.any())), + risk_summary: z.record(z.string(), z.any()), policy: UefiSmmPolicySchema, summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), - evidence_summary: z.record(z.any()), - workflow_handoff: z.record(z.any()), - quality_gates: z.record(z.any()), + evidence_summary: z.record(z.string(), z.any()), + workflow_handoff: z.record(z.string(), z.any()), + quality_gates: z.record(z.string(), z.any()), }) export const UefiSmmSurfaceInventoryInputSchema = z.object({ diff --git a/src/plugins/unity-managed/tools/unity-metadata-inspect.ts b/src/plugins/unity-managed/tools/unity-metadata-inspect.ts index 9452f629..ad627d26 100644 --- a/src/plugins/unity-managed/tools/unity-metadata-inspect.ts +++ b/src/plugins/unity-managed/tools/unity-metadata-inspect.ts @@ -125,7 +125,7 @@ const UnityMetadataInventorySchema = z.object({ format: z.string(), detected_by: z.array(z.string()), size: z.number().optional(), - header: z.record(z.any()), + header: z.record(z.string(), z.any()), unity_version_hints: z.array(z.string()), managed_assembly_candidates: z.array(z.string()), il2cpp_candidates: z.array(z.string()), @@ -141,9 +141,9 @@ const UnityMetadataInventorySchema = z.object({ evidence: z.array(z.string()), policy: UnityPolicySchema, unsupported_detail: z.string().optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), diff --git a/src/plugins/unpacking/tools/unpack-child-handoff.ts b/src/plugins/unpacking/tools/unpack-child-handoff.ts index 1f63cc11..23b73215 100644 --- a/src/plugins/unpacking/tools/unpack-child-handoff.ts +++ b/src/plugins/unpacking/tools/unpack-child-handoff.ts @@ -107,8 +107,8 @@ export const UnpackChildHandoffOutputSchema = createWorkerResultOutputSchema( registered_child_count: z.number().int().nonnegative(), executable_like_count: z.number().int().nonnegative(), archive_like_count: z.number().int().nonnegative(), - by_source: z.record(z.number()), - by_magic: z.record(z.number()), + by_source: z.record(z.string(), z.number()), + by_magic: z.record(z.string(), z.number()), }), resource_artifact_ids: z.array(z.string()), candidates: z.array( diff --git a/src/plugins/unpacking/tools/unpack-workflow-plan.ts b/src/plugins/unpacking/tools/unpack-workflow-plan.ts index 07dd04de..258c92fd 100644 --- a/src/plugins/unpacking/tools/unpack-workflow-plan.ts +++ b/src/plugins/unpacking/tools/unpack-workflow-plan.ts @@ -17,7 +17,7 @@ export const UnpackWorkflowPlanInputSchema = z export const UnpackWorkflowPlanOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), errors: z.array(z.string()).optional(), metrics: z.object({ elapsed_ms: z.number(), tool: z.string() }).optional(), }) diff --git a/src/plugins/unpacking/unpack-debug-runtime.ts b/src/plugins/unpacking/unpack-debug-runtime.ts index 031773f8..2835a01f 100644 --- a/src/plugins/unpacking/unpack-debug-runtime.ts +++ b/src/plugins/unpacking/unpack-debug-runtime.ts @@ -148,7 +148,7 @@ export const DebugSessionRecordSchema = z.object({ session_tag: z.string().nullable(), artifact_refs: z.array(z.any()), guidance: DebugSessionGuidanceSchema, - metadata: z.record(z.any()).optional(), + metadata: z.record(z.string(), z.any()).optional(), created_at: z.string(), updated_at: z.string(), finished_at: z.string().nullable().optional(), diff --git a/src/plugins/upx/tools/upx-inspect.ts b/src/plugins/upx/tools/upx-inspect.ts index 81a08d98..41052494 100644 --- a/src/plugins/upx/tools/upx-inspect.ts +++ b/src/plugins/upx/tools/upx-inspect.ts @@ -66,9 +66,9 @@ export const upxInspectOutputSchema = z.object({ upx_detected: z.boolean().optional(), decompressed_artifact: ArtifactRefSchema.optional(), artifact: ArtifactRefSchema.optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), diff --git a/src/plugins/visualization/tools/behavior-timeline.ts b/src/plugins/visualization/tools/behavior-timeline.ts index cc30b000..67708d60 100644 --- a/src/plugins/visualization/tools/behavior-timeline.ts +++ b/src/plugins/visualization/tools/behavior-timeline.ts @@ -47,13 +47,13 @@ export const BehaviorTimelineOutputSchema = createWorkerResultOutputSchema( dominant_phase: z.string(), }) ), - phase_distribution: z.record(z.number()), + phase_distribution: z.record(z.string(), z.number()), timeline_buckets: z.array( z.object({ start_ms: z.number(), end_ms: z.number(), event_count: z.number().int().nonnegative(), - phases: z.record(z.number()), + phases: z.record(z.string(), z.number()), top_apis: z.array(z.object({ api: z.string(), count: z.number().int().nonnegative() })), }) ), diff --git a/src/plugins/visualization/tools/evidence-graph.ts b/src/plugins/visualization/tools/evidence-graph.ts index d42656ea..4429c96a 100644 --- a/src/plugins/visualization/tools/evidence-graph.ts +++ b/src/plugins/visualization/tools/evidence-graph.ts @@ -56,9 +56,9 @@ export const EvidenceGraphOutputSchema = createWorkerResultOutputSchema( edge_count: z.number().int().nonnegative(), corroboration_edge_count: z.number().int().nonnegative(), }), - plugin_evidence_summary: z.record(z.any()), - reporting_handoff: z.record(z.any()), - quality_gates: z.record(z.any()), + plugin_evidence_summary: z.record(z.string(), z.any()), + reporting_handoff: z.record(z.string(), z.any()), + quality_gates: z.record(z.string(), z.any()), dynamic_summary: z.any().nullable(), graph: z.any(), warnings: z.array(z.string()), diff --git a/src/plugins/visualization/tools/report-html-generate.ts b/src/plugins/visualization/tools/report-html-generate.ts index c45d2619..1c60b2a9 100644 --- a/src/plugins/visualization/tools/report-html-generate.ts +++ b/src/plugins/visualization/tools/report-html-generate.ts @@ -50,9 +50,9 @@ const HtmlReportWorkflowHandoffSchema = z source_tool: z.literal(TOOL_NAME), sample_id: z.string(), read_args: HtmlReportArtifactReadArgsSchema, - artifact_contract: z.record(z.any()), - routing: z.array(z.record(z.any())), - dynamic_boundary: z.record(z.any()), + artifact_contract: z.record(z.string(), z.any()), + routing: z.array(z.record(z.string(), z.any())), + dynamic_boundary: z.record(z.string(), z.any()), }) .passthrough() @@ -72,7 +72,7 @@ export const ReportHtmlGenerateOutputSchema = createWorkerResultOutputSchema( recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), workflow_handoff: HtmlReportWorkflowHandoffSchema, - quality_gates: z.record(z.any()), + quality_gates: z.record(z.string(), z.any()), }) ) diff --git a/src/plugins/vm-analysis/tools/vm-emulate.ts b/src/plugins/vm-analysis/tools/vm-emulate.ts index ae0d6603..c75ed621 100644 --- a/src/plugins/vm-analysis/tools/vm-emulate.ts +++ b/src/plugins/vm-analysis/tools/vm-emulate.ts @@ -15,7 +15,7 @@ export const vmEmulateInputSchema = z.object({ sample_id: z.string().describe('Sample ID (format: sha256:)'), bytecode_hex: z.string().describe('Hex-encoded VM bytecode to emulate'), initial_registers: z - .record(z.number()) + .record(z.string(), z.number()) .optional() .describe('Initial register values (e.g. {"r0": 1234, "r1": 0})'), max_steps: z diff --git a/src/plugins/vm-analysis/tools/vm-workflow-plan.ts b/src/plugins/vm-analysis/tools/vm-workflow-plan.ts index c06dd3c4..31bc3645 100644 --- a/src/plugins/vm-analysis/tools/vm-workflow-plan.ts +++ b/src/plugins/vm-analysis/tools/vm-workflow-plan.ts @@ -12,7 +12,7 @@ export const vmWorkflowPlanInputSchema = z.object({ export const vmWorkflowPlanOutputSchema = z.object({ ok: z.boolean(), - data: z.record(z.any()).optional(), + data: z.record(z.string(), z.any()).optional(), warnings: z.array(z.string()).optional(), errors: z.array(z.string()).optional(), metrics: z.object({ elapsed_ms: z.number(), tool: z.string() }).optional(), diff --git a/src/plugins/wasm-component/tools/wasm-component-inventory.ts b/src/plugins/wasm-component/tools/wasm-component-inventory.ts index 5f800a9d..f1175917 100644 --- a/src/plugins/wasm-component/tools/wasm-component-inventory.ts +++ b/src/plugins/wasm-component/tools/wasm-component-inventory.ts @@ -84,7 +84,7 @@ const WasmComponentInventorySchema = z.object({ count_hint: z.number().nullable(), }) ), - section_counts: z.record(z.number()), + section_counts: z.record(z.string(), z.number()), custom_sections: z.array(z.string()), imports: z.array( z.object({ diff --git a/src/plugins/wasm/tools/wasm-structure-analyze.ts b/src/plugins/wasm/tools/wasm-structure-analyze.ts index 49143c2e..e5673880 100644 --- a/src/plugins/wasm/tools/wasm-structure-analyze.ts +++ b/src/plugins/wasm/tools/wasm-structure-analyze.ts @@ -70,8 +70,8 @@ const WasmStructureDataSchema = z.object({ index: z.number(), }) ), - memory_declarations: z.array(z.record(z.any())), - table_declarations: z.array(z.record(z.any())), + memory_declarations: z.array(z.record(z.string(), z.any())), + table_declarations: z.array(z.record(z.string(), z.any())), start_function_index: z.number().nullable(), wasi_capability_hints: z.array(z.string()), capability_risk_summary: z.object({ diff --git a/src/plugins/windows-debug-symbols/tools/windows-debug-metadata-inspect.ts b/src/plugins/windows-debug-symbols/tools/windows-debug-metadata-inspect.ts index 415af41e..f337cd9c 100644 --- a/src/plugins/windows-debug-symbols/tools/windows-debug-metadata-inspect.ts +++ b/src/plugins/windows-debug-symbols/tools/windows-debug-metadata-inspect.ts @@ -77,7 +77,7 @@ const WindowsDebugMetadataSchema = z.object({ format: z.string(), detected_by: z.array(z.string()), size: z.number().optional(), - header: z.record(z.any()), + header: z.record(z.string(), z.any()), symbol_hints: z.array(z.string()), source_path_hints: z.array(z.string()), object_members: z.array(z.string()), @@ -106,7 +106,7 @@ const WindowsDebugMetadataSchema = z.object({ workflow_handoff: z .object({ schema: z.literal(WINDOWS_DEBUG_METADATA_WORKFLOW_HANDOFF_SCHEMA), - artifact_contract: z.record(z.any()), + artifact_contract: z.record(z.string(), z.any()), dynamic_boundary: z .object({ sample_execution_allowed: z.literal(false), @@ -121,7 +121,7 @@ const WindowsDebugMetadataSchema = z.object({ mutation_performed: z.literal(false), }) .passthrough(), - routing: z.array(z.record(z.any())), + routing: z.array(z.record(z.string(), z.any())), }) .passthrough() .optional(), diff --git a/src/plugins/windows-installer/tools/windows-installer-inventory.ts b/src/plugins/windows-installer/tools/windows-installer-inventory.ts index 9001484f..ba7f7c0b 100644 --- a/src/plugins/windows-installer/tools/windows-installer-inventory.ts +++ b/src/plugins/windows-installer/tools/windows-installer-inventory.ts @@ -40,14 +40,14 @@ const WindowsInstallerInventoryDataSchema = z.object({ detected_by: z.array(z.string()), size: z.number().optional(), archive_members: z.array(z.string()), - cab_summary: z.record(z.any()).optional(), + cab_summary: z.record(z.string(), z.any()).optional(), custom_action_candidates: z.array(z.string()), script_candidates: z.array(z.string()), nested_payload_candidates: z.array(NestedPayloadSchema), policy: WindowsInstallerPolicySchema, - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), unsupported_detail: z.string().optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), diff --git a/src/plugins/windows-interface-surface/tools/windows-interface-surface-inventory.ts b/src/plugins/windows-interface-surface/tools/windows-interface-surface-inventory.ts index 8329e492..e12d6dff 100644 --- a/src/plugins/windows-interface-surface/tools/windows-interface-surface-inventory.ts +++ b/src/plugins/windows-interface-surface/tools/windows-interface-surface-inventory.ts @@ -220,24 +220,24 @@ const InventorySchema = z.object({ confidence: z.enum(['low', 'medium', 'high']), size: z.number().optional(), preview_size: z.number(), - container: z.record(z.any()), - guid_evidence: z.array(z.record(z.any())), - string_evidence: z.array(z.record(z.any())), - com_surface: z.record(z.any()), - rpc_surface: z.record(z.any()), - ipc_surface: z.record(z.any()), - etw_surface: z.record(z.any()), - wmi_surface: z.record(z.any()), - service_surface: z.record(z.any()), - risk_flags: z.array(z.record(z.any())), - risk_summary: z.record(z.any()), + container: z.record(z.string(), z.any()), + guid_evidence: z.array(z.record(z.string(), z.any())), + string_evidence: z.array(z.record(z.string(), z.any())), + com_surface: z.record(z.string(), z.any()), + rpc_surface: z.record(z.string(), z.any()), + ipc_surface: z.record(z.string(), z.any()), + etw_surface: z.record(z.string(), z.any()), + wmi_surface: z.record(z.string(), z.any()), + service_surface: z.record(z.string(), z.any()), + risk_flags: z.array(z.record(z.string(), z.any())), + risk_summary: z.record(z.string(), z.any()), policy: PolicySchema, summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), - evidence_summary: z.record(z.any()), - workflow_handoff: z.record(z.any()), - quality_gates: z.record(z.any()), + evidence_summary: z.record(z.string(), z.any()), + workflow_handoff: z.record(z.string(), z.any()), + quality_gates: z.record(z.string(), z.any()), }) export const WindowsInterfaceSurfaceInventoryInputSchema = z.object({ diff --git a/src/plugins/wine/tools/wine-dll-overrides.ts b/src/plugins/wine/tools/wine-dll-overrides.ts index bc35fca3..a23ea0d9 100644 --- a/src/plugins/wine/tools/wine-dll-overrides.ts +++ b/src/plugins/wine/tools/wine-dll-overrides.ts @@ -48,16 +48,16 @@ const wineDllOverridesOutputSchema = z .union([ z.object({ prefix: z.string(), - overrides: z.record(z.string()), + overrides: z.record(z.string(), z.string()), count: z.number().int().nonnegative(), }), z.object({ prefix: z.string(), - overrides: z.record(z.string().nullable()), + overrides: z.record(z.string(), z.string().nullable()), }), z.object({ prefix: z.string(), - applied: z.record(overrideMode), + applied: z.record(z.string(), overrideMode), env_string: z.string(), hint: z.string(), }), diff --git a/src/plugins/wine/tools/wine-run.ts b/src/plugins/wine/tools/wine-run.ts index b4c6ff5a..75be5143 100644 --- a/src/plugins/wine/tools/wine-run.ts +++ b/src/plugins/wine/tools/wine-run.ts @@ -89,9 +89,9 @@ const wineRunSuccessOutputSchema = z.object({ summary: z.string(), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), }) .optional(), warnings: z.array(z.string()).optional(), diff --git a/src/plugins/yara-x/tools/yara-x-scan.ts b/src/plugins/yara-x/tools/yara-x-scan.ts index f499dd70..87cd0cb0 100644 --- a/src/plugins/yara-x/tools/yara-x-scan.ts +++ b/src/plugins/yara-x/tools/yara-x-scan.ts @@ -210,15 +210,15 @@ export const yaraXScanOutputSchema = z.object({ match_count: z.number().int().nonnegative().optional(), matches: z.array(z.any()).optional(), matching_rules: z.array(z.any()).optional(), - module_outputs: z.record(z.any()).optional(), + module_outputs: z.record(z.string(), z.any()).optional(), pattern_match_count: z.number().int().nonnegative().optional(), - backend_semantics: z.record(z.any()).optional(), - ruleset_provenance: z.record(z.any()).optional(), - validation_semantics: z.record(z.any()).optional(), - corroboration_plan: z.record(z.any()).optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + backend_semantics: z.record(z.string(), z.any()).optional(), + ruleset_provenance: z.record(z.string(), z.any()).optional(), + validation_semantics: z.record(z.string(), z.any()).optional(), + corroboration_plan: z.record(z.string(), z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), artifact: ArtifactRefSchema.optional(), summary: z.string(), recommended_next_tools: z.array(z.string()), diff --git a/src/plugins/yara/tools/yara-generate-batch.ts b/src/plugins/yara/tools/yara-generate-batch.ts index 7b3eebb7..d9d0598b 100644 --- a/src/plugins/yara/tools/yara-generate-batch.ts +++ b/src/plugins/yara/tools/yara-generate-batch.ts @@ -28,7 +28,7 @@ const GeneratedYaraFamilyRuleSchema = z.object({ type: z.string(), rule_text: z.string(), score: z.number(), - breakdown: z.record(z.any()), + breakdown: z.record(z.string(), z.any()), }) export const YaraGenerateBatchInputSchema = z.object({ @@ -58,7 +58,7 @@ export const YaraGenerateBatchOutputSchema = z.object({ family_rule: GeneratedYaraFamilyRuleSchema.optional(), rule_text: z.string().optional(), score: z.number().optional(), - breakdown: z.record(z.any()).optional(), + breakdown: z.record(z.string(), z.any()).optional(), common_features: z .object({ strings: z.number(), @@ -67,9 +67,9 @@ export const YaraGenerateBatchOutputSchema = z.object({ }) .optional(), sample_count: z.number().optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), recommended_next_tools: z.array(z.string()).optional(), next_actions: z.array(z.string()).optional(), }) diff --git a/src/plugins/yara/tools/yara-generate.ts b/src/plugins/yara/tools/yara-generate.ts index df9c8fb2..f43cf462 100644 --- a/src/plugins/yara/tools/yara-generate.ts +++ b/src/plugins/yara/tools/yara-generate.ts @@ -33,7 +33,7 @@ const GeneratedYaraRuleSchema = z.object({ type: z.string(), rule_text: z.string(), score: z.number(), - breakdown: z.record(z.any()), + breakdown: z.record(z.string(), z.any()), }) export const YaraGenerateInputSchema = z.object({ @@ -66,9 +66,9 @@ export const YaraGenerateOutputSchema = z.object({ deploy_requested: z.boolean().optional(), rules: z.array(GeneratedYaraRuleSchema).optional(), best_rule: GeneratedYaraRuleSchema.optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), recommended_next_tools: z.array(z.string()).optional(), next_actions: z.array(z.string()).optional(), }) diff --git a/src/plugins/yara/tools/yara-scan.ts b/src/plugins/yara/tools/yara-scan.ts index 0ce6c2fb..23e4acf5 100644 --- a/src/plugins/yara/tools/yara-scan.ts +++ b/src/plugins/yara/tools/yara-scan.ts @@ -81,7 +81,7 @@ export const YaraScanOutputSchema = z.object({ z.object({ rule: z.string(), tags: z.array(z.string()), - meta: z.record(z.any()), + meta: z.record(z.string(), z.any()), strings: z.array( z.object({ identifier: z.string(), @@ -153,13 +153,13 @@ export const YaraScanOutputSchema = z.object({ .object({ parser: z.string().nullable().optional(), sections_count: z.number().optional(), - entry_point: z.record(z.any()).optional(), + entry_point: z.record(z.string(), z.any()).optional(), }) .optional(), quality_notes: z.array(z.string()).optional(), - evidence_summary: z.record(z.any()).optional(), - workflow_handoff: z.record(z.any()).optional(), - quality_gates: z.record(z.any()).optional(), + evidence_summary: z.record(z.string(), z.any()).optional(), + workflow_handoff: z.record(z.string(), z.any()).optional(), + quality_gates: z.record(z.string(), z.any()).optional(), recommended_next_tools: z.array(z.string()).optional(), next_actions: z.array(z.string()).optional(), artifact: z.any().optional(), diff --git a/src/tools/analysis-context-get.ts b/src/tools/analysis-context-get.ts index ed4195c7..c6b9665e 100644 --- a/src/tools/analysis-context-get.ts +++ b/src/tools/analysis-context-get.ts @@ -36,7 +36,7 @@ export const AnalysisContextGetOutputSchema = z.object({ .object({ sample_id: z.string(), intended_tool: z.string().optional(), - reuse_hints: z.record(z.any()), + reuse_hints: z.record(z.string(), z.any()), result_mode: z.literal('preflight'), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), diff --git a/src/tools/artifact-read.ts b/src/tools/artifact-read.ts index 2dcfe24e..9e2eb2b3 100644 --- a/src/tools/artifact-read.ts +++ b/src/tools/artifact-read.ts @@ -127,9 +127,9 @@ export const ArtifactReadOutputSchema = z.object({ created_at: z.string(), }), read_mode: z.enum(['profile', 'summary', 'content']), - artifact_profile: z.record(z.any()).optional(), - summary: z.record(z.any()).optional(), - related_artifacts: z.array(z.record(z.any())).optional(), + artifact_profile: z.record(z.string(), z.any()).optional(), + summary: z.record(z.string(), z.any()).optional(), + related_artifacts: z.array(z.record(z.string(), z.any())).optional(), content: z.string().optional(), content_encoding: z.enum(['utf8', 'base64']).optional(), parsed_json: z.any().optional(), diff --git a/src/tools/artifacts-diff.ts b/src/tools/artifacts-diff.ts index e6845997..2902e003 100644 --- a/src/tools/artifacts-diff.ts +++ b/src/tools/artifacts-diff.ts @@ -102,7 +102,7 @@ export const artifactsDiffOutputSchema = z.object({ removed_count: z.number().int().nonnegative(), changed_count: z.number().int().nonnegative(), unchanged_count: z.number().int().nonnegative(), - changed_fields: z.record(z.number().int().nonnegative()), + changed_fields: z.record(z.string(), z.number().int().nonnegative()), left_types: z.array(z.string()), right_types: z.array(z.string()), }), diff --git a/src/tools/artifacts-list.ts b/src/tools/artifacts-list.ts index 1e17c518..c6dbbfe1 100644 --- a/src/tools/artifacts-list.ts +++ b/src/tools/artifacts-list.ts @@ -97,8 +97,9 @@ const ArtifactsListSummarySchema = z.object({ filtered_count: z.number().int().nonnegative(), missing_count: z.number().int().nonnegative(), untracked_count: z.number().int().nonnegative(), - by_type: z.record(z.number()), + by_type: z.record(z.string(), z.number()), latest_by_type: z.record( + z.string(), z.object({ id: z.string(), path: z.string(), @@ -107,6 +108,7 @@ const ArtifactsListSummarySchema = z.object({ }) ), latest_by_session: z.record( + z.string(), z.object({ id: z.string(), path: z.string(), @@ -116,6 +118,7 @@ const ArtifactsListSummarySchema = z.object({ }) ), session_index: z.record( + z.string(), z.object({ count: z.number().int().nonnegative(), latest_created_at: z.string(), @@ -125,7 +128,7 @@ const ArtifactsListSummarySchema = z.object({ retention_buckets: z.array(z.string()), }) ), - by_retention_bucket: z.record(z.number()), + by_retention_bucket: z.record(z.string(), z.number()), high_value_types: z.array(z.string()), }) diff --git a/src/tools/sample-profile-get.ts b/src/tools/sample-profile-get.ts index 2272fb7d..9e70583d 100644 --- a/src/tools/sample-profile-get.ts +++ b/src/tools/sample-profile-get.ts @@ -126,7 +126,7 @@ export const SampleProfileGetOutputSchema = z.object({ next_actions: z.array(z.string()), }) .optional(), - routing_profile: z.record(z.any()).optional(), + routing_profile: z.record(z.string(), z.any()).optional(), workspace: z .object({ status: z.enum([ @@ -156,7 +156,7 @@ export const SampleProfileGetOutputSchema = z.object({ remediation: z.array(z.string()), }) .optional(), - reuse_hints: z.record(z.any()).optional(), + reuse_hints: z.record(z.string(), z.any()).optional(), }) .optional(), errors: z.array(z.string()).optional(), diff --git a/src/tools/setup-remediate.ts b/src/tools/setup-remediate.ts index c50ea387..0b21f14f 100644 --- a/src/tools/setup-remediate.ts +++ b/src/tools/setup-remediate.ts @@ -19,7 +19,7 @@ const BlockedToolContextSchema = z.object({ sample_id: z.string().optional().describe('Sample ID if applicable'), error_message: z.string().optional().describe('Error message that caused the block'), setup_required: z.string().optional().describe('Setup requirement identifier'), - context: z.record(z.unknown()).optional().describe('Additional blocked context'), + context: z.record(z.string(), z.unknown()).optional().describe('Additional blocked context'), }) export const SetupRemediateInputSchema = z.object({ diff --git a/src/tools/system-health.ts b/src/tools/system-health.ts index 3b82f881..9b32084b 100644 --- a/src/tools/system-health.ts +++ b/src/tools/system-health.ts @@ -47,7 +47,7 @@ const ComponentSchema = z.object({ status: z.enum(['healthy', 'degraded', 'unhealthy', 'skipped']), ok: z.boolean(), error: z.string().nullable().optional(), - details: z.record(z.any()).optional(), + details: z.record(z.string(), z.any()).optional(), }) const CacheObservabilitySchema = z.object({ diff --git a/src/tools/task-status.ts b/src/tools/task-status.ts index 334b48bc..9623a22c 100644 --- a/src/tools/task-status.ts +++ b/src/tools/task-status.ts @@ -42,7 +42,7 @@ export const taskStatusInputSchema = z.object({ export type TaskStatusInput = z.infer -const TaskStatusJobSchema = z.record(z.any()) +const TaskStatusJobSchema = z.record(z.string(), z.any()) export const taskStatusOutputSchema = z.object({ ok: z.boolean(), @@ -60,10 +60,10 @@ export const taskStatusOutputSchema = z.object({ preferred_primary_tools: z.array(z.string()).optional(), recommended_next_tools: z.array(z.string()).optional(), next_actions: z.array(z.string()).optional(), - reuse_hints: z.record(z.any()).optional(), + reuse_hints: z.record(z.string(), z.any()).optional(), external_active_rss_mb: z.number().nonnegative().optional(), external_active_process_count: z.number().int().nonnegative().optional(), - external_active_processes: z.array(z.record(z.any())).optional(), + external_active_processes: z.array(z.record(z.string(), z.any())).optional(), }) .optional(), errors: z.array(z.string()).optional(), diff --git a/src/tools/tool-help.ts b/src/tools/tool-help.ts index f7b4e308..76d9618c 100644 --- a/src/tools/tool-help.ts +++ b/src/tools/tool-help.ts @@ -56,9 +56,9 @@ export const toolHelpOutputSchema = z.object({ surface_role: ToolSurfaceRoleSchema, preferred_primary_tools: z.array(z.string()).optional(), usage_notes: z.array(z.string()).optional(), - aspects: z.record(z.array(z.string())).nullable().optional(), + aspects: z.record(z.string(), z.array(z.string())).nullable().optional(), aspect_coverage: z.array(z.string()).optional(), - format_matrix: z.record(z.any()).optional(), + format_matrix: z.record(z.string(), z.any()).optional(), artifact_declarations: z.array(z.any()).optional(), evidence_declarations: z.array(z.any()).optional(), workflow_recipes: z.array(z.any()).optional(), @@ -97,38 +97,36 @@ function unwrapSchema(schema: z.ZodTypeAny): { while (true) { if (current instanceof z.ZodOptional) { required = false - current = current._def.innerType + current = current.unwrap() as z.ZodTypeAny continue } if (current instanceof z.ZodDefault) { required = false + const dv: unknown = current._zod.def.defaultValue try { - defaultValue = current._def.defaultValue() + defaultValue = typeof dv === 'function' ? (dv as () => unknown)() : dv } catch { defaultValue = undefined } - current = current._def.innerType + current = current.unwrap() as z.ZodTypeAny continue } if (current instanceof z.ZodNullable) { nullable = true - current = current._def.innerType + current = current.unwrap() as z.ZodTypeAny continue } if (current instanceof z.ZodCatch) { - current = current._def.innerType + current = current.unwrap() as z.ZodTypeAny continue } - if (current instanceof z.ZodEffects) { - current = current._def.schema - continue - } - if (current instanceof z.ZodBranded) { - current = current._def.type + // zod4: .transform() produces a ZodPipe (ZodEffects was removed); unwrap to its input schema. + if (current instanceof z.ZodPipe) { + current = current._zod.def.in as z.ZodTypeAny continue } if (current instanceof z.ZodReadonly) { - current = current._def.innerType + current = current.unwrap() as z.ZodTypeAny continue } break @@ -150,7 +148,7 @@ function describeSchemaType(schema: z.ZodTypeAny): string { if (schema instanceof z.ZodLiteral) return 'literal' if (schema instanceof z.ZodObject) return 'object' if (schema instanceof z.ZodArray) { - const itemInfo = unwrapSchema(schema._def.type) + const itemInfo = unwrapSchema(schema.element as z.ZodTypeAny) return `array<${describeSchemaType(itemInfo.schema)}>` } if (schema instanceof z.ZodUnion) return 'union' @@ -182,9 +180,9 @@ function collectSchemaFields(schema: z.ZodTypeAny, prefix = '', toolName?: strin field.default_value = info.defaultValue } if (current instanceof z.ZodEnum) { - field.enum_values = [...current._def.values] + field.enum_values = [...current.options].map((v) => String(v)) } else if (current instanceof z.ZodLiteral) { - field.enum_values = [String(current._def.value)] + field.enum_values = [...current.values].map((v) => String(v)) } return [field] diff --git a/src/tools/tool-readiness.ts b/src/tools/tool-readiness.ts index 97f168ea..278c6ca2 100644 --- a/src/tools/tool-readiness.ts +++ b/src/tools/tool-readiness.ts @@ -67,9 +67,9 @@ const ToolReadinessDataSchema = z runtime_plane: z.string().nullable(), tool_surface_role: ToolSurfaceRoleSchema.nullable(), preferred_primary_tools: z.array(z.string()), - aspects: z.record(z.array(z.string())).nullable().optional(), + aspects: z.record(z.string(), z.array(z.string())).nullable().optional(), aspect_coverage: z.array(z.string()).optional(), - format_matrix: z.record(z.any()).optional(), + format_matrix: z.record(z.string(), z.any()).optional(), artifact_declarations: z.array(z.any()).optional(), evidence_declarations: z.array(z.any()).optional(), workflow_recipes: z.array(z.any()).optional(), @@ -92,7 +92,7 @@ const ToolReadinessDataSchema = z missing_runtime_tools: z.array(z.string()).optional(), local_dynamic_policy: z.string().nullable().optional(), available_runtime_backends: z.array(z.any()), - execution_semantics: z.record(z.any()), + execution_semantics: z.record(z.string(), z.any()), recommended_next_tools: z.array(z.string()), next_actions: z.array(z.string()), }) diff --git a/src/tools/tools-discover.ts b/src/tools/tools-discover.ts index e4ffb22c..39a15d90 100644 --- a/src/tools/tools-discover.ts +++ b/src/tools/tools-discover.ts @@ -115,9 +115,9 @@ export const toolsDiscoverOutputSchema = z.object({ activated: z.boolean(), tool_surface_role: ToolSurfaceRoleSchema, preferred_primary_tools: z.array(z.string()), - aspects: z.record(z.array(z.string())).nullable().optional(), + aspects: z.record(z.string(), z.array(z.string())).nullable().optional(), aspect_coverage: z.array(z.string()).optional(), - format_matrix: z.record(z.any()).optional(), + format_matrix: z.record(z.string(), z.any()).optional(), runtime_policy: z.any().nullable().optional(), runtime_contract: z.any().nullable().optional(), worker_backend: z.any().nullable().optional(), @@ -135,7 +135,7 @@ export const toolsDiscoverOutputSchema = z.object({ match_reasons: z.array(z.string()).optional(), readiness_state: z.string().optional(), activation_plan: z.array(z.string()).optional(), - activation_command: z.record(z.any()).optional(), + activation_command: z.record(z.string(), z.any()).optional(), why_hidden: z.array(z.string()).optional(), quality_warnings: z.array(z.any()).optional(), }) @@ -159,9 +159,9 @@ export const toolsDiscoverOutputSchema = z.object({ visible: z.boolean(), tool_surface_role: ToolSurfaceRoleSchema, preferred_primary_tools: z.array(z.string()), - aspects: z.record(z.array(z.string())).nullable().optional(), + aspects: z.record(z.string(), z.array(z.string())).nullable().optional(), aspect_coverage: z.array(z.string()).optional(), - format_matrix: z.record(z.any()).optional(), + format_matrix: z.record(z.string(), z.any()).optional(), runtime_contract: z.any().nullable().optional(), worker_backend: z.any().nullable().optional(), artifact_declarations: z.array(z.any()).optional(), @@ -172,7 +172,7 @@ export const toolsDiscoverOutputSchema = z.object({ match_reasons: z.array(z.string()).optional(), readiness_state: z.string().optional(), activation_plan: z.array(z.string()).optional(), - activation_command: z.record(z.any()).optional(), + activation_command: z.record(z.string(), z.any()).optional(), why_hidden: z.array(z.string()).optional(), }) ) diff --git a/src/tools/workflow-search.ts b/src/tools/workflow-search.ts index 2c4b6bcd..efa6bde1 100644 --- a/src/tools/workflow-search.ts +++ b/src/tools/workflow-search.ts @@ -65,10 +65,10 @@ export const workflowSearchOutputSchema = z.object({ goal: z.string().optional(), depth: z.string().optional(), top_k: z.number().int().positive(), - search_profile: z.record(z.any()), - search_profiles: z.array(z.record(z.any())).optional(), - quota_decisions: z.array(z.record(z.any())).optional(), - results: z.array(z.record(z.any())).optional(), + search_profile: z.record(z.string(), z.any()), + search_profiles: z.array(z.record(z.string(), z.any())).optional(), + quota_decisions: z.array(z.record(z.string(), z.any())).optional(), + results: z.array(z.record(z.string(), z.any())).optional(), recommendations: z.array(z.any()).optional(), recommendation_summary: z.any().optional(), raw_discovery: z.any().optional(), diff --git a/src/workflows/workflow-run.ts b/src/workflows/workflow-run.ts index 7b67bc97..54dee4b0 100644 --- a/src/workflows/workflow-run.ts +++ b/src/workflows/workflow-run.ts @@ -42,8 +42,8 @@ const ArtifactSelectorSummarySchema = z.object({ selector_count: z.number().int().nonnegative(), omitted_count: z.number().int().nonnegative(), latest_stage: z.string().nullable(), - by_type: z.record(z.number().int().nonnegative()), - by_stage: z.record(z.number().int().nonnegative()), + by_type: z.record(z.string(), z.number().int().nonnegative()), + by_stage: z.record(z.string(), z.number().int().nonnegative()), }) export const workflowRunInputSchema = z diff --git a/tests/unit/mcp-protocol.test.ts b/tests/unit/mcp-protocol.test.ts index 5f4b6478..c865f67e 100644 --- a/tests/unit/mcp-protocol.test.ts +++ b/tests/unit/mcp-protocol.test.ts @@ -182,7 +182,7 @@ describe('MCP Protocol Implementation', () => { const result = schema.safeParse({ number: 42 }) if (!result.success) { - const messages = result.error.errors.map((e) => `${e.path.join('.')}: ${e.message}`) + const messages = result.error.issues.map((e) => `${e.path.join('.')}: ${e.message}`) expect(messages.length).toBeGreaterThan(0) expect(messages.some((m) => m.includes('required'))).toBe(true) } diff --git a/tests/unit/runtime-node/router-capabilities.test.ts b/tests/unit/runtime-node/router-capabilities.test.ts index 340e4559..50623989 100644 --- a/tests/unit/runtime-node/router-capabilities.test.ts +++ b/tests/unit/runtime-node/router-capabilities.test.ts @@ -339,8 +339,8 @@ describe('runtime-node router capability and execute contract', () => { expect(response.body).toContain('schema_validation_failed') expect(response.body).toContain('Execute payload validation failed') expect(response.body).toContain('taskId must contain only letters, numbers, underscores, or dashes') - expect(response.body).toContain('Expected object, received array') - expect(response.body).toContain('Number must be greater than or equal to 1') + expect(response.body).toContain('Invalid input: expected record, received array') + expect(response.body).toContain('Too small: expected number to be >=1') }) test('rejects malformed JSON bodies with invalid_json contract', async () => { @@ -419,7 +419,7 @@ describe('runtime-node router capability and execute contract', () => { expect(response.statusCode).toBe(400) expect(response.body).toContain('schema_validation_failed') - expect(response.body).toContain('Invalid enum value') + expect(response.body).toContain('Invalid option: expected one of') expect(response.body).toContain('String must contain at least 1 character') })