@diegoaltoworks/chatter 0.16.0 → 0.18.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 +1 -0
- package/dist/auth/apikeys.d.ts +0 -1
- package/dist/auth/apikeys.d.ts.map +1 -1
- package/dist/bin/create-apikey.js +1 -3
- package/dist/client/__tests__/markdown.test.d.ts +5 -0
- package/dist/client/__tests__/markdown.test.d.ts.map +1 -0
- package/dist/client/src/Chat.d.ts +1 -0
- package/dist/client/src/Chat.d.ts.map +1 -1
- package/dist/client/src/markdown.d.ts +20 -0
- package/dist/client/src/markdown.d.ts.map +1 -0
- package/dist/core/retrieval.d.ts.map +1 -1
- package/dist/index.js +337 -65
- package/dist/index.mjs +337 -65
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/static/chatter.css +121 -0
- package/dist/static/chatter.js +8 -2
- package/package.json +19 -12
package/dist/static/chatter.css
CHANGED
|
@@ -109,6 +109,127 @@
|
|
|
109
109
|
color: #c33 !important;
|
|
110
110
|
}
|
|
111
111
|
|
|
112
|
+
/* Markdown content (assistant messages) */
|
|
113
|
+
.chatter-ui-message-content > *:first-child {
|
|
114
|
+
margin-top: 0;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.chatter-ui-message-content > *:last-child {
|
|
118
|
+
margin-bottom: 0;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.chatter-ui-message-content p {
|
|
122
|
+
margin: 0 0 8px 0;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.chatter-ui-message-content h1,
|
|
126
|
+
.chatter-ui-message-content h2,
|
|
127
|
+
.chatter-ui-message-content h3,
|
|
128
|
+
.chatter-ui-message-content h4,
|
|
129
|
+
.chatter-ui-message-content h5,
|
|
130
|
+
.chatter-ui-message-content h6 {
|
|
131
|
+
margin: 12px 0 6px 0;
|
|
132
|
+
font-weight: 600;
|
|
133
|
+
line-height: 1.25;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.chatter-ui-message-content h1 {
|
|
137
|
+
font-size: 1.3em;
|
|
138
|
+
}
|
|
139
|
+
.chatter-ui-message-content h2 {
|
|
140
|
+
font-size: 1.2em;
|
|
141
|
+
}
|
|
142
|
+
.chatter-ui-message-content h3 {
|
|
143
|
+
font-size: 1.1em;
|
|
144
|
+
}
|
|
145
|
+
.chatter-ui-message-content h4,
|
|
146
|
+
.chatter-ui-message-content h5,
|
|
147
|
+
.chatter-ui-message-content h6 {
|
|
148
|
+
font-size: 1em;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.chatter-ui-message-content ul,
|
|
152
|
+
.chatter-ui-message-content ol {
|
|
153
|
+
margin: 0 0 8px 0;
|
|
154
|
+
padding-left: 22px;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.chatter-ui-message-content li {
|
|
158
|
+
margin: 2px 0;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.chatter-ui-message-content a {
|
|
162
|
+
color: inherit;
|
|
163
|
+
text-decoration: underline;
|
|
164
|
+
word-break: break-word;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.chatter-ui-message-user .chatter-ui-message-content a {
|
|
168
|
+
color: #ffffff;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.chatter-ui-message-content code {
|
|
172
|
+
font-family:
|
|
173
|
+
ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New",
|
|
174
|
+
monospace;
|
|
175
|
+
font-size: 0.9em;
|
|
176
|
+
padding: 1px 5px;
|
|
177
|
+
background: rgba(0, 0, 0, 0.06);
|
|
178
|
+
border-radius: 4px;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
.chatter-ui-message-user .chatter-ui-message-content code {
|
|
182
|
+
background: rgba(255, 255, 255, 0.18);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.chatter-ui-message-content pre {
|
|
186
|
+
margin: 8px 0;
|
|
187
|
+
padding: 10px 12px;
|
|
188
|
+
background: #0f1115;
|
|
189
|
+
color: #e6e6e6;
|
|
190
|
+
border-radius: 8px;
|
|
191
|
+
overflow-x: auto;
|
|
192
|
+
font-size: 0.9em;
|
|
193
|
+
line-height: 1.45;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
.chatter-ui-message-content pre code {
|
|
197
|
+
padding: 0;
|
|
198
|
+
background: transparent;
|
|
199
|
+
color: inherit;
|
|
200
|
+
font-size: inherit;
|
|
201
|
+
border-radius: 0;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
.chatter-ui-message-content blockquote {
|
|
205
|
+
margin: 8px 0;
|
|
206
|
+
padding: 4px 12px;
|
|
207
|
+
border-left: 3px solid rgba(0, 0, 0, 0.15);
|
|
208
|
+
color: rgba(0, 0, 0, 0.7);
|
|
209
|
+
background: rgba(0, 0, 0, 0.03);
|
|
210
|
+
border-radius: 0 6px 6px 0;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
.chatter-ui-message-user .chatter-ui-message-content blockquote {
|
|
214
|
+
border-left-color: rgba(255, 255, 255, 0.4);
|
|
215
|
+
color: rgba(255, 255, 255, 0.85);
|
|
216
|
+
background: rgba(255, 255, 255, 0.08);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
.chatter-ui-message-content hr {
|
|
220
|
+
border: none;
|
|
221
|
+
border-top: 1px solid rgba(0, 0, 0, 0.12);
|
|
222
|
+
margin: 10px 0;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
.chatter-ui-message-content strong {
|
|
226
|
+
font-weight: 600;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
.chatter-ui-message-content em {
|
|
230
|
+
font-style: italic;
|
|
231
|
+
}
|
|
232
|
+
|
|
112
233
|
/* Input Container */
|
|
113
234
|
.chatter-ui-chat-input-container {
|
|
114
235
|
display: flex;
|
package/dist/static/chatter.js
CHANGED
|
@@ -1,2 +1,8 @@
|
|
|
1
|
-
"use strict";var Chatter=(()=>{var
|
|
2
|
-
`);c=
|
|
1
|
+
"use strict";var Chatter=(()=>{var M=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var A=(n,t)=>{for(var e in t)M(n,e,{get:t[e],enumerable:!0})},_=(n,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of O(t))!x.call(n,i)&&i!==e&&M(n,i,{get:()=>t[i],enumerable:!(s=B(t,i))||s.enumerable});return n};var P=n=>_(M({},"__esModule",{value:!0}),n);var U={};A(U,{Chat:()=>m,ChatBot:()=>p,ChatButton:()=>C});var p=class{constructor(t){if(!t.host)throw new Error("host is required");if(!t.mode||!["public","private"].includes(t.mode))throw new Error('mode must be either "public" or "private"');if(!t.apiKey)throw new Error("apiKey is required");if(t.mode==="private"&&!t.token)throw new Error("token is required for private mode");let e=t.host.trim();!e.startsWith("http://")&&!e.startsWith("https://")&&(e=`${e.startsWith("localhost")||e.startsWith("127.0.0.1")?"http://":"https://"}${e}`),this.baseUrl=e.replace(/\/$/,""),this.mode=t.mode,this.apiKey=t.apiKey,this.token=t.token,this.endpoint=`${this.baseUrl}/api/${this.mode}/chat`}getHeaders(t=!1){let e={"Content-Type":"application/json"};return this.apiKey&&(e["x-api-key"]=this.apiKey),this.mode==="private"&&this.token&&(e.Authorization=`Bearer ${this.token}`),t&&(e.Accept="text/event-stream"),e}async sendMessage(t){let e=await fetch(this.endpoint,{method:"POST",headers:this.getHeaders(),body:JSON.stringify({message:t})});if(!e.ok){let i=await e.json().catch(()=>({error:"Unknown error"}));throw new Error(`API Error: ${i.error||e.statusText}`)}return(await e.json()).reply}async sendConversation(t){if(!Array.isArray(t)||t.length===0)throw new Error("messages must be a non-empty array");let e=await fetch(this.endpoint,{method:"POST",headers:this.getHeaders(),body:JSON.stringify({messages:t})});if(!e.ok){let i=await e.json().catch(()=>({error:"Unknown error"}));throw new Error(`API Error: ${i.error||e.statusText}`)}return(await e.json()).reply}async streamMessage(t,e){await this.stream({message:t},e)}async streamConversation(t,e){if(!Array.isArray(t)||t.length===0)throw new Error("messages must be a non-empty array");await this.stream({messages:t},e)}async stream(t,e){let{onChunk:s,onEnd:i,onError:r}=e;try{let o=await fetch(`${this.endpoint}?stream=1`,{method:"POST",headers:this.getHeaders(!0),body:JSON.stringify(t)});if(!o.ok){let a=await o.json().catch(()=>({error:"Unknown error"}));throw new Error(`API Error: ${a.error||o.statusText}`)}if(!o.body)throw new Error("Response body is null");let h=o.body.getReader(),d=new TextDecoder,c="";for(;;){let{done:a,value:g}=await h.read();if(a)break;c+=d.decode(g,{stream:!0});let f=c.split(`
|
|
2
|
+
`);c=f.pop()||"";for(let v of f)if(v.startsWith("data: ")){let y=v.slice(6);try{let E=JSON.parse(y);E.delta&&s(E.delta)}catch{}}else if(v.startsWith("event: end")){i&&i();return}}i&&i()}catch(o){if(r)r(o);else throw o}}};var q=/^(https?:|mailto:|\/|#)/i,k="CODE",S="ENDCODE";function l(n){return n.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function I(n){let t=n.trim();return q.test(t)?l(t):"#"}function L(n){let t=[],e=n.replace(/`([^`\n]+)`/g,(i,r)=>{let o=t.push(r)-1;return`${k}${o}${S}`});e=e.replace(/\[([^\]]+)\]\(([^)\s]+)(?:\s+"([^&]*)")?\)/g,(i,r,o,h)=>{let d=I(o),c=h?` title="${h}"`:"";return`<a href="${d}" target="_blank" rel="noopener noreferrer"${c}>${r}</a>`}),e=e.replace(/(\*\*|__)(?=\S)([\s\S]+?)(?<=\S)\1/g,"<strong>$2</strong>"),e=e.replace(/(?<!\*)\*(?!\*)(?=\S)([\s\S]+?)(?<=\S)\*(?!\*)/g,"<em>$1</em>"),e=e.replace(/(?<![A-Za-z0-9_])_(?=\S)([\s\S]+?)(?<=\S)_(?![A-Za-z0-9_])/g,"<em>$1</em>");let s=new RegExp(`${k}(\\d+)${S}`,"g");return e=e.replace(s,(i,r)=>`<code>${t[Number(r)]??""}</code>`),e}function $(n,t){if(n.length===0)return;let e=n.join(`
|
|
3
|
+
`),s=L(l(e)).replace(/\n/g,"<br>");t.push(`<p>${s}</p>`),n.length=0}function w(n,t){if(!n)return null;let e=n.items.map(s=>`<li>${L(l(s))}</li>`).join("");return t.push(`<${n.type}>${e}</${n.type}>`),null}function H(n,t){if(n.length===0)return;let e=T(n.join(`
|
|
4
|
+
`));t.push(`<blockquote>${e}</blockquote>`),n.length=0}function T(n){if(!n)return"";let t=n.replace(/\r\n?/g,`
|
|
5
|
+
`).split(`
|
|
6
|
+
`),e=[],s=[],i=[],r=null,o=!1,h="",d=[],c=()=>{$(s,e),r=w(r,e),H(i,e)};for(let a of t){if(o){if(/^\s*```\s*$/.test(a)){let u=l(d.join(`
|
|
7
|
+
`)),b=h?` class="language-${l(h)}"`:"";e.push(`<pre><code${b}>${u}</code></pre>`),d=[],h="",o=!1}else d.push(a);continue}let g=a.match(/^\s*```\s*([\w+-]*)\s*$/);if(g){c(),o=!0,h=g[1]||"";continue}if(/^\s*$/.test(a)){c();continue}if(/^\s*(?:---|\*\*\*|___)\s*$/.test(a)&&s.length===0){c(),e.push("<hr>");continue}let f=a.match(/^(#{1,6})\s+(.*)$/);if(f){c();let u=f[1].length,b=L(l(f[2].trim()));e.push(`<h${u}>${b}</h${u}>`);continue}let v=a.match(/^\s*>\s?(.*)$/);if(v){$(s,e),r=w(r,e),i.push(v[1]);continue}i.length>0&&H(i,e);let y=a.match(/^\s*[-*+]\s+(.*)$/),E=a.match(/^\s*\d+\.\s+(.*)$/);if(y||E){$(s,e);let u=y?"ul":"ol",b=y?y[1]:E[1];(!r||r.type!==u)&&(r=w(r,e),r={type:u,items:[]}),r.items.push(b);continue}r&&(r=w(r,e)),s.push(a)}if(o){let a=l(d.join(`
|
|
8
|
+
`)),g=h?` class="language-${l(h)}"`:"";e.push(`<pre><code${g}>${a}</code></pre>`)}return c(),e.join("")}var m=class{constructor(t){this.messages=[];if(this.bot=new p({host:t.host,mode:t.mode,apiKey:t.apiKey,token:t.token}),typeof t.container=="string"){let e=document.querySelector(t.container);if(!e)throw new Error(`Container element not found: ${t.container}`);this.container=e}else this.container=t.container;this.placeholder=t.placeholder||"Type your message...",this.title=t.title||"Chat",this.subtitle=t.subtitle||"",this.messages=t.initialMessages||[],this.onClose=t.onClose,this.render(),this.attachEventListeners()}render(){this.container.innerHTML=`<div class="chatter-ui-chat"><div class="chatter-ui-chat-header"><button class="chatter-ui-chat-close" type="button" aria-label="Close chat">\xD7</button><div class="chatter-ui-chat-title">${this.title}</div>${this.subtitle?`<div class="chatter-ui-chat-subtitle">${this.subtitle}</div>`:""}</div><div class="chatter-ui-chat-messages"></div><div class="chatter-ui-chat-input-container"><textarea class="chatter-ui-chat-input" placeholder="${this.placeholder}" rows="1"></textarea><button class="chatter-ui-chat-send" type="button"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 2L11 13M22 2l-7 20-4-9-9-4 20-7z"/></svg></button></div></div>`;let t=this.container.querySelector(".chatter-ui-chat-messages"),e=this.container.querySelector(".chatter-ui-chat-input"),s=this.container.querySelector(".chatter-ui-chat-send");if(!t||!e||!s)throw new Error("Required chat elements not found in container");this.messagesContainer=t,this.inputElement=e,this.sendButton=s;for(let i of this.messages)this.addMessageToUI(i)}attachEventListeners(){let t=this.container.querySelector(".chatter-ui-chat-close");t&&this.onClose&&t.addEventListener("click",()=>{this.onClose?.()}),this.sendButton.addEventListener("click",()=>this.handleSend()),this.inputElement.addEventListener("keydown",e=>{e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),this.handleSend())}),this.inputElement.addEventListener("input",()=>{this.inputElement.style.height="auto",this.inputElement.style.height=`${Math.min(this.inputElement.scrollHeight,120)}px`}),this.isMobile()&&(this.inputElement.addEventListener("focus",()=>{setTimeout(()=>{this.inputElement.scrollIntoView({behavior:"smooth",block:"nearest"})},300)}),this.sendButton.addEventListener("touchend",e=>{e.preventDefault(),this.handleSend()},{passive:!1}))}async handleSend(){let t=this.inputElement.value.trim();if(!t)return;let e={role:"user",content:t};this.messages.push(e),this.addMessageToUI(e),this.inputElement.value="",this.inputElement.style.height="auto",this.setInputEnabled(!1);try{let s={role:"assistant",content:""};this.messages.push(s);let r=this.addMessageToUI(s).querySelector(".chatter-ui-message-content");if(!r)throw new Error("Message content element not found");await this.bot.streamConversation(this.messages,{onChunk:o=>{s.content+=o,this.renderMessageContent(r,s),this.scrollToBottom()},onEnd:()=>{this.renderMessageContent(r,s),this.setInputEnabled(!0),this.isMobile()||this.inputElement.focus()},onError:o=>{console.error("Stream error:",o),s.content="Sorry, an error occurred. Please try again.",r.textContent=s.content,r.classList.add("chatter-ui-message-error"),this.setInputEnabled(!0)}})}catch(s){console.error("Send error:",s);let i={role:"assistant",content:"Sorry, an error occurred. Please try again."};this.messages.push(i),this.addMessageToUI(i).querySelector(".chatter-ui-message-content")?.classList.add("chatter-ui-message-error"),this.setInputEnabled(!0)}}addMessageToUI(t){let e=document.createElement("div");e.className=`chatter-ui-message chatter-ui-message-${t.role}`;let s=document.createElement("div");return s.className="chatter-ui-message-content",e.appendChild(s),this.renderMessageContent(s,t),this.messagesContainer.appendChild(e),this.scrollToBottom(),e}renderMessageContent(t,e){e.role==="assistant"?t.innerHTML=T(e.content):t.innerHTML=l(e.content).replace(/\n/g,"<br>")}setInputEnabled(t){this.inputElement.disabled=!t,this.sendButton.disabled=!t}scrollToBottom(){this.messagesContainer.scrollTop=this.messagesContainer.scrollHeight}clear(){this.messages=[],this.messagesContainer.innerHTML=""}getMessages(){return[...this.messages]}destroy(){this.container.innerHTML=""}isMobile(){return window.innerWidth<=768}};var C=class{constructor(t){this.chat=null;this.isOpen=!1;this.config={position:"bottom-right",label:"\u{1F4AC}",...t},this.render(),this.attachEventListeners()}render(){this.buttonElement=document.createElement("button"),this.buttonElement.className=`chatter-ui-chat-button chatter-ui-chat-button-${this.config.position}`,this.buttonElement.innerHTML=this.config.label||"\u{1F4AC}",this.buttonElement.setAttribute("aria-label","Open chat"),this.config.styles&&Object.assign(this.buttonElement.style,this.config.styles),this.chatContainer=document.createElement("div"),this.chatContainer.className=`chatter-ui-chat-popup chatter-ui-chat-popup-${this.config.position}`,this.chatContainer.style.display="none",document.body.appendChild(this.buttonElement),document.body.appendChild(this.chatContainer)}attachEventListeners(){this.buttonElement.addEventListener("click",()=>this.toggle()),document.addEventListener("keydown",t=>{t.key==="Escape"&&this.isOpen&&this.close()}),document.addEventListener("click",t=>{this.isOpen&&!this.chatContainer.contains(t.target)&&!this.buttonElement.contains(t.target)&&this.close()})}toggle(){this.isOpen?this.close():this.open()}open(){this.isOpen||(this.chat||(this.chat=new m({host:this.config.host,mode:this.config.mode,apiKey:this.config.apiKey,token:this.config.token,container:this.chatContainer,onClose:()=>this.close(),...this.config.chatConfig})),this.chatContainer.style.display="block",this.buttonElement.classList.add("chatter-ui-chat-button-open"),this.buttonElement.setAttribute("aria-label","Close chat"),this.isOpen=!0,this.isMobile()&&(document.body.style.overflow="hidden",document.body.style.position="fixed",document.body.style.width="100%"),setTimeout(()=>{let t=this.chatContainer.querySelector(".chatter-ui-chat-input");t&&(t.focus(),this.isMobile()&&setTimeout(()=>{t.scrollIntoView({behavior:"smooth",block:"center"})},300))},this.isMobile()?300:100))}close(){this.isOpen&&(this.chatContainer.style.display="none",this.buttonElement.classList.remove("chatter-ui-chat-button-open"),this.buttonElement.setAttribute("aria-label","Open chat"),this.isOpen=!1,this.isMobile()&&(document.body.style.overflow="",document.body.style.position="",document.body.style.width=""))}isMobile(){return window.innerWidth<=768}destroy(){this.chat?.destroy(),this.buttonElement.remove(),this.chatContainer.remove()}isOpened(){return this.isOpen}};typeof window<"u"&&(window.Chatter={ChatBot:p,Chat:m,ChatButton:C});return P(U);})();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@diegoaltoworks/chatter",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.0",
|
|
4
4
|
"description": "Embeddable AI chatbot framework with RAG, authentication, and customizable widgets",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -88,25 +88,25 @@
|
|
|
88
88
|
},
|
|
89
89
|
"peerDependencies": {
|
|
90
90
|
"@libsql/client": "^0.17.2",
|
|
91
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
91
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
92
92
|
"hono": "^4.12.14",
|
|
93
|
-
"openai": "^
|
|
93
|
+
"openai": "^7.3.0",
|
|
94
94
|
"zod": "^3.25.76"
|
|
95
95
|
},
|
|
96
96
|
"dependencies": {
|
|
97
|
-
"jose": "6.2.
|
|
97
|
+
"jose": "6.2.3"
|
|
98
98
|
},
|
|
99
99
|
"devDependencies": {
|
|
100
|
-
"@biomejs/biome": "2.
|
|
101
|
-
"@libsql/client": "0.17.
|
|
102
|
-
"@modelcontextprotocol/sdk": "1.
|
|
103
|
-
"@types/bun": "1.3.
|
|
104
|
-
"@types/node": "25.
|
|
105
|
-
"esbuild": "0.28.
|
|
106
|
-
"hono": "4.12.
|
|
100
|
+
"@biomejs/biome": "2.5.5",
|
|
101
|
+
"@libsql/client": "0.17.4",
|
|
102
|
+
"@modelcontextprotocol/sdk": "1.30.0",
|
|
103
|
+
"@types/bun": "1.3.14",
|
|
104
|
+
"@types/node": "25.9.3",
|
|
105
|
+
"esbuild": "0.28.1",
|
|
106
|
+
"hono": "4.12.32",
|
|
107
107
|
"husky": "9.1.7",
|
|
108
108
|
"lint-staged": "16.4.0",
|
|
109
|
-
"openai": "6.
|
|
109
|
+
"openai": "6.48.0",
|
|
110
110
|
"typescript": "6.0.3",
|
|
111
111
|
"zod": "3.25.76"
|
|
112
112
|
},
|
|
@@ -117,5 +117,12 @@
|
|
|
117
117
|
"*.ts": [
|
|
118
118
|
"bash -c 'tsc --noEmit --skipLibCheck'"
|
|
119
119
|
]
|
|
120
|
+
},
|
|
121
|
+
"overrides": {
|
|
122
|
+
"qs": "^6.15.3",
|
|
123
|
+
"ws": "^8.21.1",
|
|
124
|
+
"@hono/node-server": "^2.0.5",
|
|
125
|
+
"fast-uri": "^3.1.3",
|
|
126
|
+
"ip-address": "^10.4.0"
|
|
120
127
|
}
|
|
121
128
|
}
|