@kuckit/ai-module 3.0.5 → 3.0.7

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.
@@ -0,0 +1,16 @@
1
+ import { KuckitClientModuleContext } from "@kuckit/sdk-react";
2
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
3
+
4
+ //#region src/client/pages/AIChatPage.d.ts
5
+ declare function AIChatPage(): react_jsx_runtime0.JSX.Element;
6
+ //#endregion
7
+ //#region src/client/index.d.ts
8
+ declare const kuckitClientModule: {
9
+ id: string;
10
+ displayName: string;
11
+ version: string;
12
+ register(ctx: KuckitClientModuleContext): void;
13
+ };
14
+ //#endregion
15
+ export { AIChatPage, kuckitClientModule };
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,100 @@
1
+ import { defineKuckitClientModule } from "@kuckit/sdk-react";
2
+ import { useChat } from "@ai-sdk/react";
3
+ import { DefaultChatTransport } from "ai";
4
+ import { Send } from "lucide-react";
5
+ import { useEffect, useRef, useState } from "react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+
8
+ //#region src/client/pages/AIChatPage.tsx
9
+ function AIChatPage() {
10
+ const [input, setInput] = useState("");
11
+ const { messages, sendMessage, status } = useChat({ transport: new DefaultChatTransport({
12
+ api: `${typeof import.meta !== "undefined" && import.meta.env?.VITE_SERVER_URL || typeof window !== "undefined" && window.location.origin}/api/ai/chat`,
13
+ credentials: "include"
14
+ }) });
15
+ const isLoading = status === "streaming" || status === "submitted";
16
+ const messagesEndRef = useRef(null);
17
+ useEffect(() => {
18
+ messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
19
+ }, [messages]);
20
+ const handleSubmit = (e) => {
21
+ e.preventDefault();
22
+ const text = input.trim();
23
+ if (!text || isLoading) return;
24
+ sendMessage({ text });
25
+ setInput("");
26
+ };
27
+ return /* @__PURE__ */ jsxs("div", {
28
+ className: "flex flex-col h-[calc(100vh-8rem)] overflow-hidden",
29
+ children: [/* @__PURE__ */ jsxs("div", {
30
+ className: "flex-1 overflow-y-auto space-y-4 pb-4",
31
+ children: [messages.length === 0 ? /* @__PURE__ */ jsx("div", {
32
+ className: "text-center text-muted-foreground mt-8",
33
+ children: "Ask me anything to get started!"
34
+ }) : messages.map((message) => /* @__PURE__ */ jsxs("div", {
35
+ className: `p-3 rounded-lg ${message.role === "user" ? "bg-primary/10 ml-8" : "bg-secondary/20 mr-8"}`,
36
+ children: [/* @__PURE__ */ jsx("p", {
37
+ className: "text-sm font-semibold mb-1",
38
+ children: message.role === "user" ? "You" : "AI Assistant"
39
+ }), message.parts?.map((part, index) => {
40
+ if (part.type === "text") return /* @__PURE__ */ jsx("div", {
41
+ className: "prose prose-sm dark:prose-invert max-w-none",
42
+ children: part.text
43
+ }, index);
44
+ return null;
45
+ })]
46
+ }, message.id)), /* @__PURE__ */ jsx("div", { ref: messagesEndRef })]
47
+ }), /* @__PURE__ */ jsxs("form", {
48
+ onSubmit: handleSubmit,
49
+ className: "flex items-center gap-2 pt-2 border-t",
50
+ children: [/* @__PURE__ */ jsx("input", {
51
+ type: "text",
52
+ name: "prompt",
53
+ value: input,
54
+ onChange: (e) => setInput(e.target.value),
55
+ placeholder: "Type your message...",
56
+ className: "flex-1 px-3 py-2 border rounded-md bg-background",
57
+ autoComplete: "off",
58
+ autoFocus: true,
59
+ disabled: isLoading
60
+ }), /* @__PURE__ */ jsx("button", {
61
+ type: "submit",
62
+ disabled: !input.trim() || isLoading,
63
+ className: "p-2 bg-primary text-primary-foreground rounded-md disabled:opacity-50 hover:bg-primary/90 transition-colors",
64
+ children: /* @__PURE__ */ jsx(Send, { size: 18 })
65
+ })]
66
+ })]
67
+ });
68
+ }
69
+
70
+ //#endregion
71
+ //#region src/client/index.ts
72
+ const kuckitClientModule = defineKuckitClientModule({
73
+ id: "kuckit.ai",
74
+ displayName: "AI Chat",
75
+ version: "0.1.0",
76
+ register(ctx) {
77
+ ctx.registerComponent("AIChatPage", AIChatPage);
78
+ ctx.addRoute({
79
+ id: "ai-chat",
80
+ path: "/dashboard/ai",
81
+ component: AIChatPage,
82
+ meta: {
83
+ title: "AI Chat",
84
+ requiresAuth: true
85
+ }
86
+ });
87
+ ctx.addNavItem({
88
+ id: "ai-chat-nav",
89
+ label: "AI Chat",
90
+ icon: "message-square",
91
+ path: "/dashboard/ai",
92
+ order: 20,
93
+ showInMainNav: true
94
+ });
95
+ }
96
+ });
97
+
98
+ //#endregion
99
+ export { AIChatPage, kuckitClientModule };
100
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/client/pages/AIChatPage.tsx","../../src/client/index.ts"],"sourcesContent":["import { useChat } from '@ai-sdk/react'\nimport { DefaultChatTransport } from 'ai'\nimport { Send } from 'lucide-react'\nimport { useRef, useEffect, useState } from 'react'\n\nexport function AIChatPage() {\n\tconst [input, setInput] = useState('')\n\tconst { messages, sendMessage, status } = useChat({\n\t\ttransport: new DefaultChatTransport({\n\t\t\tapi: `${(typeof import.meta !== 'undefined' && import.meta.env?.VITE_SERVER_URL) || (typeof window !== 'undefined' && window.location.origin)}/api/ai/chat`,\n\t\t\tcredentials: 'include',\n\t\t}),\n\t})\n\n\tconst isLoading = status === 'streaming' || status === 'submitted'\n\tconst messagesEndRef = useRef<HTMLDivElement>(null)\n\n\tuseEffect(() => {\n\t\tmessagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })\n\t}, [messages])\n\n\tconst handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n\t\te.preventDefault()\n\t\tconst text = input.trim()\n\t\tif (!text || isLoading) return\n\t\tsendMessage({ text })\n\t\tsetInput('')\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col h-[calc(100vh-8rem)] overflow-hidden\">\n\t\t\t<div className=\"flex-1 overflow-y-auto space-y-4 pb-4\">\n\t\t\t\t{messages.length === 0 ? (\n\t\t\t\t\t<div className=\"text-center text-muted-foreground mt-8\">\n\t\t\t\t\t\tAsk me anything to get started!\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\tmessages.map((message) => (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={message.id}\n\t\t\t\t\t\t\tclassName={`p-3 rounded-lg ${\n\t\t\t\t\t\t\t\tmessage.role === 'user' ? 'bg-primary/10 ml-8' : 'bg-secondary/20 mr-8'\n\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<p className=\"text-sm font-semibold mb-1\">\n\t\t\t\t\t\t\t\t{message.role === 'user' ? 'You' : 'AI Assistant'}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t{message.parts?.map((part, index) => {\n\t\t\t\t\t\t\t\tif (part.type === 'text') {\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<div key={index} className=\"prose prose-sm dark:prose-invert max-w-none\">\n\t\t\t\t\t\t\t\t\t\t\t{part.text}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn null\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))\n\t\t\t\t)}\n\t\t\t\t<div ref={messagesEndRef} />\n\t\t\t</div>\n\n\t\t\t<form onSubmit={handleSubmit} className=\"flex items-center gap-2 pt-2 border-t\">\n\t\t\t\t<input\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tname=\"prompt\"\n\t\t\t\t\tvalue={input}\n\t\t\t\t\tonChange={(e) => setInput(e.target.value)}\n\t\t\t\t\tplaceholder=\"Type your message...\"\n\t\t\t\t\tclassName=\"flex-1 px-3 py-2 border rounded-md bg-background\"\n\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\tautoFocus\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t/>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\tdisabled={!input.trim() || isLoading}\n\t\t\t\t\tclassName=\"p-2 bg-primary text-primary-foreground rounded-md disabled:opacity-50 hover:bg-primary/90 transition-colors\"\n\t\t\t\t>\n\t\t\t\t\t<Send size={18} />\n\t\t\t\t</button>\n\t\t\t</form>\n\t\t</div>\n\t)\n}\n","import { defineKuckitClientModule, type KuckitClientModuleContext } from '@kuckit/sdk-react'\nimport { AIChatPage } from './pages/AIChatPage'\n\nexport const kuckitClientModule = defineKuckitClientModule({\n\tid: 'kuckit.ai',\n\tdisplayName: 'AI Chat',\n\tversion: '0.1.0',\n\n\tregister(ctx: KuckitClientModuleContext) {\n\t\tctx.registerComponent('AIChatPage', AIChatPage)\n\n\t\tctx.addRoute({\n\t\t\tid: 'ai-chat',\n\t\t\tpath: '/dashboard/ai',\n\t\t\tcomponent: AIChatPage,\n\t\t\tmeta: {\n\t\t\t\ttitle: 'AI Chat',\n\t\t\t\trequiresAuth: true,\n\t\t\t},\n\t\t})\n\n\t\tctx.addNavItem({\n\t\t\tid: 'ai-chat-nav',\n\t\t\tlabel: 'AI Chat',\n\t\t\ticon: 'message-square',\n\t\t\tpath: '/dashboard/ai',\n\t\t\torder: 20,\n\t\t\tshowInMainNav: true,\n\t\t})\n\t},\n})\n\nexport { AIChatPage } from './pages/AIChatPage'\n"],"mappings":";;;;;;;;AAKA,SAAgB,aAAa;CAC5B,MAAM,CAAC,OAAO,YAAY,SAAS,GAAG;CACtC,MAAM,EAAE,UAAU,aAAa,WAAW,QAAQ,EACjD,WAAW,IAAI,qBAAqB;EACnC,KAAK,GAAI,OAAO,OAAO,SAAS,eAAe,OAAO,KAAK,KAAK,mBAAqB,OAAO,WAAW,eAAe,OAAO,SAAS,OAAQ;EAC9I,aAAa;EACb,CAAC,EACF,CAAC;CAEF,MAAM,YAAY,WAAW,eAAe,WAAW;CACvD,MAAM,iBAAiB,OAAuB,KAAK;AAEnD,iBAAgB;AACf,iBAAe,SAAS,eAAe,EAAE,UAAU,UAAU,CAAC;IAC5D,CAAC,SAAS,CAAC;CAEd,MAAM,gBAAgB,MAAwC;AAC7D,IAAE,gBAAgB;EAClB,MAAM,OAAO,MAAM,MAAM;AACzB,MAAI,CAAC,QAAQ,UAAW;AACxB,cAAY,EAAE,MAAM,CAAC;AACrB,WAAS,GAAG;;AAGb,QACC,qBAAC;EAAI,WAAU;aACd,qBAAC;GAAI,WAAU;cACb,SAAS,WAAW,IACpB,oBAAC;IAAI,WAAU;cAAyC;KAElD,GAEN,SAAS,KAAK,YACb,qBAAC;IAEA,WAAW,kBACV,QAAQ,SAAS,SAAS,uBAAuB;eAGlD,oBAAC;KAAE,WAAU;eACX,QAAQ,SAAS,SAAS,QAAQ;MAChC,EACH,QAAQ,OAAO,KAAK,MAAM,UAAU;AACpC,SAAI,KAAK,SAAS,OACjB,QACC,oBAAC;MAAgB,WAAU;gBACzB,KAAK;QADG,MAEJ;AAGR,YAAO;MACN;MAjBG,QAAQ,GAkBR,CACL,EAEH,oBAAC,SAAI,KAAK,iBAAkB;IACvB,EAEN,qBAAC;GAAK,UAAU;GAAc,WAAU;cACvC,oBAAC;IACA,MAAK;IACL,MAAK;IACL,OAAO;IACP,WAAW,MAAM,SAAS,EAAE,OAAO,MAAM;IACzC,aAAY;IACZ,WAAU;IACV,cAAa;IACb;IACA,UAAU;KACT,EACF,oBAAC;IACA,MAAK;IACL,UAAU,CAAC,MAAM,MAAM,IAAI;IAC3B,WAAU;cAEV,oBAAC,QAAK,MAAM,KAAM;KACV;IACH;GACF;;;;;AChFR,MAAa,qBAAqB,yBAAyB;CAC1D,IAAI;CACJ,aAAa;CACb,SAAS;CAET,SAAS,KAAgC;AACxC,MAAI,kBAAkB,cAAc,WAAW;AAE/C,MAAI,SAAS;GACZ,IAAI;GACJ,MAAM;GACN,WAAW;GACX,MAAM;IACL,OAAO;IACP,cAAc;IACd;GACD,CAAC;AAEF,MAAI,WAAW;GACd,IAAI;GACJ,OAAO;GACP,MAAM;GACN,MAAM;GACN,OAAO;GACP,eAAe;GACf,CAAC;;CAEH,CAAC"}
@@ -9,4 +9,5 @@ interface AIModuleConfig {
9
9
  }
