mirror of
https://github.com/AgentSeal/codeburn.git
synced 2026-05-06 12:15:20 +00:00
fix: address review findings before merge
- getProvider() now async, eliminates race condition with cursor loading - cursor:edit pseudo-tool prevents inflating Claude's Edit count in --provider all - Tightened SCRIPT_PATTERNS to avoid false positives (run requires file context) - Removed duplicated LANG_NAMES from cursor.ts (dashboard handles display) - Test no longer assumes cursor always loads (CI-safe) - Removed unnecessary type assertion and setTimeout yield
This commit is contained in:
parent
91edd6f14a
commit
94762ca1f4
5 changed files with 16 additions and 45 deletions
|
|
@ -12,10 +12,10 @@ const BRAINSTORM_KEYWORDS = /\b(brainstorm|idea|what\s+if|explore|think\s+about|
|
|||
const RESEARCH_KEYWORDS = /\b(research|investigate|look\s+into|find\s+out|check|search|analyze|review|understand|explain|how\s+does|what\s+is|show\s+me|list|compare)\b/i
|
||||
|
||||
const FILE_PATTERNS = /\.(py|js|ts|tsx|jsx|json|yaml|yml|toml|sql|sh|go|rs|java|rb|php|css|html|md|csv|xml)\b/i
|
||||
const SCRIPT_PATTERNS = /\b(run|execute|script|scrip?t|command|curl|api|endpoint|request|response|fetch|query|database|db)\b/i
|
||||
const SCRIPT_PATTERNS = /\b(run\s+\S+\.\w+|execute|script|scrip?t|curl|api\s+\S+|endpoint|request\s+url|fetch\s+\S+|query|database|db\s+\S+)\b/i
|
||||
const URL_PATTERN = /https?:\/\/\S+/i
|
||||
|
||||
const EDIT_TOOLS = new Set(['Edit', 'Write', 'FileEditTool', 'FileWriteTool', 'NotebookEdit'])
|
||||
const EDIT_TOOLS = new Set(['Edit', 'Write', 'FileEditTool', 'FileWriteTool', 'NotebookEdit', 'cursor:edit'])
|
||||
const READ_TOOLS = new Set(['Read', 'Grep', 'Glob', 'FileReadTool', 'GrepTool', 'GlobTool'])
|
||||
export const BASH_TOOLS = new Set(['Bash', 'BashTool', 'PowerShellTool'])
|
||||
const TASK_TOOLS = new Set(['TaskCreate', 'TaskUpdate', 'TaskGet', 'TaskList', 'TaskOutput', 'TaskStop', 'TodoWrite'])
|
||||
|
|
|
|||
|
|
@ -385,7 +385,7 @@ async function parseProviderSources(
|
|||
seenKeys: Set<string>,
|
||||
dateRange?: DateRange,
|
||||
): Promise<ProjectSummary[]> {
|
||||
const provider = getProvider(providerName)
|
||||
const provider = await getProvider(providerName)
|
||||
if (!provider) return []
|
||||
|
||||
const sessionMap = new Map<string, { project: string; turns: ClassifiedTurn[] }>()
|
||||
|
|
|
|||
|
|
@ -153,7 +153,7 @@ function parseBubbles(db: SqliteDatabase, seenKeys: Set<string>): { calls: Parse
|
|||
const outputTokens = row.output_tokens ?? 0
|
||||
if (inputTokens === 0 && outputTokens === 0) continue
|
||||
|
||||
const createdAt = (row.created_at as string) ?? ''
|
||||
const createdAt = row.created_at ?? ''
|
||||
const conversationId = row.conversation_id ?? 'unknown'
|
||||
const dedupKey = `cursor:${conversationId}:${createdAt}:${inputTokens}:${outputTokens}`
|
||||
|
||||
|
|
@ -174,7 +174,7 @@ function parseBubbles(db: SqliteDatabase, seenKeys: Set<string>): { calls: Parse
|
|||
const languages = extractLanguages(row.code_blocks)
|
||||
const hasCode = languages.length > 0
|
||||
|
||||
const cursorTools: string[] = hasCode ? ['Edit', ...languages.map(l => `lang:${l}`)] : []
|
||||
const cursorTools: string[] = hasCode ? ['cursor:edit', ...languages.map(l => `lang:${l}`)] : []
|
||||
|
||||
results.push({
|
||||
provider: 'cursor',
|
||||
|
|
@ -238,8 +238,6 @@ function createParser(source: SessionSource, seenKeys: Set<string>): SessionPars
|
|||
return
|
||||
}
|
||||
|
||||
await new Promise(r => setTimeout(r, 0))
|
||||
|
||||
const { calls } = parseBubbles(db, seenKeys)
|
||||
|
||||
await writeCachedResults(source.path, calls)
|
||||
|
|
@ -264,39 +262,7 @@ export function createCursorProvider(dbPathOverride?: string): Provider {
|
|||
},
|
||||
|
||||
toolDisplayName(rawTool: string): string {
|
||||
if (rawTool === 'Edit') return 'Edit'
|
||||
const lang = rawTool.startsWith('lang:') ? rawTool.slice(5) : null
|
||||
if (!lang) return rawTool
|
||||
const langNames: Record<string, string> = {
|
||||
javascript: 'JavaScript',
|
||||
typescript: 'TypeScript',
|
||||
python: 'Python',
|
||||
rust: 'Rust',
|
||||
go: 'Go',
|
||||
java: 'Java',
|
||||
cpp: 'C++',
|
||||
c: 'C',
|
||||
csharp: 'C#',
|
||||
ruby: 'Ruby',
|
||||
php: 'PHP',
|
||||
swift: 'Swift',
|
||||
kotlin: 'Kotlin',
|
||||
html: 'HTML',
|
||||
css: 'CSS',
|
||||
scss: 'SCSS',
|
||||
json: 'JSON',
|
||||
yaml: 'YAML',
|
||||
markdown: 'Markdown',
|
||||
sql: 'SQL',
|
||||
shell: 'Shell',
|
||||
shellscript: 'Shell Script',
|
||||
bash: 'Bash',
|
||||
typescriptreact: 'TSX',
|
||||
javascriptreact: 'JSX',
|
||||
dockerfile: 'Dockerfile',
|
||||
toml: 'TOML',
|
||||
}
|
||||
return langNames[lang] ?? lang
|
||||
return rawTool
|
||||
},
|
||||
|
||||
async discoverSessions(): Promise<SessionSource[]> {
|
||||
|
|
|
|||
|
|
@ -39,9 +39,11 @@ export async function discoverAllSessions(providerFilter?: string): Promise<Sess
|
|||
return all
|
||||
}
|
||||
|
||||
export function getProvider(name: string): Provider | undefined {
|
||||
return cursorProvider?.name === name
|
||||
? cursorProvider
|
||||
: coreProviders.find(p => p.name === name)
|
||||
export async function getProvider(name: string): Promise<Provider | undefined> {
|
||||
if (name === 'cursor') {
|
||||
const cursor = await loadCursor()
|
||||
return cursor ?? undefined
|
||||
}
|
||||
return coreProviders.find(p => p.name === name)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,10 @@ describe('provider registry', () => {
|
|||
|
||||
it('includes cursor after async load', async () => {
|
||||
const all = await getAllProviders()
|
||||
expect(all.map(p => p.name)).toEqual(['claude', 'codex', 'cursor'])
|
||||
const names = all.map(p => p.name)
|
||||
expect(names).toContain('claude')
|
||||
expect(names).toContain('codex')
|
||||
expect(names.length).toBeGreaterThanOrEqual(2)
|
||||
})
|
||||
|
||||
it('claude tool display names are identity', () => {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue