v1

package
v0.80.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 1, 2026 License: MIT Imports: 68 Imported by: 0

Documentation

Overview

Package v1 - duplicate detection handlers for P2-C002.

Package v1 - knowledge graph handlers for P3-C001.

Package v1 - review system handlers for P3-C002.

Index

Constants

View Source
const (
	// The upload memory buffer is 32 MiB.
	// It should be kept low, so RAM usage doesn't get out of control.
	// This is unrelated to maximum upload size limit, which is now set through system setting.
	MaxUploadBufferSizeBytes = 32 << 20
	MebiByte                 = 1024 * 1024
	// ThumbnailCacheFolder is the folder name where the thumbnail images are stored.
	ThumbnailCacheFolder = ".thumbnail_cache"
)
View Source
const (
	// DefaultPageSize is the default page size for requests.
	DefaultPageSize = 10
	// MaxPageSize is the maximum page size for requests.
	MaxPageSize = 1000
)
View Source
const (
	InstanceSettingNamePrefix  = "instance/settings/"
	UserNamePrefix             = "users/"
	MemoNamePrefix             = "memos/"
	AttachmentNamePrefix       = "attachments/"
	ReactionNamePrefix         = "reactions/"
	InboxNamePrefix            = "inboxes/"
	IdentityProviderNamePrefix = "identity-providers/"
	ActivityNamePrefix         = "activities/"
	WebhookNamePrefix          = "webhooks/"
)
View Source
const DefaultHistoryRetention = 10

Default history retention count for router memory service.

View Source
const (
	// DefaultTimezone is the default timezone for schedule operations.
	DefaultTimezone = "Asia/Shanghai"
)
View Source
const MaxMessageLimit = 100

MaxMessageLimit is the maximum number of messages to return in a single request.

Variables

View Source
var PublicMethods = map[string]struct{}{

	"/memos.api.v1.AuthService/SignIn":       {},
	"/memos.api.v1.AuthService/RefreshToken": {},

	"/memos.api.v1.InstanceService/GetInstanceProfile": {},
	"/memos.api.v1.InstanceService/GetInstanceSetting": {},

	"/memos.api.v1.UserService/CreateUser":       {},
	"/memos.api.v1.UserService/GetUser":          {},
	"/memos.api.v1.UserService/GetUserAvatar":    {},
	"/memos.api.v1.UserService/GetUserStats":     {},
	"/memos.api.v1.UserService/ListAllUserStats": {},
	"/memos.api.v1.UserService/SearchUsers":      {},

	"/memos.api.v1.IdentityProviderService/ListIdentityProviders": {},

	"/memos.api.v1.MemoService/GetMemo":          {},
	"/memos.api.v1.MemoService/ListMemos":        {},
	"/memos.api.v1.MemoService/ListMemoComments": {},
}

PublicMethods defines API endpoints that don't require authentication. All other endpoints require a valid session or access token.

This is the SINGLE SOURCE OF TRUTH for public endpoints. Both Connect interceptor and gRPC-Gateway interceptor use this map.

Format: Full gRPC procedure path as returned by req.Spec().Procedure (Connect) or info.FullMethod (gRPC interceptor).

View Source
var SupportedThumbnailMimeTypes = []string{
	"image/png",
	"image/jpeg",
}

Functions

func ExtractActivityIDFromName

func ExtractActivityIDFromName(name string) (int32, error)

func ExtractAttachmentUIDFromName

func ExtractAttachmentUIDFromName(name string) (string, error)

ExtractAttachmentUIDFromName returns the attachment UID from a resource name.

func ExtractIdentityProviderIDFromName

func ExtractIdentityProviderIDFromName(name string) (int32, error)

func ExtractInboxIDFromName

func ExtractInboxIDFromName(name string) (int32, error)

ExtractInboxIDFromName returns the inbox ID from a resource name.

func ExtractInstanceSettingKeyFromName

func ExtractInstanceSettingKeyFromName(name string) (string, error)

func ExtractMemoReactionIDFromName

func ExtractMemoReactionIDFromName(name string) (string, int32, error)

ExtractMemoReactionIDFromName returns the memo UID and reaction ID from a resource name. e.g., "memos/abc/reactions/123" -> ("abc", 123).

func ExtractMemoUIDFromName

func ExtractMemoUIDFromName(name string) (string, error)

ExtractMemoUIDFromName returns the memo UID from a resource name. e.g., "memos/uuid" -> "uuid".

func ExtractNotificationIDFromName

func ExtractNotificationIDFromName(name string) (int32, error)

