Skip to content

Commit b2a6cdb

Browse files
committed
Merge branch 'main' into base-layers
2 parents c5fc672 + 158fe9e commit b2a6cdb

File tree

102 files changed

+3413
-2343
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

102 files changed

+3413
-2343
lines changed

backend/src/__tests__/agent-registry.test.ts

Lines changed: 191 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,13 @@ import type { DynamicAgentTemplate } from '@codebuff/common/types/dynamic-agent-
2626
import type { ProjectFileContext } from '@codebuff/common/util/file'
2727
import type { Logger } from '@codebuff/types/logger'
2828

29+
const logger: Logger = {
30+
debug: () => {},
31+
error: () => {},
32+
info: () => {},
33+
warn: () => {},
34+
}
35+
2936
// Create mock static templates that will be used by the agent registry
3037
const mockStaticTemplates: Record<string, AgentTemplate> = {
3138
base: {
@@ -101,15 +108,6 @@ describe('Agent Registry', () => {
101108
desc: (field: any) => ({ type: 'desc', field }),
102109
eq: (field: any, value: any) => ({ type: 'eq', field, value }),
103110
}))
104-
105-
// Mock logger
106-
mockModule('../util/logger', () => ({
107-
logger: {
108-
debug: () => {},
109-
error: () => {},
110-
warn: () => {},
111-
},
112-
}))
113111
})
114112
let mockFileContext: ProjectFileContext
115113

@@ -149,15 +147,6 @@ describe('Agent Registry', () => {
149147
desc: (field: any) => ({ type: 'desc', field }),
150148
eq: (field: any, value: any) => ({ type: 'eq', field, value }),
151149
}))
152-
153-
// Mock logger
154-
mockModule('../util/logger', () => ({
155-
logger: {
156-
debug: () => {},
157-
error: () => {},
158-
warn: () => {},
159-
},
160-
}))
161150
})
162151

163152
beforeEach(async () => {
@@ -251,33 +240,80 @@ describe('Agent Registry', () => {
251240
} as AgentTemplate,
252241
}
253242

254-
const result = await getAgentTemplate('my-agent', localAgents)
243+
const logger = {
244+
debug: () => {},
245+
info: () => {},
246+
warn: () => {},
247+
error: () => {},
248+
}
249+
const result = await getAgentTemplate({
250+
agentId: 'my-agent',
251+
localAgentTemplates: localAgents,
252+
logger,
253+
})
255254
expect(result).toBeTruthy()
256255
expect(result?.id).toBe('my-agent')
257256
})
258257

259258
it('should handle agent IDs with publisher but no version', async () => {
260-
const result = await getAgentTemplate('publisher/agent-name', {})
259+
const logger = {
260+
debug: () => {},
261+
info: () => {},
262+
warn: () => {},
263+
error: () => {},
264+
}
265+
const result = await getAgentTemplate({
266+
agentId: 'publisher/agent-name',
267+
localAgentTemplates: {},
268+
logger,
269+
})
261270
expect(result).toBeNull()
262271
})
263272

264273
it('should handle agent IDs with publisher and version', async () => {
265-
const result = await getAgentTemplate('publisher/agent-name@1.0.0', {})
274+
const logger = {
275+
debug: () => {},
276+
info: () => {},
277+
warn: () => {},
278+
error: () => {},
279+
}
280+
const result = await getAgentTemplate({
281+
agentId: 'publisher/agent-name@1.0.0',
282+
localAgentTemplates: {},
283+
logger,
284+
})
266285
expect(result).toBeNull()
267286
})
268287

269288
it('should return null for invalid agent ID formats', async () => {
270-
const result = await getAgentTemplate(
271-
'invalid/format/with/too/many/slashes',
272-
{},
273-
)
289+
const logger = {
290+
debug: () => {},
291+
info: () => {},
292+
warn: () => {},
293+
error: () => {},
294+
}
295+
const result = await getAgentTemplate({
296+
agentId: 'invalid/format/with/too/many/slashes',
297+
localAgentTemplates: {},
298+
logger,
299+
})
274300
expect(result).toBeNull()
275301
})
276302
})
277303

