Releases: aiperceivable/apcore-python
Releases · aiperceivable/apcore-python
Release 0.13.2
Changed
- Rebrand: aipartnerup → aiperceivable
Release 0.13.1
Added
- Dict schema support — Modules can now define
input_schema/output_schemaas plain JSON Schema dicts instead of Pydantic model classes. A_DictSchemaAdaptertransparently wraps dict schemas at registration time so all internal code paths (executor, schema exporter,get_definition) work without changes.
Fixed
get_definition()crash on dict schemas — Previously called.model_json_schema()on dict objects, causingAttributeError- Executor crash on dict schemas —
call(),call_async(), andstream()all called.model_validate()on dict objects
Improved
- File header docstrings — Enhanced docstrings for
errors.py,executor.py, andversion.py
Release 0.13.0
Added
- Caching/pagination annotations —
ModuleAnnotationsgains 5 new fields:cacheable,cache_ttl,cache_key_fields,paginated,pagination_style(all optional with defaults, backward compatible) pagination_styleLiteral type — Typed asLiteral["cursor", "offset", "page"]instead of free-formstrsunset_date— New field onModuleDescriptorfor module deprecation lifecycle (ISO 8601 date)on_suspend()/on_resume()lifecycle hooks — Duck-typed optional hooks for state preservation during hot-reload; integrated intoReloadModuleModuleand registry watchdog- MCP
_metaexport — Schema exporter includescacheable,cacheTtl,cacheKeyFields,paginated,paginationStylein_metasub-dict - Suspend/resume tests —
tests/test_suspend_resume.pycovering state transfer, backward compatibility, error handling
Changed
- Rebranded — "module development framework" → "module standard" in pyproject.toml,
__init__.py, README, and internal docstrings ModuleProtocol —on_suspend/on_resumedeliberately kept OUT of Protocol (duck-typed viahasattr/callable)
Release 0.12.0
Changed
ExecutionCancelledErrornow extendsModuleError(was bareException) with error codeEXECUTION_CANCELLED, aligning with PROTOCOL_SPEC §8.7 error hierarchyErrorCodes— AddedEXECUTION_CANCELLEDconstant
Release 0.11.0
Added
- Full lifecycle integration tests (
tests/integration/test_full_lifecycle.py) — 8 tests covering the complete 11-step pipeline with all gates (ACL + Approval + Middleware + Schema validation) enabled simultaneously, nested module calls, sharedcontext.data, error propagation, and ACL conditions.
System Modules — AI Bidirectional Introspection
Built-in system.* modules that allow AI agents to query, monitor
system.health.summary— Aggregate health status across all registered modules (healthy/degraded/unhealthy classification based on error rate thresholds).system.health.module— Per-module health detail including recent errors fromErrorHistory.system.manifest.module— Single module introspection (schema, annotations, tags, source path).system.manifest.full— Full registry manifest with filtering by tags/prefix.system.usage.summary— Usage statistics across all modules (call counts, error rates, avg latency).system.usage.module— Per-module usage detail with hourly trend data.system.control.update_config— Runtime config hot-patching with constraint validation.system.control.reload_module— Hot-reload a module from disk without restart.system.control.toggle_feature— Enable/disable modules at runtime with reason tracking.register_sys_modules()— Auto-registration wiring for all system modules.
Observability
ErrorHistory— Ring buffer tracking recent errors with deduplication and per-module querying.ErrorHistoryMiddleware— Middleware that recordsModuleErrordetails intoErrorHistory.UsageCollector— Per-module call counting, latency histograms, and hourly bucketed trend data.PlatformNotifyMiddleware— Threshold-based sensor that emits events on error rate spikes.
Event System
EventEmitter— Global event bus with async subscriber dispatch and thread-pool execution.EventSubscriberprotocol — Interface for event consumers.ApCoreEvent— Frozen dataclass for typed events (module lifecycle, errors, config changes).WebhookSubscriber— HTTP POST event delivery with retry.A2ASubscriber— Agent-to-Agent protocol event bridge.
APCore Unified Client
APCore.on()/APCore.off()— Event subscription management via the unified client.APCore.disable()/APCore.enable()— Module toggle control via the unified client.APCore.discover()/APCore.list_modules()— Discovery and listing via the unified client.
Public API Exports
ModuleDisabledError— Error class forMODULE_DISABLEDcode, raised when a disabled module is called.ReloadFailedError— Error class forRELOAD_FAILEDcode (retryable).SchemaStrategy— Enum for schema resolution strategy (yaml_first,native_first,yaml_only).ExportProfile— Enum for schema export profiles (mcp,openai,anthropic,generic).
Registry
- Module toggle — APCore client now supports
disable()/enable()for module toggling viasystem.control.toggle_feature, withModuleDisabledErrorenforcement and event emission. - Version negotiation —
negotiate_version()for SDK/module version compatibility checking.
Changed
WebhookSubscriber/A2ASubscribernow require optional dependencyaiohttp. Install withpip install apcore[events]. Core SDK no longer fails to import whenaiohttpis not installed.
Fixed
aiohttphard import inevents/subscribers.pybroke core SDK import whenaiohttpwas not installed. Changed totry/except ImportErrorguard with clear error message at runtime.A2ASubscriber.on_eventImportErrorfor missingaiohttpwas silently swallowed by the broadexcept Exceptionblock. Moved guard before thetryblock to surface the error correctly.- README Access Control example now includes required
ExecutorandRegistryimports. pyproject.tomlrepository/issues/changelog URLs now point toapcore-python(was incorrectly pointing toapcore).- CHANGELOG
[0.7.1]compare link added (was missing from link references).
Release 0.10.0
Added
APCore Unified Client
APCore.stream()— Stream module output chunk by chunk via the unified client.APCore.validate()— Non-destructive preflight check via the unified client.APCore.describe()— Get module description info (for AI/LLM use).APCore.use_before()— Add before function middleware via the unified client.APCore.use_after()— Add after function middleware via the unified client.APCore.remove()— Remove middleware by identity via the unified client.
Global Entry Points (apcore.*)
apcore.stream()— Global convenience for streaming module calls.apcore.validate()— Global convenience for preflight validation.apcore.register()— Global convenience for direct module registration.apcore.describe()— Global convenience for module description.apcore.use()— Global convenience for adding middleware.apcore.use_before()— Global convenience for adding before middleware.apcore.use_after()— Global convenience for adding after middleware.apcore.remove()— Global convenience for removing middleware.
Error Hierarchy
FeatureNotImplementedError— New error class forGENERAL_NOT_IMPLEMENTEDcode (renamed fromNotImplementedErrorto avoid Python stdlib clash).DependencyNotFoundError— New error class forDEPENDENCY_NOT_FOUNDcode.
Changed
- APCore client and
apcore.*global functions now provide full feature parity withExecutor.
Release 0.9.0
Added
Enhanced Executor.validate() Preflight
PreflightCheckResult— New frozen dataclass representing a single preflight check result withcheck,passed, anderrorfields.PreflightResult— New dataclass returned byExecutor.validate(), containing per-check results andrequires_approvalflag. Duck-type compatible withValidationResultvia.validand.errorsproperties.- Full 6-check preflight —
validate()now runs Steps 1–6 of the pipeline (module_id format, module lookup, call chain safety, ACL, approval detection, schema validation) without executing module code or middleware.
Changed
Executor Pipeline
- Step renumbering — Approval Gate renumbered from Step 4.5 to Step 5; all subsequent steps shifted +1 (now 11 clean steps).
validate()return type — Changed fromValidationResulttoPreflightResult. Backward compatible:.validand.errorsstill work identically for existing consumers (e.g., apcore-mcp router).validate()signature — Added optionalcontextparameter for call-chain checks;inputsnow defaults to{}.
Public API
- Exported
PreflightCheckResultandPreflightResultfromapcoretop-level package.
Release 0.8.0
Added
Executor Enhancements
- Dual-timeout model — Global deadline enforcement (
executor.global_timeout) alongside per-module timeout. The shorter of the two is applied, preventing nested call chains from exceeding the global budget. - Cooperative cancellation — On module timeout, the executor sends
CancelToken.cancel()and waits a 5-second grace period before raisingModuleTimeoutError. Modules that checkcancel_tokencan clean up gracefully. - Error propagation (Algorithm A11) — All execution paths (sync, async, stream) now wrap exceptions via
propagate_error(), ensuring middleware always receivesModuleErrorinstances with trace context. - Deep merge for streaming — Streaming chunk accumulation uses recursive deep merge (depth-capped at 32) instead of shallow merge, correctly handling nested response structures.
Error System
- ErrorCodeRegistry — Custom module error codes are validated against framework prefixes and other modules to prevent collisions. Raises
ErrorCodeCollisionErroron conflict. - VersionIncompatibleError — New error class for SDK/config version mismatches with
negotiate_version()utility. - MiddlewareChainError — Now explicitly
_default_retryable = Falseper PROTOCOL_SPEC §8.6.
Utilities
guard_call_chain()— Standalone Algorithm A20 implementation for call chain safety checks (depth, circular, frequency). Executor delegates to this utility.propagate_error()— Standalone Algorithm A11 implementation for error wrapping and trace context attachment.normalize_to_canonical_id()— Cross-language module ID normalization (Python snake_case, Go PascalCase, etc.).calculate_specificity()— ACL pattern specificity scoring for deterministic rule ordering.parse_docstring()— Docstring parser for extracting parameter descriptions from function docstrings.
ACL Enhancements
- Audit logging —
ACLconstructor accepts optionalaudit_loggercallback. All access decisions emitAuditEntrywith timestamp, caller/target IDs, matched rule, identity, and trace context. - Condition-based rules — ACL rules support
conditionsfor identity type, role, and call depth filtering.
Config System
- Full validation —
Config.validate()checks schema structure, value types, and range constraints. - Hot reload —
Config.reload()re-reads the YAML source and re-validates. - Environment overrides —
APCORE_*environment variables override config values (e.g.,APCORE_EXECUTOR_DEFAULT_TIMEOUT=5000). Config.from_defaults()— Factory method for default configuration.
Middleware
- RetryMiddleware — Configurable retry with exponential/fixed backoff, jitter, and max delay. Only retries errors marked
retryable=True.
Registry Enhancements
- ID conflict detection — Registry detects and prevents registration of conflicting module IDs.
- Safe unregister —
safe_unregister()with drain timeout for graceful module removal.
Context
- Generic
servicestyping —Context[T]supports typed dependency injection via theservicesfield.
Testing
- Conformance test suite — JSON fixture-driven tests for error codes, call chain safety, ACL evaluation, pattern matching, specificity, ID normalization, and version negotiation.
- New unit tests — 17 new test files covering all added features.
Changed
Executor Internals
_check_safety()now delegates to standaloneguard_call_chain()instead of inline logic.- Error handling wraps exceptions with
propagate_error()and re-raises withraise wrapped from exc. - Global deadline set on root call only, propagated to child contexts via
Context._global_deadline.
Public API
- Expanded
__all__inapcore.__init__with new exports:RetryMiddleware,RetryConfig,ErrorCodeRegistry,ErrorCodeCollisionError,VersionIncompatibleError,negotiate_version,guard_call_chain,propagate_error,normalize_to_canonical_id,calculate_specificity,AuditEntry,parse_docstring.
Release 0.7.1
Release version 0.7.1
See CHANGELOG.md for details.
Release 0.7.0
Added
Approval System (PROTOCOL_SPEC §7)
- ApprovalHandler Protocol - Async protocol for pluggable approval handlers with
request_approval()andcheck_approval()methods - ApprovalRequest / ApprovalResult - Frozen dataclasses carrying invocation context and handler decisions with
Literalstatus typing - Phase A (synchronous) - Handler blocks until approval decision; denied/timeout raise immediately
- Phase B (asynchronous) -
pendingstatus returns_approval_tokenfor async resume viacheck_approval() - Built-in handlers -
AlwaysDenyHandler(safe default),AutoApproveHandler(testing),CallbackApprovalHandler(custom logic) - Approval errors -
ApprovalError,ApprovalDeniedError,ApprovalTimeoutError,ApprovalPendingErrorwithresult,module_id, andreasonproperties - Audit events (Level 3) - Dual-channel emission:
logging.info()always + span events when tracing is active - Extension point -
approval_handlerregistered as a built-in extension point inExtensionManager - ErrorCodes - Added
APPROVAL_DENIED,APPROVAL_TIMEOUT,APPROVAL_PENDINGconstants
Executor Integration
- Step 4.5 approval gate - Inserted between ACL (Step 4) and input validation (Step 5) in
call(),call_async(), andstream() - Executor.set_approval_handler() - Runtime handler configuration
- Executor.from_registry() - Added
approval_handlerparameter - Dict and dataclass annotations - Both
ModuleAnnotationsand dict-stylerequires_approvalsupported - Unknown status fail-closed - Unrecognized approval statuses treated as denied with warning log
Changed
Structural Alignment
- Approval errors re-exported from
apcore.approvalfor multi-language SDK consistency; canonical definitions remain inerrors.py ApprovalResult.statustyped asLiteral["approved", "rejected", "timeout", "pending"]per PROTOCOL_SPEC §7.3.2