ExtractNotificationIDFromName extracts the notification ID from a resource name. Expected format: users/{user_id}/notifications/{notification_id}.

func ExtractUserIDAndSettingKeyFromName

func ExtractUserIDAndSettingKeyFromName(name string) (int32, string, error)

ExtractUserIDAndSettingKeyFromName extracts user ID and setting key from resource name. e.g., "users/123/settings/general" -> 123, "general".

func ExtractUserIDFromName

func ExtractUserIDFromName(name string) (int32, error)

ExtractUserIDFromName returns the uid from a resource name.

func GetNameParentTokens

func GetNameParentTokens(name string, tokenPrefixes ...string) ([]string, error)

GetNameParentTokens returns the tokens from a resource name.

func IsPublicMethod

func IsPublicMethod(procedure string) bool

IsPublicMethod checks if a procedure path is public (no authentication required). Returns true for public methods, false for protected methods.

func SaveAttachmentBlob

func SaveAttachmentBlob(ctx context.Context, profile *profile.Profile, stores *store.Store, create *store.Attachment) error

SaveAttachmentBlob save the blob of attachment based on the storage config. For personal assistant, always uses local storage.

func SetResponseHeader

func SetResponseHeader(ctx context.Context, key, value string) error

SetResponseHeader sets a header in the response.

This function works for both gRPC and Connect protocols:

  • For gRPC: Uses grpc.SetHeader to set headers in gRPC metadata
  • For Connect: Stores in HeaderCarrier for Connect wrapper to apply later

The protocol is automatically detected based on whether a HeaderCarrier exists in the context (injected by Connect wrappers).

func WithHeaderCarrier

func WithHeaderCarrier(ctx context.Context) context.Context

WithHeaderCarrier adds a header carrier to the context.

Types

type AIService

type AIService struct {
	v1pb.UnimplementedAIServiceServer
	RerankerService  pluginai.RerankerService
	EmbeddingService pluginai.EmbeddingService
	LLMService       pluginai.LLMService

	AdaptiveRetriever      *retrieval.AdaptiveRetriever
	IntentClassifierConfig *pluginai.IntentClassifierConfig

	Store *store.Store

	EmbeddingModel string
	// contains filtered or unexported fields
}

AIService provides AI-powered features for memo management.

func (*AIService) AddContextSeparator

func (s *AIService) AddContextSeparator(ctx context.Context, req *v1pb.AddContextSeparatorRequest) (*emptypb.Empty, error)

func (*AIService) Chat

func (s *AIService) Chat(req *v1pb.ChatRequest, stream v1pb.AIService_ChatServer) error

Chat streams a chat response with AI agents. Emits events for conversation persistence (handled by ConversationService).

func (*AIService) ClearConversationMessages

func (s *AIService) ClearConversationMessages(ctx context.Context, req *v1pb.ClearConversationMessagesRequest) (*emptypb.Empty, error)

ClearConversationMessages deletes all messages in a conversation.

func (*AIService) CreateAIConversation

func (s *AIService) CreateAIConversation(ctx context.Context, req *v1pb.CreateAIConversationRequest) (*v1pb.AIConversation, error)

func (*AIService) DeleteAIConversation

func (s *AIService) DeleteAIConversation(ctx context.Context, req *v1pb.DeleteAIConversationRequest) (*emptypb.Empty, error)

func (*AIService) DetectDuplicates

DetectDuplicates checks for duplicate or related memos.

func (*AIService) GetAIConversation

func (s *AIService) GetAIConversation(ctx context.Context, req *v1pb.GetAIConversationRequest) (*v1pb.AIConversation, error)

func (*AIService) GetDueReviews

GetDueReviews returns memos that are due for review.

func (*AIService) GetKnowledgeGraph

GetKnowledgeGraph returns the knowledge graph for the current user.

func (*AIService) GetRelatedMemos

GetRelatedMemos finds memos related to a specific memo.

func (*AIService) GetReviewStats

GetReviewStats returns review statistics for the current user.

func (*AIService) IsEnabled

func (s *AIService) IsEnabled() bool

IsEnabled returns whether AI features are enabled. For basic features (embedding, search), only EmbeddingService is required. For Agent features (Memo, Schedule, etc.), both EmbeddingService and LLMService are required.

func (*AIService) IsLLMEnabled

func (s *AIService) IsLLMEnabled() bool

IsLLMEnabled returns whether LLM features are enabled (required for Agents).

func (*AIService) LinkMemos

LinkMemos creates a bidirectional relation between two memos.

func (*AIService) ListMessages

- SUMMARY messages are filtered out (never returned to frontend).

