Skip to content

Commit 4018082

Browse files
committed
Fix publishing to allow undefined system prompt. Use validateAgents!
1 parent d3184bf commit 4018082

File tree

4 files changed

+45
-41
lines changed

4 files changed

+45
-41
lines changed

common/src/templates/agent-validation.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,19 @@ export function collectAgentIds(
5454
*/
5555
export function validateAgents(agentTemplates: Record<string, any> = {}): {
5656
templates: Record<string, AgentTemplate>
57+
dynamicTemplates: Record<string, DynamicAgentTemplate>
5758
validationErrors: DynamicAgentValidationError[]
5859
} {
5960
const templates: Record<string, AgentTemplate> = {}
61+
const dynamicTemplates: Record<string, DynamicAgentTemplate> = {}
6062
const validationErrors: DynamicAgentValidationError[] = []
6163

6264
const hasAgentTemplates = Object.keys(agentTemplates).length > 0
6365

6466
if (!hasAgentTemplates) {
6567
return {
6668
templates,
69+
dynamicTemplates,
6770
validationErrors,
6871
}
6972
}
@@ -107,6 +110,8 @@ export function validateAgents(agentTemplates: Record<string, any> = {}): {
107110
}
108111
templates[validationResult.agentTemplate!.id] =
109112
validationResult.agentTemplate!
113+
dynamicTemplates[validationResult.dynamicAgentTemplate!.id] =
114+
validationResult.dynamicAgentTemplate!
110115
} catch (error) {
111116
const errorMessage =
112117
error instanceof Error ? error.message : 'Unknown error'
@@ -130,6 +135,7 @@ export function validateAgents(agentTemplates: Record<string, any> = {}): {
130135

131136
return {
132137
templates,
138+
dynamicTemplates,
133139
validationErrors,
134140
}
135141
}
@@ -155,6 +161,7 @@ export function validateSingleAgent(
155161
): {
156162
success: boolean
157163
agentTemplate?: AgentTemplate
164+
dynamicAgentTemplate?: DynamicAgentTemplate
158165
error?: string
159166
} {
160167
const {
@@ -276,13 +283,17 @@ export function validateSingleAgent(
276283
// Convert to internal AgentTemplate format
277284
const agentTemplate: AgentTemplate = {
278285
...validatedConfig,
286+
systemPrompt: validatedConfig.systemPrompt ?? '',
287+
instructionsPrompt: validatedConfig.instructionsPrompt ?? '',
288+
stepPrompt: validatedConfig.stepPrompt ?? '',
279289
outputSchema,
280290
inputSchema,
281291
}
282292

283293
return {
284294
success: true,
285295
agentTemplate,
296+
dynamicAgentTemplate: validatedConfig,
286297
}
287298
} catch (error) {
288299
const errorMessage =

common/src/types/api/agents/publish.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
import { z } from 'zod/v4'
22

3-
import { DynamicAgentTemplateSchema } from '../../../types/dynamic-agent-template'
4-
53
export const publishAgentsRequestSchema = z.object({
6-
data: DynamicAgentTemplateSchema.array(),
4+
data: z.record(z.string(), z.any()).array(),
75
authToken: z.string(),
86
})
97
export type PublishAgentsRequest = z.infer<typeof publishAgentsRequestSchema>

npm-app/src/cli-handlers/publish.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,12 @@ import { pluralize } from '@codebuff/common/util/string'
6363
return
6464
}
6565

66-
const matchingTemplates: Record<string, DynamicAgentTemplate> = {}
66+
const matchingTemplates: Record<string, any> = {}
6767
for (const agentId of agentIds) {
6868
// Find the specific agent
69-
const matchingTemplate = Object.entries(agentTemplates).find(
70-
([key, template]) =>
71-
key === agentId ||
72-
template.id === agentId ||
73-
template.displayName === agentId,
69+
const matchingTemplate = Object.values(agentTemplates).find(
70+
(template) =>
71+
template.id === agentId || template.displayName === agentId,
7472
)
7573

7674
if (!matchingTemplate) {
@@ -81,10 +79,10 @@ import { pluralize } from '@codebuff/common/util/string'
8179
return
8280
}
8381

84-
matchingTemplates[matchingTemplate[0]] = matchingTemplate[1]
82+
matchingTemplates[matchingTemplate.id] = matchingTemplate
8583
}
8684
console.log(yellow(`Publishing:`))
87-
for (const [key, template] of Object.entries(matchingTemplates)) {
85+
for (const template of Object.values(matchingTemplates)) {
8886
console.log(` - ${template.displayName} (${template.id})`)
8987
}
9088

@@ -154,7 +152,7 @@ import { pluralize } from '@codebuff/common/util/string'
154152
* Publish agent templates to the backend
155153
*/
156154
async function publishAgentTemplates(
157-
data: DynamicAgentTemplate[],
155+
data: Record<string, any>[],
158156
authToken: string,
159157
): Promise<PublishAgentsResponse & { statusCode?: number }> {
160158
try {

web/src/app/api/agents/publish/route.ts

Lines changed: 26 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,32 @@ export async function POST(request: NextRequest) {
5959
}
6060

6161
const { data, authToken } = parseResult.data
62-
const agents = data as DynamicAgentTemplate[] // data is now an array of agents
62+
const agentDefinitions = data
63+
64+
// First use validateAgents to convert to DynamicAgentTemplate types
65+
const agentMap = agentDefinitions.reduce(
66+
(acc: Record<string, any>, agent: any) => {
67+
acc[agent.id] = agent
68+
return acc
69+
},
70+
{} as Record<string, any>
71+
)
72+
73+
const { validationErrors, dynamicTemplates } = validateAgents(agentMap)
74+
const agents = Object.values(dynamicTemplates)
75+
76+
if (validationErrors.length > 0) {
77+
const errorDetails = validationErrors.map((err) => err.message).join('\n')
78+
79+
return NextResponse.json(
80+
{
81+
error: 'Agent config validation failed',
82+
details: errorDetails,
83+
validationErrors,
84+
},
85+
{ status: 400 }
86+
)
87+
}
6388

6489
// Try cookie-based auth first, then fall back to authToken validation using proper function
6590
let userId: string | undefined
@@ -107,34 +132,6 @@ export async function POST(request: NextRequest) {
107132

108133
const requestedPublisherId = publisherIds[0]!
109134

110-
// Validate all agents
111-
const agentMap = agents.reduce(
112-
(
113-
acc: Record<string, DynamicAgentTemplate>,
114-
agent: DynamicAgentTemplate
115-
) => {
116-
acc[agent.id] = agent
117-
return acc
118-
},
119-
{} as Record<string, DynamicAgentTemplate>
120-
)
121-
122-
const validationResult = validateAgents(agentMap)
123-
124-
if (validationResult.validationErrors.length > 0) {
125-
const errorDetails = validationResult.validationErrors
126-
.map((err) => err.message)
127-
.join('\n')
128-
129-
return NextResponse.json(
130-
{
131-
error: 'Agent config validation failed',
132-
details: errorDetails,
133-
validationErrors: validationResult.validationErrors,
134-
},
135-
{ status: 400 }
136-
)
137-
}
138135

139136
// Verify user has access to the requested publisher
140137
const publisherResult = await db

0 commit comments

Comments
 (0)