fix(openapi): expose strict catalog team request schemas

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
DottaandPaperclip committed 2026-11-04 07:45:35 -06:00
1 parent 50c1952ff2
commit e8e965da36
3 files changed
+25

No files matched your search

@@ -211,6 +211,17 @@ describe("teams catalog routes", () => {
expect(mockCatalogModule.listCatalogTeams).not.toHaveBeenCalled(); expect(mockCatalogModule.listCatalogTeams).not.toHaveBeenCalled();
}); });
it("still rejects unknown preview and install fields before service mutation", async () => {
const app = await createApp({ type: "agent", agentId: "agent-1", companyId, runId: "run-1" });
for (const operation of ["preview", "install"]) {
const res = await request(app).post(`/api/companies/${companyId}/teams/catalog/product-engineering/${operation}`)
.send({ parentAgentId: "undocumented-field" });
expect(res.status).toBe(400);
}
expect(mockTeamsCatalogService.previewCatalogTeamImport).not.toHaveBeenCalled();
expect(mockTeamsCatalogService.installCatalogTeam).not.toHaveBeenCalled();
});
it("previews catalog teams with company access and actor/source policy context", async () => { it("previews catalog teams with company access and actor/source policy context", async () => {
const app = await createApp({ const app = await createApp({
type: "board", type: "board",
+3
View File
@@ -1,3 +1,4 @@
import { catalogTeamInstallSchema, catalogTeamPreviewSchema } from "@paperclipai/shared";
import { MUSE_ASSET_VERSION, museStopBoundarySchema, museDetectorCleanupAttestationSchema, createGrokInvitationSchema, configureGrokRoutineSchema, verifyGrokRoutineSchema, recoverGrokRoutineSchema, pairGrokBindingSchema, stopGrokWorkSchema, retryGrokDeliverySchema, updateFastResponseSchema } from "@paperclipai/shared"; import { MUSE_ASSET_VERSION, museStopBoundarySchema, museDetectorCleanupAttestationSchema, createGrokInvitationSchema, configureGrokRoutineSchema, verifyGrokRoutineSchema, recoverGrokRoutineSchema, pairGrokBindingSchema, stopGrokWorkSchema, retryGrokDeliverySchema, updateFastResponseSchema } from "@paperclipai/shared";
import { slackTestMessageSchema, slackTestMessageResultSchema, slackManagerAuthorizationSchema, slackSetupOptionsSchema, slackManagedProvisionSchema, slackManagedResultSchema, slackRegistrationSchema, slackSetupActionSchema, slackInstallAuthorizationSchema, slackRegistrationStateSchema, slackAppConfigurationSchema, slackAvatarStateSchema, slackAccountStateSchema } from "@paperclipai/shared"; import { slackTestMessageSchema, slackTestMessageResultSchema, slackManagerAuthorizationSchema, slackSetupOptionsSchema, slackManagedProvisionSchema, slackManagedResultSchema, slackRegistrationSchema, slackSetupActionSchema, slackInstallAuthorizationSchema, slackRegistrationStateSchema, slackAppConfigurationSchema, slackAvatarStateSchema, slackAccountStateSchema } from "@paperclipai/shared";
import { experimentalApiMetadata } from "./experimental-api-metadata.js"; import { experimentalApiMetadata } from "./experimental-api-metadata.js";
@@ -3103,6 +3104,8 @@ for (const route of [
path: route[1], path: route[1],
tags: ["teams"], tags: ["teams"],
summary: route[2], summary: route[2],
body: route[1].endsWith("/preview") ? catalogTeamPreviewSchema
: route[1].endsWith("/install") ? catalogTeamInstallSchema : undefined,
...(route[1].endsWith("/install") ? { ...(route[1].endsWith("/install") ? {
description: "Imports team resources; HTTP success does not prove every required skill is ready. Read warnings for post-import failures and skillPreparations for required sources; a preparation plan is not proof of installation. Report unresolved requirements as partial completion and preserve existing resources. Use the actual returned portabilityImport agents and projects for company-scoped resource links. Before repeating an uncertain install, inspect installed teams and saved resource identities rather than creating another copy. resourceLinks provides canonical company-scoped hrefs for actual saved agents, projects and routines, including reused resources; share these links with the installation outcome.", description: "Imports team resources; HTTP success does not prove every required skill is ready. Read warnings for post-import failures and skillPreparations for required sources; a preparation plan is not proof of installation. Report unresolved requirements as partial completion and preserve existing resources. Use the actual returned portabilityImport agents and projects for company-scoped resource links. Before repeating an uncertain install, inspect installed teams and saved resource identities rather than creating another copy. resourceLinks provides canonical company-scoped hrefs for actual saved agents, projects and routines, including reused resources; share these links with the installation outcome.",
responses: { 201: r.ok(z.object({ resourceLinks: z.array(z.object({ responses: { 201: r.ok(z.object({ resourceLinks: z.array(z.object({
@@ -164,6 +164,17 @@ describe("runner API catalog", () => {
expect(operation.authorization.actor).toBeTruthy(); expect(operation.authorization.actor).toBeTruthy();
}); });
it("exposes team preview and install bodies through the actual adapter override search", () => {
const results = searchRunnerApi({ query: "adapterOverrides install team under manager parentAgentId", limit: 10 }).results;
const preview = results.find(row => row.operationId === "POST /api/companies/{companyId}/teams/catalog/{catalogId}/preview")!;
const install = results.find(row => row.operationId === "POST /api/companies/{companyId}/teams/catalog/{catalogId}/install")!;
const previewBody = preview.requestBody?.content["application/json"].schema;
const installBody = install.requestBody?.content["application/json"].schema;
expect(previewBody).toMatchObject({ additionalProperties: false, properties: { targetManagerAgentId: expect.any(Object), nameOverrides: expect.any(Object) } });
expect(installBody).toMatchObject({ additionalProperties: false, properties: { targetManagerAgentId: expect.any(Object), adapterOverrides: expect.any(Object), secretValues: expect.any(Object) } });
expect(previewBody.properties).not.toHaveProperty("adapterOverrides");
});
it("ranks natural language, explains dedicated alternatives, and supports exact lookup", () => { it("ranks natural language, explains dedicated alternatives, and supports exact lookup", () => {
expect( expect(
searchRunnerApi({ query: "create project" }).results.map( searchRunnerApi({ query: "create project" }).results.map(