func (*AIService) MergeMemos

MergeMemos merges source memo into target memo.

func (*AIService) RecordReview

func (s *AIService) RecordReview(ctx context.Context, req *v1pb.RecordReviewRequest) (*emptypb.Empty, error)

RecordReview records a review result and updates spaced repetition state.

func (*AIService) SemanticSearch

SemanticSearch performs semantic search on memos.

func (*AIService) StopChat added in v0.80.0

func (s *AIService) StopChat(ctx context.Context, req *v1pb.StopChatRequest) (*emptypb.Empty, error)

StopChat cancels an ongoing chat stream and terminates the associated session. This is the implementation for session.stop from the async architecture spec. StopChat 取消正在进行的聊天流并终止相关会话。 这是异步架构规范中 session.stop 的实现。

Architecture Note: Session termination is primarily client-driven.

  • The client should cancel the streaming request (gRPC/HTTP) to immediately stop processing.
  • This method emits monitoring events for observability and metrics collection.
  • Active sessions are cleaned up after a 30-minute idle timeout (CCSessionManager).
  • For server-initiated termination in future, consider adding a session registry that maps conversationID to active context.CancelFunc for immediate cancellation.

func (*AIService) SuggestTags

SuggestTags suggests tags for memo content. P2-C001: Uses three-layer progressive strategy (statistics -> rules -> LLM).

func (*AIService) UpdateAIConversation

func (s *AIService) UpdateAIConversation(ctx context.Context, req *v1pb.UpdateAIConversationRequest) (*v1pb.AIConversation, error)

type APIV1Service

func NewAPIV1Service

func NewAPIV1Service(secret string, profile *profile.Profile, store *store.Store) *APIV1Service

func (*APIV1Service) CreateAttachment

func (s *APIV1Service) CreateAttachment(ctx context.Context, request *v1pb.CreateAttachmentRequest) (*v1pb.Attachment, error)

func (*APIV1Service) CreateIdentityProvider

func (s *APIV1Service) CreateIdentityProvider(ctx context.Context, request *v1pb.CreateIdentityProviderRequest) (*v1pb.IdentityProvider, error)

func (*APIV1Service) CreateMemo

func (s *APIV1Service) CreateMemo(ctx context.Context, request *v1pb.CreateMemoRequest) (*v1pb.Memo, error)

func (*APIV1Service) CreateMemoComment

func (s *APIV1Service) CreateMemoComment(ctx context.Context, request *v1pb.CreateMemoCommentRequest) (*v1pb.Memo, error)

func (*APIV1Service) CreatePersonalAccessToken

CreatePersonalAccessToken creates a new Personal Access Token (PAT) for a user.

Use cases: - User manually creates token in settings for mobile app - User creates token for CLI tool - User creates token for third-party integration

Token properties: - Random string with memos_pat_ prefix - SHA-256 hash stored in database - Optional expiration time (can be never-expiring) - User-provided description for identification

Security considerations: - Full token is only shown ONCE (in this response) - User should copy and store it securely - Token can be revoked by deleting it from settings

Authentication: Required (session cookie or access token) Authorization: User can only create tokens for themselves.

func (*APIV1Service) CreateShortcut

func (s *APIV1Service) CreateShortcut(ctx context.Context, request *v1pb.CreateShortcutRequest) (*v1pb.Shortcut, error)

func (*APIV1Service) CreateUser

func (s *APIV1Service) CreateUser(ctx context.Context, request *v1pb.CreateUserRequest) (*v1pb.User, error)

func (*APIV1Service) CreateUserWebhook

func (s *APIV1Service) CreateUserWebhook(ctx context.Context, request *v1pb.CreateUserWebhookRequest) (*v1pb.UserWebhook, error)

func (*APIV1Service) DeleteAttachment

func (s *APIV1Service) DeleteAttachment(ctx context.Context, request *v1pb.DeleteAttachmentRequest) (*emptypb.Empty, error)

func (*APIV1Service) DeleteIdentityProvider

func (s *APIV1Service) DeleteIdentityProvider(ctx context.Context, request *v1pb.DeleteIdentityProviderRequest) (*emptypb.Empty, error)

func (*APIV1Service) DeleteMemo

func (s *APIV1Service) DeleteMemo(ctx context.Context, request *v1pb.DeleteMemoRequest) (*emptypb.Empty, error)

func (*APIV1Service) DeleteMemoReaction

func (s *APIV1Service) DeleteMemoReaction(ctx context.Context, request *v1pb.DeleteMemoReactionRequest) (*emptypb.Empty, error)

func (*APIV1Service) DeletePersonalAccessToken

