feat(#22): implement brain query API

- Create brain module with service, controller, and DTOs
- POST /api/brain/query - Structured queries for tasks, events, projects
- GET /api/brain/context - Get current workspace context for agents
- GET /api/brain/search - Search across all entities
- Support filters: status, priority, date ranges, assignee, etc.
- 41 tests covering service (27) and controller (14)
- Integrated with AuthGuard, WorkspaceGuard, PermissionGuard
This commit is contained in:
Jason Woltje
2026-01-29 19:40:30 -06:00
parent 1cb54b56b0
commit 1bd21b33d7
8 changed files with 1392 additions and 0 deletions

View File

@@ -0,0 +1,48 @@
import {
Controller,
Get,
Post,
Body,
Query,
UseGuards,
} from "@nestjs/common";
import { BrainService } from "./brain.service";
import { BrainQueryDto, BrainContextDto } from "./dto";
import { AuthGuard } from "../auth/guards/auth.guard";
import { WorkspaceGuard, PermissionGuard } from "../common/guards";
import { Workspace, Permission, RequirePermission } from "../common/decorators";
@Controller("brain")
@UseGuards(AuthGuard, WorkspaceGuard, PermissionGuard)
export class BrainController {
constructor(private readonly brainService: BrainService) {}
@Post("query")
@RequirePermission(Permission.WORKSPACE_ANY)
async query(
@Body() queryDto: BrainQueryDto,
@Workspace() workspaceId: string
) {
return this.brainService.query({ ...queryDto, workspaceId });
}
@Get("context")
@RequirePermission(Permission.WORKSPACE_ANY)
async getContext(
@Query() contextDto: BrainContextDto,
@Workspace() workspaceId: string
) {
return this.brainService.getContext({ ...contextDto, workspaceId });
}
@Get("search")
@RequirePermission(Permission.WORKSPACE_ANY)
async search(
@Query("q") searchTerm: string,
@Query("limit") limit: string,
@Workspace() workspaceId: string
) {
const parsedLimit = limit ? Math.min(parseInt(limit, 10) || 20, 100) : 20;
return this.brainService.search(workspaceId, searchTerm || "", parsedLimit);
}
}