buster/apps/server/README.md

375 lines
13 KiB
Markdown
Raw Permalink Normal View History

Mastra braintrust (#391) * type fixes * biome clean on ai * add user to flag chat * attempt to get vercel deployed * Update tsup.config.ts * Update pnpm-lock.yaml * Add @buster/server2 Hono API app with Vercel deployment configuration * slack oauth integration * mainly some clean up and biome formatting * slack oauth * slack migration + snapshot * remove unused files * finalized docker image for porter * Create porter_app_buster-server_3155.yml file * Add integration tests for Slack handler and refactor Slack OAuth service - Introduced integration tests for the Slack handler, covering OAuth initiation, callback handling, and integration status retrieval. - Refactored Slack OAuth service to improve error handling and ensure proper integration state management. - Updated token storage implementation to use a database vault instead of Supabase. - Enhanced existing tests for better coverage and reliability, including cleanup of test data. - Added new utility functions for managing vault secrets in the database. * docker image update * new prompts * individual tests and a schema fix * server build * final working dockerfile * Update Dockerfile * new messages to slack messages (#369) * Update dockerfile * Update validate-env.js * update build pipeline * Update the dockerfile flow * finalize logging for pino * stable base * Update cors middleware logger * Update cors.ts * update docker to be more imformative * Update index.ts * Update auth.ts * Update cors.ts * Update cors.ts * Update logger.ts * remove logs * more cors updates * build server shared * Refactor PostgreSQL credentials handling and remove unused memory storage. Update package dependencies. (#370) * tons of file parsing errors (#371) * Refactor PostgreSQL credentials handling and remove unused memory storage. Update package dependencies. * tons of file parsing errors * Dev mode updates * more stable electric handler * Dal/agent-self-healing-fixes (#372) * change to 6 min * optmizations around saving and non-blocking actions. * stream optimizations * Dal/agent-self-healing-fixes (#373) * change to 6 min * optmizations around saving and non-blocking actions. * stream optimizations * change porter staging deploy to mastra-braintrust. * new path for porter deploy * deploy to staging fix * Create porter_app_mastra-braintrust-api_3155.yml file (#375) Co-authored-by: porter-deployment-app[bot] <87230664+porter-deployment-app[bot]@users.noreply.github.com> * Update sizing and opacity * supe up the instance for mastra * environment staging * ssl script * copy path * Update list padding * no throttle and the anthropic cached * move select to the top * Update margin inline start * shrink reasoning vertical space to 2px * semi bold font for headers * update animation timing * haiku * Add createTodoList tool and integrate into create-todos-step * chat helper on post chat * only trigger cicd when change made * Start created streaming text components * Refactor analyst agent task to initialize Braintrust logging asynchronously and parallelize database queries for improved performance. Adjusted cleanup timeout for Braintrust traces to reduce delays. * fixed reasoned for X, so that it rounds down to the minute * Update users page * update build pipeline for new web * document title update * Named chats for page * Datasets titles * Refactor visualization tools and enhance error handling in retryable agent stream. Removed unused metricValueLabel from metrics file tool, updated metric configuration schemas, and improved healing mechanism for tool errors during streaming. * analyst * document title updates * Update useDocumentTitle.tsx * Refactor tool choice configuration in create-todos-step to use structured object. Remove exponential backoff logic from retryable agent stream for healable errors. Introduce new test for real-world healing scenarios in retryable agent stream. * Refactor SQL validation logic in modify-metrics-file-tool to skip unnecessary checks when SQL has not changed. Enhance error handling and update validation messages. Clean up code formatting for improved readability. * update collapse for filecard * chevron collapse * Jacob prompt changes (#376) * prompt changes to improve filtering logic and handle priv/sec errors * prompt changes to make aggregation better and improved filter best practices * Update packages/ai/src/steps/create-todos-step.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * Update packages/ai/src/agents/think-and-prep-agent/think-and-prep-instructions.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * Update packages/ai/src/steps/create-todos-step.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --------- Co-authored-by: Jacob Anderson <jacobanderson@Jacobs-MacBook-Air.local> Co-authored-by: dal <dallin@buster.so> Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * think and prep * change header and strong fonts weights * Update get collection * combo chart x axis update * Create a chart schemas as types * schema types * simple unit tests for line chart props * fix the response file ordering iwth active selection. * copy around reasoning messages taken care of * fix nullable user message and file processing and such. * update ticks for chart config * fix todo parsing. * app markdown update * Update splitter to use border instead of width * change ml * If no file is found we should auto redirect * Refactor database connection handling to support SSL modes. Introduced functions to extract SSL parameters and manage connections based on SSL requirements, including a custom verifier for unverified connections. * black box message update * chat title updates * optimizations for trigger. * some keepalive logic on the anthropic cached * keep title empty until new one * no duplicate messages * null user message on asset pull * posthog error handling * 20 sec idle timeout on anthropic * null req message * fixed modificiation names missing * Refactor tool call handling to support new content array format in asset messages and context loaders * cache most recent file from workflow * Enhance date and number detection in createDataMetadata function to improve data type handling for metrics files * group hover effect for message * logging for chat * Add messageId handling and file association tracking in dashboard and metrics tools - Updated runtime context to include messageId in create and modify dashboard and metrics file tools. - Implemented file association tracking based on messageId in create and modify functions for both dashboards and metrics. - Ensured type consistency by using AnalystRuntimeContext in runtime context parameters. * logging for chat * message type update * Route to first file instead * trigger moved to catalog * Enhance file selection logic to support YAML parsing and improve logging - Updated `extractMetricIdsFromDashboard` to first attempt JSON parsing, falling back to a regex-based YAML parsing for metric IDs. - Added detailed debug logging in `selectFilesForResponse` to track file selection process, including metrics and dashboards involved. - Introduced tests for various scenarios in `file-selection.test.ts` to ensure correct behavior with dashboard context and edge cases. * trigger dev v4-beta * Retry + Self Healing (#381) * Refactor retry logic in analyst and think-and-prep steps Co-authored-by: dallin <dallin@buster.so> * some fixes * console log error * self healing * todos retry --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> * remove lots of logs * Remove chat streaming * Remove chat streaming * timeout * Change to updated at field * link to home * Update timeout settings for HTTP and HTTPS agents from 20 seconds to 10 seconds for improved responsiveness. * Add utils module and integrate message conversion in post_chat_handler * Implement error handling for extract values (#382) * Remove chat streaming * Improve error handling and logging in extract values and chat title steps Co-authored-by: dallin <dallin@buster.so> --------- Co-authored-by: Nate Kelley <nate@buster.so> Co-authored-by: Cursor Agent <cursoragent@cursor.com> * loading icon for buster avatar * finalize tooltip cache * upgrade mastra * increase retries * Add redo functionality for chat messages - Introduced `redoFromMessageId` parameter in `handleExistingChat` to allow users to specify a message to redo from. - Implemented validation to ensure the specified message belongs to the current chat. - Added `softDeleteMessagesFromPoint` function to soft delete a message and all subsequent messages in the same chat, facilitating the redo feature. * fix electric potential memory leak * tooltip cache and chart cleanup * Update bullet to be more indented * latest version number * add support endpoint to new server * Fix jank in combo bar charts * index check for dashboard * Collapse only if there are metrics * Is finished reasoing back * Update dependencies and enhance chat message handling - Upgraded `@mastra/core` to version 0.10.8 and added `node-sql-parser` at version 5.3.10 in the lock file. - Improved integration tests for chat message redo functionality, ensuring correct behavior when deriving `chat_id` from `message_id`. - Enhanced error handling and validation in the `initializeChat` function to manage cases where `chat_id` is not provided. * Update pnpm-lock and enhance chat message integration tests - Added `node-sql-parser` version 5.3.10 to dependencies and updated the lock file. - Improved integration tests for chat message redo functionality, ensuring accurate deletion and retrieval of messages. - Enhanced the `initializeChat` function to derive `chat_id` from `message_id` when not provided, improving error handling and validation. * remove .env import breaking build * add updated at to the get chat handler * zmall runtime error fix * permission tests passing * return updated at on the get chat handler now * slq parser fixes * Implement chat access control logic and add comprehensive tests - Developed the `canUserAccessChat` function to determine user access to chats based on direct permissions, collection permissions, creator status, and organizational roles. - Introduced helper functions for checking permissions and retrieving chat information. - Added integration tests to validate access control logic, covering various scenarios including direct permissions, collection permissions, and user roles. - Created unit tests to ensure the correctness of the access control function with mocked database interactions. - Included simple integration tests to verify functionality with existing database data. * sql parser and int tests working. * fix test and lint issues * comment to kick off deployment lo * access controls on datasets * electric context bug fix with sql helpers. * permission and read only * Add lru-cache dependency and export cache management functions - Added `lru-cache` as a dependency in the access-controls package. - Exported new cache management functions from `chats-cached` module, including `canUserAccessChatCached`, `getCacheStats`, `resetCacheStats`, `clearCache`, `invalidateAccess`, `invalidateUserAccess`, and `invalidateChatAccess`. * packages deploy as well * wrong workflow lol * Update AppVerticalCodeSplitter.tsx * Add error handling for query run and SQL save operations Co-authored-by: natemkelley <natemkelley@gmail.com> * Trim whitespace from input values before sending chat prompts Co-authored-by: natemkelley <natemkelley@gmail.com> * type in think-and-prep * use the cached access chat * update package version * new asset import message * Error fallback for login * Update BusterChart.BarChart.stories.tsx * Staging changes to fix number card titles, combo chart axis, and using dynamic filters (#386) Co-authored-by: Jacob Anderson <jacobanderson@Jacobs-MacBook-Air.local> * db init command pass through * combo chart fixes (#387) Co-authored-by: Jacob Anderson <jacobanderson@Jacobs-MacBook-Air.local> * clarifying question and connection logic * pino pretty error fix * clarifying is a finishing tool * change update latest version logic * Update support endpoint * fixes for horizontal bar charts and added the combo chart logic to update metrics (#388) Co-authored-by: Jacob Anderson <jacobanderson@Jacobs-MacBook-Air.local> * permission fix on dashboard metric handlers for workspace and data admin * Add more try catches * Hide avatar is no more * Horizontal bar fixes (#389) * fixes for horizontal bar charts and added the combo chart logic to update metrics * hopefully fixed horizontal bar charts --------- Co-authored-by: Jacob Anderson <jacobanderson@Jacobs-MacBook-Air.local> * reasoning shimmer update * Make the embed flow work with versions * new account warning update * Move support modal * compact number for pie label * Add final reasoning message tracking and workflow start time to chunk processor and related steps - Introduced `finalReasoningMessage` to schemas in `analyst-step`, `mark-message-complete-step`, and `create-todos-step`. - Updated `ChunkProcessor` to calculate and store the final reasoning message based on workflow duration. - Enhanced various steps to utilize the new `workflowStartTime` for better tracking of execution duration. - Improved database update logic to include `finalReasoningMessage` when applicable. * 9 digit cutoff for pie * trigger update * test on mastra braintrust * test deployment * testing * pnpm install * pnpm * node 22 * pnpm version * trigger main * get initial chat file * hono main deploymenbt * clear timeouts * Remove console logs * migration test to staging * db url * try again * k get rid of tls var * hmmm lets try this * mark migrations * fix migration file? * drizzle-kit upgrade * tweaks to the github actions --------- Co-authored-by: Nate Kelley <nate@buster.so> Co-authored-by: porter-deployment-app[bot] <87230664+porter-deployment-app[bot]@users.noreply.github.com> Co-authored-by: Nate Kelley <133379588+nate-kelley-buster@users.noreply.github.com> Co-authored-by: Jacob Anderson <jacobanderson@Jacobs-MacBook-Air.local> Co-authored-by: jacob-buster <jacob@buster.so> Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: natemkelley <natemkelley@gmail.com>
2025-07-03 05:33:40 +08:00
## Overview
This server is part of the Buster monorepo and provides a robust API layer with middleware support and utility functions. It contains all the API routes that can be consumed by the Buster application, serving as the central backend service for data processing, user management, and business logic. The server is designed to be runtime-agnostic but will use Bun in the meantime.
## Installation
To install dependencies:
```sh
bun install
```
## Development
To run the development server:
```sh
bun run dev
```
The server will be available at http://localhost:3002 (unless specified otherwise in the .env file under PORT)
## Folder Structure
```
src/
├── api/ # API route handlers and endpoints
│ ├── v2/ # Version 2 API routes (current)
│ │ ├── datasets/ # Dataset related routes
│ │ ├── user/ # User management routes
│ │ └── ... # Feature-specific route groups
├── middleware/ # Custom middleware functions
│ ├── cors.ts # CORS configuration
│ ├── logger.ts # Request logging
│ └── ... # Other middleware
├── utils/ # Utility functions and helpers
│ └── ... # Other utilities
└── app.ts # Main Hono application setup
```
### Directory Guidelines
- **`src/api/`**: Contains all route handlers organized by API version, then by feature or resource. Each version directory (e.g., `v2/`, `v3/`) contains feature-specific subdirectories that export Hono app instances for mounting to the main app.
- **API Versioning**: Routes are organized by version to ensure backward compatibility and smooth API evolution. **Note**: `v1/` was deprecated and removed as part of a migration. Current structure includes:
- `src/api/v2/user/` - Version 2 user management endpoints (current)
- `src/api/v2/datasets/` - Version 2 datasets endpoints (current)
- **`src/middleware/`**: Custom middleware functions that can be applied globally or to specific routes. Follow Hono's middleware patterns for consistency.
- **`src/utils/`**: Shared utility functions, validators, response helpers, and other common functionality used across the application.
## Business Logic Architecture
The server follows a clean architecture pattern where **API routes consume business logic through packages** located in `@/packages`. This separation ensures that:
- Business logic is reusable across different parts of the application
- API routes remain thin and focused on HTTP concerns
- Core functionality is testable independently of the web layer
### Package Consumption Pattern
For most features, API routes will consume corresponding packages for their business logic:
```typescript
// Example: V2 User API routes consume the users package
import { getUserById, createUser, updateUser } from '@/packages/users';
// API route handlers focus on HTTP concerns
app.get('/v2/user/:id', async (c) => {
const userId = c.req.param('id');
// Business logic is handled by packages
const user = await getUserById(userId);
return c.json(user);
});
```
### Package Structure
Each package in `@/packages` typically contains:
- **Queries**: Database operations and data access logic
- **Business Logic**: Core functionality, validation, and business rules
- **Types**: TypeScript definitions specific to that domain
### Examples
- `@/packages/users` - User management, profile operations
- `@/packages/datasets` - Dataset management
- `@/packages/database` - Raw Database connection, migrations, shared utilities (rarely used)
This architecture keeps the server layer focused on HTTP routing, middleware, and request/response handling while delegating domain logic to specialized packages.
## API Route Patterns
We follow a specific modular pattern for organizing API routes that promotes maintainability, type safety, and clear separation of concerns.
### Modular Route Structure
Each HTTP method is defined in its own dedicated file and exported through a barrel pattern:
```
src/api/v2/organization/
├── GET.ts # Handles GET /organization
├── PUT.ts # Handles PUT /organization
├── POST.ts # Handles POST /organization (if needed)
├── DELETE.ts # Handles DELETE /organization (if needed)
└── index.ts # Barrel export that combines all methods
```
2025-07-18 02:48:45 +08:00
### Nested Route Structure
The modular pattern extends seamlessly to nested routes. You can create deeper path structures by nesting directories:
```
src/api/v2/organization/
├── GET.ts # Handles GET /organization
├── PUT.ts # Handles PUT /organization
├── index.ts # Barrel export for /organization
└── members/ # Nested route for /organization/members
├── GET.ts # Handles GET /organization/members
├── POST.ts # Handles POST /organization/members
├── index.ts # Barrel export for /organization/members
└── [id]/ # Dynamic nested route for /organization/members/:id
├── GET.ts # Handles GET /organization/members/:id
├── PUT.ts # Handles PUT /organization/members/:id
├── DELETE.ts # Handles DELETE /organization/members/:id
└── index.ts # Barrel export for /organization/members/:id
```
To mount nested routes, the parent's `index.ts` would route to the child:
```typescript
// organization/index.ts
import { Hono } from 'hono';
import { requireAuth } from '../../../middleware/auth';
import GET from './GET';
import PUT from './PUT';
import members from './members'; // Import nested route
const app = new Hono()
.use('*', requireAuth)
.route('/', GET)
.route('/', PUT)
.route('/members', members); // Mount nested route
export default app;
```
**Example Implementation:**
```typescript
// GET.ts - Individual route handler
import { getOrganization } from '@buster/database';
import type { GetOrganizationResponse } from '@buster/server-shared/organization';
import { Hono } from 'hono';
import { requireOrganization } from '../../../middleware/auth';
const app = new Hono()
.use('*', requireOrganization)
.get('/', async (c) => {
const userOrg = c.get('userOrganizationInfo');
const organization: GetOrganizationResponse = await getOrganization({
organizationId: userOrg.organizationId,
});
return c.json(organization);
});
export default app;
```
```typescript
// index.ts - Barrel export combining all methods
import { Hono } from 'hono';
import { requireAuth } from '../../../middleware/auth';
import GET from './GET';
import PUT from './PUT';
const app = new Hono()
.use('*', requireAuth) // Global middleware for all methods
.route('/', GET) // Mount individual route handlers
.route('/', PUT);
export default app;
```
### Middleware Architecture
We use a layered middleware approach for authentication and authorization:
1. **Global Authentication**: Applied at the barrel export level (`requireAuth`)
2. **Method-Specific Authorization**: Applied in individual route files (`requireOrganization`, `requireOrganizationAdmin`)
```typescript
// index.ts - Global auth for all methods
const app = new Hono()
.use('*', requireAuth) // ALL routes require authentication
.route('/', GET)
.route('/', PUT);
// PUT.ts - Additional admin requirement for updates
const app = new Hono()
.use('*', requireOrganizationAdmin) // PUT requires admin privileges
.put('/', zValidator('json', UpdateOrganizationRequestSchema), async (c) => {
// Handler logic
});
```
### Type Safety and Validation
All endpoints must define strict request and response types using our established patterns:
#### 1. Schema Definition in `@buster/server-shared`
```typescript
// @buster/server-shared/organization/types.ts
import { z } from 'zod';
export const UpdateOrganizationRequestSchema = z.object({
colorPalette: z.array(z.string()).optional(),
// ... other fields
});
export type UpdateOrganizationRequest = z.infer<typeof UpdateOrganizationRequestSchema>;
export type UpdateOrganizationResponse = {
id: string;
name: string;
// ... organization fields
};
```
#### 2. Import Types with `type` Keyword
**Critical**: Always use the `type` keyword when importing types to minimize build size:
```typescript
import type {
UpdateOrganizationRequest,
UpdateOrganizationResponse
} from '@buster/server-shared/organization';
import { UpdateOrganizationRequestSchema } from '@buster/server-shared/organization';
```
#### 3. Use Hono's `zValidator` for Request Validation
```typescript
import { zValidator } from '@hono/zod-validator';
const app = new Hono()
.put('/', zValidator('json', UpdateOrganizationRequestSchema), async (c) => {
const request = c.req.valid('json'); // Fully typed request
// Handler logic
});
```
### Database Interaction Pattern
**Important**: All database interactions must go through the `@buster/database` package. Never interact with the database directly in route handlers.
```typescript
// ✅ Correct - Use database package functions
import { getOrganization, updateOrganization } from '@buster/database';
const organization = await getOrganization({ organizationId });
await updateOrganization({ organizationId, ...request });
// ❌ Incorrect - Direct database queries
// const result = await db.query('SELECT * FROM organizations...');
```
### Error Handling Strategy
We pass detailed errors straight through to the client to make debugging easier for developers. Use the shared error handling utilities from `@/utils/response`:
```typescript
import { standardErrorHandler } from '../../utils/response';
// Basic usage - handles all error types automatically
.onError(standardErrorHandler);
// With custom message for specific errors
.onError((e, c) => standardErrorHandler(e, c, 'Failed to update organization settings'));
```
**Available Error Utilities:**
- `standardErrorHandler(error, context, customMessage?)` - Complete error handler that returns Hono response for all error types
- `handleZodError(zodError)` - Specifically formats Zod validation errors with detailed issues
- `errorResponse(message, status)` - Creates HTTPException for throwing errors
- `notFoundResponse(resource)` - Standard 404 error
- `unauthorizedResponse(message)` - Standard 401 error
### Complete Route Handler Template
```typescript
import { /* database functions */ } from '@buster/database';
import type { User } from '@buster/database';
import type {
RequestType,
ResponseType
} from '@buster/server-shared/feature';
import { RequestSchema } from '@buster/server-shared/feature';
import { zValidator } from '@hono/zod-validator';
import { Hono } from 'hono';
import { z } from 'zod';
import { /* middleware */ } from '../../../middleware/auth';
import { standardErrorHandler, errorResponse } from '../../utils/response';
/**
* Handler function with proper error handling
*/
async function handlerFunction(
resourceId: string,
request: RequestType,
user: User
): Promise<ResponseType> {
try {
// Database operations through @buster/database
const result = await databaseFunction({ resourceId, ...request });
return result;
} catch (error) {
console.error('Error in handler:', {
resourceId,
userId: user.id,
error: error instanceof Error ? error.message : error,
});
// Re-throw Zod errors for route error handler
if (error instanceof z.ZodError) {
throw error;
}
// Use shared error response utility
throw errorResponse('Operation failed', 500);
}
}
const app = new Hono()
.use('*', /* appropriate middleware */)
.put('/', zValidator('json', RequestSchema), async (c) => {
const request = c.req.valid('json');
const user = c.get('busterUser');
const userOrg = c.get('userOrganizationInfo');
const response = await handlerFunction(
userOrg.organizationId,
request,
user
);
return c.json(response);
})
.onError(standardErrorHandler);
// Or with custom error message for this specific route
// .onError((e, c) => standardErrorHandler(e, c, 'Failed to update organization'));
export default app;
```
Mastra braintrust (#391) * type fixes * biome clean on ai * add user to flag chat * attempt to get vercel deployed * Update tsup.config.ts * Update pnpm-lock.yaml * Add @buster/server2 Hono API app with Vercel deployment configuration * slack oauth integration * mainly some clean up and biome formatting * slack oauth * slack migration + snapshot * remove unused files * finalized docker image for porter * Create porter_app_buster-server_3155.yml file * Add integration tests for Slack handler and refactor Slack OAuth service - Introduced integration tests for the Slack handler, covering OAuth initiation, callback handling, and integration status retrieval. - Refactored Slack OAuth service to improve error handling and ensure proper integration state management. - Updated token storage implementation to use a database vault instead of Supabase. - Enhanced existing tests for better coverage and reliability, including cleanup of test data. - Added new utility functions for managing vault secrets in the database. * docker image update * new prompts * individual tests and a schema fix * server build * final working dockerfile * Update Dockerfile * new messages to slack messages (#369) * Update dockerfile * Update validate-env.js * update build pipeline * Update the dockerfile flow * finalize logging for pino * stable base * Update cors middleware logger * Update cors.ts * update docker to be more imformative * Update index.ts * Update auth.ts * Update cors.ts * Update cors.ts * Update logger.ts * remove logs * more cors updates * build server shared * Refactor PostgreSQL credentials handling and remove unused memory storage. Update package dependencies. (#370) * tons of file parsing errors (#371) * Refactor PostgreSQL credentials handling and remove unused memory storage. Update package dependencies. * tons of file parsing errors * Dev mode updates * more stable electric handler * Dal/agent-self-healing-fixes (#372) * change to 6 min * optmizations around saving and non-blocking actions. * stream optimizations * Dal/agent-self-healing-fixes (#373) * change to 6 min * optmizations around saving and non-blocking actions. * stream optimizations * change porter staging deploy to mastra-braintrust. * new path for porter deploy * deploy to staging fix * Create porter_app_mastra-braintrust-api_3155.yml file (#375) Co-authored-by: porter-deployment-app[bot] <87230664+porter-deployment-app[bot]@users.noreply.github.com> * Update sizing and opacity * supe up the instance for mastra * environment staging * ssl script * copy path * Update list padding * no throttle and the anthropic cached * move select to the top * Update margin inline start * shrink reasoning vertical space to 2px * semi bold font for headers * update animation timing * haiku * Add createTodoList tool and integrate into create-todos-step * chat helper on post chat * only trigger cicd when change made * Start created streaming text components * Refactor analyst agent task to initialize Braintrust logging asynchronously and parallelize database queries for improved performance. Adjusted cleanup timeout for Braintrust traces to reduce delays. * fixed reasoned for X, so that it rounds down to the minute * Update users page * update build pipeline for new web * document title update * Named chats for page * Datasets titles * Refactor visualization tools and enhance error handling in retryable agent stream. Removed unused metricValueLabel from metrics file tool, updated metric configuration schemas, and improved healing mechanism for tool errors during streaming. * analyst * document title updates * Update useDocumentTitle.tsx * Refactor tool choice configuration in create-todos-step to use structured object. Remove exponential backoff logic from retryable agent stream for healable errors. Introduce new test for real-world healing scenarios in retryable agent stream. * Refactor SQL validation logic in modify-metrics-file-tool to skip unnecessary checks when SQL has not changed. Enhance error handling and update validation messages. Clean up code formatting for improved readability. * update collapse for filecard * chevron collapse * Jacob prompt changes (#376) * prompt changes to improve filtering logic and handle priv/sec errors * prompt changes to make aggregation better and improved filter best practices * Update packages/ai/src/steps/create-todos-step.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * Update packages/ai/src/agents/think-and-prep-agent/think-and-prep-instructions.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * Update packages/ai/src/steps/create-todos-step.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --------- Co-authored-by: Jacob Anderson <jacobanderson@Jacobs-MacBook-Air.local> Co-authored-by: dal <dallin@buster.so> Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * think and prep * change header and strong fonts weights * Update get collection * combo chart x axis update * Create a chart schemas as types * schema types * simple unit tests for line chart props * fix the response file ordering iwth active selection. * copy around reasoning messages taken care of * fix nullable user message and file processing and such. * update ticks for chart config * fix todo parsing. * app markdown update * Update splitter to use border instead of width * change ml * If no file is found we should auto redirect * Refactor database connection handling to support SSL modes. Introduced functions to extract SSL parameters and manage connections based on SSL requirements, including a custom verifier for unverified connections. * black box message update * chat title updates * optimizations for trigger. * some keepalive logic on the anthropic cached * keep title empty until new one * no duplicate messages * null user message on asset pull * posthog error handling * 20 sec idle timeout on anthropic * null req message * fixed modificiation names missing * Refactor tool call handling to support new content array format in asset messages and context loaders * cache most recent file from workflow * Enhance date and number detection in createDataMetadata function to improve data type handling for metrics files * group hover effect for message * logging for chat * Add messageId handling and file association tracking in dashboard and metrics tools - Updated runtime context to include messageId in create and modify dashboard and metrics file tools. - Implemented file association tracking based on messageId in create and modify functions for both dashboards and metrics. - Ensured type consistency by using AnalystRuntimeContext in runtime context parameters. * logging for chat * message type update * Route to first file instead * trigger moved to catalog * Enhance file selection logic to support YAML parsing and improve logging - Updated `extractMetricIdsFromDashboard` to first attempt JSON parsing, falling back to a regex-based YAML parsing for metric IDs. - Added detailed debug logging in `selectFilesForResponse` to track file selection process, including metrics and dashboards involved. - Introduced tests for various scenarios in `file-selection.test.ts` to ensure correct behavior with dashboard context and edge cases. * trigger dev v4-beta * Retry + Self Healing (#381) * Refactor retry logic in analyst and think-and-prep steps Co-authored-by: dallin <dallin@buster.so> * some fixes * console log error * self healing * todos retry --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> * remove lots of logs * Remove chat streaming * Remove chat streaming * timeout * Change to updated at field * link to home * Update timeout settings for HTTP and HTTPS agents from 20 seconds to 10 seconds for improved responsiveness. * Add utils module and integrate message conversion in post_chat_handler * Implement error handling for extract values (#382) * Remove chat streaming * Improve error handling and logging in extract values and chat title steps Co-authored-by: dallin <dallin@buster.so> --------- Co-authored-by: Nate Kelley <nate@buster.so> Co-authored-by: Cursor Agent <cursoragent@cursor.com> * loading icon for buster avatar * finalize tooltip cache * upgrade mastra * increase retries * Add redo functionality for chat messages - Introduced `redoFromMessageId` parameter in `handleExistingChat` to allow users to specify a message to redo from. - Implemented validation to ensure the specified message belongs to the current chat. - Added `softDeleteMessagesFromPoint` function to soft delete a message and all subsequent messages in the same chat, facilitating the redo feature. * fix electric potential memory leak * tooltip cache and chart cleanup * Update bullet to be more indented * latest version number * add support endpoint to new server * Fix jank in combo bar charts * index check for dashboard * Collapse only if there are metrics * Is finished reasoing back * Update dependencies and enhance chat message handling - Upgraded `@mastra/core` to version 0.10.8 and added `node-sql-parser` at version 5.3.10 in the lock file. - Improved integration tests for chat message redo functionality, ensuring correct behavior when deriving `chat_id` from `message_id`. - Enhanced error handling and validation in the `initializeChat` function to manage cases where `chat_id` is not provided. * Update pnpm-lock and enhance chat message integration tests - Added `node-sql-parser` version 5.3.10 to dependencies and updated the lock file. - Improved integration tests for chat message redo functionality, ensuring accurate deletion and retrieval of messages. - Enhanced the `initializeChat` function to derive `chat_id` from `message_id` when not provided, improving error handling and validation. * remove .env import breaking build * add updated at to the get chat handler * zmall runtime error fix * permission tests passing * return updated at on the get chat handler now * slq parser fixes * Implement chat access control logic and add comprehensive tests - Developed the `canUserAccessChat` function to determine user access to chats based on direct permissions, collection permissions, creator status, and organizational roles. - Introduced helper functions for checking permissions and retrieving chat information. - Added integration tests to validate access control logic, covering various scenarios including direct permissions, collection permissions, and user roles. - Created unit tests to ensure the correctness of the access control function with mocked database interactions. - Included simple integration tests to verify functionality with existing database data. * sql parser and int tests working. * fix test and lint issues * comment to kick off deployment lo * access controls on datasets * electric context bug fix with sql helpers. * permission and read only * Add lru-cache dependency and export cache management functions - Added `lru-cache` as a dependency in the access-controls package. - Exported new cache management functions from `chats-cached` module, including `canUserAccessChatCached`, `getCacheStats`, `resetCacheStats`, `clearCache`, `invalidateAccess`, `invalidateUserAccess`, and `invalidateChatAccess`. * packages deploy as well * wrong workflow lol * Update AppVerticalCodeSplitter.tsx * Add error handling for query run and SQL save operations Co-authored-by: natemkelley <natemkelley@gmail.com> * Trim whitespace from input values before sending chat prompts Co-authored-by: natemkelley <natemkelley@gmail.com> * type in think-and-prep * use the cached access chat * update package version * new asset import message * Error fallback for login * Update BusterChart.BarChart.stories.tsx * Staging changes to fix number card titles, combo chart axis, and using dynamic filters (#386) Co-authored-by: Jacob Anderson <jacobanderson@Jacobs-MacBook-Air.local> * db init command pass through * combo chart fixes (#387) Co-authored-by: Jacob Anderson <jacobanderson@Jacobs-MacBook-Air.local> * clarifying question and connection logic * pino pretty error fix * clarifying is a finishing tool * change update latest version logic * Update support endpoint * fixes for horizontal bar charts and added the combo chart logic to update metrics (#388) Co-authored-by: Jacob Anderson <jacobanderson@Jacobs-MacBook-Air.local> * permission fix on dashboard metric handlers for workspace and data admin * Add more try catches * Hide avatar is no more * Horizontal bar fixes (#389) * fixes for horizontal bar charts and added the combo chart logic to update metrics * hopefully fixed horizontal bar charts --------- Co-authored-by: Jacob Anderson <jacobanderson@Jacobs-MacBook-Air.local> * reasoning shimmer update * Make the embed flow work with versions * new account warning update * Move support modal * compact number for pie label * Add final reasoning message tracking and workflow start time to chunk processor and related steps - Introduced `finalReasoningMessage` to schemas in `analyst-step`, `mark-message-complete-step`, and `create-todos-step`. - Updated `ChunkProcessor` to calculate and store the final reasoning message based on workflow duration. - Enhanced various steps to utilize the new `workflowStartTime` for better tracking of execution duration. - Improved database update logic to include `finalReasoningMessage` when applicable. * 9 digit cutoff for pie * trigger update * test on mastra braintrust * test deployment * testing * pnpm install * pnpm * node 22 * pnpm version * trigger main * get initial chat file * hono main deploymenbt * clear timeouts * Remove console logs * migration test to staging * db url * try again * k get rid of tls var * hmmm lets try this * mark migrations * fix migration file? * drizzle-kit upgrade * tweaks to the github actions --------- Co-authored-by: Nate Kelley <nate@buster.so> Co-authored-by: porter-deployment-app[bot] <87230664+porter-deployment-app[bot]@users.noreply.github.com> Co-authored-by: Nate Kelley <133379588+nate-kelley-buster@users.noreply.github.com> Co-authored-by: Jacob Anderson <jacobanderson@Jacobs-MacBook-Air.local> Co-authored-by: jacob-buster <jacob@buster.so> Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: natemkelley <natemkelley@gmail.com>
2025-07-03 05:33:40 +08:00
## Best Practices
- Use TypeScript for type safety
- Organize routes by feature in the `api/` directory
- Keep middleware focused and reusable
- Use proper error handling with Hono's error utilities
- Leverage Hono's built-in validation and serialization
- Follow RESTful conventions for API endpoints
- **Always use the modular route pattern** with separate files per HTTP method
- **Import types with `type` keyword** to minimize build size
- **Use `zValidator` for all request validation**
- **Route all database interactions through `@buster/database`**
- **Use shared error utilities from `@/utils/response`** for consistent error handling
- **Pass detailed errors to clients** for easier debugging