func (s *APIV1Service) DeletePersonalAccessToken(ctx context.Context, request *v1pb.DeletePersonalAccessTokenRequest) (*emptypb.Empty, error)

DeletePersonalAccessToken revokes a Personal Access Token.

This endpoint: 1. Removes the token from the user's access tokens list 2. Immediately invalidates the token (subsequent API calls with it will fail)

Use cases: - User revokes a compromised token - User removes token for unused app/device - User cleans up old tokens

Authentication: Required (session cookie or access token) Authorization: User can only delete their own tokens.

func (*APIV1Service) DeleteShortcut

func (s *APIV1Service) DeleteShortcut(ctx context.Context, request *v1pb.DeleteShortcutRequest) (*emptypb.Empty, error)

func (*APIV1Service) DeleteUser

func (s *APIV1Service) DeleteUser(ctx context.Context, request *v1pb.DeleteUserRequest) (*emptypb.Empty, error)

func (*APIV1Service) DeleteUserNotification

func (s *APIV1Service) DeleteUserNotification(ctx context.Context, request *v1pb.DeleteUserNotificationRequest) (*emptypb.Empty, error)

DeleteUserNotification permanently deletes a notification. Only the notification owner can delete their notifications.

func (*APIV1Service) DeleteUserWebhook

func (s *APIV1Service) DeleteUserWebhook(ctx context.Context, request *v1pb.DeleteUserWebhookRequest) (*emptypb.Empty, error)

func (*APIV1Service) DispatchMemoCreatedWebhook

func (s *APIV1Service) DispatchMemoCreatedWebhook(ctx context.Context, memo *v1pb.Memo) error

DispatchMemoCreatedWebhook dispatches webhook when memo is created.

func (*APIV1Service) DispatchMemoDeletedWebhook

func (s *APIV1Service) DispatchMemoDeletedWebhook(ctx context.Context, memo *v1pb.Memo) error

DispatchMemoDeletedWebhook dispatches webhook when memo is deleted.

func (*APIV1Service) DispatchMemoUpdatedWebhook

func (s *APIV1Service) DispatchMemoUpdatedWebhook(ctx context.Context, memo *v1pb.Memo) error

DispatchMemoUpdatedWebhook dispatches webhook when memo is updated.

func (*APIV1Service) GetActivity

func (s *APIV1Service) GetActivity(ctx context.Context, request *v1pb.GetActivityRequest) (*v1pb.Activity, error)

func (*APIV1Service) GetAttachment

func (s *APIV1Service) GetAttachment(ctx context.Context, request *v1pb.GetAttachmentRequest) (*v1pb.Attachment, error)

func (*APIV1Service) GetAttachmentBlob

func (s *APIV1Service) GetAttachmentBlob(attachment *store.Attachment) ([]byte, error)

func (*APIV1Service) GetCurrentUser

GetCurrentUser returns the authenticated user's information. Validates the access token and returns user details.

Authentication: Required (access token). Returns: User information.

func (*APIV1Service) GetIdentityProvider

func (s *APIV1Service) GetIdentityProvider(ctx context.Context, request *v1pb.GetIdentityProviderRequest) (*v1pb.IdentityProvider, error)

func (*APIV1Service) GetInstanceOwner

func (s *APIV1Service) GetInstanceOwner(ctx context.Context) (*v1pb.User, error)

func (*APIV1Service) GetInstanceProfile

GetInstanceProfile returns the instance profile.

func (*APIV1Service) GetInstanceSetting

func (s *APIV1Service) GetInstanceSetting(ctx context.Context, request *v1pb.GetInstanceSettingRequest) (*v1pb.InstanceSetting, error)

func (*APIV1Service) GetMemo

func (s *APIV1Service) GetMemo(ctx context.Context, request *v1pb.GetMemoRequest) (*v1pb.Memo, error)

func (*APIV1Service) GetMetricsOverview

func (s *APIV1Service) GetMetricsOverview(c echo.Context) error

GET /api/v1/system/metrics/overview.

func (*APIV1Service) GetRelatedMemos

GetRelatedMemos returns related memos for a given memo. P1-C003: Related memo recommendations based on semantic similarity and tag co-occurrence.

func (*APIV1Service) GetShortcut

func (s *APIV1Service) GetShortcut(ctx context.Context, request *v1pb.GetShortcutRequest) (*v1pb.Shortcut, error)

func (*APIV1Service) GetUser

func (s *APIV1Service) GetUser(ctx context.Context, request *v1pb.GetUserRequest) (*v1pb.User, error)

func (*APIV1Service) GetUserSetting

