per-connector defaults, periodic sync, and double-trigger guard

This commit is contained in:
CREDO23 2026-03-10 16:20:11 +02:00
parent f552a3186f
commit f5db2184c7
2 changed files with 49 additions and 20 deletions

View file

@ -241,22 +241,28 @@ export const COMPOSIO_TOOLKITS = [
}, },
] as const; ] as const;
// Skip IndexingConfigurationView and auto-index with defaults after OAuth // Per-connector defaults for auto-indexing after OAuth (days back, days forward, periodic frequency in minutes)
export const AUTO_INDEX_CONNECTOR_TYPES = new Set<string>([ export const AUTO_INDEX_DEFAULTS: Record<string, { daysBack: number; daysForward: number; frequencyMinutes: number }> = {
EnumConnectorName.GOOGLE_GMAIL_CONNECTOR, // Messaging — high volume, recent messages matter most
EnumConnectorName.GOOGLE_CALENDAR_CONNECTOR, [EnumConnectorName.GOOGLE_GMAIL_CONNECTOR]: { daysBack: 30, daysForward: 0, frequencyMinutes: 1440 },
EnumConnectorName.COMPOSIO_GMAIL_CONNECTOR, [EnumConnectorName.COMPOSIO_GMAIL_CONNECTOR]: { daysBack: 30, daysForward: 0, frequencyMinutes: 1440 },
EnumConnectorName.COMPOSIO_GOOGLE_CALENDAR_CONNECTOR, [EnumConnectorName.SLACK_CONNECTOR]: { daysBack: 30, daysForward: 0, frequencyMinutes: 1440 },
EnumConnectorName.AIRTABLE_CONNECTOR, [EnumConnectorName.DISCORD_CONNECTOR]: { daysBack: 30, daysForward: 0, frequencyMinutes: 1440 },
EnumConnectorName.NOTION_CONNECTOR, [EnumConnectorName.TEAMS_CONNECTOR]: { daysBack: 30, daysForward: 0, frequencyMinutes: 1440 },
EnumConnectorName.LINEAR_CONNECTOR, // Calendar — past context + upcoming events
EnumConnectorName.SLACK_CONNECTOR, [EnumConnectorName.GOOGLE_CALENDAR_CONNECTOR]: { daysBack: 90, daysForward: 90, frequencyMinutes: 1440 },
EnumConnectorName.TEAMS_CONNECTOR, [EnumConnectorName.COMPOSIO_GOOGLE_CALENDAR_CONNECTOR]: { daysBack: 90, daysForward: 90, frequencyMinutes: 1440 },
EnumConnectorName.DISCORD_CONNECTOR, // Project management — medium-term relevance
EnumConnectorName.JIRA_CONNECTOR, [EnumConnectorName.LINEAR_CONNECTOR]: { daysBack: 90, daysForward: 0, frequencyMinutes: 1440 },
EnumConnectorName.CONFLUENCE_CONNECTOR, [EnumConnectorName.JIRA_CONNECTOR]: { daysBack: 90, daysForward: 0, frequencyMinutes: 1440 },
EnumConnectorName.CLICKUP_CONNECTOR, [EnumConnectorName.CLICKUP_CONNECTOR]: { daysBack: 90, daysForward: 0, frequencyMinutes: 1440 },
]); // Knowledge bases — evergreen content
[EnumConnectorName.NOTION_CONNECTOR]: { daysBack: 365, daysForward: 0, frequencyMinutes: 1440 },
[EnumConnectorName.CONFLUENCE_CONNECTOR]: { daysBack: 365, daysForward: 0, frequencyMinutes: 1440 },
[EnumConnectorName.AIRTABLE_CONNECTOR]: { daysBack: 365, daysForward: 0, frequencyMinutes: 1440 },
};
export const AUTO_INDEX_CONNECTOR_TYPES = new Set<string>(Object.keys(AUTO_INDEX_DEFAULTS));
// Re-export IndexingConfigState from schemas for backward compatibility // Re-export IndexingConfigState from schemas for backward compatibility
export type { IndexingConfigState } from "./connector-popup.schemas"; export type { IndexingConfigState } from "./connector-popup.schemas";

