feat: select explicit msglib receive source
This commit is contained in:
@@ -35,6 +35,10 @@ func RegisterISphereReadTools(server *mcp.Server, source ReceiveMessagesSource)
|
||||
}
|
||||
|
||||
func RegisterISphereReadToolsWithDisplayEntities(server *mcp.Server, source ReceiveMessagesSource, displaySource DisplayEntitySource) {
|
||||
RegisterISphereReadToolsWithReceiveSources(server, source, nil, displaySource)
|
||||
}
|
||||
|
||||
func RegisterISphereReadToolsWithReceiveSources(server *mcp.Server, source ReceiveMessagesSource, msglibSource ReceiveMessagesSource, displaySource DisplayEntitySource) {
|
||||
if source == nil {
|
||||
source = isphere.EncryptedPacketLogSource{}
|
||||
}
|
||||
@@ -43,11 +47,15 @@ func RegisterISphereReadToolsWithDisplayEntities(server *mcp.Server, source Rece
|
||||
Name: ToolNameReceiveMessages,
|
||||
Description: "Return iSphere messages from the configured read-only log-backed source.",
|
||||
}, func(ctx context.Context, _ *mcp.CallToolRequest, input ReceiveMessagesArgs) (*mcp.CallToolResult, map[string]any, error) {
|
||||
if err := validateReceiveMessagesArgs(input); err != nil {
|
||||
if err := validateReceiveMessagesCursor(input); err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
selectedSource, err := receiveMessagesSourceForPreference(input.SourcePreference, source, msglibSource)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
started := time.Now().UTC()
|
||||
result, err := source.ReceiveMessages(ctx, isphere.ReceiveMessagesQuery{
|
||||
result, err := selectedSource.ReceiveMessages(ctx, isphere.ReceiveMessagesQuery{
|
||||
ConversationID: input.ConversationID,
|
||||
Query: input.Query,
|
||||
Since: input.Since,
|
||||
@@ -71,8 +79,26 @@ func RegisterISphereReadToolsWithDisplayEntities(server *mcp.Server, source Rece
|
||||
})
|
||||
}
|
||||
|
||||
func validateReceiveMessagesArgs(input ReceiveMessagesArgs) error {
|
||||
return validateLocalReadonlySourceAndCursor(ToolNameReceiveMessages, input.SourcePreference, input.Cursor)
|
||||
func validateReceiveMessagesCursor(input ReceiveMessagesArgs) error {
|
||||
if strings.TrimSpace(input.Cursor) != "" {
|
||||
return fmt.Errorf("%s cursor pagination is not available yet", ToolNameReceiveMessages)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func receiveMessagesSourceForPreference(sourcePreferenceValue string, primarySource ReceiveMessagesSource, msglibSource ReceiveMessagesSource) (ReceiveMessagesSource, error) {
|
||||
sourcePreference := strings.ToLower(strings.TrimSpace(sourcePreferenceValue))
|
||||
switch sourcePreference {
|
||||
case "", "auto", "local_readonly":
|
||||
return primarySource, nil
|
||||
case "msglib_readonly":
|
||||
if msglibSource == nil {
|
||||
return nil, fmt.Errorf("%s source_preference %q is not configured", ToolNameReceiveMessages, sourcePreferenceValue)
|
||||
}
|
||||
return msglibSource, nil
|
||||
default:
|
||||
return nil, fmt.Errorf("%s source_preference %q is not available; only auto, local_readonly, and msglib_readonly are supported", ToolNameReceiveMessages, sourcePreferenceValue)
|
||||
}
|
||||
}
|
||||
|
||||
func validateLocalReadonlySourceAndCursor(toolName string, sourcePreferenceValue string, cursorValue string) error {
|
||||
|
||||
Reference in New Issue
Block a user