iris-chatbot 0.2.4
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.
- package/LICENSE +21 -0
- package/README.md +49 -0
- package/bin/iris.mjs +267 -0
- package/package.json +61 -0
- package/template/LICENSE +21 -0
- package/template/README.md +49 -0
- package/template/eslint.config.mjs +18 -0
- package/template/next.config.ts +7 -0
- package/template/package-lock.json +9193 -0
- package/template/package.json +46 -0
- package/template/postcss.config.mjs +7 -0
- package/template/public/file.svg +1 -0
- package/template/public/globe.svg +1 -0
- package/template/public/next.svg +1 -0
- package/template/public/vercel.svg +1 -0
- package/template/public/window.svg +1 -0
- package/template/src/app/api/chat/route.ts +2445 -0
- package/template/src/app/api/connections/models/route.ts +255 -0
- package/template/src/app/api/connections/test/route.ts +124 -0
- package/template/src/app/api/local-sync/route.ts +74 -0
- package/template/src/app/api/tool-approval/route.ts +47 -0
- package/template/src/app/favicon.ico +0 -0
- package/template/src/app/globals.css +808 -0
- package/template/src/app/layout.tsx +74 -0
- package/template/src/app/page.tsx +444 -0
- package/template/src/components/ChatView.tsx +1537 -0
- package/template/src/components/Composer.tsx +160 -0
- package/template/src/components/MapView.tsx +244 -0
- package/template/src/components/MessageCard.tsx +955 -0
- package/template/src/components/SearchModal.tsx +72 -0
- package/template/src/components/SettingsModal.tsx +1257 -0
- package/template/src/components/Sidebar.tsx +153 -0
- package/template/src/components/TopBar.tsx +164 -0
- package/template/src/lib/connections.ts +275 -0
- package/template/src/lib/data.ts +324 -0
- package/template/src/lib/db.ts +49 -0
- package/template/src/lib/hooks.ts +76 -0
- package/template/src/lib/local-sync.ts +192 -0
- package/template/src/lib/memory.ts +695 -0
- package/template/src/lib/model-presets.ts +251 -0
- package/template/src/lib/store.ts +36 -0
- package/template/src/lib/tooling/approvals.ts +78 -0
- package/template/src/lib/tooling/providers/anthropic.ts +155 -0
- package/template/src/lib/tooling/providers/ollama.ts +73 -0
- package/template/src/lib/tooling/providers/openai.ts +267 -0
- package/template/src/lib/tooling/providers/openai_compatible.ts +16 -0
- package/template/src/lib/tooling/providers/types.ts +44 -0
- package/template/src/lib/tooling/registry.ts +103 -0
- package/template/src/lib/tooling/runtime.ts +189 -0
- package/template/src/lib/tooling/safety.ts +165 -0
- package/template/src/lib/tooling/tools/apps.ts +108 -0
- package/template/src/lib/tooling/tools/apps_plus.ts +153 -0
- package/template/src/lib/tooling/tools/communication.ts +883 -0
- package/template/src/lib/tooling/tools/files.ts +395 -0
- package/template/src/lib/tooling/tools/music.ts +988 -0
- package/template/src/lib/tooling/tools/notes.ts +461 -0
- package/template/src/lib/tooling/tools/notes_plus.ts +294 -0
- package/template/src/lib/tooling/tools/numbers.ts +175 -0
- package/template/src/lib/tooling/tools/schedule.ts +579 -0
- package/template/src/lib/tooling/tools/system.ts +142 -0
- package/template/src/lib/tooling/tools/web.ts +212 -0
- package/template/src/lib/tooling/tools/workflow.ts +218 -0
- package/template/src/lib/tooling/types.ts +27 -0
- package/template/src/lib/types.ts +309 -0
- package/template/src/lib/utils.ts +108 -0
- package/template/tsconfig.json +34 -0
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
export type BuiltInProvider = "openai" | "anthropic" | "google";
|
|
2
|
+
export type ConnectionKind = "builtin" | "openai_compatible" | "ollama";
|
|
3
|
+
|
|
4
|
+
export type ConnectionHeader = {
|
|
5
|
+
key: string;
|
|
6
|
+
value: string;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export type ModelConnection = {
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
kind: ConnectionKind;
|
|
13
|
+
provider?: BuiltInProvider;
|
|
14
|
+
baseUrl?: string;
|
|
15
|
+
apiKey?: string;
|
|
16
|
+
headers?: ConnectionHeader[];
|
|
17
|
+
supportsTools?: boolean;
|
|
18
|
+
enabled: boolean;
|
|
19
|
+
createdAt: number;
|
|
20
|
+
updatedAt: number;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
// Backwards-compat alias for older UI code; runtime now uses connection ids.
|
|
24
|
+
export type Provider = BuiltInProvider;
|
|
25
|
+
|
|
26
|
+
export type MessageNode = {
|
|
27
|
+
id: string;
|
|
28
|
+
conversationId: string;
|
|
29
|
+
parentId: string | null;
|
|
30
|
+
role: "system" | "user" | "assistant";
|
|
31
|
+
content: string;
|
|
32
|
+
createdAt: number;
|
|
33
|
+
provider?: string;
|
|
34
|
+
model?: string;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export type Thread = {
|
|
38
|
+
id: string;
|
|
39
|
+
conversationId: string;
|
|
40
|
+
headMessageId: string | null;
|
|
41
|
+
title: string;
|
|
42
|
+
forkedFromMessageId: string | null;
|
|
43
|
+
updatedAt: number;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export type ApprovalMode =
|
|
47
|
+
| "always_confirm_writes"
|
|
48
|
+
| "confirm_risky_only"
|
|
49
|
+
| "trusted_auto";
|
|
50
|
+
|
|
51
|
+
export type SafetyProfile = "strict" | "balanced" | "auto";
|
|
52
|
+
|
|
53
|
+
export type WebSearchBackend = "no_key" | "hybrid";
|
|
54
|
+
|
|
55
|
+
export type LocalToolsSettings = {
|
|
56
|
+
enabled: boolean;
|
|
57
|
+
approvalMode: ApprovalMode;
|
|
58
|
+
safetyProfile: SafetyProfile;
|
|
59
|
+
allowedRoots: string[];
|
|
60
|
+
enableNotes: boolean;
|
|
61
|
+
enableApps: boolean;
|
|
62
|
+
enableNumbers: boolean;
|
|
63
|
+
enableWeb: boolean;
|
|
64
|
+
enableMusic: boolean;
|
|
65
|
+
enableCalendar: boolean;
|
|
66
|
+
enableMail: boolean;
|
|
67
|
+
enableWorkflow: boolean;
|
|
68
|
+
enableSystem: boolean;
|
|
69
|
+
webSearchBackend: WebSearchBackend;
|
|
70
|
+
dryRun: boolean;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
export const DEFAULT_LOCAL_TOOL_ROOTS = [
|
|
74
|
+
"/Users/evanalexander/zenith",
|
|
75
|
+
"~/Desktop",
|
|
76
|
+
"~/Documents",
|
|
77
|
+
"~/Downloads",
|
|
78
|
+
] as const;
|
|
79
|
+
|
|
80
|
+
export const DEFAULT_LOCAL_TOOLS_SETTINGS: LocalToolsSettings = {
|
|
81
|
+
enabled: true,
|
|
82
|
+
approvalMode: "trusted_auto",
|
|
83
|
+
safetyProfile: "balanced",
|
|
84
|
+
allowedRoots: [...DEFAULT_LOCAL_TOOL_ROOTS],
|
|
85
|
+
enableNotes: true,
|
|
86
|
+
enableApps: true,
|
|
87
|
+
enableNumbers: false,
|
|
88
|
+
enableWeb: false,
|
|
89
|
+
enableMusic: true,
|
|
90
|
+
enableCalendar: false,
|
|
91
|
+
enableMail: false,
|
|
92
|
+
enableWorkflow: true,
|
|
93
|
+
enableSystem: true,
|
|
94
|
+
webSearchBackend: "no_key",
|
|
95
|
+
dryRun: false,
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export type MemoryKind = "profile" | "preference" | "person_alias" | "music_alias" | "note";
|
|
99
|
+
|
|
100
|
+
export type MemoryScope = "global" | "conversation";
|
|
101
|
+
|
|
102
|
+
export type MemorySource = "auto" | "explicit" | "manual";
|
|
103
|
+
|
|
104
|
+
export type MemoryEntry = {
|
|
105
|
+
id: string;
|
|
106
|
+
kind: MemoryKind;
|
|
107
|
+
scope: MemoryScope;
|
|
108
|
+
conversationId?: string;
|
|
109
|
+
key: string;
|
|
110
|
+
value: string;
|
|
111
|
+
normalizedKey: string;
|
|
112
|
+
source: MemorySource;
|
|
113
|
+
confidence: number;
|
|
114
|
+
createdAt: number;
|
|
115
|
+
updatedAt: number;
|
|
116
|
+
lastUsedAt: number;
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
export type MemorySettings = {
|
|
120
|
+
enabled: boolean;
|
|
121
|
+
autoCapture: boolean;
|
|
122
|
+
toolInfluence: boolean;
|
|
123
|
+
extractionMode: "conservative";
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
export const DEFAULT_MEMORY_SETTINGS: MemorySettings = {
|
|
127
|
+
enabled: true,
|
|
128
|
+
autoCapture: true,
|
|
129
|
+
toolInfluence: true,
|
|
130
|
+
extractionMode: "conservative",
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
export type MemoryPersonAlias = {
|
|
134
|
+
alias: string;
|
|
135
|
+
target: string;
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
export type MemoryMusicAlias = {
|
|
139
|
+
alias: string;
|
|
140
|
+
query: string;
|
|
141
|
+
title?: string;
|
|
142
|
+
artist?: string;
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
export type MemoryContextPayload = {
|
|
146
|
+
enabled: boolean;
|
|
147
|
+
aliases: {
|
|
148
|
+
people: MemoryPersonAlias[];
|
|
149
|
+
music: MemoryMusicAlias[];
|
|
150
|
+
};
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
export type Settings = {
|
|
154
|
+
id: "settings";
|
|
155
|
+
// Legacy fields kept for one migration cycle.
|
|
156
|
+
openaiKey?: string;
|
|
157
|
+
anthropicKey?: string;
|
|
158
|
+
geminiKey?: string;
|
|
159
|
+
defaultProvider: Provider;
|
|
160
|
+
defaultModel: string;
|
|
161
|
+
connections: ModelConnection[];
|
|
162
|
+
defaultConnectionId: string;
|
|
163
|
+
defaultModelByConnection: Record<string, string>;
|
|
164
|
+
showExtendedOpenAIModels?: boolean;
|
|
165
|
+
enableWebSources: boolean;
|
|
166
|
+
accentColor?: string;
|
|
167
|
+
font?: "ibm" | "manrope" | "sora" | "space" | "poppins";
|
|
168
|
+
theme?: "dark" | "light";
|
|
169
|
+
localTools?: LocalToolsSettings;
|
|
170
|
+
memory?: MemorySettings;
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
export type ChatConnectionPayload = {
|
|
174
|
+
id: string;
|
|
175
|
+
name: string;
|
|
176
|
+
kind: ConnectionKind;
|
|
177
|
+
provider?: BuiltInProvider;
|
|
178
|
+
baseUrl?: string;
|
|
179
|
+
apiKey?: string;
|
|
180
|
+
headers?: ConnectionHeader[];
|
|
181
|
+
supportsTools?: boolean;
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
export type ToolExecutionStage = "call" | "progress" | "result";
|
|
185
|
+
|
|
186
|
+
export type ToolEvent = {
|
|
187
|
+
id: string;
|
|
188
|
+
conversationId: string;
|
|
189
|
+
threadId: string;
|
|
190
|
+
assistantMessageId: string;
|
|
191
|
+
toolCallId: string;
|
|
192
|
+
toolName: string;
|
|
193
|
+
stage: ToolExecutionStage;
|
|
194
|
+
message?: string;
|
|
195
|
+
payloadJson?: string;
|
|
196
|
+
createdAt: number;
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
export type ToolApprovalStatus = "requested" | "approved" | "denied" | "timeout";
|
|
200
|
+
|
|
201
|
+
export type ToolApproval = {
|
|
202
|
+
id: string;
|
|
203
|
+
conversationId: string;
|
|
204
|
+
threadId: string;
|
|
205
|
+
assistantMessageId: string;
|
|
206
|
+
toolCallId: string;
|
|
207
|
+
toolName: string;
|
|
208
|
+
argsJson?: string;
|
|
209
|
+
reason?: string;
|
|
210
|
+
status: ToolApprovalStatus;
|
|
211
|
+
requestedAt: number;
|
|
212
|
+
resolvedAt?: number;
|
|
213
|
+
};
|
|
214
|
+
|
|
215
|
+
export type ChatMessageInput = {
|
|
216
|
+
role: "user" | "assistant" | "system";
|
|
217
|
+
content: string;
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
export type ChatCitationSource = {
|
|
221
|
+
url: string;
|
|
222
|
+
title?: string;
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
export type ChatRequest = {
|
|
226
|
+
// Legacy fallback for one migration cycle.
|
|
227
|
+
provider?: Provider;
|
|
228
|
+
model: string;
|
|
229
|
+
apiKey?: string;
|
|
230
|
+
connection?: ChatConnectionPayload;
|
|
231
|
+
system?: string;
|
|
232
|
+
messages: ChatMessageInput[];
|
|
233
|
+
stream: boolean;
|
|
234
|
+
localTools?: LocalToolsSettings;
|
|
235
|
+
memory?: MemoryContextPayload;
|
|
236
|
+
enableWebSources?: boolean;
|
|
237
|
+
meta?: {
|
|
238
|
+
threadId?: string;
|
|
239
|
+
conversationId?: string;
|
|
240
|
+
assistantMessageId?: string;
|
|
241
|
+
};
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
export type ToolCallEvent = {
|
|
245
|
+
type: "tool_call";
|
|
246
|
+
callId: string;
|
|
247
|
+
name: string;
|
|
248
|
+
args?: Record<string, unknown>;
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
export type ToolProgressEvent = {
|
|
252
|
+
type: "tool_progress";
|
|
253
|
+
callId: string;
|
|
254
|
+
name: string;
|
|
255
|
+
status: "started" | "running" | "warning" | "info" | "completed";
|
|
256
|
+
message: string;
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
export type ToolResultEvent = {
|
|
260
|
+
type: "tool_result";
|
|
261
|
+
callId: string;
|
|
262
|
+
name: string;
|
|
263
|
+
ok: boolean;
|
|
264
|
+
result: unknown;
|
|
265
|
+
meta?: {
|
|
266
|
+
retryCount?: number;
|
|
267
|
+
workflowStepId?: string;
|
|
268
|
+
};
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
export type ApprovalRequestEvent = {
|
|
272
|
+
type: "approval_requested";
|
|
273
|
+
approvalId: string;
|
|
274
|
+
callId: string;
|
|
275
|
+
name: string;
|
|
276
|
+
args?: Record<string, unknown>;
|
|
277
|
+
reason: string;
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
export type ApprovalResolvedEvent = {
|
|
281
|
+
type: "approval_resolved";
|
|
282
|
+
approvalId: string;
|
|
283
|
+
callId: string;
|
|
284
|
+
decision: "approve" | "deny" | "timeout";
|
|
285
|
+
message?: string;
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
export type SourcesEvent = {
|
|
289
|
+
type: "sources";
|
|
290
|
+
items: ChatCitationSource[];
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
export type ThinkingEvent = {
|
|
294
|
+
type: "thinking";
|
|
295
|
+
status: "started" | "update" | "done";
|
|
296
|
+
summary?: string;
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
export type ChatStreamChunk =
|
|
300
|
+
| { type: "token"; value?: string }
|
|
301
|
+
| { type: "done" }
|
|
302
|
+
| { type: "error"; error?: string }
|
|
303
|
+
| ThinkingEvent
|
|
304
|
+
| ToolCallEvent
|
|
305
|
+
| ToolProgressEvent
|
|
306
|
+
| ToolResultEvent
|
|
307
|
+
| ApprovalRequestEvent
|
|
308
|
+
| ApprovalResolvedEvent
|
|
309
|
+
| SourcesEvent;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import type { ChatCitationSource, MessageNode } from "./types";
|
|
2
|
+
|
|
3
|
+
const SOURCES_MARKER_PREFIX = "\n\n[[ZENITH_SOURCES:";
|
|
4
|
+
const SOURCES_MARKER_SUFFIX = "]]";
|
|
5
|
+
|
|
6
|
+
function normalizeCitationSources(input: ChatCitationSource[]): ChatCitationSource[] {
|
|
7
|
+
if (!Array.isArray(input) || input.length === 0) {
|
|
8
|
+
return [];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const deduped = new Map<string, ChatCitationSource>();
|
|
12
|
+
for (const source of input) {
|
|
13
|
+
if (!source || typeof source.url !== "string") {
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
const url = source.url.trim();
|
|
17
|
+
if (!url) {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
const title =
|
|
21
|
+
typeof source.title === "string" && source.title.trim()
|
|
22
|
+
? source.title.trim()
|
|
23
|
+
: undefined;
|
|
24
|
+
const existing = deduped.get(url);
|
|
25
|
+
if (!existing || (!existing.title && title)) {
|
|
26
|
+
deduped.set(url, { url, title });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return [...deduped.values()];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function splitContentAndSources(content: string): {
|
|
33
|
+
content: string;
|
|
34
|
+
sources: ChatCitationSource[];
|
|
35
|
+
} {
|
|
36
|
+
if (!content) {
|
|
37
|
+
return { content: "", sources: [] };
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const start = content.lastIndexOf(SOURCES_MARKER_PREFIX);
|
|
41
|
+
if (start === -1) {
|
|
42
|
+
return { content, sources: [] };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const markerEnd = content.length;
|
|
46
|
+
if (!content.endsWith(SOURCES_MARKER_SUFFIX)) {
|
|
47
|
+
return { content, sources: [] };
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const encodedStart = start + SOURCES_MARKER_PREFIX.length;
|
|
51
|
+
const encodedEnd = markerEnd - SOURCES_MARKER_SUFFIX.length;
|
|
52
|
+
if (encodedStart > encodedEnd) {
|
|
53
|
+
return { content, sources: [] };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const encoded = content.slice(encodedStart, encodedEnd);
|
|
57
|
+
try {
|
|
58
|
+
const parsed = JSON.parse(decodeURIComponent(encoded)) as unknown;
|
|
59
|
+
if (!Array.isArray(parsed)) {
|
|
60
|
+
return { content, sources: [] };
|
|
61
|
+
}
|
|
62
|
+
const sources = normalizeCitationSources(parsed as ChatCitationSource[]);
|
|
63
|
+
const plainContent = content.slice(0, start).replace(/\s+$/, "");
|
|
64
|
+
return { content: plainContent, sources };
|
|
65
|
+
} catch {
|
|
66
|
+
return { content, sources: [] };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function embedSourcesInContent(content: string, sources: ChatCitationSource[]): string {
|
|
71
|
+
const split = splitContentAndSources(content);
|
|
72
|
+
const normalizedSources = normalizeCitationSources(sources);
|
|
73
|
+
if (normalizedSources.length === 0) {
|
|
74
|
+
return split.content;
|
|
75
|
+
}
|
|
76
|
+
const encoded = encodeURIComponent(JSON.stringify(normalizedSources));
|
|
77
|
+
return `${split.content}${SOURCES_MARKER_PREFIX}${encoded}${SOURCES_MARKER_SUFFIX}`;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function deriveTitle(text: string) {
|
|
81
|
+
const clean = text.replace(/\s+/g, " ").trim();
|
|
82
|
+
if (!clean) return "New chat";
|
|
83
|
+
return clean.length > 42 ? `${clean.slice(0, 42)}...` : clean;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function buildPath(headId: string | null, map: Map<string, MessageNode>) {
|
|
87
|
+
const path: MessageNode[] = [];
|
|
88
|
+
let currentId = headId;
|
|
89
|
+
while (currentId) {
|
|
90
|
+
const node = map.get(currentId);
|
|
91
|
+
if (!node) break;
|
|
92
|
+
path.push(node);
|
|
93
|
+
currentId = node.parentId;
|
|
94
|
+
}
|
|
95
|
+
return path.reverse();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export function buildPathIds(headId: string | null, map: Map<string, MessageNode>) {
|
|
99
|
+
const ids = new Set<string>();
|
|
100
|
+
let currentId = headId;
|
|
101
|
+
while (currentId) {
|
|
102
|
+
const node = map.get(currentId);
|
|
103
|
+
if (!node) break;
|
|
104
|
+
ids.add(node.id);
|
|
105
|
+
currentId = node.parentId;
|
|
106
|
+
}
|
|
107
|
+
return ids;
|
|
108
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2017",
|
|
4
|
+
"lib": ["dom", "dom.iterable", "esnext"],
|
|
5
|
+
"allowJs": true,
|
|
6
|
+
"skipLibCheck": true,
|
|
7
|
+
"strict": true,
|
|
8
|
+
"noEmit": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"module": "esnext",
|
|
11
|
+
"moduleResolution": "bundler",
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"jsx": "react-jsx",
|
|
15
|
+
"incremental": true,
|
|
16
|
+
"plugins": [
|
|
17
|
+
{
|
|
18
|
+
"name": "next"
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
"paths": {
|
|
22
|
+
"@/*": ["./src/*"]
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"include": [
|
|
26
|
+
"next-env.d.ts",
|
|
27
|
+
"**/*.ts",
|
|
28
|
+
"**/*.tsx",
|
|
29
|
+
".next/types/**/*.ts",
|
|
30
|
+
".next/dev/types/**/*.ts",
|
|
31
|
+
"**/*.mts"
|
|
32
|
+
],
|
|
33
|
+
"exclude": ["node_modules"]
|
|
34
|
+
}
|