Files
freemo 0d4c5b6ff1
CI / lint (push) Failing after 24s
CI / build (push) Successful in 14s
CI / helm (push) Successful in 25s
CI / typecheck (push) Successful in 49s
CI / coverage (push) Has been skipped
CI / benchmark-regression (push) Has been skipped
CI / unit_tests (push) Failing after 1m45s
CI / integration_tests (push) Has been cancelled
CI / security (push) Has been cancelled
CI / quality (push) Has been cancelled
CI / e2e_tests (push) Has been cancelled
CI / benchmark-publish (push) Has been cancelled
CI / status-check (push) Has been cancelled
CI / docker (push) Has been cancelled
docs: add v3.7.0 cycle-2 documentation for UKO runtime, TUI permissions, database handler, and thought blocks
- CHANGELOG.md: extend [3.7.0] section with 15 new entries covering
  PermissionsScreen, ThoughtBlock, UKO runtime services, ACMS Phase 2
  protocol aliases, DevcontainerHandler protocol completion,
  DatabaseResourceHandler CRUD/checkpoint, estimation lifecycle hook,
  user_identity domain events, PLAN_APPLIED/PLAN_CANCELLED enrichment,
  server serve subcommand, async audit refactor, and CLI flag fixes
- README.md: extend Highlights with permissions screen, thought blocks,
  UKO runtime, database handler, and estimation lifecycle
- docs/reference/uko_runtime.md: new reference for UKOQueryInterface,
  UKOInferenceEngine, and UKOGraphPersistence (issue #891)
- docs/reference/tui_permissions.md: new reference for PermissionsScreen,
  PermissionRequestService, and all domain models (issue #996)
- docs/reference/tui_thought_block.md: new reference for ThoughtBlock
  domain model and ThoughtBlockWidget (issue #1001)
- docs/reference/database_handler.md: new reference for
  DatabaseResourceHandler CRUD and checkpoint methods (issue #1241)
- docs/reference/devcontainer_resources.md: add DevcontainerHandler
  protocol methods section (delete, list_children, diff, create_sandbox)
  (issue #1242)
- docs/reference/tui.md: extend architecture table and add Permissions
  Screen and Actor Thought Blocks sections

ISSUES CLOSED: #1393
2026-04-02 17:35:41 +00:00

5.9 KiB

Database Resource Handler

The DatabaseResourceHandler manages database resources within the CleverAgents resource model. It supports four database types (postgres, mysql, sqlite, duckdb) and implements the full ResourceHandler protocol including CRUD operations and checkpoint/rollback methods.

Introduced in v3.7.0 (issues #1241, #836) as part of the ResourceHandler Protocol Completion epic (#825).

Module: cleveragents.resource.handlers.database


Supported Resource Types

Type Kind Sandbox Strategy Connection
sqlite physical transaction_rollback File path
postgres physical transaction_rollback Host/port/dbname or connection string
mysql physical transaction_rollback Host/port/dbname or connection string
duckdb physical transaction_rollback File path or in-memory

All types are user-addable via agents resource add.

CLI Arguments

SQLite / DuckDB:

Argument Type Required Description
--path string Yes Path to the database file

PostgreSQL / MySQL:

Argument Type Required Description
--connection-string string No Full connection string (overrides individual args)
--host string No Database server hostname (default: localhost)
--port integer No Database server port
--dbname string No Database name
--user string No Database user
--password string No Database password (masked in logs)

Content CRUD Methods

All methods raise ValueError if the resource has no location.

read(*, resource, path="") → Content

Returns the database schema or connection information.

Database type Behaviour
SQLite Queries sqlite_master for tables, views, and indexes; returns DDL as UTF-8 text
Remote (postgres, mysql, duckdb) Returns a connection-info summary with credentials masked

The path argument is ignored for database resources (schema is always read).

write(*, resource, path, data) → WriteResult

Executes SQL statements against the database.

Database type Behaviour
SQLite Executes the SQL in data (decoded as UTF-8) using executescript()
Remote Returns WriteResult(success=False, message="not supported")

delete(*, resource, path="") → DeleteResult

Drops a table from the database.

Database type Behaviour
SQLite Executes DROP TABLE IF EXISTS <path>
Remote Returns DeleteResult(success=False, message="not supported")

If path is empty, returns a failure result (no-op rather than dropping all tables).

list_children(*, resource) → list[str]

Lists the tables and views in the database.

Database type Behaviour
SQLite Queries sqlite_master for tables and views; returns their names
Remote Returns []

diff(*, resource, other_location) → DiffResult

Compares the schema of this database against another location by content hash.

Both sides are read via read(). If both sides are absent (empty content), the EMPTY_CONTENT_HASH sentinel is used and the result is no_change=True.


Checkpoint Methods

Checkpoints allow the plan execution engine to save and restore database state during the Apply phase.

create_checkpoint(*, resource) → CheckpointResult

Creates a savepoint in the database.

Database type Behaviour
SQLite Opens a connection, executes SAVEPOINT <id>, and holds the connection open
Remote Returns a content-hash-based checkpoint (no actual savepoint)

The returned CheckpointResult.checkpoint_id is used to identify the savepoint for rollback_to().

rollback_to(*, resource, checkpoint_id) → RollbackResult

Rolls back to a previously created savepoint.

Database type Behaviour
SQLite Executes ROLLBACK TO SAVEPOINT <id> and closes the held connection
Remote Returns RollbackResult(success=False, message="not supported")

If checkpoint_id is not found (e.g. the process restarted), returns a failure result rather than raising.


Error Handling

All methods handle errors gracefully:

  • SQLite errors are caught and returned as failure results with the error message in metadata["error"].
  • Credentials in connection strings are masked using cleveragents.shared.redaction.mask_database_url() before appearing in logs or error messages.
  • No unhandled exceptions propagate from CRUD or checkpoint methods.

CLI Usage

# Add a SQLite database resource
agents resource add sqlite local/my-db --path /path/to/db.sqlite

# Add a PostgreSQL database resource
agents resource add postgres local/pg-db \
    --host localhost --port 5432 --dbname myapp --user admin

# Add using a full connection string
agents resource add postgres local/pg-db \
    --connection-string "postgresql://admin:secret@localhost:5432/myapp"

# List database resources
agents resource list --type sqlite

# Show database details
agents resource show local/my-db

Architecture Notes

DatabaseResourceHandler extends BaseResourceHandler and uses the transaction_rollback sandbox strategy. SQLite checkpoints hold an open sqlite3.Connection with an active SAVEPOINT in the _sqlite_checkpoints dict (keyed by checkpoint ID). The connection is closed when rollback_to() is called or when the handler is garbage collected.