func (s *APIV1Service) GetUserSetting(ctx context.Context, request *v1pb.GetUserSettingRequest) (*v1pb.UserSetting, error)

func (*APIV1Service) GetUserStats

func (s *APIV1Service) GetUserStats(ctx context.Context, request *v1pb.GetUserStatsRequest) (*v1pb.UserStats, error)

func (*APIV1Service) ListActivities

func (*APIV1Service) ListAllUserStats

func (*APIV1Service) ListAttachments

func (*APIV1Service) ListMemoAttachments

func (*APIV1Service) ListMemoComments

func (*APIV1Service) ListMemoReactions

func (*APIV1Service) ListMemoRelations

func (*APIV1Service) ListMemos

func (s *APIV1Service) ListMemos(ctx context.Context, request *v1pb.ListMemosRequest) (*v1pb.ListMemosResponse, error)

func (*APIV1Service) ListPersonalAccessTokens

ListPersonalAccessTokens retrieves all Personal Access Tokens (PATs) for a user.

Personal Access Tokens are used for: - Mobile app authentication - CLI tool authentication - API client authentication - Any programmatic access requiring Bearer token auth

Security: - Only the token owner can list their tokens - Returns token metadata only (not the actual token value) - Invalid or expired tokens are filtered out

Authentication: Required (session cookie or access token) Authorization: User can only list their own tokens.

func (*APIV1Service) ListShortcuts

func (*APIV1Service) ListUserNotifications

ListUserNotifications lists all notifications for a user. Notifications are backed by the inbox storage layer and represent activities that require user attention (e.g., memo comments).

func (*APIV1Service) ListUserSettings

func (*APIV1Service) ListUserWebhooks

func (*APIV1Service) ListUsers

func (s *APIV1Service) ListUsers(ctx context.Context, request *v1pb.ListUsersRequest) (*v1pb.ListUsersResponse, error)

func (*APIV1Service) RefreshToken

RefreshToken exchanges a valid refresh token for a new access token.

This endpoint implements refresh token rotation with sliding window sessions: 1. Extracts the refresh token from the HttpOnly cookie (memos_refresh) 2. Validates the refresh token against the database (checking expiry and revocation) 3. Rotates the refresh token: generates a new one with fresh 30-day expiry 4. Generates a new short-lived access token (15 minutes) 5. Sets the new refresh token as HttpOnly cookie 6. Returns the new access token and its expiry time

Token rotation provides: - Sliding window sessions: active users stay logged in indefinitely - Better security: stolen refresh tokens become invalid after legitimate refresh

Authentication: Requires valid refresh token in cookie (public endpoint) Returns: New access token and expiry timestamp.

func (*APIV1Service) RegisterGateway

func (s *APIV1Service) RegisterGateway(ctx context.Context, echoServer *echo.Echo) error

RegisterGateway registers the gRPC-Gateway and Connect handlers with the given Echo instance.

func (*APIV1Service) SearchWithHighlight

SearchWithHighlight searches memos and returns results with keyword highlighting. This is an AI-powered feature that requires PostgreSQL.

func (*APIV1Service) SetMemoAttachments

func (s *APIV1Service) SetMemoAttachments(ctx context.Context, request *v1pb.SetMemoAttachmentsRequest) (*emptypb.Empty, error)

func (*APIV1Service) SetMemoRelations

func (s *APIV1Service) SetMemoRelations(ctx context.Context, request *v1pb.SetMemoRelationsRequest) (*emptypb.Empty, error)

func (*APIV1Service) SignIn

func (s *APIV1Service) SignIn(ctx context.Context, request *v1pb.SignInRequest) (*v1pb.SignInResponse, error)

SignIn authenticates a user with credentials and returns tokens. On success, returns an access token and sets a refresh token cookie.

Supports two authentication methods: 1. Password-based authentication (username + password). 2. SSO authentication (OAuth2 authorization code).

Authentication: Not required (public endpoint). Returns: User info, access token, and token expiry.

func (*APIV1Service) SignOut

SignOut terminates the user's authentication. Revokes the refresh token and clears the authentication cookie.

Authentication: Required (access token). Returns: Empty response on success.

func (*APIV1Service) UpdateAttachment

func (s *APIV1Service) UpdateAttachment(ctx context.Context, request *v1pb.UpdateAttachmentRequest) (*v1pb.Attachment, error)

func (*APIV1Service) UpdateIdentityProvider

func (s *APIV1Service) UpdateIdentityProvider(ctx context.Context, request *v1pb.UpdateIdentityProviderRequest) (*v1pb.IdentityProvider, error)

