From ecd83dc1eccf796df7c23a3cf8f9cbfffdd2a837 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Padez?= Date: Sat, 7 Mar 2026 12:45:41 +0000 Subject: [PATCH] dynamic claude.md regeneration and email db env for claude code Co-Authored-By: Claude Opus 4.6 --- .../Screens/Dashboard/Email/EmailChat.tsx | 2 +- .../Screens/Dashboard/Email/EmailScreen.tsx | 2 +- src/servers/sidecar/claude/claude-manager.ts | 17 +++++++++++++++-- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/apps/officer-web/Screens/Dashboard/Email/EmailChat.tsx b/src/apps/officer-web/Screens/Dashboard/Email/EmailChat.tsx index 39edc0ae..da45654a 100644 --- a/src/apps/officer-web/Screens/Dashboard/Email/EmailChat.tsx +++ b/src/apps/officer-web/Screens/Dashboard/Email/EmailChat.tsx @@ -1,6 +1,6 @@ import { EmbeddableChat, usePiChat } from 'officerdev'; -const PROMPT_PREFIX = `You are an email assistant. The user has a local SQLite email database available via the "email-db" tool — use it for all email queries (search, count, stats, aggregations, deletions) unless the user explicitly asks you to use Gmail. Do not use the Gmail integration for questions about existing emails.`; +const PROMPT_PREFIX = `You are an email assistant. The user has a local SQLite email database available via the "email_db" tool — use it for all email queries (search, count, stats, aggregations, deletions) unless the user explicitly asks you to use Gmail. Do not use the Gmail integration for questions about existing emails.`; export const EmailChat = () => { const chat = usePiChat(undefined, undefined, { replaceUrl: false }); diff --git a/src/apps/officer-web/Screens/Dashboard/Email/EmailScreen.tsx b/src/apps/officer-web/Screens/Dashboard/Email/EmailScreen.tsx index 7d137a77..0400f044 100644 --- a/src/apps/officer-web/Screens/Dashboard/Email/EmailScreen.tsx +++ b/src/apps/officer-web/Screens/Dashboard/Email/EmailScreen.tsx @@ -9,7 +9,7 @@ import { defaultLayout } from './defaultLayout'; import { EmailList } from './EmailList'; import { EmailReader } from './EmailReader'; -const PROMPT_PREFIX = `You are an email assistant. The user has a local SQLite email database available via the "email-db" tool — use it for all email queries (search, count, stats, aggregations, deletions) unless the user explicitly asks you to use Gmail. Do not use the Gmail integration for questions about existing emails.`; +const PROMPT_PREFIX = `You are an email assistant. The user has a local SQLite email database available via the "email_db" tool — use it for all email queries (search, count, stats, aggregations, deletions) unless the user explicitly asks you to use Gmail. Do not use the Gmail integration for questions about existing emails.`; export const EmailScreen = () => { const isMobile = useIsMobile(); diff --git a/src/servers/sidecar/claude/claude-manager.ts b/src/servers/sidecar/claude/claude-manager.ts index 597c6e33..0bbc1cb3 100644 --- a/src/servers/sidecar/claude/claude-manager.ts +++ b/src/servers/sidecar/claude/claude-manager.ts @@ -1,3 +1,4 @@ +import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'; import { join } from 'node:path'; import type { Subprocess } from 'bun'; import type { PiEvent, MessageCost } from '../../api/pi/types'; @@ -6,12 +7,18 @@ import { getState, setClaudeSession, clearClaudeSession, getClaudeSession } from import { getProxySecret } from './proxy'; import { discoverTools } from '../../tool-registry'; import type { ToolDefinition } from '../../tool-registry'; +import { DATA_PATH, getHomeDir } from '../../data-path'; +import { generateContainerContext } from '../../generate-container-context'; const SEND_TIMEOUT_MS = 5 * 60 * 1000; const PROXY_PORT = process.env.ANTHROPIC_PROXY_PORT ?? '5051'; -const DATA_PATH = process.env.DATA_PATH ?? join(process.cwd(), 'data'); -const getHomeDir = (email: string) => join(DATA_PATH, email, 'home'); +function refreshClaudeMd(email: string): void { + const claudeDir = join(getHomeDir(email), '.claude'); + if (!existsSync(claudeDir)) mkdirSync(claudeDir, { recursive: true }); + const contextFile = generateContainerContext(email); + writeFileSync(join(claudeDir, 'CLAUDE.md'), readFileSync(contextFile, 'utf-8')); +} function buildToolContext(email: string): string { const tools = discoverTools(email); @@ -89,6 +96,8 @@ export async function spawnClaude(params: ClaudeSpawnParams): Promise