@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 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/capabilities/builtins/LargeToolResponse.ts"],"sourcesContent":["import dedent from 'dedent';\nimport type { Logger } from 'winston';\nimport { estimateTokensForString } from '../../llm/usage';\nimport type { ToolCallResult } from '../../mcp/executeToolCalls';\nimport type { Sandbox, SandboxInfo } from '../../sandbox/Sandbox';\nimport { createSandboxLargeToolResponseGuidance, SANDBOX_SCHEMA_INFER_TAG } from '../../sandbox/Sandbox';\nimport { extractErrorLogFields } from '../../util/errorLogFields';\nimport type { AgentCapability } from '../AgentCapability';\nimport type { AgentThreadExecutionContext } from '../AgentContextProcessor';\nimport type { ToolResponseProcessor, ToolResponseProcessorResult } from '../ToolResponseProcessor';\nimport { createDynamicSubAgentLargeToolResponseGuidance } from './DynamicSubAgents';\n\nexport const DEFAULT_INDIVIDUAL_TOOL_TOKEN_THRESHOLD = 6000;\nexport const DEFAULT_TOTAL_TOOL_TOKEN_THRESHOLD = 10000;\nexport const DEFAULT_PREVIEW_NUMBER_OF_CHARACTERS = 100;\nconst FAILURE_MESSAGE_TRUNCATION_LENGTH = 500;\n\ntype ResultCategory = 'failure' | 'sandbox' | 'mcp';\n\ninterface ToolResultWithInfo {\n toolCallResult: ToolCallResult;\n originalContent: string;\n originalTokens: number;\n category: ResultCategory;\n}\n\nfunction categorize(result: ToolCallResult, sandbox: Sandbox | undefined): ResultCategory {\n if (result.failure) return 'failure';\n if (!result.info) {\n throw new Error(`Unreachable`);\n }\n if (sandbox && result.info.toolSet === sandbox) return 'sandbox';\n return 'mcp';\n}\n\nfunction createContentPreview(content: string, previewChars: number): string {\n if (content.length <= previewChars * 2) {\n return content;\n }\n return `${content.slice(0, previewChars)}\\n...\\n${content.slice(-previewChars)}`;\n}\n\nexport class LargeToolResponseProcessor implements ToolResponseProcessor {\n private dynamicSubAgentsPresent: boolean;\n private individualTokenThreshold: number;\n private totalTokenThreshold: number;\n private previewNumberOfCharacters: number;\n private readonly logger: Logger;\n\n constructor(param: {\n dynamicSubAgentsPresent: boolean;\n individualTokenThreshold: number;\n totalTokenThreshold: number;\n previewNumberOfCharacters: number;\n logger: Logger;\n }) {\n if (param.individualTokenThreshold > param.totalTokenThreshold) {\n throw new Error(\n `individualTokenThreshold (${String(param.individualTokenThreshold)}) must be <= totalTokenThreshold (${String(param.totalTokenThreshold)})`,\n );\n }\n this.dynamicSubAgentsPresent = param.dynamicSubAgentsPresent;\n this.individualTokenThreshold = param.individualTokenThreshold;\n this.totalTokenThreshold = param.totalTokenThreshold;\n this.previewNumberOfCharacters = param.previewNumberOfCharacters;\n this.logger = param.logger.child({ module: 'LargeToolResponse' });\n }\n\n private createLargeToolResponseGuidance(sandbox: Sandbox | undefined): string {\n const steps = ['Check if some parameter can be passed in order to reduce the output size.'];\n\n if (sandbox) {\n steps.push(createSandboxLargeToolResponseGuidance());\n }\n\n if (this.dynamicSubAgentsPresent) {\n steps.push(createDynamicSubAgentLargeToolResponseGuidance());\n }\n\n return `Content too big. To handle a large tool call the Agent can do the following:\\n${steps\n .map((step, index) => `${String(index + 1)}. ${step}`)\n .join('\\n')}`;\n }\n\n private createFileDumpMessage(params: { filePath: string; preview: string }): string {\n const { filePath, preview } = params;\n const steps: string[] = [\n dedent`Use sandbox to read parts of the file or extract data.\n Use ${SANDBOX_SCHEMA_INFER_TAG} to undertand the schema.`,\n ];\n\n if (this.dynamicSubAgentsPresent) {\n steps.push(\n `${createDynamicSubAgentLargeToolResponseGuidance()} The Agent must pass file path to sub-agent also.`,\n );\n }\n\n const guidance = `The Agent can do the following to handle it:\\n${steps\n .map((step, index) => `${String(index + 1)}. ${step}`)\n .join('\\n')}`;\n\n return `Content too large. Result saved to: ${filePath}.\\n\\n${guidance}\\n\\nPreview (first and last ${String(this.previewNumberOfCharacters)} chars):\\n${preview}`;\n }\n\n private buildResultsWithInfo(results: ToolCallResult[], sandbox: Sandbox | undefined): ToolResultWithInfo[] {\n return results.map(toolCallResult => ({\n toolCallResult,\n originalContent: toolCallResult.message.content,\n originalTokens: estimateTokensForString(toolCallResult.message.content),\n category: categorize(toolCallResult, sandbox),\n }));\n }\n\n private blockResult(\n entry: ToolResultWithInfo,\n pendingSandboxDumps: ToolResultWithInfo[],\n sandbox: Sandbox | undefined,\n ): number {\n const preview = createContentPreview(entry.originalContent, this.previewNumberOfCharacters);\n\n let newContent: string;\n switch (entry.category) {\n case 'failure':\n newContent = entry.originalContent.slice(0, FAILURE_MESSAGE_TRUNCATION_LENGTH);\n break;\n case 'sandbox':\n newContent = `Content too big. The Agent should write to a file if required and use grep and sed.\\n\\nPreview:\\n${preview}`;\n break;\n case 'mcp':\n newContent = `${this.createLargeToolResponseGuidance(sandbox)}\\n\\nPreview (first and last ${String(this.previewNumberOfCharacters)} chars):\\n${preview}`;\n if (sandbox) {\n pendingSandboxDumps.push(entry);\n }\n break;\n }\n\n entry.toolCallResult.message.content = newContent;\n entry.toolCallResult.isStructuredContent = false;\n return Math.max(0, entry.originalTokens - estimateTokensForString(newContent));\n }\n\n private async uploadToSandboxAndPrependFilePath(\n entry: ToolResultWithInfo,\n index: number,\n sandbox: Sandbox,\n ): Promise<SandboxInfo | undefined> {\n if (!entry.toolCallResult.info) {\n throw new Error(`Unreachable`);\n }\n const sanitizedName = entry.toolCallResult.info.originalToolName.replace(/[^a-zA-Z0-9_-]/g, '_').slice(0, 40);\n const epoch = Date.now();\n const fileName = `${sanitizedName}_${String(index)}_${String(epoch)}.txt`;\n try {\n const stored = await sandbox.writeArtifact({\n fileName,\n content: Buffer.from(entry.originalContent),\n sourceTool: entry.toolCallResult.info,\n });\n const preview = createContentPreview(entry.originalContent, this.previewNumberOfCharacters);\n entry.toolCallResult.message.content = this.createFileDumpMessage({ filePath: stored.filePath, preview });\n entry.toolCallResult.isStructuredContent = false;\n return stored.sandboxCreated;\n } catch (error) {\n this.logger.error('Failed to upload to sandbox', extractErrorLogFields(error));\n return undefined;\n }\n }\n\n private async executeSandboxDumps(entries: ToolResultWithInfo[], sandbox: Sandbox): Promise<SandboxInfo | undefined> {\n const results = await Promise.all(\n entries.map((entry, index) => this.uploadToSandboxAndPrependFilePath(entry, index, sandbox)),\n );\n return results.find(r => r !== undefined);\n }\n\n async process(\n results: ToolCallResult[],\n execution: Readonly<AgentThreadExecutionContext>,\n ): Promise<ToolResponseProcessorResult> {\n const sandbox = execution.sandbox;\n const resultsWithInfo = this.buildResultsWithInfo(results, sandbox);\n let runningTotal = resultsWithInfo.reduce((sum, e) => sum + e.originalTokens, 0);\n\n if (runningTotal < this.individualTokenThreshold) {\n return {};\n }\n\n const pendingSandboxDumps: ToolResultWithInfo[] = [];\n\n const unblocked: ToolResultWithInfo[] = [];\n for (const entry of resultsWithInfo) {\n if (entry.originalTokens >= this.individualTokenThreshold) {\n runningTotal -= this.blockResult(entry, pendingSandboxDumps, sandbox);\n } else {\n unblocked.push(entry);\n }\n }\n\n const sortedUnblocked = [...unblocked].sort((a, b) => b.originalTokens - a.originalTokens);\n for (const entry of sortedUnblocked) {\n if (runningTotal < this.totalTokenThreshold) {\n break;\n }\n runningTotal -= this.blockResult(entry, pendingSandboxDumps, sandbox);\n }\n\n const sandboxCreated = sandbox ? await this.executeSandboxDumps(pendingSandboxDumps, sandbox) : undefined;\n return sandboxCreated !== undefined ? { sandboxCreated } : {};\n }\n}\n\nexport interface LargeToolResponseSettings {\n individualTokenThreshold?: number | undefined;\n totalTokenThreshold?: number | undefined;\n previewNumberOfCharacters?: number | undefined;\n}\n\nexport function largeToolResponse(options: {\n dynamicSubAgentsPresent: boolean;\n settings?: LargeToolResponseSettings | undefined;\n logger: Logger;\n}): AgentCapability {\n return {\n toolResponseProcessors: [\n new LargeToolResponseProcessor({\n dynamicSubAgentsPresent: options.dynamicSubAgentsPresent,\n individualTokenThreshold: options.settings?.individualTokenThreshold ?? DEFAULT_INDIVIDUAL_TOOL_TOKEN_THRESHOLD,\n totalTokenThreshold: options.settings?.totalTokenThreshold ?? DEFAULT_TOTAL_TOOL_TOKEN_THRESHOLD,\n previewNumberOfCharacters: options.settings?.previewNumberOfCharacters ?? DEFAULT_PREVIEW_NUMBER_OF_CHARACTERS,\n logger: options.logger,\n }),\n ],\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { InstructionBuilder } from '../../InstructionBuilder';
|
|
2
|
+
import { LocalToolMCP, type ToolDefinition } from '../../mcp/LocalToolMCP';
|
|
3
|
+
import type { AgentTracing } from '../../tracing/AgentTracing';
|
|
4
|
+
import type { AgentCapability } from '../AgentCapability';
|
|
5
|
+
export declare const OPENUI_SERVER_ID = "openui";
|
|
6
|
+
export declare const GET_OPENUI_INSTRUCTIONS_TOOL_NAME = "get_openui_instructions";
|
|
7
|
+
export declare const OPENUI_SECTION_TAG = "openui";
|
|
8
|
+
export declare const OPENUI_MARKDOWN_FENCING_TAG = "openui-markdown-fencing";
|
|
9
|
+
export declare const OPENUI_SYNTAX_RULES_TAG = "openui-syntax-rules";
|
|
10
|
+
export declare const OPENUI_COMPONENT_SIGNATURES_TAG = "openui-component-signatures";
|
|
11
|
+
export declare const OPENUI_BUILTIN_FUNCTIONS_TAG = "openui-builtin-functions";
|
|
12
|
+
export declare const OPENUI_HOISTING_AND_STREAMING_TAG = "openui-hoisting-and-streaming";
|
|
13
|
+
export declare const OPENUI_EXAMPLES_TAG = "openui-examples";
|
|
14
|
+
export declare const OPENUI_IMPORTANT_RULES_TAG = "openui-important-rules";
|
|
15
|
+
export declare const OPENUI_FINAL_VERIFICATION_TAG = "openui-final-verification";
|
|
16
|
+
export declare const OPENUI_USER_INTERACTION_CHECKLIST_TAG = "openui-user-interaction-checklist";
|
|
17
|
+
export declare function buildOpenUIInstruction(builder: InstructionBuilder): void;
|
|
18
|
+
/** Renders the existing OpenUI prompt tree without duplicating section bodies. */
|
|
19
|
+
export declare function renderOpenUIPrompt(): string;
|
|
20
|
+
export declare class OpenUIInstructions extends LocalToolMCP {
|
|
21
|
+
readonly name = "openui";
|
|
22
|
+
readonly displayName = "OpenUI";
|
|
23
|
+
constructor(tracing: AgentTracing);
|
|
24
|
+
private tools;
|
|
25
|
+
protected getTools(): ToolDefinition[];
|
|
26
|
+
}
|
|
27
|
+
export declare function openUI(options?: {
|
|
28
|
+
preload?: boolean;
|
|
29
|
+
tracing?: AgentTracing;
|
|
30
|
+
}): AgentCapability;
|
|
31
|
+
//# sourceMappingURL=OpenUI.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpenUI.d.ts","sourceRoot":"","sources":["../../../../src/core/capabilities/builtins/OpenUI.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAc,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,eAAO,MAAM,gBAAgB,WAAW,CAAC;AACzC,eAAO,MAAM,iCAAiC,4BAA4B,CAAC;AAI3E,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAC3C,eAAO,MAAM,2BAA2B,4BAA4B,CAAC;AACrE,eAAO,MAAM,uBAAuB,wBAAwB,CAAC;AAC7D,eAAO,MAAM,+BAA+B,gCAAgC,CAAC;AAC7E,eAAO,MAAM,4BAA4B,6BAA6B,CAAC;AACvE,eAAO,MAAM,iCAAiC,kCAAkC,CAAC;AACjF,eAAO,MAAM,mBAAmB,oBAAoB,CAAC;AACrD,eAAO,MAAM,0BAA0B,2BAA2B,CAAC;AACnE,eAAO,MAAM,6BAA6B,8BAA8B,CAAC;AACzE,eAAO,MAAM,qCAAqC,sCAAsC,CAAC;AAEzF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CA4OxE;AAED,kFAAkF;AAClF,wBAAgB,kBAAkB,IAAI,MAAM,CAY3C;AAgBD,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,QAAQ,CAAC,IAAI,YAAoB;IACjC,QAAQ,CAAC,WAAW,YAAY;IAEhC,YAAY,OAAO,EAAE,YAAY,EAEhC;IAED,OAAO,CAAC,KAAK,CAUX;IAEF,SAAS,CAAC,QAAQ,IAAI,cAAc,EAAE,CAErC;CACF;AAED,wBAAgB,MAAM,CAAC,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,YAAY,CAAA;CAAE,GAAG,eAAe,CAW/F"}
|
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/core/capabilities/builtins/OpenUI.ts
|
|
31
|
+
var OpenUI_exports = {};
|
|
32
|
+
__export(OpenUI_exports, {
|
|
33
|
+
GET_OPENUI_INSTRUCTIONS_TOOL_NAME: () => GET_OPENUI_INSTRUCTIONS_TOOL_NAME,
|
|
34
|
+
OPENUI_BUILTIN_FUNCTIONS_TAG: () => OPENUI_BUILTIN_FUNCTIONS_TAG,
|
|
35
|
+
OPENUI_COMPONENT_SIGNATURES_TAG: () => OPENUI_COMPONENT_SIGNATURES_TAG,
|
|
36
|
+
OPENUI_EXAMPLES_TAG: () => OPENUI_EXAMPLES_TAG,
|
|
37
|
+
OPENUI_FINAL_VERIFICATION_TAG: () => OPENUI_FINAL_VERIFICATION_TAG,
|
|
38
|
+
OPENUI_HOISTING_AND_STREAMING_TAG: () => OPENUI_HOISTING_AND_STREAMING_TAG,
|
|
39
|
+
OPENUI_IMPORTANT_RULES_TAG: () => OPENUI_IMPORTANT_RULES_TAG,
|
|
40
|
+
OPENUI_MARKDOWN_FENCING_TAG: () => OPENUI_MARKDOWN_FENCING_TAG,
|
|
41
|
+
OPENUI_SECTION_TAG: () => OPENUI_SECTION_TAG,
|
|
42
|
+
OPENUI_SERVER_ID: () => OPENUI_SERVER_ID,
|
|
43
|
+
OPENUI_SYNTAX_RULES_TAG: () => OPENUI_SYNTAX_RULES_TAG,
|
|
44
|
+
OPENUI_USER_INTERACTION_CHECKLIST_TAG: () => OPENUI_USER_INTERACTION_CHECKLIST_TAG,
|
|
45
|
+
OpenUIInstructions: () => OpenUIInstructions,
|
|
46
|
+
buildOpenUIInstruction: () => buildOpenUIInstruction,
|
|
47
|
+
openUI: () => openUI,
|
|
48
|
+
renderOpenUIPrompt: () => renderOpenUIPrompt
|
|
49
|
+
});
|
|
50
|
+
module.exports = __toCommonJS(OpenUI_exports);
|
|
51
|
+
var import_dedent = __toESM(require("dedent"), 1);
|
|
52
|
+
var import_zod = require("zod");
|
|
53
|
+
var import_InstructionBuilder = require("../../InstructionBuilder.js");
|
|
54
|
+
var import_IMCPServer = require("../../mcp/IMCPServer.js");
|
|
55
|
+
var import_LocalToolMCP = require("../../mcp/LocalToolMCP.js");
|
|
56
|
+
var import_NoopAgentTracing = require("../../tracing/NoopAgentTracing.js");
|
|
57
|
+
var OPENUI_SERVER_ID = "openui";
|
|
58
|
+
var GET_OPENUI_INSTRUCTIONS_TOOL_NAME = "get_openui_instructions";
|
|
59
|
+
var getOpenUIInstructionsInputSchema = import_zod.z.object({}).strict();
|
|
60
|
+
var OPENUI_SECTION_TAG = "openui";
|
|
61
|
+
var OPENUI_MARKDOWN_FENCING_TAG = "openui-markdown-fencing";
|
|
62
|
+
var OPENUI_SYNTAX_RULES_TAG = "openui-syntax-rules";
|
|
63
|
+
var OPENUI_COMPONENT_SIGNATURES_TAG = "openui-component-signatures";
|
|
64
|
+
var OPENUI_BUILTIN_FUNCTIONS_TAG = "openui-builtin-functions";
|
|
65
|
+
var OPENUI_HOISTING_AND_STREAMING_TAG = "openui-hoisting-and-streaming";
|
|
66
|
+
var OPENUI_EXAMPLES_TAG = "openui-examples";
|
|
67
|
+
var OPENUI_IMPORTANT_RULES_TAG = "openui-important-rules";
|
|
68
|
+
var OPENUI_FINAL_VERIFICATION_TAG = "openui-final-verification";
|
|
69
|
+
var OPENUI_USER_INTERACTION_CHECKLIST_TAG = "openui-user-interaction-checklist";
|
|
70
|
+
function buildOpenUIInstruction(builder) {
|
|
71
|
+
const openui = builder.beginSection(OPENUI_SECTION_TAG);
|
|
72
|
+
openui.addSection(
|
|
73
|
+
OPENUI_MARKDOWN_FENCING_TAG,
|
|
74
|
+
import_dedent.default`
|
|
75
|
+
All openui, code must be fenced within openui block.
|
|
76
|
+
\`\`\`openui
|
|
77
|
+
code
|
|
78
|
+
\`\`\``
|
|
79
|
+
);
|
|
80
|
+
openui.addSection(
|
|
81
|
+
OPENUI_SYNTAX_RULES_TAG,
|
|
82
|
+
import_dedent.default`
|
|
83
|
+
1. Each statement is on its own line: \`identifier = Expression\`
|
|
84
|
+
2. \`root\` is the entry point — every program must define \`root = Stack(...)\`
|
|
85
|
+
3. Expressions are: strings ("..."), numbers, booleans (true/false), null, arrays ([...]), objects ({...}), or component calls TypeName(arg1, arg2, ...)
|
|
86
|
+
4. Use references for readability: define \`name = ...\` on one line, then use \`name\` later
|
|
87
|
+
5. EVERY variable (except root) MUST be referenced by at least one other variable. Unreferenced variables are silently dropped and will NOT render. Always include defined variables in their parent's children/items array.
|
|
88
|
+
6. Arguments are POSITIONAL (order matters, not names). Write \`Stack([children], "row", "l")\` NOT \`Stack([children], direction: "row", gap: "l")\` — colon syntax is NOT supported and silently breaks
|
|
89
|
+
7. Optional arguments can be omitted from the end
|
|
90
|
+
- Strings use double quotes with backslash escaping`
|
|
91
|
+
);
|
|
92
|
+
openui.addSection(
|
|
93
|
+
OPENUI_COMPONENT_SIGNATURES_TAG,
|
|
94
|
+
import_dedent.default`
|
|
95
|
+
Arguments marked with ? are optional. Sub-components can be inline or referenced; prefer references for better streaming.
|
|
96
|
+
Props typed \`ActionExpression\` accept an Action([@steps...]) expression. See the Action section for available steps (@ToAssistant, @OpenUrl).
|
|
97
|
+
Props marked \`$binding<type>\` accept a \`$variable\` reference for two-way binding.
|
|
98
|
+
|
|
99
|
+
Layout:
|
|
100
|
+
Stack([children], direction?: "row" | "column", gap?: "none" | "xs" | "s" | "m" | "l" | "xl" | "2xl", align?: "start" | "center" | "end" | "stretch" | "baseline", justify?: "start" | "center" | "end" | "between" | "around" | "evenly", wrap?: boolean) — Flex container. direction: "row"|"column" (default "column"). gap: "none"|"xs"|"s"|"m"|"l"|"xl"|"2xl" (default "m"). align: "start"|"center"|"end"|"stretch"|"baseline". justify: "start"|"center"|"end"|"between"|"around"|"evenly".
|
|
101
|
+
Tabs(items: TabItem[]) — Tabbed container
|
|
102
|
+
TabItem(value: string, trigger: string, content: (TextContent | MarkDownRenderer | CardHeader | Callout | TextCallout | CodeBlock | Image | ImageBlock | ImageGallery | Separator | HorizontalBarChart | RadarChart | PieChart | RadialChart | SingleStackedBarChart | ScatterChart | AreaChart | BarChart | LineChart | Table | TagBlock | Form | Buttons | Steps)[]) — value is unique id, trigger is tab label, content is array of components
|
|
103
|
+
Accordion(items: AccordionItem[]) — Collapsible sections
|
|
104
|
+
AccordionItem(value: string, trigger: string, content: (TextContent | MarkDownRenderer | CardHeader | Callout | TextCallout | CodeBlock | Image | ImageBlock | ImageGallery | Separator | HorizontalBarChart | RadarChart | PieChart | RadialChart | SingleStackedBarChart | ScatterChart | AreaChart | BarChart | LineChart | Table | TagBlock | Form | Buttons | Steps)[]) — value is unique id, trigger is section title
|
|
105
|
+
Steps(items: StepsItem[]) — Step-by-step guide
|
|
106
|
+
StepsItem(title: string, details: string) — title and details text for one step
|
|
107
|
+
Carousel(children: (TextContent | MarkDownRenderer | CardHeader | Callout | TextCallout | CodeBlock | Image | ImageBlock | ImageGallery | Separator | HorizontalBarChart | RadarChart | PieChart | RadialChart | SingleStackedBarChart | ScatterChart | AreaChart | BarChart | LineChart | Table | TagBlock | Form | Buttons | Steps)[][], variant?: "card" | "sunk") — Horizontal scrollable carousel
|
|
108
|
+
Separator(orientation?: "horizontal" | "vertical", decorative?: boolean) — Visual divider between content sections
|
|
109
|
+
Modal(title: string, open?: $binding<boolean>, children: (TextContent | MarkDownRenderer | CardHeader | Callout | TextCallout | CodeBlock | Image | ImageBlock | ImageGallery | Separator | HorizontalBarChart | RadarChart | PieChart | RadialChart | SingleStackedBarChart | ScatterChart | AreaChart | BarChart | LineChart | Table | TagBlock | Form | Buttons | Steps)[], size?: "sm" | "md" | "lg") — Modal dialog. open is a reactive $boolean binding — set to true to open, X/Escape/backdrop auto-closes. Put Form with buttons inside children.
|
|
110
|
+
- For grid-like layouts, use Stack with direction "row" and wrap set to true.
|
|
111
|
+
- Prefer justify "start" (or omit justify) with wrap=true for stable columns instead of uneven gutters.
|
|
112
|
+
- Use nested Stacks when you need explicit rows/sections.
|
|
113
|
+
- Show/hide sections: $editId != "" ? Card([editForm]) : null
|
|
114
|
+
- Modal: Modal("Title", $showModal, [content]) — $showModal is boolean, X/Escape auto-closes. Put Form with its own buttons inside children.
|
|
115
|
+
- Use Tabs for alternative views (chart types, data sections) — no $variable needed
|
|
116
|
+
- Shared filter across Tabs: same $days binding in Query args works across all TabItems
|
|
117
|
+
|
|
118
|
+
Content:
|
|
119
|
+
Card(children: (TextContent | MarkDownRenderer | CardHeader | Callout | TextCallout | CodeBlock | Image | ImageBlock | ImageGallery | Separator | HorizontalBarChart | RadarChart | PieChart | RadialChart | SingleStackedBarChart | ScatterChart | AreaChart | BarChart | LineChart | Table | TagBlock | Form | Buttons | Steps | Tabs | Carousel | Stack)[], variant?: "card" | "sunk" | "clear", direction?: "row" | "column", gap?: "none" | "xs" | "s" | "m" | "l" | "xl" | "2xl", align?: "start" | "center" | "end" | "stretch" | "baseline", justify?: "start" | "center" | "end" | "between" | "around" | "evenly", wrap?: boolean) — Styled container. variant: "card" (default, elevated) | "sunk" (recessed) | "clear" (transparent). Always full width. Accepts all Stack flex params (default: direction "column"). Cards flex to share space in row/wrap layouts.
|
|
120
|
+
CardHeader(title?: string, subtitle?: string) — Header with optional title and subtitle
|
|
121
|
+
TextContent(text: string, size?: "small" | "default" | "large" | "small-heavy" | "large-heavy") — Text block. Supports markdown. Optional size: "small" | "default" | "large" | "small-heavy" | "large-heavy".
|
|
122
|
+
MarkDownRenderer(textMarkdown: string, variant?: "clear" | "card" | "sunk") — Renders markdown text with optional container variant
|
|
123
|
+
Callout(variant: "info" | "warning" | "error" | "success" | "neutral", title: string, description: string, visible?: $binding<boolean>) — Callout banner. Optional visible is a reactive $boolean — auto-dismisses after 3s by setting $visible to false.
|
|
124
|
+
TextCallout(variant?: "neutral" | "info" | "warning" | "success" | "danger", title?: string, description?: string) — Text callout with variant, title, and description
|
|
125
|
+
Image(alt: string, src?: string) — Image with alt text and optional URL
|
|
126
|
+
ImageBlock(src: string, alt?: string) — Image block with loading state
|
|
127
|
+
ImageGallery(images: {src: string, alt?: string, details?: string}[]) — Gallery grid of images with modal preview
|
|
128
|
+
CodeBlock(language: string, codeString: string) — Syntax-highlighted code block
|
|
129
|
+
- Use Cards to group related KPIs or sections. Stack with direction "row" for side-by-side layouts.
|
|
130
|
+
- Success toast: Callout("success", "Saved", "Done.", $showSuccess) — use @Set($showSuccess, true) in save action, auto-dismisses after 3s. For errors: result.status == "error" ? Callout("error", "Failed", result.error) : null
|
|
131
|
+
- KPI card: Card([TextContent("Label", "small"), TextContent("" + @Count(@Filter(data.rows, "field", "==", "value")), "large-heavy")])
|
|
132
|
+
|
|
133
|
+
Tables:
|
|
134
|
+
Table(columns: Col[]) — Data table — column-oriented. Each Col holds its own data array.
|
|
135
|
+
Col(label: string, data, type?: "string" | "number" | "action") — Column definition — holds label + data array
|
|
136
|
+
- Table is COLUMN-oriented: Table([Col("Label", dataArray), Col("Count", countArray, "number")]). Use array pluck for data: data.rows.fieldName
|
|
137
|
+
- Col data can be component arrays for styled cells: Col("Status", @Each(data.rows, "item", Tag(item.status, null, "sm", item.status == "open" ? "success" : "danger")))
|
|
138
|
+
- Row actions: Col("Actions", @Each(data.rows, "t", Button("Edit", Action([@Set($showEdit, true), @Set($editId, t.id)]))))
|
|
139
|
+
- Sortable: sorted = @Sort(data.rows, $sortField, "desc"). Bind $sortField to Select. Use sorted.fieldName for Col data
|
|
140
|
+
- Searchable: filtered = @Filter(data.rows, "title", "contains", $search). Bind $search to Input
|
|
141
|
+
- Chain sort + filter: filtered = @Filter(...) then sorted = @Sort(filtered, ...) — use sorted for both Table and Charts
|
|
142
|
+
- Empty state: @Count(data.rows) > 0 ? Table([...]) : TextContent("No data yet")
|
|
143
|
+
|
|
144
|
+
Charts (2D):
|
|
145
|
+
BarChart(labels: string[], series: Series[], variant?: "grouped" | "stacked", xLabel?: string, yLabel?: string) — Vertical bars; use for comparing values across categories with one or more series
|
|
146
|
+
LineChart(labels: string[], series: Series[], variant?: "linear" | "natural" | "step", xLabel?: string, yLabel?: string) — Lines over categories; use for trends and continuous data over time
|
|
147
|
+
AreaChart(labels: string[], series: Series[], variant?: "linear" | "natural" | "step", xLabel?: string, yLabel?: string) — Filled area under lines; use for cumulative totals or volume trends over time
|
|
148
|
+
RadarChart(labels: string[], series: Series[]) — Spider/web chart; use for comparing multiple variables across one or more entities
|
|
149
|
+
HorizontalBarChart(labels: string[], series: Series[], variant?: "grouped" | "stacked", xLabel?: string, yLabel?: string) — Horizontal bars; prefer when category labels are long or for ranked lists
|
|
150
|
+
Series(category: string, values: number[]) — One data series
|
|
151
|
+
- Charts accept column arrays: LineChart(labels, [Series("Name", values)]). Use array pluck: LineChart(data.rows.day, [Series("Views", data.rows.views)])
|
|
152
|
+
- Use Cards to wrap charts with CardHeader for titled sections
|
|
153
|
+
- Chart + Table from same source: use @Sort or @Filter result for both LineChart and Table Col data
|
|
154
|
+
- Multiple chart views: use Tabs — Tabs([TabItem("line", "Line", [LineChart(...)]), TabItem("bar", "Bar", [BarChart(...)])])
|
|
155
|
+
|
|
156
|
+
Charts (1D):
|
|
157
|
+
PieChart(labels: string[], values: number[], variant?: "pie" | "donut") — Circular slices; use plucked arrays: PieChart(data.categories, data.values)
|
|
158
|
+
RadialChart(labels: string[], values: number[]) — Radial bars; use plucked arrays: RadialChart(data.categories, data.values)
|
|
159
|
+
SingleStackedBarChart(labels: string[], values: number[]) — Single horizontal stacked bar; use plucked arrays: SingleStackedBarChart(data.categories, data.values)
|
|
160
|
+
Slice(category: string, value: number) — One slice with label and numeric value
|
|
161
|
+
- PieChart and BarChart need NUMBERS, not objects. For list data, use @Count(@Filter(...)) to aggregate:
|
|
162
|
+
- PieChart from list: \`PieChart(["Low", "Med", "High"], [@Count(@Filter(data.rows, "priority", "==", "low")), @Count(@Filter(data.rows, "priority", "==", "medium")), @Count(@Filter(data.rows, "priority", "==", "high"))], "donut")\`
|
|
163
|
+
- KPI from count: \`TextContent("" + @Count(@Filter(data.rows, "status", "==", "open")), "large-heavy")\`
|
|
164
|
+
|
|
165
|
+
Charts (Scatter):
|
|
166
|
+
ScatterChart(datasets: ScatterSeries[], xLabel?: string, yLabel?: string) — X/Y scatter plot; use for correlations, distributions, and clustering
|
|
167
|
+
ScatterSeries(name: string, points: Point[]) — Named dataset
|
|
168
|
+
Point(x: number, y: number, z?: number) — Data point with numeric coordinates
|
|
169
|
+
|
|
170
|
+
Data Display:
|
|
171
|
+
TagBlock(tags: string[]) — tags is an array of strings
|
|
172
|
+
Tag(text: string, icon?: string, size?: "sm" | "md" | "lg", variant?: "neutral" | "info" | "success" | "warning" | "danger") — Styled tag/badge with optional icon and variant
|
|
173
|
+
- Color-mapped Tag: Tag(value, null, "sm", value == "high" ? "danger" : value == "medium" ? "warning" : "neutral")`
|
|
174
|
+
);
|
|
175
|
+
openui.addSection(
|
|
176
|
+
OPENUI_BUILTIN_FUNCTIONS_TAG,
|
|
177
|
+
import_dedent.default`
|
|
178
|
+
Data functions prefixed with \`@\` to distinguish from components. These are the ONLY functions available — do NOT invent new ones.
|
|
179
|
+
Use @-prefixed built-in functions (@Count, @Sum, @Avg, @Min, @Max, @Round) on Query results — do NOT hardcode computed values.
|
|
180
|
+
|
|
181
|
+
@Count(array) → number — Returns array length
|
|
182
|
+
@First(array) → element — Returns first element of array
|
|
183
|
+
@Last(array) → element — Returns last element of array
|
|
184
|
+
@Sum(numbers[]) → number — Sum of numeric array
|
|
185
|
+
@Avg(numbers[]) → number — Average of numeric array
|
|
186
|
+
@Min(numbers[]) → number — Minimum value in array
|
|
187
|
+
@Max(numbers[]) → number — Maximum value in array
|
|
188
|
+
@Sort(array, field, direction?) → sorted array — Sort array by field. Direction: "asc" (default) or "desc"
|
|
189
|
+
@Filter(array, field, operator: "==" | "!=" | ">" | "<" | ">=" | "<=" | "contains", value) → filtered array — Filter array by field value
|
|
190
|
+
@Round(number, decimals?) → number — Round to N decimal places (default 0)
|
|
191
|
+
@Abs(number) → number — Absolute value
|
|
192
|
+
@Floor(number) → number — Round down to nearest integer
|
|
193
|
+
@Ceil(number) → number — Round up to nearest integer
|
|
194
|
+
@Each(array, varName, template) — Evaluate template for each element. varName is the loop variable — use it ONLY inside the template expression (inline). Do NOT create a separate statement for the template.
|
|
195
|
+
|
|
196
|
+
Builtins compose — output of one is input to the next:
|
|
197
|
+
\`@Count(@Filter(data.rows, "field", "==", "val"))\` for KPIs/chart values, \`@Round(@Avg(data.rows.score), 1)\`, \`@Each(data.rows, "item", Comp(item.field))\` for per-item rendering.
|
|
198
|
+
Array pluck: \`data.rows.field\` extracts a field from every row → use with @Sum, @Avg, charts, tables.
|
|
199
|
+
|
|
200
|
+
IMPORTANT @Each rule: The loop variable (e.g. "item") is ONLY available inside the @Each template expression. Always inline the template — do NOT extract it to a separate statement.
|
|
201
|
+
CORRECT: \`Col("Actions", @Each(rows, "t", Button("Edit", Action([@Set($id, t.id)]))))\`
|
|
202
|
+
WRONG: \`myBtn = Button("Edit", Action([@Set($id, t.id)]))\` then \`Col("Actions", @Each(rows, "t", myBtn))\` — t is undefined in myBtn.`
|
|
203
|
+
);
|
|
204
|
+
openui.addSection(
|
|
205
|
+
OPENUI_HOISTING_AND_STREAMING_TAG,
|
|
206
|
+
import_dedent.default`
|
|
207
|
+
openui-lang supports hoisting: a reference can be used BEFORE it is defined. The parser resolves all references after the full input is parsed.
|
|
208
|
+
|
|
209
|
+
During streaming, the output is re-parsed on every chunk. Undefined references are temporarily unresolved and appear once their definitions stream in. This creates a progressive top-down reveal — structure first, then data fills in.
|
|
210
|
+
|
|
211
|
+
Recommended statement order for optimal streaming:
|
|
212
|
+
1. \`root = Stack(...)\` — UI shell appears immediately
|
|
213
|
+
2. $variable declarations — state ready for bindings
|
|
214
|
+
3. Query statements — defaults resolve immediately so components render with data
|
|
215
|
+
4. Component definitions — fill in with data already available
|
|
216
|
+
5. Data values — leaf content last
|
|
217
|
+
|
|
218
|
+
Always write the root = Stack(...) statement first so the UI shell appears immediately, even before child data has streamed in.`
|
|
219
|
+
);
|
|
220
|
+
openui.addSection(
|
|
221
|
+
OPENUI_EXAMPLES_TAG,
|
|
222
|
+
import_dedent.default`
|
|
223
|
+
Example 1 — Table (column-oriented):
|
|
224
|
+
|
|
225
|
+
root = Stack([title, tbl])
|
|
226
|
+
title = TextContent("Top Languages", "large-heavy")
|
|
227
|
+
tbl = Table([Col("Language", langs), Col("Users (M)", users), Col("Year", years)])
|
|
228
|
+
langs = ["Python", "JavaScript", "Java", "TypeScript", "Go"]
|
|
229
|
+
users = [15.7, 14.2, 12.1, 8.5, 5.2]
|
|
230
|
+
years = [1991, 1995, 1995, 2012, 2009]
|
|
231
|
+
|
|
232
|
+
Example 2 — Bar chart:
|
|
233
|
+
|
|
234
|
+
root = Stack([title, chart])
|
|
235
|
+
title = TextContent("Q4 Revenue", "large-heavy")
|
|
236
|
+
chart = BarChart(labels, [s1, s2], "grouped")
|
|
237
|
+
labels = ["Oct", "Nov", "Dec"]
|
|
238
|
+
s1 = Series("Product A", [120, 150, 180])
|
|
239
|
+
s2 = Series("Product B", [90, 110, 140])
|
|
240
|
+
|
|
241
|
+
Example 3 — Form with validation:
|
|
242
|
+
|
|
243
|
+
root = Stack([title, form])
|
|
244
|
+
title = TextContent("Contact Us", "large-heavy")
|
|
245
|
+
form = Form("contact", btns, [nameField, emailField, countryField, msgField])
|
|
246
|
+
nameField = FormControl("Name", Input("name", "Your name", "text", { required: true, minLength: 2 }))
|
|
247
|
+
emailField = FormControl("Email", Input("email", "you@example.com", "email", { required: true, email: true }))
|
|
248
|
+
countryField = FormControl("Country", Select("country", countryOpts, "Select...", { required: true }))
|
|
249
|
+
msgField = FormControl("Message", TextArea("message", "Tell us more...", 4, { required: true, minLength: 10 }))
|
|
250
|
+
countryOpts = [SelectItem("us", "United States"), SelectItem("uk", "United Kingdom"), SelectItem("de", "Germany")]
|
|
251
|
+
btns = Buttons([Button("Submit", Action([@ToAssistant("Submit")]), "primary"), Button("Cancel", Action([@ToAssistant("Cancel")]), "secondary")])
|
|
252
|
+
|
|
253
|
+
Example 4 — Tabs with mixed content:
|
|
254
|
+
|
|
255
|
+
root = Stack([title, tabs])
|
|
256
|
+
title = TextContent("React vs Vue", "large-heavy")
|
|
257
|
+
tabs = Tabs([tabReact, tabVue])
|
|
258
|
+
tabReact = TabItem("react", "React", reactContent)
|
|
259
|
+
tabVue = TabItem("vue", "Vue", vueContent)
|
|
260
|
+
reactContent = [TextContent("React is a library by Meta for building UIs."), Callout("info", "Note", "React uses JSX syntax.")]
|
|
261
|
+
vueContent = [TextContent("Vue is a progressive framework by Evan You."), Callout("success", "Tip", "Vue has a gentle learning curve.")]`
|
|
262
|
+
);
|
|
263
|
+
openui.addSection(
|
|
264
|
+
OPENUI_IMPORTANT_RULES_TAG,
|
|
265
|
+
import_dedent.default`
|
|
266
|
+
- When asked about data, generate realistic/plausible data
|
|
267
|
+
- Choose components that best represent the content (tables for comparisons, charts for trends, forms for input, etc.)
|
|
268
|
+
- When you render data in an openui block (tables, charts, KPI cards), do NOT repeat the same numbers/facts in the markdown text outside the block.
|
|
269
|
+
- Text outside the openui block can optionally include:
|
|
270
|
+
1. **Qualitative insights** — patterns, anomalies, or recommendations that aren't obvious from the visual (e.g. "the high input-to-output ratio suggests document processing")
|
|
271
|
+
2. **Actionable next steps** — what the user can do next
|
|
272
|
+
3. **Caveats/context** — things the data doesn't show
|
|
273
|
+
- If all the information is already visible in the openui components, a brief one-line summary is sufficient — do not enumerate the same values again.`
|
|
274
|
+
);
|
|
275
|
+
openui.addSection(
|
|
276
|
+
OPENUI_FINAL_VERIFICATION_TAG,
|
|
277
|
+
import_dedent.default`
|
|
278
|
+
Before finishing, walk your output and verify:
|
|
279
|
+
1. root = Stack(...) is the FIRST line (for optimal streaming).
|
|
280
|
+
2. Every referenced name is defined. Every defined name (other than root) is reachable from root.
|
|
281
|
+
|
|
282
|
+
- For grid-like layouts, use Stack with direction "row" and wrap=true. Avoid justify="between" unless you specifically want large gutters.
|
|
283
|
+
- For forms, define one FormControl reference per field so controls can stream progressively.
|
|
284
|
+
- For forms, always provide the second Form argument with Buttons(...) actions: Form(name, buttons, fields).
|
|
285
|
+
- Never nest Form inside Form.
|
|
286
|
+
- Use @Reset($var1, $var2) after form submit to restore defaults — not @Set($var, "")
|
|
287
|
+
- Multi-query refresh: Action([@Run(mutation), @Run(query1), @Run(query2), @Reset(...)])
|
|
288
|
+
- $variables are reactive: changing via Select or @Set re-evaluates all Queries and expressions referencing them
|
|
289
|
+
- Use existing components (Tabs, Accordion, Modal) before inventing ternary show/hide patterns`
|
|
290
|
+
);
|
|
291
|
+
openui.addSection(
|
|
292
|
+
OPENUI_USER_INTERACTION_CHECKLIST_TAG,
|
|
293
|
+
import_dedent.default`
|
|
294
|
+
1. Will the response be UI heavy and will contain components which are not supported by markdown? Use openui if the answer is yes.
|
|
295
|
+
2. \`\`\`openui\`\`\` fencing must be closed.`
|
|
296
|
+
);
|
|
297
|
+
}
|
|
298
|
+
function renderOpenUIPrompt() {
|
|
299
|
+
const root = new import_InstructionBuilder.InstructionBuilder("_openui_render");
|
|
300
|
+
buildOpenUIInstruction(root);
|
|
301
|
+
const wrapped = root.build();
|
|
302
|
+
const openTag = `<${OPENUI_SECTION_TAG}>`;
|
|
303
|
+
const closeTag = `</${OPENUI_SECTION_TAG}>`;
|
|
304
|
+
const start = wrapped.indexOf(openTag);
|
|
305
|
+
const end = wrapped.lastIndexOf(closeTag);
|
|
306
|
+
if (start === -1 || end === -1) {
|
|
307
|
+
throw new Error("Failed to render OpenUI prompt from buildOpenUIInstruction");
|
|
308
|
+
}
|
|
309
|
+
return wrapped.slice(start, end + closeTag.length);
|
|
310
|
+
}
|
|
311
|
+
function buildOpenUIDeferredInstruction(builder) {
|
|
312
|
+
builder.addSection(
|
|
313
|
+
OPENUI_SECTION_TAG,
|
|
314
|
+
import_dedent.default`
|
|
315
|
+
The Agent can render interactive UI that markdown cannot express by emitting a fenced \`\`\`openui block.
|
|
316
|
+
|
|
317
|
+
Before writing any \`\`\`openui fence, the Agent MUST call ${GET_OPENUI_INSTRUCTIONS_TOOL_NAME} with arguments {}.
|
|
318
|
+
Do not invent OpenUI syntax or component APIs without loading those instructions.
|
|
319
|
+
|
|
320
|
+
Use OpenUI only when the response is UI-heavy and needs components markdown does not support.
|
|
321
|
+
`.trim()
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
var OpenUIInstructions = class extends import_LocalToolMCP.LocalToolMCP {
|
|
325
|
+
name = OPENUI_SERVER_ID;
|
|
326
|
+
displayName = "OpenUI";
|
|
327
|
+
constructor(tracing) {
|
|
328
|
+
super({ tracing });
|
|
329
|
+
}
|
|
330
|
+
tools = [
|
|
331
|
+
(0, import_LocalToolMCP.defineTool)({
|
|
332
|
+
name: GET_OPENUI_INSTRUCTIONS_TOOL_NAME,
|
|
333
|
+
description: [
|
|
334
|
+
"Load the full OpenUI generative-UI authoring instructions (syntax, components, builtins, examples, rules).",
|
|
335
|
+
"Call this before emitting any ```openui fenced block. Pass an empty object as arguments: {}."
|
|
336
|
+
].join(" "),
|
|
337
|
+
schema: getOpenUIInstructionsInputSchema,
|
|
338
|
+
handler: () => Promise.resolve((0, import_IMCPServer.toolResultResponse)({ text: renderOpenUIPrompt() }))
|
|
339
|
+
})
|
|
340
|
+
];
|
|
341
|
+
getTools() {
|
|
342
|
+
return this.tools;
|
|
343
|
+
}
|
|
344
|
+
};
|
|
345
|
+
function openUI(options) {
|
|
346
|
+
const preload = options?.preload ?? true;
|
|
347
|
+
if (preload) {
|
|
348
|
+
return {
|
|
349
|
+
instructionBuilders: [buildOpenUIInstruction]
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
return {
|
|
353
|
+
systemToolSets: [new OpenUIInstructions(options?.tracing ?? import_NoopAgentTracing.NOOP_AGENT_TRACING)],
|
|
354
|
+
instructionBuilders: [buildOpenUIDeferredInstruction]
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
358
|
+
0 && (module.exports = {
|
|
359
|
+
GET_OPENUI_INSTRUCTIONS_TOOL_NAME,
|
|
360
|
+
OPENUI_BUILTIN_FUNCTIONS_TAG,
|
|
361
|
+
OPENUI_COMPONENT_SIGNATURES_TAG,
|
|
362
|
+
OPENUI_EXAMPLES_TAG,
|
|
363
|
+
OPENUI_FINAL_VERIFICATION_TAG,
|
|
364
|
+
OPENUI_HOISTING_AND_STREAMING_TAG,
|
|
365
|
+
OPENUI_IMPORTANT_RULES_TAG,
|
|
366
|
+
OPENUI_MARKDOWN_FENCING_TAG,
|
|
367
|
+
OPENUI_SECTION_TAG,
|
|
368
|
+
OPENUI_SERVER_ID,
|
|
369
|
+
OPENUI_SYNTAX_RULES_TAG,
|
|
370
|
+
OPENUI_USER_INTERACTION_CHECKLIST_TAG,
|
|
371
|
+
OpenUIInstructions,
|
|
372
|
+
buildOpenUIInstruction,
|
|
373
|
+
openUI,
|
|
374
|
+
renderOpenUIPrompt
|
|
375
|
+
});
|
|
376
|
+
//# sourceMappingURL=OpenUI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/capabilities/builtins/OpenUI.ts"],"sourcesContent":["import dedent from 'dedent';\nimport { z } from 'zod';\nimport { InstructionBuilder } from '../../InstructionBuilder';\nimport { toolResultResponse } from '../../mcp/IMCPServer';\nimport { defineTool, LocalToolMCP, type ToolDefinition } from '../../mcp/LocalToolMCP';\nimport type { AgentTracing } from '../../tracing/AgentTracing';\nimport { NOOP_AGENT_TRACING } from '../../tracing/NoopAgentTracing';\nimport type { AgentCapability } from '../AgentCapability';\n\nexport const OPENUI_SERVER_ID = 'openui';\nexport const GET_OPENUI_INSTRUCTIONS_TOOL_NAME = 'get_openui_instructions';\n\nconst getOpenUIInstructionsInputSchema = z.object({}).strict();\n\nexport const OPENUI_SECTION_TAG = 'openui';\nexport const OPENUI_MARKDOWN_FENCING_TAG = 'openui-markdown-fencing';\nexport const OPENUI_SYNTAX_RULES_TAG = 'openui-syntax-rules';\nexport const OPENUI_COMPONENT_SIGNATURES_TAG = 'openui-component-signatures';\nexport const OPENUI_BUILTIN_FUNCTIONS_TAG = 'openui-builtin-functions';\nexport const OPENUI_HOISTING_AND_STREAMING_TAG = 'openui-hoisting-and-streaming';\nexport const OPENUI_EXAMPLES_TAG = 'openui-examples';\nexport const OPENUI_IMPORTANT_RULES_TAG = 'openui-important-rules';\nexport const OPENUI_FINAL_VERIFICATION_TAG = 'openui-final-verification';\nexport const OPENUI_USER_INTERACTION_CHECKLIST_TAG = 'openui-user-interaction-checklist';\n\nexport function buildOpenUIInstruction(builder: InstructionBuilder): void {\n const openui = builder.beginSection(OPENUI_SECTION_TAG);\n\n openui.addSection(\n OPENUI_MARKDOWN_FENCING_TAG,\n dedent`\n All openui, code must be fenced within openui block.\n \\`\\`\\`openui\n code\n \\`\\`\\``,\n );\n\n openui.addSection(\n OPENUI_SYNTAX_RULES_TAG,\n dedent`\n 1. Each statement is on its own line: \\`identifier = Expression\\`\n 2. \\`root\\` is the entry point — every program must define \\`root = Stack(...)\\`\n 3. Expressions are: strings (\"...\"), numbers, booleans (true/false), null, arrays ([...]), objects ({...}), or component calls TypeName(arg1, arg2, ...)\n 4. Use references for readability: define \\`name = ...\\` on one line, then use \\`name\\` later\n 5. EVERY variable (except root) MUST be referenced by at least one other variable. Unreferenced variables are silently dropped and will NOT render. Always include defined variables in their parent's children/items array.\n 6. Arguments are POSITIONAL (order matters, not names). Write \\`Stack([children], \"row\", \"l\")\\` NOT \\`Stack([children], direction: \"row\", gap: \"l\")\\` — colon syntax is NOT supported and silently breaks\n 7. Optional arguments can be omitted from the end\n - Strings use double quotes with backslash escaping`,\n );\n\n openui.addSection(\n OPENUI_COMPONENT_SIGNATURES_TAG,\n dedent`\n Arguments marked with ? are optional. Sub-components can be inline or referenced; prefer references for better streaming.\n Props typed \\`ActionExpression\\` accept an Action([@steps...]) expression. See the Action section for available steps (@ToAssistant, @OpenUrl).\n Props marked \\`$binding<type>\\` accept a \\`$variable\\` reference for two-way binding.\n\n Layout:\n Stack([children], direction?: \"row\" | \"column\", gap?: \"none\" | \"xs\" | \"s\" | \"m\" | \"l\" | \"xl\" | \"2xl\", align?: \"start\" | \"center\" | \"end\" | \"stretch\" | \"baseline\", justify?: \"start\" | \"center\" | \"end\" | \"between\" | \"around\" | \"evenly\", wrap?: boolean) — Flex container. direction: \"row\"|\"column\" (default \"column\"). gap: \"none\"|\"xs\"|\"s\"|\"m\"|\"l\"|\"xl\"|\"2xl\" (default \"m\"). align: \"start\"|\"center\"|\"end\"|\"stretch\"|\"baseline\". justify: \"start\"|\"center\"|\"end\"|\"between\"|\"around\"|\"evenly\".\n Tabs(items: TabItem[]) — Tabbed container\n TabItem(value: string, trigger: string, content: (TextContent | MarkDownRenderer | CardHeader | Callout | TextCallout | CodeBlock | Image | ImageBlock | ImageGallery | Separator | HorizontalBarChart | RadarChart | PieChart | RadialChart | SingleStackedBarChart | ScatterChart | AreaChart | BarChart | LineChart | Table | TagBlock | Form | Buttons | Steps)[]) — value is unique id, trigger is tab label, content is array of components\n Accordion(items: AccordionItem[]) — Collapsible sections\n AccordionItem(value: string, trigger: string, content: (TextContent | MarkDownRenderer | CardHeader | Callout | TextCallout | CodeBlock | Image | ImageBlock | ImageGallery | Separator | HorizontalBarChart | RadarChart | PieChart | RadialChart | SingleStackedBarChart | ScatterChart | AreaChart | BarChart | LineChart | Table | TagBlock | Form | Buttons | Steps)[]) — value is unique id, trigger is section title\n Steps(items: StepsItem[]) — Step-by-step guide\n StepsItem(title: string, details: string) — title and details text for one step\n Carousel(children: (TextContent | MarkDownRenderer | CardHeader | Callout | TextCallout | CodeBlock | Image | ImageBlock | ImageGallery | Separator | HorizontalBarChart | RadarChart | PieChart | RadialChart | SingleStackedBarChart | ScatterChart | AreaChart | BarChart | LineChart | Table | TagBlock | Form | Buttons | Steps)[][], variant?: \"card\" | \"sunk\") — Horizontal scrollable carousel\n Separator(orientation?: \"horizontal\" | \"vertical\", decorative?: boolean) — Visual divider between content sections\n Modal(title: string, open?: $binding<boolean>, children: (TextContent | MarkDownRenderer | CardHeader | Callout | TextCallout | CodeBlock | Image | ImageBlock | ImageGallery | Separator | HorizontalBarChart | RadarChart | PieChart | RadialChart | SingleStackedBarChart | ScatterChart | AreaChart | BarChart | LineChart | Table | TagBlock | Form | Buttons | Steps)[], size?: \"sm\" | \"md\" | \"lg\") — Modal dialog. open is a reactive $boolean binding — set to true to open, X/Escape/backdrop auto-closes. Put Form with buttons inside children.\n - For grid-like layouts, use Stack with direction \"row\" and wrap set to true.\n - Prefer justify \"start\" (or omit justify) with wrap=true for stable columns instead of uneven gutters.\n - Use nested Stacks when you need explicit rows/sections.\n - Show/hide sections: $editId != \"\" ? Card([editForm]) : null\n - Modal: Modal(\"Title\", $showModal, [content]) — $showModal is boolean, X/Escape auto-closes. Put Form with its own buttons inside children.\n - Use Tabs for alternative views (chart types, data sections) — no $variable needed\n - Shared filter across Tabs: same $days binding in Query args works across all TabItems\n\n Content:\n Card(children: (TextContent | MarkDownRenderer | CardHeader | Callout | TextCallout | CodeBlock | Image | ImageBlock | ImageGallery | Separator | HorizontalBarChart | RadarChart | PieChart | RadialChart | SingleStackedBarChart | ScatterChart | AreaChart | BarChart | LineChart | Table | TagBlock | Form | Buttons | Steps | Tabs | Carousel | Stack)[], variant?: \"card\" | \"sunk\" | \"clear\", direction?: \"row\" | \"column\", gap?: \"none\" | \"xs\" | \"s\" | \"m\" | \"l\" | \"xl\" | \"2xl\", align?: \"start\" | \"center\" | \"end\" | \"stretch\" | \"baseline\", justify?: \"start\" | \"center\" | \"end\" | \"between\" | \"around\" | \"evenly\", wrap?: boolean) — Styled container. variant: \"card\" (default, elevated) | \"sunk\" (recessed) | \"clear\" (transparent). Always full width. Accepts all Stack flex params (default: direction \"column\"). Cards flex to share space in row/wrap layouts.\n CardHeader(title?: string, subtitle?: string) — Header with optional title and subtitle\n TextContent(text: string, size?: \"small\" | \"default\" | \"large\" | \"small-heavy\" | \"large-heavy\") — Text block. Supports markdown. Optional size: \"small\" | \"default\" | \"large\" | \"small-heavy\" | \"large-heavy\".\n MarkDownRenderer(textMarkdown: string, variant?: \"clear\" | \"card\" | \"sunk\") — Renders markdown text with optional container variant\n Callout(variant: \"info\" | \"warning\" | \"error\" | \"success\" | \"neutral\", title: string, description: string, visible?: $binding<boolean>) — Callout banner. Optional visible is a reactive $boolean — auto-dismisses after 3s by setting $visible to false.\n TextCallout(variant?: \"neutral\" | \"info\" | \"warning\" | \"success\" | \"danger\", title?: string, description?: string) — Text callout with variant, title, and description\n Image(alt: string, src?: string) — Image with alt text and optional URL\n ImageBlock(src: string, alt?: string) — Image block with loading state\n ImageGallery(images: {src: string, alt?: string, details?: string}[]) — Gallery grid of images with modal preview\n CodeBlock(language: string, codeString: string) — Syntax-highlighted code block\n - Use Cards to group related KPIs or sections. Stack with direction \"row\" for side-by-side layouts.\n - Success toast: Callout(\"success\", \"Saved\", \"Done.\", $showSuccess) — use @Set($showSuccess, true) in save action, auto-dismisses after 3s. For errors: result.status == \"error\" ? Callout(\"error\", \"Failed\", result.error) : null\n - KPI card: Card([TextContent(\"Label\", \"small\"), TextContent(\"\" + @Count(@Filter(data.rows, \"field\", \"==\", \"value\")), \"large-heavy\")])\n\n Tables:\n Table(columns: Col[]) — Data table — column-oriented. Each Col holds its own data array.\n Col(label: string, data, type?: \"string\" | \"number\" | \"action\") — Column definition — holds label + data array\n - Table is COLUMN-oriented: Table([Col(\"Label\", dataArray), Col(\"Count\", countArray, \"number\")]). Use array pluck for data: data.rows.fieldName\n - Col data can be component arrays for styled cells: Col(\"Status\", @Each(data.rows, \"item\", Tag(item.status, null, \"sm\", item.status == \"open\" ? \"success\" : \"danger\")))\n - Row actions: Col(\"Actions\", @Each(data.rows, \"t\", Button(\"Edit\", Action([@Set($showEdit, true), @Set($editId, t.id)]))))\n - Sortable: sorted = @Sort(data.rows, $sortField, \"desc\"). Bind $sortField to Select. Use sorted.fieldName for Col data\n - Searchable: filtered = @Filter(data.rows, \"title\", \"contains\", $search). Bind $search to Input\n - Chain sort + filter: filtered = @Filter(...) then sorted = @Sort(filtered, ...) — use sorted for both Table and Charts\n - Empty state: @Count(data.rows) > 0 ? Table([...]) : TextContent(\"No data yet\")\n\n Charts (2D):\n BarChart(labels: string[], series: Series[], variant?: \"grouped\" | \"stacked\", xLabel?: string, yLabel?: string) — Vertical bars; use for comparing values across categories with one or more series\n LineChart(labels: string[], series: Series[], variant?: \"linear\" | \"natural\" | \"step\", xLabel?: string, yLabel?: string) — Lines over categories; use for trends and continuous data over time\n AreaChart(labels: string[], series: Series[], variant?: \"linear\" | \"natural\" | \"step\", xLabel?: string, yLabel?: string) — Filled area under lines; use for cumulative totals or volume trends over time\n RadarChart(labels: string[], series: Series[]) — Spider/web chart; use for comparing multiple variables across one or more entities\n HorizontalBarChart(labels: string[], series: Series[], variant?: \"grouped\" | \"stacked\", xLabel?: string, yLabel?: string) — Horizontal bars; prefer when category labels are long or for ranked lists\n Series(category: string, values: number[]) — One data series\n - Charts accept column arrays: LineChart(labels, [Series(\"Name\", values)]). Use array pluck: LineChart(data.rows.day, [Series(\"Views\", data.rows.views)])\n - Use Cards to wrap charts with CardHeader for titled sections\n - Chart + Table from same source: use @Sort or @Filter result for both LineChart and Table Col data\n - Multiple chart views: use Tabs — Tabs([TabItem(\"line\", \"Line\", [LineChart(...)]), TabItem(\"bar\", \"Bar\", [BarChart(...)])])\n\n Charts (1D):\n PieChart(labels: string[], values: number[], variant?: \"pie\" | \"donut\") — Circular slices; use plucked arrays: PieChart(data.categories, data.values)\n RadialChart(labels: string[], values: number[]) — Radial bars; use plucked arrays: RadialChart(data.categories, data.values)\n SingleStackedBarChart(labels: string[], values: number[]) — Single horizontal stacked bar; use plucked arrays: SingleStackedBarChart(data.categories, data.values)\n Slice(category: string, value: number) — One slice with label and numeric value\n - PieChart and BarChart need NUMBERS, not objects. For list data, use @Count(@Filter(...)) to aggregate:\n - PieChart from list: \\`PieChart([\"Low\", \"Med\", \"High\"], [@Count(@Filter(data.rows, \"priority\", \"==\", \"low\")), @Count(@Filter(data.rows, \"priority\", \"==\", \"medium\")), @Count(@Filter(data.rows, \"priority\", \"==\", \"high\"))], \"donut\")\\`\n - KPI from count: \\`TextContent(\"\" + @Count(@Filter(data.rows, \"status\", \"==\", \"open\")), \"large-heavy\")\\`\n\n Charts (Scatter):\n ScatterChart(datasets: ScatterSeries[], xLabel?: string, yLabel?: string) — X/Y scatter plot; use for correlations, distributions, and clustering\n ScatterSeries(name: string, points: Point[]) — Named dataset\n Point(x: number, y: number, z?: number) — Data point with numeric coordinates\n\n Data Display:\n TagBlock(tags: string[]) — tags is an array of strings\n Tag(text: string, icon?: string, size?: \"sm\" | \"md\" | \"lg\", variant?: \"neutral\" | \"info\" | \"success\" | \"warning\" | \"danger\") — Styled tag/badge with optional icon and variant\n - Color-mapped Tag: Tag(value, null, \"sm\", value == \"high\" ? \"danger\" : value == \"medium\" ? \"warning\" : \"neutral\")`,\n );\n\n openui.addSection(\n OPENUI_BUILTIN_FUNCTIONS_TAG,\n dedent`\n Data functions prefixed with \\`@\\` to distinguish from components. These are the ONLY functions available — do NOT invent new ones.\n Use @-prefixed built-in functions (@Count, @Sum, @Avg, @Min, @Max, @Round) on Query results — do NOT hardcode computed values.\n\n @Count(array) → number — Returns array length\n @First(array) → element — Returns first element of array\n @Last(array) → element — Returns last element of array\n @Sum(numbers[]) → number — Sum of numeric array\n @Avg(numbers[]) → number — Average of numeric array\n @Min(numbers[]) → number — Minimum value in array\n @Max(numbers[]) → number — Maximum value in array\n @Sort(array, field, direction?) → sorted array — Sort array by field. Direction: \"asc\" (default) or \"desc\"\n @Filter(array, field, operator: \"==\" | \"!=\" | \">\" | \"<\" | \">=\" | \"<=\" | \"contains\", value) → filtered array — Filter array by field value\n @Round(number, decimals?) → number — Round to N decimal places (default 0)\n @Abs(number) → number — Absolute value\n @Floor(number) → number — Round down to nearest integer\n @Ceil(number) → number — Round up to nearest integer\n @Each(array, varName, template) — Evaluate template for each element. varName is the loop variable — use it ONLY inside the template expression (inline). Do NOT create a separate statement for the template.\n\n Builtins compose — output of one is input to the next:\n \\`@Count(@Filter(data.rows, \"field\", \"==\", \"val\"))\\` for KPIs/chart values, \\`@Round(@Avg(data.rows.score), 1)\\`, \\`@Each(data.rows, \"item\", Comp(item.field))\\` for per-item rendering.\n Array pluck: \\`data.rows.field\\` extracts a field from every row → use with @Sum, @Avg, charts, tables.\n\n IMPORTANT @Each rule: The loop variable (e.g. \"item\") is ONLY available inside the @Each template expression. Always inline the template — do NOT extract it to a separate statement.\n CORRECT: \\`Col(\"Actions\", @Each(rows, \"t\", Button(\"Edit\", Action([@Set($id, t.id)]))))\\`\n WRONG: \\`myBtn = Button(\"Edit\", Action([@Set($id, t.id)]))\\` then \\`Col(\"Actions\", @Each(rows, \"t\", myBtn))\\` — t is undefined in myBtn.`,\n );\n\n openui.addSection(\n OPENUI_HOISTING_AND_STREAMING_TAG,\n dedent`\n openui-lang supports hoisting: a reference can be used BEFORE it is defined. The parser resolves all references after the full input is parsed.\n\n During streaming, the output is re-parsed on every chunk. Undefined references are temporarily unresolved and appear once their definitions stream in. This creates a progressive top-down reveal — structure first, then data fills in.\n\n Recommended statement order for optimal streaming:\n 1. \\`root = Stack(...)\\` — UI shell appears immediately\n 2. $variable declarations — state ready for bindings\n 3. Query statements — defaults resolve immediately so components render with data\n 4. Component definitions — fill in with data already available\n 5. Data values — leaf content last\n\n Always write the root = Stack(...) statement first so the UI shell appears immediately, even before child data has streamed in.`,\n );\n\n openui.addSection(\n OPENUI_EXAMPLES_TAG,\n dedent`\n Example 1 — Table (column-oriented):\n\n root = Stack([title, tbl])\n title = TextContent(\"Top Languages\", \"large-heavy\")\n tbl = Table([Col(\"Language\", langs), Col(\"Users (M)\", users), Col(\"Year\", years)])\n langs = [\"Python\", \"JavaScript\", \"Java\", \"TypeScript\", \"Go\"]\n users = [15.7, 14.2, 12.1, 8.5, 5.2]\n years = [1991, 1995, 1995, 2012, 2009]\n\n Example 2 — Bar chart:\n\n root = Stack([title, chart])\n title = TextContent(\"Q4 Revenue\", \"large-heavy\")\n chart = BarChart(labels, [s1, s2], \"grouped\")\n labels = [\"Oct\", \"Nov\", \"Dec\"]\n s1 = Series(\"Product A\", [120, 150, 180])\n s2 = Series(\"Product B\", [90, 110, 140])\n\n Example 3 — Form with validation:\n\n root = Stack([title, form])\n title = TextContent(\"Contact Us\", \"large-heavy\")\n form = Form(\"contact\", btns, [nameField, emailField, countryField, msgField])\n nameField = FormControl(\"Name\", Input(\"name\", \"Your name\", \"text\", { required: true, minLength: 2 }))\n emailField = FormControl(\"Email\", Input(\"email\", \"you@example.com\", \"email\", { required: true, email: true }))\n countryField = FormControl(\"Country\", Select(\"country\", countryOpts, \"Select...\", { required: true }))\n msgField = FormControl(\"Message\", TextArea(\"message\", \"Tell us more...\", 4, { required: true, minLength: 10 }))\n countryOpts = [SelectItem(\"us\", \"United States\"), SelectItem(\"uk\", \"United Kingdom\"), SelectItem(\"de\", \"Germany\")]\n btns = Buttons([Button(\"Submit\", Action([@ToAssistant(\"Submit\")]), \"primary\"), Button(\"Cancel\", Action([@ToAssistant(\"Cancel\")]), \"secondary\")])\n\n Example 4 — Tabs with mixed content:\n\n root = Stack([title, tabs])\n title = TextContent(\"React vs Vue\", \"large-heavy\")\n tabs = Tabs([tabReact, tabVue])\n tabReact = TabItem(\"react\", \"React\", reactContent)\n tabVue = TabItem(\"vue\", \"Vue\", vueContent)\n reactContent = [TextContent(\"React is a library by Meta for building UIs.\"), Callout(\"info\", \"Note\", \"React uses JSX syntax.\")]\n vueContent = [TextContent(\"Vue is a progressive framework by Evan You.\"), Callout(\"success\", \"Tip\", \"Vue has a gentle learning curve.\")]`,\n );\n\n openui.addSection(\n OPENUI_IMPORTANT_RULES_TAG,\n dedent`\n - When asked about data, generate realistic/plausible data\n - Choose components that best represent the content (tables for comparisons, charts for trends, forms for input, etc.)\n - When you render data in an openui block (tables, charts, KPI cards), do NOT repeat the same numbers/facts in the markdown text outside the block.\n - Text outside the openui block can optionally include:\n 1. **Qualitative insights** — patterns, anomalies, or recommendations that aren't obvious from the visual (e.g. \"the high input-to-output ratio suggests document processing\")\n 2. **Actionable next steps** — what the user can do next\n 3. **Caveats/context** — things the data doesn't show\n - If all the information is already visible in the openui components, a brief one-line summary is sufficient — do not enumerate the same values again.`,\n );\n\n openui.addSection(\n OPENUI_FINAL_VERIFICATION_TAG,\n dedent`\n Before finishing, walk your output and verify:\n 1. root = Stack(...) is the FIRST line (for optimal streaming).\n 2. Every referenced name is defined. Every defined name (other than root) is reachable from root.\n\n - For grid-like layouts, use Stack with direction \"row\" and wrap=true. Avoid justify=\"between\" unless you specifically want large gutters.\n - For forms, define one FormControl reference per field so controls can stream progressively.\n - For forms, always provide the second Form argument with Buttons(...) actions: Form(name, buttons, fields).\n - Never nest Form inside Form.\n - Use @Reset($var1, $var2) after form submit to restore defaults — not @Set($var, \"\")\n - Multi-query refresh: Action([@Run(mutation), @Run(query1), @Run(query2), @Reset(...)])\n - $variables are reactive: changing via Select or @Set re-evaluates all Queries and expressions referencing them\n - Use existing components (Tabs, Accordion, Modal) before inventing ternary show/hide patterns`,\n );\n\n openui.addSection(\n OPENUI_USER_INTERACTION_CHECKLIST_TAG,\n dedent`\n 1. Will the response be UI heavy and will contain components which are not supported by markdown? Use openui if the answer is yes.\n 2. \\`\\`\\`openui\\`\\`\\` fencing must be closed.`,\n );\n}\n\n/** Renders the existing OpenUI prompt tree without duplicating section bodies. */\nexport function renderOpenUIPrompt(): string {\n const root = new InstructionBuilder('_openui_render');\n buildOpenUIInstruction(root);\n const wrapped = root.build();\n const openTag = `<${OPENUI_SECTION_TAG}>`;\n const closeTag = `</${OPENUI_SECTION_TAG}>`;\n const start = wrapped.indexOf(openTag);\n const end = wrapped.lastIndexOf(closeTag);\n if (start === -1 || end === -1) {\n throw new Error('Failed to render OpenUI prompt from buildOpenUIInstruction');\n }\n return wrapped.slice(start, end + closeTag.length);\n}\n\nfunction buildOpenUIDeferredInstruction(builder: InstructionBuilder): void {\n builder.addSection(\n OPENUI_SECTION_TAG,\n dedent`\n The Agent can render interactive UI that markdown cannot express by emitting a fenced \\`\\`\\`openui block.\n\n Before writing any \\`\\`\\`openui fence, the Agent MUST call ${GET_OPENUI_INSTRUCTIONS_TOOL_NAME} with arguments {}.\n Do not invent OpenUI syntax or component APIs without loading those instructions.\n\n Use OpenUI only when the response is UI-heavy and needs components markdown does not support.\n `.trim(),\n );\n}\n\nexport class OpenUIInstructions extends LocalToolMCP {\n readonly name = OPENUI_SERVER_ID;\n readonly displayName = 'OpenUI';\n\n constructor(tracing: AgentTracing) {\n super({ tracing });\n }\n\n private tools: ToolDefinition[] = [\n defineTool({\n name: GET_OPENUI_INSTRUCTIONS_TOOL_NAME,\n description: [\n 'Load the full OpenUI generative-UI authoring instructions (syntax, components, builtins, examples, rules).',\n 'Call this before emitting any ```openui fenced block. Pass an empty object as arguments: {}.',\n ].join(' '),\n schema: getOpenUIInstructionsInputSchema,\n handler: () => Promise.resolve(toolResultResponse({ text: renderOpenUIPrompt() })),\n }),\n ];\n\n protected getTools(): ToolDefinition[] {\n return this.tools;\n }\n}\n\nexport function openUI(options?: { preload?: boolean; tracing?: AgentTracing }): AgentCapability {\n const preload = options?.preload ?? true;\n if (preload) {\n return {\n instructionBuilders: [buildOpenUIInstruction],\n };\n }\n return {\n systemToolSets: [new OpenUIInstructions(options?.tracing ?? NOOP_AGENT_TRACING)],\n instructionBuilders: [buildOpenUIDeferredInstruction],\n };\n}\n"],"mappings":"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","names":["dedent"]}
|