mirror of
https://github.com/browseros-ai/BrowserOS.git
synced 2026-05-19 03:26:28 +00:00
* clean-up bunch of files for re-write * more clean-up and adding basic agent * Minor fix moved types into respective files. * Deleted bunch of old files backup Update gitignore Deleted a bunch of files Remove message manager Deleted old docs Update rules rename Profiler to profiler * Temporarily adding old code * Adding two small things back * backup * Implemented LangChainProvider and updated cursor rules backup LangChainProvider curosr rules * Implement tests for LangChainProvider -- unit test and integration test integration test passes integration test backup * Tool Design Tools Desing tools design * NavigationTool ready NavigationTool ready NavigationTool ready NaivgationTool ready backup * MessageManager MessageManager backup * Fixed integration test * Agent design new Updated agent design and added bunch of /NTN commands agent new design * Delete old agent design * MessageManagerReadOnly class * PlannerTool ready PlannerTool almost ready * ToolManager and DoneTool * Integration of BrowserAgent * BrowserAgent implementation v0.1 * BrowserAgent small fix v0.2 * Tool calling design too call design tool design claude * Update agent tool design with // NTN * add zod-to-json npm install * BrowserAGent v0.3 * BrowserAgent v0.4 * BrowserAgent v0.5 * fixes * Build error fixes in my NEWLY added code build errors fix * Build error fixes in old code (integration work) backup * Comment StreamEventProcessor for now, it is not used * Small build error fix * Small rename * Added integration test to check structuredLLM and changed to 4o-mini change default to nxtscape integration test * Small docstring * Simplified BrowserAgent code and added integration test Simplified BrowserAgent code BrowserAGent integrationt est * Update CLAUDE.md with project memory and instructions on how to write code Update CLAUDE.md with project memory and instructions on how to write code Project Memory * Just a mova.. Moved ToolManager outside. Build works. * TabOperations tool TabOperations Tool and fixing some test tab operations * Update CLAUDE.md * Added ClassificationTool classifiction tool classification prommpt * Refactored and simplified PlannerTool unit test and integration test * Updated Plnnaer tool * Update CLAUDE.md * BrowserAgent modified to do classification BrowserAgent with classification * minor fix to ToolManager * Instead of ToolCall and ToolResult -- just updating message manager once * minor fix to BrowserAgent integration test * Changed done to "done_tool" * Updated CLAUDE.md to reflect understanding of claude * Uncommented stream event processor * Renamed EventBus to StreamEventBus * Commented StreamEventProcessor * Event Processor * Integrated EventProcessor with BrowserAgent Added EventProcessor to BrowserAgetn * Renamed StreamEventBus to EventBus * Made EventBus required parameter in ExecutionContext * PlanGenerator rewrite PlanGenerator rewrite backup * For simple task, explicitly tell it to call done tool * Max attempts for simple task * backup * Revert "backup" This reverts commit 7d79a3d4d5774bfef79ec9827878b74edad3593f. * Consolidating where EventBus and EventProcessor are created and initialized backup * Update CLAUDE.md Update CLAUDE.md * Improving agent loop code Cleaned up processTooCall classification task * Create test-writer subAgent test-agent-prompt test agent prompt test-agent-prompt Update test-writer.md * BrowserAgent test Browseragent test BrowserAgent test * BrowserAgent refactor backup backup * Minor fixes * Minor fix * minor change -- NEW AGENT LOOP IS WORKING WELL * Update cursor rules * Small change * Improved BrowserAgent integration test Improved BrowserAgent integration test * Small change * Update CLAUDE.md * Different tools * FindElementTool is ready Find element update backup find element backup * Updated to test strings to say "tests..." * ScrollTool is ready * RefreshStateTool is updated as well * MessageManager updated * SearchTool is ready backup * Interaction Element is also ready * Add debugMessage emitter * ValidatorTool ready and tests are passing Validation Tool validator tool backup backup * GroupTabs tool ready * Registered all the tools * Planning changed to 5 steps * BrowserAgent integration test fix * Minor string changes * backup * Removed too many confusing events in EventProcessor -- there is only event.info right now * Abort control implemented backup Abort * Formatter for toolResult Formatter for toolResult backup * Always render using Markdown * Minor fix --------- Co-authored-by: Nikhil Sonti <nikhilsv92@gmail.com>
143 lines
3.9 KiB
TypeScript
143 lines
3.9 KiB
TypeScript
import { MessageType } from '@/lib/types/messaging'
|
|
import { PortName } from '@/lib/runtime/PortMessaging'
|
|
import { isDevelopmentMode } from '@/config'
|
|
import { z } from 'zod'
|
|
|
|
/**
|
|
* Log level type
|
|
*/
|
|
export const LogLevelSchema = z.enum(['info', 'error', 'warning'])
|
|
export type LogLevel = z.infer<typeof LogLevelSchema>
|
|
|
|
/**
|
|
* Log message schema
|
|
*/
|
|
export const LogMessageSchema = z.object({
|
|
source: z.string(),
|
|
message: z.string(),
|
|
level: LogLevelSchema,
|
|
timestamp: z.string()
|
|
})
|
|
|
|
export type LogMessage = z.infer<typeof LogMessageSchema>
|
|
|
|
/**
|
|
* Options for initializing the logging utility
|
|
*/
|
|
interface LogUtilityOptions {
|
|
readonly debugMode?: boolean
|
|
}
|
|
|
|
/**
|
|
* Centralized logging utility that supports both port and one-time messaging
|
|
* Routes logs to options page when in development mode
|
|
*/
|
|
export class Logging {
|
|
private static connectedPorts = new Map<string, chrome.runtime.Port>()
|
|
private static debugMode = false
|
|
|
|
/**
|
|
* Initialize the logging utility
|
|
* @param options - Configuration options
|
|
*/
|
|
public static initialize(options: LogUtilityOptions = {}): void {
|
|
this.debugMode = options.debugMode || false
|
|
}
|
|
|
|
/**
|
|
* Register a connected port
|
|
* @param name - Port name
|
|
* @param port - Connected port
|
|
*/
|
|
public static registerPort(name: string, port: chrome.runtime.Port): void {
|
|
this.connectedPorts.set(name, port)
|
|
}
|
|
|
|
/**
|
|
* Unregister a port
|
|
* @param name - Port name
|
|
*/
|
|
public static unregisterPort(name: string): void {
|
|
this.connectedPorts.delete(name)
|
|
}
|
|
|
|
/**
|
|
* Log a message
|
|
* @param source - Source component name
|
|
* @param message - Message content
|
|
* @param level - Log level
|
|
*/
|
|
public static log(source: string, message: string, level: LogLevel = 'info'): void {
|
|
if (!this.debugMode && level === 'info') return
|
|
|
|
const prefix = `[${source}]`
|
|
|
|
// Console logging
|
|
switch (level) {
|
|
case 'error':
|
|
console.error(`${prefix} ${message}`)
|
|
break
|
|
case 'warning':
|
|
console.warn(`${prefix} ${message}`)
|
|
break
|
|
default:
|
|
console.log(`${prefix} ${message}`)
|
|
}
|
|
|
|
// Prepare log message
|
|
const logMessage: LogMessage = {
|
|
source,
|
|
message,
|
|
level,
|
|
timestamp: new Date().toISOString()
|
|
}
|
|
|
|
// Try to send via port messaging first
|
|
let sentViaPort = false
|
|
|
|
// In development mode, send to options page
|
|
if (isDevelopmentMode()) {
|
|
// Look for options page port
|
|
const optionsPort = this.connectedPorts.get(PortName.OPTIONS_TO_BACKGROUND)
|
|
|
|
if (optionsPort) {
|
|
try {
|
|
// Check if port is still connected by accessing a property
|
|
// Chrome will throw if the port is disconnected
|
|
const isConnected = optionsPort.name !== undefined
|
|
|
|
if (isConnected) {
|
|
optionsPort.postMessage({
|
|
type: MessageType.LOG,
|
|
payload: logMessage
|
|
})
|
|
sentViaPort = true
|
|
} else {
|
|
// Port is stale, remove it
|
|
this.unregisterPort(PortName.OPTIONS_TO_BACKGROUND)
|
|
}
|
|
} catch (error) {
|
|
// Port is disconnected or stale, remove it and log the issue
|
|
this.unregisterPort(PortName.OPTIONS_TO_BACKGROUND)
|
|
|
|
// Only log port errors for non-heartbeat messages to avoid spam
|
|
if (level !== 'info' || !message.includes('heartbeat')) {
|
|
console.warn(`Failed to send log to options page: ${error instanceof Error ? error.message : String(error)}`)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Fall back to one-time messaging if port messaging failed
|
|
if (!sentViaPort && typeof chrome !== 'undefined' && chrome.runtime) {
|
|
chrome.runtime.sendMessage({
|
|
type: MessageType.LOG,
|
|
payload: logMessage
|
|
}).catch((_error: Error) => {
|
|
// It's OK if this fails too, just means no UI is open
|
|
// We've already logged to the console above
|
|
})
|
|
}
|
|
}
|
|
}
|