agentfootprint 10.3.1 → 10.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -2
- package/CAPABILITIES.md +6 -0
- package/README.md +44 -0
- package/ai-instructions/claude-code/SKILL.md +2 -2
- package/dist/adapters/mcp/agentcoreRuntime/errorType.js +24 -0
- package/dist/adapters/mcp/agentcoreRuntime/errorType.js.map +1 -0
- package/dist/adapters/mcp/agentcoreRuntime/invoke.js +265 -0
- package/dist/adapters/mcp/agentcoreRuntime/invoke.js.map +1 -0
- package/dist/adapters/mcp/agentcoreRuntime/safeAnswer.js +415 -0
- package/dist/adapters/mcp/agentcoreRuntime/safeAnswer.js.map +1 -0
- package/dist/adapters/mcp/agentcoreRuntime/session.js +179 -0
- package/dist/adapters/mcp/agentcoreRuntime/session.js.map +1 -0
- package/dist/adapters/mcp/agentcoreRuntime/sessionBusy.js +117 -0
- package/dist/adapters/mcp/agentcoreRuntime/sessionBusy.js.map +1 -0
- package/dist/adapters/mcp/agentcoreRuntime/strictJson.js +220 -0
- package/dist/adapters/mcp/agentcoreRuntime/strictJson.js.map +1 -0
- package/dist/adapters/mcp/agentcoreRuntime/transport.js +204 -0
- package/dist/adapters/mcp/agentcoreRuntime/transport.js.map +1 -0
- package/dist/adapters/memory/agentcore.js +435 -20
- package/dist/adapters/memory/agentcore.js.map +1 -1
- package/dist/adapters/memory/memoryBank.js +16 -3
- package/dist/adapters/memory/memoryBank.js.map +1 -1
- package/dist/adapters/memory/pgVector.js +10 -4
- package/dist/adapters/memory/pgVector.js.map +1 -1
- package/dist/adapters/memory/redis.js +11 -3
- package/dist/adapters/memory/redis.js.map +1 -1
- package/dist/adapters/memory/s3Vectors.js +8 -3
- package/dist/adapters/memory/s3Vectors.js.map +1 -1
- package/dist/adapters/memory/sqliteVector.js +10 -4
- package/dist/adapters/memory/sqliteVector.js.map +1 -1
- package/dist/ag-ui/adapter.js +71 -0
- package/dist/ag-ui/adapter.js.map +1 -0
- package/dist/ag-ui/framing.js +66 -0
- package/dist/ag-ui/framing.js.map +1 -0
- package/dist/ag-ui/frontendTools.js +69 -0
- package/dist/ag-ui/frontendTools.js.map +1 -0
- package/dist/ag-ui/ids.js +54 -0
- package/dist/ag-ui/ids.js.map +1 -0
- package/dist/ag-ui/index.js +27 -0
- package/dist/ag-ui/index.js.map +1 -0
- package/dist/ag-ui/request.js +356 -0
- package/dist/ag-ui/request.js.map +1 -0
- package/dist/ag-ui/serializer.js +899 -0
- package/dist/ag-ui/serializer.js.map +1 -0
- package/dist/ag-ui/types.js +22 -0
- package/dist/ag-ui/types.js.map +1 -0
- package/dist/core/Agent.js +38 -5
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/RunnerBase.js +16 -2
- package/dist/core/RunnerBase.js.map +1 -1
- package/dist/core/agent/buildAgentChart.js +4 -0
- package/dist/core/agent/buildAgentChart.js.map +1 -1
- package/dist/core/agent/buildDynamicAgentChart.js +4 -0
- package/dist/core/agent/buildDynamicAgentChart.js.map +1 -1
- package/dist/core/agent/callerIdentity.js +2 -1
- package/dist/core/agent/callerIdentity.js.map +1 -1
- package/dist/core/agent/stages/routeTurn.js +3 -3
- package/dist/core/agent/stages/routeTurn.js.map +1 -1
- package/dist/core/agent/stages/seed.js +49 -8
- package/dist/core/agent/stages/seed.js.map +1 -1
- package/dist/core/agent/stages/timeLayer.js +2 -2
- package/dist/core/agent/stages/timeLayer.js.map +1 -1
- package/dist/core/agent/stages/toolCalls.js +26 -5
- package/dist/core/agent/stages/toolCalls.js.map +1 -1
- package/dist/core/memberRun.js +244 -0
- package/dist/core/memberRun.js.map +1 -0
- package/dist/core/slots/buildToolsSlot.js +1 -1
- package/dist/core/slots/buildToolsSlot.js.map +1 -1
- package/dist/core-flow/Conditional.js +29 -8
- package/dist/core-flow/Conditional.js.map +1 -1
- package/dist/core-flow/Graph.js +38 -13
- package/dist/core-flow/Graph.js.map +1 -1
- package/dist/core-flow/Loop.js +29 -9
- package/dist/core-flow/Loop.js.map +1 -1
- package/dist/core-flow/Parallel.js +35 -14
- package/dist/core-flow/Parallel.js.map +1 -1
- package/dist/core-flow/Sequence.js +29 -8
- package/dist/core-flow/Sequence.js.map +1 -1
- package/dist/core-flow/Workflow.js +34 -10
- package/dist/core-flow/Workflow.js.map +1 -1
- package/dist/doors/ag-ui.js +36 -0
- package/dist/doors/ag-ui.js.map +1 -0
- package/dist/esm/adapters/mcp/agentcoreRuntime/errorType.d.ts +12 -0
- package/dist/esm/adapters/mcp/agentcoreRuntime/errorType.js +20 -0
- package/dist/esm/adapters/mcp/agentcoreRuntime/errorType.js.map +1 -0
- package/dist/esm/adapters/mcp/agentcoreRuntime/invoke.d.ts +116 -0
- package/dist/esm/adapters/mcp/agentcoreRuntime/invoke.js +260 -0
- package/dist/esm/adapters/mcp/agentcoreRuntime/invoke.js.map +1 -0
- package/dist/esm/adapters/mcp/agentcoreRuntime/safeAnswer.d.ts +49 -0
- package/dist/esm/adapters/mcp/agentcoreRuntime/safeAnswer.js +409 -0
- package/dist/esm/adapters/mcp/agentcoreRuntime/safeAnswer.js.map +1 -0
- package/dist/esm/adapters/mcp/agentcoreRuntime/session.d.ts +80 -0
- package/dist/esm/adapters/mcp/agentcoreRuntime/session.js +175 -0
- package/dist/esm/adapters/mcp/agentcoreRuntime/session.js.map +1 -0
- package/dist/esm/adapters/mcp/agentcoreRuntime/sessionBusy.d.ts +61 -0
- package/dist/esm/adapters/mcp/agentcoreRuntime/sessionBusy.js +112 -0
- package/dist/esm/adapters/mcp/agentcoreRuntime/sessionBusy.js.map +1 -0
- package/dist/esm/adapters/mcp/agentcoreRuntime/strictJson.d.ts +37 -0
- package/dist/esm/adapters/mcp/agentcoreRuntime/strictJson.js +215 -0
- package/dist/esm/adapters/mcp/agentcoreRuntime/strictJson.js.map +1 -0
- package/dist/esm/adapters/mcp/agentcoreRuntime/transport.d.ts +176 -0
- package/dist/esm/adapters/mcp/agentcoreRuntime/transport.js +199 -0
- package/dist/esm/adapters/mcp/agentcoreRuntime/transport.js.map +1 -0
- package/dist/esm/adapters/memory/agentcore.d.ts +152 -7
- package/dist/esm/adapters/memory/agentcore.js +433 -19
- package/dist/esm/adapters/memory/agentcore.js.map +1 -1
- package/dist/esm/adapters/memory/memoryBank.d.ts +3 -2
- package/dist/esm/adapters/memory/memoryBank.js +16 -3
- package/dist/esm/adapters/memory/memoryBank.js.map +1 -1
- package/dist/esm/adapters/memory/pgVector.js +10 -4
- package/dist/esm/adapters/memory/pgVector.js.map +1 -1
- package/dist/esm/adapters/memory/redis.d.ts +8 -3
- package/dist/esm/adapters/memory/redis.js +11 -3
- package/dist/esm/adapters/memory/redis.js.map +1 -1
- package/dist/esm/adapters/memory/s3Vectors.js +8 -3
- package/dist/esm/adapters/memory/s3Vectors.js.map +1 -1
- package/dist/esm/adapters/memory/sqliteVector.js +10 -4
- package/dist/esm/adapters/memory/sqliteVector.js.map +1 -1
- package/dist/esm/ag-ui/adapter.d.ts +68 -0
- package/dist/esm/ag-ui/adapter.js +67 -0
- package/dist/esm/ag-ui/adapter.js.map +1 -0
- package/dist/esm/ag-ui/framing.d.ts +51 -0
- package/dist/esm/ag-ui/framing.js +62 -0
- package/dist/esm/ag-ui/framing.js.map +1 -0
- package/dist/esm/ag-ui/frontendTools.d.ts +37 -0
- package/dist/esm/ag-ui/frontendTools.js +64 -0
- package/dist/esm/ag-ui/frontendTools.js.map +1 -0
- package/dist/esm/ag-ui/ids.d.ts +43 -0
- package/dist/esm/ag-ui/ids.js +49 -0
- package/dist/esm/ag-ui/ids.js.map +1 -0
- package/dist/esm/ag-ui/index.d.ts +17 -0
- package/dist/esm/ag-ui/index.js +17 -0
- package/dist/esm/ag-ui/index.js.map +1 -0
- package/dist/esm/ag-ui/request.d.ts +72 -0
- package/dist/esm/ag-ui/request.js +350 -0
- package/dist/esm/ag-ui/request.js.map +1 -0
- package/dist/esm/ag-ui/serializer.d.ts +173 -0
- package/dist/esm/ag-ui/serializer.js +895 -0
- package/dist/esm/ag-ui/serializer.js.map +1 -0
- package/dist/esm/ag-ui/types.d.ts +305 -0
- package/dist/esm/ag-ui/types.js +19 -0
- package/dist/esm/ag-ui/types.js.map +1 -0
- package/dist/esm/core/Agent.d.ts +2 -0
- package/dist/esm/core/Agent.js +38 -5
- package/dist/esm/core/Agent.js.map +1 -1
- package/dist/esm/core/RunnerBase.js +17 -3
- package/dist/esm/core/RunnerBase.js.map +1 -1
- package/dist/esm/core/agent/buildAgentChart.js +4 -0
- package/dist/esm/core/agent/buildAgentChart.js.map +1 -1
- package/dist/esm/core/agent/buildDynamicAgentChart.js +4 -0
- package/dist/esm/core/agent/buildDynamicAgentChart.js.map +1 -1
- package/dist/esm/core/agent/callerIdentity.js +2 -1
- package/dist/esm/core/agent/callerIdentity.js.map +1 -1
- package/dist/esm/core/agent/stages/routeTurn.d.ts +1 -1
- package/dist/esm/core/agent/stages/routeTurn.js +3 -3
- package/dist/esm/core/agent/stages/routeTurn.js.map +1 -1
- package/dist/esm/core/agent/stages/seed.d.ts +11 -1
- package/dist/esm/core/agent/stages/seed.js +49 -8
- package/dist/esm/core/agent/stages/seed.js.map +1 -1
- package/dist/esm/core/agent/stages/timeLayer.js +2 -2
- package/dist/esm/core/agent/stages/timeLayer.js.map +1 -1
- package/dist/esm/core/agent/stages/toolCalls.d.ts +11 -1
- package/dist/esm/core/agent/stages/toolCalls.js +26 -5
- package/dist/esm/core/agent/stages/toolCalls.js.map +1 -1
- package/dist/esm/core/agent/types.d.ts +16 -6
- package/dist/esm/core/memberRun.d.ts +132 -0
- package/dist/esm/core/memberRun.js +227 -0
- package/dist/esm/core/memberRun.js.map +1 -0
- package/dist/esm/core/slots/buildToolsSlot.d.ts +1 -1
- package/dist/esm/core/slots/buildToolsSlot.js +1 -1
- package/dist/esm/core/slots/buildToolsSlot.js.map +1 -1
- package/dist/esm/core-flow/Conditional.d.ts +8 -0
- package/dist/esm/core-flow/Conditional.js +29 -8
- package/dist/esm/core-flow/Conditional.js.map +1 -1
- package/dist/esm/core-flow/Graph.js +38 -13
- package/dist/esm/core-flow/Graph.js.map +1 -1
- package/dist/esm/core-flow/Loop.d.ts +8 -0
- package/dist/esm/core-flow/Loop.js +29 -9
- package/dist/esm/core-flow/Loop.js.map +1 -1
- package/dist/esm/core-flow/Parallel.d.ts +8 -0
- package/dist/esm/core-flow/Parallel.js +35 -14
- package/dist/esm/core-flow/Parallel.js.map +1 -1
- package/dist/esm/core-flow/Sequence.d.ts +8 -0
- package/dist/esm/core-flow/Sequence.js +29 -8
- package/dist/esm/core-flow/Sequence.js.map +1 -1
- package/dist/esm/core-flow/Workflow.js +34 -10
- package/dist/esm/core-flow/Workflow.js.map +1 -1
- package/dist/esm/doors/ag-ui.d.ts +19 -0
- package/dist/esm/doors/ag-ui.js +20 -0
- package/dist/esm/doors/ag-ui.js.map +1 -0
- package/dist/esm/hosting/envelope.js +5 -0
- package/dist/esm/hosting/envelope.js.map +1 -1
- package/dist/esm/hosting/httpHost.js +5 -78
- package/dist/esm/hosting/httpHost.js.map +1 -1
- package/dist/esm/hosting/index.d.ts +4 -1
- package/dist/esm/hosting/index.js +2 -0
- package/dist/esm/hosting/index.js.map +1 -1
- package/dist/esm/hosting/pendingAsk.d.ts +19 -0
- package/dist/esm/hosting/pendingAsk.js +38 -0
- package/dist/esm/hosting/pendingAsk.js.map +1 -0
- package/dist/esm/hosting/protocolAdapter.d.ts +229 -0
- package/dist/esm/hosting/protocolAdapter.js +23 -0
- package/dist/esm/hosting/protocolAdapter.js.map +1 -0
- package/dist/esm/hosting/refusalStatus.d.ts +30 -0
- package/dist/esm/hosting/refusalStatus.js +81 -0
- package/dist/esm/hosting/refusalStatus.js.map +1 -0
- package/dist/esm/hosting/standingAgent.js +1 -31
- package/dist/esm/hosting/standingAgent.js.map +1 -1
- package/dist/esm/hosting/stream.d.ts +39 -0
- package/dist/esm/hosting/stream.js +34 -2
- package/dist/esm/hosting/stream.js.map +1 -1
- package/dist/esm/hosting/streamHandler.d.ts +134 -0
- package/dist/esm/hosting/streamHandler.js +493 -0
- package/dist/esm/hosting/streamHandler.js.map +1 -0
- package/dist/esm/hosting/types.d.ts +15 -0
- package/dist/esm/hosting/types.js.map +1 -1
- package/dist/esm/hosting/verifiedThreads.d.ts +29 -0
- package/dist/esm/hosting/verifiedThreads.js +46 -0
- package/dist/esm/hosting/verifiedThreads.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/humanizeLLMError.d.ts +15 -0
- package/dist/esm/lib/humanizeLLMError.js +22 -7
- package/dist/esm/lib/humanizeLLMError.js.map +1 -1
- package/dist/esm/mcp/throttleRetry.d.ts +51 -0
- package/dist/esm/mcp/throttleRetry.js +37 -4
- package/dist/esm/mcp/throttleRetry.js.map +1 -1
- package/dist/esm/memory/define.js +45 -1
- package/dist/esm/memory/define.js.map +1 -1
- package/dist/esm/memory/define.types.d.ts +24 -0
- package/dist/esm/memory/define.types.js.map +1 -1
- package/dist/esm/memory/stages/formatDefault.js +3 -1
- package/dist/esm/memory/stages/formatDefault.js.map +1 -1
- package/dist/esm/memory/store/InMemoryStore.d.ts +8 -3
- package/dist/esm/memory/store/InMemoryStore.js +12 -3
- package/dist/esm/memory/store/InMemoryStore.js.map +1 -1
- package/dist/esm/memory/store/index.d.ts +1 -0
- package/dist/esm/memory/store/index.js +5 -0
- package/dist/esm/memory/store/index.js.map +1 -1
- package/dist/esm/memory/store/types.d.ts +38 -4
- package/dist/esm/memory/store/writeOptions.d.ts +118 -0
- package/dist/esm/memory/store/writeOptions.js +242 -0
- package/dist/esm/memory/store/writeOptions.js.map +1 -0
- package/dist/esm/memory-providers.d.ts +1 -1
- package/dist/esm/memory-providers.js +4 -1
- package/dist/esm/memory-providers.js.map +1 -1
- package/dist/esm/patterns/MapReduce.js +8 -2
- package/dist/esm/patterns/MapReduce.js.map +1 -1
- package/dist/esm/tool-providers/index.d.ts +5 -0
- package/dist/esm/tool-providers/index.js +6 -0
- package/dist/esm/tool-providers/index.js.map +1 -1
- package/dist/esm/trace-toolpack/selfExplain.d.ts +8 -0
- package/dist/esm/trace-toolpack/selfExplain.js +25 -2
- package/dist/esm/trace-toolpack/selfExplain.js.map +1 -1
- package/dist/hosting/envelope.js +5 -0
- package/dist/hosting/envelope.js.map +1 -1
- package/dist/hosting/httpHost.js +5 -78
- package/dist/hosting/httpHost.js.map +1 -1
- package/dist/hosting/index.js +9 -3
- package/dist/hosting/index.js.map +1 -1
- package/dist/hosting/pendingAsk.js +42 -0
- package/dist/hosting/pendingAsk.js.map +1 -0
- package/dist/hosting/protocolAdapter.js +24 -0
- package/dist/hosting/protocolAdapter.js.map +1 -0
- package/dist/hosting/refusalStatus.js +84 -0
- package/dist/hosting/refusalStatus.js.map +1 -0
- package/dist/hosting/standingAgent.js +2 -32
- package/dist/hosting/standingAgent.js.map +1 -1
- package/dist/hosting/stream.js +35 -3
- package/dist/hosting/stream.js.map +1 -1
- package/dist/hosting/streamHandler.js +497 -0
- package/dist/hosting/streamHandler.js.map +1 -0
- package/dist/hosting/types.js.map +1 -1
- package/dist/hosting/verifiedThreads.js +50 -0
- package/dist/hosting/verifiedThreads.js.map +1 -0
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/humanizeLLMError.js +23 -8
- package/dist/lib/humanizeLLMError.js.map +1 -1
- package/dist/mcp/throttleRetry.js +41 -6
- package/dist/mcp/throttleRetry.js.map +1 -1
- package/dist/memory/define.js +45 -1
- package/dist/memory/define.js.map +1 -1
- package/dist/memory/define.types.js.map +1 -1
- package/dist/memory/stages/formatDefault.js +3 -1
- package/dist/memory/stages/formatDefault.js.map +1 -1
- package/dist/memory/store/InMemoryStore.js +12 -3
- package/dist/memory/store/InMemoryStore.js.map +1 -1
- package/dist/memory/store/index.js +11 -1
- package/dist/memory/store/index.js.map +1 -1
- package/dist/memory/store/writeOptions.js +250 -0
- package/dist/memory/store/writeOptions.js.map +1 -0
- package/dist/memory-providers.js +4 -1
- package/dist/memory-providers.js.map +1 -1
- package/dist/patterns/MapReduce.js +8 -2
- package/dist/patterns/MapReduce.js.map +1 -1
- package/dist/tool-providers/index.js +10 -1
- package/dist/tool-providers/index.js.map +1 -1
- package/dist/trace-toolpack/selfExplain.js +25 -2
- package/dist/trace-toolpack/selfExplain.js.map +1 -1
- package/dist/types/adapters/mcp/agentcoreRuntime/errorType.d.ts +13 -0
- package/dist/types/adapters/mcp/agentcoreRuntime/errorType.d.ts.map +1 -0
- package/dist/types/adapters/mcp/agentcoreRuntime/invoke.d.ts +117 -0
- package/dist/types/adapters/mcp/agentcoreRuntime/invoke.d.ts.map +1 -0
- package/dist/types/adapters/mcp/agentcoreRuntime/safeAnswer.d.ts +50 -0
- package/dist/types/adapters/mcp/agentcoreRuntime/safeAnswer.d.ts.map +1 -0
- package/dist/types/adapters/mcp/agentcoreRuntime/session.d.ts +81 -0
- package/dist/types/adapters/mcp/agentcoreRuntime/session.d.ts.map +1 -0
- package/dist/types/adapters/mcp/agentcoreRuntime/sessionBusy.d.ts +62 -0
- package/dist/types/adapters/mcp/agentcoreRuntime/sessionBusy.d.ts.map +1 -0
- package/dist/types/adapters/mcp/agentcoreRuntime/strictJson.d.ts +38 -0
- package/dist/types/adapters/mcp/agentcoreRuntime/strictJson.d.ts.map +1 -0
- package/dist/types/adapters/mcp/agentcoreRuntime/transport.d.ts +177 -0
- package/dist/types/adapters/mcp/agentcoreRuntime/transport.d.ts.map +1 -0
- package/dist/types/adapters/memory/agentcore.d.ts +152 -7
- package/dist/types/adapters/memory/agentcore.d.ts.map +1 -1
- package/dist/types/adapters/memory/memoryBank.d.ts +3 -2
- package/dist/types/adapters/memory/memoryBank.d.ts.map +1 -1
- package/dist/types/adapters/memory/pgVector.d.ts.map +1 -1
- package/dist/types/adapters/memory/redis.d.ts +8 -3
- package/dist/types/adapters/memory/redis.d.ts.map +1 -1
- package/dist/types/adapters/memory/s3Vectors.d.ts.map +1 -1
- package/dist/types/adapters/memory/sqliteVector.d.ts.map +1 -1
- package/dist/types/ag-ui/adapter.d.ts +69 -0
- package/dist/types/ag-ui/adapter.d.ts.map +1 -0
- package/dist/types/ag-ui/framing.d.ts +52 -0
- package/dist/types/ag-ui/framing.d.ts.map +1 -0
- package/dist/types/ag-ui/frontendTools.d.ts +38 -0
- package/dist/types/ag-ui/frontendTools.d.ts.map +1 -0
- package/dist/types/ag-ui/ids.d.ts +44 -0
- package/dist/types/ag-ui/ids.d.ts.map +1 -0
- package/dist/types/ag-ui/index.d.ts +18 -0
- package/dist/types/ag-ui/index.d.ts.map +1 -0
- package/dist/types/ag-ui/request.d.ts +73 -0
- package/dist/types/ag-ui/request.d.ts.map +1 -0
- package/dist/types/ag-ui/serializer.d.ts +174 -0
- package/dist/types/ag-ui/serializer.d.ts.map +1 -0
- package/dist/types/ag-ui/types.d.ts +306 -0
- package/dist/types/ag-ui/types.d.ts.map +1 -0
- package/dist/types/core/Agent.d.ts +2 -0
- package/dist/types/core/Agent.d.ts.map +1 -1
- package/dist/types/core/RunnerBase.d.ts.map +1 -1
- package/dist/types/core/agent/buildAgentChart.d.ts.map +1 -1
- package/dist/types/core/agent/buildDynamicAgentChart.d.ts.map +1 -1
- package/dist/types/core/agent/callerIdentity.d.ts.map +1 -1
- package/dist/types/core/agent/stages/routeTurn.d.ts +1 -1
- package/dist/types/core/agent/stages/routeTurn.d.ts.map +1 -1
- package/dist/types/core/agent/stages/seed.d.ts +11 -1
- package/dist/types/core/agent/stages/seed.d.ts.map +1 -1
- package/dist/types/core/agent/stages/toolCalls.d.ts +11 -1
- package/dist/types/core/agent/stages/toolCalls.d.ts.map +1 -1
- package/dist/types/core/agent/types.d.ts +16 -6
- package/dist/types/core/agent/types.d.ts.map +1 -1
- package/dist/types/core/memberRun.d.ts +133 -0
- package/dist/types/core/memberRun.d.ts.map +1 -0
- package/dist/types/core/slots/buildToolsSlot.d.ts +1 -1
- package/dist/types/core/slots/buildToolsSlot.d.ts.map +1 -1
- package/dist/types/core-flow/Conditional.d.ts +8 -0
- package/dist/types/core-flow/Conditional.d.ts.map +1 -1
- package/dist/types/core-flow/Graph.d.ts.map +1 -1
- package/dist/types/core-flow/Loop.d.ts +8 -0
- package/dist/types/core-flow/Loop.d.ts.map +1 -1
- package/dist/types/core-flow/Parallel.d.ts +8 -0
- package/dist/types/core-flow/Parallel.d.ts.map +1 -1
- package/dist/types/core-flow/Sequence.d.ts +8 -0
- package/dist/types/core-flow/Sequence.d.ts.map +1 -1
- package/dist/types/core-flow/Workflow.d.ts.map +1 -1
- package/dist/types/doors/ag-ui.d.ts +20 -0
- package/dist/types/doors/ag-ui.d.ts.map +1 -0
- package/dist/types/hosting/httpHost.d.ts.map +1 -1
- package/dist/types/hosting/index.d.ts +4 -1
- package/dist/types/hosting/index.d.ts.map +1 -1
- package/dist/types/hosting/pendingAsk.d.ts +20 -0
- package/dist/types/hosting/pendingAsk.d.ts.map +1 -0
- package/dist/types/hosting/protocolAdapter.d.ts +230 -0
- package/dist/types/hosting/protocolAdapter.d.ts.map +1 -0
- package/dist/types/hosting/refusalStatus.d.ts +31 -0
- package/dist/types/hosting/refusalStatus.d.ts.map +1 -0
- package/dist/types/hosting/standingAgent.d.ts.map +1 -1
- package/dist/types/hosting/stream.d.ts +39 -0
- package/dist/types/hosting/stream.d.ts.map +1 -1
- package/dist/types/hosting/streamHandler.d.ts +135 -0
- package/dist/types/hosting/streamHandler.d.ts.map +1 -0
- package/dist/types/hosting/types.d.ts +15 -0
- package/dist/types/hosting/types.d.ts.map +1 -1
- package/dist/types/hosting/verifiedThreads.d.ts +30 -0
- package/dist/types/hosting/verifiedThreads.d.ts.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/lib/humanizeLLMError.d.ts +15 -0
- package/dist/types/lib/humanizeLLMError.d.ts.map +1 -1
- package/dist/types/mcp/throttleRetry.d.ts +51 -0
- package/dist/types/mcp/throttleRetry.d.ts.map +1 -1
- package/dist/types/memory/define.d.ts.map +1 -1
- package/dist/types/memory/define.types.d.ts +24 -0
- package/dist/types/memory/define.types.d.ts.map +1 -1
- package/dist/types/memory/stages/formatDefault.d.ts.map +1 -1
- package/dist/types/memory/store/InMemoryStore.d.ts +8 -3
- package/dist/types/memory/store/InMemoryStore.d.ts.map +1 -1
- package/dist/types/memory/store/index.d.ts +1 -0
- package/dist/types/memory/store/index.d.ts.map +1 -1
- package/dist/types/memory/store/types.d.ts +38 -4
- package/dist/types/memory/store/types.d.ts.map +1 -1
- package/dist/types/memory/store/writeOptions.d.ts +119 -0
- package/dist/types/memory/store/writeOptions.d.ts.map +1 -0
- package/dist/types/memory-providers.d.ts +1 -1
- package/dist/types/memory-providers.d.ts.map +1 -1
- package/dist/types/patterns/MapReduce.d.ts.map +1 -1
- package/dist/types/tool-providers/index.d.ts +5 -0
- package/dist/types/tool-providers/index.d.ts.map +1 -1
- package/dist/types/trace-toolpack/selfExplain.d.ts +8 -0
- package/dist/types/trace-toolpack/selfExplain.d.ts.map +1 -1
- package/package.json +25 -1
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* streamHandler — one run per request, streamed in a wire protocol, as a
|
|
3
|
+
* framework-agnostic Fetch-API handler: `(request: Request) => Promise<Response>`.
|
|
4
|
+
*
|
|
5
|
+
* Pattern: Template method over a {@link ProtocolAdapter} (the protocol is a
|
|
6
|
+
* strategy; AG-UI is one). Everything HTTP happens here once — the
|
|
7
|
+
* door guard, the body ceiling, the JSON parse, binding the
|
|
8
|
+
* conversation to its caller, keeping it between requests, the client
|
|
9
|
+
* hanging up, a failure that is never the process's — so an adapter
|
|
10
|
+
* only reads its request, plans the turn and translates.
|
|
11
|
+
* Role: the host for a protocol whose response is a STREAM OF EVENTS rather
|
|
12
|
+
* than text pieces (`httpHost`'s port). It mounts in anything that
|
|
13
|
+
* speaks `Request`/`Response` — a framework's route handler, an edge
|
|
14
|
+
* or serverless runtime, or Node through any fetch adapter.
|
|
15
|
+
* Deliberately names no vendor, like every file in this folder.
|
|
16
|
+
*
|
|
17
|
+
* THE REQUEST IS UNTRUSTED. A body is what anybody could send. It decides
|
|
18
|
+
* nothing the server owns:
|
|
19
|
+
* - WHO is calling and WHICH conversation is theirs come from the app's
|
|
20
|
+
* {@link ThreadBinder} (`threads`), from the request's headers — the id a
|
|
21
|
+
* request names is format-checked caller data and never a key;
|
|
22
|
+
* - WHAT WAS SAID BEFORE comes from the server: the session store
|
|
23
|
+
* (`sessions`), or the agent's own memory keyed by the bound session;
|
|
24
|
+
* - WHAT A PAUSED RUN WAITS ON is the stored run's own record — an answer is
|
|
25
|
+
* matched to it by the adapter, never taken on the request's word;
|
|
26
|
+
* - identity, credentials and redaction settings never come from a request.
|
|
27
|
+
*
|
|
28
|
+
* NOTHING IS SHARED BETWEEN REQUESTS. Every request builds a FRESH runner
|
|
29
|
+
* (`agent`, a factory): footprintjs runs one executor per run and a runner
|
|
30
|
+
* holds one run's context, so a request can neither see another's events nor
|
|
31
|
+
* leave anything behind for one — no shared listener, recorder, buffer or tool
|
|
32
|
+
* session. A factory that hands back a runner it handed back before is refused.
|
|
33
|
+
* The handler's own state is KEYS, never content: the bound conversations
|
|
34
|
+
* with a turn in flight and who holds each (a second turn on one conversation
|
|
35
|
+
* is refused rather than racing the first for the stored state), and the
|
|
36
|
+
* runners already used (by identity, held weakly).
|
|
37
|
+
*
|
|
38
|
+
* ONE TURN PER THREAD IS A PER-PROCESS GUARD. Two instances of the handler
|
|
39
|
+
* (several serverless instances, several workers) do not see each other's
|
|
40
|
+
* turns: route a thread to one instance (sticky sessions), or a double-sent
|
|
41
|
+
* answer can resume one paused run twice and a later persist can overwrite an
|
|
42
|
+
* earlier one. The session store port has no compare-and-set yet.
|
|
43
|
+
*
|
|
44
|
+
* The laws it keeps from `httpHost`:
|
|
45
|
+
* - The door guard runs first, on the headers alone (`doorGuard.ts`): a Host
|
|
46
|
+
* not configured (421), a browser origin not allowed (403), a POST that
|
|
47
|
+
* does not say it is JSON (415). A refused body is never read.
|
|
48
|
+
* - A body over `maxBodyBytes` is refused at the byte that crosses it (413).
|
|
49
|
+
* - A refusal answers with its own status and code (`refusalStatus.ts`);
|
|
50
|
+
* anything else is a 500 that names nothing the caller sent and no thrown
|
|
51
|
+
* message.
|
|
52
|
+
* - Nothing in a request's lifecycle is the process's failure: every step is
|
|
53
|
+
* caught, and a stream always ends.
|
|
54
|
+
*/
|
|
55
|
+
import { CONSUMER_SCOPE_RUN_ID, eventBelongsToRun } from '../bridge/eventMeta.js';
|
|
56
|
+
import { isPaused } from '../core/pause.js';
|
|
57
|
+
import { toWireJson } from '../lib/wireJson.js';
|
|
58
|
+
import { checkSessionId, doorGuard } from './doorGuard.js';
|
|
59
|
+
import { envelopeOwner, readEnvelope, readPausedRun, toEnvelope, toPausedEnvelope, } from './envelope.js';
|
|
60
|
+
import { RequestTooLargeError, WireRequestRefusal } from './errors.js';
|
|
61
|
+
import { describePause } from './pendingAsk.js';
|
|
62
|
+
import { REFUSAL_STATUS } from './refusalStatus.js';
|
|
63
|
+
/** The default body ceiling — 1 MiB, the same as `nodeHost`. */
|
|
64
|
+
export const DEFAULT_STREAM_MAX_BODY_BYTES = 1_048_576;
|
|
65
|
+
/** The default keep-alive interval: an SSE comment every 15 s of silence. */
|
|
66
|
+
export const DEFAULT_STREAM_HEARTBEAT_MS = 15_000;
|
|
67
|
+
/**
|
|
68
|
+
* Serve runs in `adapter`'s protocol: POST a protocol request, read a stream
|
|
69
|
+
* of the protocol's events.
|
|
70
|
+
*
|
|
71
|
+
* @throws TypeError at construction for options that cannot be served, and
|
|
72
|
+
* when the adapter's framing cannot be built (an optional peer missing) —
|
|
73
|
+
* refused at boot, never mid-request.
|
|
74
|
+
*
|
|
75
|
+
* @example A route handler that speaks `Request`/`Response`
|
|
76
|
+
* ```ts
|
|
77
|
+
* import { memorySessions, streamHandler } from 'agentfootprint/hosting';
|
|
78
|
+
* import { agUi } from 'agentfootprint/ag-ui';
|
|
79
|
+
*
|
|
80
|
+
* export const POST = streamHandler({
|
|
81
|
+
* agent: ({ tools }) => buildAgent(tools), // a fresh agent per request
|
|
82
|
+
* adapter: agUi(),
|
|
83
|
+
* threads: { bind: ({ conversation, headers }) => bindToUser(conversation, headers) },
|
|
84
|
+
* sessions: memorySessions(),
|
|
85
|
+
* });
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export function streamHandler(options) {
|
|
89
|
+
const { adapter, threads, sessions } = options;
|
|
90
|
+
const name = options.name ?? `${adapter.name} stream`;
|
|
91
|
+
if (typeof options.agent !== 'function') {
|
|
92
|
+
throw new TypeError(`[hosting] '${name}': agent must be a function that builds a FRESH runner for every ` +
|
|
93
|
+
`request — a runner holds one run's context, and one shared between requests would ` +
|
|
94
|
+
`hand one caller's run to another.`);
|
|
95
|
+
}
|
|
96
|
+
if (sessions !== undefined && threads === undefined) {
|
|
97
|
+
throw new TypeError(`[hosting] '${name}': sessions needs threads. A conversation is kept under the key the ` +
|
|
98
|
+
`app binds to its caller (threads.bind), never under the id a request names.`);
|
|
99
|
+
}
|
|
100
|
+
const limit = positive(options.maxBodyBytes, DEFAULT_STREAM_MAX_BODY_BYTES, 'maxBodyBytes', name);
|
|
101
|
+
const heartbeatMs = options.heartbeatMs ?? DEFAULT_STREAM_HEARTBEAT_MS;
|
|
102
|
+
if (!Number.isFinite(heartbeatMs) || heartbeatMs < 0) {
|
|
103
|
+
throw new TypeError(`[hosting] '${name}': heartbeatMs must be 0 (off) or a positive number.`);
|
|
104
|
+
}
|
|
105
|
+
const guard = doorGuard({ ...options, name });
|
|
106
|
+
const framing = adapter.framing();
|
|
107
|
+
const bytes = new TextEncoder();
|
|
108
|
+
/**
|
|
109
|
+
* Bound conversations with a turn in flight — the key, and who holds it (so
|
|
110
|
+
* anybody else hears "not found", never "busy").
|
|
111
|
+
*/
|
|
112
|
+
const inFlight = new Map();
|
|
113
|
+
/** Runners already used, by identity — so a factory that shares one is caught. */
|
|
114
|
+
const used = new WeakSet();
|
|
115
|
+
/** One answer for "none", "another's" and "nobody's" — a caller learns no ids. */
|
|
116
|
+
const notFound = () => new WireRequestRefusal('ERR_SESSION_NOT_FOUND', `'${name}': that conversation is not one you can open.`, 404);
|
|
117
|
+
/** Bind the conversation the request names to its caller — the app's port decides. */
|
|
118
|
+
async function bind(request, headers) {
|
|
119
|
+
if (threads === undefined)
|
|
120
|
+
return undefined;
|
|
121
|
+
const thread = await threads.bind({ conversation: adapter.conversation(request), headers });
|
|
122
|
+
if (thread === null || typeof thread !== 'object' || typeof thread.sessionId !== 'string') {
|
|
123
|
+
throw new TypeError('threads.bind returned no session');
|
|
124
|
+
}
|
|
125
|
+
const bad = checkSessionId(thread.sessionId, name);
|
|
126
|
+
if (bad !== undefined)
|
|
127
|
+
throw bad;
|
|
128
|
+
return thread;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* The stored conversation, when it is the caller's — refusing one that is not.
|
|
132
|
+
* Asked BEFORE anything about the conversation's activity, so a caller it is
|
|
133
|
+
* not learns "not found" and never "busy" — and never holds its turn.
|
|
134
|
+
*/
|
|
135
|
+
async function ownersOnly(thread) {
|
|
136
|
+
if (sessions === undefined || thread === undefined)
|
|
137
|
+
return undefined;
|
|
138
|
+
await sessions.onWake?.(thread.sessionId, 'invoke');
|
|
139
|
+
const stored = await sessions.hydrate(thread.sessionId);
|
|
140
|
+
// Whose conversation this is, before a line of it is read. One answer for
|
|
141
|
+
// "none", "another's" and "nobody's", so a caller learns no ids.
|
|
142
|
+
if (stored !== undefined && envelopeOwner(stored) !== thread.identity?.principal)
|
|
143
|
+
throw notFound();
|
|
144
|
+
return stored;
|
|
145
|
+
}
|
|
146
|
+
/** Read what the server holds for the bound conversation — under the turn's claim. */
|
|
147
|
+
async function hold(thread) {
|
|
148
|
+
const stored = await ownersOnly(thread);
|
|
149
|
+
if (stored === undefined)
|
|
150
|
+
return { view: { continues: false } };
|
|
151
|
+
if (stored.format === 'flowchart-v1') {
|
|
152
|
+
const paused = readPausedRun(stored);
|
|
153
|
+
const record = paused.wire?.protocol === adapter.name ? paused.wire.record : undefined;
|
|
154
|
+
return {
|
|
155
|
+
paused,
|
|
156
|
+
view: {
|
|
157
|
+
continues: false,
|
|
158
|
+
awaiting: {
|
|
159
|
+
pending: paused.pending,
|
|
160
|
+
...(record !== undefined && { suspension: record }),
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
const prior = readEnvelope(stored);
|
|
166
|
+
return { prior, view: { continues: true } };
|
|
167
|
+
}
|
|
168
|
+
/** A fresh runner for this request — never one the factory handed out before. */
|
|
169
|
+
function build(context) {
|
|
170
|
+
const runner = options.agent(context);
|
|
171
|
+
if (runner === null ||
|
|
172
|
+
typeof runner !== 'object' ||
|
|
173
|
+
typeof runner.on !== 'function' ||
|
|
174
|
+
typeof runner.run !== 'function') {
|
|
175
|
+
throw new TypeError('agent returned no runner');
|
|
176
|
+
}
|
|
177
|
+
if (used.has(runner)) {
|
|
178
|
+
throw new WireRequestRefusal('ERR_RUNNER_REUSED', `'${name}': the agent factory returned a runner it returned before. Every ` +
|
|
179
|
+
`request needs a FRESH runner — a shared one hands one caller's run to another.`, 500);
|
|
180
|
+
}
|
|
181
|
+
used.add(runner);
|
|
182
|
+
return runner;
|
|
183
|
+
}
|
|
184
|
+
/** Keep what the run left behind, then say how it ended — kept FIRST, told after. */
|
|
185
|
+
async function keep(turn, out, recordRunId) {
|
|
186
|
+
const { thread, runner, held, translation } = turn;
|
|
187
|
+
const store = thread === undefined ? undefined : sessions;
|
|
188
|
+
if (isPaused(out)) {
|
|
189
|
+
const awaiting = adapter.awaitsCaller?.(out.pauseData) === true ? 'caller' : 'person';
|
|
190
|
+
if (store !== undefined && thread !== undefined) {
|
|
191
|
+
const record = translation.suspension?.(awaiting);
|
|
192
|
+
const conversation = runner.checkpoint?.() ?? noConversation(turn, recordRunId, thread.identity);
|
|
193
|
+
await store.persist(thread.sessionId, toPausedEnvelope({
|
|
194
|
+
checkpoint: out.checkpoint,
|
|
195
|
+
conversation,
|
|
196
|
+
pending: describePause(out, thread.sessionId),
|
|
197
|
+
...(record !== undefined && { wire: { protocol: adapter.name, record } }),
|
|
198
|
+
}));
|
|
199
|
+
}
|
|
200
|
+
return { kind: 'paused', awaiting };
|
|
201
|
+
}
|
|
202
|
+
if (store !== undefined && thread !== undefined) {
|
|
203
|
+
const conversation = runner.checkpoint?.();
|
|
204
|
+
if (conversation !== undefined)
|
|
205
|
+
await store.persist(thread.sessionId, toEnvelope(conversation));
|
|
206
|
+
// A runner that keeps no conversation still clears the pause it continued.
|
|
207
|
+
else if (held.paused !== undefined)
|
|
208
|
+
await store.persist(thread.sessionId, toEnvelope(noConversation(turn, recordRunId, thread.identity)));
|
|
209
|
+
}
|
|
210
|
+
return { kind: 'finished' };
|
|
211
|
+
}
|
|
212
|
+
/** Run the turn; every event the run serves goes through the translation; settle once. */
|
|
213
|
+
async function serve(turn, write, signal, release) {
|
|
214
|
+
const { plan, held, thread, runner, translation } = turn;
|
|
215
|
+
// A translation that throws is a fault in the adapter, never the run's: the
|
|
216
|
+
// run goes on, and the stream still ends.
|
|
217
|
+
const safely = (produce) => {
|
|
218
|
+
try {
|
|
219
|
+
write(produce());
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
// nothing more this request can be told
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
let runId;
|
|
226
|
+
let off;
|
|
227
|
+
let settlement;
|
|
228
|
+
try {
|
|
229
|
+
// The runner is this request's alone; the run filter still holds a fact a
|
|
230
|
+
// shared resource stamped for another run or session out of the stream.
|
|
231
|
+
off = runner.on('*', (event) => {
|
|
232
|
+
const named = event.meta?.runId;
|
|
233
|
+
if (runId === undefined && typeof named === 'string' && named !== CONSUMER_SCOPE_RUN_ID)
|
|
234
|
+
runId = named;
|
|
235
|
+
if (!eventBelongsToRun(event.meta, { runId: runId ?? '', sessionId: thread?.sessionId }))
|
|
236
|
+
return;
|
|
237
|
+
safely(() => translation.event(event));
|
|
238
|
+
});
|
|
239
|
+
if (signal.aborted)
|
|
240
|
+
throw new Error('the caller left before the run started');
|
|
241
|
+
const runOptions = {
|
|
242
|
+
signal,
|
|
243
|
+
...(thread !== undefined && { sessionId: thread.sessionId }),
|
|
244
|
+
...(thread?.identity !== undefined && { identity: thread.identity }),
|
|
245
|
+
};
|
|
246
|
+
const out = plan.turn.kind === 'answer'
|
|
247
|
+
? await runner.resume(held.paused.checkpoint, plan.turn.answer, runOptions)
|
|
248
|
+
: await runner.run((typeof runner.checkpoint === 'function' && held.prior !== undefined
|
|
249
|
+
? { message: plan.turn.message, continueFrom: held.prior }
|
|
250
|
+
: { message: plan.turn.message }), runOptions);
|
|
251
|
+
settlement = await keep(turn, out, runId);
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
settlement = { kind: signal.aborted ? 'cancelled' : 'failed' };
|
|
255
|
+
}
|
|
256
|
+
finally {
|
|
257
|
+
// The conversation is free BEFORE the caller hears the end — and before
|
|
258
|
+
// anything else that could throw: a client that answers on RUN_FINISHED
|
|
259
|
+
// must not find its own turn still running, ever.
|
|
260
|
+
release();
|
|
261
|
+
try {
|
|
262
|
+
if (typeof off === 'function')
|
|
263
|
+
off();
|
|
264
|
+
}
|
|
265
|
+
catch {
|
|
266
|
+
// a runner that cannot unsubscribe is thrown away with this request
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
safely(() => translation.settle(settlement));
|
|
270
|
+
// Tool sessions this request's runner opened close with it; a strategy the
|
|
271
|
+
// app shares between runners is drained, never stopped.
|
|
272
|
+
void runner.shutdown?.({ stop: false })?.catch(() => undefined);
|
|
273
|
+
}
|
|
274
|
+
function respond(turn, request, release) {
|
|
275
|
+
const abort = new AbortController();
|
|
276
|
+
const hangUp = () => abort.abort();
|
|
277
|
+
// A caller already gone never starts its run.
|
|
278
|
+
if (request.signal?.aborted === true)
|
|
279
|
+
abort.abort();
|
|
280
|
+
else
|
|
281
|
+
request.signal?.addEventListener('abort', hangUp, { once: true });
|
|
282
|
+
let closed = false;
|
|
283
|
+
let heartbeat;
|
|
284
|
+
const stop = () => {
|
|
285
|
+
closed = true;
|
|
286
|
+
if (heartbeat !== undefined)
|
|
287
|
+
clearInterval(heartbeat);
|
|
288
|
+
request.signal?.removeEventListener('abort', hangUp);
|
|
289
|
+
};
|
|
290
|
+
const body = new ReadableStream({
|
|
291
|
+
start(controller) {
|
|
292
|
+
const send = (text) => {
|
|
293
|
+
if (closed)
|
|
294
|
+
return;
|
|
295
|
+
try {
|
|
296
|
+
controller.enqueue(bytes.encode(text));
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
stop(); // the stream went away under us
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
const write = (events) => {
|
|
303
|
+
for (const event of events)
|
|
304
|
+
send(framing.frame(event));
|
|
305
|
+
};
|
|
306
|
+
if (heartbeatMs > 0) {
|
|
307
|
+
heartbeat = setInterval(() => send(': ping\n\n'), heartbeatMs);
|
|
308
|
+
heartbeat.unref?.();
|
|
309
|
+
}
|
|
310
|
+
const end = () => {
|
|
311
|
+
if (closed)
|
|
312
|
+
return;
|
|
313
|
+
stop();
|
|
314
|
+
try {
|
|
315
|
+
controller.close();
|
|
316
|
+
}
|
|
317
|
+
catch {
|
|
318
|
+
// already closed by the reader
|
|
319
|
+
}
|
|
320
|
+
};
|
|
321
|
+
void serve(turn, write, abort.signal, release).then(end, end);
|
|
322
|
+
},
|
|
323
|
+
cancel() {
|
|
324
|
+
stop();
|
|
325
|
+
abort.abort();
|
|
326
|
+
},
|
|
327
|
+
});
|
|
328
|
+
return new Response(body, {
|
|
329
|
+
status: 200,
|
|
330
|
+
headers: {
|
|
331
|
+
'content-type': framing.contentType,
|
|
332
|
+
'cache-control': 'no-cache, no-transform',
|
|
333
|
+
'x-accel-buffering': 'no',
|
|
334
|
+
},
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
return async (request) => {
|
|
338
|
+
/** The conversation this request holds while it is in flight — released exactly once. */
|
|
339
|
+
let claimed;
|
|
340
|
+
const release = () => {
|
|
341
|
+
if (claimed !== undefined)
|
|
342
|
+
inFlight.delete(claimed);
|
|
343
|
+
claimed = undefined;
|
|
344
|
+
};
|
|
345
|
+
try {
|
|
346
|
+
if (request.method !== 'POST') {
|
|
347
|
+
return refusal(405, `[hosting] '${name}' answers POST only.`, 'ERR_METHOD_NOT_ALLOWED', {
|
|
348
|
+
allow: 'POST',
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
const headers = headersOf(request);
|
|
352
|
+
const refused = guard.check({ method: request.method, headers });
|
|
353
|
+
if (refused !== undefined)
|
|
354
|
+
return refusal(refused.status, refused.message, refused.code);
|
|
355
|
+
const text = await readBody(request, limit, name);
|
|
356
|
+
let body;
|
|
357
|
+
try {
|
|
358
|
+
body = text.trim() === '' ? {} : JSON.parse(text);
|
|
359
|
+
}
|
|
360
|
+
catch {
|
|
361
|
+
return refusal(400, `[hosting] '${name}': the request body is not JSON.`, 'ERR_INVALID_JSON');
|
|
362
|
+
}
|
|
363
|
+
const read = adapter.readRequest({ body, headers });
|
|
364
|
+
const thread = await bind(read, headers);
|
|
365
|
+
if (thread !== undefined) {
|
|
366
|
+
// Ownership first: a caller the conversation is not answered "not
|
|
367
|
+
// found" whether or not a turn is running, and never claims it.
|
|
368
|
+
await ownersOnly(thread);
|
|
369
|
+
const principal = thread.identity?.principal;
|
|
370
|
+
if (inFlight.has(thread.sessionId)) {
|
|
371
|
+
// Even before a first turn has stored anything: the claimant is the owner.
|
|
372
|
+
if (inFlight.get(thread.sessionId) !== principal)
|
|
373
|
+
throw notFound();
|
|
374
|
+
return refusal(409, `[hosting] '${name}': a turn of that conversation is already in flight. Send the ` +
|
|
375
|
+
`next turn when it ends.`, 'ERR_CONCURRENT_RUN');
|
|
376
|
+
}
|
|
377
|
+
inFlight.set(thread.sessionId, principal);
|
|
378
|
+
claimed = thread.sessionId;
|
|
379
|
+
}
|
|
380
|
+
const held = await hold(thread);
|
|
381
|
+
const plan = adapter.plan(read, held.view, {
|
|
382
|
+
headers,
|
|
383
|
+
...(thread !== undefined && { thread }),
|
|
384
|
+
keepsConversation: threads !== undefined,
|
|
385
|
+
keepsPauses: threads !== undefined && sessions !== undefined,
|
|
386
|
+
});
|
|
387
|
+
const runner = build({
|
|
388
|
+
tools: plan.tools ?? [],
|
|
389
|
+
accepted: plan.accepted ?? {},
|
|
390
|
+
...(thread !== undefined && { thread }),
|
|
391
|
+
});
|
|
392
|
+
const translation = adapter.open(read, plan.turn.kind === 'answer' ? held.view.awaiting?.suspension : undefined);
|
|
393
|
+
// The stream owns the claim from here: released when the run ends.
|
|
394
|
+
const owned = claimed;
|
|
395
|
+
claimed = undefined;
|
|
396
|
+
return respond({ plan, held, ...(thread !== undefined && { thread }), runner, translation }, request, () => {
|
|
397
|
+
if (owned !== undefined)
|
|
398
|
+
inFlight.delete(owned);
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
catch (err) {
|
|
402
|
+
return failure(err, name);
|
|
403
|
+
}
|
|
404
|
+
finally {
|
|
405
|
+
release();
|
|
406
|
+
}
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* A conversation record for a runner that keeps none (an `LLMCall`, a
|
|
411
|
+
* composition): no history, only what a stored session needs — the run, the
|
|
412
|
+
* message, and whose it is.
|
|
413
|
+
*/
|
|
414
|
+
function noConversation(turn, recordRunId, identity) {
|
|
415
|
+
const message = turn.plan.turn.kind === 'message'
|
|
416
|
+
? turn.plan.turn.message
|
|
417
|
+
: turn.held.paused?.conversation.originalInput.message ?? '';
|
|
418
|
+
return {
|
|
419
|
+
version: 1,
|
|
420
|
+
runId: recordRunId ?? 'unknown',
|
|
421
|
+
history: [],
|
|
422
|
+
lastCompletedIteration: 0,
|
|
423
|
+
originalInput: { message },
|
|
424
|
+
checkpointedAt: Date.now(),
|
|
425
|
+
...(identity !== undefined && { identity }),
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
/** The refusal an error means — its own status and code, or a 500 that quotes nothing. */
|
|
429
|
+
function failure(err, name) {
|
|
430
|
+
if (err instanceof RequestTooLargeError)
|
|
431
|
+
return refusal(413, err.message, err.code);
|
|
432
|
+
if (err instanceof WireRequestRefusal)
|
|
433
|
+
return refusal(err.status, err.message, err.code);
|
|
434
|
+
const code = err?.code;
|
|
435
|
+
if (err instanceof Error && typeof code === 'string' && REFUSAL_STATUS[code] !== undefined) {
|
|
436
|
+
return refusal(REFUSAL_STATUS[code], err.message, code);
|
|
437
|
+
}
|
|
438
|
+
// Never the thrown message: it is the author's note to their own logs.
|
|
439
|
+
return refusal(500, `[hosting] '${name}' could not serve the request.`, 'ERR_INTERNAL');
|
|
440
|
+
}
|
|
441
|
+
/** A JSON refusal: `{ error, code }` under the refusal's own status. */
|
|
442
|
+
function refusal(status, message, code, headers = {}) {
|
|
443
|
+
return new Response(toWireJson({ error: message, code }), {
|
|
444
|
+
status,
|
|
445
|
+
headers: { 'content-type': 'application/json', ...headers },
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
/** The request's headers, names lower-cased (the door guard's and an adapter's view). */
|
|
449
|
+
function headersOf(request) {
|
|
450
|
+
const out = {};
|
|
451
|
+
request.headers.forEach((value, key) => {
|
|
452
|
+
out[key.toLowerCase()] = value;
|
|
453
|
+
});
|
|
454
|
+
return out;
|
|
455
|
+
}
|
|
456
|
+
/** The body as text, refused at the byte that crosses `limit`. */
|
|
457
|
+
async function readBody(request, limit, name) {
|
|
458
|
+
const declared = Number(request.headers.get('content-length'));
|
|
459
|
+
if (Number.isFinite(declared) && declared > limit)
|
|
460
|
+
throw new RequestTooLargeError(limit, name);
|
|
461
|
+
if (request.body === null)
|
|
462
|
+
return '';
|
|
463
|
+
const reader = request.body.getReader();
|
|
464
|
+
const chunks = [];
|
|
465
|
+
let size = 0;
|
|
466
|
+
for (;;) {
|
|
467
|
+
const { done, value } = await reader.read();
|
|
468
|
+
if (done)
|
|
469
|
+
break;
|
|
470
|
+
size += value.byteLength;
|
|
471
|
+
if (size > limit) {
|
|
472
|
+
await reader.cancel().catch(() => undefined);
|
|
473
|
+
throw new RequestTooLargeError(limit, name);
|
|
474
|
+
}
|
|
475
|
+
chunks.push(value);
|
|
476
|
+
}
|
|
477
|
+
const all = new Uint8Array(size);
|
|
478
|
+
let at = 0;
|
|
479
|
+
for (const chunk of chunks) {
|
|
480
|
+
all.set(chunk, at);
|
|
481
|
+
at += chunk.byteLength;
|
|
482
|
+
}
|
|
483
|
+
return new TextDecoder().decode(all);
|
|
484
|
+
}
|
|
485
|
+
function positive(value, fallback, field, name) {
|
|
486
|
+
if (value === undefined)
|
|
487
|
+
return fallback;
|
|
488
|
+
if (!Number.isInteger(value) || value <= 0) {
|
|
489
|
+
throw new TypeError(`[hosting] '${name}': ${field} must be a positive whole number of bytes.`);
|
|
490
|
+
}
|
|
491
|
+
return value;
|
|
492
|
+
}
|
|
493
|
+
//# sourceMappingURL=streamHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamHandler.js","sourceRoot":"","sources":["../../../src/hosting/streamHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -871,6 +871,21 @@ export interface PausedRun {
|
|
|
871
871
|
readonly conversation: AgentRunCheckpoint;
|
|
872
872
|
/** What the run is waiting on, as data. */
|
|
873
873
|
readonly pending: PendingAsk;
|
|
874
|
+
/**
|
|
875
|
+
* What the WIRE that served the pause recorded about it — the ids it handed
|
|
876
|
+
* the caller for the answer — so a later request on that wire is matched to
|
|
877
|
+
* this pause and continued as the same invocation (`streamHandler` keeps the
|
|
878
|
+
* AG-UI adapter's record here). Absent for a pause a door with nothing to
|
|
879
|
+
* remember stored, and opaque to the store and to every other door.
|
|
880
|
+
*/
|
|
881
|
+
readonly wire?: PausedWire;
|
|
882
|
+
}
|
|
883
|
+
/** One wire protocol's own record of a pause it served — see {@link PausedRun.wire}. */
|
|
884
|
+
export interface PausedWire {
|
|
885
|
+
/** The protocol that recorded it: the protocol adapter's `name`. */
|
|
886
|
+
readonly protocol: string;
|
|
887
|
+
/** Plain JSON, the protocol's own; ids and names, never a value of the run. */
|
|
888
|
+
readonly record: unknown;
|
|
874
889
|
}
|
|
875
890
|
/**
|
|
876
891
|
* The question a paused run is waiting on — the part of a pause that is safe to
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/hosting/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/hosting/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAoyCH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AA2QxC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,CAAC;AAElD;iFACiF;AACjF,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAE/C;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* verifiedThreads — the {@link ThreadBinder} that binds a thread to a VERIFIED
|
|
3
|
+
* caller, so the secure binding is the one-line one.
|
|
4
|
+
*
|
|
5
|
+
* A request names a thread; naming one proves nothing. This binder checks the
|
|
6
|
+
* caller's credential with the door's own identity verification
|
|
7
|
+
* (`verifyRequestIdentity` — the bearer token, through your verifier), never a
|
|
8
|
+
* header read as a name, and keys the conversation by WHO
|
|
9
|
+
* plus WHICH: the same thread id from two people is two conversations. The
|
|
10
|
+
* run's `identity` names the verified person, so a stored conversation records
|
|
11
|
+
* its owner and a later request from anyone else is refused as not found.
|
|
12
|
+
*
|
|
13
|
+
* A caller with no credential is REFUSED (401), even at a door that allows
|
|
14
|
+
* anonymous requests elsewhere: a thread with no owner would be anybody's who
|
|
15
|
+
* guessed its id.
|
|
16
|
+
*/
|
|
17
|
+
import { type IdentityVerificationOptions } from './identityVerification.js';
|
|
18
|
+
import type { ThreadBinder } from './protocolAdapter.js';
|
|
19
|
+
/**
|
|
20
|
+
* Bind every thread to the caller `identity` verifies.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* import { jwksIdentity } from 'agentfootprint/security';
|
|
25
|
+
* const threads = verifiedThreads(jwksIdentity({ jwksUrl, issuer, audience }));
|
|
26
|
+
* streamHandler({ agent, adapter: agUi(), threads, sessions: memorySessions() });
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare function verifiedThreads(identity: IdentityVerificationOptions): ThreadBinder;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* verifiedThreads — the {@link ThreadBinder} that binds a thread to a VERIFIED
|
|
3
|
+
* caller, so the secure binding is the one-line one.
|
|
4
|
+
*
|
|
5
|
+
* A request names a thread; naming one proves nothing. This binder checks the
|
|
6
|
+
* caller's credential with the door's own identity verification
|
|
7
|
+
* (`verifyRequestIdentity` — the bearer token, through your verifier), never a
|
|
8
|
+
* header read as a name, and keys the conversation by WHO
|
|
9
|
+
* plus WHICH: the same thread id from two people is two conversations. The
|
|
10
|
+
* run's `identity` names the verified person, so a stored conversation records
|
|
11
|
+
* its owner and a later request from anyone else is refused as not found.
|
|
12
|
+
*
|
|
13
|
+
* A caller with no credential is REFUSED (401), even at a door that allows
|
|
14
|
+
* anonymous requests elsewhere: a thread with no owner would be anybody's who
|
|
15
|
+
* guessed its id.
|
|
16
|
+
*/
|
|
17
|
+
import { IdentityNotVerifiedError } from './errors.js';
|
|
18
|
+
import { verifyRequestIdentity } from './identityVerification.js';
|
|
19
|
+
/**
|
|
20
|
+
* Bind every thread to the caller `identity` verifies.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* import { jwksIdentity } from 'agentfootprint/security';
|
|
25
|
+
* const threads = verifiedThreads(jwksIdentity({ jwksUrl, issuer, audience }));
|
|
26
|
+
* streamHandler({ agent, adapter: agUi(), threads, sessions: memorySessions() });
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export function verifiedThreads(identity) {
|
|
30
|
+
const binder = {
|
|
31
|
+
async bind({ conversation, headers }) {
|
|
32
|
+
const who = await verifyRequestIdentity(identity, headers, undefined);
|
|
33
|
+
if (who === undefined)
|
|
34
|
+
throw new IdentityNotVerifiedError('no-token', false);
|
|
35
|
+
return {
|
|
36
|
+
// Injective, and visible ASCII whatever the name (`josé`, `John Smith`):
|
|
37
|
+
// both halves are percent-encoded, the separator included, so no
|
|
38
|
+
// (who, which) pair spells another's key.
|
|
39
|
+
sessionId: `${encodeURIComponent(who.userId)}/${encodeURIComponent(conversation)}`,
|
|
40
|
+
identity: { principal: who.userId, conversationId: conversation },
|
|
41
|
+
};
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
return Object.freeze(binder);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=verifiedThreads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifiedThreads.js","sourceRoot":"","sources":["../../../src/hosting/verifiedThreads.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAoC,MAAM,2BAA2B,CAAC;AAGpG;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,QAAqC;IACnE,MAAM,MAAM,GAAiB;QAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE;YAClC,MAAM,GAAG,GAAG,MAAM,qBAAqB,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;YACtE,IAAI,GAAG,KAAK,SAAS;gBAAE,MAAM,IAAI,wBAAwB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAC7E,OAAO;gBACL,yEAAyE;gBACzE,iEAAiE;gBACjE,0CAA0C;gBAC1C,SAAS,EAAE,GAAG,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,kBAAkB,CAAC,YAAY,CAAC,EAAE;gBAClF,QAAQ,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE;aAClE,CAAC;QACJ,CAAC;KACF,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -56,6 +56,7 @@ export { canResume, ConversationMismatchError, RunCheckpointError, type AgentRun
|
|
|
56
56
|
export { browserSessionId, DEFAULT_SESSION_STORAGE_KEY, type BrowserSessionIdOptions, } from './hosting/browserSession.js';
|
|
57
57
|
export { ContextWindowExceededError, ERR_CONTEXT_WINDOW_EXCEEDED, isContextWindowExceeded, } from './provider-contract/contextWindow.js';
|
|
58
58
|
export { NoConversationError, type NoConversationReason, PendingQuestionError, ResumeIdentityConflictError, ResumeRedactionError, type ResumeRedactionReason, RunInFlightError, } from './core/conversation.js';
|
|
59
|
+
export { MemberIdentityError, ParentRunRefusedError } from './core/memberRun.js';
|
|
59
60
|
export { flowchartAsTool, type FlowchartAsToolOptions, type FlowchartResultMapper, type FlowchartToolSnapshot, } from './core/flowchartAsTool.js';
|
|
60
61
|
export { absenceSignalOf, DECLINED_VERDICT, DEFAULT_MAX_ROWS, DEFAULT_RECORDING_MAX_BYTES, DEFAULT_WALK_CAP, PANEL_RENDER_NOTE, probeDispatch, projectWalk, recordingDispatch, renderVerdictTable, runbookAsTool, RunbookAbsenceSignal, VERDICT_RENDER_NOTE, verdictRowsOf, type InnerCallRecord, type ProjectedWalk, type RecordedDispatch, type RunbookAsToolOptions, type RunbookEnvelope, type RunbookPresentation, type RunbookProcedure, type RunbookRecordingOptions, type RunbookRules, type RunbookVerdictsOptions, type RunbookWalkOptions, type VerdictRow, type WalkDescriptor, type WalkRow, } from './core/runbook/index.js';
|
|
61
62
|
export type { Tool, ToolExecutionContext, ToolRegistryEntry, DefineToolOptions, ToolDispatch, ToolDispatchCallOptions, ToolResultCeiling, } from './tools/tools.js';
|
package/dist/esm/index.js
CHANGED
|
@@ -268,6 +268,9 @@ export { ContextWindowExceededError, ERR_CONTEXT_WINDOW_EXCEEDED, isContextWindo
|
|
|
268
268
|
// "you are already running" from "somebody is still waiting on an answer" from
|
|
269
269
|
// "there is nothing to follow up on".
|
|
270
270
|
export { NoConversationError, PendingQuestionError, ResumeIdentityConflictError, ResumeRedactionError, RunInFlightError, } from './core/conversation.js';
|
|
271
|
+
// A composition member runs for the run that mounted it; one no run reached is
|
|
272
|
+
// refused by name (`core/memberRun.ts`).
|
|
273
|
+
export { MemberIdentityError, ParentRunRefusedError } from './core/memberRun.js';
|
|
271
274
|
export { flowchartAsTool, } from './core/flowchartAsTool.js';
|
|
272
275
|
// runbookAsTool (9.76.0) — the STANDARD bridge from a footprintjs procedure
|
|
273
276
|
// to an Agent tool: every answer is the mandatory honesty spine (coverage
|