diff --git a/resources/database/drizzle/meta/0000_snapshot.json b/resources/database/drizzle/meta/0000_snapshot.json index 6bfe1204d..140460cf0 100644 --- a/resources/database/drizzle/meta/0000_snapshot.json +++ b/resources/database/drizzle/meta/0000_snapshot.json @@ -328,4 +328,4 @@ "internal": { "indexes": {} } -} \ No newline at end of file +} diff --git a/resources/database/drizzle/meta/_journal.json b/resources/database/drizzle/meta/_journal.json index 86f2a531c..74624cded 100644 --- a/resources/database/drizzle/meta/_journal.json +++ b/resources/database/drizzle/meta/_journal.json @@ -10,4 +10,4 @@ "breakpoints": true } ] -} \ No newline at end of file +} diff --git a/scripts/before-pack.js b/scripts/before-pack.js index 59c0a3917..9bebf2488 100644 --- a/scripts/before-pack.js +++ b/scripts/before-pack.js @@ -35,6 +35,9 @@ const allX64 = { '@napi-rs/system-ocr-win32-x64-msvc': '1.0.2' } +const claudeCodeVenderPath = '@anthropic-ai/claude-code/vendor' +const claudeCodeVenders = ['arm64-darwin', 'arm64-linux', 'x64-darwin', 'x64-linux', 'x64-win32'] + const platformToArch = { mac: 'darwin', windows: 'win32', @@ -46,9 +49,6 @@ exports.default = async function (context) { const archType = arch === Arch.arm64 ? 'arm64' : 'x64' const platform = context.packager.platform.name - const arm64Filters = Object.keys(allArm64).map((f) => '!node_modules/' + f + '/**') - const x64Filters = Object.keys(allX64).map((f) => '!node_modules/' + f + '/*') - const downloadPackages = async (packages) => { console.log('downloading packages ......') const downloadPromises = [] @@ -67,25 +67,39 @@ exports.default = async function (context) { await Promise.all(downloadPromises) } - const changeFilters = async (packages, filtersToExclude, filtersToInclude) => { - await downloadPackages(packages) + const changeFilters = async (filtersToExclude, filtersToInclude) => { // remove filters for the target architecture (allow inclusion) - let filters = context.packager.config.files[0].filter filters = filters.filter((filter) => !filtersToInclude.includes(filter)) + // add filters for other architectures (exclude them) filters.push(...filtersToExclude) context.packager.config.files[0].filter = filters } - if (arch === Arch.arm64) { - await changeFilters(allArm64, x64Filters, arm64Filters) - return - } + await downloadPackages(arch === Arch.arm64 ? allArm64 : allX64) - if (arch === Arch.x64) { - await changeFilters(allX64, arm64Filters, x64Filters) - return + const arm64Filters = Object.keys(allArm64).map((f) => '!node_modules/' + f + '/**') + const x64Filters = Object.keys(allX64).map((f) => '!node_modules/' + f + '/*') + const excludeClaudeCodeRipgrepFilters = claudeCodeVenders + .filter((f) => f !== `${archType}-${platformToArch[platform]}`) + .map((f) => '!node_modules/' + claudeCodeVenderPath + '/ripgrep/' + f + '/**') + const excludeClaudeCodeJBPlutins = ['!node_modules/' + claudeCodeVenderPath + '/' + 'claude-code-jetbrains-plugin'] + + const includeClaudeCodeFilters = [ + '!node_modules/' + claudeCodeVenderPath + '/' + `${archType}-${platformToArch[platform]}/**` + ] + + if (arch === Arch.arm64) { + await changeFilters( + [...x64Filters, ...excludeClaudeCodeRipgrepFilters, ...excludeClaudeCodeJBPlutins], + [...arm64Filters, ...includeClaudeCodeFilters] + ) + } else { + await changeFilters( + [...arm64Filters, ...excludeClaudeCodeRipgrepFilters, ...excludeClaudeCodeJBPlutins], + [...x64Filters, ...includeClaudeCodeFilters] + ) } } diff --git a/src/main/apiServer/routes/agents/handlers/messages.ts b/src/main/apiServer/routes/agents/handlers/messages.ts index 571778f33..72f286415 100644 --- a/src/main/apiServer/routes/agents/handlers/messages.ts +++ b/src/main/apiServer/routes/agents/handlers/messages.ts @@ -36,10 +36,7 @@ export const createMessage = async (req: Request, res: Response): Promise logger.debug('Streaming message data:', messageData) // Step 1: Save user message first - const userMessage = await sessionMessageService.saveUserMessage( - sessionId, - messageData.content - ) + const userMessage = await sessionMessageService.saveUserMessage(sessionId, messageData.content) // Set SSE headers res.setHeader('Content-Type', 'text/event-stream') @@ -48,7 +45,6 @@ export const createMessage = async (req: Request, res: Response): Promise res.setHeader('Access-Control-Allow-Origin', '*') res.setHeader('Access-Control-Allow-Headers', 'Cache-Control') - const messageStream = sessionMessageService.createSessionMessage(session, messageData, userMessage.id) // Track stream lifecycle so we keep the SSE connection open until persistence finishes diff --git a/src/main/services/agents/database/MigrationService.ts b/src/main/services/agents/database/MigrationService.ts index 71d4b80c4..fce09bc68 100644 --- a/src/main/services/agents/database/MigrationService.ts +++ b/src/main/services/agents/database/MigrationService.ts @@ -51,9 +51,7 @@ export class MigrationService { } // Get applied migrations - const appliedMigrations = hasMigrationsTable - ? await this.getAppliedMigrations() - : [] + const appliedMigrations = hasMigrationsTable ? await this.getAppliedMigrations() : [] const appliedVersions = new Set(appliedMigrations.map((m) => Number(m.version))) const latestAppliedVersion = appliedMigrations.reduce( @@ -90,9 +88,7 @@ export class MigrationService { private async migrationsTableExists(): Promise { try { - const table = await this.client.execute( - `SELECT name FROM sqlite_master WHERE type='table' AND name='migrations'` - ) + const table = await this.client.execute(`SELECT name FROM sqlite_master WHERE type='table' AND name='migrations'`) return table.rows.length > 0 } catch (error) { logger.error('Failed to check migrations table status:', { error }) @@ -162,5 +158,4 @@ export class MigrationService { throw error } } - } diff --git a/src/main/services/agents/database/schema/migrations.schema.ts b/src/main/services/agents/database/schema/migrations.schema.ts index b3485ca91..ab0ad17b9 100644 --- a/src/main/services/agents/database/schema/migrations.schema.ts +++ b/src/main/services/agents/database/schema/migrations.schema.ts @@ -11,4 +11,4 @@ export const migrations = sqliteTable('migrations', { }) export type Migration = typeof migrations.$inferSelect -export type NewMigration = typeof migrations.$inferInsert \ No newline at end of file +export type NewMigration = typeof migrations.$inferInsert diff --git a/src/main/services/agents/services/SessionMessageService.ts b/src/main/services/agents/services/SessionMessageService.ts index 39e9cbfcb..acd7cb1ab 100644 --- a/src/main/services/agents/services/SessionMessageService.ts +++ b/src/main/services/agents/services/SessionMessageService.ts @@ -1,5 +1,6 @@ import { EventEmitter } from 'node:events' +import { PermissionMode } from '@anthropic-ai/claude-code' import { loggerService } from '@logger' import type { AgentSessionMessageEntity, @@ -294,8 +295,8 @@ export class SessionMessageService extends BaseService { // Create the streaming agent invocation (using invokeStream for streaming) const claudeStream = this.cc.invoke(req.content, session.accessible_paths[0], session_id, { - permissionMode: session.configuration?.permission_mode, - maxTurns: session.configuration?.max_turns + permissionMode: (session.configuration?.permissionMode as PermissionMode) || 'default', + maxTurns: (session.configuration?.maxTurns as number) || 10 }) // Use chunk accumulator to manage streaming data diff --git a/src/main/services/agents/services/SessionService.ts b/src/main/services/agents/services/SessionService.ts index 6b057f0f9..39f73f52f 100644 --- a/src/main/services/agents/services/SessionService.ts +++ b/src/main/services/agents/services/SessionService.ts @@ -11,7 +11,6 @@ import { and, count, eq, type SQL } from 'drizzle-orm' import { BaseService } from '../BaseService' import { agentsTable, type InsertSessionRow, type SessionRow, sessionsTable } from '../database/schema' - export class SessionService extends BaseService { private static instance: SessionService | null = null diff --git a/src/main/services/agents/services/index.ts b/src/main/services/agents/services/index.ts index 0ee284a50..e6e545a44 100644 --- a/src/main/services/agents/services/index.ts +++ b/src/main/services/agents/services/index.ts @@ -16,10 +16,11 @@ export { sessionMessageService } from './SessionMessageService' export { sessionService } from './SessionService' // Type definitions for service requests and responses -export type { AgentEntity, AgentSessionEntity,CreateAgentRequest, UpdateAgentRequest } from '@types' +export type { AgentEntity, AgentSessionEntity, CreateAgentRequest, UpdateAgentRequest } from '@types' export type { AgentSessionMessageEntity, CreateSessionRequest, GetAgentSessionResponse, ListOptions as SessionListOptions, - UpdateSessionRequest} from '@types' + UpdateSessionRequest +} from '@types' diff --git a/src/renderer/src/ui/context-menu.tsx b/src/renderer/src/ui/context-menu.tsx index 1a8464d19..28864847a 100644 --- a/src/renderer/src/ui/context-menu.tsx +++ b/src/renderer/src/ui/context-menu.tsx @@ -42,7 +42,7 @@ function ContextMenuSubTrigger({ data-slot="context-menu-sub-trigger" data-inset={inset} className={cn( - "flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[inset]:pl-8 data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", + "flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[inset]:pl-8 data-[state=open]:text-accent-foreground [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", className )} {...props}> @@ -57,7 +57,7 @@ function ContextMenuSubContent({ className, ...props }: React.ComponentProps @@ -162,7 +162,7 @@ function ContextMenuLabel({ ) @@ -182,7 +182,7 @@ function ContextMenuShortcut({ className, ...props }: React.ComponentProps<'span return ( )