@autobe/agent
Version:
AI backend server code generator
119 lines (109 loc) • 4.04 kB
text/typescript
import {
AutoBeAssistantMessageHistory,
AutoBeInterfaceAuthorization,
AutoBeInterfaceCompleteEvent,
AutoBeInterfaceEndpointDesign,
AutoBeInterfaceGroupEvent,
AutoBeInterfaceHistory,
AutoBeOpenApi,
} from "@autobe/interface";
import { AutoBeInterfacePrerequisiteEvent } from "@autobe/interface/src/events/AutoBeInterfacePrerequisiteEvent";
import { missedOpenApiSchemas, revertOpenApiAccessor } from "@autobe/utils";
import { v7 } from "uuid";
import { AutoBeContext } from "../../context/AutoBeContext";
import { predicateStateMessage } from "../../utils/predicateStateMessage";
import { IAutoBeFacadeApplicationProps } from "../facade/histories/IAutoBeFacadeApplicationProps";
import { orchestrateInterfaceAuthorization } from "./orchestrateInterfaceAuthorization";
import { orchestrateInterfaceEndpoint } from "./orchestrateInterfaceEndpoint";
import { orchestrateInterfaceGroup } from "./orchestrateInterfaceGroup";
import { orchestrateInterfaceOperation } from "./orchestrateInterfaceOperation";
import { orchestrateInterfacePrerequisite } from "./orchestrateInterfacePrerequisite";
import { orchestrateInterfaceSchema } from "./orchestrateInterfaceSchema";
export const orchestrateInterface =
(ctx: AutoBeContext) =>
async (
props: IAutoBeFacadeApplicationProps,
): Promise<AutoBeAssistantMessageHistory | AutoBeInterfaceHistory> => {
// PREDICATION
const start: Date = new Date();
const predicate: string | null = predicateStateMessage(
ctx.state(),
"interface",
);
if (predicate !== null)
return ctx.assistantMessage({
type: "assistantMessage",
id: v7(),
created_at: start.toISOString(),
text: predicate,
completed_at: new Date().toISOString(),
});
ctx.dispatch({
type: "interfaceStart",
id: v7(),
created_at: start.toISOString(),
reason: props.instruction,
step: ctx.state().analyze?.step ?? 0,
});
// GROUPS
const init: AutoBeInterfaceGroupEvent = await orchestrateInterfaceGroup(
ctx,
{
instruction: props.instruction,
},
);
ctx.dispatch(init);
// AUTHORIZATION
const authorizations: AutoBeInterfaceAuthorization[] =
await orchestrateInterfaceAuthorization(ctx, {
instruction: props.instruction,
});
// ENDPOINTS
const endpoints: AutoBeInterfaceEndpointDesign[] =
await orchestrateInterfaceEndpoint(ctx, {
instruction: props.instruction,
authorizeOperations: authorizations.map((a) => a.operations).flat(),
groups: init.groups,
});
// OPERATIONS
const operations: AutoBeOpenApi.IOperation[] = [
...authorizations.map((auth) => auth.operations).flat(),
...(await orchestrateInterfaceOperation(ctx, {
designs: endpoints,
instruction: props.instruction,
})),
];
// THE DOCUMENT WITH SCHEMAS
const document: AutoBeOpenApi.IDocument = {
operations,
components: {
authorizations: ctx.state().analyze?.actors ?? [],
schemas: await orchestrateInterfaceSchema(ctx, {
instruction: props.instruction,
operations,
}),
},
};
revertOpenApiAccessor(document);
// PREREQUISITES
const prerequisites: AutoBeInterfacePrerequisiteEvent[] =
await orchestrateInterfacePrerequisite(ctx, document);
document.operations.forEach((op) => {
op.prerequisites =
prerequisites.find(
(p) => p.endpoint.method === op.method && p.endpoint.path === op.path,
)?.prerequisites ?? [];
});
// DO COMPILE
return ctx.dispatch({
type: "interfaceComplete",
id: v7(),
document,
missed: missedOpenApiSchemas(document),
authorizations,
aggregates: ctx.getCurrentAggregates("interface"),
step: ctx.state().analyze?.step ?? 0,
elapsed: new Date().getTime() - start.getTime(),
created_at: new Date().toISOString(),
} satisfies AutoBeInterfaceCompleteEvent);
};