Commit Graph

8 Commits

  • feat(ai): compat entrypoint, core-only root barrel (phase 5)
    The root barrel is now core-only and side-effect free: types,
    createModels/createProvider, auth substrate, lazyStream/lazyApi, faux,
    utils. Generated catalogs, api-registry, env-api-keys, images, global
    stream functions, and per-API lazy wrappers leave the root.
    
    New @earendil-works/pi-ai/compat preserves the old surface verbatim as
    a strict superset of the root: api-dispatch stream/complete with env
    key injection, the builtin registration side effect (skip-if-present so
    it cannot clobber earlier overrides), deprecated getModel/getModels/
    getProviders aliases of the new getBuiltin* reads in providers/all,
    lazy api wrappers + setBedrockProviderModule, and image generation.
    Compat dies with the coding-agent ModelManager migration.
    
    Packaging: exports map gains ./compat, ./providers/*, ./api/*;
    sideEffects array lists only the effectful modules.
    
    Old-global imports across agent/coding-agent/examples and pi-ai tests
    switch to /compat (path-only; compat is a superset). The coding-agent
    extension loader resolves the pi-ai ROOT specifier to compat, so
    existing user extensions using the old global API keep working at
    runtime until compat is removed. vitest configs alias /compat to src;
    browser smoke imports old globals from /compat.
  • fix(typebox): migrate to v1 with extension compat (#3474)
    * fix(typebox): migrate to v1 with extension compat
    
    Replace AJV-based validation with TypeBox-native validation, keep legacy extension imports working (including @sinclair/typebox/compiler), and restore coercion for serialized/plain JSON schemas.
    
    This change closes #3112.
    
    * fix(typebox): use canonical imports and harden coercion
    
    Switch first-party code to canonical typebox imports while retaining legacy extension aliases in the loader.
    
    Remove obsolete runtime codegen guards, expand serialized JSON-schema coercion coverage, and update related tests and fixtures.
    
    Fixes #3112.
    
    ---------
    
    Co-authored-by: Mario Zechner <badlogicgames@gmail.com>
  • fix(coding-agent): resolve waitForRetry() race when auto-retry produces tool calls (#2440)
    When auto-retry fires after a retryable error (e.g. overloaded_error) and the
    retry response includes tool_use, session.prompt() returned prematurely because
    _resolveRetry() was called on the first successful message_end — while the
    agent loop was still executing tools via the fire-and-forget agent.continue().
    
    This caused callers to observe isStreaming=true after prompt() returned, and
    follow-up session.prompt() calls threw 'Agent is already processing'. The
    tool execution results were silently lost.
    
    Fix: move _resolveRetry() from the message_end handler to the agent_end
    handler. The _retryAttempt counter reset stays on message_end (preventing
    accumulation across LLM calls within a turn), but the promise that unblocks
    waitForRetry() now only resolves when the full agent loop completes.