10
10
  declare const kuckitModule: _kuckit_sdk0.KuckitModuleDefinition<AIModuleConfig>;
11
11
  //#endregion
12
- export { type AIModuleConfig, kuckitModule };
12
+ export { AIModuleConfig, kuckitModule };
13
+ //# sourceMappingURL=module.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import { createRequire } from "node:module";
2
- import { asFunction, defineKuckitModule } from "@kuckit/sdk";
3
2
  import { convertToModelMessages, streamText } from "ai";
3
+ import { asFunction, defineKuckitModule } from "@kuckit/sdk";
4
4
  import { Router } from "express";
5
5
  import { z } from "zod";
6
6
 
@@ -121,4 +121,5 @@ const kuckitModule = defineKuckitModule({
121
121
  });
122
122
 
123
123
  //#endregion
124
- export { kuckitModule };
124
+ export { kuckitModule };
125
+ //# sourceMappingURL=module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.js","names":[],"sources":["../../src/server/use-cases/stream-chat.ts","../../src/server/validation/chat.schema.ts","../../src/server/router/ai.router.ts","../../src/server/module.ts"],"sourcesContent":["import { streamText, convertToModelMessages, type UIMessage } from 'ai'\nimport type { Logger } from '@kuckit/domain'\nimport type { LanguageModel } from 'ai'\n\nexport interface StreamChatDeps {\n\taiProvider: LanguageModel\n\tlogger: Logger\n}\n\nexport interface StreamChatInput {\n\tmessages: UIMessage[]\n}\n\nexport const makeStreamChat = ({ aiProvider, logger }: StreamChatDeps) => {\n\treturn async (input: StreamChatInput) => {\n\t\tlogger.debug('Starting AI chat stream', { messageCount: input.messages.length })\n\n\t\tconst result = streamText({\n\t\t\tmodel: aiProvider,\n\t\t\tmessages: convertToModelMessages(input.messages),\n\t\t})\n\n\t\treturn result\n\t}\n}\n\nexport type StreamChat = ReturnType<typeof makeStreamChat>\n","import { z } from 'zod'\n\nexport const messagePartSchema = z.discriminatedUnion('type', [\n\tz.object({ type: z.literal('text'), text: z.string(), state: z.string().optional() }),\n\tz.object({ type: z.literal('image'), image: z.string() }),\n\tz.object({ type: z.literal('step-start') }),\n])\n\nexport const uiMessageSchema = z.object({\n\tid: z.string(),\n\trole: z.enum(['user', 'assistant', 'system']),\n\tcontent: z.string().optional(),\n\tparts: z.array(messagePartSchema).optional(),\n})\n\nexport const chatRequestSchema = z.object({\n\tmessages: z.array(uiMessageSchema).min(1, 'At least one message is required'),\n})\n\nexport type ChatRequest = z.infer<typeof chatRequestSchema>\nexport type UIMessage = z.infer<typeof uiMessageSchema>\n","import { Router, type Request, type Response } from 'express'\nimport type { ScopedRequest } from '@kuckit/sdk'\nimport { chatRequestSchema } from '../validation/chat.schema'\nimport type { StreamChat } from '../use-cases/stream-chat'\nimport type { Logger } from '@kuckit/domain'\nimport type { LanguageModel, UIMessage } from 'ai'\n\ninterface AICradle {\n\tstreamChat: StreamChat\n\trequestLogger: Logger\n\taiProvider: LanguageModel\n\tsession?: { user?: { id?: string } } | null\n}\n\nexport const createAiRouter = (): Router => {\n\tconst router = Router()\n\n\trouter.post('/chat', async (req: Request, res: Response) => {\n\t\tconst scope = (req as ScopedRequest<AICradle>).scope\n\t\tif (!scope) {\n\t\t\treturn res.status(500).json({ error: 'Internal server error' })\n\t\t}\n\t\tconst { session, requestLogger: logger, streamChat } = scope.cradle\n\n\t\t// Auth check - require authenticated user\n\t\tif (!session?.user?.id) {\n\t\t\tlogger.warn('Unauthenticated AI chat request')\n\t\t\tres.status(401).json({ error: 'Authentication required' })\n\t\t\treturn\n\t\t}\n\n\t\t// Validate input\n\t\tconst parseResult = chatRequestSchema.safeParse(req.body)\n\t\tif (!parseResult.success) {\n\t\t\tlogger.warn('Invalid AI chat request', { errors: parseResult.error.flatten() })\n\t\t\tres.status(400).json({\n\t\t\t\terror: 'Invalid request',\n\t\t\t\tdetails: parseResult.error.flatten(),\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tconst { messages } = parseResult.data\n\t\t\tconst result = await streamChat({ messages: messages as UIMessage[] })\n\t\t\tresult.pipeUIMessageStreamToResponse(res)\n\t\t} catch (error) {\n\t\t\t// Only send error if headers not sent (streaming may have started)\n\t\t\tif (!res.headersSent) {\n\t\t\t\tlogger.error('AI chat failed', { error })\n\t\t\t\tres.status(500).json({ error: 'AI chat failed' })\n\t\t\t} else {\n\t\t\t\tlogger.error('AI chat stream failed after headers sent', { error })\n\t\t\t}\n\t\t}\n\t})\n\n\treturn router\n}\n","import { defineKuckitModule, asFunction, type KuckitModuleContext } from '@kuckit/sdk'\nimport { makeStreamChat } from './use-cases/stream-chat'\nimport { createAiRouter } from './router/ai.router'\n\nexport interface AIModuleConfig {\n\t/** Optional API key override. Falls back to GOOGLE_GENERATIVE_AI_API_KEY env var */\n\tapiKey?: string\n\t/** Model ID to use. Defaults to 'gemini-2.5-flash' */\n\tmodel?: string\n}\n\nexport const kuckitModule = defineKuckitModule<AIModuleConfig>({\n\tid: 'kuckit.ai',\n\tdisplayName: 'AI Chat',\n\tdescription: 'Streaming AI chat powered by Vercel AI SDK',\n\tversion: '0.1.0',\n\tcapabilities: ['nav.item', 'api.public'],\n\n\tasync register(ctx: KuckitModuleContext<AIModuleConfig>) {\n\t\tconst { container, config: moduleConfig } = ctx\n\n\t\tcontainer.register({\n\t\t\t// AI provider - registered by this module, not core\n\t\t\taiProvider: asFunction(() => {\n\t\t\t\tconst apiKey = moduleConfig?.apiKey ?? process.env.GOOGLE_GENERATIVE_AI_API_KEY\n\t\t\t\tif (!apiKey) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'AI module requires GOOGLE_GENERATIVE_AI_API_KEY environment variable or apiKey in module config'\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\t// Lazy import to avoid loading @ai-sdk/google at module load time\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-require-imports\n\t\t\t\tconst { google } = require('@ai-sdk/google')\n\t\t\t\tconst modelId = moduleConfig?.model ?? 'gemini-2.5-flash'\n\t\t\t\treturn google(modelId)\n\t\t\t}).singleton(),\n\n\t\t\tstreamChat: asFunction(({ aiProvider, logger }) =>\n\t\t\t\tmakeStreamChat({ aiProvider, logger })\n\t\t\t).scoped(),\n\t\t})\n\t},\n\n\tregisterApi(ctx) {\n\t\tconst aiRouter = createAiRouter()\n\n\t\tctx.addApiRegistration({\n\t\t\ttype: 'rest-router',\n\t\t\tname: 'ai',\n\t\t\trouter: aiRouter,\n\t\t})\n\t},\n\n\tasync onBootstrap(ctx: KuckitModuleContext<AIModuleConfig>) {\n\t\tconst { container } = ctx\n\t\tconst logger = container.resolve('logger')\n\t\tlogger.info('AI Chat module initialized')\n\t},\n\n\tasync onShutdown(ctx: KuckitModuleContext<AIModuleConfig>) {\n\t\tconst { container } = ctx\n\t\tconst logger = container.resolve('logger')\n\t\tlogger.info('AI Chat module shutting down')\n\t},\n})\n"],"mappings":"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"}
package/dist/styles.css CHANGED
@@ -5,5 +5,5 @@
5
5
  * @import "@kuckit/ai-module/styles.css";
6
6
  */
7
7
 
8
- /* Scan module components for Tailwind classes */
9
- @source "./**/*.tsx";
8
+ /* Scan compiled module components for Tailwind classes (JS, not TSX - TSX doesn't exist after publishing) */
9
+ @source "./**/*.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kuckit/ai-module",
3
- "version": "3.0.5",
3
+ "version": "3.0.7",
4
4
  "description": "AI chat streaming module for Kuckit applications",
5
5
  "type": "module",
6
6
  "main": "dist/server/module.js",
@@ -30,9 +30,9 @@
30
30
  "prepublishOnly": "npm run build && node ../../scripts/resolve-workspace-protocols.cjs && node ../../scripts/check-no-workspace-protocol.cjs"
31
31
  },
32
32
  "peerDependencies": {
33
- "@kuckit/domain": "^3.0.5",
34
- "@kuckit/sdk": "^3.0.5",
35
- "@kuckit/sdk-react": "^3.0.5",
33
+ "@kuckit/domain": "^3.0.7",
34
+ "@kuckit/sdk": "^3.0.7",
35
+ "@kuckit/sdk-react": "^3.0.7",
36
36
  "react": "^18 || ^19",
37
37
  "typescript": "^5",
38
38
  "express": "^4 || ^5"