modifywithai 1.10.0 → 2.2.1

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 (39) hide show
  1. package/README.md +145 -0
  2. package/dist/assistant/index.d.ts +3 -0
  3. package/dist/assistant/index.js +1 -0
  4. package/dist/assistant-7f9B_gWg.js +2 -0
  5. package/dist/assistant-nextjs/api.d.ts +42 -0
  6. package/dist/assistant-nextjs/api.js +1 -0
  7. package/dist/assistant-remix/api.d.ts +46 -0
  8. package/dist/assistant-remix/api.js +1 -0
  9. package/dist/assistant-tanstack-start/api.d.ts +56 -0
  10. package/dist/assistant-tanstack-start/api.js +1 -0
  11. package/dist/index-B2dmSvFt.d.ts +1272 -0
  12. package/dist/index.d.ts +3 -69
  13. package/dist/index.js +1 -1
  14. package/dist/types-C7I0JuqF.d.ts +344 -0
  15. package/dist/utils-DQD-DMi0.js +1 -0
  16. package/package.json +67 -20
  17. package/dist/index-Dp00MJvS.d.ts +0 -391
  18. package/dist/nextjs/api.d.ts +0 -67
  19. package/dist/nextjs/api.js +0 -1
  20. package/dist/nextjs/shims.d.ts +0 -13
  21. package/dist/nextjs/shims.js +0 -1
  22. package/dist/react/index.d.ts +0 -3
  23. package/dist/react/index.js +0 -1
  24. package/dist/react-CREl6aTM.js +0 -1
  25. package/dist/remix/api.d.ts +0 -45
  26. package/dist/remix/api.js +0 -1
  27. package/dist/remix/index.d.ts +0 -38
  28. package/dist/remix/index.js +0 -1
  29. package/dist/remix/shims.d.ts +0 -14
  30. package/dist/remix/shims.js +0 -1
  31. package/dist/shims-C5D8K0uz.js +0 -191
  32. package/dist/tanstack-start/api.d.ts +0 -43
  33. package/dist/tanstack-start/api.js +0 -1
  34. package/dist/tanstack-start/index.d.ts +0 -33
  35. package/dist/tanstack-start/index.js +0 -1
  36. package/dist/tanstack-start/shims.d.ts +0 -15
  37. package/dist/tanstack-start/shims.js +0 -1
  38. package/dist/types-D83LZSks.d.ts +0 -190
  39. package/dist/types-V6wytIkL.js +0 -1
package/README.md CHANGED
@@ -102,6 +102,151 @@ MWAI_API_KEY=your-api-key-here
102
102
  MWAI_BASE_URL=https://modifywithai.com # Optional, this is the default
103
103
  ```
104
104
 
105
+ ## AI Assistant Components
106
+
107
+ The `modifywithai` module provides pre-built UI components for building AI chat interfaces.
108
+
109
+ ### Installation
110
+
111
+ ```bash
112
+ bun add modifywithai @ai-sdk/react ai streamdown
113
+ ```
114
+
115
+ ### Tailwind CSS Setup
116
+
117
+ The assistant components use Tailwind CSS utility classes. You must configure Tailwind to scan the package:
118
+
119
+ #### Tailwind v4 (CSS-based config)
120
+
121
+ Add the `@source` directive to your main CSS file:
122
+
123
+ ```css
124
+ @import "tailwindcss";
125
+ @source "../node_modules/modifywithai";
126
+ ```
127
+
128
+ #### Tailwind v3 (JS config)
129
+
130
+ Add the package to your `tailwind.config.js` content array:
131
+
132
+ ```js
133
+ module.exports = {
134
+ content: [
135
+ "./src/**/*.{js,ts,jsx,tsx}",
136
+ "./node_modules/modifywithai/**/*.{js,mjs}"
137
+ ],
138
+ // ...
139
+ }
140
+ ```
141
+
142
+ ### CSS Variables
143
+
144
+ The components use CSS variable-based colors (compatible with shadcn/ui themes). Ensure your app defines these variables:
145
+
146
+ ```css
147
+ :root {
148
+ --background: 0 0% 100%;
149
+ --foreground: 0 0% 3.9%;
150
+ --muted: 0 0% 96.1%;
151
+ --muted-foreground: 0 0% 45.1%;
152
+ --primary: 0 0% 9%;
153
+ --primary-foreground: 0 0% 98%;
154
+ --secondary: 0 0% 96.1%;
155
+ --secondary-foreground: 0 0% 9%;
156
+ --border: 0 0% 89.8%;
157
+ --input: 0 0% 89.8%;
158
+ --ring: 0 0% 3.9%;
159
+ --destructive: 0 84.2% 60.2%;
160
+ --card: 0 0% 100%;
161
+ --card-foreground: 0 0% 3.9%;
162
+ --radius: 0.5rem;
163
+ }
164
+ ```
165
+
166
+ ### Quick Start
167
+
168
+ #### 1. Create the Token Endpoint
169
+
170
+ ```ts
171
+ // app/api/mwai/token/route.ts
172
+ import { createAssistantTokenHandler } from "modifywithai/nextjs"
173
+
174
+ export const POST = createAssistantTokenHandler({
175
+ appId: process.env.MWAI_APP_ID!,
176
+ // apiKey defaults to process.env.MWAI_API_KEY
177
+ })
178
+ ```
179
+
180
+ #### 2. Use the Components
181
+
182
+ ```tsx
183
+ import {
184
+ useAssistant,
185
+ Conversation,
186
+ ConversationContent,
187
+ Message,
188
+ MessageContent,
189
+ MessageResponse,
190
+ PromptInput,
191
+ PromptInputTextarea,
192
+ PromptInputFooter,
193
+ PromptInputSubmit,
194
+ } from "modifywithai"
195
+
196
+ function AssistantChat() {
197
+ const { messages, sendMessage, status, isReady } = useAssistant({
198
+ endUserId: "user-123",
199
+ availableActions: [
200
+ { name: "addTodo", description: "Add a new todo" },
201
+ ],
202
+ onAction: (action) => console.log("Action:", action),
203
+ })
204
+
205
+ if (!isReady) return <div>Connecting...</div>
206
+
207
+ return (
208
+ <div className="flex flex-col h-full">
209
+ <Conversation>
210
+ <ConversationContent>
211
+ {messages.map((msg) => (
212
+ <Message key={msg.id} from={msg.role}>
213
+ <MessageContent>
214
+ <MessageResponse>{msg.content}</MessageResponse>
215
+ </MessageContent>
216
+ </Message>
217
+ ))}
218
+ </ConversationContent>
219
+ </Conversation>
220
+
221
+ <PromptInput onSubmit={({ text }) => sendMessage({ text })}>
222
+ <PromptInputTextarea placeholder="Ask me anything..." />
223
+ <PromptInputFooter>
224
+ <div />
225
+ <PromptInputSubmit status={status} />
226
+ </PromptInputFooter>
227
+ </PromptInput>
228
+ </div>
229
+ )
230
+ }
231
+ ```
232
+
233
+ ### Customizing Styles
234
+
235
+ All components accept a `className` prop to override or extend styles:
236
+
237
+ ```tsx
238
+ <Message from="user" className="bg-blue-100" />
239
+ <PromptInputSubmit className="bg-green-500 hover:bg-green-600" />
240
+ ```
241
+
242
+ Components also expose `data-slot` attributes for CSS targeting:
243
+
244
+ ```css
245
+ [data-slot="message"] { /* ... */ }
246
+ [data-slot="prompt-input"] { /* ... */ }
247
+ [data-slot="confirmation"][data-state="approval-requested"] { /* ... */ }
248
+ ```
249
+
105
250
  ## Development
106
251
 
107
252
  ```bash
