Skip to content

Releases: aiperceivable/apcore-python

Release 0.13.2

22 Mar 12:51

Choose a tag to compare

Changed

  • Rebrand: aipartnerup → aiperceivable

Release 0.13.1

19 Mar 07:32

Choose a tag to compare

Added

  • Dict schema support — Modules can now define input_schema / output_schema as plain JSON Schema dicts instead of Pydantic model classes. A _DictSchemaAdapter transparently 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, causing AttributeError
  • Executor crash on dict schemascall(), call_async(), and stream() all called .model_validate() on dict objects

Improved

  • File header docstrings — Enhanced docstrings for errors.py, executor.py, and version.py

Release 0.13.0

12 Mar 06:49

Choose a tag to compare

Added

  • Caching/pagination annotationsModuleAnnotations gains 5 new fields: cacheable, cache_ttl, cache_key_fields, paginated, pagination_style (all optional with defaults, backward compatible)
  • pagination_style Literal type — Typed as Literal["cursor", "offset", "page"] instead of free-form str
  • sunset_date — New field on ModuleDescriptor for module deprecation lifecycle (ISO 8601 date)
  • on_suspend() / on_resume() lifecycle hooks — Duck-typed optional hooks for state preservation during hot-reload; integrated into ReloadModuleModule and registry watchdog
  • MCP _meta export — Schema exporter includes cacheable, cacheTtl, cacheKeyFields, paginated, paginationStyle in _meta sub-dict
  • Suspend/resume teststests/test_suspend_resume.py covering state transfer, backward compatibility, error handling

Changed

  • Rebranded — "module development framework" → "module standard" in pyproject.toml, __init__.py, README, and internal docstrings
  • Module Protocolon_suspend/on_resume deliberately kept OUT of Protocol (duck-typed via hasattr/callable)

Release 0.12.0

11 Mar 08:26

Choose a tag to compare

Changed

  • ExecutionCancelledError now extends ModuleError (was bare Exception) with error code EXECUTION_CANCELLED, aligning with PROTOCOL_SPEC §8.7 error hierarchy
  • ErrorCodes — Added EXECUTION_CANCELLED constant

Release 0.11.0

09 Mar 07:09