278304
describe('fetchAgentFromDatabase', () => {
279305
it('should return null when agent not found in database', async () => {
280-
const result = await getAgentTemplate('nonexistent/agent@1.0.0', {})
306+
const logger = {
307+
debug: () => {},
308+
info: () => {},
309+
warn: () => {},
310+
error: () => {},
311+
}
312+
const result = await getAgentTemplate({
313+
agentId: 'nonexistent/agent@1.0.0',
314+
localAgentTemplates: {},
315+
logger,
316+
})
281317
expect(result).toBeNull()
282318
})
283319

@@ -315,10 +351,17 @@ describe('Agent Registry', () => {
315351
}) as any,
316352
)
317353

318-
const result = await getAgentTemplate(
319-
'test-publisher/test-agent@1.0.0',
320-
{},
321-
)
354+
const logger = {
355+
debug: () => {},
356+
info: () => {},
357+
warn: () => {},
358+
error: () => {},
359+
}
360+
const result = await getAgentTemplate({
361+
agentId: 'test-publisher/test-agent@1.0.0',
362+
localAgentTemplates: {},
363+
logger,
364+
})
322365
expect(result).toBeTruthy()
323366
expect(result?.id).toBe('test-publisher/test-agent@1.0.0')
324367
})
@@ -345,7 +388,17 @@ describe('Agent Registry', () => {
345388
} as AgentTemplate,
346389
}
347390

348-
const result = await getAgentTemplate('test-agent', localAgents)
391+
const logger = {
392+
debug: () => {},
393+
info: () => {},
394+
warn: () => {},
395+
error: () => {},
396+
}
397+
const result = await getAgentTemplate({
398+
agentId: 'test-agent',
399+
localAgentTemplates: localAgents,
400+
logger,
401+
})
349402
expect(result).toBeTruthy()
350403
expect(result?.displayName).toBe('Local Test Agent')
351404
})
@@ -385,18 +438,20 @@ describe('Agent Registry', () => {
385438
)
386439

387440
// First call - should hit database
388-
const result1 = await getAgentTemplate(
389-
'test-publisher/cached-agent@1.0.0',
390-
{},
391-
)
441+
const result1 = await getAgentTemplate({
442+
agentId: 'test-publisher/cached-agent@1.0.0',
443+
localAgentTemplates: {},
444+
logger,
445+
})
392446
expect(result1).toBeTruthy()
393447
expect(selectSpy).toHaveBeenCalledTimes(1)
394448

395449
// Second call - should use cache
396-
const result2 = await getAgentTemplate(
397-
'test-publisher/cached-agent@1.0.0',
398-
{},
399-
)
450+
const result2 = await getAgentTemplate({
451+
agentId: 'test-publisher/cached-agent@1.0.0',
452+
localAgentTemplates: {},
453+
logger,
454+
})
400455
expect(result2).toBeTruthy()
401456
expect(result2?.displayName).toBe('Cached Agent')
402457
expect(selectSpy).toHaveBeenCalledTimes(1)
@@ -424,7 +479,13 @@ describe('Agent Registry', () => {
424479
},
425480
}
426481

427-
const result = assembleLocalAgentTemplates(fileContext)
482+
const logger = {
483+
debug: () => {},
484+
info: () => {},
485+
warn: () => {},
486+
error: () => {},
487+
}
488+
const result = assembleLocalAgentTemplates({ fileContext, logger })
428489

429490
// Should have dynamic template
430491
expect(result.agentTemplates).toHaveProperty('custom-agent')
@@ -448,7 +509,13 @@ describe('Agent Registry', () => {
448509
},
449510
}
450511

451-
const result = assembleLocalAgentTemplates(fileContext)
512+
const logger = {
513+
debug: () => {},
514+
info: () => {},
515+
warn: () => {},
516+
error: () => {},
517+
}
518+
const result = assembleLocalAgentTemplates({ fileContext, logger })
452519

453520
// Should not have invalid template
454521
expect(result.agentTemplates).not.toHaveProperty('invalid-agent')
@@ -463,7 +530,13 @@ describe('Agent Registry', () => {
463530
agentTemplates: {},
464531
}
465532

466-
const result = assembleLocalAgentTemplates(fileContext)
533+
const logger = {
534+
debug: () => {},
535+
info: () => {},
536+
warn: () => {},
537+
error: () => {},
538+
}
539+
const result = assembleLocalAgentTemplates({ fileContext, logger })
467540

468541
// Should have no validation errors
469542
expect(result.validationErrors).toHaveLength(0)
@@ -509,35 +582,83 @@ describe('Agent Registry', () => {
509582
)
510583

511584
// First call - should hit database and populate cache
512-
await getAgentTemplate('test-publisher/cache-test-agent@1.0.0', {})
585+
const logger = {
586+
debug: () => {},
587+
info: () => {},
588+
warn: () => {},
589+
error: () => {},
590+
}
591+
await getAgentTemplate({
592+
agentId: 'test-publisher/cache-test-agent@1.0.0',
593+
localAgentTemplates: {},
594+
logger,
595+
})
513596
expect(selectSpy).toHaveBeenCalledTimes(1)
514597

515598
// Second call - should use cache
516-
await getAgentTemplate('test-publisher/cache-test-agent@1.0.0', {})
599+
await getAgentTemplate({
600+
agentId: 'test-publisher/cache-test-agent@1.0.0',
601+
localAgentTemplates: {},
602+
logger,
603+
})
517604
expect(selectSpy).toHaveBeenCalledTimes(1)
518605

519606
// Clear cache
520607
clearDatabaseCache()
521608

522609
// Third call - should hit database again after cache clear
523-
await getAgentTemplate('test-publisher/cache-test-agent@1.0.0', {})
610+
await getAgentTemplate({
611+
agentId: 'test-publisher/cache-test-agent@1.0.0',
612+
localAgentTemplates: {},
613+
logger,
614+
})
524615
expect(selectSpy).toHaveBeenCalledTimes(2)
525616
})
526617
})
527618

