Feat/registry refactor - #214
Merged
Merged
Conversation
Ekyoz
force-pushed
the
feat/registry-refactor
branch
3 times, most recently
from
August 26, 2026 08:01
83af4e0 to
ab7f34f
Compare
Ekyoz
force-pushed
the
feat/registry-refactor
branch
3 times, most recently
from
August 26, 2026 08:41
927618b to
71f0eb1
Compare
feat(manager): Add ToolKit manager to collapse all registry tool into 4 entry with many actions
fix(ci): fix ci divergent from local
fix(test): fix test for python 3.12
feat(sdk): add reconnection via dial + redis==8 and x-task-id in grpc metadata
feat(sdk): 1.0.0.dev19 / reco
feat(sdk): 1.0.0.dev20 / reco
feat(sdk): 1.0.0.dev21 / middleware permission
feat(sdk): 1.0.0.dev22 / middleware permission & ecrets
feat(sdk): 1.0.0.dev23 / associated task id
feat(sdk): 1.0.0.dev23 / log associated task id
feat(sdk): 1.0.0.dev25 / log associated task id
release(beta): staging release
feat(community): add ModuleToolkit to community.agno
One SDK toolkit instead of per-archetype copies.
Every tool call collapsed to "No successful response received from module".
Parses the sentinel protocol (stream.error → "[CODE] message"), plus image
extraction and AG-UI event relay. Adds agno optional extra.
feat(agno): introduce toolkits for chat history, user profile, and registry access
- Added `ChatHistoryTools`, `UserProfileTools`, and `RegistryTools` to enhance agent capabilities.
- Updated `pyproject.toml` to include the new optional dependency `agno`.
- Introduced new module structure for toolkits under `digitalkin.community.agno.toolkits`.
- Enhanced `ModuleServer` to include module type in initialization.
- Updated registry models to support new module types and setups.
- Improved error handling and logging in registry services.
feat(agno): introduce toolkits + storage visibility and cross-context read scopes
feat(agno): registry toolkit refactor — discriminated-action managers (DEV-686)
Collapse the many registry LLM tools into four uniform managers, each a single
agno tool taking one discriminated `action` union:
- tools_manager / services_manager / kins_manager — CRUD (get / search / update /
delete / change_visibility, plus create/load for services) over setups of each
module_type, sharing one action set and the guard/normalise plumbing;
- load_manager — external-execution manager that loads a discovered tool into the
agent (HITL pause + auto-continue) so it is callable in the same turn.
Design:
- Command pattern: each action is a Pydantic model with execute(ctx); shared
BaseAction/BaseActionCtx, per-family RegistryAction/LoadAction bases.
- Managers register with skip_entrypoint_processing + an explicit schema and
validate the argument themselves (accepting an object or a JSON string), so a
bad LLM argument returns a clean {error, metadata} envelope the model can
self-correct from instead of raising a validate_call traceback.
- Every result is the canonical {output|error, metadata:{success, tool}} envelope.
Hardening (from QA passes):
- type isolation: ensure_kind gates every id-targeting action to its manager's
kind (no cross-kind read/update/delete); writes on a deleted id are refused.
- load_manager returns distinct failures, catches registry NOT_FOUND, and never
raises into the agent loop; change_visibility re-reads the committed state.
- dynamic loading invalidates agno's tools cache before acontinue_run so a
freshly-loaded tool is re-resolved into the model's function map.
Removes the old registry.py / setup.py / tool_loader.py surfaces and their tests.
feat(agno): validate setup content against the module config schema (DEV-686)
Before kins_manager.update/create writes a setup version, compile a throwaway
Pydantic model from the module's config-setup JSON schema (fetched via
GetConfigSetupModule) and validate the content, so an LLM driving the toolkit
gets a correctable error instead of breaking the kin.
The validator mirrors the schema's own strictness rather than a loose superset:
- objects reject non-objects, recursively, resolving $ref/$defs (D5);
- undeclared keys are forbidden unless additionalProperties is true (D8);
- arrays type their elements via items (D9);
- enum/const become closed Literal choices (D10);
- a field is nullable only when the schema declares it (D11);
- scalars are validated in strict mode, no "2"->number / true->number coercion (D13);
- strings reject C0 control characters, e.g. NUL / ANSI escapes (D17);
- numeric bounds, string length/pattern and array minItems/maxItems are enforced
when declared (D14/D15/D16 close as soon as the module schema tightens them).
Wiring: CommunicationStrategy grows a get_module_config_schema (gRPC override
calls GetConfigSetupModule); ModuleContext exposes it; RegistryActionCtx runs
the validation best-effort (skipped when no context/schema is available).
Also: rename the archive action to delete, and carry the RegistrySetupStatus /
Visibility enums through SetupData with lenient _missing_ coercion.
feat(agno): type mapping values via additionalProperties in content validation (D18)
An object schema with no properties but an additionalProperties value schema
(e.g. a tool's `triggers`: {additionalProperties: {type: boolean}}) now compiles
to dict[str, <value>] instead of a bare dict, so a wrong-typed value (a string
where a boolean is expected) is refused with the field path. Also honour
minProperties/maxProperties as mapping cardinality bounds.
docs(agno): reword internal comments to drop private review references
feat(agno): reject control characters in a write action's name field
fix(agno): harden registry managers against QA-found defects (D3, D6, D7, D9, D10)
- D3: reject content keys carrying control/non-BMP characters, naming the key,
instead of silently dropping them on write (services create + update)
- D6: exclude versionless (non-instantiable) setups from search results so a
caller never sees an unusable version:null row
- D7a: populate loaded_functions when a tool is already loaded, so the result
is as verifiable as a fresh load
- D7b: enumerate the accepted action tags when load_manager receives an
out-of-union action, matching the CRUD managers
- D9/D10: compute search `truncated` on the rendered page and read limit+1 so
the flag means "a further usable row exists", not merely "the page is full"
Delete docker directory
Delete scripts directory
Ekyoz
force-pushed
the
feat/registry-refactor
branch
from
August 26, 2026 08:47
71f0eb1 to
34b6e13
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.