All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Display overlay in
SkillMapper(§5.13) —toSkill()readsmetadata.display.a2afor skill name, description, and tags when present.- Skill name:
metadata.display.a2a.alias→metadata.display.alias→ humanizedmodule_id. - Description:
metadata.display.a2a.description→metadata.display.description→descriptor.description. - Guidance: appended to description if present in
a2a.guidanceordisplay.guidance. - Tags:
metadata.display.tags→descriptor.tags.
- Skill name:
metadatafield added toModuleDescriptorinterface.
apcore-jsbumped from^0.9.0to^0.14.0.- Well-known endpoint aligned to
/.well-known/agent.json(wasagent-card.json), matching Python SDK and A2A spec. - CLI
--execution-timeoutnow accepts seconds (was milliseconds) for cross-language consistency with Python SDK. - Environment variables renamed with
APCORE_prefix:JWT_SECRET→APCORE_JWT_SECRET,A2A_EXECUTION_TIMEOUT→APCORE_A2A_EXECUTION_TIMEOUT.
- 13 new
SkillMapperdisplay overlay tests including empty-string fallthrough parity with Python.
- Rebrand: aipartnerup → aiperceivable
0.2.1 - 2026-03-11
- Graceful shutdown hang —
server.close()did not terminate keep-alive connections, causing the process to hang on SIGINT/SIGTERM. Now tracks open sockets and destroys them on shutdown. - MaxListenersExceededWarning on repeated Ctrl+C — each signal added another
closelistener to the server. Added ashuttingDownguard to ignore duplicate signals.
crypto.randomUUIDreplaced withuuidv4fromuuidpackage for broader runtime compatibility- Updated pnpm dependencies
0.2.0 - 2026-03-08
- Examples: 5 runnable demo modules with unified launcher (
examples/run.ts)- Class-based modules:
text_echo,math_calc,greeting(TypeBox schemas,extensions/directory) - Programmatic modules:
convert_temperature,word_count(zero-code-intrusion viamodule()factory inbinding_demo/) - JWT authentication demo with pre-generated test token
- Class-based modules:
- Explorer enhancements: Auth bar and cURL generation
- Token input with status indicator and
sessionStoragepersistence - Auto-generated cURL commands for every
message/sendrequest (rendered infinallyblock) - Keyboard shortcut display (
Ctrl+Enter/Cmd+Enter)
- Token input with status indicator and
- Explorer not mounted —
factory.tsimportedcreateExplorerRouterbut never wired it; explorer route now properly mounted whenexplorer: true - Runtime crash on module discovery —
SkillMapper.humanizeModuleId()called.replace()onundefinedbecauseRegistry.getDefinition()does not includemodule_id. MadeModuleDescriptor.module_idoptional, addedmoduleIdfallback parameter totoSkill() - Empty skill ID —
toSkill()returned a skill withid: ""when no ID was available; now returnsnull(P2) - Duplicate
explorerPrefixresolution — was resolved twice infactory.ts; extracted to singleconst(P1) - cURL skipped on JSON parse error —
renderCurlwas in try block after response parsing; moved tofinallyblock so cURL always renders (P2)
apcore-jsdependency bumped from^0.8.0to^0.9.0@sinclair/typeboxadded as devDependency for example schemas- Test coverage expanded from 157 to 238 tests (81 new explorer tests, 3 new skill-mapper tests)
0.1.0 - 2026-03-06
- Adapters: Automatic conversion between apcore modules and A2A protocol types
SkillMapper— convertsModuleDescriptortoAgentSkillwith humanized namesSchemaConverter— JSON Schema conversion with$refinlining (max depth 32)PartConverter— bidirectional conversion between A2APart[]and apcore inputs/outputsErrorMapper— maps apcore error codes to JSON-RPC error codes (ACL_DENIED masked as "Task not found")AgentCardBuilder— generates A2A Agent Card from registry with caching and invalidation
- Server Core: Express-based A2A server powered by
@a2a-js/sdkApCoreAgentExecutor— implementsAgentExecutorinterface, bridges apcore execution to A2A eventsA2AServerFactory— wires all components into an Express app with JSON-RPC and Agent Card endpoints/healthendpoint with task store probe, module count, and uptime/metricsendpoint with active/completed/failed/canceled task counters
- Authentication: JWT/Bearer auth bridge to apcore Identity
JWTAuthenticator— decodes JWT tokens with configurable claim mappingcreateAuthMiddleware— Express middleware with exempt paths/prefixesAsyncLocalStorage-based identity propagation viagetAuthIdentity()
- Client: HTTP client for remote A2A agents
A2AClient— JSON-RPC client withsendMessage,getTask,cancelTask,listTasksstreamMessage— SSE streaming viaAsyncGeneratorAgentCardFetcher— cached Agent Card discovery at/.well-known/agent-card.json- Error hierarchy:
A2AConnectionError,A2ADiscoveryError,TaskNotFoundError,TaskNotCancelableError,A2AServerError
- Public API: Top-level entry points
serve()— blocking server start with graceful shutdown (SIGTERM/SIGINT)asyncServe()— returns Express app for embeddingresolveRegistryAndExecutor()— duck-type resolution of Registry or Executor
- Explorer: Browser-based A2A skill discovery UI at configurable prefix
- CLI:
apcore-a2a servecommand with full option support--extensions-dir,--host,--port,--auth-type,--auth-key,--explorer,--metrics, etc.resolveAuthKey— reads JWT secret from file path, literal, orJWT_SECRETenv var
- Storage: Re-exports
InMemoryTaskStoreandTaskStorefrom@a2a-js/sdk
@a2a-js/sdk^0.3.10apcore-js^0.8.0express^5.1.0jsonwebtoken^9.0.3