Skip to content

Commit 3a8170b

Browse files
authored
refactor: improve typescript type safety across codebase (#68)
* chore: improve developer experience Signed-off-by: mateonunez <mateonunez95@gmail.com> * fix(retove): slack query with consistent cursor comparison Signed-off-by: mateonunez <mateonunez95@gmail.com> * chore: fix and lint Signed-off-by: mateonunez <mateonunez95@gmail.com> * docs(readme): add seed step Signed-off-by: mateonunez <mateonunez95@gmail.com> --------- Signed-off-by: mateonunez <mateonunez95@gmail.com>
1 parent 7880c58 commit 3a8170b

64 files changed

Lines changed: 3505 additions & 831 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,14 @@ cp .env.example .env
2929
# 4. Initialize database
3030
pnpm migrate
3131

32-
# 5. Install Ollama models (required for AI features)
33-
docker exec -it ait_ollama ollama pull gemma3:latest # gpt-oss:20b-cloud
32+
# 5. Seed database (Initial providers configuration)
33+
pnpm run --filter @ait/postgres db:seed
34+
35+
# 6. Install Ollama models (required for AI features)
36+
docker exec -it ait_ollama ollama pull gemma3:latest
3437
docker exec -it ait_ollama ollama pull mxbai-embed-large:latest
3538

36-
# 6. Start development servers
39+
# 7. Start development servers
3740
pnpm dev
3841
```
3942

@@ -45,7 +48,7 @@ AIt follows a modular monorepo architecture with clear separation of concerns:
4548
┌─────────────────────────────────────────────────────────────────────────────┐
4649
│ UIt │
4750
│ (Web Interface - React) │
48-
└────────────────────────────────────────────────────────────────────────────┘
51+
└────────────────────────────────────────────────────────────────────────────┘
4952
5053
5154
┌─────────────────────────────────────────────────────────────────────────────┐
@@ -65,7 +68,7 @@ AIt follows a modular monorepo architecture with clear separation of concerns:
6568
│ INFRASTRUCTURE LAYER │
6669
├─────────────────┬─────────────────┬─────────────────┬───────────────────────┤
6770
│ PostgreSQL │ Qdrant │ Ollama │ Redis │
68-
│ (Structured DB) │ (Vector Store) │ (Local LLM) │ (Job Queue)
71+
│ (Structured DB) │ (Vector Store) │ (Local LLM) │ (Job Queue) │
6972
└─────────────────┴─────────────────┴─────────────────┴───────────────────────┘
7073
```
7174

packages/apps/uit/src/components/chat/chat-header-actions.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"use client";
22

33
import { cn } from "@/styles/utils";
4+
import type { TokenUsage } from "@ait/core";
45
import { MessageSquarePlus, PanelRight } from "lucide-react";
56
import { ModelSelector } from "../ai-elements";
67
import { ContextWindowTracker } from "../context-window-tracker";
@@ -17,7 +18,7 @@ export const ChatHeaderActions = ({
1718
}: {
1819
selectedModel: string;
1920
setSelectedModel: (id: string) => void;
20-
tokenUsage: any;
21+
tokenUsage: TokenUsage;
2122
maxContextWindow: number;
2223
isLoading: boolean;
2324
messagesLength: number;

packages/apps/uit/src/components/chat/chat-sidebar-panel.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import { useIsMobile } from "@/hooks/use-mobile";
44

5-
import type { Conversation as ConversationType } from "@ait/core";
5+
import type { ChatMessageWithMetadata, Conversation as ConversationType, TokenUsage } from "@ait/core";
66
import { AnimatePresence, motion } from "framer-motion";
77
import { Brain, Database, ListChecks, MessageCircle, Wrench, Zap } from "lucide-react";
88
import { useMemo } from "react";
@@ -20,11 +20,11 @@ interface ChatSidebarPanelProps {
2020
handleConversationSelect: (id: string) => void;
2121
handleDeleteConversation: (id: string) => Promise<void>;
2222
handleNewChat: () => void;
23-
tokenUsage: any;
23+
tokenUsage: TokenUsage;
2424
maxContextWindow: number;
2525
selectedModel: string;
2626
setSelectedModel: (id: string) => void;
27-
latestAssistantMessage: any;
27+
latestAssistantMessage: ChatMessageWithMetadata | null;
2828
isOpen?: boolean;
2929
onClose?: () => void;
3030
}

packages/apps/uit/src/components/context-window-tracker.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import type { TokenUsage } from "@/hooks/useAItChat";
21
import { cn } from "@/styles/utils";
32
import { calculateContextWindowUsage, formatTokenCount } from "@/utils/token-counter.utils";
3+
import type { TokenUsage } from "@ait/core";
44
import { motion } from "framer-motion";
55
import { AlertTriangle, Database, TrendingUp } from "lucide-react";
66
import { useMemo } from "react";

packages/apps/uit/src/components/discovery/discovery-stats.tsx

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { Skeleton } from "@/components/ui/skeleton";
88
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group";
99
import { useInsights } from "@/contexts/insights.context";
1010
import { useConnectionStatus } from "@/hooks/useConnectionStatus";
11+
import type { DailyActivity, DiscoveryStatsData } from "@/services/discovery.service";
1112
import { fetchDiscoveryStats } from "@/services/observability.service";
1213
import { cn } from "@/styles/utils";
1314
import { getLogger } from "@ait/core";
@@ -33,17 +34,6 @@ import { AiInsightsPanel } from "./ai-insights-panel";
3334

3435
const logger = getLogger();
3536

36-
interface DailyActivity {
37-
date: string;
38-
[integrationKey: string]: number | string;
39-
}
40-
41-
interface DiscoveryStatsData {
42-
timeRange: "week" | "month" | "year";
43-
data: DailyActivity[];
44-
totals: Record<string, number>;
45-
}
46-
4737
interface StatCardProps {
4838
item: {
4939
id: string;

packages/apps/uit/src/hooks/useAItChat.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { getConversation, sendMessage } from "@/services/chat.service";
22
import { createEmptyMetadata } from "@/utils/stream-parser.utils";
33
import { calculateConversationTokens } from "@/utils/token-counter.utils";
4-
import type { ChatMessageWithMetadata, MessageRole } from "@ait/core";
4+
import type { ChatMessageWithMetadata, MessageRole, TokenUsage } from "@ait/core";
55
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
66

77
export interface UseAItChatOptions {
@@ -13,13 +13,6 @@ export interface UseAItChatOptions {
1313
onError?: (error: string) => void;
1414
}
1515

16-
export interface TokenUsage {
17-
inputTokens: number;
18-
outputTokens: number;
19-
ragContextTokens: number;
20-
totalTokens: number;
21-
}
22-
2316
export interface UseAItChatReturn {
2417
messages: ChatMessageWithMetadata[];
2518
isLoading: boolean;
@@ -70,7 +63,7 @@ export function useAItChat(options: UseAItChatOptions = {}): UseAItChatReturn {
7063
id: message.id,
7164
role: message.role as MessageRole,
7265
content: message.content,
73-
metadata: message.metadata as any,
66+
metadata: message.metadata as ChatMessageWithMetadata["metadata"],
7467
traceId: message.traceId || undefined,
7568
createdAt: new Date(message.createdAt),
7669
}));

packages/apps/uit/src/services/discovery.service.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,17 @@ export interface DiscoveryServiceOptions {
4444
cacheTtlMs?: number;
4545
}
4646

47+
export interface DailyActivity {
48+
date: string;
49+
[integrationKey: string]: number | string;
50+
}
51+
52+
export interface DiscoveryStatsData {
53+
timeRange: "week" | "month" | "year";
54+
data: DailyActivity[];
55+
totals: Record<string, number>;
56+
}
57+
4758
/**
4859
* Fetch discovery feed with caching and retry logic
4960
*/
@@ -109,19 +120,19 @@ export async function fetchDiscoveryFeed(
109120
/**
110121
* Fetch discovery stats with retries
111122
*/
112-
export async function fetchDiscoveryStats(range: "week" | "month" | "year" = "week"): Promise<any> {
123+
export async function fetchDiscoveryStats(range: "week" | "month" | "year" = "week"): Promise<DiscoveryStatsData> {
113124
const url = `${apiConfig.apiBaseUrl}/discovery/stats?range=${range}`;
114125
let lastError: Error | null = null;
115126

116127
for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
117128
try {
118-
const res = await apiGet<any>(url);
129+
const res = await apiGet<unknown>(url);
119130

120131
if (!res.ok) {
121132
throw new Error(res.error || "Failed to fetch discovery stats");
122133
}
123134

124-
return res.data;
135+
return res.data as DiscoveryStatsData;
125136
} catch (error) {
126137
lastError = error instanceof Error ? error : new Error(String(error));
127138
logger.warn("[DiscoveryService] Stats fetch attempt failed", {

packages/connectors/src/domain/entities/vendors/google/connector.google-calendar-event.repository.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -52,34 +52,34 @@ export class ConnectorGoogleCalendarEventRepository implements IConnectorGoogleC
5252
locked: eventDataTarget.locked,
5353
attendeesOmitted: eventDataTarget.attendeesOmitted,
5454
attendeesCount: eventDataTarget.attendeesCount,
55-
creatorData: eventDataTarget.creatorData as any,
56-
organizerData: eventDataTarget.organizerData as any,
57-
attendeesData: eventDataTarget.attendeesData as any,
58-
recurrenceData: eventDataTarget.recurrenceData as any,
59-
remindersData: eventDataTarget.remindersData as any,
60-
conferenceData: eventDataTarget.conferenceData as any,
61-
attachmentsData: eventDataTarget.attachmentsData as any,
62-
extendedPropertiesData: eventDataTarget.extendedPropertiesData as any,
63-
metadata: eventDataTarget.metadata as any,
55+
creatorData: eventDataTarget.creatorData as Record<string, unknown>,
56+
organizerData: eventDataTarget.organizerData as Record<string, unknown>,
57+
attendeesData: eventDataTarget.attendeesData as unknown[],
58+
recurrenceData: eventDataTarget.recurrenceData as unknown[],
59+
remindersData: eventDataTarget.remindersData as Record<string, unknown>,
60+
conferenceData: eventDataTarget.conferenceData as Record<string, unknown>,
61+
attachmentsData: eventDataTarget.attachmentsData as unknown[],
62+
extendedPropertiesData: eventDataTarget.extendedPropertiesData as Record<string, unknown>,
63+
metadata: eventDataTarget.metadata as Record<string, unknown>,
6464
eventCreatedAt: eventDataTarget.eventCreatedAt,
6565
eventUpdatedAt: eventDataTarget.eventUpdatedAt,
6666
updatedAt: new Date(),
6767
};
6868

6969
await tx
7070
.insert(googleCalendarEvents)
71-
.values(eventDataTarget as any)
71+
.values(eventDataTarget as GoogleCalendarEventDataTarget)
7272
.onConflictDoUpdate({
7373
target: googleCalendarEvents.id,
7474
set: updateValues,
7575
})
7676
.execute();
7777
});
78-
} catch (error: any) {
78+
} catch (error: unknown) {
7979
logger.error("Failed to save Google Calendar event:", { eventId: event.id, error });
8080
throw new AItError(
8181
"GOOGLE_CALENDAR_SAVE_EVENT",
82-
`Failed to save event ${event.id}: ${error.message}`,
82+
`Failed to save event ${event.id}: ${(error as Error).message}`,
8383
{ id: event.id },
8484
error,
8585
);

packages/connectors/src/domain/entities/vendors/slack/connector.slack-message.repository.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,18 @@ export class ConnectorSlackMessageRepository implements IConnectorSlackMessageRe
3535

3636
await tx
3737
.insert(slackMessages)
38-
.values(messageDataTarget as any)
38+
.values(messageDataTarget as SlackMessageDataTarget)
3939
.onConflictDoUpdate({
4040
target: slackMessages.id,
4141
set: updateValues,
4242
})
4343
.execute();
4444
});
45-
} catch (error: any) {
45+
} catch (error: unknown) {
4646
logger.error("Failed to save message:", { messageId, error });
4747
throw new AItError(
4848
"SLACK_SAVE_MESSAGE",
49-
`Failed to save message ${messageId}: ${error.message}`,
49+
`Failed to save message ${messageId}: ${(error as Error).message}`,
5050
{ id: messageId },
5151
error,
5252
);

packages/connectors/src/domain/entities/vendors/x/connector.x.repository.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,21 @@ export class ConnectorXTweetRepository implements IConnectorXTweetRepository {
4848

4949
await tx
5050
.insert(xTweets)
51-
.values(tweetData as any)
51+
.values(tweetData as XTweetDataTarget)
5252
.onConflictDoUpdate({
5353
target: xTweets.id,
5454
set: updateValues,
5555
})
5656
.execute();
5757
});
58-
} catch (error: any) {
58+
} catch (error: unknown) {
5959
logger.error("Failed to save tweet:", { tweetId, error });
60-
throw new AItError("X_SAVE_TWEET", `Failed to save tweet ${tweetId}: ${error.message}`, { id: tweetId }, error);
60+
throw new AItError(
61+
"X_SAVE_TWEET",
62+
`Failed to save tweet ${tweetId}: ${(error as Error).message}`,
63+
{ id: tweetId },
64+
error,
65+
);
6166
}
6267
}
6368

0 commit comments

Comments
 (0)