528619
describe('edge cases', () => {
529620
it('should handle empty agent ID', async () => {
530-
const result = await getAgentTemplate('', {})
621+
const logger = {
622+
debug: () => {},
623+
info: () => {},
624+
warn: () => {},
625+
error: () => {},
626+
}
627+
const result = await getAgentTemplate({
628+
agentId: '',
629+
localAgentTemplates: {},
630+
logger,
631+
})
531632
expect(result).toBeNull()
532633
})
533634

534635
it('should handle agent ID with multiple @ symbols', async () => {
535-
const result = await getAgentTemplate('publisher/agent@1.0.0@extra', {})
636+
const logger = {
637+
debug: () => {},
638+
info: () => {},
639+
warn: () => {},
640+
error: () => {},
641+
}
642+
const result = await getAgentTemplate({
643+
agentId: 'publisher/agent@1.0.0@extra',
644+
localAgentTemplates: {},
645+
logger,
646+
})
536647
expect(result).toBeNull()
537648
})
538649

539650
it('should handle agent ID with only @ symbol', async () => {
540-
const result = await getAgentTemplate('publisher/agent@', {})
651+
const logger = {
652+
debug: () => {},
653+
info: () => {},
654+
warn: () => {},
655+
error: () => {},
656+
}
657+
const result = await getAgentTemplate({
658+
agentId: 'publisher/agent@',
659+
localAgentTemplates: {},
660+
logger,
661+
})
541662
expect(result).toBeNull()
542663
})
543664

@@ -547,7 +668,17 @@ describe('Agent Registry', () => {
547668
throw new Error('Database connection failed')
548669
})
549670

550-
const result = await getAgentTemplate('publisher/agent@1.0.0', {})
671+
const logger = {
672+
debug: () => {},
673+
info: () => {},
674+
warn: () => {},
675+
error: () => {},
676+
}
677+
const result = await getAgentTemplate({
678+
agentId: 'publisher/agent@1.0.0',
679+
localAgentTemplates: {},
680+
logger,
681+
})
551682
expect(result).toBeNull()
552683
})
553684

@@ -577,10 +708,17 @@ describe('Agent Registry', () => {
577708
}) as any,
578709
)
579710

580-
const result = await getAgentTemplate(
581-
'publisher/malformed-agent@1.0.0',
582-
{},
583-
)
711+
const logger = {
712+
debug: () => {},
713+
info: () => {},
714+
warn: () => {},
715+
error: () => {},
716+
}
717+
const result = await getAgentTemplate({
718+
agentId: 'publisher/malformed-agent@1.0.0',
719+
localAgentTemplates: {},
720+
logger,
721+
})
584722
expect(result).toBeNull()
585723
})
586724
})

0 commit comments

Comments
 (0)