212 lines
10 KiB
Markdown
212 lines
10 KiB
Markdown
# Resource Registry
|
|
|
|
The Resource Registry manages **resource types** and **resource
|
|
instances** in CleverAgents. Resource types define schemas, sandbox
|
|
strategies, and handler implementations. Resource instances are
|
|
registered entries that plans operate on during execution.
|
|
|
|
## Built-in Resource Types
|
|
|
|
CleverAgents ships with two built-in types, available without
|
|
registration:
|
|
|
|
| Type | Kind | Sandbox Strategy | Handler |
|
|
|------------------|----------|------------------|--------------------------------|
|
|
| `git-checkout` | physical | `git_worktree` | `GitCheckoutHandler` |
|
|
| `fs-directory` | physical | `copy_on_write` | `FsDirectoryHandler` |
|
|
|
|
Built-in types are registered idempotently at startup via
|
|
`ResourceRegistryService.bootstrap_builtin_types()`.
|
|
|
|
## Resource Type Fields
|
|
|
|
Each `ResourceTypeSpec` defines a resource type schema:
|
|
|
|
| Field | Type | Description |
|
|
|--------------------|---------------------|------------------------------------------------------|
|
|
| `name` | `str` | Unique name (built-in: bare, custom: `namespace/name`) |
|
|
| `description` | `str` | Human-readable description |
|
|
| `resource_kind` | `ResourceKind` | `physical` or `virtual` |
|
|
| `sandbox_strategy` | `SandboxStrategy` | Default sandbox isolation strategy |
|
|
| `user_addable` | `bool` | Whether users can register instances of this type |
|
|
| `built_in` | `bool` | Whether this is a built-in type |
|
|
| `cli_args` | `list[ResourceTypeArgument]` | CLI argument definitions for registration |
|
|
| `parent_types` | `list[str]` | Allowed parent type names in the DAG |
|
|
| `child_types` | `list[str]` | Allowed child type names in the DAG |
|
|
| `handler` | `str \| None` | Handler ref in `module:Class` format |
|
|
| `capabilities` | `dict[str, bool]` | `read`, `write`, `sandbox`, `checkpoint` flags |
|
|
| `auto_discovery` | `dict \| None` | Auto-discovery rules (see below) |
|
|
| `equivalence` | `dict \| None` | Virtual resource deduplication config |
|
|
|
|
### Custom Types
|
|
|
|
Custom types are defined in YAML and registered via CLI or API:
|
|
|
|
```yaml
|
|
name: myteam/python-package
|
|
description: A Python package directory
|
|
resource_kind: physical
|
|
sandbox_strategy: copy_on_write
|
|
user_addable: true
|
|
cli_args:
|
|
- name: path
|
|
type: path
|
|
required: true
|
|
description: Path to the package root
|
|
parent_types:
|
|
- git-checkout
|
|
child_types:
|
|
- fs-directory
|
|
```
|
|
|
|
Register with: `agents resource type add path/to/type.yaml`
|
|
|
|
## Resource Instance Fields
|
|
|
|
Each `Resource` represents a registered asset:
|
|
|
|
| Field | Type | Description |
|
|
|----------------------|-----------------------|----------------------------------------------|
|
|
| `resource_id` | `str` (ULID) | Unique identifier |
|
|
| `name` | `str \| None` | Optional namespaced name |
|
|
| `resource_type_name` | `str` | Type this resource belongs to |
|
|
| `classification` | `PhysVirt` | `physical` or `virtual` |
|
|
| `description` | `str \| None` | Human-readable description |
|
|
| `location` | `str \| None` | Filesystem path (physical resources) |
|
|
| `sandbox_strategy` | `SandboxStrategy \| None` | Per-resource sandbox override |
|
|
| `content_hash` | `str \| None` | Hash of resource contents for change detection |
|
|
| `parents` | `list[str]` | Parent resource IDs in the DAG |
|
|
| `children` | `list[str]` | Child resource IDs in the DAG |
|
|
| `properties` | `dict` | Type-specific key-value properties |
|
|
| `capabilities` | `ResourceCapabilities`| `readable`, `writable`, `sandboxable`, `checkpointable` |
|
|
| `created_at` | `datetime` | Registration timestamp |
|
|
| `updated_at` | `datetime` | Last modification timestamp |
|
|
|
|
## Registry Service API
|
|
|
|
### Type Operations
|
|
|
|
| Method | Description |
|
|
|-------------------------|------------------------------------------|
|
|
| `bootstrap_builtin_types()` | Register built-in types (idempotent) |
|
|
| `register_type(config_path)` | Register a custom type from YAML |
|
|
| `list_types(namespace=)` | List types, optionally filtered |
|
|
| `show_type(name)` | Get a type by name |
|
|
|
|
### Resource Operations
|
|
|
|
| Method | Description |
|
|
|-------------------------------|--------------------------------------|
|
|
| `register_resource(type_name, name=, location=, ...)` | Create and register an instance |
|
|
| `list_resources(type_name=)` | List resources, optionally by type |
|
|
| `show_resource(name_or_id)` | Get by namespaced name or ULID |
|
|
|
|
### DAG Operations
|
|
|
|
| Method | Description |
|
|
|---------------------------------|------------------------------------|
|
|
| `link_child(parent, child)` | Link a child to a parent |
|
|
| `unlink_child(parent, child)` | Remove a parent-child link |
|
|
| `get_children(name_or_id)` | Get direct children |
|
|
| `get_resource_tree(name_or_id, depth=, type_filter=)` | Recursive tree traversal |
|
|
|
|
For DAG rules, cycle detection, type compatibility, and auto-discovery
|
|
details, see [Resource DAG](resource_dag.md).
|
|
|
|
## Discovery Behavior
|
|
|
|
### Auto-Discovery
|
|
|
|
Resource types can define auto-discovery rules that materialize child
|
|
resources automatically:
|
|
|
|
```yaml
|
|
auto_discovery:
|
|
enabled: true
|
|
rules:
|
|
- type: fs-directory
|
|
pattern: "*/"
|
|
- type: fs-file
|
|
pattern: "*"
|
|
```
|
|
|
|
When `auto_discover_children(resource_id)` is called:
|
|
|
|
1. The resource and its type are looked up.
|
|
2. Each discovery rule is evaluated:
|
|
- The child type must exist in the registry.
|
|
- The child type must be compatible with the parent type (per
|
|
`child_types`).
|
|
3. New child resources are created with `auto_discovered = true`.
|
|
4. Links are created in the `resource_links` table.
|
|
|
|
Auto-discovery is triggered:
|
|
- When a resource is first registered
|
|
- When resource contents change
|
|
- On demand via CLI (`agents resource discover`)
|
|
|
|
### Local-Mode Discovery
|
|
|
|
In local mode (the default), discovery operates against the local
|
|
filesystem. The registry creates placeholder resource entries based
|
|
on discovery rules; actual file enumeration is delegated to resource
|
|
handlers at sandbox creation time.
|
|
|
|
## Database Schema
|
|
|
|
### `resource_types` Table
|
|
|
|
| Column | Type | Description |
|
|
|---------------------------|---------------|--------------------------------|
|
|
| `name` | `String(128)` | Primary key |
|
|
| `namespace` | `String(64)` | Namespace (or `builtin`) |
|
|
| `description` | `Text` | Human-readable description |
|
|
| `resource_kind` | `String(16)` | `physical` or `virtual` |
|
|
| `sandbox_strategy` | `String(32)` | Default sandbox strategy |
|
|
| `user_addable` | `Boolean` | User registration allowed |
|
|
| `built_in` | `Boolean` | Built-in type flag |
|
|
| `handler` | `String(256)` | Handler `module:Class` ref |
|
|
| `args_schema_json` | `Text` | CLI args JSON |
|
|
| `allowed_parent_types_json` | `Text` | Allowed parent types JSON |
|
|
| `allowed_child_types_json` | `Text` | Allowed child types JSON |
|
|
| `auto_discover_json` | `Text` | Auto-discovery config JSON |
|
|
| `capabilities_json` | `Text` | Capabilities JSON |
|
|
| `equivalence_json` | `Text` | Equivalence config JSON |
|
|
| `source` | `String(256)` | Registration source |
|
|
| `created_at` | `String(30)` | ISO-8601 timestamp |
|
|
| `updated_at` | `String(30)` | ISO-8601 timestamp |
|
|
|
|
### `resources` Table
|
|
|
|
| Column | Type | Description |
|
|
|--------------------|---------------|-------------------------------------|
|
|
| `resource_id` | `String(26)` | ULID primary key |
|
|
| `namespaced_name` | `String(256)` | Optional namespaced name (unique) |
|
|
| `namespace` | `String(64)` | Namespace extracted from name |
|
|
| `type_name` | `String(128)` | FK to `resource_types.name` |
|
|
| `resource_kind` | `String(16)` | `physical` or `virtual` |
|
|
| `location` | `Text` | Filesystem path |
|
|
| `description` | `Text` | Human-readable description |
|
|
| `read_only` | `Boolean` | Read-only flag |
|
|
| `auto_discovered` | `Boolean` | Created by auto-discovery |
|
|
| `sandbox_strategy` | `String(32)` | Per-resource sandbox override |
|
|
| `content_hash` | `String(128)` | Content hash for change detection |
|
|
| `properties_json` | `Text` | Type-specific properties JSON |
|
|
| `metadata_json` | `Text` | Additional metadata JSON |
|
|
| `created_at` | `String(30)` | ISO-8601 timestamp |
|
|
| `updated_at` | `String(30)` | ISO-8601 timestamp |
|
|
|
|
### `resource_links` Table
|
|
|
|
See [Resource DAG](resource_dag.md#database-schema) for link table
|
|
schema.
|
|
|
|
## Source
|
|
|
|
- Domain models: `src/cleveragents/domain/models/core/resource.py`,
|
|
`resource_type.py`
|
|
- Service: `src/cleveragents/application/services/resource_registry_service.py`
|
|
- Migration: `alembic/versions/b1_001_resource_registry_tables.py`
|
|
- CLI: `src/cleveragents/cli/commands/resource.py`
|
|
- Specification: `docs/specification.md` — Resource Registry sections
|