View file

@ -29,6 +29,7 @@ import { queryClient } from "@/lib/query-client/client";
import type { IndexingConfigState } from "../constants/connector-constants"; import type { IndexingConfigState } from "../constants/connector-constants";
import { import {
AUTO_INDEX_CONNECTOR_TYPES, AUTO_INDEX_CONNECTOR_TYPES,
AUTO_INDEX_DEFAULTS,
COMPOSIO_CONNECTORS, COMPOSIO_CONNECTORS,
OAUTH_CONNECTORS, OAUTH_CONNECTORS,
OTHER_CONNECTORS, OTHER_CONNECTORS,
@ -81,6 +82,7 @@ export const useConnectorDialog = () => {
const [connectingConnectorType, setConnectingConnectorType] = useState<string | null>(null); const [connectingConnectorType, setConnectingConnectorType] = useState<string | null>(null);
const [isCreatingConnector, setIsCreatingConnector] = useState(false); const [isCreatingConnector, setIsCreatingConnector] = useState(false);
const isCreatingConnectorRef = useRef(false); const isCreatingConnectorRef = useRef(false);
const isAutoIndexingRef = useRef(false);
// Accounts list view state (for OAuth connectors with multiple accounts) // Accounts list view state (for OAuth connectors with multiple accounts)
const [viewingAccountsType, setViewingAccountsType] = useState<{ const [viewingAccountsType, setViewingAccountsType] = useState<{
@ -126,20 +128,40 @@ export const useConnectorDialog = () => {
connectorTitle: string, connectorTitle: string,
connectorType: string connectorType: string
) => { ) => {
if (!searchSpaceId) return; if (!searchSpaceId || isAutoIndexingRef.current) return;
isAutoIndexingRef.current = true;
const defaults = AUTO_INDEX_DEFAULTS[connectorType];
const now = new Date();
const startDate = new Date(now);
startDate.setDate(startDate.getDate() - (defaults?.daysBack ?? 365));
const endDate = new Date(now);
endDate.setDate(endDate.getDate() + (defaults?.daysForward ?? 0));
setIsOpen(true); setIsOpen(true);
try { try {
await updateConnector({
id: connector.id,
data: {
periodic_indexing_enabled: true,
indexing_frequency_minutes: defaults?.frequencyMinutes ?? 1440,
},
});
await indexConnector({ await indexConnector({
connector_id: connector.id, connector_id: connector.id,
queryParams: { search_space_id: searchSpaceId }, queryParams: {
search_space_id: searchSpaceId,
start_date: format(startDate, "yyyy-MM-dd"),
end_date: format(endDate, "yyyy-MM-dd"),
},
}); });
trackIndexWithDateRangeStarted( trackIndexWithDateRangeStarted(
Number(searchSpaceId), Number(searchSpaceId),
connectorType, connectorType,
connector.id, connector.id,
{ hasStartDate: false, hasEndDate: false } { hasStartDate: true, hasEndDate: true }
); );
toast.success(`${connectorTitle} connected!`, { toast.success(`${connectorTitle} connected!`, {
@ -166,8 +188,9 @@ export const useConnectorDialog = () => {
queryKey: cacheKeys.logs.summary(Number(searchSpaceId)), queryKey: cacheKeys.logs.summary(Number(searchSpaceId)),
}); });
await refetchAllConnectors(); await refetchAllConnectors();
isAutoIndexingRef.current = false;
}, },
[searchSpaceId, indexConnector, refetchAllConnectors, setIsOpen, router] [searchSpaceId, indexConnector, updateConnector, refetchAllConnectors, setIsOpen, router]
); );
// Synchronize state with URL query params // Synchronize state with URL query params