@@ -0,0 +1,3 @@
1
+ import { S as UseDynamicUIReturn, _ as ToolActionSchema, a as AssistantConfig, b as UseAssistantTokenOptions, c as DynamicButton, d as DynamicUITree, f as TokenRequest, g as ToolAction, h as TokenResponseSchema, i as ActionOptionSchema, l as DynamicButtonGroup, m as TokenResponse, n as ActionDefinitionSchema, o as ChatStatus, p as TokenRequestSchema, r as ActionOption, s as CreateAssistantTokenHandlerOptions, t as ActionDefinition, u as DynamicUIElement, v as UseAssistantOptions, x as UseAssistantTokenReturn, y as UseAssistantReturn } from "../types-C7I0JuqF.js";
2
+ import { $ as MessageContentProps, A as PromptInputFooterProps, At as ConfirmationActions, B as DrawerContentProps, Bt as AssistantMessages, C as TaskProps, Ct as ConversationScrollButton, D as PromptInputButton, Dt as ConfirmationAcceptedProps, E as PromptInput, Et as ConfirmationAccepted, F as PromptInputTextarea, Ft as ConfirmationRequest, G as DrawerPortal, H as DrawerFooter, I as PromptInputTextareaProps, It as ConfirmationRequestProps, J as Collapsible, K as DrawerTitle, L as Drawer, Lt as ConfirmationTitle, M as PromptInputProps, Mt as ConfirmationProps, N as PromptInputSubmit, Nt as ConfirmationRejected, O as PromptInputButtonProps, Ot as ConfirmationAction, P as PromptInputSubmitProps, Pt as ConfirmationRejectedProps, Q as MessageContent, R as DrawerClose, Rt as ConfirmationTitleProps, S as TaskItemProps, St as ConversationProps, T as TaskTriggerProps, Tt as Confirmation, U as DrawerHeader, V as DrawerDescription, Vt as AssistantMessagesProps, W as DrawerOverlay, X as CollapsibleTrigger, Y as CollapsibleContent, Z as Message, _ as TaskContent, _t as Conversation, a as useToolExecution, at as DateFieldRenderer, b as TaskItemFile, bt as ConversationEmptyState, c as useDynamicUIToolExecution, ct as TextFieldRenderer, d as useAssistant, dt as DynamicButtonRenderer, et as MessageProps, f as AssistantContextValue, ft as dynamicUIRegistry, g as Task, gt as DynamicActionModalProps, h as useAssistantContext, ht as DynamicActionModal, i as UseToolExecutionOptions, it as AssistantFormRendererProps, j as PromptInputMessage, jt as ConfirmationActionsProps, k as PromptInputFooter, kt as ConfirmationActionProps, l as UseDynamicUIOptions, lt as defaultFormRegistry, m as AssistantProviderProps, mt as DynamicUIProps, n as AssistantRoot, nt as MessageResponseProps, o as useAssistantToken, ot as FormRenderer, p as AssistantProvider, pt as DynamicUI, q as DrawerTrigger, r as AssistantRootProps, rt as AssistantFormRenderer, s as UseDynamicUIToolExecutionOptions, st as TextAreaRenderer, t as cn, tt as MessageResponse, u as useDynamicUI, ut as DynamicButtonGroupRenderer, v as TaskContentProps, vt as ConversationContent, w as TaskTrigger, wt as ConversationScrollButtonProps, x as TaskItemFileProps, xt as ConversationEmptyStateProps, y as TaskItem, yt as ConversationContentProps, z as DrawerContent, zt as ToolUIPartApproval } from "../index-B2dmSvFt.js";
3
+ export { ActionDefinition, ActionDefinitionSchema, ActionOption, ActionOptionSchema, AssistantConfig, AssistantContextValue, AssistantFormRenderer, AssistantFormRendererProps, AssistantMessages, AssistantMessagesProps, AssistantProvider, AssistantProviderProps, AssistantRoot, AssistantRootProps, ChatStatus, Collapsible, CollapsibleContent, CollapsibleTrigger, Confirmation, ConfirmationAccepted, ConfirmationAcceptedProps, ConfirmationAction, ConfirmationActionProps, ConfirmationActions, ConfirmationActionsProps, ConfirmationProps, ConfirmationRejected, ConfirmationRejectedProps, ConfirmationRequest, ConfirmationRequestProps, ConfirmationTitle, ConfirmationTitleProps, Conversation, ConversationContent, ConversationContentProps, ConversationEmptyState, ConversationEmptyStateProps, ConversationProps, ConversationScrollButton, ConversationScrollButtonProps, CreateAssistantTokenHandlerOptions, DateFieldRenderer, Drawer, DrawerClose, DrawerContent, DrawerContentProps, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DynamicActionModal, DynamicActionModalProps, DynamicButton, DynamicButtonGroup, DynamicButtonGroupRenderer, DynamicButtonRenderer, DynamicUI, DynamicUIElement, DynamicUIProps, DynamicUITree, FormRenderer, Message, MessageContent, MessageContentProps, MessageProps, MessageResponse, MessageResponseProps, PromptInput, PromptInputButton, PromptInputButtonProps, PromptInputFooter, PromptInputFooterProps, PromptInputMessage, PromptInputProps, PromptInputSubmit, PromptInputSubmitProps, PromptInputTextarea, PromptInputTextareaProps, Task, TaskContent, TaskContentProps, TaskItem, TaskItemFile, TaskItemFileProps, TaskItemProps, TaskProps, TaskTrigger, TaskTriggerProps, TextAreaRenderer, TextFieldRenderer, TokenRequest, TokenRequestSchema, TokenResponse, TokenResponseSchema, ToolAction, ToolActionSchema, ToolUIPartApproval, UseAssistantOptions, UseAssistantReturn, UseAssistantTokenOptions, UseAssistantTokenReturn, UseDynamicUIOptions, UseDynamicUIReturn, UseDynamicUIToolExecutionOptions, UseToolExecutionOptions, cn, defaultFormRegistry, dynamicUIRegistry, useAssistant, useAssistantContext, useAssistantToken, useDynamicUI, useDynamicUIToolExecution, useToolExecution };
@@ -0,0 +1 @@
1
+ import{$ as e,A as t,B as n,C as r,D as i,E as a,F as o,G as s,H as c,I as l,J as u,K as d,L as f,M as p,N as m,O as h,P as g,Q as _,R as v,S as y,T as b,U as x,V as S,W as C,X as w,Y as T,Z as E,_ as D,a as O,at as k,b as A,c as j,ct as M,d as N,et as P,f as F,g as I,h as L,i as R,it as z,j as B,k as V,l as H,lt as U,m as W,n as G,nt as K,o as q,ot as J,p as Y,q as X,r as Z,rt as Q,s as $,st as ee,t as te,tt as ne,u as re,v as ie,w as ae,x as oe,y as se,z as ce}from"../assistant-7f9B_gWg.js";export{k as ActionDefinitionSchema,J as ActionOptionSchema,s as AssistantFormRenderer,m as AssistantMessages,r as AssistantProvider,te as AssistantRoot,ce as Collapsible,n as CollapsibleContent,S as CollapsibleTrigger,E as Confirmation,_ as ConfirmationAccepted,e as ConfirmationAction,P as ConfirmationActions,ne as ConfirmationRejected,K as ConfirmationRequest,Q as ConfirmationTitle,V as Conversation,t as ConversationContent,B as ConversationEmptyState,p as ConversationScrollButton,d as DateFieldRenderer,$ as Drawer,j as DrawerClose,H as DrawerContent,re as DrawerDescription,N as DrawerFooter,F as DrawerHeader,Y as DrawerOverlay,W as DrawerPortal,L as DrawerTitle,I as DrawerTrigger,h as DynamicActionModal,ie as DynamicButtonGroupRenderer,se as DynamicButtonRenderer,D as DynamicUI,X as FormRenderer,c as Message,x as MessageContent,C as MessageResponse,G as PromptInput,Z as PromptInputButton,R as PromptInputFooter,O as PromptInputSubmit,q as PromptInputTextarea,g as Task,o as TaskContent,l as TaskItem,f as TaskItemFile,v as TaskTrigger,u as TextAreaRenderer,T as TextFieldRenderer,ee as TokenRequestSchema,M as TokenResponseSchema,U as ToolActionSchema,z as cn,w as defaultFormRegistry,A as dynamicUIRegistry,b as useAssistant,ae as useAssistantContext,i as useAssistantToken,y as useDynamicUI,oe as useDynamicUIToolExecution,a as useToolExecution};
@@ -0,0 +1,2 @@
1
+ import{z as e}from"zod";import{Children as t,createContext as n,memo as r,useCallback as i,useContext as a,useEffect as o,useMemo as s,useRef as c,useState as l}from"react";import{clsx as u}from"clsx";import{twMerge as d}from"tailwind-merge";import{Fragment as f,jsx as p,jsxs as m}from"react/jsx-runtime";import{JSONUIProvider as h,Renderer as g}from"@json-render/react";import{Streamdown as _}from"streamdown";import{ChevronDownIcon as v,CornerDownLeftIcon as y,Loader2Icon as b,SearchIcon as x,SquareIcon as S,XIcon as ee}from"lucide-react";import*as C from"@radix-ui/react-collapsible";import{useChat as te}from"@ai-sdk/react";import{DefaultChatTransport as ne,lastAssistantMessageIsCompleteWithApprovalResponses as re}from"ai";import{Drawer as w}from"vaul-base";import{createPortal as ie}from"react-dom";const ae=e.object({type:e.string(),description:e.string().optional(),required:e.boolean().optional()}),oe=e.object({name:e.string(),description:e.string(),options:e.record(e.string(),ae).optional(),approvalRequired:e.boolean().optional()}),T=e.object({name:e.string(),options:e.record(e.string(),e.unknown()).optional()}),se=e.object({token:e.string(),expiresAt:e.number()}),ce=e.object({endUserId:e.string(),availableActions:e.array(oe),context:e.record(e.string(),e.unknown()).optional()});function E(...e){return d(u(e))}const le=n(null);function D(){let e=a(le);if(!e)throw Error(`Confirmation components must be used within Confirmation`);return e}function O({className:e,approval:t,state:n,...r}){return!t||n===`input-streaming`||n===`input-available`?null:p(le.Provider,{value:{approval:t,state:n},children:p(`div`,{"data-slot":`confirmation`,"data-state":n,"data-approved":t?.approved,role:`alertdialog`,"aria-labelledby":`confirmation-title`,className:E(`flex flex-col gap-2 rounded-lg border p-4`,`data-[state=approval-requested]:border-amber-500/50 data-[state=approval-requested]:bg-amber-50/50 dark:data-[state=approval-requested]:bg-amber-950/20`,`data-[approved=true]:border-green-500/50 data-[approved=true]:bg-green-50/50 dark:data-[approved=true]:bg-green-950/20`,`data-[approved=false]:border-red-500/50 data-[approved=false]:bg-red-50/50 dark:data-[approved=false]:bg-red-950/20`,e),...r})})}function k({className:e,...t}){return p(`p`,{id:`confirmation-title`,"data-slot":`confirmation-title`,className:E(`text-sm font-medium`,e),...t})}function A({children:e}){let{state:t}=D();return t===`approval-requested`?p(`div`,{"data-slot":`confirmation-request`,children:e}):null}function j({children:e}){let{approval:t,state:n}=D();return!t?.approved||n!==`approval-responded`&&n!==`output-denied`&&n!==`output-available`?null:p(`div`,{"data-slot":`confirmation-accepted`,children:e})}function M({children:e}){let{approval:t,state:n}=D();return t?.approved!==!1||n!==`approval-responded`&&n!==`output-denied`&&n!==`output-available`?null:p(`div`,{"data-slot":`confirmation-rejected`,children:e})}function N({className:e,...t}){let{state:n}=D();return n===`approval-requested`?p(`div`,{"data-slot":`confirmation-actions`,className:E(`flex items-center justify-end gap-2 self-end`,e),...t}):null}function P({className:e,variant:t=`default`,...n}){return p(`button`,{"data-slot":`confirmation-action`,"data-variant":t,type:`button`,className:E(`inline-flex h-8 items-center justify-center gap-2 whitespace-nowrap rounded-md px-3 text-sm font-medium transition-colors`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2`,`disabled:pointer-events-none disabled:opacity-50`,t===`default`&&`bg-primary text-primary-foreground shadow hover:bg-primary/90`,t===`outline`&&`border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground`,t===`destructive`&&`bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90`,e),...n})}function F({element:e,children:t,onAction:n}){let{id:r=`form`,title:i,submitLabel:a=`Submit`}=e.props??{},o=e=>{e.preventDefault();let t=new FormData(e.currentTarget),i={};t.forEach((e,t)=>{typeof e==`string`&&(i[t]=e)}),n?.({name:`submit`,params:{formId:r,data:i}})};return m(`div`,{"data-slot":`form-card`,className:E(`w-full rounded-lg border bg-card text-card-foreground shadow-sm`),children:[i&&p(`div`,{className:`flex flex-col space-y-1.5 p-4 pb-3`,children:p(`h3`,{className:`text-base font-semibold leading-none tracking-tight`,children:i})}),p(`div`,{className:E(`p-4`,i?``:`pt-4`),children:m(`form`,{onSubmit:o,className:`space-y-4`,children:[t,m(`div`,{className:`flex justify-end gap-2 pt-2`,children:[p(`button`,{type:`button`,className:E(`inline-flex h-9 items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium shadow-sm transition-colors`,`hover:bg-accent hover:text-accent-foreground`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2`,`disabled:pointer-events-none disabled:opacity-50`),onClick:()=>n?.({name:`cancel`,params:{formId:r}}),children:`Cancel`}),p(`button`,{type:`submit`,className:E(`inline-flex h-9 items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground shadow transition-colors`,`hover:bg-primary/90`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2`,`disabled:pointer-events-none disabled:opacity-50`),children:a})]})]})})]})}function I({element:e}){let{name:t=`field`,label:n=`Field`,placeholder:r,required:i,defaultValue:a}=e.props??{};return m(`div`,{className:`space-y-1.5`,children:[m(`label`,{htmlFor:t,className:`text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70`,children:[n,i&&p(`span`,{className:`ml-1 text-destructive`,children:`*`})]}),p(`input`,{id:t,name:t,type:`text`,placeholder:r,required:i,defaultValue:a,autoComplete:`off`,className:E(`flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors`,`placeholder:text-muted-foreground`,`focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`,`disabled:cursor-not-allowed disabled:opacity-50`)})]})}function L({element:e}){let{name:t=`field`,label:n=`Field`,placeholder:r,required:i,defaultValue:a,rows:o=3}=e.props??{};return m(`div`,{className:`space-y-1.5`,children:[m(`label`,{htmlFor:t,className:`text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70`,children:[n,i&&p(`span`,{className:`ml-1 text-destructive`,children:`*`})]}),p(`textarea`,{id:t,name:t,placeholder:r,required:i,defaultValue:a,rows:o,className:E(`flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm transition-colors`,`placeholder:text-muted-foreground`,`focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`,`disabled:cursor-not-allowed disabled:opacity-50`)})]})}function R({element:e}){let{name:t=`date`,label:n=`Date`,required:r,defaultValue:i,min:a,max:o}=e.props??{};return m(`div`,{className:`space-y-1.5`,children:[m(`label`,{htmlFor:t,className:`text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70`,children:[n,r&&p(`span`,{className:`ml-1 text-destructive`,children:`*`})]}),p(`input`,{type:`date`,id:t,name:t,required:r,defaultValue:i,min:a,max:o,className:E(`flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors`,`focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`,`disabled:cursor-not-allowed disabled:opacity-50`)})]})}const z={Form:F,TextField:I,TextArea:L,DateField:R},ue=e.object({formId:e.string(),data:e.record(e.string(),e.string())}),de=e.object({formId:e.string()});function B({ui:e,context:t,onSubmit:n,onCancel:r,registry:i=z}){return p(h,{registry:i,initialData:t,actionHandlers:{submit:e=>{let t=ue.safeParse(e);t.success?n(t.data.formId,t.data.data):console.warn(`Form submit: Invalid params`,t.error.flatten())},cancel:e=>{let t=de.safeParse(e);t.success?r?.(t.data.formId):console.warn(`Form cancel: Invalid params`,t.error.flatten())}},children:p(g,{tree:e,registry:i})})}function V({className:e,from:t,...n}){return p(`div`,{"data-slot":`message`,"data-from":t,className:E(`group flex w-full max-w-[95%] flex-col gap-2`,t===`user`?`is-user ml-auto justify-end`:`is-assistant`,e),...n})}function H({children:e,className:t,...n}){return p(`div`,{"data-slot":`message-content`,className:E(`flex w-fit min-w-0 max-w-full flex-col gap-2 overflow-hidden text-sm`,`group-[.is-user]:ml-auto group-[.is-user]:rounded-lg group-[.is-user]:bg-secondary group-[.is-user]:px-4 group-[.is-user]:py-3 group-[.is-user]:text-foreground`,`group-[.is-assistant]:text-foreground`,t),...n,children:e})}const U=r(function({className:e,...t}){return p(_,{"data-slot":`message-response`,className:E(`size-full [&>*:first-child]:mt-0 [&>*:last-child]:mb-0`,e),...t})},(e,t)=>e.children===t.children);function W({...e}){return p(C.Root,{"data-slot":`collapsible`,...e})}function G({...e}){return p(C.CollapsibleTrigger,{"data-slot":`collapsible-trigger`,...e})}function K({...e}){return p(C.CollapsibleContent,{"data-slot":`collapsible-content`,...e})}function fe({children:e,className:t,...n}){return p(`div`,{"data-slot":`task-item-file`,className:E(`inline-flex items-center gap-1 rounded-md border bg-secondary px-1.5 py-0.5 text-xs text-foreground`,t),...n,children:e})}function q({children:e,className:t,...n}){return p(`div`,{"data-slot":`task-item`,className:E(`text-sm text-muted-foreground`,t),...n,children:e})}function J({defaultOpen:e=!0,className:t,...n}){return p(W,{"data-slot":`task`,className:E(t),defaultOpen:e,...n})}function Y({children:e,className:t,title:n,icon:r,...i}){return p(G,{asChild:!0,className:E(`group`,t),...i,children:e??m(`div`,{className:`flex w-full cursor-pointer items-center gap-2 text-sm text-muted-foreground transition-colors hover:text-foreground`,children:[r??p(x,{className:`size-4`}),p(`p`,{className:`text-sm`,children:n}),p(v,{className:`size-4 transition-transform group-data-[state=open]:rotate-180`})]})})}function X({children:e,className:t,...n}){return p(K,{"data-slot":`task-content`,className:E(`text-popover-foreground outline-none`,`data-[state=closed]:animate-out data-[state=open]:animate-in`,`data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0`,`data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2`,t),...n,children:p(`div`,{className:`mt-4 space-y-2 border-l-2 border-muted pl-4`,children:e})})}const pe=e.object({actions:e.array(T).optional()}),me=e.object({id:e.string(),approved:e.boolean().optional()}),he=e.object({key:e.string(),type:e.string(),props:e.record(e.string(),e.unknown()).default({}),children:e.array(e.string()).optional()}),ge=e.object({root:e.string(),elements:e.record(e.string(),he)}),_e=e.object({ui:ge,context:e.record(e.string(),e.unknown()).optional()});function ve(e){return e.name}function ye({messages:e,sendMessage:t,addToolApprovalResponse:n,getActionDescription:r=ve,className:i}){let a=e.filter(e=>e.role===`user`||e.role===`assistant`);return p(`div`,{className:i,children:a.map((e,i)=>{let o=i===a.length-1;return p(V,{from:e.role,children:p(H,{children:e.parts.map((i,a)=>p(be,{part:i,messageId:e.id,partIndex:a,isLastMessage:o,sendMessage:t,addToolApprovalResponse:n,getActionDescription:r},`${e.id}-${a}`))})},e.id)})})}function be({part:e,messageId:t,partIndex:n,isLastMessage:r,sendMessage:i,addToolApprovalResponse:a,getActionDescription:o}){if(e.type===`text`)return p(U,{children:e.text});if(e.type===`tool-performActions`){let r=`input`in e?e.input:void 0,i=pe.safeParse(r),s=i.success?i.data.actions??[]:[];if(s.length===0)return null;let c=s.length,l=`state`in e?e.state:void 0,u=`approval`in e?e.approval:void 0,d=me.safeParse(u),f=d.success?d.data:void 0;return f&&l?m(O,{state:l,approval:f,children:[p(k,{children:c===1?`Confirm action`:`Confirm ${c} actions`}),p(A,{children:p(`ul`,{className:`list-disc list-inside text-sm text-muted-foreground mt-2`,children:s.map((e,r)=>p(`li`,{children:o(e)},`${t}-${n}-${r}`))})}),p(j,{children:p(`span`,{className:`text-sm text-muted-foreground`,children:c===1?`Action approved`:`${c} actions approved`})}),p(M,{children:p(`span`,{className:`text-sm text-muted-foreground`,children:c===1?`Action cancelled`:`${c} actions cancelled`})}),m(N,{children:[p(P,{variant:`outline`,onClick:()=>a({id:f.id,approved:!1}),children:`Deny`}),p(P,{onClick:()=>a({id:f.id,approved:!0}),children:`Approve`})]})]}):m(J,{defaultOpen:!1,children:[p(Y,{title:c===1?`Performing 1 action`:`Performing ${c} actions`}),p(X,{children:s.map((e,r)=>p(q,{children:o(e)},`${t}-${n}-${r}`))})]})}if(e.type===`tool-renderUI`&&r){if((`state`in e?e.state:void 0)===`output-available`&&`output`in e){let t=_e.safeParse(e.output);if(t.success)return p(B,{ui:t.data.ui,context:t.data.context,onSubmit:(e,t)=>{i({text:`[Form:${e}] ${JSON.stringify(t)}`})},onCancel:e=>{i({text:`[Form:${e}] cancelled`})}})}return null}return null}function xe({className:e,children:t,...n}){return p(`div`,{"data-slot":`conversation`,className:E(`relative flex-1 overflow-y-hidden min-h-0`,e),role:`log`,"aria-label":`Chat messages`,...n,children:t})}function Se({className:e,children:t,...n}){let r=c(null);return o(()=>{r.current&&(r.current.scrollTop=r.current.scrollHeight)},[t]),p(`div`,{ref:r,"data-slot":`conversation-content`,className:E(`flex h-full flex-col gap-8 overflow-y-auto p-4`,e),...n,children:t})}function Ce({className:e,title:t=`No messages yet`,description:n=`Start a conversation to see messages here`,icon:r,children:i,...a}){return p(`div`,{"data-slot":`conversation-empty-state`,className:E(`flex size-full flex-col items-center justify-center gap-3 p-8 text-center`,e),...a,children:i??m(f,{children:[r&&p(`div`,{className:`text-muted-foreground`,children:r}),m(`div`,{className:`space-y-1`,children:[p(`h3`,{className:`text-sm font-medium`,children:t}),n&&p(`p`,{className:`text-muted-foreground text-sm`,children:n})]})]})})}function we({className:e,...t}){return null}function Te({button:e,availableActions:t,onExecute:n,onClose:r}){let[a,s]=l(null),[c,u]=l({}),d=i(()=>{if(!e||!t)return!1;for(let n of e.actions){let e=t.find(e=>e.name===n.name);if(e?.options){for(let[t,r]of Object.entries(e.options))if(r.required&&!n.options?.[t])return!0}}return!1},[e,t]),f=i(()=>!e||!t?!1:e.actions.some(e=>t.find(t=>t.name===e.name)?.approvalRequired===!0),[e,t]),h=i(()=>{if(!e||!t)return null;let n=[];for(let r of e.actions){let e=t.find(e=>e.name===r.name);if(e?.options){for(let[t,i]of Object.entries(e.options))if(i.required&&!r.options?.[t]){let e=`${r.name}_${t}`;n.push({key:e,type:(i.type,`TextField`),props:{name:e,label:i.description||t,required:!0}})}}}if(n.length===0)return null;let r={form:{key:`form`,type:`Form`,props:{id:`dynamic-action-${e.id}`,title:e.label,submitLabel:`Continue`},children:n.map(e=>e.key)}};for(let e of n)r[e.key]={key:e.key,type:e.type,props:e.props,parentKey:`form`};return{root:`form`,elements:r}},[e,t]),g=i(i=>{e&&(n(e.actions.map(e=>{let n={...e.options},r=t?.find(t=>t.name===e.name);for(let[t,a]of Object.entries(i)){let i=t.split(`_`),o=i[0],s=i.slice(1).join(`_`);if(o===e.name&&s){let e=r?.options?.[s],t=a;e?.type===`number`?t=Number(a):e?.type===`boolean`&&(t=a===`true`),n[s]=t}}return{...e,options:n}})),r())},[e,t,n,r]);o(()=>{if(!e){s(null),u({});return}if(d()){s(`input`);return}if(f()){s(`approval`);return}n(e.actions),r()},[e,d,f,n,r]);let _=i((e,t)=>{u(t),f()?s(`approval`):g(t)},[f,g]),v=i(()=>{Object.keys(c).length>0?g(c):e&&(n(e.actions),r())},[c,e,n,r,g]);if(!e||a===null)return null;let y=h();return m(Ee,{onClose:r,children:[a===`input`&&y&&p(B,{ui:y,onSubmit:_,onCancel:r}),a===`approval`&&p(De,{button:e,availableActions:t,onApprove:v,onDeny:r})]})}function Ee({children:e,onClose:t}){return p(`div`,{className:`fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-8`,onClick:e=>{e.target===e.currentTarget&&t()},children:p(`div`,{className:`max-h-[90vh] w-full max-w-md overflow-auto`,onClick:e=>e.stopPropagation(),children:e})})}function De({button:e,availableActions:t,onApprove:n,onDeny:r}){return p(`div`,{className:`rounded-lg border bg-card text-card-foreground shadow-sm p-4`,children:m(`div`,{className:`flex flex-col gap-4`,children:[m(`div`,{className:`flex flex-col gap-2`,children:[p(`h3`,{className:`text-lg font-semibold`,children:`Confirm Action`}),p(`p`,{className:`text-sm text-muted-foreground`,children:`This will execute the following actions:`})]}),p(`ul`,{className:`list-inside list-disc space-y-1 text-sm`,children:e.actions.map((e,n)=>{let r=t?.find(t=>t.name===e.name);return m(`li`,{children:[p(`span`,{className:`font-medium`,children:e.name}),r?.description&&m(`span`,{className:`text-muted-foreground`,children:[` `,`- `,r.description]})]},n)})}),m(`div`,{className:`flex justify-end gap-2 pt-2`,children:[p(`button`,{type:`button`,onClick:r,className:E(`inline-flex h-9 items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium shadow-sm transition-colors`,`hover:bg-accent hover:text-accent-foreground`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2`),children:`Cancel`}),p(`button`,{type:`button`,onClick:n,className:E(`inline-flex h-9 items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground shadow transition-colors`,`hover:bg-primary/90`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2`),children:`Confirm`})]})]})})}function Oe({tokenEndpoint:e,endUserId:t,availableActions:n,autoFetch:r=!0,refreshBuffer:a=3e4}){let[s,u]=l(null),[d,f]=l(null),[p,m]=l(!1),[h,g]=l(null),_=c(!0),v=c(!1),y=c(n);y.current=n;let b=i(async()=>{if(_.current){m(!0),g(null);try{let n=await fetch(e,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({endUserId:t,availableActions:y.current})});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error||`Failed to get token: ${n.status}`)}let r=await n.json();if(!_.current)return;u(r.token),f(r.expiresAt)}catch(e){if(!_.current)return;g(e instanceof Error?e.message:`Failed to get token`),console.error(`Token fetch error:`,e)}finally{_.current&&m(!1)}}},[e,t]);return o(()=>{r&&!v.current&&(v.current=!0,b())},[r,b]),o(()=>{if(!d)return;let e=d-Date.now()-a;if(e<=0){b();return}let t=setTimeout(b,e);return()=>clearTimeout(t)},[d,a,b]),o(()=>(_.current=!0,()=>{_.current=!1}),[]),{token:s,expiresAt:d,isLoading:p,error:h,fetchToken:b}}function ke({messages:e,onAction:t}){let n=c(new Set);o(()=>{if(t){for(let r of e)if(r.role===`assistant`){for(let e of r.parts)if(e.type===`tool-performActions`&&`state`in e&&e.state===`output-available`&&`output`in e){let r=e.toolCallId;if(n.current.has(r))continue;let i=e.output;if(i?.actions)for(let e of i.actions)t(e);n.current.add(r)}}}},[e,t])}function Ae({tokenEndpoint:e=`/api/mwai/token`,apiUrl:t=`https://api.modifywithai.com`,endUserId:n,availableActions:r,getContext:a,onAction:o,onError:u}){let[d,f]=l(``),{token:p,isLoading:m,error:h,fetchToken:g}=Oe({tokenEndpoint:e,endUserId:n,availableActions:r,autoFetch:!0}),_=c(a);_.current=a;let v=c(p);v.current=p;let y=te({transport:s(()=>new ne({api:`${t}/api/assistant`,headers:()=>{let e=v.current;return e?{Authorization:`Bearer ${e}`}:{}},body:()=>({context:_.current?.()??{}})}),[t]),sendAutomaticallyWhen:re,onError:u});ke({messages:y.messages,onAction:o});let b=!!p&&!m,x=i(e=>{if(!b){console.warn(`Cannot send message: assistant not ready (token not available)`);return}y.sendMessage(e)},[y,b]),S=i(e=>{e?.preventDefault(),!(!d.trim()||!b)&&(x({text:d}),f(``))},[d,x,b]);return{messages:y.messages,sendMessage:x,status:y.status,error:y.error??null,input:d,setInput:f,handleSubmit:S,addToolApprovalResponse:y.addToolApprovalResponse,isReady:b,tokenError:h,refreshToken:g}}const je=n(null);function Me({children:e,tokenEndpoint:t,apiUrl:n,endUserId:r,availableActions:i,getContext:a,onAction:o,onError:c}){let l=Ae({tokenEndpoint:t,apiUrl:n,endUserId:r,availableActions:i,getContext:a,onAction:o,onError:c}),u=s(()=>({tokenEndpoint:t,apiUrl:n,endUserId:r,availableActions:i}),[t,n,r,i]),d=s(()=>({messages:l.messages,sendMessage:l.sendMessage,status:l.status,error:l.error,input:l.input,setInput:l.setInput,handleSubmit:l.handleSubmit,addToolApprovalResponse:l.addToolApprovalResponse,isReady:l.isReady,tokenError:l.tokenError,refreshToken:l.refreshToken,config:u,onAction:o}),[l.messages,l.sendMessage,l.status,l.error,l.input,l.setInput,l.handleSubmit,l.addToolApprovalResponse,l.isReady,l.tokenError,l.refreshToken,u,o]);return p(je.Provider,{value:d,children:e})}function Ne(){let e=a(je);if(!e)throw Error(`useAssistantContext must be used within an AssistantProvider`);return e}const Pe=e.object({id:e.string(),label:e.string(),variant:e.enum([`default`,`destructive`,`outline`,`secondary`,`ghost`]).optional(),icon:e.string().optional(),actions:e.array(T)}),Fe=e.object({key:e.string(),type:e.enum([`DynamicButton`,`DynamicButtonGroup`]),props:e.record(e.string(),e.unknown()),children:e.array(e.string()).optional(),parentKey:e.string().optional()}),Ie=e.object({root:e.string(),elements:e.record(e.string(),Fe)}),Le=e.object({version:e.literal(1),tree:Ie});function Re(e,t,n){return{key:e,type:`DynamicButton`,props:{...t},parentKey:n}}function Z(e,t,n=[],r){return{key:e,type:`DynamicButtonGroup`,props:{...t},children:n,parentKey:r}}function ze({storageKey:e}){let[t,n]=l(null),[r,a]=l(!0);return o(()=>{try{let t=localStorage.getItem(e);if(t){let r=JSON.parse(t),i=Le.safeParse(r);i.success?n(i.data.tree):(console.warn(`DynamicUI: Stored data failed validation. Discarding.`,i.error.flatten()),localStorage.removeItem(e))}}catch(e){console.error(`Failed to load DynamicUI state:`,e)}finally{a(!1)}},[e]),o(()=>{if(!r)try{if(t){let n={version:1,tree:t};localStorage.setItem(e,JSON.stringify(n))}else localStorage.removeItem(e)}catch(e){console.error(`Failed to save DynamicUI state:`,e)}},[t,e,r]),{tree:t,isLoading:r,addButton:i((e,t)=>{n(n=>{let r=`button-${e.id}`;if(!n){let t=`root-group`;return{root:t,elements:{[t]:Z(t,{id:`root`,direction:`horizontal`},[r]),[r]:Re(r,e,t)}}}if(n.elements[r])return console.warn(`Button with id "${e.id}" already exists`),n;let i=t?`group-${t}`:n.root,a=n.elements[i];a||console.warn(`Parent "${i}" not found, using root`);let o=a?i:n.root,s=n.elements[o];if(!s)return console.warn(`Parent element "${o}" not found`),n;let c={...n.elements,[o]:{key:s.key,type:s.type,props:s.props,children:[...s.children||[],r],parentKey:s.parentKey},[r]:Re(r,e,o)};return{root:n.root,elements:c}})},[]),removeButton:i(e=>{n(t=>{if(!t)return t;let n=`button-${e}`,r=t.elements[n];if(!r)return console.warn(`Button "${e}" not found`),t;let i={};for(let[e,a]of Object.entries(t.elements))e!==n&&(r.parentKey&&e===r.parentKey?i[e]={key:a.key,type:a.type,props:a.props,children:a.children?.filter(e=>e!==n),parentKey:a.parentKey}:i[e]=a);return Object.values(i).some(e=>e.type===`DynamicButton`)?{root:t.root,elements:i}:null})},[]),updateButton:i((e,t)=>{n(n=>{if(!n)return n;let r=`button-${e}`,i=n.elements[r];if(!i||i.type!==`DynamicButton`)return console.warn(`Button "${e}" not found`),n;let a=Pe.safeParse(i.props);if(!a.success)return console.warn(`Button "${e}" has invalid props`,a.error.flatten()),n;let o={...n.elements,[r]:{key:i.key,type:i.type,props:{...a.data,...t},children:i.children,parentKey:i.parentKey}};return{root:n.root,elements:o}})},[]),addGroup:i(e=>{n(t=>{let n=`group-${e.id}`;if(!t)return{root:n,elements:{[n]:Z(n,e,[])}};if(t.elements[n])return console.warn(`Group with id "${e.id}" already exists`),t;let r=t.elements[t.root];if(!r)return console.warn(`Root element "${t.root}" not found`),t;let i={...t.elements,[t.root]:{key:r.key,type:r.type,props:r.props,children:[...r.children||[],n],parentKey:r.parentKey},[n]:Z(n,e,[],t.root)};return{root:t.root,elements:i}})},[]),removeGroup:i(e=>{n(t=>{if(!t)return t;let n=`group-${e}`,r=t.elements[n];if(!r||r.type!==`DynamicButtonGroup`)return console.warn(`Group "${e}" not found`),t;if(t.root===n)return console.warn(`Cannot remove root group`),t;let i=new Set([n]),a=e=>{let n=t.elements[e];if(n?.children)for(let e of n.children)i.add(e),a(e)};a(n);let o={};for(let[e,a]of Object.entries(t.elements))i.has(e)||(r.parentKey&&e===r.parentKey?o[e]={key:a.key,type:a.type,props:a.props,children:a.children?.filter(e=>e!==n),parentKey:a.parentKey}:o[e]=a);return Object.values(o).some(e=>e.type===`DynamicButton`)?{root:t.root,elements:o}:null})},[]),clearAll:i(()=>{n(null)},[])}}function Be({messages:e,dynamicUI:t}){let n=c(new Set);o(()=>{for(let r of e)if(r.role===`assistant`){for(let e of r.parts)if(e.type===`tool-manageDynamicUI`&&`state`in e&&e.state===`output-available`&&`output`in e){let r=e.toolCallId;if(n.current.has(r))continue;let i=e.output;i&&Ve(i,t),n.current.add(r)}}},[e,t])}function Ve(e,t){let{operation:n,button:r,buttonId:i,updates:a,group:o,groupId:s}=e;switch(n){case`addButton`:if(r){let{parentGroupId:e,...n}=r;t.addButton(n,e)}break;case`removeButton`:i&&t.removeButton(i);break;case`updateButton`:i&&a&&t.updateButton(i,a);break;case`addGroup`:o&&t.addGroup(o);break;case`removeGroup`:s&&t.removeGroup(s);break;case`clearAll`:t.clearAll();break;default:console.warn(`Unknown DynamicUI operation: ${n}`)}}const He=e.object({id:e.string(),label:e.string(),variant:e.enum([`default`,`destructive`,`outline`,`secondary`,`ghost`]).optional().default(`default`),icon:e.string().optional(),actions:e.array(T)}),Ue=e.object({id:e.string(),label:e.string().optional(),direction:e.enum([`horizontal`,`vertical`]).optional().default(`horizontal`)});function We({element:e,onAction:t}){let n=He.safeParse(e.props??{});if(!n.success)return console.warn(`DynamicButton: Invalid props`,n.error.flatten()),null;let{id:r,label:i,variant:a,icon:o}=n.data,s=()=>{t?.({name:`executeButton`,params:{buttonId:r}})};return m(`button`,{type:`button`,"data-slot":`dynamic-button`,"data-button-id":r,"data-variant":a,onClick:s,className:E(`inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md px-4 py-2 text-sm font-medium transition-colors`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2`,`disabled:pointer-events-none disabled:opacity-50`,a===`default`&&`bg-primary text-primary-foreground shadow hover:bg-primary/90`,a===`secondary`&&`bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80`,a===`outline`&&`border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground`,a===`ghost`&&`hover:bg-accent hover:text-accent-foreground`,a===`destructive`&&`bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90`),children:[o&&p(Ke,{name:o,className:`size-4 shrink-0`}),i]})}function Ge({element:e,children:t}){let n=Ue.safeParse(e.props??{});if(!n.success)return console.warn(`DynamicButtonGroup: Invalid props`,n.error.flatten()),p(f,{children:t});let{direction:r,label:i}=n.data;return i?m(`div`,{"data-slot":`dynamic-button-group`,"data-direction":r,className:E(`flex gap-2`,r===`vertical`?`flex-col`:`flex-row flex-wrap`),children:[p(`span`,{className:`text-sm font-medium text-muted-foreground`,children:i}),t]}):p(f,{children:t})}function Ke({name:e,className:t}){return{plus:m(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,className:t,children:[p(`path`,{d:`M5 12h14`}),p(`path`,{d:`M12 5v14`})]}),trash:m(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,className:t,children:[p(`path`,{d:`M3 6h18`}),p(`path`,{d:`M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6`}),p(`path`,{d:`M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2`})]}),check:p(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,className:t,children:p(`path`,{d:`M20 6 9 17l-5-5`})}),edit:m(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,className:t,children:[p(`path`,{d:`M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z`}),p(`path`,{d:`m15 5 4 4`})]}),refresh:m(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,className:t,children:[p(`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`}),p(`path`,{d:`M21 3v5h-5`}),p(`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`}),p(`path`,{d:`M8 16H3v5`})]}),send:m(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,className:t,children:[p(`path`,{d:`m22 2-7 20-4-9-9-4Z`}),p(`path`,{d:`M22 2 11 13`})]}),list:m(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,className:t,children:[p(`line`,{x1:`8`,x2:`21`,y1:`6`,y2:`6`}),p(`line`,{x1:`8`,x2:`21`,y1:`12`,y2:`12`}),p(`line`,{x1:`8`,x2:`21`,y1:`18`,y2:`18`}),p(`line`,{x1:`3`,x2:`3.01`,y1:`6`,y2:`6`}),p(`line`,{x1:`3`,x2:`3.01`,y1:`12`,y2:`12`}),p(`line`,{x1:`3`,x2:`3.01`,y1:`18`,y2:`18`})]}),star:p(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,className:t,children:p(`polygon`,{points:`12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2`})}),zap:p(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,className:t,children:p(`polygon`,{points:`13 2 3 14 12 14 11 22 21 10 12 10 13 2`})})}[e.toLowerCase()]||null}const Q={DynamicButton:We,DynamicButtonGroup:Ge};function qe(e){return typeof e.id==`string`&&typeof e.label==`string`&&Array.isArray(e.actions)}function Je({className:e}){let{config:t,messages:n,onAction:r}=Ne(),{endUserId:a,availableActions:o}=t,s=ze({storageKey:`mwai-dynamic-ui-${a}`});Be({messages:n,dynamicUI:s});let[c,u]=l(null),d=i(e=>{if(r)for(let t of e)r(t)},[r]),_=i(e=>{if(!s.tree)return;let t=`button-${e}`,n=s.tree.elements[t];n&&n.type===`DynamicButton`&&qe(n.props)&&u(n.props)},[s.tree]),v=i(()=>{u(null)},[]);return s.isLoading||!s.tree?null:m(f,{children:[p(`div`,{"data-slot":`dynamic-ui`,className:E(`flex flex-wrap gap-2`,e),children:p(h,{registry:Q,actionHandlers:{executeButton:({buttonId:e})=>{_(e)}},children:p(g,{tree:s.tree,registry:Q})})}),p(Te,{button:c,availableActions:o,onExecute:d,onClose:v})]})}function Ye({...e}){return p(w.Root,{"data-slot":`drawer`,...e})}function Xe({...e}){return p(w.Trigger,{"data-slot":`drawer-trigger`,...e})}function Ze({...e}){return p(w.Portal,{"data-slot":`drawer-portal`,...e})}function Qe({...e}){return p(w.Close,{"data-slot":`drawer-close`,...e})}function $({className:e,...t}){return p(w.Overlay,{"data-slot":`drawer-overlay`,className:E(`data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 bg-black/10 supports-backdrop-filter:backdrop-blur-xs fixed inset-0 z-50`,e),...t})}function $e({className:e,children:t,overlay:n=!0,...r}){return m(Ze,{"data-slot":`drawer-portal`,children:[n&&p($,{}),m(w.Content,{"data-slot":`drawer-content`,className:E(`bg-background flex h-auto flex-col text-sm`,`data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=bottom]:rounded-t-xl data-[vaul-drawer-direction=bottom]:border-t`,`data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:left-0 data-[vaul-drawer-direction=left]:w-3/4 data-[vaul-drawer-direction=left]:rounded-r-xl data-[vaul-drawer-direction=left]:border-r`,`data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:right-0 data-[vaul-drawer-direction=right]:w-3/4 data-[vaul-drawer-direction=right]:rounded-l-xl data-[vaul-drawer-direction=right]:border-l`,`data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=top]:rounded-b-xl data-[vaul-drawer-direction=top]:border-b`,`data-[vaul-drawer-direction=left]:sm:max-w-sm data-[vaul-drawer-direction=right]:sm:max-w-sm`,`group/drawer-content fixed z-50`,e),...r,children:[p(`div`,{className:`bg-muted mx-auto mt-4 hidden h-1 w-24 shrink-0 rounded-full group-data-[vaul-drawer-direction=bottom]/drawer-content:block`}),t]})]})}function et({className:e,...t}){return p(`div`,{"data-slot":`drawer-header`,className:E(`flex flex-col gap-0.5 p-4`,`group-data-[vaul-drawer-direction=bottom]/drawer-content:text-center`,`group-data-[vaul-drawer-direction=top]/drawer-content:text-center`,`md:gap-0.5 md:text-left`,e),...t})}function tt({className:e,...t}){return p(`div`,{"data-slot":`drawer-footer`,className:E(`mt-auto flex flex-col gap-2 p-4`,e),...t})}function nt({className:e,...t}){return p(w.Title,{"data-slot":`drawer-title`,className:E(`text-foreground text-base font-medium`,e),...t})}function rt({className:e,...t}){return p(w.Description,{"data-slot":`drawer-description`,className:E(`text-muted-foreground text-sm`,e),...t})}function it({className:e,onSubmit:t,children:n,...r}){let i=e=>{e.preventDefault();let n=e.currentTarget,r=new FormData(n).get(`message`)||``;n.reset(),t({text:r},e)};return p(`form`,{"data-slot":`prompt-input`,className:E(`w-full`,e),onSubmit:i,...r,children:p(`div`,{"data-slot":`prompt-input-group`,role:`group`,className:E(`border-input dark:bg-input/30`,`has-[[data-slot=prompt-input-textarea]:focus-visible]:border-ring`,`has-[[data-slot=prompt-input-textarea]:focus-visible]:ring-ring/50`,`has-[[data-slot=prompt-input-textarea]:focus-visible]:ring-[3px]`,`relative flex w-full min-w-0 flex-col overflow-hidden rounded-lg border transition-colors`),children:n})})}function at({onChange:e,className:t,placeholder:n=`What would you like to know?`,...r}){let[i,a]=l(!1),o=e=>{if(e.key===`Enter`){if(i||e.nativeEvent.isComposing||e.shiftKey)return;e.preventDefault();let t=e.currentTarget.form;if(t?.querySelector(`button[type="submit"]`)?.disabled)return;t?.requestSubmit()}};return p(`textarea`,{"data-slot":`prompt-input-textarea`,className:E(`field-sizing-content max-h-48 min-h-16`,`flex-1 resize-none rounded-none border-0 bg-transparent px-3 py-2 text-sm shadow-none ring-0 outline-0`,`placeholder:text-muted-foreground`,`focus-visible:ring-0 focus-visible:outline-none`,`disabled:cursor-not-allowed disabled:opacity-50`,t),name:`message`,onChange:e,onCompositionEnd:()=>a(!1),onCompositionStart:()=>a(!0),onKeyDown:o,placeholder:n,...r})}function ot({className:e,...t}){return p(`div`,{"data-slot":`prompt-input-footer`,className:E(`flex w-full items-center justify-between gap-1 px-2.5 pb-2`,e),...t})}function st({className:e,type:n=`button`,children:r,...i}){let a=t.count(r)>1;return p(`button`,{"data-slot":`prompt-input-button`,type:n,className:E(`inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors`,`hover:bg-accent hover:text-accent-foreground`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2`,`disabled:pointer-events-none disabled:opacity-50`,a?`h-8 px-3`:`size-8`,e),...i,children:r})}function ct({className:e,status:t,icon:n,children:r,...i}){let a=p(y,{className:`size-4`});return t===`submitted`?a=p(b,{className:`size-4 animate-spin`}):t===`streaming`?a=p(S,{className:`size-4`}):t===`error`&&(a=p(ee,{className:`size-4`})),p(`button`,{"data-slot":`prompt-input-submit`,type:`submit`,"aria-label":`Send message`,className:E(`inline-flex size-8 items-center justify-center rounded-md text-sm font-medium transition-colors`,`bg-primary text-primary-foreground shadow`,`hover:bg-primary/90`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2`,`disabled:pointer-events-none disabled:opacity-50`,e),...i,children:r??n??a})}var lt=`/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-500:oklch(63.7% .237 25.331);--color-red-950:oklch(25.8% .092 26.042);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-950:oklch(27.9% .077 45.635);--color-green-50:oklch(98.2% .018 155.826);--color-green-500:oklch(72.3% .219 149.579);--color-green-950:oklch(26.6% .065 152.934);--color-black:#000;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height:calc(1.5/1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--animate-spin:spin 1s linear infinite;--blur-xs:4px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){*{outline-color:color-mix(in oklab,var(--ring)50%,transparent)}}}@layer components;@layer utilities{.visible{visibility:visible}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing)*0)}.z-50{z-index:50}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-auto{margin-top:auto}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-auto{margin-left:auto}.contents{display:contents}.flex{display:flex}.hidden{display:none}.inline-flex{display:inline-flex}.field-sizing-content{field-sizing:content}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-8{width:calc(var(--spacing)*8);height:calc(var(--spacing)*8)}.size-12{width:calc(var(--spacing)*12);height:calc(var(--spacing)*12)}.size-full{width:100%;height:100%}.h-1{height:calc(var(--spacing)*1)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-auto{height:auto}.h-full{height:100%}.max-h-48{max-height:calc(var(--spacing)*48)}.max-h-\\[90vh\\]{max-height:90vh}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-16{min-height:calc(var(--spacing)*16)}.min-h-\\[60px\\]{min-height:60px}.w-24{width:calc(var(--spacing)*24)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-\\[95\\%\\]{max-width:95%}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:calc(var(--spacing)*0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-8{gap:calc(var(--spacing)*8)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}.self-end{align-self:flex-end}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-none{border-radius:0}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-input{border-color:var(--input)}.border-muted{border-color:var(--muted)}.bg-background{background-color:var(--background)}.bg-black\\/10{background-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.bg-black\\/10{background-color:color-mix(in oklab,var(--color-black)10%,transparent)}}.bg-black\\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-card{background-color:var(--card)}.bg-destructive{background-color:var(--destructive)}.bg-muted{background-color:var(--muted)}.bg-primary{background-color:var(--primary)}.bg-secondary{background-color:var(--secondary)}.bg-transparent{background-color:#0000}.p-4{padding:calc(var(--spacing)*4)}.p-8{padding:calc(var(--spacing)*8)}.px-1\\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2\\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.py-0\\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-4{padding-top:calc(var(--spacing)*4)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pl-4{padding-left:calc(var(--spacing)*4)}.text-center{text-align:center}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-none{--tw-leading:1;line-height:1}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.whitespace-nowrap{white-space:nowrap}.text-card-foreground{color:var(--card-foreground)}.text-destructive{color:var(--destructive)}.text-foreground{color:var(--foreground)}.text-muted-foreground{color:var(--muted-foreground)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary-foreground{color:var(--primary-foreground)}.text-secondary-foreground{color:var(--secondary-foreground)}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.outline-0{outline-style:var(--tw-outline-style);outline-width:0}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}.group-data-\\[state\\=open\\]\\:rotate-180:is(:where(.group)[data-state=open] *){rotate:180deg}.group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:block:is(:where(.group\\/drawer-content)[data-vaul-drawer-direction=bottom] *){display:block}.group-data-\\[vaul-drawer-direction\\=bottom\\]\\/drawer-content\\:text-center:is(:where(.group\\/drawer-content)[data-vaul-drawer-direction=bottom] *),.group-data-\\[vaul-drawer-direction\\=top\\]\\/drawer-content\\:text-center:is(:where(.group\\/drawer-content)[data-vaul-drawer-direction=top] *){text-align:center}.group-\\[\\.is-assistant\\]\\:text-foreground:is(:where(.group).is-assistant *){color:var(--foreground)}.group-\\[\\.is-user\\]\\:ml-auto:is(:where(.group).is-user *){margin-left:auto}.group-\\[\\.is-user\\]\\:rounded-lg:is(:where(.group).is-user *){border-radius:var(--radius)}.group-\\[\\.is-user\\]\\:bg-secondary:is(:where(.group).is-user *){background-color:var(--secondary)}.group-\\[\\.is-user\\]\\:px-4:is(:where(.group).is-user *){padding-inline:calc(var(--spacing)*4)}.group-\\[\\.is-user\\]\\:py-3:is(:where(.group).is-user *){padding-block:calc(var(--spacing)*3)}.group-\\[\\.is-user\\]\\:text-foreground:is(:where(.group).is-user *){color:var(--foreground)}.peer-disabled\\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.placeholder\\:text-muted-foreground::placeholder{color:var(--muted-foreground)}@media (hover:hover){.hover\\:bg-accent:hover{background-color:var(--accent)}.hover\\:bg-destructive\\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-destructive\\/90:hover{background-color:color-mix(in oklab,var(--destructive)90%,transparent)}}.hover\\:bg-primary\\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab,var(--primary)90%,transparent)}}.hover\\:bg-secondary\\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-secondary\\/80:hover{background-color:color-mix(in oklab,var(--secondary)80%,transparent)}}.hover\\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\\:text-foreground:hover{color:var(--foreground)}}.focus-visible\\:ring-0:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\\:ring-ring:focus-visible{--tw-ring-color:var(--ring)}.focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\\:pointer-events-none:disabled{pointer-events:none}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:opacity-50:disabled{opacity:.5}.has-\\[\\[data-slot\\=prompt-input-textarea\\]\\:focus-visible\\]\\:border-ring:has([data-slot=prompt-input-textarea]:focus-visible){border-color:var(--ring)}.has-\\[\\[data-slot\\=prompt-input-textarea\\]\\:focus-visible\\]\\:ring-\\[3px\\]:has([data-slot=prompt-input-textarea]:focus-visible){--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.has-\\[\\[data-slot\\=prompt-input-textarea\\]\\:focus-visible\\]\\:ring-ring\\/50:has([data-slot=prompt-input-textarea]:focus-visible){--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.has-\\[\\[data-slot\\=prompt-input-textarea\\]\\:focus-visible\\]\\:ring-ring\\/50:has([data-slot=prompt-input-textarea]:focus-visible){--tw-ring-color:color-mix(in oklab,var(--ring)50%,transparent)}}.data-\\[approved\\=false\\]\\:border-red-500\\/50[data-approved=false]{border-color:#fb2c3680}@supports (color:color-mix(in lab, red, red)){.data-\\[approved\\=false\\]\\:border-red-500\\/50[data-approved=false]{border-color:color-mix(in oklab,var(--color-red-500)50%,transparent)}}.data-\\[approved\\=false\\]\\:bg-red-50\\/50[data-approved=false]{background-color:#fef2f280}@supports (color:color-mix(in lab, red, red)){.data-\\[approved\\=false\\]\\:bg-red-50\\/50[data-approved=false]{background-color:color-mix(in oklab,var(--color-red-50)50%,transparent)}}.data-\\[approved\\=true\\]\\:border-green-500\\/50[data-approved=true]{border-color:#00c75880}@supports (color:color-mix(in lab, red, red)){.data-\\[approved\\=true\\]\\:border-green-500\\/50[data-approved=true]{border-color:color-mix(in oklab,var(--color-green-500)50%,transparent)}}.data-\\[approved\\=true\\]\\:bg-green-50\\/50[data-approved=true]{background-color:#f0fdf480}@supports (color:color-mix(in lab, red, red)){.data-\\[approved\\=true\\]\\:bg-green-50\\/50[data-approved=true]{background-color:color-mix(in oklab,var(--color-green-50)50%,transparent)}}.data-\\[state\\=approval-requested\\]\\:border-amber-500\\/50[data-state=approval-requested]{border-color:#f99c0080}@supports (color:color-mix(in lab, red, red)){.data-\\[state\\=approval-requested\\]\\:border-amber-500\\/50[data-state=approval-requested]{border-color:color-mix(in oklab,var(--color-amber-500)50%,transparent)}}.data-\\[state\\=approval-requested\\]\\:bg-amber-50\\/50[data-state=approval-requested]{background-color:#fffbeb80}@supports (color:color-mix(in lab, red, red)){.data-\\[state\\=approval-requested\\]\\:bg-amber-50\\/50[data-state=approval-requested]{background-color:color-mix(in oklab,var(--color-amber-50)50%,transparent)}}.data-\\[vaul-drawer-direction\\=bottom\\]\\:inset-x-0[data-vaul-drawer-direction=bottom]{inset-inline:calc(var(--spacing)*0)}.data-\\[vaul-drawer-direction\\=bottom\\]\\:bottom-0[data-vaul-drawer-direction=bottom]{bottom:calc(var(--spacing)*0)}.data-\\[vaul-drawer-direction\\=bottom\\]\\:mt-24[data-vaul-drawer-direction=bottom]{margin-top:calc(var(--spacing)*24)}.data-\\[vaul-drawer-direction\\=bottom\\]\\:max-h-\\[80vh\\][data-vaul-drawer-direction=bottom]{max-height:80vh}.data-\\[vaul-drawer-direction\\=bottom\\]\\:rounded-t-xl[data-vaul-drawer-direction=bottom]{border-top-left-radius:calc(var(--radius) + 4px);border-top-right-radius:calc(var(--radius) + 4px)}.data-\\[vaul-drawer-direction\\=bottom\\]\\:border-t[data-vaul-drawer-direction=bottom]{border-top-style:var(--tw-border-style);border-top-width:1px}.data-\\[vaul-drawer-direction\\=left\\]\\:inset-y-0[data-vaul-drawer-direction=left]{inset-block:calc(var(--spacing)*0)}.data-\\[vaul-drawer-direction\\=left\\]\\:left-0[data-vaul-drawer-direction=left]{left:calc(var(--spacing)*0)}.data-\\[vaul-drawer-direction\\=left\\]\\:w-3\\/4[data-vaul-drawer-direction=left]{width:75%}.data-\\[vaul-drawer-direction\\=left\\]\\:rounded-r-xl[data-vaul-drawer-direction=left]{border-top-right-radius:calc(var(--radius) + 4px);border-bottom-right-radius:calc(var(--radius) + 4px)}.data-\\[vaul-drawer-direction\\=left\\]\\:border-r[data-vaul-drawer-direction=left]{border-right-style:var(--tw-border-style);border-right-width:1px}.data-\\[vaul-drawer-direction\\=right\\]\\:inset-y-0[data-vaul-drawer-direction=right]{inset-block:calc(var(--spacing)*0)}.data-\\[vaul-drawer-direction\\=right\\]\\:right-0[data-vaul-drawer-direction=right]{right:calc(var(--spacing)*0)}.data-\\[vaul-drawer-direction\\=right\\]\\:w-3\\/4[data-vaul-drawer-direction=right]{width:75%}.data-\\[vaul-drawer-direction\\=right\\]\\:rounded-l-xl[data-vaul-drawer-direction=right]{border-top-left-radius:calc(var(--radius) + 4px);border-bottom-left-radius:calc(var(--radius) + 4px)}.data-\\[vaul-drawer-direction\\=right\\]\\:border-l[data-vaul-drawer-direction=right]{border-left-style:var(--tw-border-style);border-left-width:1px}.data-\\[vaul-drawer-direction\\=top\\]\\:inset-x-0[data-vaul-drawer-direction=top]{inset-inline:calc(var(--spacing)*0)}.data-\\[vaul-drawer-direction\\=top\\]\\:top-0[data-vaul-drawer-direction=top]{top:calc(var(--spacing)*0)}.data-\\[vaul-drawer-direction\\=top\\]\\:mb-24[data-vaul-drawer-direction=top]{margin-bottom:calc(var(--spacing)*24)}.data-\\[vaul-drawer-direction\\=top\\]\\:max-h-\\[80vh\\][data-vaul-drawer-direction=top]{max-height:80vh}.data-\\[vaul-drawer-direction\\=top\\]\\:rounded-b-xl[data-vaul-drawer-direction=top]{border-bottom-right-radius:calc(var(--radius) + 4px);border-bottom-left-radius:calc(var(--radius) + 4px)}.data-\\[vaul-drawer-direction\\=top\\]\\:border-b[data-vaul-drawer-direction=top]{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}@supports ((-webkit-backdrop-filter:var(--tw)) or (backdrop-filter:var(--tw))){.supports-backdrop-filter\\:backdrop-blur-xs{--tw-backdrop-blur:blur(var(--blur-xs));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}}@media (min-width:40rem){.data-\\[vaul-drawer-direction\\=left\\]\\:sm\\:max-w-sm[data-vaul-drawer-direction=left],.data-\\[vaul-drawer-direction\\=right\\]\\:sm\\:max-w-sm[data-vaul-drawer-direction=right]{max-width:var(--container-sm)}}@media (min-width:48rem){.md\\:gap-0\\.5{gap:calc(var(--spacing)*.5)}.md\\:text-left{text-align:left}}.dark\\:bg-input\\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\\:bg-input\\/30:is(.dark *){background-color:color-mix(in oklab,var(--input)30%,transparent)}}.dark\\:data-\\[approved\\=false\\]\\:bg-red-950\\/20:is(.dark *)[data-approved=false]{background-color:#46080933}@supports (color:color-mix(in lab, red, red)){.dark\\:data-\\[approved\\=false\\]\\:bg-red-950\\/20:is(.dark *)[data-approved=false]{background-color:color-mix(in oklab,var(--color-red-950)20%,transparent)}}.dark\\:data-\\[approved\\=true\\]\\:bg-green-950\\/20:is(.dark *)[data-approved=true]{background-color:#032e1533}@supports (color:color-mix(in lab, red, red)){.dark\\:data-\\[approved\\=true\\]\\:bg-green-950\\/20:is(.dark *)[data-approved=true]{background-color:color-mix(in oklab,var(--color-green-950)20%,transparent)}}.dark\\:data-\\[state\\=approval-requested\\]\\:bg-amber-950\\/20:is(.dark *)[data-state=approval-requested]{background-color:#46190133}@supports (color:color-mix(in lab, red, red)){.dark\\:data-\\[state\\=approval-requested\\]\\:bg-amber-950\\/20:is(.dark *)[data-state=approval-requested]{background-color:color-mix(in oklab,var(--color-amber-950)20%,transparent)}}.\\[\\&\\>\\*\\:first-child\\]\\:mt-0>:first-child{margin-top:calc(var(--spacing)*0)}.\\[\\&\\>\\*\\:last-child\\]\\:mb-0>:last-child{margin-bottom:calc(var(--spacing)*0)}}.assistant-root{--radius:.625rem;--background:oklch(100% 0 0);--foreground:oklch(14.5% 0 0);--card:oklch(100% 0 0);--card-foreground:oklch(14.5% 0 0);--popover:oklch(100% 0 0);--popover-foreground:oklch(14.5% 0 0);--primary:oklch(20.5% 0 0);--primary-foreground:oklch(98.5% 0 0);--secondary:oklch(97% 0 0);--secondary-foreground:oklch(20.5% 0 0);--muted:oklch(97% 0 0);--muted-foreground:oklch(55.6% 0 0);--accent:oklch(97% 0 0);--accent-foreground:oklch(20.5% 0 0);--destructive:oklch(57.7% .245 27.325);--border:oklch(92.2% 0 0);--input:oklch(92.2% 0 0);--ring:oklch(70.8% 0 0);color:var(--foreground);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:0 0;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;line-height:1.5}.assistant-root.dark{--background:oklch(14.5% 0 0);--foreground:oklch(98.5% 0 0);--card:oklch(20.5% 0 0);--card-foreground:oklch(98.5% 0 0);--popover:oklch(20.5% 0 0);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(92.2% 0 0);--primary-foreground:oklch(20.5% 0 0);--secondary:oklch(26.9% 0 0);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(26.9% 0 0);--muted-foreground:oklch(70.8% 0 0);--accent:oklch(26.9% 0 0);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(70.4% .191 22.216);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(55.6% 0 0)}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}`;function ut({children:e,className:t,theme:n,...r}){let i=c(null),[a,s]=l(null),[u,d]=l(`light`);o(()=>{if(n!==void 0)return;let e=()=>{d(document.documentElement.classList.contains(`dark`)?`dark`:`light`)};e();let t=new MutationObserver(e);return t.observe(document.documentElement,{attributes:!0,attributeFilter:[`class`]}),()=>t.disconnect()},[n]),o(()=>{if(i.current&&!i.current.shadowRoot){let e=i.current.attachShadow({mode:`open`}),t=new CSSStyleSheet;t.replaceSync(lt),e.adoptedStyleSheets=[t],s(e)}},[]);let f=n??u;return p(`div`,{ref:i,"data-slot":`assistant-root-host`,className:E(`assistant-root-host`,t),...r,children:a&&ie(p(`div`,{className:E(`assistant-root flex flex-col h-full min-h-0`,f===`dark`&&`dark`),children:e}),a)})}export{P as $,Se as A,K as B,Me as C,Oe as D,ke as E,X as F,B as G,V as H,q as I,L as J,R as K,fe as L,we as M,ye as N,Te as O,J as P,j as Q,Y as R,ze as S,Ae as T,H as U,G as V,U as W,z as X,I as Y,O as Z,Je as _,ct as a,oe as at,Q as b,Qe as c,se as ct,tt as d,N as et,et as f,Xe as g,nt as h,ot as i,E as it,Ce as j,xe as k,$e as l,T as lt,Ze as m,it as n,A as nt,at as o,ae as ot,$ as p,F as q,st as r,k as rt,Ye as s,ce as st,ut as t,M as tt,rt as u,Ge as v,Ne as w,Be as x,We as y,W as z};
@@ -0,0 +1,42 @@
1
+ import { s as CreateAssistantTokenHandlerOptions } from "../types-C7I0JuqF.js";
2
+
3
+ //#region src/assistant-nextjs/api.d.ts
4
+ /**
5
+ * Creates a Next.js API route handler for generating assistant tokens
6
+ *
7
+ * This handler securely generates ephemeral tokens for the assistant.
8
+ * The browser never sees your API key - it only receives short-lived tokens.
9
+ *
10
+ * If no getEndUserId function is provided, an anonymous user ID will be
11
+ * auto-generated for each session.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * // app/api/mwai/token/route.ts
16
+ * import { createAssistantTokenHandler } from "modifywithai/nextjs"
17
+ *
18
+ * export const POST = createAssistantTokenHandler({
19
+ * appId: process.env.MWAI_APP_ID!,
20
+ * // Optional: apiKey defaults to process.env.MWAI_API_KEY
21
+ * // Optional: apiUrl defaults to https://api.modifywithai.com
22
+ * })
23
+ * ```
24
+ *
25
+ * @example With custom user identification
26
+ * ```ts
27
+ * // app/api/mwai/token/route.ts
28
+ * import { createAssistantTokenHandler } from "modifywithai/nextjs"
29
+ * import { auth } from "@/lib/auth"
30
+ *
31
+ * export const POST = createAssistantTokenHandler({
32
+ * appId: process.env.MWAI_APP_ID!,
33
+ * getEndUserId: async (request) => {
34
+ * const session = await auth()
35
+ * return session?.user?.id ?? null
36
+ * },
37
+ * })
38
+ * ```
39
+ */
40
+ declare function createAssistantTokenHandler(options: CreateAssistantTokenHandlerOptions): (request: Request) => Promise<Response>;
41
+ //#endregion
42
+ export { type CreateAssistantTokenHandlerOptions, createAssistantTokenHandler };
@@ -0,0 +1 @@
1
+ import{t as e}from"../utils-DQD-DMi0.js";function t(t){let{appId:n,apiKey:r=process.env.MWAI_API_KEY,apiUrl:i=`https://api.modifywithai.com`,getEndUserId:a}=t;return async function(t){if(!n)return new Response(JSON.stringify({error:`Server configuration error: missing appId`}),{status:500,headers:{"Content-Type":`application/json`}});if(!r)return new Response(JSON.stringify({error:`Server configuration error: missing apiKey`}),{status:500,headers:{"Content-Type":`application/json`}});try{let o=await t.json(),{availableActions:s,context:c}=o,l=null;l=a?await a(t):o.endUserId,l||=e(`autogen`);let u=await fetch(`${i}/api/assistant/token`,{method:`POST`,headers:{"Content-Type":`application/json`,"x-api-key":r},body:JSON.stringify({appId:n,endUserId:l,availableActions:s,context:c})});if(!u.ok){let e=await u.json().catch(()=>({}));return new Response(JSON.stringify({error:e.error||`Failed to generate token`}),{status:u.status,headers:{"Content-Type":`application/json`}})}let{token:d,expiresAt:f}=await u.json();return new Response(JSON.stringify({token:d,expiresAt:f}),{status:200,headers:{"Content-Type":`application/json`}})}catch(e){return console.error(`Token generation error:`,e),new Response(JSON.stringify({error:`Internal server error`}),{status:500,headers:{"Content-Type":`application/json`}})}}}export{t as createAssistantTokenHandler};
@@ -0,0 +1,46 @@
1
+ import { s as CreateAssistantTokenHandlerOptions } from "../types-C7I0JuqF.js";
2
+
3
+ //#region src/assistant-remix/api.d.ts
4
+ /**
5
+ * Creates a Remix action handler for generating assistant tokens
6
+ *
7
+ * This handler securely generates ephemeral tokens for the assistant.
8
+ * The browser never sees your API key - it only receives short-lived tokens.
9
+ *
10
+ * If no getEndUserId function is provided, an anonymous user ID will be
11
+ * auto-generated for each session.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * // app/routes/api.mwai.token.ts
16
+ * import { createAssistantTokenAction } from "modifywithai/remix"
17
+ *
18
+ * export const action = createAssistantTokenAction({
19
+ * appId: process.env.MWAI_APP_ID!,
20
+ * // Optional: apiKey defaults to process.env.MWAI_API_KEY
21
+ * // Optional: apiUrl defaults to https://api.modifywithai.com
22
+ * })
23
+ * ```
24
+ *
25
+ * @example With custom user identification
26
+ * ```ts
27
+ * // app/routes/api.mwai.token.ts
28
+ * import { createAssistantTokenAction } from "modifywithai/remix"
29
+ * import { getSession } from "@/lib/auth.server"
30
+ *
31
+ * export const action = createAssistantTokenAction({
32
+ * appId: process.env.MWAI_APP_ID!,
33
+ * getEndUserId: async (request) => {
34
+ * const session = await getSession(request)
35
+ * return session?.userId ?? null
36
+ * },
37
+ * })
38
+ * ```
39
+ */
40
+ declare function createAssistantTokenAction(options: CreateAssistantTokenHandlerOptions): ({
41
+ request
42
+ }: {
43
+ request: Request;
44
+ }) => Promise<Response>;
45
+ //#endregion
46
+ export { type CreateAssistantTokenHandlerOptions, createAssistantTokenAction };
@@ -0,0 +1 @@
1
+ import{t as e}from"../utils-DQD-DMi0.js";function t(t){let{appId:n,apiKey:r=process.env.MWAI_API_KEY,apiUrl:i=`https://api.modifywithai.com`,getEndUserId:a}=t;return async function({request:t}){if(!n)return Response.json({error:`Server configuration error: missing appId`},{status:500});if(!r)return Response.json({error:`Server configuration error: missing apiKey`},{status:500});try{let o=await t.json(),{availableActions:s,context:c}=o,l=null;l=a?await a(t):o.endUserId,l||=e(`autogen`);let u=await fetch(`${i}/api/assistant/token`,{method:`POST`,headers:{"Content-Type":`application/json`,"x-api-key":r},body:JSON.stringify({appId:n,endUserId:l,availableActions:s,context:c})});if(!u.ok){let e=await u.json().catch(()=>({}));return Response.json({error:e.error||`Failed to generate token`},{status:u.status})}let{token:d,expiresAt:f}=await u.json();return Response.json({token:d,expiresAt:f},{status:200})}catch(e){return console.error(`Token generation error:`,e),Response.json({error:`Internal server error`},{status:500})}}}export{t as createAssistantTokenAction};
@@ -0,0 +1,56 @@
1
+ import { s as CreateAssistantTokenHandlerOptions } from "../types-C7I0JuqF.js";
2
+
3
+ //#region src/assistant-tanstack-start/api.d.ts
4
+ /**
5
+ * Creates a TanStack Start API route handler for generating assistant tokens
6
+ *
7
+ * This handler securely generates ephemeral tokens for the assistant.
8
+ * The browser never sees your API key - it only receives short-lived tokens.
9
+ *
10
+ * If no getEndUserId function is provided, an anonymous user ID will be
11
+ * auto-generated for each session.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * // app/routes/api/mwai/token.ts
16
+ * import { createAPIFileRoute } from "@tanstack/react-start/api"
17
+ * import { createAssistantTokenHandler } from "modifywithai/tanstack-start"
18
+ *
19
+ * const handler = createAssistantTokenHandler({
20
+ * appId: process.env.MWAI_APP_ID!,
21
+ * // Optional: apiKey defaults to process.env.MWAI_API_KEY
22
+ * // Optional: apiUrl defaults to https://api.modifywithai.com
23
+ * })
24
+ *
25
+ * export const APIRoute = createAPIFileRoute("/api/mwai/token")({
26
+ * POST: handler,
27
+ * })
28
+ * ```
29
+ *
30
+ * @example With custom user identification
31
+ * ```ts
32
+ * // app/routes/api/mwai/token.ts
33
+ * import { createAPIFileRoute } from "@tanstack/react-start/api"
34
+ * import { createAssistantTokenHandler } from "modifywithai/tanstack-start"
35
+ * import { getSession } from "@/lib/auth"
36
+ *
37
+ * const handler = createAssistantTokenHandler({
38
+ * appId: process.env.MWAI_APP_ID!,
39
+ * getEndUserId: async (request) => {
40
+ * const session = await getSession(request)
41
+ * return session?.userId ?? null
42
+ * },
43
+ * })
44
+ *
45
+ * export const APIRoute = createAPIFileRoute("/api/mwai/token")({
46
+ * POST: handler,
47
+ * })
48
+ * ```
49
+ */
50
+ declare function createAssistantTokenHandler(options: CreateAssistantTokenHandlerOptions): ({
51
+ request
52
+ }: {
53
+ request: Request;
54
+ }) => Promise<Response>;
55
+ //#endregion
56
+ export { type CreateAssistantTokenHandlerOptions, createAssistantTokenHandler };
@@ -0,0 +1 @@
1
+ import{t as e}from"../utils-DQD-DMi0.js";function t(t){let{appId:n,apiKey:r=process.env.MWAI_API_KEY,apiUrl:i=`https://api.modifywithai.com`,getEndUserId:a}=t;return async function({request:t}){if(!n)return Response.json({error:`Server configuration error: missing appId`},{status:500});if(!r)return Response.json({error:`Server configuration error: missing apiKey`},{status:500});try{let o=await t.json(),{availableActions:s,context:c}=o,l=null;l=a?await a(t):o.endUserId,l||=e(`autogen`);let u=await fetch(`${i}/api/assistant/token`,{method:`POST`,headers:{"Content-Type":`application/json`,"x-api-key":r},body:JSON.stringify({appId:n,endUserId:l,availableActions:s,context:c})});if(!u.ok){let e=await u.json().catch(()=>({}));return Response.json({error:e.error||`Failed to generate token`},{status:u.status})}let{token:d,expiresAt:f}=await u.json();return Response.json({token:d,expiresAt:f},{status:200})}catch(e){return console.error(`Token generation error:`,e),Response.json({error:`Internal server error`},{status:500})}}}export{t as createAssistantTokenHandler};