@lssm/module.ai-chat 0.0.0-canary-20251217060804 → 0.0.0-canary-20251217062139
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/dist/index.d.ts +0 -2
- package/dist/index.js +1 -1
- package/dist/libs/ai-providers/dist/factory.js +1 -0
- package/dist/libs/ai-providers/dist/index.js +1 -0
- package/dist/libs/ai-providers/dist/legacy.js +1 -0
- package/dist/libs/ai-providers/dist/models.js +1 -0
- package/dist/libs/ai-providers/dist/validation.js +1 -0
- package/dist/libs/design-system/dist/_virtual/rolldown_runtime.js +1 -0
- package/dist/libs/design-system/dist/components/atoms/Button.js +1 -0
- package/dist/libs/design-system/dist/components/atoms/Textarea.js +1 -0
- package/dist/libs/design-system/dist/lib/keyboard.js +1 -0
- package/dist/libs/design-system/dist/ui-kit-web/dist/ui/button.js +1 -0
- package/dist/libs/design-system/dist/ui-kit-web/dist/ui/textarea.js +1 -0
- package/dist/libs/design-system/dist/ui-kit-web/dist/ui-kit-core/dist/utils.js +1 -0
- package/dist/libs/ui-kit-web/dist/ui/avatar.js +1 -0
- package/dist/libs/ui-kit-web/dist/ui/badge.js +1 -0
- package/dist/libs/ui-kit-web/dist/ui/scroll-area.js +1 -0
- package/dist/libs/ui-kit-web/dist/ui/select.js +1 -0
- package/dist/libs/ui-kit-web/dist/ui/skeleton.js +1 -0
- package/dist/libs/ui-kit-web/dist/ui/tooltip.js +1 -0
- package/dist/libs/ui-kit-web/dist/ui/utils.js +1 -0
- package/dist/libs/ui-kit-web/dist/ui-kit-core/dist/utils.js +1 -0
- package/dist/presentation/components/ChatContainer.js +1 -1
- package/dist/presentation/components/ChatInput.d.ts +2 -2
- package/dist/presentation/components/ChatInput.js +1 -1
- package/dist/presentation/components/ChatMessage.d.ts +2 -2
- package/dist/presentation/components/ChatMessage.js +1 -1
- package/dist/presentation/components/CodePreview.d.ts +2 -2
- package/dist/presentation/components/CodePreview.js +2 -2
- package/dist/presentation/components/ContextIndicator.d.ts +2 -2
- package/dist/presentation/components/ContextIndicator.js +1 -1
- package/dist/presentation/components/ModelPicker.d.ts +2 -2
- package/dist/presentation/components/ModelPicker.js +1 -1
- package/dist/presentation/hooks/useChat.js +1 -1
- package/dist/presentation/hooks/useProviders.js +1 -1
- package/dist/presentation/index.d.ts +0 -1
- package/dist/providers/index.js +1 -1
- package/package.json +10 -10
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,6 @@ import { FileOperation, FileOperationResult, FileOperations, FileReadResult, Fil
|
|
|
4
4
|
import { ChatAttachment, ChatCodeBlock, ChatConversation, ChatMessage, ChatRole, ChatSource, ChatStreamChunk, ChatToolCall, ConversationStatus, MessageStatus, SendMessageOptions, SendMessageResult, StreamMessageResult } from "./core/message-types.js";
|
|
5
5
|
import { ConversationStore, InMemoryConversationStore, createInMemoryConversationStore } from "./core/conversation-store.js";
|
|
6
6
|
import { ChatService, ChatServiceConfig, createChatService } from "./core/chat-service.js";
|
|
7
|
-
import "./core/index.js";
|
|
8
7
|
import { AiChatFeature } from "./ai-chat.feature.js";
|
|
9
8
|
import { isStudioAvailable, supportsLocalMode } from "./providers/chat-utilities.js";
|
|
10
9
|
import { ChatModelInfo, ChatProvider, ChatProviderConfig, ChatProviderMode, ChatProviderName, DEFAULT_MODELS, MODELS, ModelCapabilities, ProviderAvailability, createProvider, createProviderFromEnv, getAvailableProviders, getDefaultModel, getEnvVarName, getModelInfo, getModelsForProvider, getRecommendedModels, hasCredentials, isOllamaRunning, listOllamaModels, validateProvider } from "./providers/index.js";
|
|
@@ -14,5 +13,4 @@ import { ChatInput } from "./presentation/components/ChatInput.js";
|
|
|
14
13
|
import "./presentation/components/index.js";
|
|
15
14
|
import { useChat } from "./presentation/hooks/useChat.js";
|
|
16
15
|
import { useProviders } from "./presentation/hooks/useProviders.js";
|
|
17
|
-
import "./presentation/hooks/index.js";
|
|
18
16
|
export { AiChatFeature, BuiltContext, ChatAttachment, ChatCodeBlock, ChatContainer, ChatConversation, ChatInput, ChatMessage, ChatMessage$1 as ChatMessageComponent, ChatModelInfo, ChatProvider, ChatProviderConfig, ChatProviderMode, ChatProviderName, ChatRole, ChatService, ChatServiceConfig, ChatSource, ChatStreamChunk, ChatToolCall, ContextBuilder, ContextBuilderOptions, ContextEntry, ConversationStatus, ConversationStore, DEFAULT_MODELS, FileInfo, FileOperation, FileOperationResult, FileOperations, FileReadResult, FileSystem, FileWriteResult, InMemoryConversationStore, MODELS, MessageStatus, ModelCapabilities, ProviderAvailability, SendMessageOptions, SendMessageResult, SpecInfo, StreamMessageResult, WorkspaceContext, WorkspaceContextConfig, WorkspaceSummary, createChatService, createContextBuilder, createInMemoryConversationStore, createNodeFileOperations, createProvider, createProviderFromEnv, createWorkspaceContext, getAvailableProviders, getDefaultModel, getEnvVarName, getModelInfo, getModelsForProvider, getRecommendedModels, hasCredentials, isOllamaRunning, isStudioAvailable, listOllamaModels, supportsLocalMode, useChat, useProviders, validateProvider };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{AiChatFeature as e}from"./ai-chat.feature.js";import{InMemoryConversationStore as t,createInMemoryConversationStore as n}from"./core/conversation-store.js";import{ChatService as r,createChatService as i}from"./core/chat-service.js";import"./core/index.js";import{
|
|
1
|
+
import{AiChatFeature as e}from"./ai-chat.feature.js";import{InMemoryConversationStore as t,createInMemoryConversationStore as n}from"./core/conversation-store.js";import{ChatService as r,createChatService as i}from"./core/chat-service.js";import"./core/index.js";import{a,e as o,i as s,n as c,r as l,t as u}from"./libs/ai-providers/dist/models.js";import{c as d,l as f,u as p}from"./libs/ai-providers/dist/factory.js";import{a as m,i as h,n as g,r as _,t as v}from"./libs/ai-providers/dist/validation.js";import{isStudioAvailable as y,supportsLocalMode as b}from"./providers/chat-utilities.js";import"./providers/index.js";import{WorkspaceContext as x,createWorkspaceContext as S}from"./context/workspace-context.js";import{ContextBuilder as C,createContextBuilder as w}from"./context/context-builder.js";import{FileOperations as T,createNodeFileOperations as E}from"./context/file-operations.js";import"./context/index.js";import{ChatContainer as D}from"./presentation/components/ChatContainer.js";import{ChatMessage as O}from"./presentation/components/ChatMessage.js";import{ChatInput as k}from"./presentation/components/ChatInput.js";import"./presentation/components/index.js";import{useChat as A}from"./presentation/hooks/useChat.js";import{useProviders as j}from"./presentation/hooks/useProviders.js";import"./presentation/hooks/index.js";export{e as AiChatFeature,D as ChatContainer,k as ChatInput,O as ChatMessageComponent,r as ChatService,C as ContextBuilder,o as DEFAULT_MODELS,T as FileOperations,t as InMemoryConversationStore,u as MODELS,x as WorkspaceContext,i as createChatService,w as createContextBuilder,n as createInMemoryConversationStore,E as createNodeFileOperations,d as createProvider,f as createProviderFromEnv,S as createWorkspaceContext,p as getAvailableProviders,a as getDefaultModel,_ as getEnvVarName,l as getModelInfo,c as getModelsForProvider,s as getRecommendedModels,g as hasCredentials,h as isOllamaRunning,y as isStudioAvailable,m as listOllamaModels,b as supportsLocalMode,A as useChat,j as useProviders,v as validateProvider};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{e,n as t}from"./models.js";import{anthropic as n}from"@ai-sdk/anthropic";import{google as r}from"@ai-sdk/google";import{mistral as i}from"@ai-sdk/mistral";import{openai as a}from"@ai-sdk/openai";import{ollama as o}from"ollama-ai-provider";var s=class{name;model;mode;config;cachedModel=null;constructor(t){this.name=t.provider,this.model=t.model??e[t.provider],this.mode=this.determineMode(t),this.config=t}determineMode(e){return e.provider===`ollama`?`local`:e.apiKey?`byok`:`managed`}getModel(){return this.cachedModel||=this.createModel(),this.cachedModel}createModel(){let{apiKey:e,baseUrl:t,proxyUrl:s,organizationId:c}=this.config;switch(this.name){case`ollama`:{let e=process.env.OLLAMA_BASE_URL;t&&t!==`http://localhost:11434`&&(process.env.OLLAMA_BASE_URL=t);let n=o(this.model);return e===void 0?t&&t!==`http://localhost:11434`&&delete process.env.OLLAMA_BASE_URL:process.env.OLLAMA_BASE_URL=e,n}case`openai`:if(this.mode===`managed`){let e=process.env.OPENAI_BASE_URL;s&&(process.env.OPENAI_BASE_URL=s);let t=a(this.model);return e===void 0?s&&delete process.env.OPENAI_BASE_URL:process.env.OPENAI_BASE_URL=e,t}return a(this.model);case`anthropic`:if(this.mode===`managed`){let e=process.env.OPENAI_BASE_URL;s&&(process.env.OPENAI_BASE_URL=s);let t=a(this.model);return e===void 0?s&&delete process.env.OPENAI_BASE_URL:process.env.OPENAI_BASE_URL=e,t}return n(this.model);case`mistral`:if(this.mode===`managed`){let e=process.env.OPENAI_BASE_URL;s&&(process.env.OPENAI_BASE_URL=s);let t=a(this.model);return e===void 0?s&&delete process.env.OPENAI_BASE_URL:process.env.OPENAI_BASE_URL=e,t}return i(this.model);case`gemini`:if(this.mode===`managed`){let e=process.env.OPENAI_BASE_URL;s&&(process.env.OPENAI_BASE_URL=s);let t=a(this.model);return e===void 0?s&&delete process.env.OPENAI_BASE_URL:process.env.OPENAI_BASE_URL=e,t}return r(this.model);default:throw Error(`Unknown provider: ${this.name}`)}}async listModels(){return this.name===`ollama`?this.listOllamaModels():t(this.name)}async listOllamaModels(){try{let e=this.config.baseUrl??`http://localhost:11434`,n=await fetch(`${e}/api/tags`);return n.ok?((await n.json()).models??[]).map(e=>({id:e.name,name:e.name,provider:`ollama`,contextWindow:8e3,capabilities:{vision:!1,tools:!1,reasoning:!1,streaming:!0}})):t(`ollama`)}catch{return t(`ollama`)}}async validate(){return this.name===`ollama`?this.validateOllama():this.mode===`byok`&&!this.config.apiKey?{valid:!1,error:`API key required for ${this.name}`}:this.mode===`managed`&&!this.config.proxyUrl&&!this.config.organizationId?{valid:!1,error:`Managed mode requires proxyUrl or organizationId`}:{valid:!0}}async validateOllama(){try{let e=this.config.baseUrl??`http://localhost:11434`,t=await fetch(`${e}/api/tags`);if(!t.ok)return{valid:!1,error:`Ollama server returned ${t.status}`};let n=(await t.json()).models??[];return n.some(e=>e.name===this.model)?{valid:!0}:{valid:!1,error:`Model "${this.model}" not found. Available: ${n.map(e=>e.name).join(`, `)}`}}catch(e){return{valid:!1,error:`Cannot connect to Ollama at ${this.config.baseUrl??`http://localhost:11434`}: ${e instanceof Error?e.message:String(e)}`}}}};function c(e){return new s(e)}function l(){let e=process.env.CONTRACTSPEC_AI_PROVIDER??`openai`,t=process.env.CONTRACTSPEC_AI_MODEL,n;switch(e){case`openai`:n=process.env.OPENAI_API_KEY;break;case`anthropic`:n=process.env.ANTHROPIC_API_KEY;break;case`mistral`:n=process.env.MISTRAL_API_KEY;break;case`gemini`:n=process.env.GOOGLE_API_KEY??process.env.GEMINI_API_KEY;break;case`ollama`:break}return c({provider:e,model:t,apiKey:n,baseUrl:process.env.OLLAMA_BASE_URL,proxyUrl:process.env.CONTRACTSPEC_AI_PROXY_URL,organizationId:process.env.CONTRACTSPEC_ORG_ID})}function u(){let e=[];e.push({provider:`ollama`,available:!0,mode:`local`});let t=process.env.OPENAI_API_KEY;e.push({provider:`openai`,available:!!t||!!process.env.CONTRACTSPEC_AI_PROXY_URL,mode:t?`byok`:`managed`,reason:t?void 0:`Set OPENAI_API_KEY for BYOK mode`});let n=process.env.ANTHROPIC_API_KEY;e.push({provider:`anthropic`,available:!!n||!!process.env.CONTRACTSPEC_AI_PROXY_URL,mode:n?`byok`:`managed`,reason:n?void 0:`Set ANTHROPIC_API_KEY for BYOK mode`});let r=process.env.MISTRAL_API_KEY;e.push({provider:`mistral`,available:!!r||!!process.env.CONTRACTSPEC_AI_PROXY_URL,mode:r?`byok`:`managed`,reason:r?void 0:`Set MISTRAL_API_KEY for BYOK mode`});let i=process.env.GOOGLE_API_KEY??process.env.GEMINI_API_KEY;return e.push({provider:`gemini`,available:!!i||!!process.env.CONTRACTSPEC_AI_PROXY_URL,mode:i?`byok`:`managed`,reason:i?void 0:`Set GOOGLE_API_KEY for BYOK mode`}),e}export{c,l,u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e,e as t,i as n,n as r,r as i,t as a}from"./models.js";import{c as o,l as s,u as c}from"./factory.js";import{a as l,i as u,n as d,r as f,t as p}from"./validation.js";import"./legacy.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as e}from"./models.js";import"./factory.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e={ollama:`llama3.2`,openai:`gpt-4o`,anthropic:`claude-sonnet-4-20250514`,mistral:`mistral-large-latest`,gemini:`gemini-2.0-flash`},t=[{id:`llama3.2`,name:`Llama 3.2`,provider:`ollama`,contextWindow:128e3,capabilities:{vision:!1,tools:!0,reasoning:!1,streaming:!0}},{id:`codellama`,name:`Code Llama`,provider:`ollama`,contextWindow:16e3,capabilities:{vision:!1,tools:!1,reasoning:!1,streaming:!0}},{id:`deepseek-coder`,name:`DeepSeek Coder`,provider:`ollama`,contextWindow:16e3,capabilities:{vision:!1,tools:!1,reasoning:!1,streaming:!0}},{id:`mistral`,name:`Mistral 7B`,provider:`ollama`,contextWindow:32e3,capabilities:{vision:!1,tools:!1,reasoning:!1,streaming:!0}},{id:`gpt-4o`,name:`GPT-4o`,provider:`openai`,contextWindow:128e3,capabilities:{vision:!0,tools:!0,reasoning:!1,streaming:!0},costPerMillion:{input:2.5,output:10}},{id:`gpt-4o-mini`,name:`GPT-4o Mini`,provider:`openai`,contextWindow:128e3,capabilities:{vision:!0,tools:!0,reasoning:!1,streaming:!0},costPerMillion:{input:.15,output:.6}},{id:`o1`,name:`o1`,provider:`openai`,contextWindow:2e5,capabilities:{vision:!0,tools:!0,reasoning:!0,streaming:!0},costPerMillion:{input:15,output:60}},{id:`o1-mini`,name:`o1 Mini`,provider:`openai`,contextWindow:128e3,capabilities:{vision:!1,tools:!0,reasoning:!0,streaming:!0},costPerMillion:{input:3,output:12}},{id:`claude-sonnet-4-20250514`,name:`Claude Sonnet 4`,provider:`anthropic`,contextWindow:2e5,capabilities:{vision:!0,tools:!0,reasoning:!0,streaming:!0},costPerMillion:{input:3,output:15}},{id:`claude-3-5-sonnet-20241022`,name:`Claude 3.5 Sonnet`,provider:`anthropic`,contextWindow:2e5,capabilities:{vision:!0,tools:!0,reasoning:!1,streaming:!0},costPerMillion:{input:3,output:15}},{id:`claude-3-5-haiku-20241022`,name:`Claude 3.5 Haiku`,provider:`anthropic`,contextWindow:2e5,capabilities:{vision:!0,tools:!0,reasoning:!1,streaming:!0},costPerMillion:{input:.8,output:4}},{id:`mistral-large-latest`,name:`Mistral Large`,provider:`mistral`,contextWindow:128e3,capabilities:{vision:!1,tools:!0,reasoning:!1,streaming:!0},costPerMillion:{input:2,output:6}},{id:`codestral-latest`,name:`Codestral`,provider:`mistral`,contextWindow:32e3,capabilities:{vision:!1,tools:!0,reasoning:!1,streaming:!0},costPerMillion:{input:.2,output:.6}},{id:`mistral-small-latest`,name:`Mistral Small`,provider:`mistral`,contextWindow:32e3,capabilities:{vision:!1,tools:!0,reasoning:!1,streaming:!0},costPerMillion:{input:.2,output:.6}},{id:`gemini-2.0-flash`,name:`Gemini 2.0 Flash`,provider:`gemini`,contextWindow:1e6,capabilities:{vision:!0,tools:!0,reasoning:!1,streaming:!0},costPerMillion:{input:.075,output:.3}},{id:`gemini-2.5-pro-preview-06-05`,name:`Gemini 2.5 Pro`,provider:`gemini`,contextWindow:1e6,capabilities:{vision:!0,tools:!0,reasoning:!0,streaming:!0},costPerMillion:{input:1.25,output:10}},{id:`gemini-2.5-flash-preview-05-20`,name:`Gemini 2.5 Flash`,provider:`gemini`,contextWindow:1e6,capabilities:{vision:!0,tools:!0,reasoning:!0,streaming:!0},costPerMillion:{input:.15,output:.6}}];function n(e){return t.filter(t=>t.provider===e)}function r(e){return t.find(t=>t.id===e)}function i(e){return n(e===`claude`?`anthropic`:e===`custom`?`openai`:e).map(e=>e.id)}function a(t){return e[t]}export{a,e,i,n,r,t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as e}from"./factory.js";async function t(t){return e(t).validate()}function n(e){switch(e){case`ollama`:return!0;case`openai`:return!!process.env.OPENAI_API_KEY;case`anthropic`:return!!process.env.ANTHROPIC_API_KEY;case`mistral`:return!!process.env.MISTRAL_API_KEY;case`gemini`:return!!(process.env.GOOGLE_API_KEY??process.env.GEMINI_API_KEY);default:return!1}}function r(e){switch(e){case`ollama`:return null;case`openai`:return`OPENAI_API_KEY`;case`anthropic`:return`ANTHROPIC_API_KEY`;case`mistral`:return`MISTRAL_API_KEY`;case`gemini`:return`GOOGLE_API_KEY`;default:return null}}async function i(e=`http://localhost:11434`){try{return(await fetch(`${e}/api/tags`)).ok}catch{return!1}}async function a(e=`http://localhost:11434`){try{let t=await fetch(`${e}/api/tags`);return t.ok?((await t.json()).models??[]).map(e=>e.name):[]}catch{return[]}}export{a,i,n,r,t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=(e,t)=>()=>(e&&(t=e(e=0)),t);export{e as __esmMin};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Button as e}from"../../ui-kit-web/dist/ui/button.js";import"react";import{Fragment as t,jsx as n,jsxs as r}from"react/jsx-runtime";import{Loader2 as i}from"lucide-react";function a({children:a,loading:o,spinnerPlacement:s=`start`,onPress:c,onPressIn:l,onPressOut:u,onLongPress:d,onTouchStart:f,onTouchEnd:p,onTouchCancel:m,onMouseDown:h,onMouseUp:g,onClick:_,className:v,disabled:y,...b}){let x=!!(y||o),S=b.asChild?a:r(t,{children:[o&&s===`start`?n(i,{className:`h-4 w-4 animate-spin`}):null,a,o&&s===`end`?n(i,{className:`h-4 w-4 animate-spin`}):null]});return n(e,{...b,className:v,disabled:x,"aria-busy":o?!0:void 0,"aria-disabled":x?!0:void 0,onPress:c||_,onClick:c||_,onMouseDown:h||l,onMouseUp:g||u,onTouchStart:f,onTouchEnd:p||u,onTouchCancel:m||u,type:b?.type??`button`,children:S})}export{a as Button$1};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{mapKeyboardToWeb as e}from"../../lib/keyboard.js";import{Textarea as t}from"../../ui-kit-web/dist/ui/textarea.js";import*as n from"react";import{jsx as r}from"react/jsx-runtime";function i({value:i,defaultValue:a,onChange:o,onSubmit:s,onFocus:c,onBlur:l,placeholder:u,disabled:d,readOnly:f,maxLength:p,name:m,className:h,rows:g,keyboard:_,...v}){let y=e(_),b=n.useCallback(e=>o?.(e),[o]),x=n.useCallback(e=>{e.key===`Enter`&&y.type!==`search`&&(e.metaKey||e.ctrlKey)&&s?.(e)},[s,y.type]);return r(t,{...v,className:h,value:i,defaultValue:a,onChange:b,onKeyDown:x,onFocus:c,onBlur:l,placeholder:u,disabled:d,readOnly:f,maxLength:p,name:m,rows:g,...y})}export{i as Textarea$1};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function e(e){if(e)switch(e){case`email`:return`email`;case`url`:return`url`;case`username`:return`username`;case`new-password`:return`new-password`;case`current-password`:return`password`;case`one-time-code`:return`otp`;case`tel`:case`tel-country-code`:case`tel-national`:case`tel-area-code`:case`tel-local`:case`tel-local-prefix`:case`tel-local-suffix`:case`tel-extension`:return`tel`;case`postal-code`:case`cc-number`:case`cc-csc`:case`bday-day`:case`bday-month`:case`bday-year`:return`int`;case`cc-exp`:case`cc-exp-month`:case`cc-exp-year`:return`numbers-and-punctuation`;case`bday`:return`date`;default:return`text`}}function t(e,t){t&&([`name`,`given-name`,`additional-name`,`family-name`,`honorific-prefix`,`honorific-suffix`,`nickname`,`organization`,`organization-title`,`cc-name`,`cc-given-name`,`cc-additional-name`,`cc-family-name`].includes(t)&&(e.autoCapitalize=`words`),[`username`,`new-password`,`current-password`,`one-time-code`,`email`,`url`].includes(t)&&(e.autoCapitalize=`none`))}function n(n){let r=n?.kind??e(n?.autoComplete)??`text`,i={};switch(r){case`password`:i.type=`password`,i.autoCapitalize=`none`,i.autoComplete=n?.autoComplete??`current-password`,n?.autoCorrect!=null&&(i.autoCorrect=n.autoCorrect);break;case`new-password`:i.type=`password`,i.autoCapitalize=`none`,i.autoComplete=n?.autoComplete??`new-password`,n?.autoCorrect!=null&&(i.autoCorrect=n.autoCorrect);break;case`username`:i.type=`text`,i.autoCapitalize=`none`,i.autoComplete=n?.autoComplete??`username`;break;case`email`:i.type=`email`,i.inputMode=`email`,i.autoCapitalize=`none`,i.autoComplete=n?.autoComplete??`email`;break;case`url`:i.type=`url`,i.inputMode=`url`,i.autoComplete=n?.autoComplete??`url`;break;case`search`:i.type=`search`,i.inputMode=`search`,i.enterKeyHint=n?.enterKeyHint??`search`,i.autoComplete=n?.autoComplete??`off`;break;case`phone`:case`tel`:i.type=`tel`,i.inputMode=`tel`,i.autoComplete=n?.autoComplete??`tel`;break;case`number`:case`int`:i.type=`text`,i.inputMode=`numeric`,i.pattern=`[0-9]*`;break;case`decimal`:i.type=`text`,i.inputMode=`decimal`,i.step=`any`;break;case`numbers-and-punctuation`:i.type=`text`,i.inputMode=`text`,i.pattern=`[0-9.,-]*`;break;case`otp`:i.type=`text`,i.inputMode=`numeric`,i.autoComplete=n?.autoComplete??`one-time-code`,i.autoCapitalize=`none`;break;case`name`:i.type=`text`,i.autoComplete=n?.autoComplete??`name`,i.autoCapitalize=n?.autoCapitalize??`words`;break;case`given-name`:i.type=`text`,i.autoComplete=n?.autoComplete??`given-name`,i.autoCapitalize=n?.autoCapitalize??`words`;break;case`family-name`:i.type=`text`,i.autoComplete=n?.autoComplete??`family-name`,i.autoCapitalize=n?.autoCapitalize??`words`;break;case`address-line1`:i.type=`text`,i.autoComplete=n?.autoComplete??`address-line1`;break;case`address-line2`:i.type=`text`,i.autoComplete=n?.autoComplete??`address-line2`;break;case`postal-code`:i.type=`text`,i.inputMode=`numeric`,i.pattern=`[0-9]*`,i.autoComplete=n?.autoComplete??`postal-code`;break;case`cc-number`:i.type=`text`,i.inputMode=`numeric`,i.pattern=`[0-9]*`,i.autoComplete=n?.autoComplete??`cc-number`;break;case`cc-exp`:i.type=`text`,i.inputMode=`numeric`,i.pattern=`[0-9/]*`,i.autoComplete=n?.autoComplete??`cc-exp`;break;case`cc-csc`:i.type=`text`,i.inputMode=`numeric`,i.pattern=`[0-9]*`,i.autoComplete=n?.autoComplete??`cc-csc`;break;case`off`:i.type=`text`,i.autoComplete=`off`;break;case`date`:i.type=`date`,i.inputMode=`date`,i.pattern=`[0-9./-]*`;break;default:i.type=`text`;break}return n?.autoCapitalize&&(i.autoCapitalize=n.autoCapitalize),n?.autoComplete&&(i.autoComplete=n.autoComplete),n?.autoCorrect!=null&&(i.autoCorrect=n.autoCorrect),n?.enterKeyHint&&(i.enterKeyHint=n.enterKeyHint),t(i,n?.autoComplete),i}export{n as mapKeyboardToWeb};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cn as e,init_utils as t}from"../ui-kit-core/dist/utils.js";import*as n from"react";import{jsx as r}from"react/jsx-runtime";import{cva as i}from"class-variance-authority";import{Slot as a}from"@radix-ui/react-slot";t();const o=i(`inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-hidden focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive`,{variants:{variant:{default:`bg-primary text-primary-foreground hover:bg-primary/90`,destructive:`bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60`,outline:`border bg-background shadow-2xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50`,secondary:`bg-secondary text-secondary-foreground hover:bg-secondary/80`,ghost:`hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50`,link:`text-primary underline-offset-4 hover:underline`},size:{default:`h-9 px-4 py-2 has-[>svg]:px-3`,sm:`h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5`,lg:`h-10 rounded-md px-6 has-[>svg]:px-4`,icon:`size-9`}},defaultVariants:{variant:`default`,size:`default`}}),s=n.forwardRef(({className:t,variant:n,size:i,asChild:s=!1,...c},l)=>s?r(a,{"data-slot":`button`,className:e(o({variant:n,size:i,className:t})),...c}):r(`button`,{ref:l,"data-slot":`button`,className:e(o({variant:n,size:i,className:t})),...c}));s.displayName=`Button`;export{s as Button};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cn as e,init_utils as t}from"../ui-kit-core/dist/utils.js";import"react";import{jsx as n}from"react/jsx-runtime";t();function r({className:t,...r}){return n(`textarea`,{"data-slot":`textarea`,className:e(`aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-2xs outline-hidden transition-[color,box-shadow] focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm`,t),...r})}export{r as Textarea};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{__esmMin as e}from"../../../../_virtual/rolldown_runtime.js";import{clsx as t}from"clsx";import{twMerge as n}from"tailwind-merge";function r(...e){return n(t(e))}var i=e((()=>{}));i();export{r as cn,i as init_utils};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{cn as e}from"./utils.js";import"react";import{jsx as t}from"react/jsx-runtime";import*as n from"@radix-ui/react-avatar";function r({className:r,...i}){return t(n.Root,{"data-slot":`avatar`,className:e(`relative flex size-8 shrink-0 overflow-hidden rounded-full`,r),...i})}function i({className:r,...i}){return t(n.Fallback,{"data-slot":`avatar-fallback`,className:e(`bg-muted flex size-full items-center justify-center rounded-full`,r),...i})}export{r as Avatar,i as AvatarFallback};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cn as e}from"../ui-kit-core/dist/utils.js";import"react";import{jsx as t}from"react/jsx-runtime";import{cva as n}from"class-variance-authority";import{Slot as r}from"@radix-ui/react-slot";const i=n(`inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden`,{variants:{variant:{default:`border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90`,secondary:`border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90`,destructive:`border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60`,outline:`text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground`}},defaultVariants:{variant:`default`}});function a({className:n,variant:a,asChild:o=!1,...s}){return t(o?r:`span`,{"data-slot":`badge`,className:e(i({variant:a}),n),...s})}export{a as Badge};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{cn as e}from"../ui-kit-core/dist/utils.js";import"react";import{jsx as t,jsxs as n}from"react/jsx-runtime";import*as r from"@radix-ui/react-scroll-area";function i({className:i,children:o,...s}){return n(r.Root,{"data-slot":`scroll-area`,className:e(`relative`,i),...s,children:[t(r.Viewport,{"data-slot":`scroll-area-viewport`,className:`focus-visible:ring-ring/50 size-full rounded-[inherit] outline-hidden transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1`,children:o}),t(a,{}),t(r.Corner,{})]})}function a({className:n,orientation:i=`vertical`,...a}){return t(r.ScrollAreaScrollbar,{"data-slot":`scroll-area-scrollbar`,orientation:i,className:e(`flex touch-none p-px transition-colors select-none`,i===`vertical`&&`h-full w-2.5 border-l border-l-transparent`,i===`horizontal`&&`h-2.5 flex-col border-t border-t-transparent`,n),...a,children:t(r.ScrollAreaThumb,{"data-slot":`scroll-area-thumb`,className:`bg-border relative flex-1 rounded-full`})})}export{i as ScrollArea};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{cn as e}from"../ui-kit-core/dist/utils.js";import"react";import{jsx as t,jsxs as n}from"react/jsx-runtime";import{CheckIcon as r,ChevronDownIcon as i,ChevronUpIcon as a}from"lucide-react";import*as o from"@radix-ui/react-select";function s({...e}){return t(o.Root,{"data-slot":`select`,...e})}function c({...e}){return t(o.Value,{"data-slot":`select-value`,...e})}function l({className:r,size:a=`default`,children:s,...c}){return n(o.Trigger,{"data-slot":`select-trigger`,"data-size":a,className:e(`aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive border-input focus-visible:border-ring focus-visible:ring-ring/50 data-placeholder:text-muted-foreground dark:bg-input/30 dark:hover:bg-input/50 [&_svg:not([class*='text-'])]:text-muted-foreground flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-2xs outline-hidden transition-[color,box-shadow] focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,r),...c,children:[s,t(o.Icon,{asChild:!0,children:t(i,{className:`size-4 opacity-50`})})]})}function u({className:r,children:i,position:a=`popper`,...s}){return t(o.Portal,{children:n(o.Content,{"data-slot":`select-content`,className:e(`bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-32 origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md`,a===`popper`&&`data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1`,r),position:a,...s,children:[t(f,{}),t(o.Viewport,{className:e(`p-1`,a===`popper`&&`h-(--radix-select-trigger-height) w-full min-w-(--radix-select-trigger-width) scroll-my-1`),children:i}),t(p,{})]})})}function d({className:i,children:a,...s}){return n(o.Item,{"data-slot":`select-item`,className:e(`focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-xs py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2`,i),...s,children:[t(`span`,{className:`absolute right-2 flex size-3.5 items-center justify-center`,children:t(o.ItemIndicator,{children:t(r,{className:`size-4`})})}),t(o.ItemText,{children:a})]})}function f({className:n,...r}){return t(o.ScrollUpButton,{"data-slot":`select-scroll-up-button`,className:e(`flex cursor-default items-center justify-center py-1`,n),...r,children:t(a,{className:`size-4`})})}function p({className:n,...r}){return t(o.ScrollDownButton,{"data-slot":`select-scroll-down-button`,className:e(`flex cursor-default items-center justify-center py-1`,n),...r,children:t(i,{className:`size-4`})})}export{s as Select,u as SelectContent,d as SelectItem,l as SelectTrigger,c as SelectValue};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cn as e}from"./utils.js";import{jsx as t}from"react/jsx-runtime";function n({className:n,...r}){return t(`div`,{"data-slot":`skeleton`,className:e(`bg-accent animate-pulse rounded-md`,n),...r})}export{n as Skeleton};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{cn as e}from"../ui-kit-core/dist/utils.js";import"react";import{jsx as t,jsxs as n}from"react/jsx-runtime";import*as r from"@radix-ui/react-tooltip";function i({delayDuration:e=0,...n}){return t(r.Provider,{"data-slot":`tooltip-provider`,delayDuration:e,...n})}function a({...e}){return t(i,{children:t(r.Root,{"data-slot":`tooltip`,...e})})}function o({...e}){return t(r.Trigger,{"data-slot":`tooltip-trigger`,...e})}function s({className:i,sideOffset:a=0,children:o,...s}){return t(r.Portal,{children:n(r.Content,{"data-slot":`tooltip-content`,sideOffset:a,className:e(`bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance`,i),...s,children:[o,t(r.Arrow,{className:`bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px]`})]})})}export{a as Tooltip,s as TooltipContent,i as TooltipProvider,o as TooltipTrigger};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{clsx as e}from"clsx";import{twMerge as t}from"tailwind-merge";function n(...n){return t(e(n))}export{n as cn};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{clsx as e}from"clsx";import{twMerge as t}from"tailwind-merge";function n(...n){return t(e(n))}export{n as cn};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import
|
|
1
|
+
"use client";import{ScrollArea as e}from"../../libs/ui-kit-web/dist/ui/scroll-area.js";import{cn as t}from"../../libs/ui-kit-web/dist/ui/utils.js";import*as n from"react";import{jsx as r,jsxs as i}from"react/jsx-runtime";function a({children:a,className:o,showScrollButton:s=!0}){let c=n.useRef(null),[l,u]=n.useState(!1);n.useEffect(()=>{let e=c.current;e&&e.scrollHeight-e.scrollTop<=e.clientHeight+100&&(e.scrollTop=e.scrollHeight)},[a]);let d=n.useCallback(e=>{let t=e.currentTarget;u(!(t.scrollHeight-t.scrollTop<=t.clientHeight+100))},[]),f=n.useCallback(()=>{let e=c.current;e&&e.scrollTo({top:e.scrollHeight,behavior:`smooth`})},[]);return i(`div`,{className:t(`relative flex flex-1 flex-col`,o),children:[r(e,{ref:c,className:`flex-1`,onScroll:d,children:r(`div`,{className:`flex flex-col gap-4 p-4`,children:a})}),s&&l&&i(`button`,{onClick:f,className:t(`absolute bottom-4 left-1/2 -translate-x-1/2`,`bg-primary text-primary-foreground`,`rounded-full px-3 py-1.5 text-sm font-medium shadow-lg`,`hover:bg-primary/90 transition-colors`,`flex items-center gap-1.5`),"aria-label":`Scroll to bottom`,children:[r(`svg`,{xmlns:`http://www.w3.org/2000/svg`,width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:r(`path`,{d:`m6 9 6 6 6-6`})}),`New messages`]})]})}export{a as ChatContainer};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ChatAttachment } from "../../core/message-types.js";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react_jsx_runtime3 from "react/jsx-runtime";
|
|
3
3
|
|
|
4
4
|
//#region src/presentation/components/ChatInput.d.ts
|
|
5
5
|
interface ChatInputProps {
|
|
@@ -29,6 +29,6 @@ declare function ChatInput({
|
|
|
29
29
|
className,
|
|
30
30
|
showAttachments,
|
|
31
31
|
maxAttachments
|
|
32
|
-
}: ChatInputProps):
|
|
32
|
+
}: ChatInputProps): react_jsx_runtime3.JSX.Element;
|
|
33
33
|
//#endregion
|
|
34
34
|
export { ChatInput };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import
|
|
1
|
+
"use client";import{cn as e}from"../../libs/ui-kit-web/dist/ui/utils.js";import{Button$1 as t}from"../../libs/design-system/dist/components/atoms/Button.js";import{Textarea$1 as n}from"../../libs/design-system/dist/components/atoms/Textarea.js";import*as r from"react";import{Fragment as i,jsx as a,jsxs as o}from"react/jsx-runtime";import{Code as s,FileText as c,Loader2 as l,Paperclip as u,Send as d,X as f}from"lucide-react";function p({onSend:p,disabled:m=!1,isLoading:h=!1,placeholder:g=`Type a message...`,className:_,showAttachments:v=!0,maxAttachments:y=5}){let[b,x]=r.useState(``),[S,C]=r.useState([]),w=r.useRef(null),T=r.useRef(null),E=b.trim().length>0||S.length>0,D=r.useCallback(e=>{e?.preventDefault(),!(!E||m||h)&&(p(b.trim(),S.length>0?S:void 0),x(``),C([]),w.current?.focus())},[E,b,S,m,h,p]),O=r.useCallback(e=>{e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),D())},[D]),k=r.useCallback(async e=>{let t=e.target.files;if(!t)return;let n=[];for(let e of Array.from(t)){if(S.length+n.length>=y)break;let t=await e.text(),r=e.name.split(`.`).pop()?.toLowerCase()??``,i=[`ts`,`tsx`,`js`,`jsx`,`py`,`go`,`rs`,`java`].includes(r);n.push({id:`att_${Date.now()}_${Math.random().toString(36).slice(2,9)}`,type:i?`code`:`file`,name:e.name,content:t,mimeType:e.type,size:e.size})}C(e=>[...e,...n]),e.target.value=``},[S.length,y]),A=r.useCallback(e=>{C(t=>t.filter(t=>t.id!==e))},[]);return o(`div`,{className:e(`flex flex-col gap-2`,_),children:[S.length>0&&a(`div`,{className:`flex flex-wrap gap-2`,children:S.map(t=>o(`div`,{className:e(`flex items-center gap-1.5 rounded-md px-2 py-1`,`bg-muted text-muted-foreground text-sm`),children:[t.type===`code`?a(s,{className:`h-3.5 w-3.5`}):a(c,{className:`h-3.5 w-3.5`}),a(`span`,{className:`max-w-[150px] truncate`,children:t.name}),a(`button`,{type:`button`,onClick:()=>A(t.id),className:`hover:text-foreground`,"aria-label":`Remove ${t.name}`,children:a(f,{className:`h-3.5 w-3.5`})})]},t.id))}),o(`form`,{onSubmit:D,className:`flex items-end gap-2`,children:[v&&o(i,{children:[a(`input`,{ref:T,type:`file`,multiple:!0,accept:`.ts,.tsx,.js,.jsx,.json,.md,.txt,.py,.go,.rs,.java,.yaml,.yml`,onChange:k,className:`hidden`,"aria-label":`Attach files`}),a(t,{type:`button`,variant:`ghost`,size:`sm`,onPress:()=>T.current?.click(),disabled:m||S.length>=y,"aria-label":`Attach files`,children:a(u,{className:`h-4 w-4`})})]}),a(`div`,{className:`relative flex-1`,children:a(n,{value:b,onChange:e=>x(e.target.value),onKeyDown:O,placeholder:g,disabled:m,className:e(`min-h-[44px] max-h-[200px] resize-none pr-12`,`focus-visible:ring-1`),rows:1,"aria-label":`Chat message`})}),a(t,{type:`submit`,disabled:!E||m||h,size:`sm`,"aria-label":h?`Sending...`:`Send message`,children:h?a(l,{className:`h-4 w-4 animate-spin`}):a(d,{className:`h-4 w-4`})})]}),a(`p`,{className:`text-muted-foreground text-xs`,children:`Press Enter to send, Shift+Enter for new line`})]})}export{p as ChatInput};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ChatMessage } from "../../core/message-types.js";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
3
3
|
|
|
4
4
|
//#region src/presentation/components/ChatMessage.d.ts
|
|
5
5
|
interface ChatMessageProps {
|
|
@@ -18,6 +18,6 @@ declare function ChatMessage$1({
|
|
|
18
18
|
className,
|
|
19
19
|
showCopy,
|
|
20
20
|
showAvatar
|
|
21
|
-
}: ChatMessageProps):
|
|
21
|
+
}: ChatMessageProps): react_jsx_runtime0.JSX.Element;
|
|
22
22
|
//#endregion
|
|
23
23
|
export { ChatMessage$1 as ChatMessage };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{
|
|
1
|
+
"use client";import{cn as e}from"../../libs/ui-kit-web/dist/ui/utils.js";import{Avatar as t,AvatarFallback as n}from"../../libs/ui-kit-web/dist/ui/avatar.js";import{Skeleton as r}from"../../libs/ui-kit-web/dist/ui/skeleton.js";import{Button$1 as i}from"../../libs/design-system/dist/components/atoms/Button.js";import{CodePreview as a}from"./CodePreview.js";import*as o from"react";import{Fragment as s,jsx as c,jsxs as l}from"react/jsx-runtime";import{AlertCircle as u,Bot as d,Check as f,Copy as p,User as m}from"lucide-react";function h(e){let t=/```(\w+)?\n([\s\S]*?)```/g,n=[],r;for(;(r=t.exec(e))!==null;)n.push({language:r[1]??`text`,code:r[2]??``,raw:r[0]});return n}function g({content:e}){let t=h(e);if(t.length===0)return c(`p`,{className:`whitespace-pre-wrap`,children:e});let n=e,r=[],i=0;for(let e of t){let[t,o]=n.split(e.raw);t&&r.push(c(`p`,{className:`whitespace-pre-wrap`,children:t.trim()},i++)),r.push(c(a,{code:e.code,language:e.language,className:`my-2`},i++)),n=o??``}return n.trim()&&r.push(c(`p`,{className:`whitespace-pre-wrap`,children:n.trim()},i++)),c(s,{children:r})}function _({message:a,className:s,showCopy:h=!0,showAvatar:_=!0}){let[v,y]=o.useState(!1),b=a.role===`user`,x=a.status===`error`,S=a.status===`streaming`,C=o.useCallback(async()=>{await navigator.clipboard.writeText(a.content),y(!0),setTimeout(()=>y(!1),2e3)},[a.content]);return l(`div`,{className:e(`group flex gap-3`,b&&`flex-row-reverse`,s),children:[_&&c(t,{className:`h-8 w-8 shrink-0`,children:c(n,{className:e(b?`bg-primary text-primary-foreground`:`bg-muted`),children:c(b?m:d,{className:`h-4 w-4`})})}),l(`div`,{className:e(`flex max-w-[80%] flex-col gap-1`,b&&`items-end`),children:[c(`div`,{className:e(`rounded-2xl px-4 py-2`,b?`bg-primary text-primary-foreground`:`bg-muted text-foreground`,x&&`border-destructive bg-destructive/10 border`),children:x&&a.error?l(`div`,{className:`flex items-start gap-2`,children:[c(u,{className:`text-destructive mt-0.5 h-4 w-4 shrink-0`}),l(`div`,{children:[c(`p`,{className:`text-destructive font-medium`,children:a.error.code}),c(`p`,{className:`text-muted-foreground text-sm`,children:a.error.message})]})]}):S&&!a.content?l(`div`,{className:`flex flex-col gap-2`,children:[c(r,{className:`h-4 w-48`}),c(r,{className:`h-4 w-32`})]}):c(g,{content:a.content})}),l(`div`,{className:e(`flex items-center gap-2 text-xs`,`text-muted-foreground opacity-0 transition-opacity`,`group-hover:opacity-100`),children:[c(`span`,{children:new Date(a.createdAt).toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`})}),a.usage&&l(`span`,{children:[a.usage.inputTokens+a.usage.outputTokens,` tokens`]}),h&&!b&&a.content&&c(i,{variant:`ghost`,size:`sm`,className:`h-6 w-6 p-0`,onPress:C,"aria-label":v?`Copied`:`Copy message`,children:c(v?f:p,{className:`h-3 w-3`})})]}),a.reasoning&&l(`details`,{className:`text-muted-foreground mt-2 text-sm`,children:[c(`summary`,{className:`cursor-pointer hover:underline`,children:`View reasoning`}),c(`div`,{className:`bg-muted mt-1 rounded-md p-2`,children:c(`p`,{className:`whitespace-pre-wrap`,children:a.reasoning})})]})]})]})}export{_ as ChatMessage};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as react_jsx_runtime4 from "react/jsx-runtime";
|
|
2
2
|
|
|
3
3
|
//#region src/presentation/components/CodePreview.d.ts
|
|
4
4
|
interface CodePreviewProps {
|
|
@@ -34,6 +34,6 @@ declare function CodePreview({
|
|
|
34
34
|
onExecute,
|
|
35
35
|
showDownload,
|
|
36
36
|
maxHeight
|
|
37
|
-
}: CodePreviewProps):
|
|
37
|
+
}: CodePreviewProps): react_jsx_runtime4.JSX.Element;
|
|
38
38
|
//#endregion
|
|
39
39
|
export { CodePreview };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import
|
|
2
|
-
`),C=
|
|
1
|
+
"use client";import{cn as e}from"../../libs/ui-kit-web/dist/ui/utils.js";import{Button$1 as t}from"../../libs/design-system/dist/components/atoms/Button.js";import*as n from"react";import{jsx as r,jsxs as i}from"react/jsx-runtime";import{Check as a,Copy as o,Download as s,Play as c}from"lucide-react";const l={ts:`TypeScript`,tsx:`TypeScript (React)`,typescript:`TypeScript`,js:`JavaScript`,jsx:`JavaScript (React)`,javascript:`JavaScript`,json:`JSON`,md:`Markdown`,yaml:`YAML`,yml:`YAML`,bash:`Bash`,sh:`Shell`,sql:`SQL`,py:`Python`,python:`Python`,go:`Go`,rust:`Rust`,rs:`Rust`};function u({code:u,language:d=`text`,filename:f,className:p,showCopy:m=!0,showExecute:h=!1,onExecute:g,showDownload:_=!1,maxHeight:v=400}){let[y,b]=n.useState(!1),x=l[d.toLowerCase()]??d,S=u.split(`
|
|
2
|
+
`),C=n.useCallback(async()=>{await navigator.clipboard.writeText(u),b(!0),setTimeout(()=>b(!1),2e3)},[u]),w=n.useCallback(()=>{let e=new Blob([u],{type:`text/plain`}),t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=f??`code.${d}`,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(t)},[u,f,d]);return i(`div`,{className:e(`overflow-hidden rounded-lg border`,`bg-muted/50`,p),children:[i(`div`,{className:e(`flex items-center justify-between px-3 py-1.5`,`border-b bg-muted/80`),children:[i(`div`,{className:`flex items-center gap-2 text-sm`,children:[f&&r(`span`,{className:`text-foreground font-mono`,children:f}),r(`span`,{className:`text-muted-foreground`,children:x})]}),i(`div`,{className:`flex items-center gap-1`,children:[h&&g&&r(t,{variant:`ghost`,size:`sm`,onPress:()=>g(u),className:`h-7 w-7 p-0`,"aria-label":`Execute code`,children:r(c,{className:`h-3.5 w-3.5`})}),_&&r(t,{variant:`ghost`,size:`sm`,onPress:w,className:`h-7 w-7 p-0`,"aria-label":`Download code`,children:r(s,{className:`h-3.5 w-3.5`})}),m&&r(t,{variant:`ghost`,size:`sm`,onPress:C,className:`h-7 w-7 p-0`,"aria-label":y?`Copied`:`Copy code`,children:y?r(a,{className:`h-3.5 w-3.5 text-green-500`}):r(o,{className:`h-3.5 w-3.5`})})]})]}),r(`div`,{className:`overflow-auto`,style:{maxHeight:v},children:r(`pre`,{className:`p-3`,children:r(`code`,{className:`text-sm`,children:S.map((e,t)=>i(`div`,{className:`flex`,children:[r(`span`,{className:`text-muted-foreground mr-4 select-none text-right w-8`,children:t+1}),r(`span`,{className:`flex-1`,children:e||` `})]},t))})})})]})}export{u as CodePreview};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { WorkspaceSummary } from "../../context/workspace-context.js";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react_jsx_runtime1 from "react/jsx-runtime";
|
|
3
3
|
|
|
4
4
|
//#region src/presentation/components/ContextIndicator.d.ts
|
|
5
5
|
interface ContextIndicatorProps {
|
|
@@ -20,6 +20,6 @@ declare function ContextIndicator({
|
|
|
20
20
|
active,
|
|
21
21
|
className,
|
|
22
22
|
showDetails
|
|
23
|
-
}: ContextIndicatorProps):
|
|
23
|
+
}: ContextIndicatorProps): react_jsx_runtime1.JSX.Element;
|
|
24
24
|
//#endregion
|
|
25
25
|
export { ContextIndicator };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import
|
|
1
|
+
"use client";import{cn as e}from"../../libs/ui-kit-web/dist/ui/utils.js";import{Badge as t}from"../../libs/ui-kit-web/dist/ui/badge.js";import{Tooltip as n,TooltipContent as r,TooltipProvider as i,TooltipTrigger as a}from"../../libs/ui-kit-web/dist/ui/tooltip.js";import"react";import{Fragment as o,jsx as s,jsxs as c}from"react/jsx-runtime";import{FileCode as l,FolderOpen as u,Info as d,Zap as f}from"lucide-react";function p({summary:p,active:m=!1,className:h,showDetails:g=!0}){if(!p&&!m)return c(`div`,{className:e(`flex items-center gap-1.5 text-sm`,`text-muted-foreground`,h),children:[s(d,{className:`h-4 w-4`}),s(`span`,{children:`No workspace context`})]});let _=c(`div`,{className:e(`flex items-center gap-2`,m?`text-foreground`:`text-muted-foreground`,h),children:[c(t,{variant:m?`default`:`secondary`,className:`flex items-center gap-1`,children:[s(f,{className:`h-3 w-3`}),`Context`]}),p&&g&&c(o,{children:[c(`div`,{className:`flex items-center gap-1 text-xs`,children:[s(u,{className:`h-3.5 w-3.5`}),s(`span`,{children:p.name})]}),c(`div`,{className:`flex items-center gap-1 text-xs`,children:[s(l,{className:`h-3.5 w-3.5`}),c(`span`,{children:[p.specs.total,` specs`]})]})]})]});return p?s(i,{children:c(n,{children:[s(a,{asChild:!0,children:_}),s(r,{side:`bottom`,className:`max-w-[300px]`,children:c(`div`,{className:`flex flex-col gap-2 text-sm`,children:[s(`div`,{className:`font-medium`,children:p.name}),s(`div`,{className:`text-muted-foreground text-xs`,children:p.path}),s(`div`,{className:`border-t pt-2`,children:c(`div`,{className:`grid grid-cols-2 gap-1 text-xs`,children:[s(`span`,{children:`Commands:`}),s(`span`,{className:`text-right`,children:p.specs.commands}),s(`span`,{children:`Queries:`}),s(`span`,{className:`text-right`,children:p.specs.queries}),s(`span`,{children:`Events:`}),s(`span`,{className:`text-right`,children:p.specs.events}),s(`span`,{children:`Presentations:`}),s(`span`,{className:`text-right`,children:p.specs.presentations})]})}),c(`div`,{className:`border-t pt-2 text-xs`,children:[c(`span`,{children:[p.files.total,` files`]}),s(`span`,{className:`mx-1`,children:`•`}),c(`span`,{children:[p.files.specFiles,` spec files`]})]})]})})]})}):_}export{p as ContextIndicator};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import * as react_jsx_runtime2 from "react/jsx-runtime";
|
|
1
2
|
import { ProviderMode, ProviderName } from "@lssm/lib.ai-providers";
|
|
2
|
-
import * as react_jsx_runtime3 from "react/jsx-runtime";
|
|
3
3
|
|
|
4
4
|
//#region src/presentation/components/ModelPicker.d.ts
|
|
5
5
|
interface ModelSelection {
|
|
@@ -33,6 +33,6 @@ declare function ModelPicker({
|
|
|
33
33
|
availableProviders,
|
|
34
34
|
className,
|
|
35
35
|
compact
|
|
36
|
-
}: ModelPickerProps):
|
|
36
|
+
}: ModelPickerProps): react_jsx_runtime2.JSX.Element;
|
|
37
37
|
//#endregion
|
|
38
38
|
export { ModelPicker };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{
|
|
1
|
+
"use client";import{n as e}from"../../libs/ai-providers/dist/models.js";import"../../libs/ai-providers/dist/index.js";import{cn as t}from"../../libs/ui-kit-web/dist/ui/utils.js";import{Button$1 as n}from"../../libs/design-system/dist/components/atoms/Button.js";import{Select as r,SelectContent as i,SelectItem as a,SelectTrigger as o,SelectValue as s}from"../../libs/ui-kit-web/dist/ui/select.js";import{Badge as c}from"../../libs/ui-kit-web/dist/ui/badge.js";import*as l from"react";import{jsx as u,jsxs as d}from"react/jsx-runtime";import{Bot as f,Cloud as p,Cpu as m,Sparkles as h}from"lucide-react";const g={ollama:u(m,{className:`h-4 w-4`}),openai:u(f,{className:`h-4 w-4`}),anthropic:u(h,{className:`h-4 w-4`}),mistral:u(p,{className:`h-4 w-4`}),gemini:u(h,{className:`h-4 w-4`})},_={ollama:`Ollama (Local)`,openai:`OpenAI`,anthropic:`Anthropic`,mistral:`Mistral`,gemini:`Google Gemini`},v={local:{label:`Local`,variant:`secondary`},byok:{label:`BYOK`,variant:`outline`},managed:{label:`Managed`,variant:`default`}};function y({value:f,onChange:p,availableProviders:m,className:h,compact:y=!1}){let b=m??[{provider:`ollama`,available:!0,mode:`local`},{provider:`openai`,available:!0,mode:`byok`},{provider:`anthropic`,available:!0,mode:`byok`},{provider:`mistral`,available:!0,mode:`byok`},{provider:`gemini`,available:!0,mode:`byok`}],x=e(f.provider),S=x.find(e=>e.id===f.model),C=l.useCallback(t=>{let n=t,r=b.find(e=>e.provider===n);p({provider:n,model:e(n)[0]?.id??``,mode:r?.mode??`byok`})},[p,b]),w=l.useCallback(e=>{p({...f,model:e})},[p,f]);return y?d(`div`,{className:t(`flex items-center gap-2`,h),children:[d(r,{value:f.provider,onValueChange:C,children:[u(o,{className:`w-[140px]`,children:u(s,{})}),u(i,{children:b.map(e=>u(a,{value:e.provider,disabled:!e.available,children:d(`div`,{className:`flex items-center gap-2`,children:[g[e.provider],u(`span`,{children:_[e.provider]})]})},e.provider))})]}),d(r,{value:f.model,onValueChange:w,children:[u(o,{className:`w-[160px]`,children:u(s,{})}),u(i,{children:x.map(e=>u(a,{value:e.id,children:e.name},e.id))})]})]}):d(`div`,{className:t(`flex flex-col gap-3`,h),children:[d(`div`,{className:`flex flex-col gap-1.5`,children:[u(`label`,{className:`text-sm font-medium`,children:`Provider`}),u(`div`,{className:`flex flex-wrap gap-2`,children:b.map(e=>d(n,{variant:f.provider===e.provider?`default`:`outline`,size:`sm`,onPress:()=>e.available&&C(e.provider),disabled:!e.available,className:t(!e.available&&`opacity-50`),children:[g[e.provider],u(`span`,{children:_[e.provider]}),u(c,{variant:v[e.mode].variant,className:`ml-1`,children:v[e.mode].label})]},e.provider))})]}),d(`div`,{className:`flex flex-col gap-1.5`,children:[u(`label`,{className:`text-sm font-medium`,children:`Model`}),d(r,{value:f.model,onValueChange:w,children:[u(o,{children:u(s,{placeholder:`Select a model`})}),u(i,{children:x.map(e=>u(a,{value:e.id,children:d(`div`,{className:`flex items-center gap-2`,children:[u(`span`,{children:e.name}),d(`span`,{className:`text-muted-foreground text-xs`,children:[Math.round(e.contextWindow/1e3),`K`]}),e.capabilities.vision&&u(c,{variant:`outline`,className:`text-xs`,children:`Vision`}),e.capabilities.reasoning&&u(c,{variant:`outline`,className:`text-xs`,children:`Reasoning`})]})},e.id))})]})]}),S&&d(`div`,{className:`text-muted-foreground flex flex-wrap gap-2 text-xs`,children:[d(`span`,{children:[`Context: `,Math.round(S.contextWindow/1e3),`K tokens`]}),S.capabilities.vision&&u(`span`,{children:`• Vision`}),S.capabilities.tools&&u(`span`,{children:`• Tools`}),S.capabilities.reasoning&&u(`span`,{children:`• Reasoning`})]})]})}export{y as ModelPicker};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{ChatService as e}from"../../core/chat-service.js";import{
|
|
1
|
+
"use client";import{ChatService as e}from"../../core/chat-service.js";import{c as t}from"../../libs/ai-providers/dist/factory.js";import"../../libs/ai-providers/dist/index.js";import*as n from"react";function r(r={}){let{provider:i=`openai`,mode:a=`byok`,model:o,apiKey:s,proxyUrl:c,conversationId:l,systemPrompt:u,streaming:d=!0,onSend:f,onResponse:p,onError:m,onUsage:h}=r,[g,_]=n.useState([]),[v,y]=n.useState(null),[b,x]=n.useState(!1),[S,C]=n.useState(null),[w,T]=n.useState(l??null),E=n.useRef(null),D=n.useRef(null);n.useEffect(()=>{D.current=new e({provider:t({provider:i,model:o,apiKey:s,proxyUrl:c}),systemPrompt:u,onUsage:h})},[i,a,o,s,c,u,h]),n.useEffect(()=>{!w||!D.current||(async()=>{let e=await D.current.getConversation(w);e&&(y(e),_(e.messages))})().catch(console.error)},[w]);let O=n.useCallback(async(e,t)=>{if(!D.current)throw Error(`Chat service not initialized`);x(!0),C(null),E.current=new AbortController;try{let n={id:`msg_${Date.now()}`,conversationId:w??``,role:`user`,content:e,status:`completed`,createdAt:new Date,updatedAt:new Date,attachments:t};if(_(e=>[...e,n]),f?.(n),d){let n=await D.current.stream({conversationId:w??void 0,content:e,attachments:t});w||T(n.conversationId);let r={id:n.messageId,conversationId:n.conversationId,role:`assistant`,content:``,status:`streaming`,createdAt:new Date,updatedAt:new Date};_(e=>[...e,r]);let i=``;for await(let e of n.stream)if(e.type===`text`&&e.content)i+=e.content,_(e=>e.map(e=>e.id===n.messageId?{...e,content:i}:e));else if(e.type===`done`)_(t=>t.map(t=>t.id===n.messageId?{...t,status:`completed`,usage:e.usage,updatedAt:new Date}:t)),p?.(g.find(e=>e.id===n.messageId)??r);else if(e.type===`error`&&(_(t=>t.map(t=>t.id===n.messageId?{...t,status:`error`,error:e.error,updatedAt:new Date}:t)),e.error)){let t=Error(e.error.message);C(t),m?.(t)}}else{let n=await D.current.send({conversationId:w??void 0,content:e,attachments:t});y(n.conversation),_(n.conversation.messages),w||T(n.conversation.id),p?.(n.message)}}catch(e){let t=e instanceof Error?e:Error(String(e));C(t),m?.(t)}finally{x(!1),E.current=null}},[w,d,f,p,m,g]);return{messages:g,conversation:v,isLoading:b,error:S,sendMessage:O,clearConversation:n.useCallback(()=>{_([]),y(null),T(null),C(null)},[]),setConversationId:T,regenerate:n.useCallback(async()=>{let e=g.findLastIndex(e=>e.role===`user`);if(e===-1)return;let t=g[e];t&&(_(t=>t.slice(0,e+1)),await O(t.content,t.attachments))},[g,O]),stop:n.useCallback(()=>{E.current?.abort(),x(!1)},[])}}export{r as useChat};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{
|
|
1
|
+
"use client";import{n as e}from"../../libs/ai-providers/dist/models.js";import{u as t}from"../../libs/ai-providers/dist/factory.js";import"../../libs/ai-providers/dist/index.js";import*as n from"react";function r(){let[r,i]=n.useState([]),[a,o]=n.useState(!0),s=n.useCallback(async()=>{o(!0);try{i(t().map(t=>({...t,models:e(t.provider)})))}catch(e){console.error(`Failed to load providers:`,e)}finally{o(!1)}},[]);return n.useEffect(()=>{s()},[s]),{providers:r,availableProviders:n.useMemo(()=>r.filter(e=>e.available),[r]),isAvailable:n.useCallback(e=>r.some(t=>t.provider===e&&t.available),[r]),getModels:n.useCallback(e=>r.find(t=>t.provider===e)?.models??[],[r]),isLoading:a,refresh:s}}export{r as useProviders};
|
|
@@ -7,5 +7,4 @@ import { CodePreview } from "./components/CodePreview.js";
|
|
|
7
7
|
import "./components/index.js";
|
|
8
8
|
import { UseChatOptions, UseChatReturn, useChat } from "./hooks/useChat.js";
|
|
9
9
|
import { UseProvidersReturn, useProviders } from "./hooks/useProviders.js";
|
|
10
|
-
import "./hooks/index.js";
|
|
11
10
|
export { ChatContainer, ChatInput, ChatMessage, CodePreview, ContextIndicator, ModelPicker, UseChatOptions, UseChatReturn, UseProvidersReturn, useChat, useProviders };
|
package/dist/providers/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{a as e,e as t,i as n,n as r,r as i,t as a}from"../libs/ai-providers/dist/models.js";import{c as o,l as s,u as c}from"../libs/ai-providers/dist/factory.js";import{a as l,i as u,n as d,r as f,t as p}from"../libs/ai-providers/dist/validation.js";import"../libs/ai-providers/dist/index.js";import{isStudioAvailable as m,supportsLocalMode as h}from"./chat-utilities.js";export{t as DEFAULT_MODELS,a as MODELS,o as createProvider,s as createProviderFromEnv,c as getAvailableProviders,e as getDefaultModel,f as getEnvVarName,i as getModelInfo,r as getModelsForProvider,n as getRecommendedModels,d as hasCredentials,u as isOllamaRunning,m as isStudioAvailable,l as listOllamaModels,h as supportsLocalMode,p as validateProvider};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lssm/module.ai-chat",
|
|
3
|
-
"version": "0.0.0-canary-
|
|
3
|
+
"version": "0.0.0-canary-20251217062139",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -23,13 +23,13 @@
|
|
|
23
23
|
"test": "bun test"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@lssm/lib.ai-agent": "0.0.0-canary-
|
|
27
|
-
"@lssm/lib.ai-providers": "0.0.0-canary-
|
|
28
|
-
"@lssm/lib.contracts": "0.0.0-canary-
|
|
29
|
-
"@lssm/lib.metering": "0.0.0-canary-
|
|
30
|
-
"@lssm/lib.cost-tracking": "0.0.0-canary-
|
|
31
|
-
"@lssm/lib.design-system": "0.0.0-canary-
|
|
32
|
-
"@lssm/lib.ui-kit-web": "0.0.0-canary-
|
|
26
|
+
"@lssm/lib.ai-agent": "0.0.0-canary-20251217062139",
|
|
27
|
+
"@lssm/lib.ai-providers": "0.0.0-canary-20251217062139",
|
|
28
|
+
"@lssm/lib.contracts": "0.0.0-canary-20251217062139",
|
|
29
|
+
"@lssm/lib.metering": "0.0.0-canary-20251217062139",
|
|
30
|
+
"@lssm/lib.cost-tracking": "0.0.0-canary-20251217062139",
|
|
31
|
+
"@lssm/lib.design-system": "0.0.0-canary-20251217062139",
|
|
32
|
+
"@lssm/lib.ui-kit-web": "0.0.0-canary-20251217062139",
|
|
33
33
|
"@ai-sdk/react": "beta",
|
|
34
34
|
"ai": "beta",
|
|
35
35
|
"lucide-react": "^0.535.0",
|
|
@@ -37,8 +37,8 @@
|
|
|
37
37
|
"zod": "^4.1.13"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
|
-
"@lssm/tool.tsdown": "0.0.0-canary-
|
|
41
|
-
"@lssm/tool.typescript": "0.0.0-canary-
|
|
40
|
+
"@lssm/tool.tsdown": "0.0.0-canary-20251217062139",
|
|
41
|
+
"@lssm/tool.typescript": "0.0.0-canary-20251217062139",
|
|
42
42
|
"@types/react": "^19.0.14",
|
|
43
43
|
"tsdown": "^0.17.4",
|
|
44
44
|
"typescript": "^5.9.3"
|