98 lines
3.7 KiB
Markdown
98 lines
3.7 KiB
Markdown
# Project Readme Hints
|
|
|
|
## Overview
|
|
`@push.rocks/smartagent` is a dual-agent agentic framework built on top of `@push.rocks/smartai`. It implements a Driver/Guardian architecture where the Driver proposes tool calls and the Guardian evaluates them against security policies.
|
|
|
|
## Architecture
|
|
- **DualAgentOrchestrator**: Main entry point, coordinates Driver and Guardian agents
|
|
- **DriverAgent**: Reasons about tasks, plans steps, proposes tool calls (supports both XML and native tool calling)
|
|
- **GuardianAgent**: Evaluates tool calls against configured policies
|
|
- **ToolRegistry**: Manages tool lifecycle, visibility, and discovery
|
|
- **BaseToolWrapper**: Base class for creating custom tools
|
|
- **plugins.ts**: Imports and re-exports smartai and other dependencies
|
|
|
|
## Standard Tools (via registerStandardTools)
|
|
1. **FilesystemTool** - File operations with scoping and exclusion patterns
|
|
2. **HttpTool** - HTTP requests
|
|
3. **ShellTool** - Secure shell commands (no injection possible)
|
|
4. **BrowserTool** - Web page interaction via Puppeteer
|
|
5. **DenoTool** - Sandboxed TypeScript/JavaScript execution
|
|
|
|
## Additional Tools (must register manually)
|
|
6. **JsonValidatorTool** - JSON validation and formatting (NOT in registerStandardTools)
|
|
7. **ToolSearchTool** - AI-facing interface for tool discovery and activation
|
|
8. **ExpertTool** - Wraps a DualAgentOrchestrator as a specialized expert tool
|
|
|
|
## Tool Visibility System
|
|
Tools can be registered with visibility modes:
|
|
- **initial**: Always visible to Driver, included in system prompt (default)
|
|
- **on-demand**: Only discoverable via search, must be activated before use
|
|
|
|
```typescript
|
|
// Register with visibility options
|
|
orchestrator.registerTool(myTool, {
|
|
visibility: 'on-demand',
|
|
tags: ['database', 'sql'],
|
|
category: 'data'
|
|
});
|
|
```
|
|
|
|
## Expert/SubAgent System
|
|
Experts are specialized agents wrapped as tools, enabling hierarchical agent architectures:
|
|
|
|
```typescript
|
|
orchestrator.registerExpert({
|
|
name: 'code_reviewer',
|
|
description: 'Reviews code for quality and best practices',
|
|
systemMessage: 'You are a code review expert...',
|
|
guardianPolicy: 'Allow read-only file access',
|
|
tools: [new FilesystemTool()],
|
|
visibility: 'on-demand',
|
|
tags: ['code', 'review']
|
|
});
|
|
```
|
|
|
|
## Tool Search
|
|
Enable tool discovery for the Driver:
|
|
|
|
```typescript
|
|
orchestrator.enableToolSearch();
|
|
// Driver can now use:
|
|
// - tools.search({"query": "database"})
|
|
// - tools.list({})
|
|
// - tools.activate({"name": "database_expert"})
|
|
// - tools.details({"name": "filesystem"})
|
|
```
|
|
|
|
## Key Features
|
|
- Token streaming support (`onToken` callback)
|
|
- Vision support (pass images as base64)
|
|
- Progress events (`onProgress` callback)
|
|
- Scoped filesystem with exclusion patterns
|
|
- Result truncation with configurable limits
|
|
- History windowing to manage token usage
|
|
- **Native tool calling mode** (`useNativeToolCalling: true`) for providers like Ollama
|
|
- **Tool visibility system** (initial vs on-demand)
|
|
- **Expert/SubAgent system** for hierarchical agents
|
|
- **Tool search and discovery** via ToolSearchTool
|
|
|
|
## Native Tool Calling
|
|
When `useNativeToolCalling` is enabled:
|
|
- Uses provider's built-in tool calling API instead of XML parsing
|
|
- Tool names become `toolName_actionName` (e.g., `json_validate`)
|
|
- Streaming includes `[THINKING]` and `[OUTPUT]` markers
|
|
- More efficient for models that support it
|
|
|
|
## Key Dependencies
|
|
- `@push.rocks/smartai`: Multi-provider AI interface
|
|
- `@push.rocks/smartfs`: Filesystem operations
|
|
- `@push.rocks/smartshell`: Shell command execution
|
|
- `@push.rocks/smartbrowser`: Browser automation
|
|
- `@push.rocks/smartdeno`: Deno code execution
|
|
- `@push.rocks/smartrequest`: HTTP requests
|
|
- `minimatch`: Glob pattern matching for exclusions
|
|
|
|
## Test Structure
|
|
- Tests use `@git.zone/tstest/tapbundle`
|
|
- Tests must end with `export default tap.start();`
|