@netbirdio/explain 0.1.0
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/README.md +402 -0
- package/dist/client/AIAssistantProvider.d.ts +21 -0
- package/dist/client/AIAssistantProvider.d.ts.map +1 -0
- package/dist/client/AIAssistantProvider.js +198 -0
- package/dist/client/AIAssistantProvider.js.map +1 -0
- package/dist/client/AIChatBot.d.ts +10 -0
- package/dist/client/AIChatBot.d.ts.map +1 -0
- package/dist/client/AIChatBot.js +139 -0
- package/dist/client/AIChatBot.js.map +1 -0
- package/dist/client/AIFloatingButton.d.ts +7 -0
- package/dist/client/AIFloatingButton.d.ts.map +1 -0
- package/dist/client/AIFloatingButton.js +16 -0
- package/dist/client/AIFloatingButton.js.map +1 -0
- package/dist/client/index.d.ts +5 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +4 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/styles.d.ts +51 -0
- package/dist/client/styles.d.ts.map +1 -0
- package/dist/client/styles.js +317 -0
- package/dist/client/styles.js.map +1 -0
- package/dist/server/handler.d.ts +38 -0
- package/dist/server/handler.d.ts.map +1 -0
- package/dist/server/handler.js +117 -0
- package/dist/server/handler.js.map +1 -0
- package/dist/server/index.d.ts +6 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +4 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/providers/anthropic.d.ts +9 -0
- package/dist/server/providers/anthropic.d.ts.map +1 -0
- package/dist/server/providers/anthropic.js +40 -0
- package/dist/server/providers/anthropic.js.map +1 -0
- package/dist/server/providers/openai.d.ts +9 -0
- package/dist/server/providers/openai.d.ts.map +1 -0
- package/dist/server/providers/openai.js +46 -0
- package/dist/server/providers/openai.js.map +1 -0
- package/dist/server/providers/types.d.ts +9 -0
- package/dist/server/providers/types.d.ts.map +1 -0
- package/dist/server/providers/types.js +2 -0
- package/dist/server/providers/types.js.map +1 -0
- package/dist/types.d.ts +11 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +45 -0
- package/src/client/AIAssistantProvider.tsx +288 -0
- package/src/client/AIChatBot.tsx +309 -0
- package/src/client/AIFloatingButton.tsx +34 -0
- package/src/client/index.ts +4 -0
- package/src/client/styles.ts +353 -0
- package/src/server/handler.ts +158 -0
- package/src/server/index.ts +5 -0
- package/src/server/providers/anthropic.ts +53 -0
- package/src/server/providers/openai.ts +55 -0
- package/src/server/providers/types.ts +10 -0
- package/src/types.ts +11 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Bot, MessageCircleQuestion, Send, Sparkles, User, X, } from "lucide-react";
|
|
4
|
+
import React, { useCallback, useEffect, useRef, useState } from "react";
|
|
5
|
+
import * as S from "./styles";
|
|
6
|
+
async function fetchAIResponse(endpoint, apiKey, messages) {
|
|
7
|
+
const headers = {
|
|
8
|
+
"Content-Type": "application/json",
|
|
9
|
+
};
|
|
10
|
+
if (apiKey) {
|
|
11
|
+
headers["Authorization"] = `Bearer ${apiKey}`;
|
|
12
|
+
}
|
|
13
|
+
const response = await fetch(endpoint, {
|
|
14
|
+
method: "POST",
|
|
15
|
+
headers,
|
|
16
|
+
body: JSON.stringify({
|
|
17
|
+
messages: messages.map((m) => ({
|
|
18
|
+
role: m.role,
|
|
19
|
+
content: m.content,
|
|
20
|
+
})),
|
|
21
|
+
}),
|
|
22
|
+
});
|
|
23
|
+
if (!response.ok) {
|
|
24
|
+
const text = await response.text();
|
|
25
|
+
throw new Error(`${response.status}: ${text}`);
|
|
26
|
+
}
|
|
27
|
+
const data = await response.json();
|
|
28
|
+
return data.reply;
|
|
29
|
+
}
|
|
30
|
+
export default function AIChatBot({ open, onClose, initialQuery, endpoint, apiKey, }) {
|
|
31
|
+
const [messages, setMessages] = useState([]);
|
|
32
|
+
const [input, setInput] = useState("");
|
|
33
|
+
const [isTyping, setIsTyping] = useState(false);
|
|
34
|
+
const messagesEndRef = useRef(null);
|
|
35
|
+
const inputRef = useRef(null);
|
|
36
|
+
const hasProcessedInitialQuery = useRef(false);
|
|
37
|
+
const scrollToBottom = useCallback(() => {
|
|
38
|
+
messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
|
|
39
|
+
}, []);
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
scrollToBottom();
|
|
42
|
+
}, [messages, isTyping, scrollToBottom]);
|
|
43
|
+
const getAIResponse = useCallback(async (allMessages) => {
|
|
44
|
+
setIsTyping(true);
|
|
45
|
+
try {
|
|
46
|
+
const reply = await fetchAIResponse(endpoint, apiKey, allMessages);
|
|
47
|
+
const response = {
|
|
48
|
+
id: Date.now().toString(),
|
|
49
|
+
role: "assistant",
|
|
50
|
+
content: reply,
|
|
51
|
+
};
|
|
52
|
+
setMessages((prev) => [...prev, response]);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
const errorMsg = err instanceof Error ? err.message : "Unknown error";
|
|
56
|
+
const response = {
|
|
57
|
+
id: Date.now().toString(),
|
|
58
|
+
role: "assistant",
|
|
59
|
+
content: `Sorry, I couldn't get a response. Error: ${errorMsg}`,
|
|
60
|
+
};
|
|
61
|
+
setMessages((prev) => [...prev, response]);
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
setIsTyping(false);
|
|
65
|
+
}
|
|
66
|
+
}, [endpoint, apiKey]);
|
|
67
|
+
// Handle initial query from explain mode
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
if (open && initialQuery && !hasProcessedInitialQuery.current) {
|
|
70
|
+
hasProcessedInitialQuery.current = true;
|
|
71
|
+
const lines = initialQuery.split("\n");
|
|
72
|
+
const userMessage = lines[0];
|
|
73
|
+
const docsLine = lines.find((l) => l.startsWith("Docs: "));
|
|
74
|
+
const msgs = [];
|
|
75
|
+
if (docsLine) {
|
|
76
|
+
msgs.push({
|
|
77
|
+
id: Date.now().toString() + "-ctx",
|
|
78
|
+
role: "context",
|
|
79
|
+
content: docsLine,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
msgs.push({
|
|
83
|
+
id: Date.now().toString(),
|
|
84
|
+
role: "user",
|
|
85
|
+
content: userMessage,
|
|
86
|
+
});
|
|
87
|
+
setMessages(msgs);
|
|
88
|
+
getAIResponse(msgs);
|
|
89
|
+
}
|
|
90
|
+
}, [open, initialQuery, getAIResponse]);
|
|
91
|
+
// Reset when closed
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
if (!open) {
|
|
94
|
+
hasProcessedInitialQuery.current = false;
|
|
95
|
+
setMessages([]);
|
|
96
|
+
setInput("");
|
|
97
|
+
setIsTyping(false);
|
|
98
|
+
}
|
|
99
|
+
}, [open]);
|
|
100
|
+
// Focus input when opened
|
|
101
|
+
useEffect(() => {
|
|
102
|
+
if (open) {
|
|
103
|
+
setTimeout(() => inputRef.current?.focus(), 200);
|
|
104
|
+
}
|
|
105
|
+
}, [open]);
|
|
106
|
+
const sendMessage = useCallback(() => {
|
|
107
|
+
const text = input.trim();
|
|
108
|
+
if (!text || isTyping)
|
|
109
|
+
return;
|
|
110
|
+
const userMsg = {
|
|
111
|
+
id: Date.now().toString(),
|
|
112
|
+
role: "user",
|
|
113
|
+
content: text,
|
|
114
|
+
};
|
|
115
|
+
const updatedMessages = [...messages, userMsg];
|
|
116
|
+
setMessages(updatedMessages);
|
|
117
|
+
setInput("");
|
|
118
|
+
getAIResponse(updatedMessages);
|
|
119
|
+
}, [input, isTyping, messages, getAIResponse]);
|
|
120
|
+
const handleKeyDown = (e) => {
|
|
121
|
+
if (e.key === "Enter" && !e.shiftKey) {
|
|
122
|
+
e.preventDefault();
|
|
123
|
+
sendMessage();
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
if (!open)
|
|
127
|
+
return null;
|
|
128
|
+
const active = !!input.trim() && !isTyping;
|
|
129
|
+
return (_jsxs("div", { style: S.chatPanel, children: [_jsxs("div", { style: S.chatHeader, children: [_jsxs("div", { style: S.chatHeaderLeft, children: [_jsx("div", { style: S.chatHeaderIcon, children: _jsx(Sparkles, { size: 15, style: { color: "var(--nb-explain-accent)" } }) }), _jsxs("div", { children: [_jsx("h3", { style: S.chatHeaderTitle, children: "AI Assistant" }), _jsx("span", { style: S.chatHeaderSubtitle, children: "Ask anything" })] })] }), _jsx("button", { onClick: onClose, style: S.chatCloseBtn, onMouseEnter: (e) => {
|
|
130
|
+
e.currentTarget.style.color = "var(--nb-explain-text)";
|
|
131
|
+
e.currentTarget.style.background = "var(--nb-explain-bg-hover)";
|
|
132
|
+
}, onMouseLeave: (e) => {
|
|
133
|
+
e.currentTarget.style.color = "var(--nb-explain-text-dim)";
|
|
134
|
+
e.currentTarget.style.background = "none";
|
|
135
|
+
}, children: _jsx(X, { size: 16 }) })] }), _jsxs("div", { style: S.messagesArea, children: [messages.length === 0 && !isTyping && (_jsxs("div", { style: S.emptyState, children: [_jsx(MessageCircleQuestion, { size: 40, style: { color: "var(--nb-explain-text-dim)" } }), _jsxs("div", { children: [_jsx("p", { style: S.emptyStateTitle, children: "How can I help?" }), _jsx("p", { style: S.emptyStateHint, children: "Use the Explain button to click on any element, or ask a question below." })] })] })), messages.map((msg) => msg.role === "context" ? (_jsx("div", { style: S.contextBadge, children: _jsxs("div", { style: S.contextBadgeInner, children: [_jsx(Sparkles, { size: 10, style: { color: "var(--nb-explain-accent)", opacity: 0.6 } }), msg.content] }) }, msg.id)) : (_jsxs("div", { style: S.messageRow(msg.role === "user"), children: [msg.role === "assistant" && (_jsx("div", { style: S.messageAvatar(false), children: _jsx(Bot, { size: 13, style: { color: "var(--nb-explain-accent)" } }) })), _jsx("div", { style: S.messageBubble(msg.role === "user"), children: msg.content.split("\n").map((line, i) => (_jsxs(React.Fragment, { children: [line
|
|
136
|
+
.split(/(\*\*[^*]+\*\*)/)
|
|
137
|
+
.map((part, j) => part.startsWith("**") && part.endsWith("**") ? (_jsx("strong", { style: S.messageBold, children: part.slice(2, -2) }, j)) : (_jsx(React.Fragment, { children: part }, j))), i < msg.content.split("\n").length - 1 && _jsx("br", {})] }, i))) }), msg.role === "user" && (_jsx("div", { style: S.messageAvatar(true), children: _jsx(User, { size: 13, style: { color: "var(--nb-explain-user-text)" } }) }))] }, msg.id))), isTyping && (_jsxs("div", { style: S.typingRow, children: [_jsx("div", { style: S.messageAvatar(false), children: _jsx(Bot, { size: 13, style: { color: "var(--nb-explain-accent)" } }) }), _jsxs("div", { style: S.typingBubble, children: [_jsx("span", { className: "nb-explain-dot-1", style: S.typingDot }), _jsx("span", { className: "nb-explain-dot-2", style: S.typingDot }), _jsx("span", { className: "nb-explain-dot-3", style: S.typingDot })] })] })), _jsx("div", { ref: messagesEndRef })] }), _jsxs("div", { style: S.inputArea, children: [_jsxs("div", { style: S.inputRow, children: [_jsx("input", { ref: inputRef, type: "text", value: input, onChange: (e) => setInput(e.target.value), onKeyDown: handleKeyDown, placeholder: "Ask a follow-up question...", style: S.inputField }), _jsx("button", { onClick: sendMessage, disabled: !active, style: S.sendBtn(active), children: _jsx(Send, { size: 15 }) })] }), _jsx("p", { style: S.inputFooter, children: "AI-powered assistant" })] })] }));
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=AIChatBot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AIChatBot.js","sourceRoot":"","sources":["../../src/client/AIChatBot.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AIFloatingButton.d.ts","sourceRoot":"","sources":["../../src/client/AIFloatingButton.tsx"],"names":[],"mappings":"AAMA,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,2CAsBlE"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { MessageCircleQuestion, X } from "lucide-react";
|
|
4
|
+
import * as S from "./styles";
|
|
5
|
+
export default function AIFloatingButton({ isOpen, onClick }) {
|
|
6
|
+
return (_jsx("button", { onClick: onClick, "data-nb-explain-ignore": true, style: S.fab(isOpen), onMouseEnter: (e) => {
|
|
7
|
+
e.currentTarget.style.transform = "scale(1.05)";
|
|
8
|
+
}, onMouseLeave: (e) => {
|
|
9
|
+
e.currentTarget.style.transform = "scale(1)";
|
|
10
|
+
}, onMouseDown: (e) => {
|
|
11
|
+
e.currentTarget.style.transform = "scale(0.95)";
|
|
12
|
+
}, onMouseUp: (e) => {
|
|
13
|
+
e.currentTarget.style.transform = "scale(1.05)";
|
|
14
|
+
}, children: isOpen ? _jsx(X, { size: 20 }) : _jsx(MessageCircleQuestion, { size: 22 }) }));
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=AIFloatingButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AIFloatingButton.js","sourceRoot":"","sources":["../../src/client/AIFloatingButton.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,qBAAqB,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAExD,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAO9B,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAS;IACjE,OAAO,CACL,iBACE,OAAO,EAAE,OAAO,kCAEhB,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EACpB,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE;YAClB,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,aAAa,CAAC;QAClD,CAAC,EACD,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE;YAClB,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,UAAU,CAAC;QAC/C,CAAC,EACD,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE;YACjB,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,aAAa,CAAC;QAClD,CAAC,EACD,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;YACf,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,aAAa,CAAC;QAClD,CAAC,YAEA,MAAM,CAAC,CAAC,CAAC,KAAC,CAAC,IAAC,IAAI,EAAE,EAAE,GAAI,CAAC,CAAC,CAAC,KAAC,qBAAqB,IAAC,IAAI,EAAE,EAAE,GAAI,GACxD,CACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { default as AIAssistantProvider, useAIAssistant } from "./AIAssistantProvider";
|
|
2
|
+
export { default as AIChatBot } from "./AIChatBot";
|
|
3
|
+
export { default as AIFloatingButton } from "./AIFloatingButton";
|
|
4
|
+
export type { Message, ExplainContext } from "../types";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjE,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* All styles for netbird-explain components.
|
|
3
|
+
* Uses inline styles + CSS custom properties so the package
|
|
4
|
+
* works without any external CSS framework.
|
|
5
|
+
*
|
|
6
|
+
* Consumers can override via CSS custom properties:
|
|
7
|
+
* --nb-explain-bg: panel background
|
|
8
|
+
* --nb-explain-bg-subtle: input/message background
|
|
9
|
+
* --nb-explain-border: border color
|
|
10
|
+
* --nb-explain-text: primary text
|
|
11
|
+
* --nb-explain-text-muted: secondary text
|
|
12
|
+
* --nb-explain-text-dim: tertiary/placeholder text
|
|
13
|
+
* --nb-explain-accent: accent color (yellow)
|
|
14
|
+
* --nb-explain-accent-hover: accent hover
|
|
15
|
+
* --nb-explain-user-bg: user message background
|
|
16
|
+
* --nb-explain-user-text: user message text
|
|
17
|
+
* --nb-explain-radius: border radius
|
|
18
|
+
* --nb-explain-font: font family
|
|
19
|
+
*/
|
|
20
|
+
export declare const CSS_VARS = "\n :root {\n --nb-explain-bg: #0a0a0f;\n --nb-explain-bg-subtle: rgba(255,255,255,0.06);\n --nb-explain-bg-hover: rgba(255,255,255,0.08);\n --nb-explain-border: rgba(255,255,255,0.1);\n --nb-explain-text: #f0f0f5;\n --nb-explain-text-muted: #9ca3af;\n --nb-explain-text-dim: #6b7280;\n --nb-explain-accent: #eab308;\n --nb-explain-accent-hover: #facc15;\n --nb-explain-accent-glow: rgba(234,179,8,0.15);\n --nb-explain-user-bg: #4f46e5;\n --nb-explain-user-text: #ffffff;\n --nb-explain-user-glow: rgba(79,70,229,0.25);\n --nb-explain-radius: 12px;\n --nb-explain-radius-sm: 8px;\n --nb-explain-radius-xs: 6px;\n --nb-explain-font: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n --nb-explain-shadow: 0 25px 50px -12px rgba(0,0,0,0.5), 0 0 0 1px rgba(255,255,255,0.05);\n --nb-explain-banner-bg: rgba(234,179,8,0.92);\n --nb-explain-banner-text: #000000;\n --nb-explain-error-text: #f87171;\n }\n";
|
|
21
|
+
export declare const chatPanel: React.CSSProperties;
|
|
22
|
+
export declare const chatHeader: React.CSSProperties;
|
|
23
|
+
export declare const chatHeaderLeft: React.CSSProperties;
|
|
24
|
+
export declare const chatHeaderIcon: React.CSSProperties;
|
|
25
|
+
export declare const chatHeaderTitle: React.CSSProperties;
|
|
26
|
+
export declare const chatHeaderSubtitle: React.CSSProperties;
|
|
27
|
+
export declare const chatCloseBtn: React.CSSProperties;
|
|
28
|
+
export declare const messagesArea: React.CSSProperties;
|
|
29
|
+
export declare const emptyState: React.CSSProperties;
|
|
30
|
+
export declare const emptyStateTitle: React.CSSProperties;
|
|
31
|
+
export declare const emptyStateHint: React.CSSProperties;
|
|
32
|
+
export declare const contextBadge: React.CSSProperties;
|
|
33
|
+
export declare const contextBadgeInner: React.CSSProperties;
|
|
34
|
+
export declare const messageRow: (isUser: boolean) => React.CSSProperties;
|
|
35
|
+
export declare const messageAvatar: (isUser: boolean) => React.CSSProperties;
|
|
36
|
+
export declare const messageBubble: (isUser: boolean) => React.CSSProperties;
|
|
37
|
+
export declare const messageBold: React.CSSProperties;
|
|
38
|
+
export declare const typingRow: React.CSSProperties;
|
|
39
|
+
export declare const typingBubble: React.CSSProperties;
|
|
40
|
+
export declare const typingDot: React.CSSProperties;
|
|
41
|
+
export declare const inputArea: React.CSSProperties;
|
|
42
|
+
export declare const inputRow: React.CSSProperties;
|
|
43
|
+
export declare const inputField: React.CSSProperties;
|
|
44
|
+
export declare const sendBtn: (active: boolean) => React.CSSProperties;
|
|
45
|
+
export declare const inputFooter: React.CSSProperties;
|
|
46
|
+
export declare const fab: (isOpen: boolean) => React.CSSProperties;
|
|
47
|
+
export declare const banner: React.CSSProperties;
|
|
48
|
+
export declare const bannerCancel: React.CSSProperties;
|
|
49
|
+
export declare const ANIMATIONS = "\n @keyframes nb-explain-slide-up {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n @keyframes nb-explain-fade-in {\n from { opacity: 0; transform: translateX(-50%) translateY(-4px); }\n to { opacity: 1; transform: translateX(-50%) translateY(0); }\n }\n @keyframes nb-explain-bounce {\n 0%, 80%, 100% { transform: translateY(0); }\n 40% { transform: translateY(-4px); }\n }\n .nb-explain-dot-1 { animation: nb-explain-bounce 1.2s infinite; animation-delay: 0ms; }\n .nb-explain-dot-2 { animation: nb-explain-bounce 1.2s infinite; animation-delay: 150ms; }\n .nb-explain-dot-3 { animation: nb-explain-bounce 1.2s infinite; animation-delay: 300ms; }\n";
|
|
50
|
+
export declare const HIGHLIGHT_STYLES = "\n [data-nb-explain-highlight] {\n outline: 2px solid rgba(234, 179, 8, 0.7) !important;\n border-radius: 6px;\n cursor: help !important;\n transition: outline 0.1s ease;\n }\n";
|
|
51
|
+
//# sourceMappingURL=styles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/client/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,eAAO,MAAM,QAAQ,69BAwBpB,CAAC;AAIF,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,aAgB7B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,aAM9B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,aAIlC,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,aAQlC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,aAMnC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,aAGtC,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,aAUhC,CAAC;AAIF,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,aAOhC,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,aAS9B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,aAKnC,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,aAIlC,CAAC;AAGF,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,aAGhC,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,aASrC,CAAC;AAGF,eAAO,MAAM,UAAU,GAAI,QAAQ,OAAO,KAAG,KAAK,CAAC,aAIjD,CAAC;AAEH,eAAO,MAAM,aAAa,GAAI,QAAQ,OAAO,KAAG,KAAK,CAAC,aAUpD,CAAC;AAEH,eAAO,MAAM,aAAa,GAAI,QAAQ,OAAO,KAAG,KAAK,CAAC,aASpD,CAAC;AAEH,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,aAG/B,CAAC;AAGF,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,aAG7B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,aAMhC,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,aAK7B,CAAC;AAIF,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,aAG7B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,aAO5B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,aAQ9B,CAAC;AAEF,eAAO,MAAM,OAAO,GAAI,QAAQ,OAAO,KAAG,KAAK,CAAC,aAW9C,CAAC;AAEH,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,aAK/B,CAAC;AAIF,eAAO,MAAM,GAAG,GAAI,QAAQ,OAAO,KAAG,KAAK,CAAC,aAmB1C,CAAC;AAIH,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,aAkB1B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,aAShC,CAAC;AAIF,eAAO,MAAM,UAAU,kuBAgBtB,CAAC;AAEF,eAAO,MAAM,gBAAgB,mMAO5B,CAAC"}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* All styles for netbird-explain components.
|
|
3
|
+
* Uses inline styles + CSS custom properties so the package
|
|
4
|
+
* works without any external CSS framework.
|
|
5
|
+
*
|
|
6
|
+
* Consumers can override via CSS custom properties:
|
|
7
|
+
* --nb-explain-bg: panel background
|
|
8
|
+
* --nb-explain-bg-subtle: input/message background
|
|
9
|
+
* --nb-explain-border: border color
|
|
10
|
+
* --nb-explain-text: primary text
|
|
11
|
+
* --nb-explain-text-muted: secondary text
|
|
12
|
+
* --nb-explain-text-dim: tertiary/placeholder text
|
|
13
|
+
* --nb-explain-accent: accent color (yellow)
|
|
14
|
+
* --nb-explain-accent-hover: accent hover
|
|
15
|
+
* --nb-explain-user-bg: user message background
|
|
16
|
+
* --nb-explain-user-text: user message text
|
|
17
|
+
* --nb-explain-radius: border radius
|
|
18
|
+
* --nb-explain-font: font family
|
|
19
|
+
*/
|
|
20
|
+
export const CSS_VARS = `
|
|
21
|
+
:root {
|
|
22
|
+
--nb-explain-bg: #0a0a0f;
|
|
23
|
+
--nb-explain-bg-subtle: rgba(255,255,255,0.06);
|
|
24
|
+
--nb-explain-bg-hover: rgba(255,255,255,0.08);
|
|
25
|
+
--nb-explain-border: rgba(255,255,255,0.1);
|
|
26
|
+
--nb-explain-text: #f0f0f5;
|
|
27
|
+
--nb-explain-text-muted: #9ca3af;
|
|
28
|
+
--nb-explain-text-dim: #6b7280;
|
|
29
|
+
--nb-explain-accent: #eab308;
|
|
30
|
+
--nb-explain-accent-hover: #facc15;
|
|
31
|
+
--nb-explain-accent-glow: rgba(234,179,8,0.15);
|
|
32
|
+
--nb-explain-user-bg: #4f46e5;
|
|
33
|
+
--nb-explain-user-text: #ffffff;
|
|
34
|
+
--nb-explain-user-glow: rgba(79,70,229,0.25);
|
|
35
|
+
--nb-explain-radius: 12px;
|
|
36
|
+
--nb-explain-radius-sm: 8px;
|
|
37
|
+
--nb-explain-radius-xs: 6px;
|
|
38
|
+
--nb-explain-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
|
39
|
+
--nb-explain-shadow: 0 25px 50px -12px rgba(0,0,0,0.5), 0 0 0 1px rgba(255,255,255,0.05);
|
|
40
|
+
--nb-explain-banner-bg: rgba(234,179,8,0.92);
|
|
41
|
+
--nb-explain-banner-text: #000000;
|
|
42
|
+
--nb-explain-error-text: #f87171;
|
|
43
|
+
}
|
|
44
|
+
`;
|
|
45
|
+
// --- Chat Panel ---
|
|
46
|
+
export const chatPanel = {
|
|
47
|
+
position: "fixed",
|
|
48
|
+
bottom: 80,
|
|
49
|
+
right: 20,
|
|
50
|
+
zIndex: 9998,
|
|
51
|
+
width: 420,
|
|
52
|
+
height: 600,
|
|
53
|
+
display: "flex",
|
|
54
|
+
flexDirection: "column",
|
|
55
|
+
borderRadius: "var(--nb-explain-radius)",
|
|
56
|
+
border: "1px solid var(--nb-explain-border)",
|
|
57
|
+
background: "var(--nb-explain-bg)",
|
|
58
|
+
boxShadow: "var(--nb-explain-shadow)",
|
|
59
|
+
fontFamily: "var(--nb-explain-font)",
|
|
60
|
+
overflow: "hidden",
|
|
61
|
+
animation: "nb-explain-slide-up 0.2s ease-out",
|
|
62
|
+
};
|
|
63
|
+
export const chatHeader = {
|
|
64
|
+
display: "flex",
|
|
65
|
+
alignItems: "center",
|
|
66
|
+
justifyContent: "space-between",
|
|
67
|
+
padding: "12px 16px",
|
|
68
|
+
borderBottom: "1px solid var(--nb-explain-border)",
|
|
69
|
+
};
|
|
70
|
+
export const chatHeaderLeft = {
|
|
71
|
+
display: "flex",
|
|
72
|
+
alignItems: "center",
|
|
73
|
+
gap: 10,
|
|
74
|
+
};
|
|
75
|
+
export const chatHeaderIcon = {
|
|
76
|
+
width: 28,
|
|
77
|
+
height: 28,
|
|
78
|
+
borderRadius: "var(--nb-explain-radius-sm)",
|
|
79
|
+
background: "var(--nb-explain-accent-glow)",
|
|
80
|
+
display: "flex",
|
|
81
|
+
alignItems: "center",
|
|
82
|
+
justifyContent: "center",
|
|
83
|
+
};
|
|
84
|
+
export const chatHeaderTitle = {
|
|
85
|
+
fontSize: 14,
|
|
86
|
+
fontWeight: 600,
|
|
87
|
+
color: "var(--nb-explain-text)",
|
|
88
|
+
lineHeight: 1,
|
|
89
|
+
margin: 0,
|
|
90
|
+
};
|
|
91
|
+
export const chatHeaderSubtitle = {
|
|
92
|
+
fontSize: 11,
|
|
93
|
+
color: "var(--nb-explain-text-dim)",
|
|
94
|
+
};
|
|
95
|
+
export const chatCloseBtn = {
|
|
96
|
+
padding: 6,
|
|
97
|
+
borderRadius: "var(--nb-explain-radius-xs)",
|
|
98
|
+
color: "var(--nb-explain-text-dim)",
|
|
99
|
+
background: "none",
|
|
100
|
+
border: "none",
|
|
101
|
+
cursor: "pointer",
|
|
102
|
+
display: "flex",
|
|
103
|
+
alignItems: "center",
|
|
104
|
+
transition: "color 0.15s, background 0.15s",
|
|
105
|
+
};
|
|
106
|
+
// --- Messages ---
|
|
107
|
+
export const messagesArea = {
|
|
108
|
+
flex: 1,
|
|
109
|
+
overflowY: "auto",
|
|
110
|
+
padding: "16px",
|
|
111
|
+
display: "flex",
|
|
112
|
+
flexDirection: "column",
|
|
113
|
+
gap: 16,
|
|
114
|
+
};
|
|
115
|
+
export const emptyState = {
|
|
116
|
+
display: "flex",
|
|
117
|
+
flexDirection: "column",
|
|
118
|
+
alignItems: "center",
|
|
119
|
+
justifyContent: "center",
|
|
120
|
+
height: "100%",
|
|
121
|
+
textAlign: "center",
|
|
122
|
+
gap: 12,
|
|
123
|
+
opacity: 0.5,
|
|
124
|
+
};
|
|
125
|
+
export const emptyStateTitle = {
|
|
126
|
+
fontSize: 14,
|
|
127
|
+
color: "var(--nb-explain-text-muted)",
|
|
128
|
+
fontWeight: 500,
|
|
129
|
+
margin: 0,
|
|
130
|
+
};
|
|
131
|
+
export const emptyStateHint = {
|
|
132
|
+
fontSize: 12,
|
|
133
|
+
color: "var(--nb-explain-text-dim)",
|
|
134
|
+
marginTop: 4,
|
|
135
|
+
};
|
|
136
|
+
// Context badge
|
|
137
|
+
export const contextBadge = {
|
|
138
|
+
display: "flex",
|
|
139
|
+
justifyContent: "center",
|
|
140
|
+
};
|
|
141
|
+
export const contextBadgeInner = {
|
|
142
|
+
fontSize: 11,
|
|
143
|
+
color: "var(--nb-explain-text-dim)",
|
|
144
|
+
background: "var(--nb-explain-bg-subtle)",
|
|
145
|
+
borderRadius: 20,
|
|
146
|
+
padding: "4px 12px",
|
|
147
|
+
display: "flex",
|
|
148
|
+
alignItems: "center",
|
|
149
|
+
gap: 6,
|
|
150
|
+
};
|
|
151
|
+
// Message row
|
|
152
|
+
export const messageRow = (isUser) => ({
|
|
153
|
+
display: "flex",
|
|
154
|
+
gap: 10,
|
|
155
|
+
justifyContent: isUser ? "flex-end" : "flex-start",
|
|
156
|
+
});
|
|
157
|
+
export const messageAvatar = (isUser) => ({
|
|
158
|
+
width: 24,
|
|
159
|
+
height: 24,
|
|
160
|
+
borderRadius: "var(--nb-explain-radius-xs)",
|
|
161
|
+
background: isUser ? "var(--nb-explain-user-glow)" : "var(--nb-explain-accent-glow)",
|
|
162
|
+
display: "flex",
|
|
163
|
+
alignItems: "center",
|
|
164
|
+
justifyContent: "center",
|
|
165
|
+
flexShrink: 0,
|
|
166
|
+
marginTop: 2,
|
|
167
|
+
});
|
|
168
|
+
export const messageBubble = (isUser) => ({
|
|
169
|
+
maxWidth: "85%",
|
|
170
|
+
borderRadius: "var(--nb-explain-radius-sm)",
|
|
171
|
+
padding: "8px 12px",
|
|
172
|
+
fontSize: 14,
|
|
173
|
+
lineHeight: 1.6,
|
|
174
|
+
background: isUser ? "var(--nb-explain-user-bg)" : "var(--nb-explain-bg-subtle)",
|
|
175
|
+
color: isUser ? "var(--nb-explain-user-text)" : "var(--nb-explain-text)",
|
|
176
|
+
wordBreak: "break-word",
|
|
177
|
+
});
|
|
178
|
+
export const messageBold = {
|
|
179
|
+
fontWeight: 600,
|
|
180
|
+
color: "var(--nb-explain-text)",
|
|
181
|
+
};
|
|
182
|
+
// Typing indicator
|
|
183
|
+
export const typingRow = {
|
|
184
|
+
display: "flex",
|
|
185
|
+
gap: 10,
|
|
186
|
+
};
|
|
187
|
+
export const typingBubble = {
|
|
188
|
+
background: "var(--nb-explain-bg-subtle)",
|
|
189
|
+
borderRadius: "var(--nb-explain-radius-sm)",
|
|
190
|
+
padding: "12px 16px",
|
|
191
|
+
display: "flex",
|
|
192
|
+
gap: 6,
|
|
193
|
+
};
|
|
194
|
+
export const typingDot = {
|
|
195
|
+
width: 6,
|
|
196
|
+
height: 6,
|
|
197
|
+
borderRadius: "50%",
|
|
198
|
+
background: "var(--nb-explain-text-dim)",
|
|
199
|
+
};
|
|
200
|
+
// --- Input area ---
|
|
201
|
+
export const inputArea = {
|
|
202
|
+
padding: "12px 16px",
|
|
203
|
+
borderTop: "1px solid var(--nb-explain-border)",
|
|
204
|
+
};
|
|
205
|
+
export const inputRow = {
|
|
206
|
+
display: "flex",
|
|
207
|
+
alignItems: "center",
|
|
208
|
+
gap: 8,
|
|
209
|
+
background: "var(--nb-explain-bg-subtle)",
|
|
210
|
+
borderRadius: "var(--nb-explain-radius-sm)",
|
|
211
|
+
padding: "8px 12px",
|
|
212
|
+
};
|
|
213
|
+
export const inputField = {
|
|
214
|
+
flex: 1,
|
|
215
|
+
background: "none",
|
|
216
|
+
border: "none",
|
|
217
|
+
outline: "none",
|
|
218
|
+
fontSize: 14,
|
|
219
|
+
color: "var(--nb-explain-text)",
|
|
220
|
+
fontFamily: "var(--nb-explain-font)",
|
|
221
|
+
};
|
|
222
|
+
export const sendBtn = (active) => ({
|
|
223
|
+
padding: 6,
|
|
224
|
+
borderRadius: "var(--nb-explain-radius-xs)",
|
|
225
|
+
background: "none",
|
|
226
|
+
border: "none",
|
|
227
|
+
cursor: active ? "pointer" : "not-allowed",
|
|
228
|
+
color: active ? "var(--nb-explain-accent)" : "var(--nb-explain-text-dim)",
|
|
229
|
+
display: "flex",
|
|
230
|
+
alignItems: "center",
|
|
231
|
+
transition: "color 0.15s",
|
|
232
|
+
opacity: active ? 1 : 0.5,
|
|
233
|
+
});
|
|
234
|
+
export const inputFooter = {
|
|
235
|
+
fontSize: 10,
|
|
236
|
+
color: "var(--nb-explain-text-dim)",
|
|
237
|
+
textAlign: "center",
|
|
238
|
+
marginTop: 6,
|
|
239
|
+
};
|
|
240
|
+
// --- Floating button ---
|
|
241
|
+
export const fab = (isOpen) => ({
|
|
242
|
+
position: "fixed",
|
|
243
|
+
bottom: 20,
|
|
244
|
+
right: 20,
|
|
245
|
+
zIndex: 9997,
|
|
246
|
+
width: 48,
|
|
247
|
+
height: 48,
|
|
248
|
+
borderRadius: "50%",
|
|
249
|
+
display: "flex",
|
|
250
|
+
alignItems: "center",
|
|
251
|
+
justifyContent: "center",
|
|
252
|
+
border: "none",
|
|
253
|
+
cursor: "pointer",
|
|
254
|
+
transition: "transform 0.2s, box-shadow 0.2s",
|
|
255
|
+
boxShadow: "0 4px 20px rgba(0,0,0,0.3)",
|
|
256
|
+
background: isOpen
|
|
257
|
+
? "var(--nb-explain-bg-hover)"
|
|
258
|
+
: "linear-gradient(135deg, var(--nb-explain-accent), #f97316)",
|
|
259
|
+
color: isOpen ? "var(--nb-explain-text-muted)" : "#fff",
|
|
260
|
+
});
|
|
261
|
+
// --- Banner ---
|
|
262
|
+
export const banner = {
|
|
263
|
+
position: "fixed",
|
|
264
|
+
top: 12,
|
|
265
|
+
left: "50%",
|
|
266
|
+
transform: "translateX(-50%)",
|
|
267
|
+
zIndex: 9996,
|
|
268
|
+
background: "var(--nb-explain-banner-bg)",
|
|
269
|
+
color: "var(--nb-explain-banner-text)",
|
|
270
|
+
fontSize: 14,
|
|
271
|
+
fontWeight: 500,
|
|
272
|
+
padding: "6px 16px",
|
|
273
|
+
borderRadius: 20,
|
|
274
|
+
boxShadow: "0 4px 20px rgba(234,179,8,0.3)",
|
|
275
|
+
display: "flex",
|
|
276
|
+
alignItems: "center",
|
|
277
|
+
gap: 8,
|
|
278
|
+
fontFamily: "var(--nb-explain-font)",
|
|
279
|
+
animation: "nb-explain-fade-in 0.2s ease-out",
|
|
280
|
+
};
|
|
281
|
+
export const bannerCancel = {
|
|
282
|
+
marginLeft: 4,
|
|
283
|
+
color: "rgba(0,0,0,0.5)",
|
|
284
|
+
background: "none",
|
|
285
|
+
border: "none",
|
|
286
|
+
cursor: "pointer",
|
|
287
|
+
textDecoration: "underline",
|
|
288
|
+
fontSize: 12,
|
|
289
|
+
fontFamily: "var(--nb-explain-font)",
|
|
290
|
+
};
|
|
291
|
+
// --- Animations (injected as <style>) ---
|
|
292
|
+
export const ANIMATIONS = `
|
|
293
|
+
@keyframes nb-explain-slide-up {
|
|
294
|
+
from { opacity: 0; transform: translateY(8px); }
|
|
295
|
+
to { opacity: 1; transform: translateY(0); }
|
|
296
|
+
}
|
|
297
|
+
@keyframes nb-explain-fade-in {
|
|
298
|
+
from { opacity: 0; transform: translateX(-50%) translateY(-4px); }
|
|
299
|
+
to { opacity: 1; transform: translateX(-50%) translateY(0); }
|
|
300
|
+
}
|
|
301
|
+
@keyframes nb-explain-bounce {
|
|
302
|
+
0%, 80%, 100% { transform: translateY(0); }
|
|
303
|
+
40% { transform: translateY(-4px); }
|
|
304
|
+
}
|
|
305
|
+
.nb-explain-dot-1 { animation: nb-explain-bounce 1.2s infinite; animation-delay: 0ms; }
|
|
306
|
+
.nb-explain-dot-2 { animation: nb-explain-bounce 1.2s infinite; animation-delay: 150ms; }
|
|
307
|
+
.nb-explain-dot-3 { animation: nb-explain-bounce 1.2s infinite; animation-delay: 300ms; }
|
|
308
|
+
`;
|
|
309
|
+
export const HIGHLIGHT_STYLES = `
|
|
310
|
+
[data-nb-explain-highlight] {
|
|
311
|
+
outline: 2px solid rgba(234, 179, 8, 0.7) !important;
|
|
312
|
+
border-radius: 6px;
|
|
313
|
+
cursor: help !important;
|
|
314
|
+
transition: outline 0.1s ease;
|
|
315
|
+
}
|
|
316
|
+
`;
|
|
317
|
+
//# sourceMappingURL=styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/client/styles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Message } from "../types";
|
|
2
|
+
export type AssistantConfig = {
|
|
3
|
+
provider: "anthropic" | "openai";
|
|
4
|
+
apiKey: string;
|
|
5
|
+
model?: string;
|
|
6
|
+
systemPrompt?: string;
|
|
7
|
+
};
|
|
8
|
+
type HandlerOptions = {
|
|
9
|
+
apiKey?: string;
|
|
10
|
+
};
|
|
11
|
+
type ChatRequest = {
|
|
12
|
+
messages: Message[];
|
|
13
|
+
};
|
|
14
|
+
type ChatResponse = {
|
|
15
|
+
reply: string;
|
|
16
|
+
};
|
|
17
|
+
interface IncomingRequest {
|
|
18
|
+
headers: Record<string, string | string[] | undefined> | {
|
|
19
|
+
get(name: string): string | null;
|
|
20
|
+
};
|
|
21
|
+
body?: unknown;
|
|
22
|
+
method?: string;
|
|
23
|
+
on?(event: string, callback: (...args: unknown[]) => void): unknown;
|
|
24
|
+
}
|
|
25
|
+
interface OutgoingResponse {
|
|
26
|
+
status?(code: number): Pick<OutgoingResponse, "json" | "end">;
|
|
27
|
+
statusCode?: number;
|
|
28
|
+
json?(data: unknown): void;
|
|
29
|
+
end?(data?: string): void;
|
|
30
|
+
setHeader?(name: string, value: string): void;
|
|
31
|
+
writeHead?(statusCode: number, headers?: Record<string, string>): void;
|
|
32
|
+
}
|
|
33
|
+
export declare function createAssistant(config: AssistantConfig): {
|
|
34
|
+
chat: (req: ChatRequest) => Promise<ChatResponse>;
|
|
35
|
+
handler: (opts?: HandlerOptions) => (req: IncomingRequest, res: OutgoingResponse) => Promise<void>;
|
|
36
|
+
};
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/server/handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAKxC,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,WAAW,GAAG,QAAQ,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG;QAAE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC9F,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC;CACrE;AAED,UAAU,gBAAgB;IACxB,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,SAAS,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CACxE;AAmED,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe;gBAG5B,WAAW,KAAG,OAAO,CAAC,YAAY,CAAC;qBAQpC,cAAc,MACtB,KAAK,eAAe,EAAE,KAAK,gBAAgB,KAAG,OAAO,CAAC,IAAI,CAAC;EAwC5E"}
|