@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.
Files changed (57) hide show
  1. package/README.md +402 -0
  2. package/dist/client/AIAssistantProvider.d.ts +21 -0
  3. package/dist/client/AIAssistantProvider.d.ts.map +1 -0
  4. package/dist/client/AIAssistantProvider.js +198 -0
  5. package/dist/client/AIAssistantProvider.js.map +1 -0
  6. package/dist/client/AIChatBot.d.ts +10 -0
  7. package/dist/client/AIChatBot.d.ts.map +1 -0
  8. package/dist/client/AIChatBot.js +139 -0
  9. package/dist/client/AIChatBot.js.map +1 -0
  10. package/dist/client/AIFloatingButton.d.ts +7 -0
  11. package/dist/client/AIFloatingButton.d.ts.map +1 -0
  12. package/dist/client/AIFloatingButton.js +16 -0
  13. package/dist/client/AIFloatingButton.js.map +1 -0
  14. package/dist/client/index.d.ts +5 -0
  15. package/dist/client/index.d.ts.map +1 -0
  16. package/dist/client/index.js +4 -0
  17. package/dist/client/index.js.map +1 -0
  18. package/dist/client/styles.d.ts +51 -0
  19. package/dist/client/styles.d.ts.map +1 -0
  20. package/dist/client/styles.js +317 -0
  21. package/dist/client/styles.js.map +1 -0
  22. package/dist/server/handler.d.ts +38 -0
  23. package/dist/server/handler.d.ts.map +1 -0
  24. package/dist/server/handler.js +117 -0
  25. package/dist/server/handler.js.map +1 -0
  26. package/dist/server/index.d.ts +6 -0
  27. package/dist/server/index.d.ts.map +1 -0
  28. package/dist/server/index.js +4 -0
  29. package/dist/server/index.js.map +1 -0
  30. package/dist/server/providers/anthropic.d.ts +9 -0
  31. package/dist/server/providers/anthropic.d.ts.map +1 -0
  32. package/dist/server/providers/anthropic.js +40 -0
  33. package/dist/server/providers/anthropic.js.map +1 -0
  34. package/dist/server/providers/openai.d.ts +9 -0
  35. package/dist/server/providers/openai.d.ts.map +1 -0
  36. package/dist/server/providers/openai.js +46 -0
  37. package/dist/server/providers/openai.js.map +1 -0
  38. package/dist/server/providers/types.d.ts +9 -0
  39. package/dist/server/providers/types.d.ts.map +1 -0
  40. package/dist/server/providers/types.js +2 -0
  41. package/dist/server/providers/types.js.map +1 -0
  42. package/dist/types.d.ts +11 -0
  43. package/dist/types.d.ts.map +1 -0
  44. package/dist/types.js +2 -0
  45. package/dist/types.js.map +1 -0
  46. package/package.json +45 -0
  47. package/src/client/AIAssistantProvider.tsx +288 -0
  48. package/src/client/AIChatBot.tsx +309 -0
  49. package/src/client/AIFloatingButton.tsx +34 -0
  50. package/src/client/index.ts +4 -0
  51. package/src/client/styles.ts +353 -0
  52. package/src/server/handler.ts +158 -0
  53. package/src/server/index.ts +5 -0
  54. package/src/server/providers/anthropic.ts +53 -0
  55. package/src/server/providers/openai.ts +55 -0
  56. package/src/server/providers/types.ts +10 -0
  57. 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,7 @@
1
+ type Props = {
2
+ isOpen: boolean;
3
+ onClick: () => void;
4
+ };
5
+ export default function AIFloatingButton({ isOpen, onClick }: Props): import("react/jsx-runtime").JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=AIFloatingButton.d.ts.map
@@ -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,4 @@
1
+ export { default as AIAssistantProvider, useAIAssistant } from "./AIAssistantProvider";
2
+ export { default as AIChatBot } from "./AIChatBot";
3
+ export { default as AIFloatingButton } from "./AIFloatingButton";
4
+ //# sourceMappingURL=index.js.map
@@ -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"}