func (*APIV1Service) UpdateInstanceSetting

func (s *APIV1Service) UpdateInstanceSetting(ctx context.Context, request *v1pb.UpdateInstanceSettingRequest) (*v1pb.InstanceSetting, error)

func (*APIV1Service) UpdateMemo

func (s *APIV1Service) UpdateMemo(ctx context.Context, request *v1pb.UpdateMemoRequest) (*v1pb.Memo, error)

func (*APIV1Service) UpdateShortcut

func (s *APIV1Service) UpdateShortcut(ctx context.Context, request *v1pb.UpdateShortcutRequest) (*v1pb.Shortcut, error)

func (*APIV1Service) UpdateUser

func (s *APIV1Service) UpdateUser(ctx context.Context, request *v1pb.UpdateUserRequest) (*v1pb.User, error)

func (*APIV1Service) UpdateUserNotification

func (s *APIV1Service) UpdateUserNotification(ctx context.Context, request *v1pb.UpdateUserNotificationRequest) (*v1pb.UserNotification, error)

UpdateUserNotification updates a notification's status (e.g., marking as read/archived). Only the notification owner can update their notifications.

func (*APIV1Service) UpdateUserSetting

func (s *APIV1Service) UpdateUserSetting(ctx context.Context, request *v1pb.UpdateUserSettingRequest) (*v1pb.UserSetting, error)

func (*APIV1Service) UpdateUserWebhook

func (s *APIV1Service) UpdateUserWebhook(ctx context.Context, request *v1pb.UpdateUserWebhookRequest) (*v1pb.UserWebhook, error)

func (*APIV1Service) UpsertMemoReaction

func (s *APIV1Service) UpsertMemoReaction(ctx context.Context, request *v1pb.UpsertMemoReactionRequest) (*v1pb.Reaction, error)

type AuthInterceptor

type AuthInterceptor struct {
	// contains filtered or unexported fields
}

AuthInterceptor handles authentication for Connect handlers.

It enforces authentication for all endpoints except those listed in PublicMethods. Role-based authorization (admin checks) remains in the service layer.

func NewAuthInterceptor

func NewAuthInterceptor(store *store.Store, secret string) *AuthInterceptor

NewAuthInterceptor creates a new auth interceptor.

func (*AuthInterceptor) WrapStreamingClient

func (*AuthInterceptor) WrapStreamingHandler

func (*AuthInterceptor) WrapUnary

func (in *AuthInterceptor) WrapUnary(next connect.UnaryFunc) connect.UnaryFunc

type ConnectServiceHandler

type ConnectServiceHandler struct {
	*APIV1Service
}

ConnectServiceHandler wraps APIV1Service to implement Connect handler interfaces. It adapts the existing gRPC service implementations to work with Connect's request/response wrapper types.

This wrapper pattern allows us to: - Reuse existing gRPC service implementations - Support both native gRPC and Connect protocols - Maintain a single source of truth for business logic.

func NewConnectServiceHandler

func NewConnectServiceHandler(svc *APIV1Service) *ConnectServiceHandler

NewConnectServiceHandler creates a new Connect service handler.

func (*ConnectServiceHandler) AddContextSeparator

func (*ConnectServiceHandler) Chat

func (*ConnectServiceHandler) ClearConversationMessages

func (*ConnectServiceHandler) CreateAttachment

func (*ConnectServiceHandler) CreateMemo

func (*ConnectServiceHandler) CreateMemoComment

func (*ConnectServiceHandler) CreateSchedule

func (*ConnectServiceHandler) CreateShortcut

func (*ConnectServiceHandler) CreateUser

func (*ConnectServiceHandler) CreateUserWebhook

func (*ConnectServiceHandler) DeleteAIConversation

func (*ConnectServiceHandler) DeleteAttachment

func (*ConnectServiceHandler) DeleteIdentityProvider

func (*ConnectServiceHandler) DeleteMemo

func (*ConnectServiceHandler) DeleteMemoReaction

func (*ConnectServiceHandler) DeletePersonalAccessToken

func (*ConnectServiceHandler) DeleteSchedule

func (*ConnectServiceHandler) DeleteShortcut

func (*ConnectServiceHandler) DeleteUser

func (*ConnectServiceHandler) DeleteUserNotification

func (*ConnectServiceHandler) DeleteUserWebhook

func (*ConnectServiceHandler) GetAIConversation

func (*ConnectServiceHandler) GetActivity

func (*ConnectServiceHandler) GetAttachment

func (*ConnectServiceHandler) GetMemo

