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>
122 lines
4.1 KiB
TypeScript
122 lines
4.1 KiB
TypeScript
import { Annotation } from '@langchain/langgraph/web';
|
|
import { PlannerOutput } from '@/lib/agent/PlannerAgent';
|
|
import { BrowseOutput } from '@/lib/agent/BrowseAgent';
|
|
import { ValidatorOutput } from '@/lib/agent/ValidatorAgent';
|
|
import { ClassificationOutput } from '@/lib/agent/ClassificationAgent';
|
|
import { ProductivityOutput } from '@/lib/agent/ProductivityAgent';
|
|
import { AnswerOutput } from '@/lib/agent/AnswerAgent';
|
|
|
|
/**
|
|
* State annotation for the agent execution graph using LangGraph's new annotation system
|
|
*/
|
|
export const AgentGraphState = Annotation.Root({
|
|
// Core task information
|
|
task: Annotation<string>(),
|
|
|
|
// Classification phase
|
|
classificationResult: Annotation<ClassificationOutput | undefined>(),
|
|
taskType: Annotation<"productivity" | "browse" | "answer" | undefined>(),
|
|
|
|
// Different agents and their results
|
|
plan: Annotation<string[]>({
|
|
reducer: (current, update) => update ?? current ?? [],
|
|
}),
|
|
planResult: Annotation<PlannerOutput | undefined>(),
|
|
browseResult: Annotation<BrowseOutput | undefined>(),
|
|
productivityResult: Annotation<ProductivityOutput | undefined>(),
|
|
answerResult: Annotation<AnswerOutput | undefined>(),
|
|
validationResult: Annotation<ValidatorOutput | undefined>(),
|
|
|
|
// Control flow
|
|
currentStepIndex: Annotation<number>({
|
|
reducer: (current, update) => update ?? current ?? 0,
|
|
}),
|
|
stepResults: Annotation<BrowseOutput[]>({
|
|
reducer: (current, update) => update ?? current ?? [],
|
|
}),
|
|
isComplete: Annotation<boolean>({
|
|
reducer: (current, update) => update ?? current ?? false,
|
|
}),
|
|
retryCount: Annotation<number>({
|
|
reducer: (current, update) => update ?? current ?? 0,
|
|
}),
|
|
maxRetries: Annotation<number>({
|
|
reducer: (current, update) => update ?? current ?? 2,
|
|
}),
|
|
startTime: Annotation<number | undefined>(),
|
|
|
|
// Follow-up task tracking
|
|
isFollowUp: Annotation<boolean>({
|
|
reducer: (current, update) => update ?? current ?? false,
|
|
}),
|
|
previousTaskType: Annotation<"productivity" | "browse" | "answer" | undefined>(),
|
|
previousPlan: Annotation<string[] | undefined>(),
|
|
});
|
|
|
|
export type AgentGraphStateType = typeof AgentGraphState.State;
|
|
|
|
/**
|
|
* Helper function to create initial state from task
|
|
*/
|
|
export function createInitialState(
|
|
task: string,
|
|
followUpContext?: {
|
|
isFollowUp: boolean;
|
|
previousTaskType: 'productivity' | 'browse' | 'answer' | null;
|
|
previousPlan: string[] | null;
|
|
previousQuery: string | null;
|
|
} | null
|
|
): AgentGraphStateType {
|
|
return {
|
|
task,
|
|
classificationResult: undefined,
|
|
taskType: undefined,
|
|
|
|
plan: [],
|
|
planResult: undefined,
|
|
browseResult: undefined,
|
|
productivityResult: undefined,
|
|
answerResult: undefined,
|
|
validationResult: undefined,
|
|
|
|
// Execution phase
|
|
currentStepIndex: 0,
|
|
stepResults: [],
|
|
isComplete: false,
|
|
retryCount: 0,
|
|
maxRetries: 2,
|
|
startTime: Date.now(),
|
|
|
|
// Follow-up task tracking
|
|
isFollowUp: followUpContext?.isFollowUp ?? false,
|
|
previousTaskType: followUpContext?.previousTaskType || undefined,
|
|
previousPlan: followUpContext?.previousPlan || undefined
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Type guards for checking specific result types in state
|
|
*/
|
|
export function isClassificationResult(result: any): result is ClassificationOutput {
|
|
return result && typeof result.task_type === 'string' && ['productivity', 'browse', 'answer'].includes(result.task_type);
|
|
}
|
|
|
|
export function isPlannerResult(result: any): result is PlannerOutput {
|
|
return result && typeof result.plan === 'object' && Array.isArray(result.plan);
|
|
}
|
|
|
|
export function isBrowseResult(result: any): result is BrowseOutput {
|
|
return result && typeof result.completed === 'boolean';
|
|
}
|
|
|
|
export function isProductivityResult(result: any): result is ProductivityOutput {
|
|
return result && typeof result.completed === 'boolean' && typeof result.result === 'string';
|
|
}
|
|
|
|
export function isAnswerResult(result: any): result is AnswerOutput {
|
|
return result && typeof result.success === 'boolean' && typeof result.status_message === 'string';
|
|
}
|
|
|
|
export function isValidatorResult(result: any): result is ValidatorOutput {
|
|
return result && typeof result.is_valid === 'boolean';
|
|
} |