Choose a tag to compare

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, shared context.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 from ErrorHistory.
  • 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 records ModuleError details into ErrorHistory.
  • 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.
  • EventSubscriber protocol — 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 for MODULE_DISABLED code, raised when a disabled module is called.
  • ReloadFailedError — Error class for RELOAD_FAILED code (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 via system.control.toggle_feature, with ModuleDisabledError enforcement and event emission.
  • Version negotiationnegotiate_version() for SDK/module version compatibility checking.

Changed

  • WebhookSubscriber / A2ASubscriber now require optional dependency aiohttp. Install with pip install apcore[events]. Core SDK no longer fails to import when aiohttp is not installed.

Fixed

  • aiohttp hard import in events/subscribers.py broke core SDK import when aiohttp was not installed. Changed to try/except ImportError guard with clear error message at runtime.
  • A2ASubscriber.on_event ImportError for missing aiohttp was silently swallowed by the broad except Exception block. Moved guard before the try block to surface the error correctly.
  • README Access Control example now includes required Executor and Registry imports.
  • pyproject.toml repository/issues/changelog URLs now point to apcore-python (was incorrectly pointing to apcore).
  • CHANGELOG [0.7.1] compare link added (was missing from link references).

Release 0.10.0

08 Mar 03:00

Choose a tag to compare

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 for GENERAL_NOT_IMPLEMENTED code (renamed from NotImplementedError to avoid Python stdlib clash).
  • DependencyNotFoundError — New error class for DEPENDENCY_NOT_FOUND code.

Changed

  • APCore client and apcore.* global functions now provide full feature parity with Executor.

Release 0.9.0

06 Mar 08:46

Choose a tag to compare

Added

Enhanced Executor.validate() Preflight

  • PreflightCheckResult — New frozen dataclass representing a single preflight check result with check, passed, and error fields.
  • PreflightResult — New dataclass returned by Executor.validate(), containing per-check results and requires_approval flag. Duck-type compatible with ValidationResult via .valid and .errors properties.
  • Full 6-check preflightvalidate() 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 from ValidationResult to PreflightResult. Backward compatible: .valid and .errors still work identically for existing consumers (e.g., apcore-mcp router).
  • validate() signature — Added optional context parameter for call-chain checks; inputs now defaults to {}.

Public API

  • Exported PreflightCheckResult and PreflightResult from apcore top-level package.

Release 0.8.0

06 Mar 02:34

Choose a tag to compare

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 raising ModuleTimeoutError. Modules that check cancel_token can clean up gracefully.
  • Error propagation (Algorithm A11) — All execution paths (sync, async, stream) now wrap exceptions via propagate_error(), ensuring middleware always receives ModuleError instances 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 ErrorCodeCollisionError on conflict.
  • VersionIncompatibleError — New error class for SDK/config version mismatches with negotiate_version() utility.
  • MiddlewareChainError — Now explicitly _default_retryable = False per 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 loggingACL constructor accepts optional audit_logger callback. All access decisions emit AuditEntry with timestamp, caller/target IDs, matched rule, identity, and trace context.
  • Condition-based rules — ACL rules support conditions for identity type, role, and call depth filtering.

Config System

  • Full validationConfig.validate() checks schema structure, value types, and range constraints.
  • Hot reloadConfig.reload() re-reads the YAML source and re-validates.
  • Environment overridesAPCORE_* 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 unregistersafe_unregister() with drain timeout for graceful module removal.

Context

  • Generic services typingContext[T] supports typed dependency injection via the services field.

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 standalone guard_call_chain() instead of inline logic.
  • Error handling wraps exceptions with propagate_error() and re-raises with raise wrapped from exc.
  • Global deadline set on root call only, propagated to child contexts via Context._global_deadline.

Public API

  • Expanded __all__ in apcore.__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

04 Mar 09:35

Choose a tag to compare

Release version 0.7.1

See CHANGELOG.md for details.

Release 0.7.0

01 Mar 12:52

Choose a tag to compare

Added

Approval System (PROTOCOL_SPEC §7)

  • ApprovalHandler Protocol - Async protocol for pluggable approval handlers with request_approval() and check_approval() methods
  • ApprovalRequest / ApprovalResult - Frozen dataclasses carrying invocation context and handler decisions with Literal status typing
  • Phase A (synchronous) - Handler blocks until approval decision; denied/timeout raise immediately
  • Phase B (asynchronous) - pending status returns _approval_token for async resume via check_approval()
  • Built-in handlers - AlwaysDenyHandler (safe default), AutoApproveHandler (testing), CallbackApprovalHandler (custom logic)
  • Approval errors - ApprovalError, ApprovalDeniedError, ApprovalTimeoutError, ApprovalPendingError with result, module_id, and reason properties
  • Audit events (Level 3) - Dual-channel emission: logging.info() always + span events when tracing is active
  • Extension point - approval_handler registered as a built-in extension point in ExtensionManager
  • ErrorCodes - Added APPROVAL_DENIED, APPROVAL_TIMEOUT, APPROVAL_PENDING constants

Executor Integration

  • Step 4.5 approval gate - Inserted between ACL (Step 4) and input validation (Step 5) in call(), call_async(), and stream()
  • Executor.set_approval_handler() - Runtime handler configuration
  • Executor.from_registry() - Added approval_handler parameter
  • Dict and dataclass annotations - Both ModuleAnnotations and dict-style requires_approval supported
  • Unknown status fail-closed - Unrecognized approval statuses treated as denied with warning log

Changed

Structural Alignment

  • Approval errors re-exported from apcore.approval for multi-language SDK consistency; canonical definitions remain in errors.py
  • ApprovalResult.status typed as Literal["approved", "rejected", "timeout", "pending"] per PROTOCOL_SPEC §7.3.2