Skip to content

Commit 33a0f62

Browse files
committed
refactor(contracts): centralize output schema lookup
1 parent 7b00579 commit 33a0f62

6 files changed

Lines changed: 51 additions & 51 deletions

File tree

src/contracts/artifactToolContracts.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type { ToolContract } from "./toolContracts.js";
55
import { artifactOutputSchemas } from "./toolOutputSchemas.js";
66
import { jsonValueSchema } from "../domain/jsonValue.js";
77
import { toolContractMetadata } from "./toolEffects.js";
8+
import { requireOutputSchema } from "./toolOutputSchemaPrimitives.js";
89
import { artifactInspectionLimitsSchema } from "../domain/artifactInspection.js";
910

1011
const pageInput = {
@@ -104,9 +105,7 @@ const artifact = <Name extends string>(
104105
description: string,
105106
inputSchema: z.ZodType<Readonly<Record<string, unknown>>>,
106107
): ToolContract<Name> => {
107-
const outputSchema = artifactOutputSchemas[name];
108-
if (outputSchema === undefined)
109-
throw new Error(`Missing artifact output schema for ${name}`);
108+
const outputSchema = requireOutputSchema(artifactOutputSchemas, name);
110109
return {
111110
name,
112111
...toolContractMetadata(name),

src/contracts/functionWorkflowToolContracts.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { TOOL_EXAMPLE_OVERRIDES } from "./toolContractExamples.js";
44
import type { ToolContract } from "./toolContractTypes.js";
55
import { toolContractMetadata } from "./toolEffects.js";
66
import { enhancedOutputSchemas } from "./toolOutputSchemas.js";
7+
import { requireOutputSchema } from "./toolOutputSchemaPrimitives.js";
78

89
type FunctionWorkflowName = "analyze_function" | "inspect_native_api";
910

@@ -12,9 +13,7 @@ const functionWorkflow = <Name extends FunctionWorkflowName>(
1213
description: string,
1314
): ToolContract<Name> => {
1415
const inputSchema = enhancedInputSchemas[name];
15-
const outputSchema = enhancedOutputSchemas[name];
16-
if (outputSchema === undefined)
17-
throw new Error(`Missing function workflow output schema for ${name}`);
16+
const outputSchema = requireOutputSchema(enhancedOutputSchemas, name);
1817
return {
1918
name,
2019
...toolContractMetadata(name),

src/contracts/managedToolContracts.ts

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { z } from "zod";
33
import type { ToolContract } from "./toolContracts.js";
44
import { managedOutputSchemas } from "./toolOutputSchemas.js";
55
import { toolContractMetadata } from "./toolEffects.js";
6+
import { requireOutputSchema } from "./toolOutputSchemaPrimitives.js";
67

78
/** Exact caller boundary for execution-free PE/CLI triage and identity. */
89
export const managedArtifactInputSchema = z.object({
@@ -110,18 +111,18 @@ export const managedNativeBoundaryInputSchema = z.object({
110111
.default(1_048_576),
111112
});
112113

113-
const outputSchema = managedOutputSchemas.inspect_managed_artifact;
114-
if (outputSchema === undefined)
115-
throw new Error("Missing managed output schema for inspect_managed_artifact");
116-
const memberOutputSchema = managedOutputSchemas.inspect_managed_members;
117-
if (memberOutputSchema === undefined)
118-
throw new Error("Missing managed output schema for inspect_managed_members");
119-
const nativeBoundaryOutputSchema =
120-
managedOutputSchemas.inspect_managed_native_boundaries;
121-
if (nativeBoundaryOutputSchema === undefined)
122-
throw new Error(
123-
"Missing managed output schema for inspect_managed_native_boundaries",
124-
);
114+
const outputSchema = requireOutputSchema(
115+
managedOutputSchemas,
116+
"inspect_managed_artifact",
117+
);
118+
const memberOutputSchema = requireOutputSchema(
119+
managedOutputSchemas,
120+
"inspect_managed_members",
121+
);
122+
const nativeBoundaryOutputSchema = requireOutputSchema(
123+
managedOutputSchemas,
124+
"inspect_managed_native_boundaries",
125+
);
125126

126127
/** Read-only managed artifact contracts. */
127128
export const MANAGED_TOOL_CONTRACTS = [

src/contracts/managedWorkflowToolContracts.ts

Lines changed: 21 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
MANAGED_RUNTIME_CORRELATION_EXAMPLE,
1616
} from "./managedWorkflowExamples.js";
1717
import { toolContractMetadata } from "./toolEffects.js";
18+
import { requireOutputSchema } from "./toolOutputSchemaPrimitives.js";
1819

1920
const evidenceIdSchema = z.string().regex(/^ev_[a-f0-9]{64}$/u);
2021
const managedEvidenceIdSchema = evidenceIdSchema.describe(
@@ -137,36 +138,26 @@ export const managedApplicationGraphReferenceInputSchema = z
137138
});
138139
});
139140

140-
const comparisonOutputSchema =
141-
managedWorkflowOutputSchemas.compare_managed_members;
142-
if (comparisonOutputSchema === undefined)
143-
throw new Error(
144-
"Missing managed workflow output schema for compare_managed_members",
145-
);
146-
const runtimeOutputSchema =
147-
managedWorkflowOutputSchemas.plan_managed_runtime_correlation;
148-
if (runtimeOutputSchema === undefined)
149-
throw new Error(
150-
"Missing managed workflow output schema for plan_managed_runtime_correlation",
151-
);
152-
const reconstructionOutputSchema =
153-
managedWorkflowOutputSchemas.import_managed_reconstruction;
154-
if (reconstructionOutputSchema === undefined)
155-
throw new Error(
156-
"Missing managed workflow output schema for import_managed_reconstruction",
157-
);
158-
const nativeVerificationOutputSchema =
159-
managedWorkflowOutputSchemas.verify_managed_native_boundaries;
160-
if (nativeVerificationOutputSchema === undefined)
161-
throw new Error(
162-
"Missing managed workflow output schema for verify_managed_native_boundaries",
163-
);
164-
const managedApplicationGraphOutputSchema =
165-
managedWorkflowOutputSchemas.project_managed_application_graph;
166-
if (managedApplicationGraphOutputSchema === undefined)
167-
throw new Error(
168-
"Missing managed workflow output schema for project_managed_application_graph",
169-
);
141+
const comparisonOutputSchema = requireOutputSchema(
142+
managedWorkflowOutputSchemas,
143+
"compare_managed_members",
144+
);
145+
const runtimeOutputSchema = requireOutputSchema(
146+
managedWorkflowOutputSchemas,
147+
"plan_managed_runtime_correlation",
148+
);
149+
const reconstructionOutputSchema = requireOutputSchema(
150+
managedWorkflowOutputSchemas,
151+
"import_managed_reconstruction",
152+
);
153+
const nativeVerificationOutputSchema = requireOutputSchema(
154+
managedWorkflowOutputSchemas,
155+
"verify_managed_native_boundaries",
156+
);
157+
const managedApplicationGraphOutputSchema = requireOutputSchema(
158+
managedWorkflowOutputSchemas,
159+
"project_managed_application_graph",
160+
);
170161

171162
/** Provider-neutral managed-code workflow contracts. */
172163
export const MANAGED_WORKFLOW_TOOL_CONTRACTS = [

src/contracts/nativeToolContracts.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import type { ToolContract } from "./toolContracts.js";
44
import { nativeOutputSchemas } from "./toolOutputSchemas.js";
55
import { jsonValueSchema } from "../domain/jsonValue.js";
66
import { toolContractMetadata } from "./toolEffects.js";
7+
import { requireOutputSchema } from "./toolOutputSchemaPrimitives.js";
78

89
const examples: Readonly<Record<string, Readonly<Record<string, unknown>>>> = {
910
inspect_macho: {},
@@ -18,9 +19,7 @@ const native = <Name extends string>(
1819
description: string,
1920
inputSchema: z.ZodObject,
2021
): ToolContract<Name> => {
21-
const outputSchema = nativeOutputSchemas[name];
22-
if (outputSchema === undefined)
23-
throw new Error(`Missing native output schema for ${name}`);
22+
const outputSchema = requireOutputSchema(nativeOutputSchemas, name);
2423
return {
2524
name,
2625
...toolContractMetadata(name),

tests/composition/analysis-sessions/contractValidation.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,17 @@ describe("contract validation boundaries", () => {
8484
).toBe(false);
8585
});
8686

87+
it("accepts each complete managed application Evidence source", () => {
88+
for (const input of [
89+
{ managed_artifact_evidence_id: EVIDENCE_ID },
90+
{ managed_members_evidence_id: EVIDENCE_ID },
91+
{ managed_native_boundaries_evidence_id: EVIDENCE_ID },
92+
])
93+
expect(
94+
managedApplicationGraphReferenceInputSchema.safeParse(input).success,
95+
).toBe(true);
96+
});
97+
8798
it("requires explicit approval for record-and-continue artifact inspection", () => {
8899
const input = {
89100
integrity_policy: "record-and-continue" as const,

0 commit comments

Comments
 (0)