@truefoundry/trueforge-core 0.0.0 → 0.1.0-rc.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/LICENSE +21 -0
- package/dist/agent-session/ITurnResourceResolver.d.ts +69 -0
- package/dist/agent-session/ITurnResourceResolver.d.ts.map +1 -0
- package/dist/agent-session/ITurnResourceResolver.js +19 -0
- package/dist/agent-session/ITurnResourceResolver.js.map +1 -0
- package/dist/agent-session/ITurnResourceResolver.mjs +1 -0
- package/dist/agent-session/ITurnResourceResolver.mjs.map +1 -0
- package/dist/agent-session/SessionHandle.d.ts +81 -0
- package/dist/agent-session/SessionHandle.d.ts.map +1 -0
- package/dist/agent-session/SessionHandle.js +392 -0
- package/dist/agent-session/SessionHandle.js.map +1 -0
- package/dist/agent-session/SessionHandle.mjs +371 -0
- package/dist/agent-session/SessionHandle.mjs.map +1 -0
- package/dist/agent-session/Sessions.d.ts +25 -0
- package/dist/agent-session/Sessions.d.ts.map +1 -0
- package/dist/agent-session/Sessions.js +71 -0
- package/dist/agent-session/Sessions.js.map +1 -0
- package/dist/agent-session/Sessions.mjs +46 -0
- package/dist/agent-session/Sessions.mjs.map +1 -0
- package/dist/agent-session/TurnHandle.d.ts +88 -0
- package/dist/agent-session/TurnHandle.d.ts.map +1 -0
- package/dist/agent-session/TurnHandle.js +490 -0
- package/dist/agent-session/TurnHandle.js.map +1 -0
- package/dist/agent-session/TurnHandle.mjs +469 -0
- package/dist/agent-session/TurnHandle.mjs.map +1 -0
- package/dist/agent-session/TurnResourceResolver.d.ts +154 -0
- package/dist/agent-session/TurnResourceResolver.d.ts.map +1 -0
- package/dist/agent-session/TurnResourceResolver.js +178 -0
- package/dist/agent-session/TurnResourceResolver.js.map +1 -0
- package/dist/agent-session/TurnResourceResolver.mjs +153 -0
- package/dist/agent-session/TurnResourceResolver.mjs.map +1 -0
- package/dist/agent-session/builtinsFromSpec.d.ts +19 -0
- package/dist/agent-session/builtinsFromSpec.d.ts.map +1 -0
- package/dist/agent-session/builtinsFromSpec.js +73 -0
- package/dist/agent-session/builtinsFromSpec.js.map +1 -0
- package/dist/agent-session/builtinsFromSpec.mjs +48 -0
- package/dist/agent-session/builtinsFromSpec.mjs.map +1 -0
- package/dist/agent-session/index.d.ts +29 -0
- package/dist/agent-session/index.d.ts.map +1 -0
- package/dist/agent-session/index.js +117 -0
- package/dist/agent-session/index.js.map +1 -0
- package/dist/agent-session/index.mjs +84 -0
- package/dist/agent-session/index.mjs.map +1 -0
- package/dist/agent-session/models/SessionRecord.d.ts +34 -0
- package/dist/agent-session/models/SessionRecord.d.ts.map +1 -0
- package/dist/agent-session/models/SessionRecord.js +19 -0
- package/dist/agent-session/models/SessionRecord.js.map +1 -0
- package/dist/agent-session/models/SessionRecord.mjs +1 -0
- package/dist/agent-session/models/SessionRecord.mjs.map +1 -0
- package/dist/agent-session/models/TurnRecord.d.ts +37 -0
- package/dist/agent-session/models/TurnRecord.d.ts.map +1 -0
- package/dist/agent-session/models/TurnRecord.js +31 -0
- package/dist/agent-session/models/TurnRecord.js.map +1 -0
- package/dist/agent-session/models/TurnRecord.mjs +6 -0
- package/dist/agent-session/models/TurnRecord.mjs.map +1 -0
- package/dist/agent-session/schemas/agentSpec.d.ts +142 -0
- package/dist/agent-session/schemas/agentSpec.d.ts.map +1 -0
- package/dist/agent-session/schemas/agentSpec.js +170 -0
- package/dist/agent-session/schemas/agentSpec.js.map +1 -0
- package/dist/agent-session/schemas/agentSpec.mjs +154 -0
- package/dist/agent-session/schemas/agentSpec.mjs.map +1 -0
- package/dist/agent-session/schemas/events.d.ts +1037 -0
- package/dist/agent-session/schemas/events.d.ts.map +1 -0
- package/dist/agent-session/schemas/events.js +80 -0
- package/dist/agent-session/schemas/events.js.map +1 -0
- package/dist/agent-session/schemas/events.mjs +69 -0
- package/dist/agent-session/schemas/events.mjs.map +1 -0
- package/dist/agent-session/schemas/pagination.d.ts +9 -0
- package/dist/agent-session/schemas/pagination.d.ts.map +1 -0
- package/dist/agent-session/schemas/pagination.js +36 -0
- package/dist/agent-session/schemas/pagination.js.map +1 -0
- package/dist/agent-session/schemas/pagination.mjs +11 -0
- package/dist/agent-session/schemas/pagination.mjs.map +1 -0
- package/dist/agent-session/schemas/session.d.ts +319 -0
- package/dist/agent-session/schemas/session.d.ts.map +1 -0
- package/dist/agent-session/schemas/session.js +58 -0
- package/dist/agent-session/schemas/session.js.map +1 -0
- package/dist/agent-session/schemas/session.mjs +30 -0
- package/dist/agent-session/schemas/session.mjs.map +1 -0
- package/dist/agent-session/schemas/turn.d.ts +494 -0
- package/dist/agent-session/schemas/turn.d.ts.map +1 -0
- package/dist/agent-session/schemas/turn.js +131 -0
- package/dist/agent-session/schemas/turn.js.map +1 -0
- package/dist/agent-session/schemas/turn.mjs +102 -0
- package/dist/agent-session/schemas/turn.mjs.map +1 -0
- package/dist/agent-session/store/ISessionStore.d.ts +310 -0
- package/dist/agent-session/store/ISessionStore.d.ts.map +1 -0
- package/dist/agent-session/store/ISessionStore.js +19 -0
- package/dist/agent-session/store/ISessionStore.js.map +1 -0
- package/dist/agent-session/store/ISessionStore.mjs +1 -0
- package/dist/agent-session/store/ISessionStore.mjs.map +1 -0
- package/dist/agent-session/store/InMemorySessionStore.d.ts +55 -0
- package/dist/agent-session/store/InMemorySessionStore.d.ts.map +1 -0
- package/dist/agent-session/store/InMemorySessionStore.js +475 -0
- package/dist/agent-session/store/InMemorySessionStore.js.map +1 -0
- package/dist/agent-session/store/InMemorySessionStore.mjs +461 -0
- package/dist/agent-session/store/InMemorySessionStore.mjs.map +1 -0
- package/dist/agent-session/store/OffsetPageToken.d.ts +13 -0
- package/dist/agent-session/store/OffsetPageToken.d.ts.map +1 -0
- package/dist/agent-session/store/OffsetPageToken.js +60 -0
- package/dist/agent-session/store/OffsetPageToken.js.map +1 -0
- package/dist/agent-session/store/OffsetPageToken.mjs +32 -0
- package/dist/agent-session/store/OffsetPageToken.mjs.map +1 -0
- package/dist/agent-session/store/PageToken.d.ts +4 -0
- package/dist/agent-session/store/PageToken.d.ts.map +1 -0
- package/dist/agent-session/store/PageToken.js +45 -0
- package/dist/agent-session/store/PageToken.js.map +1 -0
- package/dist/agent-session/store/PageToken.mjs +19 -0
- package/dist/agent-session/store/PageToken.mjs.map +1 -0
- package/dist/agent-session/store/SessionEventPageToken.d.ts +14 -0
- package/dist/agent-session/store/SessionEventPageToken.d.ts.map +1 -0
- package/dist/agent-session/store/SessionEventPageToken.js +70 -0
- package/dist/agent-session/store/SessionEventPageToken.js.map +1 -0
- package/dist/agent-session/store/SessionEventPageToken.mjs +42 -0
- package/dist/agent-session/store/SessionEventPageToken.mjs.map +1 -0
- package/dist/agent-session/store/SessionListPageToken.d.ts +24 -0
- package/dist/agent-session/store/SessionListPageToken.d.ts.map +1 -0
- package/dist/agent-session/store/SessionListPageToken.js +66 -0
- package/dist/agent-session/store/SessionListPageToken.js.map +1 -0
- package/dist/agent-session/store/SessionListPageToken.mjs +38 -0
- package/dist/agent-session/store/SessionListPageToken.mjs.map +1 -0
- package/dist/agent-session/store/SessionStoreErrors.d.ts +43 -0
- package/dist/agent-session/store/SessionStoreErrors.d.ts.map +1 -0
- package/dist/agent-session/store/SessionStoreErrors.js +126 -0
- package/dist/agent-session/store/SessionStoreErrors.js.map +1 -0
- package/dist/agent-session/store/SessionStoreErrors.mjs +92 -0
- package/dist/agent-session/store/SessionStoreErrors.mjs.map +1 -0
- package/dist/agent-session/store/assertCreateTurnThreadDelta.d.ts +18 -0
- package/dist/agent-session/store/assertCreateTurnThreadDelta.d.ts.map +1 -0
- package/dist/agent-session/store/assertCreateTurnThreadDelta.js +67 -0
- package/dist/agent-session/store/assertCreateTurnThreadDelta.js.map +1 -0
- package/dist/agent-session/store/assertCreateTurnThreadDelta.mjs +42 -0
- package/dist/agent-session/store/assertCreateTurnThreadDelta.mjs.map +1 -0
- package/dist/core/InstructionBuilder.d.ts +71 -0
- package/dist/core/InstructionBuilder.d.ts.map +1 -0
- package/dist/core/InstructionBuilder.js +95 -0
- package/dist/core/InstructionBuilder.js.map +1 -0
- package/dist/core/InstructionBuilder.mjs +69 -0
- package/dist/core/InstructionBuilder.mjs.map +1 -0
- package/dist/core/capabilities/AgentCapability.d.ts +32 -0
- package/dist/core/capabilities/AgentCapability.d.ts.map +1 -0
- package/dist/core/capabilities/AgentCapability.js +19 -0
- package/dist/core/capabilities/AgentCapability.js.map +1 -0
- package/dist/core/capabilities/AgentCapability.mjs +1 -0
- package/dist/core/capabilities/AgentCapability.mjs.map +1 -0
- package/dist/core/capabilities/AgentContextProcessor.d.ts +30 -0
- package/dist/core/capabilities/AgentContextProcessor.d.ts.map +1 -0
- package/dist/core/capabilities/AgentContextProcessor.js +19 -0
- package/dist/core/capabilities/AgentContextProcessor.js.map +1 -0
- package/dist/core/capabilities/AgentContextProcessor.mjs +1 -0
- package/dist/core/capabilities/AgentContextProcessor.mjs.map +1 -0
- package/dist/core/capabilities/ToolResponseProcessor.d.ts +12 -0
- package/dist/core/capabilities/ToolResponseProcessor.d.ts.map +1 -0
- package/dist/core/capabilities/ToolResponseProcessor.js +19 -0
- package/dist/core/capabilities/ToolResponseProcessor.js.map +1 -0
- package/dist/core/capabilities/ToolResponseProcessor.mjs +1 -0
- package/dist/core/capabilities/ToolResponseProcessor.mjs.map +1 -0
- package/dist/core/capabilities/builtins/AskUserQuestion.d.ts +11 -0
- package/dist/core/capabilities/builtins/AskUserQuestion.d.ts.map +1 -0
- package/dist/core/capabilities/builtins/AskUserQuestion.js +90 -0
- package/dist/core/capabilities/builtins/AskUserQuestion.js.map +1 -0
- package/dist/core/capabilities/builtins/AskUserQuestion.mjs +64 -0
- package/dist/core/capabilities/builtins/AskUserQuestion.mjs.map +1 -0
- package/dist/core/capabilities/builtins/ContextCompaction.d.ts +23 -0
- package/dist/core/capabilities/builtins/ContextCompaction.d.ts.map +1 -0
- package/dist/core/capabilities/builtins/ContextCompaction.js +235 -0
- package/dist/core/capabilities/builtins/ContextCompaction.js.map +1 -0
- package/dist/core/capabilities/builtins/ContextCompaction.mjs +208 -0
- package/dist/core/capabilities/builtins/ContextCompaction.mjs.map +1 -0
- package/dist/core/capabilities/builtins/CurrentDateTime.d.ts +17 -0
- package/dist/core/capabilities/builtins/CurrentDateTime.d.ts.map +1 -0
- package/dist/core/capabilities/builtins/CurrentDateTime.js +75 -0
- package/dist/core/capabilities/builtins/CurrentDateTime.js.map +1 -0
- package/dist/core/capabilities/builtins/CurrentDateTime.mjs +47 -0
- package/dist/core/capabilities/builtins/CurrentDateTime.mjs.map +1 -0
- package/dist/core/capabilities/builtins/DynamicSubAgents.d.ts +39 -0
- package/dist/core/capabilities/builtins/DynamicSubAgents.d.ts.map +1 -0
- package/dist/core/capabilities/builtins/DynamicSubAgents.js +176 -0
- package/dist/core/capabilities/builtins/DynamicSubAgents.js.map +1 -0
- package/dist/core/capabilities/builtins/DynamicSubAgents.mjs +134 -0
- package/dist/core/capabilities/builtins/DynamicSubAgents.mjs.map +1 -0
- package/dist/core/capabilities/builtins/LargeToolResponse.d.ts +40 -0
- package/dist/core/capabilities/builtins/LargeToolResponse.d.ts.map +1 -0
- package/dist/core/capabilities/builtins/LargeToolResponse.js +225 -0
- package/dist/core/capabilities/builtins/LargeToolResponse.js.map +1 -0
- package/dist/core/capabilities/builtins/LargeToolResponse.mjs +186 -0
- package/dist/core/capabilities/builtins/LargeToolResponse.mjs.map +1 -0
- package/dist/core/capabilities/builtins/OpenUI.d.ts +31 -0
- package/dist/core/capabilities/builtins/OpenUI.d.ts.map +1 -0
- package/dist/core/capabilities/builtins/OpenUI.js +376 -0
- package/dist/core/capabilities/builtins/OpenUI.js.map +1 -0
- package/dist/core/capabilities/builtins/OpenUI.mjs +326 -0
- package/dist/core/capabilities/builtins/OpenUI.mjs.map +1 -0
- package/dist/core/errors.d.ts +33 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +88 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/errors.mjs +57 -0
- package/dist/core/errors.mjs.map +1 -0
- package/dist/core/events/PassthroughEvents.d.ts +30 -0
- package/dist/core/events/PassthroughEvents.d.ts.map +1 -0
- package/dist/core/events/PassthroughEvents.js +19 -0
- package/dist/core/events/PassthroughEvents.js.map +1 -0
- package/dist/core/events/PassthroughEvents.mjs +1 -0
- package/dist/core/events/PassthroughEvents.mjs.map +1 -0
- package/dist/core/events/schema.d.ts +1103 -0
- package/dist/core/events/schema.d.ts.map +1 -0
- package/dist/core/events/schema.js +337 -0
- package/dist/core/events/schema.js.map +1 -0
- package/dist/core/events/schema.mjs +283 -0
- package/dist/core/events/schema.mjs.map +1 -0
- package/dist/core/index.d.ts +60 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +209 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/index.mjs +144 -0
- package/dist/core/index.mjs.map +1 -0
- package/dist/core/llm/ILLM.d.ts +15 -0
- package/dist/core/llm/ILLM.d.ts.map +1 -0
- package/dist/core/llm/ILLM.js +19 -0
- package/dist/core/llm/ILLM.js.map +1 -0
- package/dist/core/llm/ILLM.mjs +1 -0
- package/dist/core/llm/ILLM.mjs.map +1 -0
- package/dist/core/llm/LLMTypes.d.ts +369 -0
- package/dist/core/llm/LLMTypes.d.ts.map +1 -0
- package/dist/core/llm/LLMTypes.js +170 -0
- package/dist/core/llm/LLMTypes.js.map +1 -0
- package/dist/core/llm/LLMTypes.mjs +133 -0
- package/dist/core/llm/LLMTypes.mjs.map +1 -0
- package/dist/core/llm/VercelAILLM.d.ts +228 -0
- package/dist/core/llm/VercelAILLM.d.ts.map +1 -0
- package/dist/core/llm/VercelAILLM.js +1042 -0
- package/dist/core/llm/VercelAILLM.js.map +1 -0
- package/dist/core/llm/VercelAILLM.mjs +999 -0
- package/dist/core/llm/VercelAILLM.mjs.map +1 -0
- package/dist/core/llm/openaiSchemas.d.ts +190 -0
- package/dist/core/llm/openaiSchemas.d.ts.map +1 -0
- package/dist/core/llm/openaiSchemas.js +144 -0
- package/dist/core/llm/openaiSchemas.js.map +1 -0
- package/dist/core/llm/openaiSchemas.mjs +107 -0
- package/dist/core/llm/openaiSchemas.mjs.map +1 -0
- package/dist/core/llm/responseFormat.d.ts +25 -0
- package/dist/core/llm/responseFormat.d.ts.map +1 -0
- package/dist/core/llm/responseFormat.js +58 -0
- package/dist/core/llm/responseFormat.js.map +1 -0
- package/dist/core/llm/responseFormat.mjs +32 -0
- package/dist/core/llm/responseFormat.mjs.map +1 -0
- package/dist/core/llm/toOpenAIChatMessage.d.ts +11 -0
- package/dist/core/llm/toOpenAIChatMessage.d.ts.map +1 -0
- package/dist/core/llm/toOpenAIChatMessage.js +95 -0
- package/dist/core/llm/toOpenAIChatMessage.js.map +1 -0
- package/dist/core/llm/toOpenAIChatMessage.mjs +70 -0
- package/dist/core/llm/toOpenAIChatMessage.mjs.map +1 -0
- package/dist/core/llm/usage.d.ts +4 -0
- package/dist/core/llm/usage.d.ts.map +1 -0
- package/dist/core/llm/usage.js +52 -0
- package/dist/core/llm/usage.js.map +1 -0
- package/dist/core/llm/usage.mjs +26 -0
- package/dist/core/llm/usage.mjs.map +1 -0
- package/dist/core/mcp/ClientSideTool.d.ts +10 -0
- package/dist/core/mcp/ClientSideTool.d.ts.map +1 -0
- package/dist/core/mcp/ClientSideTool.js +56 -0
- package/dist/core/mcp/ClientSideTool.js.map +1 -0
- package/dist/core/mcp/ClientSideTool.mjs +31 -0
- package/dist/core/mcp/ClientSideTool.mjs.map +1 -0
- package/dist/core/mcp/IMCPServer.d.ts +78 -0
- package/dist/core/mcp/IMCPServer.d.ts.map +1 -0
- package/dist/core/mcp/IMCPServer.js +63 -0
- package/dist/core/mcp/IMCPServer.js.map +1 -0
- package/dist/core/mcp/IMCPServer.mjs +33 -0
- package/dist/core/mcp/IMCPServer.mjs.map +1 -0
- package/dist/core/mcp/LocalToolMCP.d.ts +39 -0
- package/dist/core/mcp/LocalToolMCP.d.ts.map +1 -0
- package/dist/core/mcp/LocalToolMCP.js +121 -0
- package/dist/core/mcp/LocalToolMCP.js.map +1 -0
- package/dist/core/mcp/LocalToolMCP.mjs +98 -0
- package/dist/core/mcp/LocalToolMCP.mjs.map +1 -0
- package/dist/core/mcp/RemoteMCP.d.ts +67 -0
- package/dist/core/mcp/RemoteMCP.d.ts.map +1 -0
- package/dist/core/mcp/RemoteMCP.js +244 -0
- package/dist/core/mcp/RemoteMCP.js.map +1 -0
- package/dist/core/mcp/RemoteMCP.mjs +222 -0
- package/dist/core/mcp/RemoteMCP.mjs.map +1 -0
- package/dist/core/mcp/ToolSelectorPolicy.d.ts +52 -0
- package/dist/core/mcp/ToolSelectorPolicy.d.ts.map +1 -0
- package/dist/core/mcp/ToolSelectorPolicy.js +108 -0
- package/dist/core/mcp/ToolSelectorPolicy.js.map +1 -0
- package/dist/core/mcp/ToolSelectorPolicy.mjs +90 -0
- package/dist/core/mcp/ToolSelectorPolicy.mjs.map +1 -0
- package/dist/core/mcp/ToolSet.d.ts +31 -0
- package/dist/core/mcp/ToolSet.d.ts.map +1 -0
- package/dist/core/mcp/ToolSet.js +119 -0
- package/dist/core/mcp/ToolSet.js.map +1 -0
- package/dist/core/mcp/ToolSet.mjs +98 -0
- package/dist/core/mcp/ToolSet.mjs.map +1 -0
- package/dist/core/mcp/convertMCPServers.d.ts +22 -0
- package/dist/core/mcp/convertMCPServers.d.ts.map +1 -0
- package/dist/core/mcp/convertMCPServers.js +89 -0
- package/dist/core/mcp/convertMCPServers.js.map +1 -0
- package/dist/core/mcp/convertMCPServers.mjs +64 -0
- package/dist/core/mcp/convertMCPServers.mjs.map +1 -0
- package/dist/core/mcp/executeToolCalls.d.ts +31 -0
- package/dist/core/mcp/executeToolCalls.d.ts.map +1 -0
- package/dist/core/mcp/executeToolCalls.js +168 -0
- package/dist/core/mcp/executeToolCalls.js.map +1 -0
- package/dist/core/mcp/executeToolCalls.mjs +149 -0
- package/dist/core/mcp/executeToolCalls.mjs.map +1 -0
- package/dist/core/mcp/pagination.d.ts +11 -0
- package/dist/core/mcp/pagination.d.ts.map +1 -0
- package/dist/core/mcp/pagination.js +49 -0
- package/dist/core/mcp/pagination.js.map +1 -0
- package/dist/core/mcp/pagination.mjs +24 -0
- package/dist/core/mcp/pagination.mjs.map +1 -0
- package/dist/core/mcp/remoteMcpClient.d.ts +36 -0
- package/dist/core/mcp/remoteMcpClient.d.ts.map +1 -0
- package/dist/core/mcp/remoteMcpClient.js +138 -0
- package/dist/core/mcp/remoteMcpClient.js.map +1 -0
- package/dist/core/mcp/remoteMcpClient.mjs +112 -0
- package/dist/core/mcp/remoteMcpClient.mjs.map +1 -0
- package/dist/core/mcp/toolNames.d.ts +6 -0
- package/dist/core/mcp/toolNames.d.ts.map +1 -0
- package/dist/core/mcp/toolNames.js +59 -0
- package/dist/core/mcp/toolNames.js.map +1 -0
- package/dist/core/mcp/toolNames.mjs +33 -0
- package/dist/core/mcp/toolNames.mjs.map +1 -0
- package/dist/core/mcp/toolSelectors.d.ts +28 -0
- package/dist/core/mcp/toolSelectors.d.ts.map +1 -0
- package/dist/core/mcp/toolSelectors.js +113 -0
- package/dist/core/mcp/toolSelectors.js.map +1 -0
- package/dist/core/mcp/toolSelectors.mjs +78 -0
- package/dist/core/mcp/toolSelectors.mjs.map +1 -0
- package/dist/core/runtime/AgentDefinition.d.ts +23 -0
- package/dist/core/runtime/AgentDefinition.d.ts.map +1 -0
- package/dist/core/runtime/AgentDefinition.js +19 -0
- package/dist/core/runtime/AgentDefinition.js.map +1 -0
- package/dist/core/runtime/AgentDefinition.mjs +1 -0
- package/dist/core/runtime/AgentDefinition.mjs.map +1 -0
- package/dist/core/runtime/AgentThread.d.ts +64 -0
- package/dist/core/runtime/AgentThread.d.ts.map +1 -0
- package/dist/core/runtime/AgentThread.js +1065 -0
- package/dist/core/runtime/AgentThread.js.map +1 -0
- package/dist/core/runtime/AgentThread.mjs +1062 -0
- package/dist/core/runtime/AgentThread.mjs.map +1 -0
- package/dist/core/runtime/AgentThread.types.d.ts +123 -0
- package/dist/core/runtime/AgentThread.types.d.ts.map +1 -0
- package/dist/core/runtime/AgentThread.types.js +46 -0
- package/dist/core/runtime/AgentThread.types.js.map +1 -0
- package/dist/core/runtime/AgentThread.types.mjs +20 -0
- package/dist/core/runtime/AgentThread.types.mjs.map +1 -0
- package/dist/core/runtime/AgentThreadOrchestrator.d.ts +35 -0
- package/dist/core/runtime/AgentThreadOrchestrator.d.ts.map +1 -0
- package/dist/core/runtime/AgentThreadOrchestrator.js +433 -0
- package/dist/core/runtime/AgentThreadOrchestrator.js.map +1 -0
- package/dist/core/runtime/AgentThreadOrchestrator.mjs +418 -0
- package/dist/core/runtime/AgentThreadOrchestrator.mjs.map +1 -0
- package/dist/core/runtime/CreateDynamicSubAgentThread.d.ts +11 -0
- package/dist/core/runtime/CreateDynamicSubAgentThread.d.ts.map +1 -0
- package/dist/core/runtime/CreateDynamicSubAgentThread.js +19 -0
- package/dist/core/runtime/CreateDynamicSubAgentThread.js.map +1 -0
- package/dist/core/runtime/CreateDynamicSubAgentThread.mjs +1 -0
- package/dist/core/runtime/CreateDynamicSubAgentThread.mjs.map +1 -0
- package/dist/core/runtime/DeferredTool.d.ts +34 -0
- package/dist/core/runtime/DeferredTool.d.ts.map +1 -0
- package/dist/core/runtime/DeferredTool.js +321 -0
- package/dist/core/runtime/DeferredTool.js.map +1 -0
- package/dist/core/runtime/DeferredTool.mjs +287 -0
- package/dist/core/runtime/DeferredTool.mjs.map +1 -0
- package/dist/core/runtime/OpenToolCallCloser.d.ts +21 -0
- package/dist/core/runtime/OpenToolCallCloser.d.ts.map +1 -0
- package/dist/core/runtime/OpenToolCallCloser.js +92 -0
- package/dist/core/runtime/OpenToolCallCloser.js.map +1 -0
- package/dist/core/runtime/OpenToolCallCloser.mjs +66 -0
- package/dist/core/runtime/OpenToolCallCloser.mjs.map +1 -0
- package/dist/core/runtime/UserInputMessage.d.ts +16 -0
- package/dist/core/runtime/UserInputMessage.d.ts.map +1 -0
- package/dist/core/runtime/UserInputMessage.js +183 -0
- package/dist/core/runtime/UserInputMessage.js.map +1 -0
- package/dist/core/runtime/UserInputMessage.mjs +157 -0
- package/dist/core/runtime/UserInputMessage.mjs.map +1 -0
- package/dist/core/runtime/contextUsage.d.ts +17 -0
- package/dist/core/runtime/contextUsage.d.ts.map +1 -0
- package/dist/core/runtime/contextUsage.js +56 -0
- package/dist/core/runtime/contextUsage.js.map +1 -0
- package/dist/core/runtime/contextUsage.mjs +28 -0
- package/dist/core/runtime/contextUsage.mjs.map +1 -0
- package/dist/core/runtime/contextUtils.d.ts +30 -0
- package/dist/core/runtime/contextUtils.d.ts.map +1 -0
- package/dist/core/runtime/contextUtils.js +198 -0
- package/dist/core/runtime/contextUtils.js.map +1 -0
- package/dist/core/runtime/contextUtils.mjs +148 -0
- package/dist/core/runtime/contextUtils.mjs.map +1 -0
- package/dist/core/runtime/metrics.d.ts +22 -0
- package/dist/core/runtime/metrics.d.ts.map +1 -0
- package/dist/core/runtime/metrics.js +89 -0
- package/dist/core/runtime/metrics.js.map +1 -0
- package/dist/core/runtime/metrics.mjs +61 -0
- package/dist/core/runtime/metrics.mjs.map +1 -0
- package/dist/core/sandbox/Sandbox.d.ts +121 -0
- package/dist/core/sandbox/Sandbox.d.ts.map +1 -0
- package/dist/core/sandbox/Sandbox.js +572 -0
- package/dist/core/sandbox/Sandbox.js.map +1 -0
- package/dist/core/sandbox/Sandbox.mjs +536 -0
- package/dist/core/sandbox/Sandbox.mjs.map +1 -0
- package/dist/core/sandbox/SandboxErrors.d.ts +30 -0
- package/dist/core/sandbox/SandboxErrors.d.ts.map +1 -0
- package/dist/core/sandbox/SandboxErrors.js +102 -0
- package/dist/core/sandbox/SandboxErrors.js.map +1 -0
- package/dist/core/sandbox/SandboxErrors.mjs +71 -0
- package/dist/core/sandbox/SandboxErrors.mjs.map +1 -0
- package/dist/core/sandbox/SandboxNatsBridge.d.ts +33 -0
- package/dist/core/sandbox/SandboxNatsBridge.d.ts.map +1 -0
- package/dist/core/sandbox/SandboxNatsBridge.js +222 -0
- package/dist/core/sandbox/SandboxNatsBridge.js.map +1 -0
- package/dist/core/sandbox/SandboxNatsBridge.mjs +201 -0
- package/dist/core/sandbox/SandboxNatsBridge.mjs.map +1 -0
- package/dist/core/sandbox/constants.d.ts +10 -0
- package/dist/core/sandbox/constants.d.ts.map +1 -0
- package/dist/core/sandbox/constants.js +37 -0
- package/dist/core/sandbox/constants.js.map +1 -0
- package/dist/core/sandbox/constants.mjs +10 -0
- package/dist/core/sandbox/constants.mjs.map +1 -0
- package/dist/core/sandbox/provider/DaytonaProvider.d.ts +80 -0
- package/dist/core/sandbox/provider/DaytonaProvider.d.ts.map +1 -0
- package/dist/core/sandbox/provider/DaytonaProvider.js +346 -0
- package/dist/core/sandbox/provider/DaytonaProvider.js.map +1 -0
- package/dist/core/sandbox/provider/DaytonaProvider.mjs +326 -0
- package/dist/core/sandbox/provider/DaytonaProvider.mjs.map +1 -0
- package/dist/core/sandbox/provider/Provider.d.ts +83 -0
- package/dist/core/sandbox/provider/Provider.d.ts.map +1 -0
- package/dist/core/sandbox/provider/Provider.js +43 -0
- package/dist/core/sandbox/provider/Provider.js.map +1 -0
- package/dist/core/sandbox/provider/Provider.mjs +17 -0
- package/dist/core/sandbox/provider/Provider.mjs.map +1 -0
- package/dist/core/sandbox/provider/TFYSandboxProvider.d.ts +41 -0
- package/dist/core/sandbox/provider/TFYSandboxProvider.d.ts.map +1 -0
- package/dist/core/sandbox/provider/TFYSandboxProvider.js +180 -0
- package/dist/core/sandbox/provider/TFYSandboxProvider.js.map +1 -0
- package/dist/core/sandbox/provider/TFYSandboxProvider.mjs +147 -0
- package/dist/core/sandbox/provider/TFYSandboxProvider.mjs.map +1 -0
- package/dist/core/sandbox/sandboxImage.d.ts +6 -0
- package/dist/core/sandbox/sandboxImage.d.ts.map +1 -0
- package/dist/core/sandbox/sandboxImage.js +31 -0
- package/dist/core/sandbox/sandboxImage.js.map +1 -0
- package/dist/core/sandbox/sandboxImage.mjs +6 -0
- package/dist/core/sandbox/sandboxImage.mjs.map +1 -0
- package/dist/core/sandbox/sandboxScripts.gen.d.ts +5 -0
- package/dist/core/sandbox/sandboxScripts.gen.d.ts.map +1 -0
- package/dist/core/sandbox/sandboxScripts.gen.js +343 -0
- package/dist/core/sandbox/sandboxScripts.gen.js.map +1 -0
- package/dist/core/sandbox/sandboxScripts.gen.mjs +318 -0
- package/dist/core/sandbox/sandboxScripts.gen.mjs.map +1 -0
- package/dist/core/sandbox/skills/ISkillMounter.d.ts +7 -0
- package/dist/core/sandbox/skills/ISkillMounter.d.ts.map +1 -0
- package/dist/core/sandbox/skills/ISkillMounter.js +19 -0
- package/dist/core/sandbox/skills/ISkillMounter.js.map +1 -0
- package/dist/core/sandbox/skills/ISkillMounter.mjs +1 -0
- package/dist/core/sandbox/skills/ISkillMounter.mjs.map +1 -0
- package/dist/core/sandbox/skills/SkillMounter.d.ts +17 -0
- package/dist/core/sandbox/skills/SkillMounter.d.ts.map +1 -0
- package/dist/core/sandbox/skills/SkillMounter.js +73 -0
- package/dist/core/sandbox/skills/SkillMounter.js.map +1 -0
- package/dist/core/sandbox/skills/SkillMounter.mjs +48 -0
- package/dist/core/sandbox/skills/SkillMounter.mjs.map +1 -0
- package/dist/core/sandbox/skills/constants.d.ts +10 -0
- package/dist/core/sandbox/skills/constants.d.ts.map +1 -0
- package/dist/core/sandbox/skills/constants.js +56 -0
- package/dist/core/sandbox/skills/constants.js.map +1 -0
- package/dist/core/sandbox/skills/constants.mjs +28 -0
- package/dist/core/sandbox/skills/constants.mjs.map +1 -0
- package/dist/core/sandbox/skills/index.d.ts +5 -0
- package/dist/core/sandbox/skills/index.d.ts.map +1 -0
- package/dist/core/sandbox/skills/index.js +40 -0
- package/dist/core/sandbox/skills/index.js.map +1 -0
- package/dist/core/sandbox/skills/index.mjs +11 -0
- package/dist/core/sandbox/skills/index.mjs.map +1 -0
- package/dist/core/tracing/AgentTracing.d.ts +38 -0
- package/dist/core/tracing/AgentTracing.d.ts.map +1 -0
- package/dist/core/tracing/AgentTracing.js +19 -0
- package/dist/core/tracing/AgentTracing.js.map +1 -0
- package/dist/core/tracing/AgentTracing.mjs +1 -0
- package/dist/core/tracing/AgentTracing.mjs.map +1 -0
- package/dist/core/tracing/NoopAgentTracing.d.ts +3 -0
- package/dist/core/tracing/NoopAgentTracing.d.ts.map +1 -0
- package/dist/core/tracing/NoopAgentTracing.js +79 -0
- package/dist/core/tracing/NoopAgentTracing.js.map +1 -0
- package/dist/core/tracing/NoopAgentTracing.mjs +54 -0
- package/dist/core/tracing/NoopAgentTracing.mjs.map +1 -0
- package/dist/core/util/abort.d.ts +2 -0
- package/dist/core/util/abort.d.ts.map +1 -0
- package/dist/core/util/abort.js +38 -0
- package/dist/core/util/abort.js.map +1 -0
- package/dist/core/util/abort.mjs +13 -0
- package/dist/core/util/abort.mjs.map +1 -0
- package/dist/core/util/errorLogFields.d.ts +6 -0
- package/dist/core/util/errorLogFields.d.ts.map +1 -0
- package/dist/core/util/errorLogFields.js +36 -0
- package/dist/core/util/errorLogFields.js.map +1 -0
- package/dist/core/util/errorLogFields.mjs +11 -0
- package/dist/core/util/errorLogFields.mjs.map +1 -0
- package/dist/core/util/promiseUtils.d.ts +7 -0
- package/dist/core/util/promiseUtils.d.ts.map +1 -0
- package/dist/core/util/promiseUtils.js +82 -0
- package/dist/core/util/promiseUtils.js.map +1 -0
- package/dist/core/util/promiseUtils.mjs +55 -0
- package/dist/core/util/promiseUtils.mjs.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +8 -0
- package/dist/index.mjs.map +1 -0
- package/dist/package.json +3 -0
- package/dist/request-reply/client.d.ts +21 -0
- package/dist/request-reply/client.d.ts.map +1 -0
- package/dist/request-reply/client.js +92 -0
- package/dist/request-reply/client.js.map +1 -0
- package/dist/request-reply/client.mjs +67 -0
- package/dist/request-reply/client.mjs.map +1 -0
- package/dist/request-reply/errors.d.ts +23 -0
- package/dist/request-reply/errors.d.ts.map +1 -0
- package/dist/request-reply/errors.js +66 -0
- package/dist/request-reply/errors.js.map +1 -0
- package/dist/request-reply/errors.mjs +39 -0
- package/dist/request-reply/errors.mjs.map +1 -0
- package/dist/request-reply/executor.d.ts +70 -0
- package/dist/request-reply/executor.d.ts.map +1 -0
- package/dist/request-reply/executor.js +267 -0
- package/dist/request-reply/executor.js.map +1 -0
- package/dist/request-reply/executor.mjs +232 -0
- package/dist/request-reply/executor.mjs.map +1 -0
- package/dist/request-reply/index.d.ts +16 -0
- package/dist/request-reply/index.d.ts.map +1 -0
- package/dist/request-reply/index.js +47 -0
- package/dist/request-reply/index.js.map +1 -0
- package/dist/request-reply/index.mjs +16 -0
- package/dist/request-reply/index.mjs.map +1 -0
- package/dist/request-reply/router.d.ts +20 -0
- package/dist/request-reply/router.d.ts.map +1 -0
- package/dist/request-reply/router.js +55 -0
- package/dist/request-reply/router.js.map +1 -0
- package/dist/request-reply/router.mjs +30 -0
- package/dist/request-reply/router.mjs.map +1 -0
- package/dist/request-reply/types.d.ts +25 -0
- package/dist/request-reply/types.d.ts.map +1 -0
- package/dist/request-reply/types.js +54 -0
- package/dist/request-reply/types.js.map +1 -0
- package/dist/request-reply/types.mjs +28 -0
- package/dist/request-reply/types.mjs.map +1 -0
- package/dist/request-reply/utils.d.ts +9 -0
- package/dist/request-reply/utils.d.ts.map +1 -0
- package/dist/request-reply/utils.js +51 -0
- package/dist/request-reply/utils.js.map +1 -0
- package/dist/request-reply/utils.mjs +22 -0
- package/dist/request-reply/utils.mjs.map +1 -0
- package/package.json +127 -6
- package/README.md +0 -4
- package/index.js +0 -1
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/core/sandbox/SandboxErrors.ts
|
|
21
|
+
var SandboxErrors_exports = {};
|
|
22
|
+
__export(SandboxErrors_exports, {
|
|
23
|
+
SandboxError: () => SandboxError,
|
|
24
|
+
SandboxFileNotFoundError: () => SandboxFileNotFoundError,
|
|
25
|
+
SandboxFileTooLargeError: () => SandboxFileTooLargeError,
|
|
26
|
+
SandboxNotAvailableError: () => SandboxNotAvailableError,
|
|
27
|
+
SandboxPathIsDirectoryError: () => SandboxPathIsDirectoryError,
|
|
28
|
+
validateNoPathTraversal: () => validateNoPathTraversal,
|
|
29
|
+
validateSandboxOwnedByTenant: () => validateSandboxOwnedByTenant
|
|
30
|
+
});
|
|
31
|
+
module.exports = __toCommonJS(SandboxErrors_exports);
|
|
32
|
+
var SandboxError = class extends Error {
|
|
33
|
+
};
|
|
34
|
+
var SandboxFileNotFoundError = class extends SandboxError {
|
|
35
|
+
statusCode = 404;
|
|
36
|
+
constructor(path) {
|
|
37
|
+
super(`File not found: ${path}`);
|
|
38
|
+
this.name = "SandboxFileNotFoundError";
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
var SandboxNotAvailableError = class extends SandboxError {
|
|
42
|
+
statusCode = 410;
|
|
43
|
+
constructor(sandboxId) {
|
|
44
|
+
super(`Sandbox '${sandboxId}' no longer exists \u2014 it may have been auto-deleted`);
|
|
45
|
+
this.name = "SandboxNotAvailableError";
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
var SandboxPathIsDirectoryError = class extends SandboxError {
|
|
49
|
+
statusCode = 400;
|
|
50
|
+
constructor(path) {
|
|
51
|
+
super(`Path is a directory, not a file: ${path}`);
|
|
52
|
+
this.name = "SandboxPathIsDirectoryError";
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
var SandboxFileTooLargeError = class extends SandboxError {
|
|
56
|
+
statusCode = 413;
|
|
57
|
+
fileSize;
|
|
58
|
+
maxSize;
|
|
59
|
+
constructor(path, fileSize, maxSize) {
|
|
60
|
+
super(`File too large: ${path} (${String(fileSize)} bytes, max ${String(maxSize)})`);
|
|
61
|
+
this.name = "SandboxFileTooLargeError";
|
|
62
|
+
this.fileSize = fileSize;
|
|
63
|
+
this.maxSize = maxSize;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
var SandboxTenantMismatchError = class extends SandboxError {
|
|
67
|
+
statusCode = 403;
|
|
68
|
+
constructor(requestTenant) {
|
|
69
|
+
super(`Sandbox does not belong to tenant ${requestTenant}`);
|
|
70
|
+
this.name = "SandboxTenantMismatchError";
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
var SandboxPathTraversalError = class extends SandboxError {
|
|
74
|
+
statusCode = 400;
|
|
75
|
+
constructor(path) {
|
|
76
|
+
super(`Path must not contain ".." segments: ${path}`);
|
|
77
|
+
this.name = "SandboxPathTraversalError";
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
function validateSandboxOwnedByTenant(sandboxId, tenantName) {
|
|
81
|
+
const dotIndex = sandboxId.indexOf(".");
|
|
82
|
+
if (dotIndex === -1 || sandboxId.substring(0, dotIndex) !== tenantName) {
|
|
83
|
+
throw new SandboxTenantMismatchError(tenantName);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
var PATH_TRAVERSAL_RE = /(?:^|[\\/])\.\.(?:[\\/]|$)/;
|
|
87
|
+
function validateNoPathTraversal(path) {
|
|
88
|
+
if (PATH_TRAVERSAL_RE.test(path)) {
|
|
89
|
+
throw new SandboxPathTraversalError(path);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
93
|
+
0 && (module.exports = {
|
|
94
|
+
SandboxError,
|
|
95
|
+
SandboxFileNotFoundError,
|
|
96
|
+
SandboxFileTooLargeError,
|
|
97
|
+
SandboxNotAvailableError,
|
|
98
|
+
SandboxPathIsDirectoryError,
|
|
99
|
+
validateNoPathTraversal,
|
|
100
|
+
validateSandboxOwnedByTenant
|
|
101
|
+
});
|
|
102
|
+
//# sourceMappingURL=SandboxErrors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/core/sandbox/SandboxErrors.ts"],"sourcesContent":["export abstract class SandboxError extends Error {\n /**\n * Every sandbox failure is caused by the request itself — a bad path, another tenant's sandbox,\n * a missing or oversized file — so each subclass carries the status a host should reply with.\n * Listing the codes in use rather than `number` lets a typed route return this directly; adding\n * a subclass with a new code means widening this union and declaring it on the route.\n */\n abstract readonly statusCode: 400 | 403 | 404 | 410 | 413;\n}\n\nexport class SandboxFileNotFoundError extends SandboxError {\n readonly statusCode = 404;\n\n constructor(path: string) {\n super(`File not found: ${path}`);\n this.name = 'SandboxFileNotFoundError';\n }\n}\n\nexport class SandboxNotAvailableError extends SandboxError {\n readonly statusCode = 410;\n\n constructor(sandboxId: string) {\n super(`Sandbox '${sandboxId}' no longer exists — it may have been auto-deleted`);\n this.name = 'SandboxNotAvailableError';\n }\n}\n\nexport class SandboxPathIsDirectoryError extends SandboxError {\n readonly statusCode = 400;\n\n constructor(path: string) {\n super(`Path is a directory, not a file: ${path}`);\n this.name = 'SandboxPathIsDirectoryError';\n }\n}\n\nexport class SandboxFileTooLargeError extends SandboxError {\n readonly statusCode = 413;\n readonly fileSize: number;\n readonly maxSize: number;\n\n constructor(path: string, fileSize: number, maxSize: number) {\n super(`File too large: ${path} (${String(fileSize)} bytes, max ${String(maxSize)})`);\n this.name = 'SandboxFileTooLargeError';\n this.fileSize = fileSize;\n this.maxSize = maxSize;\n }\n}\n\nclass SandboxTenantMismatchError extends SandboxError {\n readonly statusCode = 403;\n\n constructor(requestTenant: string) {\n super(`Sandbox does not belong to tenant ${requestTenant}`);\n this.name = 'SandboxTenantMismatchError';\n }\n}\n\nclass SandboxPathTraversalError extends SandboxError {\n readonly statusCode = 400;\n\n constructor(path: string) {\n super(`Path must not contain \"..\" segments: ${path}`);\n this.name = 'SandboxPathTraversalError';\n }\n}\n\nexport function validateSandboxOwnedByTenant(sandboxId: string, tenantName: string): void {\n const dotIndex = sandboxId.indexOf('.');\n if (dotIndex === -1 || sandboxId.substring(0, dotIndex) !== tenantName) {\n throw new SandboxTenantMismatchError(tenantName);\n }\n}\n\nconst PATH_TRAVERSAL_RE = /(?:^|[\\\\/])\\.\\.(?:[\\\\/]|$)/;\n\nexport function validateNoPathTraversal(path: string): void {\n if (PATH_TRAVERSAL_RE.test(path)) {\n throw new SandboxPathTraversalError(path);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,IAAe,eAAf,cAAoC,MAAM;AAQjD;AAEO,IAAM,2BAAN,cAAuC,aAAa;AAAA,EAChD,aAAa;AAAA,EAEtB,YAAY,MAAc;AACxB,UAAM,mBAAmB,IAAI,EAAE;AAC/B,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,2BAAN,cAAuC,aAAa;AAAA,EAChD,aAAa;AAAA,EAEtB,YAAY,WAAmB;AAC7B,UAAM,YAAY,SAAS,yDAAoD;AAC/E,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,8BAAN,cAA0C,aAAa;AAAA,EACnD,aAAa;AAAA,EAEtB,YAAY,MAAc;AACxB,UAAM,oCAAoC,IAAI,EAAE;AAChD,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,2BAAN,cAAuC,aAAa;AAAA,EAChD,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EAET,YAAY,MAAc,UAAkB,SAAiB;AAC3D,UAAM,mBAAmB,IAAI,KAAK,OAAO,QAAQ,CAAC,eAAe,OAAO,OAAO,CAAC,GAAG;AACnF,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,SAAK,UAAU;AAAA,EACjB;AACF;AAEA,IAAM,6BAAN,cAAyC,aAAa;AAAA,EAC3C,aAAa;AAAA,EAEtB,YAAY,eAAuB;AACjC,UAAM,qCAAqC,aAAa,EAAE;AAC1D,SAAK,OAAO;AAAA,EACd;AACF;AAEA,IAAM,4BAAN,cAAwC,aAAa;AAAA,EAC1C,aAAa;AAAA,EAEtB,YAAY,MAAc;AACxB,UAAM,wCAAwC,IAAI,EAAE;AACpD,SAAK,OAAO;AAAA,EACd;AACF;AAEO,SAAS,6BAA6B,WAAmB,YAA0B;AACxF,QAAM,WAAW,UAAU,QAAQ,GAAG;AACtC,MAAI,aAAa,MAAM,UAAU,UAAU,GAAG,QAAQ,MAAM,YAAY;AACtE,UAAM,IAAI,2BAA2B,UAAU;AAAA,EACjD;AACF;AAEA,IAAM,oBAAoB;AAEnB,SAAS,wBAAwB,MAAoB;AAC1D,MAAI,kBAAkB,KAAK,IAAI,GAAG;AAChC,UAAM,IAAI,0BAA0B,IAAI;AAAA,EAC1C;AACF;","names":[]}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// src/core/sandbox/SandboxErrors.ts
|
|
2
|
+
var SandboxError = class extends Error {
|
|
3
|
+
};
|
|
4
|
+
var SandboxFileNotFoundError = class extends SandboxError {
|
|
5
|
+
statusCode = 404;
|
|
6
|
+
constructor(path) {
|
|
7
|
+
super(`File not found: ${path}`);
|
|
8
|
+
this.name = "SandboxFileNotFoundError";
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
var SandboxNotAvailableError = class extends SandboxError {
|
|
12
|
+
statusCode = 410;
|
|
13
|
+
constructor(sandboxId) {
|
|
14
|
+
super(`Sandbox '${sandboxId}' no longer exists \u2014 it may have been auto-deleted`);
|
|
15
|
+
this.name = "SandboxNotAvailableError";
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
var SandboxPathIsDirectoryError = class extends SandboxError {
|
|
19
|
+
statusCode = 400;
|
|
20
|
+
constructor(path) {
|
|
21
|
+
super(`Path is a directory, not a file: ${path}`);
|
|
22
|
+
this.name = "SandboxPathIsDirectoryError";
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
var SandboxFileTooLargeError = class extends SandboxError {
|
|
26
|
+
statusCode = 413;
|
|
27
|
+
fileSize;
|
|
28
|
+
maxSize;
|
|
29
|
+
constructor(path, fileSize, maxSize) {
|
|
30
|
+
super(`File too large: ${path} (${String(fileSize)} bytes, max ${String(maxSize)})`);
|
|
31
|
+
this.name = "SandboxFileTooLargeError";
|
|
32
|
+
this.fileSize = fileSize;
|
|
33
|
+
this.maxSize = maxSize;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
var SandboxTenantMismatchError = class extends SandboxError {
|
|
37
|
+
statusCode = 403;
|
|
38
|
+
constructor(requestTenant) {
|
|
39
|
+
super(`Sandbox does not belong to tenant ${requestTenant}`);
|
|
40
|
+
this.name = "SandboxTenantMismatchError";
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
var SandboxPathTraversalError = class extends SandboxError {
|
|
44
|
+
statusCode = 400;
|
|
45
|
+
constructor(path) {
|
|
46
|
+
super(`Path must not contain ".." segments: ${path}`);
|
|
47
|
+
this.name = "SandboxPathTraversalError";
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
function validateSandboxOwnedByTenant(sandboxId, tenantName) {
|
|
51
|
+
const dotIndex = sandboxId.indexOf(".");
|
|
52
|
+
if (dotIndex === -1 || sandboxId.substring(0, dotIndex) !== tenantName) {
|
|
53
|
+
throw new SandboxTenantMismatchError(tenantName);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
var PATH_TRAVERSAL_RE = /(?:^|[\\/])\.\.(?:[\\/]|$)/;
|
|
57
|
+
function validateNoPathTraversal(path) {
|
|
58
|
+
if (PATH_TRAVERSAL_RE.test(path)) {
|
|
59
|
+
throw new SandboxPathTraversalError(path);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export {
|
|
63
|
+
SandboxError,
|
|
64
|
+
SandboxFileNotFoundError,
|
|
65
|
+
SandboxFileTooLargeError,
|
|
66
|
+
SandboxNotAvailableError,
|
|
67
|
+
SandboxPathIsDirectoryError,
|
|
68
|
+
validateNoPathTraversal,
|
|
69
|
+
validateSandboxOwnedByTenant
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=SandboxErrors.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/core/sandbox/SandboxErrors.ts"],"sourcesContent":["export abstract class SandboxError extends Error {\n /**\n * Every sandbox failure is caused by the request itself — a bad path, another tenant's sandbox,\n * a missing or oversized file — so each subclass carries the status a host should reply with.\n * Listing the codes in use rather than `number` lets a typed route return this directly; adding\n * a subclass with a new code means widening this union and declaring it on the route.\n */\n abstract readonly statusCode: 400 | 403 | 404 | 410 | 413;\n}\n\nexport class SandboxFileNotFoundError extends SandboxError {\n readonly statusCode = 404;\n\n constructor(path: string) {\n super(`File not found: ${path}`);\n this.name = 'SandboxFileNotFoundError';\n }\n}\n\nexport class SandboxNotAvailableError extends SandboxError {\n readonly statusCode = 410;\n\n constructor(sandboxId: string) {\n super(`Sandbox '${sandboxId}' no longer exists — it may have been auto-deleted`);\n this.name = 'SandboxNotAvailableError';\n }\n}\n\nexport class SandboxPathIsDirectoryError extends SandboxError {\n readonly statusCode = 400;\n\n constructor(path: string) {\n super(`Path is a directory, not a file: ${path}`);\n this.name = 'SandboxPathIsDirectoryError';\n }\n}\n\nexport class SandboxFileTooLargeError extends SandboxError {\n readonly statusCode = 413;\n readonly fileSize: number;\n readonly maxSize: number;\n\n constructor(path: string, fileSize: number, maxSize: number) {\n super(`File too large: ${path} (${String(fileSize)} bytes, max ${String(maxSize)})`);\n this.name = 'SandboxFileTooLargeError';\n this.fileSize = fileSize;\n this.maxSize = maxSize;\n }\n}\n\nclass SandboxTenantMismatchError extends SandboxError {\n readonly statusCode = 403;\n\n constructor(requestTenant: string) {\n super(`Sandbox does not belong to tenant ${requestTenant}`);\n this.name = 'SandboxTenantMismatchError';\n }\n}\n\nclass SandboxPathTraversalError extends SandboxError {\n readonly statusCode = 400;\n\n constructor(path: string) {\n super(`Path must not contain \"..\" segments: ${path}`);\n this.name = 'SandboxPathTraversalError';\n }\n}\n\nexport function validateSandboxOwnedByTenant(sandboxId: string, tenantName: string): void {\n const dotIndex = sandboxId.indexOf('.');\n if (dotIndex === -1 || sandboxId.substring(0, dotIndex) !== tenantName) {\n throw new SandboxTenantMismatchError(tenantName);\n }\n}\n\nconst PATH_TRAVERSAL_RE = /(?:^|[\\\\/])\\.\\.(?:[\\\\/]|$)/;\n\nexport function validateNoPathTraversal(path: string): void {\n if (PATH_TRAVERSAL_RE.test(path)) {\n throw new SandboxPathTraversalError(path);\n }\n}\n"],"mappings":";AAAO,IAAe,eAAf,cAAoC,MAAM;AAQjD;AAEO,IAAM,2BAAN,cAAuC,aAAa;AAAA,EAChD,aAAa;AAAA,EAEtB,YAAY,MAAc;AACxB,UAAM,mBAAmB,IAAI,EAAE;AAC/B,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,2BAAN,cAAuC,aAAa;AAAA,EAChD,aAAa;AAAA,EAEtB,YAAY,WAAmB;AAC7B,UAAM,YAAY,SAAS,yDAAoD;AAC/E,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,8BAAN,cAA0C,aAAa;AAAA,EACnD,aAAa;AAAA,EAEtB,YAAY,MAAc;AACxB,UAAM,oCAAoC,IAAI,EAAE;AAChD,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,2BAAN,cAAuC,aAAa;AAAA,EAChD,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EAET,YAAY,MAAc,UAAkB,SAAiB;AAC3D,UAAM,mBAAmB,IAAI,KAAK,OAAO,QAAQ,CAAC,eAAe,OAAO,OAAO,CAAC,GAAG;AACnF,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,SAAK,UAAU;AAAA,EACjB;AACF;AAEA,IAAM,6BAAN,cAAyC,aAAa;AAAA,EAC3C,aAAa;AAAA,EAEtB,YAAY,eAAuB;AACjC,UAAM,qCAAqC,aAAa,EAAE;AAC1D,SAAK,OAAO;AAAA,EACd;AACF;AAEA,IAAM,4BAAN,cAAwC,aAAa;AAAA,EAC1C,aAAa;AAAA,EAEtB,YAAY,MAAc;AACxB,UAAM,wCAAwC,IAAI,EAAE;AACpD,SAAK,OAAO;AAAA,EACd;AACF;AAEO,SAAS,6BAA6B,WAAmB,YAA0B;AACxF,QAAM,WAAW,UAAU,QAAQ,GAAG;AACtC,MAAI,aAAa,MAAM,UAAU,UAAU,GAAG,QAAQ,MAAM,YAAY;AACtE,UAAM,IAAI,2BAA2B,UAAU;AAAA,EACjD;AACF;AAEA,IAAM,oBAAoB;AAEnB,SAAS,wBAAwB,MAAoB;AAC1D,MAAI,kBAAkB,KAAK,IAAI,GAAG;AAChC,UAAM,IAAI,0BAA0B,IAAI;AAAA,EAC1C;AACF;","names":[]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Logger } from 'winston';
|
|
2
|
+
import { type IToolSet } from '../mcp/IMCPServer';
|
|
3
|
+
/**
|
|
4
|
+
* Per-sandbox NATS subscriber. Bridges sandbox-originated MCP tool calls (sent over wss to the
|
|
5
|
+
* sandbox's local nats-server) into the gateway pod's `IToolSet` registry for this agent.
|
|
6
|
+
* The pod that holds the preview URL is the only NATS subscriber, which gives sandbox→gateway
|
|
7
|
+
* traffic pod-affinity for free.
|
|
8
|
+
*/
|
|
9
|
+
export declare class SandboxNatsBridge {
|
|
10
|
+
readonly subjectPrefix: string;
|
|
11
|
+
private readonly nc;
|
|
12
|
+
private readonly toolSets;
|
|
13
|
+
private readonly logger;
|
|
14
|
+
private closed;
|
|
15
|
+
private constructor();
|
|
16
|
+
static connect(params: {
|
|
17
|
+
url: string;
|
|
18
|
+
toolSets: Map<string, IToolSet>;
|
|
19
|
+
logger: Logger;
|
|
20
|
+
}): Promise<SandboxNatsBridge>;
|
|
21
|
+
close(): Promise<void>;
|
|
22
|
+
whenClosed(): Promise<void>;
|
|
23
|
+
private subscribe;
|
|
24
|
+
private route;
|
|
25
|
+
private handle;
|
|
26
|
+
private dispatch;
|
|
27
|
+
private encode;
|
|
28
|
+
private decode;
|
|
29
|
+
private getToolSet;
|
|
30
|
+
private handleListTools;
|
|
31
|
+
private handleCallTool;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=SandboxNatsBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SandboxNatsBridge.d.ts","sourceRoot":"","sources":["../../../src/core/sandbox/SandboxNatsBridge.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGtC,OAAO,EAKL,KAAK,QAAQ,EAEd,MAAM,mBAAmB,CAAC;AAyE3B;;;;;GAKG;AACH,qBAAa,iBAAiB;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAiB;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,eAKN;IAED,OAAa,OAAO,CAAC,MAAM,EAAE;QAC3B,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAChC,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAsB7B;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAa3B;IAEK,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAEhC;IAED,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,KAAK;IAYb,OAAO,CAAC,MAAM;YAuBA,QAAQ;IA6BtB,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,UAAU;YAQJ,eAAe;YAUf,cAAc;CAqB7B"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/core/sandbox/SandboxNatsBridge.ts
|
|
21
|
+
var SandboxNatsBridge_exports = {};
|
|
22
|
+
__export(SandboxNatsBridge_exports, {
|
|
23
|
+
SandboxNatsBridge: () => SandboxNatsBridge
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(SandboxNatsBridge_exports);
|
|
26
|
+
var import_nats_core = require("@nats-io/nats-core");
|
|
27
|
+
var import_api = require("@opentelemetry/api");
|
|
28
|
+
var import_core = require("@opentelemetry/core");
|
|
29
|
+
var import_node_crypto = require("crypto");
|
|
30
|
+
var import_ws = require("ws");
|
|
31
|
+
var import_errors = require("../errors.js");
|
|
32
|
+
var import_IMCPServer = require("../mcp/IMCPServer.js");
|
|
33
|
+
var import_errorLogFields = require("../util/errorLogFields.js");
|
|
34
|
+
var import_promiseUtils = require("../util/promiseUtils.js");
|
|
35
|
+
Object.assign(global, { WebSocket: import_ws.WebSocket });
|
|
36
|
+
var NATS_CONNECT_TIMEOUT_MS = 1e4;
|
|
37
|
+
var NATS_CONNECT_RETRIES = 3;
|
|
38
|
+
var NATS_CONNECT_BACKOFF_MS = 250;
|
|
39
|
+
var NATS_DRAIN_TIMEOUT_MS = 5e3;
|
|
40
|
+
var SANDBOX_NATS_SUBJECT_ROOT = "sandbox.bridge";
|
|
41
|
+
var SANDBOX_NATS_MCP_LEAF = "mcp";
|
|
42
|
+
var InvalidMCPUsageError = class extends Error {
|
|
43
|
+
name = "InvalidMCPUsageError";
|
|
44
|
+
};
|
|
45
|
+
function isHttpClientError(error) {
|
|
46
|
+
if (typeof error !== "object" || error === null || !("status" in error)) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
const { status } = error;
|
|
50
|
+
return typeof status === "number" && status >= 400 && status < 500;
|
|
51
|
+
}
|
|
52
|
+
function classifyErrorSource(e) {
|
|
53
|
+
if (e instanceof InvalidMCPUsageError) return "agent";
|
|
54
|
+
if (isHttpClientError(e)) return "agent";
|
|
55
|
+
if (e instanceof import_errors.McpConnectionError && e.statusCode >= 400 && e.statusCode < 500) return "agent";
|
|
56
|
+
return "gateway";
|
|
57
|
+
}
|
|
58
|
+
var _w3cExtractor = new import_core.W3CTraceContextPropagator();
|
|
59
|
+
function extractTraceCarrier(msg) {
|
|
60
|
+
const carrier = {};
|
|
61
|
+
const traceparent = msg.headers?.get("traceparent");
|
|
62
|
+
const tracestate = msg.headers?.get("tracestate");
|
|
63
|
+
if (traceparent) carrier["traceparent"] = traceparent;
|
|
64
|
+
if (tracestate) carrier["tracestate"] = tracestate;
|
|
65
|
+
return carrier;
|
|
66
|
+
}
|
|
67
|
+
var SandboxNatsBridge = class _SandboxNatsBridge {
|
|
68
|
+
subjectPrefix;
|
|
69
|
+
nc;
|
|
70
|
+
toolSets;
|
|
71
|
+
logger;
|
|
72
|
+
closed = false;
|
|
73
|
+
constructor(nc, toolSets, subjectPrefix, logger) {
|
|
74
|
+
this.nc = nc;
|
|
75
|
+
this.toolSets = toolSets;
|
|
76
|
+
this.subjectPrefix = subjectPrefix;
|
|
77
|
+
this.logger = logger;
|
|
78
|
+
}
|
|
79
|
+
static async connect(params) {
|
|
80
|
+
const subjectPrefix = `${SANDBOX_NATS_SUBJECT_ROOT}.${(0, import_node_crypto.randomUUID)()}`;
|
|
81
|
+
const logger = params.logger.child({ module: "SandboxNatsBridge" });
|
|
82
|
+
let lastErr;
|
|
83
|
+
for (let attempt = 1; attempt <= NATS_CONNECT_RETRIES; attempt++) {
|
|
84
|
+
try {
|
|
85
|
+
const nc = await import_api.context.with(
|
|
86
|
+
(0, import_core.suppressTracing)(import_api.context.active()),
|
|
87
|
+
() => (0, import_nats_core.wsconnect)({ servers: [params.url], timeout: NATS_CONNECT_TIMEOUT_MS })
|
|
88
|
+
);
|
|
89
|
+
logger.info(`Connected to sandbox NATS (attempt ${String(attempt)})`, { subjectPrefix });
|
|
90
|
+
const bridge = new _SandboxNatsBridge(nc, params.toolSets, subjectPrefix, logger);
|
|
91
|
+
bridge.subscribe();
|
|
92
|
+
return bridge;
|
|
93
|
+
} catch (e) {
|
|
94
|
+
lastErr = e;
|
|
95
|
+
logger.warn(`Sandbox NATS connect attempt ${String(attempt)} failed`, (0, import_errorLogFields.extractErrorLogFields)(e));
|
|
96
|
+
if (attempt < NATS_CONNECT_RETRIES) {
|
|
97
|
+
await new Promise((resolve) => setTimeout(resolve, NATS_CONNECT_BACKOFF_MS));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
throw lastErr instanceof Error ? lastErr : new Error("Sandbox NATS connect failed");
|
|
102
|
+
}
|
|
103
|
+
async close() {
|
|
104
|
+
if (this.closed) return;
|
|
105
|
+
this.closed = true;
|
|
106
|
+
try {
|
|
107
|
+
await (0, import_promiseUtils.withTimeout)(this.nc.drain(), NATS_DRAIN_TIMEOUT_MS);
|
|
108
|
+
} catch (e) {
|
|
109
|
+
this.logger.warn("Sandbox NATS drain failed/timed out; forcing close", (0, import_errorLogFields.extractErrorLogFields)(e));
|
|
110
|
+
await this.nc.close().catch(() => {
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async whenClosed() {
|
|
115
|
+
await this.nc.closed();
|
|
116
|
+
}
|
|
117
|
+
subscribe() {
|
|
118
|
+
this.nc.subscribe(`${this.subjectPrefix}.${SANDBOX_NATS_MCP_LEAF}`, {
|
|
119
|
+
callback: (err, msg) => {
|
|
120
|
+
this.handle(err, msg, (m) => this.route(m));
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
route(msg) {
|
|
125
|
+
const req = this.decode(msg);
|
|
126
|
+
switch (req.op) {
|
|
127
|
+
case "list_tools":
|
|
128
|
+
return this.handleListTools(req);
|
|
129
|
+
case "call_tool":
|
|
130
|
+
return this.handleCallTool(req);
|
|
131
|
+
default:
|
|
132
|
+
throw new InvalidMCPUsageError(`Unknown sandbox bridge operation`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
handle(err, msg, handler) {
|
|
136
|
+
if (err) {
|
|
137
|
+
this.logger.error("Sandbox NATS subscription error", (0, import_errorLogFields.extractErrorLogFields)(err));
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
if (!msg.reply) {
|
|
141
|
+
this.logger.warn(`Sandbox NATS request on '${msg.subject}' has no reply subject; dropping`);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const ctx = _w3cExtractor.extract(
|
|
145
|
+
(0, import_core.unsuppressTracing)(import_api.context.active()),
|
|
146
|
+
extractTraceCarrier(msg),
|
|
147
|
+
import_api.defaultTextMapGetter
|
|
148
|
+
);
|
|
149
|
+
import_api.context.with(ctx, () => void this.dispatch(msg, handler));
|
|
150
|
+
}
|
|
151
|
+
async dispatch(msg, handler) {
|
|
152
|
+
if (this.closed) {
|
|
153
|
+
this.logger.warn(`Sandbox NATS bridge is closed; rejecting request on '${msg.subject}'`);
|
|
154
|
+
try {
|
|
155
|
+
msg.respond(this.encode({ ok: false, error: "Sandbox NATS bridge is closed", source: "bridge" }));
|
|
156
|
+
} catch (e) {
|
|
157
|
+
this.logger.warn(`Failed to send bridge-closed reply on '${msg.subject}'`, (0, import_errorLogFields.extractErrorLogFields)(e));
|
|
158
|
+
}
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
let reply;
|
|
162
|
+
try {
|
|
163
|
+
reply = { ok: true, result: await handler(msg) };
|
|
164
|
+
} catch (e) {
|
|
165
|
+
const source = classifyErrorSource(e);
|
|
166
|
+
const errorMessage = e instanceof Error ? e.message : "Unknown sandbox bridge error";
|
|
167
|
+
this.logger.error(
|
|
168
|
+
`Sandbox NATS dispatch failed on '${msg.subject}' (source=${source})`,
|
|
169
|
+
(0, import_errorLogFields.extractErrorLogFields)(e)
|
|
170
|
+
);
|
|
171
|
+
reply = { ok: false, error: errorMessage, source };
|
|
172
|
+
}
|
|
173
|
+
try {
|
|
174
|
+
msg.respond(this.encode(reply));
|
|
175
|
+
} catch (e) {
|
|
176
|
+
this.logger.error("Failed to publish sandbox NATS reply", (0, import_errorLogFields.extractErrorLogFields)(e));
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
encode(reply) {
|
|
180
|
+
return new TextEncoder().encode(JSON.stringify(reply));
|
|
181
|
+
}
|
|
182
|
+
decode(msg) {
|
|
183
|
+
return JSON.parse(new TextDecoder().decode(msg.data));
|
|
184
|
+
}
|
|
185
|
+
getToolSet(serverName) {
|
|
186
|
+
const server = this.toolSets.get(serverName);
|
|
187
|
+
if (!server) {
|
|
188
|
+
throw new InvalidMCPUsageError(`MCP server '${serverName}' is not available for this agent`);
|
|
189
|
+
}
|
|
190
|
+
return server;
|
|
191
|
+
}
|
|
192
|
+
async handleListTools(req) {
|
|
193
|
+
const { server } = req;
|
|
194
|
+
const mcp = this.getToolSet(server);
|
|
195
|
+
const response = await mcp.listTools();
|
|
196
|
+
if ((0, import_IMCPServer.isAuthRequired)(response)) {
|
|
197
|
+
throw new InvalidMCPUsageError(`MCP server '${server}' requires OAuth; cannot list tools from sandbox`);
|
|
198
|
+
}
|
|
199
|
+
return response.result;
|
|
200
|
+
}
|
|
201
|
+
async handleCallTool(req) {
|
|
202
|
+
const { server, tool, arguments: args } = req;
|
|
203
|
+
const response = await this.getToolSet(server).callTool({ name: tool, arguments: args ?? {} });
|
|
204
|
+
if ((0, import_IMCPServer.isAuthRequired)(response)) {
|
|
205
|
+
throw new InvalidMCPUsageError(`MCP server '${server}' requires OAuth; cannot call tool from sandbox`);
|
|
206
|
+
}
|
|
207
|
+
if ((0, import_IMCPServer.isCallToolResponseCreateSubAgent)(response)) {
|
|
208
|
+
throw new InvalidMCPUsageError(`Tool '${server}/${tool}' creates a sub-agent and is not callable from sandbox`);
|
|
209
|
+
}
|
|
210
|
+
if (!(0, import_IMCPServer.isCallToolResponseResult)(response)) {
|
|
211
|
+
throw new InvalidMCPUsageError(
|
|
212
|
+
`Tool '${server}/${tool}' requires interactive handling and is not callable from sandbox`
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
return response.result;
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
219
|
+
0 && (module.exports = {
|
|
220
|
+
SandboxNatsBridge
|
|
221
|
+
});
|
|
222
|
+
//# sourceMappingURL=SandboxNatsBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/core/sandbox/SandboxNatsBridge.ts"],"sourcesContent":["import { wsconnect, type Msg, type NatsConnection } from '@nats-io/nats-core';\nimport { context, defaultTextMapGetter } from '@opentelemetry/api';\nimport { suppressTracing, unsuppressTracing, W3CTraceContextPropagator } from '@opentelemetry/core';\nimport { randomUUID } from 'node:crypto';\nimport type { Logger } from 'winston';\nimport { WebSocket } from 'ws';\nimport { McpConnectionError } from '../errors';\nimport {\n isAuthRequired,\n isCallToolResponseCreateSubAgent,\n isCallToolResponseResult,\n type CallToolResolvedResponse,\n type IToolSet,\n type ListToolsResolvedResponse,\n} from '../mcp/IMCPServer';\nimport { extractErrorLogFields } from '../util/errorLogFields';\nimport { withTimeout } from '../util/promiseUtils';\n\n// `wsconnect` from @nats-io/nats-core relies on a global WebSocket constructor; in Node we\n// provide it from `ws`. Same pattern as `src/services/NatsService.ts`.\nObject.assign(global, { WebSocket });\n\nconst NATS_CONNECT_TIMEOUT_MS = 10_000;\nconst NATS_CONNECT_RETRIES = 3;\nconst NATS_CONNECT_BACKOFF_MS = 250;\n// Bound on the graceful drain at teardown; on timeout we fall back to nc.close()\nconst NATS_DRAIN_TIMEOUT_MS = 5_000;\n\nconst SANDBOX_NATS_SUBJECT_ROOT = 'sandbox.bridge';\n// Single request/reply subject leaf; the operation is carried in the payload's `op` field so the\n// bridge maintains one subscription instead of one per operation.\nconst SANDBOX_NATS_MCP_LEAF = 'mcp';\n\ntype BridgeRequest =\n | { op: 'list_tools'; server: string }\n | { op: 'call_tool'; server: string; tool: string; arguments?: Record<string, unknown> };\n\n// Attributes an application-level failure so the sandbox client can tell who is at fault:\n// 'agent' (bad generated code: wrong server/tool/args or an unsupported path), 'gateway' (our\n// handler failed), or 'bridge' (a NATS bridge lifecycle condition, e.g. the bridge was closed).\n// Pure transport failures never produce an envelope, so they're inferred client-side instead.\ntype BridgeErrorSource = 'gateway' | 'agent' | 'bridge';\n\n// Envelope returned on `msg.reply`. NATS itself always succeeds; the receiver branches on `ok`.\ntype BridgeReply<T> = { ok: true; result: T } | { ok: false; error: string; source: BridgeErrorSource };\n\n// Caller-caused failure: retrying won't help, so it's attributed to the agent's code, not us.\nclass InvalidMCPUsageError extends Error {\n override readonly name = 'InvalidMCPUsageError';\n}\n\nfunction isHttpClientError(error: unknown): error is { status: number } {\n if (typeof error !== 'object' || error === null || !('status' in error)) {\n return false;\n }\n const { status } = error;\n return typeof status === 'number' && status >= 400 && status < 500;\n}\n\n// An InvalidMCPUsageError, a 4xx HTTP-style exception, or a 4xx-hinted McpConnectionError (e.g. a\n// disallowed/unknown tool surfaced by an ToolSet) is caller-caused -> 'agent'; anything else is\n// our bug -> 'gateway'.\nfunction classifyErrorSource(e: unknown): BridgeErrorSource {\n if (e instanceof InvalidMCPUsageError) return 'agent';\n if (isHttpClientError(e)) return 'agent';\n // ...remote servers with a 4xx McpConnectionError (has `statusCode`, not `status`). Same meaning.\n if (e instanceof McpConnectionError && e.statusCode >= 400 && e.statusCode < 500) return 'agent';\n return 'gateway';\n}\n\n// Direct W3C extractor, NOT the global `propagation` API. The gateway-wide propagator\n// (SelectivePropagator in src/tracing.ts) refuses to restore traceparent unless the\n// internal-secret headers are present — a deliberate guard against external requests\n// forging trace parents. The NATS bridge is intra-process trusted (sender + receiver\n// share the same Node process and span store), so we bypass that gate here and\n// always honor the trace context the sandbox echoes back.\nconst _w3cExtractor = new W3CTraceContextPropagator();\n\nfunction extractTraceCarrier(msg: Msg): Record<string, string> {\n const carrier: Record<string, string> = {};\n const traceparent = msg.headers?.get('traceparent');\n const tracestate = msg.headers?.get('tracestate');\n if (traceparent) carrier['traceparent'] = traceparent;\n if (tracestate) carrier['tracestate'] = tracestate;\n return carrier;\n}\n\n/**\n * Per-sandbox NATS subscriber. Bridges sandbox-originated MCP tool calls (sent over wss to the\n * sandbox's local nats-server) into the gateway pod's `IToolSet` registry for this agent.\n * The pod that holds the preview URL is the only NATS subscriber, which gives sandbox→gateway\n * traffic pod-affinity for free.\n */\nexport class SandboxNatsBridge {\n readonly subjectPrefix: string;\n\n private readonly nc: NatsConnection;\n private readonly toolSets: Map<string, IToolSet>;\n private readonly logger: Logger;\n private closed = false;\n\n private constructor(nc: NatsConnection, toolSets: Map<string, IToolSet>, subjectPrefix: string, logger: Logger) {\n this.nc = nc;\n this.toolSets = toolSets;\n this.subjectPrefix = subjectPrefix;\n this.logger = logger;\n }\n\n static async connect(params: {\n url: string;\n toolSets: Map<string, IToolSet>;\n logger: Logger;\n }): Promise<SandboxNatsBridge> {\n const subjectPrefix = `${SANDBOX_NATS_SUBJECT_ROOT}.${randomUUID()}`;\n const logger = params.logger.child({ module: 'SandboxNatsBridge' });\n let lastErr: unknown;\n for (let attempt = 1; attempt <= NATS_CONNECT_RETRIES; attempt++) {\n try {\n const nc = await context.with(suppressTracing(context.active()), () =>\n wsconnect({ servers: [params.url], timeout: NATS_CONNECT_TIMEOUT_MS }),\n );\n logger.info(`Connected to sandbox NATS (attempt ${String(attempt)})`, { subjectPrefix });\n const bridge = new SandboxNatsBridge(nc, params.toolSets, subjectPrefix, logger);\n bridge.subscribe();\n return bridge;\n } catch (e) {\n lastErr = e;\n logger.warn(`Sandbox NATS connect attempt ${String(attempt)} failed`, extractErrorLogFields(e));\n if (attempt < NATS_CONNECT_RETRIES) {\n await new Promise(resolve => setTimeout(resolve, NATS_CONNECT_BACKOFF_MS));\n }\n }\n }\n throw lastErr instanceof Error ? lastErr : new Error('Sandbox NATS connect failed');\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n try {\n // drain() resolves once pending replies are flushed and the connection closes.\n await withTimeout(this.nc.drain(), NATS_DRAIN_TIMEOUT_MS);\n } catch (e) {\n // drain rejected or timed out, nc.close() terminates all pending requests and subscriptions on the connection.\n this.logger.warn('Sandbox NATS drain failed/timed out; forcing close', extractErrorLogFields(e));\n await this.nc.close().catch(() => {\n /* no-op */\n });\n }\n }\n\n async whenClosed(): Promise<void> {\n await this.nc.closed();\n }\n\n private subscribe(): void {\n this.nc.subscribe(`${this.subjectPrefix}.${SANDBOX_NATS_MCP_LEAF}`, {\n callback: (err, msg) => {\n this.handle(err, msg, m => this.route(m));\n },\n });\n }\n\n private route(msg: Msg): Promise<unknown> {\n const req = this.decode(msg);\n switch (req.op) {\n case 'list_tools':\n return this.handleListTools(req);\n case 'call_tool':\n return this.handleCallTool(req);\n default:\n throw new InvalidMCPUsageError(`Unknown sandbox bridge operation`);\n }\n }\n\n private handle(err: Error | null, msg: Msg, handler: (msg: Msg) => Promise<unknown>): void {\n if (err) {\n this.logger.error('Sandbox NATS subscription error', extractErrorLogFields(err));\n return;\n }\n if (!msg.reply) {\n this.logger.warn(`Sandbox NATS request on '${msg.subject}' has no reply subject; dropping`);\n return;\n }\n\n // Resume the originating Sandbox: exec span from the per-request traceparent header so\n // downstream MCP spans nest correctly (falls through to the current context if absent).\n // unsuppressTracing is required: connect() runs under suppressTracing (to drop the\n // WS-upgrade span) and nats-core's receive loop reuses that suppressed context, which would\n // otherwise make propagation.inject no-op and leak a stale traceparent.\n const ctx = _w3cExtractor.extract(\n unsuppressTracing(context.active()),\n extractTraceCarrier(msg),\n defaultTextMapGetter,\n );\n context.with(ctx, () => void this.dispatch(msg, handler));\n }\n\n private async dispatch(msg: Msg, handler: (msg: Msg) => Promise<unknown>): Promise<void> {\n if (this.closed) {\n this.logger.warn(`Sandbox NATS bridge is closed; rejecting request on '${msg.subject}'`);\n try {\n msg.respond(this.encode({ ok: false, error: 'Sandbox NATS bridge is closed', source: 'bridge' }));\n } catch (e) {\n this.logger.warn(`Failed to send bridge-closed reply on '${msg.subject}'`, extractErrorLogFields(e));\n }\n return;\n }\n let reply: BridgeReply<unknown>;\n try {\n reply = { ok: true, result: await handler(msg) };\n } catch (e) {\n const source = classifyErrorSource(e);\n const errorMessage = e instanceof Error ? e.message : 'Unknown sandbox bridge error';\n this.logger.error(\n `Sandbox NATS dispatch failed on '${msg.subject}' (source=${source})`,\n extractErrorLogFields(e),\n );\n reply = { ok: false, error: errorMessage, source };\n }\n try {\n msg.respond(this.encode(reply));\n } catch (e) {\n this.logger.error('Failed to publish sandbox NATS reply', extractErrorLogFields(e));\n }\n }\n\n private encode(reply: BridgeReply<unknown>): Uint8Array {\n return new TextEncoder().encode(JSON.stringify(reply));\n }\n\n private decode(msg: Msg): BridgeRequest {\n return JSON.parse(new TextDecoder().decode(msg.data)) as BridgeRequest;\n }\n\n private getToolSet(serverName: string): IToolSet {\n const server = this.toolSets.get(serverName);\n if (!server) {\n throw new InvalidMCPUsageError(`MCP server '${serverName}' is not available for this agent`);\n }\n return server;\n }\n\n private async handleListTools(req: { server: string }): Promise<ListToolsResolvedResponse['result']> {\n const { server } = req;\n const mcp = this.getToolSet(server);\n const response = await mcp.listTools();\n if (isAuthRequired(response)) {\n throw new InvalidMCPUsageError(`MCP server '${server}' requires OAuth; cannot list tools from sandbox`);\n }\n return response.result;\n }\n\n private async handleCallTool(req: {\n server: string;\n tool: string;\n arguments?: Record<string, unknown> | undefined;\n }): Promise<CallToolResolvedResponse['result']> {\n const { server, tool, arguments: args } = req;\n const response = await this.getToolSet(server).callTool({ name: tool, arguments: args ?? {} });\n if (isAuthRequired(response)) {\n throw new InvalidMCPUsageError(`MCP server '${server}' requires OAuth; cannot call tool from sandbox`);\n }\n if (isCallToolResponseCreateSubAgent(response)) {\n throw new InvalidMCPUsageError(`Tool '${server}/${tool}' creates a sub-agent and is not callable from sandbox`);\n }\n if (!isCallToolResponseResult(response)) {\n // Approval / client-side-tool paths are intentionally out of scope currently.\n throw new InvalidMCPUsageError(\n `Tool '${server}/${tool}' requires interactive handling and is not callable from sandbox`,\n );\n }\n return response.result;\n }\n}\n"],"mappings":"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","names":[]}
|