|
260 | 260 | - **Location:** `engine/tool/builtins/file.go` (new) |
261 | 261 | - **Criteria:** `read_file(path)`, `write_file(path, content)`, `list_dir(path)`, `glob(pattern)`, `grep(pattern, path)`. Configurable root directory and path restrictions. Permission: `filesystem`. |
262 | 262 |
|
263 | | -- [ ] **P2-004** — Web search tool (DuckDuckGo) |
| 263 | +- [x] **P2-004** — Web search tool (DuckDuckGo) <!-- done: 2026-03-24 --> |
264 | 264 | - **Location:** `engine/tool/builtins/websearch.go` (new) |
265 | 265 | - **Criteria:** Search DuckDuckGo API, return top N results with title, URL, snippet. No API key required. Configurable result count. |
266 | 266 |
|
267 | | -- [ ] **P2-005** — SQL tool (query execution) |
| 267 | +- [x] **P2-005** — SQL tool (query execution) <!-- done: 2026-03-24 --> |
268 | 268 | - **Location:** `engine/tool/builtins/sql.go` (new) |
269 | 269 | - **Criteria:** Execute SQL queries against a configured database. Returns results as JSON array. Read-only by default, write requires explicit permission. Configurable connection string. |
270 | 270 |
|
|
282 | 282 | - **Location:** `sdk/knowledge/loaders/text.go` (new package) |
283 | 283 | - **Criteria:** Load `.txt` and `.md` files. Split into chunks by configurable size (default 1000 tokens) with overlap (default 200 tokens). Return `[]Document` with content and metadata (source, chunk_index). |
284 | 284 |
|
285 | | -- [ ] **P2-009** — PDF loader |
| 285 | +- [x] **P2-009** — PDF loader <!-- done: 2026-03-24 --> |
286 | 286 | - **Location:** `sdk/knowledge/loaders/pdf.go` |
287 | 287 | - **Criteria:** Extract text from PDF files using a Go PDF library (e.g., `pdfcpu` or `unipdf`). Split into chunks. Return `[]Document`. Handle multi-page documents. |
288 | 288 |
|
289 | 289 | - [x] **P2-010** — CSV/JSON loader <!-- done: 2026-03-24 --> |
290 | 290 | - **Location:** `sdk/knowledge/loaders/structured.go` |
291 | 291 | - **Criteria:** Load CSV and JSON files. Each row/object becomes a document. Configurable content field selection. Metadata from other fields. |
292 | 292 |
|
293 | | -- [ ] **P2-011** — Web page loader (URL scraper) |
| 293 | +- [x] **P2-011** — Web page loader (URL scraper) <!-- done: 2026-03-24 --> |
294 | 294 | - **Location:** `sdk/knowledge/loaders/web.go` |
295 | 295 | - **Criteria:** Fetch URL, extract main content (strip HTML boilerplate), chunk text. Support for JavaScript-rendered pages is optional. Return `[]Document` with URL as source. |
296 | 296 |
|
|
304 | 304 | - **Location:** `engine/model/provider.go` |
305 | 305 | - **Criteria:** Extend `Message` with `Images []ImageContent` where `ImageContent` has `URL string` or `Base64 string` + `MimeType`. OpenAI and Anthropic providers handle image content in requests. |
306 | 306 |
|
307 | | -- [ ] **P2-014** — Audio input/output support |
| 307 | +- [x] **P2-014** — Audio input/output support <!-- done: 2026-03-24 --> |
308 | 308 | - **Location:** `engine/model/provider.go` |
309 | 309 | - **Criteria:** Extend `Message` with `Audio []AudioContent`. Support for Whisper-style transcription input and TTS output. Provider implementations for OpenAI audio models. |
310 | 310 |
|
|
314 | 314 |
|
315 | 315 | ### P2-D: Functional API (Go-idiomatic alternative to Graph API) |
316 | 316 |
|
317 | | -- [ ] **P2-016** — Entrypoint registration (equivalent to @entrypoint) |
| 317 | +- [x] **P2-016** — Entrypoint registration (equivalent to @entrypoint) <!-- done: 2026-03-24 --> |
318 | 318 | - **Location:** `engine/graph/functional.go` (new file) |
319 | 319 | - **Criteria:** `RegisterEntrypoint(name string, fn func(ctx context.Context, input any) (any, error))` wraps a Go function as a graph entrypoint. Integrates with checkpointing and durable execution. Returns a `CompiledGraph` that can be used anywhere a graph is expected. |
320 | 320 |
|
321 | | -- [ ] **P2-017** — Task registration (equivalent to @task) |
| 321 | +- [x] **P2-017** — Task registration (equivalent to @task) <!-- done: 2026-03-24 --> |
322 | 322 | - **Location:** `engine/graph/functional.go` |
323 | 323 | - **Criteria:** `RegisterTask(name string, fn func(ctx context.Context, input any) (any, error))` marks a function as a checkpoint-able task. Results are saved automatically. If a task was already completed in a previous run (via checkpoint), its cached result is returned. |
324 | 324 |
|
|
334 | 334 |
|
335 | 335 | ### P2-F: Observability |
336 | 336 |
|
337 | | -- [ ] **P2-020** — OpenTelemetry integration |
| 337 | +- [x] **P2-020** — OpenTelemetry integration <!-- done: 2026-03-24 --> |
338 | 338 | - **Location:** `os/trace/otel.go` (new file) |
339 | 339 | - **Criteria:** `OTelCollector` implements trace collection using OpenTelemetry SDK. Exports spans to configured OTLP endpoint. Agent/graph/tool operations create OTel spans with proper parent-child relationships and attributes. |
340 | 340 |
|
341 | 341 | - [x] **P2-021** — Debug mode for agents <!-- done: 2026-03-24 --> |
342 | 342 | - **Location:** `sdk/agent/agent.go` |
343 | 343 | - **Criteria:** `Agent.Debug bool` flag. When set, logs detailed execution: every model call (prompt + response), tool calls (args + result), guardrail checks, memory operations, knowledge searches. Uses structured logger. |
344 | 344 |
|
345 | | -- [ ] **P2-022** — Metrics export (Prometheus format) |
| 345 | +- [x] **P2-022** — Metrics export (Prometheus format) <!-- done: 2026-03-24 --> |
346 | 346 | - **Location:** `os/metrics/prometheus.go` (new file), `os/server.go` |
347 | 347 | - **Criteria:** `GET /metrics` endpoint serving Prometheus-format metrics: `chronos_agent_runs_total`, `chronos_model_latency_seconds`, `chronos_tool_calls_total`, `chronos_tokens_used_total`, `chronos_active_sessions`. Hook-based collection. |
348 | 348 |
|
349 | 349 | ### P2-G: Scheduler |
350 | 350 |
|
351 | | -- [ ] **P2-023** — Cron job scheduler for agents |
| 351 | +- [x] **P2-023** — Cron job scheduler for agents <!-- done: 2026-03-24 --> |
352 | 352 | - **Location:** `os/scheduler/scheduler.go` (new package) |
353 | 353 | - **Criteria:** `Scheduler` manages cron-scheduled agent runs. Supports standard cron expressions (5-field). Each schedule specifies: agent ID, input message, session handling (new session per run or reuse). Schedule CRUD via API. |
354 | 354 |
|
355 | | -- [ ] **P2-024** — Scheduler API endpoints |
| 355 | +- [x] **P2-024** — Scheduler API endpoints <!-- done: 2026-03-24 --> |
356 | 356 | - **Location:** `os/server.go`, `os/scheduler/` |
357 | 357 | - **Criteria:** `POST /api/schedules`, `GET /api/schedules`, `DELETE /api/schedules/{id}`, `GET /api/schedules/{id}/history`. Schedules persist in storage. |
358 | 358 |
|
|
393 | 393 |
|
394 | 394 | ### P3-A: Additional Model Providers |
395 | 395 |
|
396 | | -- [ ] **P3-001** — AWS Bedrock provider |
| 396 | +- [x] **P3-001** — AWS Bedrock provider <!-- done: 2026-03-24 --> |
397 | 397 | - **Location:** `engine/model/bedrock.go` (new file) |
398 | 398 | - **Criteria:** Implement `Provider` using AWS Bedrock InvokeModel API. Support Claude, Titan, Llama models via Bedrock. Constructor takes AWS region + credentials. |
399 | 399 |
|
400 | | -- [ ] **P3-002** — Groq provider |
| 400 | +- [x] **P3-002** — Groq provider <!-- done: 2026-03-24 --> |
401 | 401 | - **Location:** `engine/model/groq.go` (new file) |
402 | 402 | - **Criteria:** Implement `Provider` using Groq API (OpenAI-compatible). Constructor takes API key. Support Llama, Mixtral models. |
403 | 403 |
|
404 | | -- [ ] **P3-003** — Together AI provider |
| 404 | +- [x] **P3-003** — Together AI provider <!-- done: 2026-03-24 --> |
405 | 405 | - **Location:** `engine/model/together.go` (new file) |
406 | 406 | - **Criteria:** Implement `Provider` using Together API (OpenAI-compatible). Constructor takes API key. |
407 | 407 |
|
408 | | -- [ ] **P3-004** — Cohere provider |
| 408 | +- [x] **P3-004** — Cohere provider <!-- done: 2026-03-24 --> |
409 | 409 | - **Location:** `engine/model/cohere.go` (new file) |
410 | 410 | - **Criteria:** Implement `Provider` for Cohere Chat API. Support Command models. Implement `EmbeddingsProvider` for Cohere embeddings. |
411 | 411 |
|
412 | | -- [ ] **P3-005** — DeepSeek provider |
| 412 | +- [x] **P3-005** — DeepSeek provider <!-- done: 2026-03-24 --> |
413 | 413 | - **Location:** `engine/model/deepseek.go` (new file) |
414 | 414 | - **Criteria:** Implement `Provider` using DeepSeek API (OpenAI-compatible). Constructor takes API key. Support DeepSeek-V3 and reasoning models. |
415 | 415 |
|
|
419 | 419 |
|
420 | 420 | ### P3-B: Additional Vector Stores |
421 | 421 |
|
422 | | -- [ ] **P3-007** — ChromaDB vector store |
| 422 | +- [x] **P3-007** — ChromaDB vector store <!-- done: 2026-03-24 --> |
423 | 423 | - **Location:** `storage/adapters/chroma/chroma.go` (new) |
424 | 424 | - **Criteria:** Implement `VectorStore` using ChromaDB REST API. Support Upsert, Search, Delete, CreateCollection. Include test. |
425 | 425 |
|
426 | | -- [ ] **P3-008** — PgVector vector store |
| 426 | +- [x] **P3-008** — PgVector vector store <!-- done: 2026-03-24 --> |
427 | 427 | - **Location:** `storage/adapters/pgvector/pgvector.go` (new) |
428 | 428 | - **Criteria:** Implement `VectorStore` using PostgreSQL with pgvector extension. Use `database/sql` with pgx driver. Support cosine similarity search. Include test. |
429 | 429 |
|
430 | | -- [ ] **P3-009** — LanceDB vector store |
| 430 | +- [x] **P3-009** — LanceDB vector store <!-- done: 2026-03-24 --> |
431 | 431 | - **Location:** `storage/adapters/lancedb/lancedb.go` (new) |
432 | 432 | - **Criteria:** Implement `VectorStore` using LanceDB Go client (or REST API). Embedded/serverless vector DB. Include test. |
433 | 433 |
|
434 | 434 | ### P3-C: Additional Embeddings Providers |
435 | 435 |
|
436 | | -- [ ] **P3-010** — Cohere embeddings provider |
| 436 | +- [x] **P3-010** — Cohere embeddings provider <!-- done: 2026-03-24 --> |
437 | 437 | - **Location:** `engine/model/cohere_embeddings.go` (new file) |
438 | 438 | - **Criteria:** Implement `EmbeddingsProvider` using Cohere Embed API. Constructor takes API key and model name. |
439 | 439 |
|
440 | | -- [ ] **P3-011** — Azure OpenAI embeddings provider |
| 440 | +- [x] **P3-011** — Azure OpenAI embeddings provider <!-- done: 2026-03-24 --> |
441 | 441 | - **Location:** `engine/model/azure_embeddings.go` (new file) |
442 | 442 | - **Criteria:** Implement `EmbeddingsProvider` using Azure OpenAI Embeddings API. Constructor takes endpoint, API key, deployment name. |
443 | 443 |
|
444 | | -- [ ] **P3-012** — Google embeddings provider |
| 444 | +- [x] **P3-012** — Google embeddings provider <!-- done: 2026-03-24 --> |
445 | 445 | - **Location:** `engine/model/google_embeddings.go` (new file) |
446 | 446 | - **Criteria:** Implement `EmbeddingsProvider` using Google textembedding-gecko model. Constructor takes API key or service account. |
447 | 447 |
|
448 | 448 | ### P3-D: Interface Integrations |
449 | 449 |
|
450 | | -- [ ] **P3-013** — Slack bot interface |
| 450 | +- [x] **P3-013** — Slack bot interface |
451 | 451 | - **Location:** `os/interfaces/slack/slack.go` (new package) |
452 | 452 | - **Criteria:** Receive messages from Slack (via Events API or Socket Mode), route to configured agent, post response back to channel. Support threads, mentions, and DMs. Configurable bot token. |
453 | 453 |
|
454 | | -- [ ] **P3-014** — Discord bot interface |
| 454 | +- [x] **P3-014** — Discord bot interface |
455 | 455 | - **Location:** `os/interfaces/discord/discord.go` (new package) |
456 | 456 | - **Criteria:** Discord bot that listens for messages, routes to agent, responds. Support slash commands and message replies. Configurable bot token. |
457 | 457 |
|
458 | | -- [ ] **P3-015** — Telegram bot interface |
| 458 | +- [x] **P3-015** — Telegram bot interface |
459 | 459 | - **Location:** `os/interfaces/telegram/telegram.go` (new package) |
460 | 460 | - **Criteria:** Telegram bot using long polling or webhooks. Route messages to agent, send responses. Support inline keyboards for HITL confirmations. |
461 | 461 |
|
|
465 | 465 |
|
466 | 466 | ### P3-E: Advanced Multi-Agent Patterns |
467 | 467 |
|
468 | | -- [ ] **P3-017** — Swarm pattern (peer-to-peer handoff) |
| 468 | +- [x] **P3-017** — Swarm pattern (peer-to-peer handoff) |
469 | 469 | - **Location:** `sdk/team/swarm.go` (new file) |
470 | 470 | - **Criteria:** Agents can hand off directly to other agents without a central coordinator. `Handoff(targetAgent, taskDescription)` tool. Any agent can interact with the user. The active agent changes on handoff. |
471 | 471 |
|
472 | | -- [ ] **P3-018** — Hierarchical multi-level supervisors |
| 472 | +- [x] **P3-018** — Hierarchical multi-level supervisors |
473 | 473 | - **Location:** `sdk/team/hierarchy.go` (new file) |
474 | 474 | - **Criteria:** A supervisor team can contain other supervisor teams as members, creating a tree structure. Top-level supervisor delegates to mid-level supervisors, which delegate to worker agents. |
475 | 475 |
|
476 | | -- [ ] **P3-019** — A2A protocol (agent-to-agent interop) |
| 476 | +- [x] **P3-019** — A2A protocol (agent-to-agent interop) |
477 | 477 | - **Location:** `sdk/protocol/a2a/` (new package) |
478 | 478 | - **Criteria:** Implement the A2A protocol for cross-framework agent communication. `A2AServer` exposes an agent as an A2A endpoint. `A2AClient` connects to external A2A agents. Support task creation, status polling, and streaming. |
479 | 479 |
|
|
487 | 487 | - **Location:** `engine/tool/builtins/reasoning.go` (new file) |
488 | 488 | - **Criteria:** `think(thought string)` tool that allows the model to perform explicit reasoning steps. The thought is recorded in context but not shown to the user. Useful for complex multi-step analysis. |
489 | 489 |
|
490 | | -- [ ] **P3-022** — Separate reasoning model (two-model architecture) |
| 490 | +- [x] **P3-022** — Separate reasoning model (two-model architecture) |
491 | 491 | - **Location:** `sdk/agent/agent.go` |
492 | 492 | - **Criteria:** `Agent.ReasoningModel Provider` field. When set, reasoning steps use a more capable (but slower) model, while final responses use the primary model. Configurable which steps use which model. |
493 | 493 |
|
494 | 494 | ### P3-G: Sandbox Enhancements |
495 | 495 |
|
496 | | -- [ ] **P3-023** — Container pooling (pre-warmed containers) |
| 496 | +- [x] **P3-023** — Container pooling (pre-warmed containers) |
497 | 497 | - **Location:** `sandbox/pool.go` (new file) |
498 | 498 | - **Criteria:** `ContainerPool` maintains N pre-warmed containers. `Acquire()` returns a ready container instantly. `Release()` returns it to the pool. Configurable pool size, max idle time. Reduces cold-start latency. |
499 | 499 |
|
500 | | -- [ ] **P3-024** — Pluggable sandbox backends |
| 500 | +- [x] **P3-024** — Pluggable sandbox backends |
501 | 501 | - **Location:** `sandbox/sandbox.go` |
502 | 502 | - **Criteria:** `Sandbox` interface implemented by: `ProcessSandbox` (existing), `ContainerSandbox` (existing), `WASMSandbox` (new, using Wazero), `K8sJobSandbox` (new, using Kubernetes Jobs). Factory function selects backend by config string. |
503 | 503 |
|
|
507 | 507 | - **Location:** `cli/cmd/root.go` |
508 | 508 | - **Criteria:** `chronos run -n "task description"` runs the agent non-interactively. Reads from stdin if piped. Outputs to stdout. Exit code 0 on success, 1 on failure. Suitable for scripting. |
509 | 509 |
|
510 | | -- [ ] **P3-026** — CLI monitor TUI |
| 510 | +- [x] **P3-026** — CLI monitor TUI |
511 | 511 | - **Location:** `cli/cmd/monitor.go` (new file) |
512 | 512 | - **Criteria:** Live terminal UI showing: active sessions (count + list), recent tool calls, token usage, model latency, error rate. Refreshes periodically. Uses a Go TUI library (e.g., `bubbletea`). |
513 | 513 |
|
514 | 514 | ### P3-I: Production Hardening |
515 | 515 |
|
516 | | -- [ ] **P3-027** — Database migration framework |
| 516 | +- [x] **P3-027** — Database migration framework |
517 | 517 | - **Location:** `storage/migrate/migrate.go` (new package) |
518 | 518 | - **Criteria:** Versioned migrations for SQL backends (SQLite, Postgres). Migration files in `storage/migrate/migrations/`. `Migrate(ctx, db)` applies pending migrations. `Status(ctx, db)` shows current version. `Rollback(ctx, db)` reverts last migration. Track applied migrations in a `_migrations` table. |
519 | 519 |
|
@@ -579,3 +579,4 @@ P3 (expansion) ◄─────── depends on: P2 substantially complete |
579 | 579 | | 2026-03-23 | P0-003 | cursor-agent | RetryHook now performs actual retries by re-invoking the model provider. Supports SleepFn injection for testing. Falls back to metadata-only signaling for backward compatibility when provider/request not in metadata. 12 test cases added. | |
580 | 580 | | 2026-03-23 | P0-004 | cursor-agent | NumHistoryRuns now loads past sessions from storage and injects user/assistant messages into context. Filters out system messages. Works gracefully when storage is nil. 5 test cases added. | |
581 | 581 | | 2026-03-23 | P0-005 | cursor-agent | OutputSchema now passes full JSON Schema via Metadata["json_schema"] with ResponseFormat "json_schema". Added validateAgainstSchema for required fields and type checking. Applied to both Chat and ChatWithSession. 13+ test cases added. | |
| 582 | +| 2026-03-24 | P2-014 | claude-agent | Added `Audio []AudioContent` field to `Message` in provider.go. Created `engine/model/openai_audio.go` with `OpenAIAudio` implementing `AudioProvider` interface: `Transcribe` (Whisper via multipart/form-data to `/v1/audio/transcriptions`) and `Synthesize` (TTS via `/v1/audio/speech`). No external dependencies. | |
0 commit comments