func (*ConnectServiceHandler) GetParrotSelfCognition

GetParrotSelfCognition returns the metacognitive information of a parrot agent.

func (*ConnectServiceHandler) GetSchedule

func (*ConnectServiceHandler) GetShortcut

func (*ConnectServiceHandler) GetUser

func (*ConnectServiceHandler) GetUserSetting

func (*ConnectServiceHandler) GetUserStats

func (*ConnectServiceHandler) LinkMemos

func (*ConnectServiceHandler) ListMemos

func (*ConnectServiceHandler) ListParrots

ListParrots returns all available parrot agents with their metacognitive information.

func (*ConnectServiceHandler) ListUsers

func (*ConnectServiceHandler) MergeMemos

func (*ConnectServiceHandler) RecordReview

func (*ConnectServiceHandler) RegisterConnectHandlers

func (s *ConnectServiceHandler) RegisterConnectHandlers(mux *http.ServeMux, opts ...connect.HandlerOption)

RegisterConnectHandlers registers all Connect service handlers on the given mux.

func (*ConnectServiceHandler) SetMemoAttachments

func (*ConnectServiceHandler) SetMemoRelations

func (*ConnectServiceHandler) SignIn

func (*ConnectServiceHandler) SignOut

func (*ConnectServiceHandler) StopChat added in v0.80.0

StopChat cancels an ongoing chat stream and terminates the associated session. StopChat 取消正在进行的聊天流并终止相关会话。

func (*ConnectServiceHandler) UpdateAttachment

func (*ConnectServiceHandler) UpdateMemo

func (*ConnectServiceHandler) UpdateSchedule

func (*ConnectServiceHandler) UpdateShortcut

func (*ConnectServiceHandler) UpdateUser

func (*ConnectServiceHandler) UpdateUserSetting

func (*ConnectServiceHandler) UpdateUserWebhook

func (*ConnectServiceHandler) UpsertMemoReaction

type HeaderCarrier

type HeaderCarrier struct {
	// contains filtered or unexported fields
}

HeaderCarrier stores headers that need to be set in the response.

Problem: The codebase supports two protocols simultaneously:

  • Native gRPC: Uses grpc.SetHeader() to set response headers
  • Connect-RPC: Uses connect.Response.Header().Set() to set response headers

Solution: HeaderCarrier provides a protocol-agnostic way to set headers.

  • Service methods call SetResponseHeader() regardless of protocol
  • For gRPC requests: SetResponseHeader uses grpc.SetHeader directly
  • For Connect requests: SetResponseHeader stores headers in HeaderCarrier
  • Connect wrappers extract headers from HeaderCarrier and apply to response

This allows service methods to work with both protocols without knowing which one is being used.

func GetHeaderCarrier

func GetHeaderCarrier(ctx context.Context) *HeaderCarrier

GetHeaderCarrier retrieves the header carrier from the context. Returns nil if no carrier is present.

func (*HeaderCarrier) All

func (h *HeaderCarrier) All() map[string]string

All returns all headers.

func (*HeaderCarrier) Get

func (h *HeaderCarrier) Get(key string) string

Get retrieves a header from the carrier.

func (*HeaderCarrier) Set

func (h *HeaderCarrier) Set(key, value string)

Set adds a header to the carrier.

type LoggingInterceptor

type LoggingInterceptor struct {
	// contains filtered or unexported fields
}

LoggingInterceptor logs Connect RPC requests with appropriate log levels.

Log levels: - INFO: Successful requests and expected client errors (not found, permission denied, etc.) - ERROR: Server errors (internal, unavailable, etc.)

func NewLoggingInterceptor

func NewLoggingInterceptor(logStacktrace bool) *LoggingInterceptor

NewLoggingInterceptor creates a new logging interceptor.

func (*LoggingInterceptor) WrapStreamingClient

func (*LoggingInterceptor) WrapStreamingHandler

func (*LoggingInterceptor) WrapUnary

type MetadataInterceptor

type MetadataInterceptor struct{}

MetadataInterceptor converts Connect HTTP headers to gRPC metadata.

This ensures service methods can use metadata.FromIncomingContext() to access headers like User-Agent, X-Forwarded-For, etc., regardless of whether the request came via Connect RPC or gRPC-Gateway.

func NewMetadataInterceptor

func NewMetadataInterceptor() *MetadataInterceptor

NewMetadataInterceptor creates a new metadata interceptor.

func (*MetadataInterceptor) WrapStreamingClient

func (*MetadataInterceptor) WrapStreamingHandler

func (*MetadataInterceptor) WrapUnary

type MetricsOverviewResponse

