/** * hosting-providers — adapters for the two hosting ports. * * src/hosting/ ← the PORTS (`AgentHost`, `SessionLifecycle`), the * composer, and the local adapters * src/hosting-providers.ts ← adapters for somewhere you deploy (this file) * * The split is a source-tree split, not an import split: both halves come out * of the one `agentfootprint/hosting` door. It exists because the PORT files * promise that not one field, name or assumption in them comes from any cloud, * and a test greps those sources for vendor names to keep that honest. So the * cloud adapters live in this file, and the port files stay readable without * learning anybody's product names. * * One file that grows: an adapter for the next runtime lands here beside this * one. * * ── What ships here ────────────────────────────────────────────────────────── * • `agentCoreRuntimeHost({ port?, hostname?, busy? })` — an `AgentHost` for * AWS Bedrock AgentCore Runtime's container contract: `POST /invocations`, * `GET /ping`, port 8080, and the conversation id read from the * `X-Amzn-Bedrock-AgentCore-Runtime-Session-Id` header. It is a * `ConversationHost` too: `serveConversations(handler)` takes the runtime's * `/ws` door on the SAME socket, with `{ maxFrameBytes: 32768, * idleMs: 900000 }` declared, session affinity readable from header or * query, and a `Sec-WebSocket-Protocol` bearer mapped into * `headers.authorization`. * • `agentCoreA2AHost({ card, port?, hostname?, maxBodyBytes? })` — an * `AgentHost` for AgentCore's **A2A** container contract, so OTHER AGENTS * can call yours: JSON-RPC 2.0 at `POST /` on port 9000, the agent card at * `/.well-known/agent-card.json`, `GET /ping` answering * `{"status":"Healthy"}`, and the session read from * `X-Amzn-Bedrock-AgentCore-Runtime-Session-Id`. It declares NO streaming * capability and its card says `streaming: false`, because `message/send` * has nowhere to put a chunk — the two agree on purpose. Errors carry a * REAL HTTP status alongside the JSON-RPC error body (the platform's * documented deviation from the A2A spec); `agentCoreA2AErrorCode` is the * table, exported so a client shares it rather than keeping a copy. * • `a2aWire({ card, health?, errorCodeFor? })` — the A2A PROTOCOL as an * `HttpWire`, with no vendor in it, for the next runtime that speaks it. * `a2aAgentCardDocument(card)` builds the discovery document on its own, * for deployments that must serve it from somewhere else. * • `foundryResponsesHost({ port?, hostname?, model?, maxBodyBytes? })` — an * `AgentHost` for Microsoft Foundry's hosted-agent contract: `POST * /responses`, a `HEAD` capability probe on the same path, `GET /readiness` * answering `{"status":"healthy"}`, port 8088, and the session read from * `conversation` / `agent_session_id` / `session_id` in that order. It * streams when the BODY says `stream: true` — not the `Accept` header — * and frames that stream as the Responses lifecycle. * **Inbound only:** it is the door callers arrive at, and says nothing * about which model the agent calls. It does NOT provide Workflow * Visualizer topology; see the adapter's header. * • `responsesWire({ defaultModel?, sessionFields?, health? })` — the * Responses PROTOCOL as an `HttpWire`, with no vendor in it, for the next * runtime that speaks it on paths of its own. * • `agentCoreSessions({ store })` — a `SessionLifecycle` whose checkpoint * home you choose at construction: a JSON file in the runtime's own session * storage (survives a stop/resume, needs no SDK), or one AgentCore Memory * event per persist (outlives the session). * • `agentEngineSessions({ project, location, reasoningEngine })` — a * `SessionLifecycle` in Vertex AI's own session service, for the row above * `sqliteSessions`: many containers sharing one conversation. The whole * `CheckpointEnvelope` rides in `Session.sessionState`, which is an * arbitrary JSON Struct, so there is no blob encoding to get wrong — and it * is written by APPENDING AN EVENT, because the service refuses a state * patch (a field trial found that the expensive way; see the adapter). * • `firestoreSessions({ project?, database?, collection? })` — the same fleet * row without a reasoning engine: one Firestore document per session, in a * project you probably already have. `listByUser` is a server-side indexed * query with a real Firestore cursor (never a client-side sort over every * document, which is the shape that quietly becomes a full read per page), * and ownership is written ONCE inside a transaction because Firestore has * no `COALESCE` and a merged write would let the last writer take a session. * It needs one composite index; the adapter names it, and says so again in * the error you get without it. * * ── How much of this is verified ───────────────────────────────────────────── * `agentCoreRuntimeHost` is plain HTTP with no SDK on its path, and it passes * the same host conformance suite as `nodeHost` over a real socket — that is * real verification, not a mapping asserted in prose. * * Everything that talks to AWS — `agentCoreSessions({ store: 'memory' })` — is * **contract-mapped and injection-tested**: the SDK calls are exercised through * the `_client` seam and no test pretends to have reached AWS. Real-cloud * verification lands with a field deployment. * * `firestoreSessions` is **field-validated except the ownership refusal * (2026-08)**: an independent trial ran it against a real Firestore and * exercised seven of its eight areas live — the round trip, the indexed and * cursored listing, the missing-index refusal, the hashed document name, the * size ceiling, derived ownership and `forget`. The eighth, refusing a turn * signed by somebody ELSE, was added after that trial and is held by tests * here and by nothing in the field. Two further caveats stand: every SDK * member it calls was read off a real install of `@google-cloud/firestore` * 9.0.0 and hand-verified there, but the package is deliberately NOT installed * in this repository (it would hoist `@opentelemetry/api` and disarm an * absent-peer refusal test), so the assertion that re-checks those names * against the real package SKIPS here and runs for anyone who installs it * locally; what CI checks is dispatch. See the adapter's module header for the * full account. * * @example An agent in an AgentCore Runtime container * import { standingAgent } from 'agentfootprint/hosting'; * import { agentCoreRuntimeHost, agentCoreSessions } from 'agentfootprint/hosting'; * * const handle = await standingAgent({ * agent, * host: agentCoreRuntimeHost(), * sessions: agentCoreSessions({ store: 'session-storage' }), * }); * process.on('SIGTERM', () => void handle.close()); * * Not an import path of its own since 9.0.0. This is the implementation barrel * behind `agentfootprint/hosting`, which re-exports every name here — same * symbols, one door. Import from the door. */ export { agentCoreRuntimeHost, agentCoreRuntimeWire, readAgentCoreConversation, agentCoreSessions, DEFAULT_SESSION_STORAGE_PATH, } from './adapters/hosting/agentcore.js'; export { agentCoreA2AHost, agentCoreA2AErrorCode, DEFAULT_AGENTCORE_A2A_PORT, AGENTCORE_A2A_INVOKE_PATH, AGENTCORE_PING_PATH, AGENTCORE_SESSION_HEADER, } from './adapters/hosting/agentCoreA2A.js'; export type { AgentCoreA2AHostOptions } from './adapters/hosting/agentCoreA2A.js'; export { a2aWire, a2aAgentCardDocument, readA2AMessageText, A2A_PROTOCOL_VERSION, A2A_AGENT_CARD_PATH, A2A_SEND_METHOD, JSONRPC_METHOD_NOT_FOUND, JSONRPC_INVALID_PARAMS, JSONRPC_INTERNAL_ERROR, } from './adapters/hosting/a2aWire.js'; export type { A2AWireOptions, A2AAgentCard, A2ASkill } from './adapters/hosting/a2aWire.js'; export { foundryResponsesHost, DEFAULT_FOUNDRY_PORT, FOUNDRY_INVOKE_PATH, FOUNDRY_READINESS_PATH, FOUNDRY_SESSION_FIELDS, } from './adapters/hosting/foundryResponses.js'; export type { FoundryResponsesHostOptions } from './adapters/hosting/foundryResponses.js'; export { responsesWire, readResponsesInput, readResponsesSession, DEFAULT_SESSION_FIELDS, PUBLIC_FAILURE_MESSAGE, } from './adapters/hosting/responsesWire.js'; export type { ResponsesWireOptions } from './adapters/hosting/responsesWire.js'; export { agentEngineSessions, DEFAULT_USER_ID, SESSION_STATE_KEY, SESSION_EVENT_AUTHOR, } from './adapters/hosting/googleAgentEngine.js'; export type { AgentEngineSessions, AgentEngineSessionsOptions, } from './adapters/hosting/googleAgentEngine.js'; export { firestoreSessions, DEFAULT_SESSION_COLLECTION, EXPIRES_AT_FIELD, FIRESTORE_MAX_DOCUMENT_BYTES, FIRESTORE_MAX_ENVELOPE_BYTES, EnvelopeTooLargeError, FirestoreIndexMissingError, } from './adapters/hosting/firestoreSessions.js'; export type { FirestoreSessions, FirestoreSessionsOptions, FirestoreSdkModule, FirestoreConstructorLike, FirestoreLike, FirestoreCollectionLike, FirestoreQueryLike, FirestoreQuerySnapshotLike, FirestoreDocumentReferenceLike, FirestoreDocumentSnapshotLike, FirestoreTransactionLike, } from './adapters/hosting/firestoreSessions.js'; export type { AgentCoreRuntimeHostOptions, AgentCoreSessionsOptions, AgentCoreSessionStore, AgentCoreFileSessionsOptions, AgentCoreMemorySessionsOptions, AgentCoreSessionClientLike, AgentCoreSessionEvent, BedrockAgentCoreSessionSdkModule, } from './adapters/hosting/agentcore.js'; //# sourceMappingURL=hosting-providers.d.ts.map