mirror of
https://github.com/AgentSeal/codeburn.git
synced 2026-05-19 07:43:09 +00:00
Some checks are pending
CI / semgrep (push) Waiting to run
* Add IBM Bob provider * Add workspace extraction for Cline-family providers Extract project name from workspace directory in api_conversation_history.json so sessions show actual folder names instead of the provider display name. Thread projectPath through ParsedProviderCall to avoid unsanitizePath mangling hyphenated folder names. --------- Co-authored-by: ozymandiashh <234437643+ozymandiashh@users.noreply.github.com> Co-authored-by: iamtoruk <hello@agentseal.org>
160 lines
4.4 KiB
TypeScript
160 lines
4.4 KiB
TypeScript
import { claude } from './claude.js'
|
|
import { codex } from './codex.js'
|
|
import { copilot } from './copilot.js'
|
|
import { droid } from './droid.js'
|
|
import { gemini } from './gemini.js'
|
|
import { ibmBob } from './ibm-bob.js'
|
|
import { kiloCode } from './kilo-code.js'
|
|
import { kiro } from './kiro.js'
|
|
import { openclaw } from './openclaw.js'
|
|
import { pi, omp } from './pi.js'
|
|
import { qwen } from './qwen.js'
|
|
import { rooCode } from './roo-code.js'
|
|
import type { Provider, SessionSource } from './types.js'
|
|
|
|
let antigravityProvider: Provider | null = null
|
|
let antigravityLoadAttempted = false
|
|
|
|
async function loadAntigravity(): Promise<Provider | null> {
|
|
if (antigravityLoadAttempted) return antigravityProvider
|
|
antigravityLoadAttempted = true
|
|
try {
|
|
const { antigravity } = await import('./antigravity.js')
|
|
antigravityProvider = antigravity
|
|
return antigravity
|
|
} catch {
|
|
return null
|
|
}
|
|
}
|
|
|
|
let gooseProvider: Provider | null = null
|
|
let gooseLoadAttempted = false
|
|
|
|
async function loadGoose(): Promise<Provider | null> {
|
|
if (gooseLoadAttempted) return gooseProvider
|
|
gooseLoadAttempted = true
|
|
try {
|
|
const { goose } = await import('./goose.js')
|
|
gooseProvider = goose
|
|
return goose
|
|
} catch {
|
|
return null
|
|
}
|
|
}
|
|
|
|
let cursorProvider: Provider | null = null
|
|
let cursorLoadAttempted = false
|
|
|
|
async function loadCursor(): Promise<Provider | null> {
|
|
if (cursorLoadAttempted) return cursorProvider
|
|
cursorLoadAttempted = true
|
|
try {
|
|
const { cursor } = await import('./cursor.js')
|
|
cursorProvider = cursor
|
|
return cursor
|
|
} catch {
|
|
return null
|
|
}
|
|
}
|
|
|
|
let opencodeProvider: Provider | null = null
|
|
let opencodeLoadAttempted = false
|
|
|
|
let cursorAgentProvider: Provider | null = null
|
|
let cursorAgentLoadAttempted = false
|
|
|
|
let crushProvider: Provider | null = null
|
|
let crushLoadAttempted = false
|
|
|
|
async function loadOpenCode(): Promise<Provider | null> {
|
|
if (opencodeLoadAttempted) return opencodeProvider
|
|
opencodeLoadAttempted = true
|
|
try {
|
|
const { opencode } = await import('./opencode.js')
|
|
opencodeProvider = opencode
|
|
return opencode
|
|
} catch {
|
|
return null
|
|
}
|
|
}
|
|
|
|
async function loadCursorAgent(): Promise<Provider | null> {
|
|
if (cursorAgentLoadAttempted) return cursorAgentProvider
|
|
cursorAgentLoadAttempted = true
|
|
try {
|
|
const { cursor_agent } = await import('./cursor-agent.js')
|
|
cursorAgentProvider = cursor_agent
|
|
return cursor_agent
|
|
} catch {
|
|
return null
|
|
}
|
|
}
|
|
|
|
async function loadCrush(): Promise<Provider | null> {
|
|
if (crushLoadAttempted) return crushProvider
|
|
crushLoadAttempted = true
|
|
try {
|
|
const { crush } = await import('./crush.js')
|
|
crushProvider = crush
|
|
return crush
|
|
} catch {
|
|
return null
|
|
}
|
|
}
|
|
|
|
const coreProviders: Provider[] = [claude, codex, copilot, droid, gemini, ibmBob, kiloCode, kiro, openclaw, pi, omp, qwen, rooCode]
|
|
|
|
export async function getAllProviders(): Promise<Provider[]> {
|
|
const [ag, gs, cursor, opencode, cursorAgent, crush] = await Promise.all([loadAntigravity(), loadGoose(), loadCursor(), loadOpenCode(), loadCursorAgent(), loadCrush()])
|
|
const all = [...coreProviders]
|
|
if (ag) all.push(ag)
|
|
if (gs) all.push(gs)
|
|
if (cursor) all.push(cursor)
|
|
if (opencode) all.push(opencode)
|
|
if (cursorAgent) all.push(cursorAgent)
|
|
if (crush) all.push(crush)
|
|
return all
|
|
}
|
|
|
|
export const providers = coreProviders
|
|
|
|
export async function discoverAllSessions(providerFilter?: string): Promise<SessionSource[]> {
|
|
const allProviders = await getAllProviders()
|
|
const filtered = providerFilter && providerFilter !== 'all'
|
|
? allProviders.filter(p => p.name === providerFilter)
|
|
: allProviders
|
|
const all: SessionSource[] = []
|
|
for (const provider of filtered) {
|
|
const sessions = await provider.discoverSessions()
|
|
all.push(...sessions)
|
|
}
|
|
return all
|
|
}
|
|
|
|
export async function getProvider(name: string): Promise<Provider | undefined> {
|
|
if (name === 'antigravity') {
|
|
const ag = await loadAntigravity()
|
|
return ag ?? undefined
|
|
}
|
|
if (name === 'goose') {
|
|
const gs = await loadGoose()
|
|
return gs ?? undefined
|
|
}
|
|
if (name === 'cursor') {
|
|
const cursor = await loadCursor()
|
|
return cursor ?? undefined
|
|
}
|
|
if (name === 'opencode') {
|
|
const oc = await loadOpenCode()
|
|
return oc ?? undefined
|
|
}
|
|
if (name === 'cursor-agent') {
|
|
const ca = await loadCursorAgent()
|
|
return ca ?? undefined
|
|
}
|
|
if (name === 'crush') {
|
|
const c = await loadCrush()
|
|
return c ?? undefined
|
|
}
|
|
return coreProviders.find(p => p.name === name)
|
|
}
|