type MetricsOverviewResponse struct {
	TimeRange     string  `json:"time_range"`
	TotalRequests int64   `json:"total_requests"`
	SuccessRate   float64 `json:"success_rate"`
	AvgLatencyMs  int64   `json:"avg_latency_ms"`
	P50LatencyMs  int64   `json:"p50_latency_ms"`
	P95LatencyMs  int64   `json:"p95_latency_ms"`
	ErrorCount    int64   `json:"error_count"`
	IsMock        bool    `json:"is_mock"`
}

MetricsOverviewResponse represents the overview response of system metrics.

type RecoveryInterceptor

type RecoveryInterceptor struct {
	// contains filtered or unexported fields
}

RecoveryInterceptor recovers from panics in Connect handlers and returns an internal error.

func NewRecoveryInterceptor

func NewRecoveryInterceptor(logStacktrace bool) *RecoveryInterceptor

NewRecoveryInterceptor creates a new recovery interceptor.

func (*RecoveryInterceptor) WrapStreamingClient

func (*RecoveryInterceptor) WrapStreamingHandler

func (*RecoveryInterceptor) WrapUnary

type ScheduleAgentService

type ScheduleAgentService struct {
	v1pb.UnimplementedScheduleAgentServiceServer

	Store            *store.Store
	LLM              ai.LLMService
	Profile          *profile.Profile
	ContextStore     *agent.ContextStore // TODO: Persist to PostgreSQL for cross-restart context recovery
	IntentClassifier *agent.LLMIntentClassifier
}

ScheduleAgentService is a dedicated service for schedule agent interactions.

func NewScheduleAgentService

func NewScheduleAgentService(store *store.Store, llm ai.LLMService, profile *profile.Profile) *ScheduleAgentService

NewScheduleAgentService creates a new schedule agent service.

func (*ScheduleAgentService) Chat

Chat handles non-streaming schedule agent chat requests.

func (*ScheduleAgentService) ChatStream

ChatStream handles streaming schedule agent chat requests.

type ScheduleAgentServiceConnectHandler

type ScheduleAgentServiceConnectHandler struct {
	// contains filtered or unexported fields
}

ScheduleAgentServiceConnectHandler implements ScheduleAgentServiceHandler interface by delegating to the underlying ScheduleAgentService.

func NewScheduleAgentServiceConnectHandler

func NewScheduleAgentServiceConnectHandler(svc *ScheduleAgentService) *ScheduleAgentServiceConnectHandler

NewScheduleAgentServiceConnectHandler creates a new Connect handler for ScheduleAgentService.

func (*ScheduleAgentServiceConnectHandler) Chat

Chat handles non-streaming schedule agent chat requests.

func (*ScheduleAgentServiceConnectHandler) ChatStream

ChatStream handles streaming schedule agent chat requests.

type ScheduleService

type ScheduleService struct {
	v1pb.UnimplementedScheduleServiceServer

	Store      *store.Store
	LLMService ai.LLMService
}

ScheduleService provides schedule management APIs.

func (*ScheduleService) BatchCreateSchedules

BatchCreateSchedules creates multiple schedules from a batch request.

func (*ScheduleService) BatchParseSchedule

BatchParseSchedule parses natural language for batch schedule creation.

func (*ScheduleService) CheckConflict

CheckConflict checks for schedule conflicts.

func (*ScheduleService) CreateSchedule

func (s *ScheduleService) CreateSchedule(ctx context.Context, req *v1pb.CreateScheduleRequest) (*v1pb.Schedule, error)

CreateSchedule creates a new schedule.

func (*ScheduleService) DeleteSchedule

func (s *ScheduleService) DeleteSchedule(ctx context.Context, req *v1pb.DeleteScheduleRequest) (*emptypb.Empty, error)

DeleteSchedule deletes a schedule.

func (*ScheduleService) GetSchedule

func (s *ScheduleService) GetSchedule(ctx context.Context, req *v1pb.GetScheduleRequest) (*v1pb.Schedule, error)

GetSchedule gets a schedule by name.

func (*ScheduleService) ListSchedules

ListSchedules lists schedules with filters.

func (*ScheduleService) ParseAndCreateSchedule

ParseAndCreateSchedule parses natural language and creates a schedule.

func (*ScheduleService) PrecheckSchedule

PrecheckSchedule validates a schedule before creation.

func (*ScheduleService) UpdateSchedule

func (s *ScheduleService) UpdateSchedule(ctx context.Context, req *v1pb.UpdateScheduleRequest) (*v1pb.Schedule, error)

UpdateSchedule updates a schedule.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL