@yushaw/sanqian-chat 0.2.20 → 0.2.22

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.
@@ -672,6 +672,8 @@ interface ApiMessage {
672
672
  tool_call_id?: string | null;
673
673
  thinking?: string | null;
674
674
  filePaths?: string[];
675
+ attachedResources?: unknown;
676
+ attached_resources?: unknown;
675
677
  message_id?: number;
676
678
  }
677
679
  /**
@@ -672,6 +672,8 @@ interface ApiMessage {
672
672
  tool_call_id?: string | null;
673
673
  thinking?: string | null;
674
674
  filePaths?: string[];
675
+ attachedResources?: unknown;
676
+ attached_resources?: unknown;
675
677
  message_id?: number;
676
678
  }
677
679
  /**
@@ -85,6 +85,50 @@ function getNumericMessageId(message) {
85
85
  }
86
86
  return void 0;
87
87
  }
88
+ function parseAttachedResourceRef(rawRef) {
89
+ const segments = rawRef.split(":");
90
+ if (segments.length < 2) return null;
91
+ const providerId = segments.slice(0, -1).join(":").trim();
92
+ const resourceId = segments[segments.length - 1].trim();
93
+ if (!providerId || !resourceId) return null;
94
+ return { providerId, resourceId };
95
+ }
96
+ function normalizeAttachedResources(raw) {
97
+ if (!Array.isArray(raw)) return void 0;
98
+ const resources = [];
99
+ const seen = /* @__PURE__ */ new Set();
100
+ for (const item of raw) {
101
+ let providerId = "";
102
+ let resourceId = "";
103
+ let entry = null;
104
+ if (typeof item === "string") {
105
+ const parsed = parseAttachedResourceRef(item.trim());
106
+ if (parsed) {
107
+ providerId = parsed.providerId;
108
+ resourceId = parsed.resourceId;
109
+ }
110
+ } else if (item && typeof item === "object") {
111
+ entry = item;
112
+ const providerRaw = typeof entry.providerId === "string" ? entry.providerId : typeof entry.provider_id === "string" ? entry.provider_id : "";
113
+ const resourceRaw = typeof entry.resourceId === "string" ? entry.resourceId : typeof entry.resource_id === "string" ? entry.resource_id : "";
114
+ providerId = providerRaw.trim();
115
+ resourceId = resourceRaw.trim();
116
+ }
117
+ if (!providerId || !resourceId) continue;
118
+ const dedupeKey = `${providerId}\0${resourceId}`;
119
+ if (seen.has(dedupeKey)) continue;
120
+ seen.add(dedupeKey);
121
+ resources.push({
122
+ providerId,
123
+ resourceId,
124
+ title: entry && typeof entry.title === "string" && entry.title.trim().length > 0 ? entry.title.trim() : resourceId,
125
+ summary: entry && typeof entry.summary === "string" && entry.summary.trim().length > 0 ? entry.summary.trim() : void 0,
126
+ type: entry && typeof entry.type === "string" && entry.type.trim().length > 0 ? entry.type.trim() : void 0,
127
+ icon: entry && typeof entry.icon === "string" && entry.icon.trim().length > 0 ? entry.icon.trim() : void 0
128
+ });
129
+ }
130
+ return resources.length > 0 ? resources : void 0;
131
+ }
88
132
  function mergeConsecutiveAssistantMessages(rawMessages) {
89
133
  const result = [];
90
134
  let i = 0;
@@ -254,7 +298,8 @@ function mergeConsecutiveAssistantMessages(rawMessages) {
254
298
  timestamp: msg.timestamp || msg.created_at || (/* @__PURE__ */ new Date()).toISOString(),
255
299
  toolCalls: parseToolCalls(msg.toolCalls || msg.tool_calls),
256
300
  thinking: msg.thinking || void 0,
257
- filePaths: msg.filePaths
301
+ filePaths: msg.filePaths,
302
+ attachedResources: normalizeAttachedResources(msg.attachedResources || msg.attached_resources)
258
303
  });
259
304
  i++;
260
305
  }
@@ -46,6 +46,50 @@ function getNumericMessageId(message) {
46
46
  }
47
47
  return void 0;
48
48
  }
49
+ function parseAttachedResourceRef(rawRef) {
50
+ const segments = rawRef.split(":");
51
+ if (segments.length < 2) return null;
52
+ const providerId = segments.slice(0, -1).join(":").trim();
53
+ const resourceId = segments[segments.length - 1].trim();
54
+ if (!providerId || !resourceId) return null;
55
+ return { providerId, resourceId };
56
+ }
57
+ function normalizeAttachedResources(raw) {
58
+ if (!Array.isArray(raw)) return void 0;
59
+ const resources = [];
60
+ const seen = /* @__PURE__ */ new Set();
61
+ for (const item of raw) {
62
+ let providerId = "";
63
+ let resourceId = "";
64
+ let entry = null;
65
+ if (typeof item === "string") {
66
+ const parsed = parseAttachedResourceRef(item.trim());
67
+ if (parsed) {
68
+ providerId = parsed.providerId;
69
+ resourceId = parsed.resourceId;
70
+ }
71
+ } else if (item && typeof item === "object") {
72
+ entry = item;
73
+ const providerRaw = typeof entry.providerId === "string" ? entry.providerId : typeof entry.provider_id === "string" ? entry.provider_id : "";
74
+ const resourceRaw = typeof entry.resourceId === "string" ? entry.resourceId : typeof entry.resource_id === "string" ? entry.resource_id : "";
75
+ providerId = providerRaw.trim();
76
+ resourceId = resourceRaw.trim();
77
+ }
78
+ if (!providerId || !resourceId) continue;
79
+ const dedupeKey = `${providerId}\0${resourceId}`;
80
+ if (seen.has(dedupeKey)) continue;
81
+ seen.add(dedupeKey);
82
+ resources.push({
83
+ providerId,
84
+ resourceId,
85
+ title: entry && typeof entry.title === "string" && entry.title.trim().length > 0 ? entry.title.trim() : resourceId,
86
+ summary: entry && typeof entry.summary === "string" && entry.summary.trim().length > 0 ? entry.summary.trim() : void 0,
87
+ type: entry && typeof entry.type === "string" && entry.type.trim().length > 0 ? entry.type.trim() : void 0,
88
+ icon: entry && typeof entry.icon === "string" && entry.icon.trim().length > 0 ? entry.icon.trim() : void 0
89
+ });
90
+ }
91
+ return resources.length > 0 ? resources : void 0;
92
+ }
49
93
  function mergeConsecutiveAssistantMessages(rawMessages) {
50
94
  const result = [];
51
95
  let i = 0;
@@ -215,7 +259,8 @@ function mergeConsecutiveAssistantMessages(rawMessages) {
215
259
  timestamp: msg.timestamp || msg.created_at || (/* @__PURE__ */ new Date()).toISOString(),
216
260
  toolCalls: parseToolCalls(msg.toolCalls || msg.tool_calls),
217
261
  thinking: msg.thinking || void 0,
218
- filePaths: msg.filePaths
262
+ filePaths: msg.filePaths,
263
+ attachedResources: normalizeAttachedResources(msg.attachedResources || msg.attached_resources)
219
264
  });
220
265
  i++;
221
266
  }
@@ -681,6 +681,7 @@ interface UseChatReturn {
681
681
  conversationTitle: string | null;
682
682
  pendingInterrupt: HitlInterruptData | null;
683
683
  sendMessage: (content: string, options?: SendMessageOptions) => Promise<void>;
684
+ trySendMessage: (content: string, options?: SendMessageOptions) => Promise<boolean>;
684
685
  stopStreaming: () => void;
685
686
  clearMessages: () => void;
686
687
  setError: (error: string | null) => void;
@@ -980,6 +981,12 @@ interface UseResourcePickerReturn {
980
981
  }
981
982
  declare function useResourcePicker(options: UseResourcePickerOptions): UseResourcePickerReturn;
982
983
 
984
+ /**
985
+ * Temporarily disables drag regions while a modal/overlay is open.
986
+ * Uses reference counting to support nested overlays safely.
987
+ */
988
+ declare function useWindowDragLock(active: boolean): void;
989
+
983
990
  /**
984
991
  * IPC Adapter
985
992
  *
@@ -1044,12 +1051,13 @@ interface SanqianChatMessageProps {
1044
1051
  declare const SanqianChatMessage: react.NamedExoticComponent<SanqianChatMessageProps>;
1045
1052
 
1046
1053
  interface ChatInputProps {
1047
- onSend: (content: string) => void;
1054
+ onSend: (content: string) => boolean | void | Promise<boolean | void>;
1048
1055
  onStop?: () => void;
1049
1056
  placeholder?: string;
1050
1057
  disabled?: boolean;
1051
1058
  isStreaming?: boolean;
1052
1059
  isLoading?: boolean;
1060
+ allowEmptySubmit?: boolean;
1053
1061
  sendLabel?: string;
1054
1062
  stopLabel?: string;
1055
1063
  maxRows?: number;
@@ -1075,7 +1083,7 @@ interface FloatingChatProps {
1075
1083
  pendingInterrupt: HitlInterruptData | null;
1076
1084
  sessionResources?: StoredSessionResource[];
1077
1085
  onRemoveSessionResource?: (fullId: string) => void;
1078
- onSendMessage: (content: string) => void;
1086
+ onSendMessage: (content: string) => boolean | void | Promise<boolean | void>;
1079
1087
  onStopStreaming: () => void;
1080
1088
  onApproveHitl?: (remember?: boolean) => void;
1081
1089
  onRejectHitl?: (remember?: boolean) => void;
@@ -1637,4 +1645,4 @@ declare function ensureChatBaseStyles(): void;
1637
1645
  */
1638
1646
  declare function ensureFullChatStyles(): void;
1639
1647
 
1640
- export { AddResourceButton, type AddResourceButtonProps, type AlertAction, AlertBanner, type AlertBannerProps, type AlertConfig, type AlertType, AttachButton, type AttachButtonProps, type AttachConfig, type AttachPosition, type AttachState, type AttachedResource, AttachedResourceTags, type AttachedResourceTagsProps, type AttachmentMenuItem, type AttachmentMenuItemType, type ChatAdapter, type ChatAdapterConfig, type ChatFontSize, ChatInput, type ChatInputHandle, type ChatInputProps, type ChatPanelConfig, type ChatPanelMode, type ChatPanelPosition, type ChatThemeMode, type ChatUiConfig, type ChatUiConfigSerializable, type ChatUiStrings, CompactChat, type CompactChatProps, type ConnectionErrorCode, type ConnectionStatus, type ContextProviderInfo, type ConversationDetail, type ConversationInfo, FloatingChat, type FloatingChatProps, type FloatingWindowConfig, HistoryList, type HistoryListProps, HistoryModal, type HistoryModalProps, HitlCard, type HitlCardProps, type HitlInterruptData, I18nProvider, type I18nProviderProps, IntermediateSteps, type IntermediateStepsProps, type LinkClickEvent, type LinkHandlerConfig, type Locale, MarkdownRenderer, type MarkdownRendererProps, type MessageBlock, MessageBubble, type MessageBubbleProps, MessageList, type MessageListProps, type MessageRole, ModeToggleButton, type ModeToggleButtonProps, PanelControls, type PanelControlsProps, PanelHeaderButtons, PanelResizer, Resizer, type ResizerProps, type ResolvedTheme, ResourceChip, ResourceChipList, type ResourceChipListProps, type ResourceChipProps, ResourcePicker, type ResourcePickerItem, type ResourcePickerProps, type ResourcePickerState, SanqianChat, SanqianChatMessage, type SanqianChatMessageProps, type SanqianChatProps, SanqianMessageList, type SanqianMessageListHandle, type SanqianMessageListProps, type SdkAdapterConfig, type SendMessage, type SendMessageOptions, type SessionResource, type SessionResourceEvent, type StoredSessionResource, type StreamEvent, StreamingTimeline, type StreamingTimelineProps, type ThemeMode, ThemeProvider, type ThemeProviderProps, ThinkingSection, type ThinkingSectionProps, ToolArgumentsDisplay, type ToolArgumentsDisplayProps, type ToolCall, type ToolCallStatus, type Translations, type UseAttachStateReturn, type UseChatOptions, type UseChatPanelReturn, type UseChatReturn, type UseConnectionOptions, type UseConnectionReturn, type UseConversationsOptions, type UseConversationsReturn, type UseFocusPersistenceOptions, type UseResourcePickerOptions, type UseResourcePickerReturn, type WindowPosition, createChatAdapter, createIpcAdapter, createSdkAdapter, ensureChatBaseStyles, ensureFullChatStyles, getTranslations, resolveChatStrings, useAttachState, useChat, useChatPanel, useChatStyles, useConnection, useConversations, useFocusPersistence, useI18n, useIpcUiConfig, useResolvedUiConfig, useResourcePicker, useStandaloneI18n, useStandaloneTheme, useTheme };
1648
+ export { AddResourceButton, type AddResourceButtonProps, type AlertAction, AlertBanner, type AlertBannerProps, type AlertConfig, type AlertType, AttachButton, type AttachButtonProps, type AttachConfig, type AttachPosition, type AttachState, type AttachedResource, AttachedResourceTags, type AttachedResourceTagsProps, type AttachmentMenuItem, type AttachmentMenuItemType, type ChatAdapter, type ChatAdapterConfig, type ChatFontSize, ChatInput, type ChatInputHandle, type ChatInputProps, type ChatPanelConfig, type ChatPanelMode, type ChatPanelPosition, type ChatThemeMode, type ChatUiConfig, type ChatUiConfigSerializable, type ChatUiStrings, CompactChat, type CompactChatProps, type ConnectionErrorCode, type ConnectionStatus, type ContextProviderInfo, type ConversationDetail, type ConversationInfo, FloatingChat, type FloatingChatProps, type FloatingWindowConfig, HistoryList, type HistoryListProps, HistoryModal, type HistoryModalProps, HitlCard, type HitlCardProps, type HitlInterruptData, I18nProvider, type I18nProviderProps, IntermediateSteps, type IntermediateStepsProps, type LinkClickEvent, type LinkHandlerConfig, type Locale, MarkdownRenderer, type MarkdownRendererProps, type MessageBlock, MessageBubble, type MessageBubbleProps, MessageList, type MessageListProps, type MessageRole, ModeToggleButton, type ModeToggleButtonProps, PanelControls, type PanelControlsProps, PanelHeaderButtons, PanelResizer, Resizer, type ResizerProps, type ResolvedTheme, ResourceChip, ResourceChipList, type ResourceChipListProps, type ResourceChipProps, ResourcePicker, type ResourcePickerItem, type ResourcePickerProps, type ResourcePickerState, SanqianChat, SanqianChatMessage, type SanqianChatMessageProps, type SanqianChatProps, SanqianMessageList, type SanqianMessageListHandle, type SanqianMessageListProps, type SdkAdapterConfig, type SendMessage, type SendMessageOptions, type SessionResource, type SessionResourceEvent, type StoredSessionResource, type StreamEvent, StreamingTimeline, type StreamingTimelineProps, type ThemeMode, ThemeProvider, type ThemeProviderProps, ThinkingSection, type ThinkingSectionProps, ToolArgumentsDisplay, type ToolArgumentsDisplayProps, type ToolCall, type ToolCallStatus, type Translations, type UseAttachStateReturn, type UseChatOptions, type UseChatPanelReturn, type UseChatReturn, type UseConnectionOptions, type UseConnectionReturn, type UseConversationsOptions, type UseConversationsReturn, type UseFocusPersistenceOptions, type UseResourcePickerOptions, type UseResourcePickerReturn, type WindowPosition, createChatAdapter, createIpcAdapter, createSdkAdapter, ensureChatBaseStyles, ensureFullChatStyles, getTranslations, resolveChatStrings, useAttachState, useChat, useChatPanel, useChatStyles, useConnection, useConversations, useFocusPersistence, useI18n, useIpcUiConfig, useResolvedUiConfig, useResourcePicker, useStandaloneI18n, useStandaloneTheme, useTheme, useWindowDragLock };
@@ -681,6 +681,7 @@ interface UseChatReturn {
681
681
  conversationTitle: string | null;
682
682
  pendingInterrupt: HitlInterruptData | null;
683
683
  sendMessage: (content: string, options?: SendMessageOptions) => Promise<void>;
684
+ trySendMessage: (content: string, options?: SendMessageOptions) => Promise<boolean>;
684
685
  stopStreaming: () => void;
685
686
  clearMessages: () => void;
686
687
  setError: (error: string | null) => void;
@@ -980,6 +981,12 @@ interface UseResourcePickerReturn {
980
981
  }
981
982
  declare function useResourcePicker(options: UseResourcePickerOptions): UseResourcePickerReturn;
982
983
 
984
+ /**
985
+ * Temporarily disables drag regions while a modal/overlay is open.
986
+ * Uses reference counting to support nested overlays safely.
987
+ */
988
+ declare function useWindowDragLock(active: boolean): void;
989
+
983
990
  /**
984
991
  * IPC Adapter
985
992
  *
@@ -1044,12 +1051,13 @@ interface SanqianChatMessageProps {
1044
1051
  declare const SanqianChatMessage: react.NamedExoticComponent<SanqianChatMessageProps>;
1045
1052
 
1046
1053
  interface ChatInputProps {
1047
- onSend: (content: string) => void;
1054
+ onSend: (content: string) => boolean | void | Promise<boolean | void>;
1048
1055
  onStop?: () => void;
1049
1056
  placeholder?: string;
1050
1057
  disabled?: boolean;
1051
1058
  isStreaming?: boolean;
1052
1059
  isLoading?: boolean;
1060
+ allowEmptySubmit?: boolean;
1053
1061
  sendLabel?: string;
1054
1062
  stopLabel?: string;
1055
1063
  maxRows?: number;
@@ -1075,7 +1083,7 @@ interface FloatingChatProps {
1075
1083
  pendingInterrupt: HitlInterruptData | null;
1076
1084
  sessionResources?: StoredSessionResource[];
1077
1085
  onRemoveSessionResource?: (fullId: string) => void;
1078
- onSendMessage: (content: string) => void;
1086
+ onSendMessage: (content: string) => boolean | void | Promise<boolean | void>;
1079
1087
  onStopStreaming: () => void;
1080
1088
  onApproveHitl?: (remember?: boolean) => void;
1081
1089
  onRejectHitl?: (remember?: boolean) => void;
@@ -1637,4 +1645,4 @@ declare function ensureChatBaseStyles(): void;
1637
1645
  */
1638
1646
  declare function ensureFullChatStyles(): void;
1639
1647
 
1640
- export { AddResourceButton, type AddResourceButtonProps, type AlertAction, AlertBanner, type AlertBannerProps, type AlertConfig, type AlertType, AttachButton, type AttachButtonProps, type AttachConfig, type AttachPosition, type AttachState, type AttachedResource, AttachedResourceTags, type AttachedResourceTagsProps, type AttachmentMenuItem, type AttachmentMenuItemType, type ChatAdapter, type ChatAdapterConfig, type ChatFontSize, ChatInput, type ChatInputHandle, type ChatInputProps, type ChatPanelConfig, type ChatPanelMode, type ChatPanelPosition, type ChatThemeMode, type ChatUiConfig, type ChatUiConfigSerializable, type ChatUiStrings, CompactChat, type CompactChatProps, type ConnectionErrorCode, type ConnectionStatus, type ContextProviderInfo, type ConversationDetail, type ConversationInfo, FloatingChat, type FloatingChatProps, type FloatingWindowConfig, HistoryList, type HistoryListProps, HistoryModal, type HistoryModalProps, HitlCard, type HitlCardProps, type HitlInterruptData, I18nProvider, type I18nProviderProps, IntermediateSteps, type IntermediateStepsProps, type LinkClickEvent, type LinkHandlerConfig, type Locale, MarkdownRenderer, type MarkdownRendererProps, type MessageBlock, MessageBubble, type MessageBubbleProps, MessageList, type MessageListProps, type MessageRole, ModeToggleButton, type ModeToggleButtonProps, PanelControls, type PanelControlsProps, PanelHeaderButtons, PanelResizer, Resizer, type ResizerProps, type ResolvedTheme, ResourceChip, ResourceChipList, type ResourceChipListProps, type ResourceChipProps, ResourcePicker, type ResourcePickerItem, type ResourcePickerProps, type ResourcePickerState, SanqianChat, SanqianChatMessage, type SanqianChatMessageProps, type SanqianChatProps, SanqianMessageList, type SanqianMessageListHandle, type SanqianMessageListProps, type SdkAdapterConfig, type SendMessage, type SendMessageOptions, type SessionResource, type SessionResourceEvent, type StoredSessionResource, type StreamEvent, StreamingTimeline, type StreamingTimelineProps, type ThemeMode, ThemeProvider, type ThemeProviderProps, ThinkingSection, type ThinkingSectionProps, ToolArgumentsDisplay, type ToolArgumentsDisplayProps, type ToolCall, type ToolCallStatus, type Translations, type UseAttachStateReturn, type UseChatOptions, type UseChatPanelReturn, type UseChatReturn, type UseConnectionOptions, type UseConnectionReturn, type UseConversationsOptions, type UseConversationsReturn, type UseFocusPersistenceOptions, type UseResourcePickerOptions, type UseResourcePickerReturn, type WindowPosition, createChatAdapter, createIpcAdapter, createSdkAdapter, ensureChatBaseStyles, ensureFullChatStyles, getTranslations, resolveChatStrings, useAttachState, useChat, useChatPanel, useChatStyles, useConnection, useConversations, useFocusPersistence, useI18n, useIpcUiConfig, useResolvedUiConfig, useResourcePicker, useStandaloneI18n, useStandaloneTheme, useTheme };
1648
+ export { AddResourceButton, type AddResourceButtonProps, type AlertAction, AlertBanner, type AlertBannerProps, type AlertConfig, type AlertType, AttachButton, type AttachButtonProps, type AttachConfig, type AttachPosition, type AttachState, type AttachedResource, AttachedResourceTags, type AttachedResourceTagsProps, type AttachmentMenuItem, type AttachmentMenuItemType, type ChatAdapter, type ChatAdapterConfig, type ChatFontSize, ChatInput, type ChatInputHandle, type ChatInputProps, type ChatPanelConfig, type ChatPanelMode, type ChatPanelPosition, type ChatThemeMode, type ChatUiConfig, type ChatUiConfigSerializable, type ChatUiStrings, CompactChat, type CompactChatProps, type ConnectionErrorCode, type ConnectionStatus, type ContextProviderInfo, type ConversationDetail, type ConversationInfo, FloatingChat, type FloatingChatProps, type FloatingWindowConfig, HistoryList, type HistoryListProps, HistoryModal, type HistoryModalProps, HitlCard, type HitlCardProps, type HitlInterruptData, I18nProvider, type I18nProviderProps, IntermediateSteps, type IntermediateStepsProps, type LinkClickEvent, type LinkHandlerConfig, type Locale, MarkdownRenderer, type MarkdownRendererProps, type MessageBlock, MessageBubble, type MessageBubbleProps, MessageList, type MessageListProps, type MessageRole, ModeToggleButton, type ModeToggleButtonProps, PanelControls, type PanelControlsProps, PanelHeaderButtons, PanelResizer, Resizer, type ResizerProps, type ResolvedTheme, ResourceChip, ResourceChipList, type ResourceChipListProps, type ResourceChipProps, ResourcePicker, type ResourcePickerItem, type ResourcePickerProps, type ResourcePickerState, SanqianChat, SanqianChatMessage, type SanqianChatMessageProps, type SanqianChatProps, SanqianMessageList, type SanqianMessageListHandle, type SanqianMessageListProps, type SdkAdapterConfig, type SendMessage, type SendMessageOptions, type SessionResource, type SessionResourceEvent, type StoredSessionResource, type StreamEvent, StreamingTimeline, type StreamingTimelineProps, type ThemeMode, ThemeProvider, type ThemeProviderProps, ThinkingSection, type ThinkingSectionProps, ToolArgumentsDisplay, type ToolArgumentsDisplayProps, type ToolCall, type ToolCallStatus, type Translations, type UseAttachStateReturn, type UseChatOptions, type UseChatPanelReturn, type UseChatReturn, type UseConnectionOptions, type UseConnectionReturn, type UseConversationsOptions, type UseConversationsReturn, type UseFocusPersistenceOptions, type UseResourcePickerOptions, type UseResourcePickerReturn, type WindowPosition, createChatAdapter, createIpcAdapter, createSdkAdapter, ensureChatBaseStyles, ensureFullChatStyles, getTranslations, resolveChatStrings, useAttachState, useChat, useChatPanel, useChatStyles, useConnection, useConversations, useFocusPersistence, useI18n, useIpcUiConfig, useResolvedUiConfig, useResourcePicker, useStandaloneI18n, useStandaloneTheme, useTheme, useWindowDragLock };