feat: select explicit msglib receive source

This commit is contained in:
zhaoyilun
2026-07-10 09:04:06 +08:00
parent 0820717767
commit 3f270b454f
6 changed files with 187 additions and 15 deletions

View File

@@ -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 {