codicent-app-sdk 0.7.2 → 0.7.9

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.
@@ -1 +1 @@
1
- import{jsx as o,jsxs as e}from"react/jsx-runtime";import{useState as t,useRef as n,useCallback as i,useEffect as r,useMemo as a}from"react";import{makeStyles as s,shorthands as m,tokens as p,Text as l,Spinner as c,Card as d,Button as u,MessageBar as g,MessageBarBody as h}from"@fluentui/react-components";import{ArrowLeft24Regular as j}from"@fluentui/react-icons";import{CodicentService as f}from"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import x from"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import S from"../components/VoiceIcon.js";import v from"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as y}from"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{isMobileDevice as k}from"../utils/device.js";import"exceljs";import"../components/FileThumbnail.js";import w from"../components/MessageInput.js";import b from"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as A}from"../components/Page.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import C from"../hooks/useLocalization.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";import"../components/audit/AuditCircularProgress.js";import"../components/audit/AuditHorizontalProgress.js";import"../components/audit/AuditRoleIndicator.js";import"../components/audit/AuditUnitSwitcher.js";import"../components/audit/AuditAnswerCell.js";import"../components/audit/AuditSearchBar.js";import"../components/audit/AuditFilterChips.js";import"../components/audit/AuditFilterBar.js";import"../components/audit/AuditGroupsProgress.js";import"../components/audit/AuditSummaryDashboard.js";import"../components/audit/AuditRequirementDialog.js";import"../components/audit/AuditUnitExportDialog.js";import"../components/audit/AuditUnitImportDialog.js";import"../components/audit/AuditBulkExportDialog.js";import"../components/audit/AuditBulkUploadDialog.js";import"../components/audit/AuditSortPresets.js";import"./AppFrame.js";import"./Canvas.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Menu.js";import"./Log.js";import"./Login.js";import"./Home.js";import"./ListPage.js";import"./CrmPage.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import{useNavigate as M,useSearchParams as N}from"react-router-dom";import"./Purchase.js";import"./QrScan.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import D from"../hooks/useToaster.js";import{l as I}from"../node_modules/lodash/lodash.js";const B=s({main:{flexGrow:1,...m.padding("10px"),overflowY:"auto"},container:{display:"flex",flexDirection:"row",height:"100%",...m.gap("16px"),...m.padding("10px")},containerMobile:{display:"flex",flexDirection:"column",height:"100%",...m.gap("16px"),...m.padding("10px")},inputSection:{display:"flex",flexDirection:"column",flexGrow:1,maxWidth:"640px",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",position:"relative"},inputSectionMobile:{display:"flex",flexDirection:"column",width:"100%",position:"relative"},historySection:{flexBasis:"300px",flexShrink:0,display:"flex",flexDirection:"column",...m.gap("8px"),overflowY:"auto",...m.padding("8px")},historySectionMobile:{display:"flex",flexDirection:"column",...m.gap("8px"),overflowY:"auto",...m.padding("8px"),maxHeight:"300px"},historyCard:{...m.padding("12px"),cursor:"pointer","&:hover":{backgroundColor:p.colorNeutralBackground1Hover}},historyCardContent:{display:"flex",flexDirection:"column",...m.gap("4px")},historyDate:{fontSize:p.fontSizeBase200,color:p.colorNeutralForeground3},historyText:{fontSize:p.fontSizeBase300,wordBreak:"break-word",whiteSpace:"pre-wrap",maxHeight:"100px",overflow:"hidden",textOverflow:"ellipsis"},review:{padding:"10px",wordBreak:"break-word",whiteSpace:"pre-line",maxWidth:"100%",overflowWrap:"break-word"},voiceIcon:{position:"absolute",top:"20px",right:"12px",zIndex:1001,cursor:"pointer"},historyTitle:{fontSize:p.fontSizeBase400,fontWeight:p.fontWeightSemibold,marginBottom:"8px"},emptyState:{textAlign:"center",color:p.colorNeutralForeground3,padding:"20px"},backButton:{marginBottom:"10px"}}),T=({state:s,voice:m})=>{const p=B(),{t:T}=C(),U=M(),[P,E]=t(!1),F=n(null),_=n(null),$=n(null),[L]=t(null),[O,R]=t([]),{service:z}=s,[H,V]=N(),[W,G]=t(""),[J,Q]=t(void 0),Y=D(),[q,K]=t(void 0),[X,Z]=t("info"),[oo,eo]=t([]),[to,no]=t(!1),io=k(),ro=i((o=>{for(const e of o)z.getFileInfo(e).then((o=>{R((e=>[...e,o]))}))}),[z,R]),ao=i((o=>{const e=new FormData;e.append("file",o),z.uploadFile(o.name,e).then((o=>{ro([o])})).catch((()=>{Y.notify(T("Error"),T("Error uploading pasted image"),"")}))}),[z,ro,Y,T]),so=o=>{E(o)},mo=i((async()=>{no(!0);try{const o=await z.getMessages(["crm"]);eo(o)}catch(o){console.error("Error loading CRM messages:",o),Y.notify(T("Error"),T("Failed to load CRM messages"),"","error")}finally{no(!1)}}),[z,Y,T]);r((()=>{mo()}),[mo]),r((()=>{const o=H.get("text"),e=H.get("url");o&&(G(o),H.delete("text")),e&&(H.delete("url"),G(((o||"")+" "+e).trim())),V(H,{replace:!0})}),[H,V,G,z,ro]);const po=o=>{o=`${o=`#crm\n${o.replace("#log ","")}\nSALESPERSON: ${s.context.name||s.context.user?.email||s.context.nickname||"-"}`}${L?" "+L:""}${O.length>0?"\n":""}${O.map((o=>`#file:${o.id}`)).join(" ")}`,z.sendMessage(o).then((()=>{Y.notify(T("Meddelande"),T("Meddelandet är sparat."),""),mo(),Q(""),K(void 0)}))},lo=i((async o=>{if(!o||o.length<10)return;K(T("Analyserar...")),Z("info");const e=await z.chat((o=>`Skapa kort ja/nej-status över hur CRM-aktiviteten som följer, givet dessa punkter: \n1. Namn på kunden finns med? ja/nej \n2. Syftet med mötet finns (varför träffar du kunden, kan täckas av 3 nedan) ja/nej\n3. Vad som framkommer under mötet (viktiga punkter och diskussioner) ja/nej\n4. Nästa steg finns med (hur ni kommer att träffas igen, och om något har sålts) ja/nej. \n\nSvara endast med ja/nej för varje punkt, ett svar per rad i följande exempel i JSON-format:\n{\n "customerName": "true",\n "purpose": "false",\n "meetingNotes": "true",\n "nextSteps": "false",\n "shortSummary": "Syfte med mötet och nästa steg saknas."\n}\n\n---\nTEXT:\n\n${o}`)(o));if(e){const o=new v(e.content);try{const e=JSON.parse(o.content);console.log("json",e);let t=0;for(const o in e)"true"===e[o]&&t++;K(T(4===t?"Allt är med":e.shortSummary||"Något saknas")),Z(4===t?"success":"warning")}catch{K("Error: "+o.content),Z("error")}}}),[z,T]),co=a((()=>I.debounce(lo,2e3)),[lo]);r((()=>()=>{co.cancel()}),[co]);const uo=o=>{const e=new Date,t=new Date(o),n=e.getTime()-t.getTime(),i=Math.floor(n/6e4),r=Math.floor(n/36e5),a=Math.floor(n/864e5);return i<1?T("Just now"):i<60?`${i} ${T("minutes ago")}`:r<24?`${r} ${T("hours ago")}`:a<7?`${a} ${T("days ago")}`:t.toLocaleDateString()},go=o=>{const e=o.split("\n").filter((o=>!o.startsWith("#")&&!o.startsWith("SALESPERSON:")&&o.trim().length>0)).join("\n");return e.substring(0,150)+(e.length>150?"...":"")},ho=()=>e("div",{className:io?p.historySectionMobile:p.historySection,children:[o(l,{className:p.historyTitle,children:T("Tidigare sparade")}),to?o("div",{className:p.emptyState,children:o(c,{size:"small"})}):0===oo.length?o("div",{className:p.emptyState,children:o(l,{children:T("Inga sparade meddelanden än")})}):oo.map((t=>o(d,{className:p.historyCard,onClick:()=>(o=>{const e=go(o.content);Q(e)})(t),children:e("div",{className:p.historyCardContent,children:[o(l,{className:p.historyDate,children:uo(t.createdAt)}),o(l,{className:p.historyText,children:go(t.content)})]})},t.id)))]});return o(A,{hideHeader:!0,children:e("div",{className:io?p.containerMobile:p.container,children:[!io&&ho(),e("div",{className:io?p.inputSectionMobile:p.inputSection,style:io?void 0:{backgroundImage:`url(${y("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:[m&&y("SHOW_VOICE_BUTTON")&&o("div",{className:p.voiceIcon,children:o(S,{voice:m})}),o("div",{className:p.backButton,children:o(u,{appearance:"subtle",icon:o(j,{}),onClick:()=>U(-1),children:T("Tillbaka")})}),o(x,{title:y("APP_SAVE_TITLE")?T(y("APP_SAVE_TITLE")):T("Spara")}),o(w,{defaultText:W,onSend:po,files:O,onFilesChange:R,isUploading:P,onUploadImage:()=>{_.current?.triggerUpload()},onUploadCamera:()=>{$.current?.triggerUpload()},getImageUrl:f.getImageUrl,hasLocation:!!L,disableSend:!0,rows:9,placeholder:T("Beskriv CRM-aktivitet här..."),onChange:o=>{o!==J&&(Q(o),o&&o.trim().length>0?co(o):(K(void 0),co.cancel()))},onImagePasted:ao}),q&&e("div",{className:p.review,children:[o("h3",{children:T("Analys")}),o(g,{intent:X,layout:"multiline",children:o(h,{children:T(q)})})]}),o(b,{ref:F,onFileUploaded:ro,onUploading:so,multiple:!0,codicentService:z}),o(b,{codicentService:z,ref:_,onFileUploaded:ro,onUploading:so,multiple:!0,accept:"image/*"}),o(b,{codicentService:z,ref:$,onFileUploaded:ro,onUploading:so,multiple:!0,accept:"image/*",capture:"environment"})]}),io&&ho()]})})};export{T as CrmPagePersistent,T as default};
1
+ import{jsxs as o,jsx as e}from"react/jsx-runtime";import{useState as t,useRef as n,useCallback as i,useEffect as r,useMemo as a}from"react";import{makeStyles as s,shorthands as l,tokens as p,Text as m,Button as c,Spinner as d,Card as u,MessageBar as g,MessageBarBody as h}from"@fluentui/react-components";import{ArrowLeft24Regular as f}from"@fluentui/react-icons";import{CodicentService as j}from"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import x from"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import S from"../components/VoiceIcon.js";import v from"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as y}from"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{isMobileDevice as k}from"../utils/device.js";import"exceljs";import"../components/FileThumbnail.js";import w from"../components/MessageInput.js";import b from"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as C}from"../components/Page.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import A from"../hooks/useLocalization.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";import"../components/audit/AuditCircularProgress.js";import"../components/audit/AuditHorizontalProgress.js";import"../components/audit/AuditRoleIndicator.js";import"../components/audit/AuditUnitSwitcher.js";import"../components/audit/AuditAnswerCell.js";import"../components/audit/AuditSearchBar.js";import"../components/audit/AuditFilterChips.js";import"../components/audit/AuditFilterBar.js";import"../components/audit/AuditGroupsProgress.js";import"../components/audit/AuditSummaryDashboard.js";import"../components/audit/AuditRequirementDialog.js";import"../components/audit/AuditUnitExportDialog.js";import"../components/audit/AuditUnitImportDialog.js";import"../components/audit/AuditBulkExportDialog.js";import"../components/audit/AuditBulkUploadDialog.js";import"../components/audit/AuditSortPresets.js";import"./AppFrame.js";import"./Canvas.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Menu.js";import"./Log.js";import"./Login.js";import"./Home.js";import"./ListPage.js";import"./CrmPage.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import{useNavigate as M,useSearchParams as N}from"react-router-dom";import"./Purchase.js";import"./QrScan.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import B from"../hooks/useToaster.js";import{l as D}from"../node_modules/lodash/lodash.js";const I=s({main:{flexGrow:1,...l.padding("10px"),overflowY:"auto"},container:{display:"flex",flexDirection:"row",height:"100%",...l.gap("16px"),...l.padding("10px")},containerMobile:{display:"flex",flexDirection:"column",height:"100%",...l.gap("16px"),...l.padding("10px")},inputSection:{display:"flex",flexDirection:"column",flexGrow:1,maxWidth:"640px",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",position:"relative"},inputSectionMobile:{display:"flex",flexDirection:"column",width:"100%",position:"relative"},historySection:{flexBasis:"300px",flexShrink:0,display:"flex",flexDirection:"column",...l.gap("8px"),overflowY:"auto",...l.padding("8px")},historySectionMobile:{display:"flex",flexDirection:"column",...l.gap("8px"),overflowY:"auto",...l.padding("8px"),maxHeight:"300px"},historyCard:{...l.padding("12px"),cursor:"pointer","&:hover":{backgroundColor:p.colorNeutralBackground1Hover}},historyCardContent:{display:"flex",flexDirection:"column",...l.gap("4px")},historyDate:{fontSize:p.fontSizeBase200,color:p.colorNeutralForeground3},historyText:{fontSize:p.fontSizeBase300,wordBreak:"break-word",whiteSpace:"pre-wrap",maxHeight:"100px",overflow:"hidden",textOverflow:"ellipsis"},review:{padding:"10px",wordBreak:"break-word",whiteSpace:"pre-line",maxWidth:"100%",overflowWrap:"break-word"},voiceIcon:{position:"absolute",top:"20px",right:"12px",zIndex:1001,cursor:"pointer"},historyTitle:{fontSize:p.fontSizeBase400,fontWeight:p.fontWeightSemibold,marginBottom:"8px"},emptyState:{textAlign:"center",color:p.colorNeutralForeground3,padding:"20px"},backButton:{marginBottom:"10px"}}),T=({state:s,voice:l})=>{const p=I(),{t:T}=A(),U=M(),[F,E]=t(!1),P=n(null),L=n(null),_=n(null),[$]=t(null),[z,R]=t([]),{service:O}=s,[H,V]=N(),[W,G]=t(""),[J,Y]=t(void 0),Q=B(),[q,K]=t(void 0),[X,Z]=t("info"),[oo,eo]=t([]),[to,no]=t(!1),io=k(),ro=i((o=>{for(const e of o)O.getFileInfo(e).then((o=>{R((e=>[...e,o]))}))}),[O,R]),ao=i((o=>{const e=new FormData;e.append("file",o),O.uploadFile(o.name,e).then((o=>{ro([o])})).catch((()=>{Q.notify(T("Error"),T("Error uploading pasted image"),"")}))}),[O,ro,Q,T]),so=o=>{E(o)},lo=i((async()=>{no(!0);try{const o=await O.getMessages(["crm"]);eo(o)}catch(o){console.error("Error loading CRM messages:",o),Q.notify(T("Error"),T("Failed to load CRM messages"),"","error")}finally{no(!1)}}),[O,Q,T]);r((()=>{lo()}),[lo]),r((()=>{const o=H.get("text"),e=H.get("url");o&&(G(o),H.delete("text")),e&&(H.delete("url"),G(((o||"")+" "+e).trim())),V(H,{replace:!0})}),[H,V,G,O,ro]);const po=o=>{o=`${o=`#crm\n${o.replace("#log ","")}\nSALESPERSON: ${s.context.name||s.context.user?.email||s.context.nickname||"-"}`}${$?" "+$:""}${z.length>0?"\n":""}${z.map((o=>`#file:${o.id}`)).join(" ")}`,O.sendMessage(o).then((()=>{Q.notify(T("Meddelande"),T("Meddelandet är sparat."),""),lo(),Y(""),K(void 0)}))},mo=i((async o=>{if(!o||o.length<10)return;K(T("Analyserar...")),Z("info");const e=await O.chat((o=>`Skapa kort ja/nej-status över hur CRM-aktiviteten som följer, givet dessa punkter: \n1. Namn på kunden finns med? ja/nej \n2. Syftet med mötet finns (varför träffar du kunden, kan täckas av 3 nedan) ja/nej\n3. Vad som framkommer under mötet (viktiga punkter och diskussioner) ja/nej\n4. Nästa steg finns med (hur ni kommer att träffas igen, och om något har sålts) ja/nej. \n\nSvara endast med ja/nej för varje punkt, ett svar per rad i följande exempel i JSON-format:\n{\n "customerName": "true",\n "purpose": "false",\n "meetingNotes": "true",\n "nextSteps": "false",\n "shortSummary": "Syfte med mötet och nästa steg saknas."\n}\n\n---\nTEXT:\n\n${o}`)(o));if(e){const o=new v(e.content);try{const e=JSON.parse(o.content);console.log("json",e);let t=0;for(const o in e)"true"===e[o]&&t++;K(T(4===t?"Allt är med":e.shortSummary||"Något saknas")),Z(4===t?"success":"warning")}catch{K("Error: "+o.content),Z("error")}}}),[O,T]),co=a((()=>D.debounce(mo,2e3)),[mo]);r((()=>()=>{co.cancel()}),[co]);const uo=o=>{const e=new Date,t=new Date(o),n=e.getTime()-t.getTime(),i=Math.floor(n/6e4),r=Math.floor(n/36e5),a=Math.floor(n/864e5);return i<1?T("Just now"):i<60?`${i} ${T("minutes ago")}`:r<24?`${r} ${T("hours ago")}`:a<7?`${a} ${T("days ago")}`:t.toLocaleDateString()},go=o=>{const e=o.split("\n").filter((o=>!o.startsWith("#")&&!o.startsWith("SALESPERSON:")&&o.trim().length>0)).join("\n");return e.substring(0,150)+(e.length>150?"...":"")},ho=()=>o("div",{className:io?p.historySectionMobile:p.historySection,children:[e(m,{className:p.historyTitle,children:T("Tidigare sparade")}),to?e("div",{className:p.emptyState,children:e(d,{size:"small"})}):0===oo.length?e("div",{className:p.emptyState,children:e(m,{children:T("Inga sparade meddelanden än")})}):oo.map((t=>e(u,{className:p.historyCard,onClick:()=>(o=>{const e=go(o.content);Y(e)})(t),children:o("div",{className:p.historyCardContent,children:[e(m,{className:p.historyDate,children:uo(t.createdAt)}),e(m,{className:p.historyText,children:go(t.content)})]})},t.id)))]});return o(C,{hideHeader:!0,children:[o("div",{className:io?p.containerMobile:p.container,children:[!io&&ho(),o("div",{className:io?p.inputSectionMobile:p.inputSection,style:io?void 0:{backgroundImage:`url(${y("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:[l&&y("SHOW_VOICE_BUTTON")&&e("div",{className:p.voiceIcon,children:e(S,{voice:l})}),e("div",{className:p.backButton,children:e(c,{appearance:"subtle",icon:e(f,{}),onClick:()=>U(-1),children:T("Tillbaka")})}),e(x,{title:y("APP_SAVE_TITLE")?T(y("APP_SAVE_TITLE")):T("Spara")}),e(w,{defaultText:W,onSend:po,files:z,onFilesChange:R,isUploading:F,onUploadImage:()=>{L.current?.triggerUpload()},onUploadCamera:()=>{_.current?.triggerUpload()},getImageUrl:j.getImageUrl,hasLocation:!!$,disableSend:!0,rows:9,placeholder:T("Beskriv CRM-aktivitet här..."),onChange:o=>{o!==J&&(Y(o),o&&o.trim().length>0?co(o):(K(void 0),co.cancel()))},onImagePasted:ao}),q&&o("div",{className:p.review,children:[e("h3",{children:T("Analys")}),e(g,{intent:X,layout:"multiline",children:e(h,{children:T(q)})})]}),e(b,{ref:P,onFileUploaded:ro,onUploading:so,multiple:!0,codicentService:O}),e(b,{codicentService:O,ref:L,onFileUploaded:ro,onUploading:so,multiple:!0,accept:"image/*"}),e(b,{codicentService:O,ref:_,onFileUploaded:ro,onUploading:so,multiple:!0,accept:"image/*",capture:"environment"})]}),io&&ho()]}),l?.toolCallLog&&l.toolCallLog.length>0&&o("div",{style:{padding:"8px 16px",background:"#1e1e2e",borderTop:"1px solid #444",maxHeight:220,overflowY:"auto"},children:[o("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:4},children:[e(m,{style:{color:"#aaa",fontSize:11,fontFamily:"monospace"},children:"Voice tool calls"}),e(c,{size:"small",appearance:"subtle",style:{color:"#aaa",fontSize:11},onClick:()=>l.clearToolCallLog?.(),children:"Clear"})]}),l.toolCallLog.map(((t,n)=>o("div",{style:{fontFamily:"monospace",fontSize:11,color:t.error?"#f87171":"#86efac",marginBottom:6,whiteSpace:"pre-wrap",wordBreak:"break-all"},children:[o("span",{style:{color:"#94a3b8"},children:[new Date(t.timestamp).toLocaleTimeString()," "]}),e("strong",{children:t.name})," → ",t.error?`ERROR: ${t.error}`:JSON.stringify(t.args,null,0).substring(0,300)]},n)))]})]})};export{T as CrmPagePersistent,T as default};
package/dist/index.d.ts CHANGED
@@ -534,26 +534,26 @@ declare class AppStateMachine extends StateMachine {
534
534
  }
535
535
  declare const createAppStateMachine: (service: CodicentService, onStateChange: (state: string) => void) => AppStateMachine;
536
536
 
537
- /* eslint-disable @typescript-eslint/no-explicit-any */
538
- declare class WavRecorder {
539
- constructor(options: { sampleRate: number });
540
- begin(): Promise<void>;
541
- end(): Promise<void>;
542
- record(callback: (data: { mono: ArrayBuffer | Int16Array }) => void): Promise<void>;
543
- pause(): Promise<void>;
544
- getStatus(): string;
545
- getFrequencies(type: string): { values: Float32Array };
546
- recording: boolean;
547
- static decode(audio: any, sampleRate: number, targetSampleRate: number): Promise<File>;
548
- }
549
-
550
- declare class WavStreamPlayer {
551
- constructor(options: { sampleRate: number });
552
- connect(): Promise<void>;
553
- interrupt(): Promise<{ trackId: string; offset: number } | undefined>;
554
- add16BitPCM(data: any, trackId: string): void;
555
- getFrequencies(type: string): { values: Float32Array };
556
- analyser: any;
537
+ /* eslint-disable @typescript-eslint/no-explicit-any */
538
+ declare class WavRecorder {
539
+ constructor(options: { sampleRate: number });
540
+ begin(): Promise<void>;
541
+ end(): Promise<void>;
542
+ record(callback: (data: { mono: ArrayBuffer | Int16Array }) => void): Promise<void>;
543
+ pause(): Promise<void>;
544
+ getStatus(): string;
545
+ getFrequencies(type: string): { values: Float32Array };
546
+ recording: boolean;
547
+ static decode(audio: any, sampleRate: number, targetSampleRate: number): Promise<File>;
548
+ }
549
+
550
+ declare class WavStreamPlayer {
551
+ constructor(options: { sampleRate: number });
552
+ connect(): Promise<void>;
553
+ interrupt(): Promise<{ trackId: string; offset: number } | undefined>;
554
+ add16BitPCM(data: any, trackId: string): void;
555
+ getFrequencies(type: string): { values: Float32Array };
556
+ analyser: any;
557
557
  }
558
558
 
559
559
  declare const isMobileDevice: () => boolean;
@@ -1215,6 +1215,14 @@ interface RealtimeEvent {
1215
1215
  [key: string]: any;
1216
1216
  };
1217
1217
  }
1218
+ /** Single entry in the tool call debug log */
1219
+ interface ToolCallLogEntry {
1220
+ timestamp: string;
1221
+ name: string;
1222
+ args: Record<string, unknown>;
1223
+ result?: unknown;
1224
+ error?: string;
1225
+ }
1218
1226
  interface RealtimeVoice {
1219
1227
  items: ItemType[];
1220
1228
  realtimeEvents: RealtimeEvent[];
@@ -1237,6 +1245,8 @@ interface RealtimeVoice {
1237
1245
  setUsername: (username: string) => void;
1238
1246
  updateInstructions: (instructions: string) => void;
1239
1247
  setLanguage: (language: string) => void;
1248
+ toolCallLog: ToolCallLogEntry[];
1249
+ clearToolCallLog: () => void;
1240
1250
  }
1241
1251
  declare const useRealtimeVoiceAI: (codicentService: CodicentService, tools: {
1242
1252
  definition: ToolDefinitionType;
@@ -2811,4 +2821,4 @@ interface CodicentApp {
2811
2821
  */
2812
2822
  declare function createCodicentApp(config: CreateAppConfig): CodicentApp;
2813
2823
 
2814
- export { AUDIT_CHECKBOX_OPTIONS, AiInput, AppButtonsConfig, AppConfig, AppConfigOptions, AppFrame, AppInfo, AppStateDefinition, AppStateMachine, AudioIcon, AudioRecorder, AudioRecorderState, AuditAnswer, AuditAnswerCell, AuditAnswerMode, AuditAnswerOption, AuditBulkExportDialog, AuditBulkUploadDialog, AuditCircularProgress, AuditConfig, AuditFilterBar, AuditFilterChips, AuditFilterState, AuditGroupsProgress, AuditHorizontalProgress, AuditManagerFilterState, AuditManagerStats, AuditPackage, AuditRequirement, AuditRequirementDialog, AuditRequirementDialogProps, AuditRequirementFieldMapping, AuditRequirementStatus, AuditRequirementsFilterState, AuditRole, AuditRoleCapabilities, AuditRoleIndicator, AuditRoleLabels, AuditSearchBar, AuditSortPreset, AuditSortPresets, AuditSummaryDashboard, AuditTagConfig, AuditTerminology, AuditTimeRemaining, AuditUnitExportDialog, AuditUnitFieldMapping, AuditUnitImportDialog, AuditUnitOption, AuditUnitStats, AuditUnitSwitcher, AuthStateOptions, BulkUploadDialog, Button, ButtonConfig, CacheEntry, CacheManager, CachedUserSession, Canvas, CanvasPageProps, Chat, ChatInput, ChatInstructions, ChatMessage, ChatProps, CodicentApp, CodicentAppState, CodicentMessage, CodicentService, CodicentServiceOptions, ColorPicker, ColumnAction, ColumnDefinition, CombinedPlaceholderDialog, Compose, CompoundButton, Content, CookieBanner, CookieBannerProps, CreateAppConfig, CrmPage, CrmPagePersistent, DEFAULT_AUDIT_VALIDITY_PERIOD_MONTHS, DataCacheEntry, DataMessage$1 as DataMessage, DataMessagePicker, DataMessagePickerProps, DataMessagePickerSelection, DataSchemas, DatePicker, Debug, ErrorBoundary, ExcelColumnDefinition, FileInfo$1 as FileInfo, FilePlaceholder, FileThumbnail, Footer, Form$1 as Form, FormAccept, FormInvite, Form as FormPage, GenericJsonRenderer, Header, Help, Home, HomeButtonStyles, HomePageProps, HtmlView, HtmlViewer, ImageViewer as ImageView, Input, ItemType, Label, LanguageSelector, ListConfig, ListDefinitions, ListPage, ListPageProps, _default as ListView, ListViewProps, Log, LogPageProps, LogTagDefinition, Login, Logout, Markdown, MemberInfo, Menu, MenuPageProps, Message$2 as Message, Content$1 as MessageContent, MessageInput, MessageItem, ModuleFlags, OfflineMessage, Page, Profile, Prompt, Purchase, QrCodeDialog, QrScan, QrScanner, RealtimeVoice, RecordModal, RecordModalProps, ResolvedAuditConfig, Sales, Schema, SchemaDefinition, SchemaEditor, SchemaItem, Search, SearchBox, Snap, SnapFooter, Spinner, StateContext, TemplateVariable, Text, TextHeader, Textarea, TimePicker, Title, Tool, ToolMergeStrategy, ToolsConfig, TranslationDictionary, TranslationResponse, Translations, TypingIndicator, UploadFile, UploadFileProps, UploadFileRef, UrlProcessor, UseAuditFiltersResult, UseAuditManagerDataParams, UseAuditManagerDataResult, UseAuditManagerFiltersResult, UseAuditRequirementsFiltersResult, UseAuditRoleCheckParams, UseAuditRoleCheckResult, UseAuditStateParams, UseAuditStateResult, UseAuthState, UseCodicentAppOptions, UserInfo, UserRole, VoiceIcon, VoiceIconProps, WavRecorder, WavStreamPlayer, buildAuditPackage, calcValidUntil, calculateAuditTimeRemaining, createAppStateMachine, createCodicentApp, dataCache, exportAuditPackageAsHtml, exportAuditPackageAsJson, exportToExcel, formatValidityPeriod, generateBrandVariants, getAuditComplianceRate, getAuditRoleCapabilities, getAuditUrgencyColor, getConfigValue, getEffectiveAnswerOptions, getGpsLocation, getTimeString, importAuditPackageFromHtml, importAuditPackageFromJson, initCodicentApp, isAnswerCompliant, isBffMode, isMobileDevice, log, parseValidityPeriod, reinitializeI18n, resolveAuditConfig, setBaseUrl, setBffMode, setSignalRHost, stateMachineCacheManager, useAppStyles, useAudioRecorder, useAuditFilters, useAuditManagerData, useAuditManagerFilters, useAuditRequirementsFilters, useAuditRoleCheck, useAuditState, useAuthState, useChat, useCodicentApp, useCodicentState, useDebugLogs, useLocalization, useObserveDataSchemas, useOnlineStatus, useRealtimeVoiceAI, useStateWithLocalStorage, useTemplateVariables, useToaster, useTools, useUserRoles, withWakeLock };
2824
+ export { AUDIT_CHECKBOX_OPTIONS, AiInput, AppButtonsConfig, AppConfig, AppConfigOptions, AppFrame, AppInfo, AppStateDefinition, AppStateMachine, AudioIcon, AudioRecorder, AudioRecorderState, AuditAnswer, AuditAnswerCell, AuditAnswerMode, AuditAnswerOption, AuditBulkExportDialog, AuditBulkUploadDialog, AuditCircularProgress, AuditConfig, AuditFilterBar, AuditFilterChips, AuditFilterState, AuditGroupsProgress, AuditHorizontalProgress, AuditManagerFilterState, AuditManagerStats, AuditPackage, AuditRequirement, AuditRequirementDialog, AuditRequirementDialogProps, AuditRequirementFieldMapping, AuditRequirementStatus, AuditRequirementsFilterState, AuditRole, AuditRoleCapabilities, AuditRoleIndicator, AuditRoleLabels, AuditSearchBar, AuditSortPreset, AuditSortPresets, AuditSummaryDashboard, AuditTagConfig, AuditTerminology, AuditTimeRemaining, AuditUnitExportDialog, AuditUnitFieldMapping, AuditUnitImportDialog, AuditUnitOption, AuditUnitStats, AuditUnitSwitcher, AuthStateOptions, BulkUploadDialog, Button, ButtonConfig, CacheEntry, CacheManager, CachedUserSession, Canvas, CanvasPageProps, Chat, ChatInput, ChatInstructions, ChatMessage, ChatProps, CodicentApp, CodicentAppState, CodicentMessage, CodicentService, CodicentServiceOptions, ColorPicker, ColumnAction, ColumnDefinition, CombinedPlaceholderDialog, Compose, CompoundButton, Content, CookieBanner, CookieBannerProps, CreateAppConfig, CrmPage, CrmPagePersistent, DEFAULT_AUDIT_VALIDITY_PERIOD_MONTHS, DataCacheEntry, DataMessage$1 as DataMessage, DataMessagePicker, DataMessagePickerProps, DataMessagePickerSelection, DataSchemas, DatePicker, Debug, ErrorBoundary, ExcelColumnDefinition, FileInfo$1 as FileInfo, FilePlaceholder, FileThumbnail, Footer, Form$1 as Form, FormAccept, FormInvite, Form as FormPage, GenericJsonRenderer, Header, Help, Home, HomeButtonStyles, HomePageProps, HtmlView, HtmlViewer, ImageViewer as ImageView, Input, ItemType, Label, LanguageSelector, ListConfig, ListDefinitions, ListPage, ListPageProps, _default as ListView, ListViewProps, Log, LogPageProps, LogTagDefinition, Login, Logout, Markdown, MemberInfo, Menu, MenuPageProps, Message$2 as Message, Content$1 as MessageContent, MessageInput, MessageItem, ModuleFlags, OfflineMessage, Page, Profile, Prompt, Purchase, QrCodeDialog, QrScan, QrScanner, RealtimeVoice, RecordModal, RecordModalProps, ResolvedAuditConfig, Sales, Schema, SchemaDefinition, SchemaEditor, SchemaItem, Search, SearchBox, Snap, SnapFooter, Spinner, StateContext, TemplateVariable, Text, TextHeader, Textarea, TimePicker, Title, Tool, ToolCallLogEntry, ToolMergeStrategy, ToolsConfig, TranslationDictionary, TranslationResponse, Translations, TypingIndicator, UploadFile, UploadFileProps, UploadFileRef, UrlProcessor, UseAuditFiltersResult, UseAuditManagerDataParams, UseAuditManagerDataResult, UseAuditManagerFiltersResult, UseAuditRequirementsFiltersResult, UseAuditRoleCheckParams, UseAuditRoleCheckResult, UseAuditStateParams, UseAuditStateResult, UseAuthState, UseCodicentAppOptions, UserInfo, UserRole, VoiceIcon, VoiceIconProps, WavRecorder, WavStreamPlayer, buildAuditPackage, calcValidUntil, calculateAuditTimeRemaining, createAppStateMachine, createCodicentApp, dataCache, exportAuditPackageAsHtml, exportAuditPackageAsJson, exportToExcel, formatValidityPeriod, generateBrandVariants, getAuditComplianceRate, getAuditRoleCapabilities, getAuditUrgencyColor, getConfigValue, getEffectiveAnswerOptions, getGpsLocation, getTimeString, importAuditPackageFromHtml, importAuditPackageFromJson, initCodicentApp, isAnswerCompliant, isBffMode, isMobileDevice, log, parseValidityPeriod, reinitializeI18n, resolveAuditConfig, setBaseUrl, setBffMode, setSignalRHost, stateMachineCacheManager, useAppStyles, useAudioRecorder, useAuditFilters, useAuditManagerData, useAuditManagerFilters, useAuditRequirementsFilters, useAuditRoleCheck, useAuditState, useAuthState, useChat, useCodicentApp, useCodicentState, useDebugLogs, useLocalization, useObserveDataSchemas, useOnlineStatus, useRealtimeVoiceAI, useStateWithLocalStorage, useTemplateVariables, useToaster, useTools, useUserRoles, withWakeLock };
package/package.json CHANGED
@@ -1,105 +1,111 @@
1
- {
2
- "name": "codicent-app-sdk",
3
- "version": "0.7.2",
4
- "description": "SDK for building AI-powered applications with Codicent",
5
- "type": "module",
6
- "main": "dist/cjs/index.js",
7
- "module": "dist/esm/index.js",
8
- "exports": {
9
- ".": {
10
- "import": "./dist/esm/index.js",
11
- "require": "./dist/cjs/index.js"
12
- }
13
- },
14
- "types": "dist/index.d.ts",
15
- "files": [
16
- "dist"
17
- ],
18
- "repository": {
19
- "type": "git",
20
- "url": "git+https://github.com/izaxon/codicent-app-sdk.git"
21
- },
22
- "keywords": [
23
- "codicent",
24
- "ai",
25
- "sdk",
26
- "react"
27
- ],
28
- "author": "Codicent Inside AB",
29
- "license": "MIT",
30
- "bugs": {
31
- "url": "https://github.com/izaxon/codicent-app-sdk/issues"
32
- },
33
- "homepage": "https://izaxon.github.io/codicent-app-sdk",
34
- "scripts": {
35
- "build": "rollup -c",
36
- "dev": "rollup -c -w",
37
- "test": "jest",
38
- "smoke": "node scripts/smoke.mjs",
39
- "prepare": "npm run build",
40
- "predeploy": "npm run build && cp -r dist/* docs/",
41
- "deploy": "gh-pages -d docs",
42
- "npm": "npm publish --access public"
43
- },
44
- "peerDependencies": {
45
- "@fluentui/react-components": "^9.60.0",
46
- "exceljs": "^4.4.0",
47
- "i18next": ">=23.0.0",
48
- "mermaid": "^11.3.0",
49
- "react": ">=16.8.0",
50
- "react-dom": ">=16.8.0",
51
- "react-i18next": ">=12.0.0",
52
- "react-router-dom": "^6.27.0"
53
- },
54
- "dependencies": {
55
- "jsqr": "^1.4.0",
56
- "lodash": "^4.17.21",
57
- "nosleep.js": "^0.12.0",
58
- "react-json-editor-ajrm": "^2.5.14",
59
- "remark-gfm": "^4.0.0"
60
- },
61
- "devDependencies": {
62
- "@auth0/auth0-react": "^2.2.4",
63
- "@babel/core": "^7.21.0",
64
- "@babel/preset-env": "^7.20.2",
65
- "@babel/preset-react": "^7.18.6",
66
- "@babel/preset-typescript": "^7.21.0",
67
- "@fluentui/react": "^8.123.0",
68
- "@fluentui/react-datepicker-compat": "^0.6.3",
69
- "@fluentui/react-icons": "^2.0.292",
70
- "@fluentui/react-timepicker-compat": "^0.4.3",
71
- "@openai/realtime-api-beta": "github:izaxon/openai-realtime-api-beta",
72
- "@rollup/plugin-commonjs": "^24.0.1",
73
- "@rollup/plugin-json": "^6.0.0",
74
- "@rollup/plugin-node-resolve": "^15.0.1",
75
- "@rollup/plugin-terser": "^0.4.0",
76
- "@rollup/plugin-typescript": "^11.0.0",
77
- "@stripe/stripe-js": "^5.2.0",
78
- "@types/jest": "^29.4.0",
79
- "@types/lodash": "^4.17.15",
80
- "@types/node": "^18.14.1",
81
- "@types/nosleep.js": "^0.9.0",
82
- "@types/react": "^18.0.28",
83
- "@types/react-dom": "^18.0.11",
84
- "@types/react-json-editor-ajrm": "^2.5.6",
85
- "exceljs": "^4.4.0",
86
- "gh-pages": "^5.0.0",
87
- "i18next": "^23.0.0",
88
- "jest": "^29.4.3",
89
- "jest-environment-jsdom": "^29.4.3",
90
- "mermaid": "^11.3.0",
91
- "react-i18next": "^15.6.0",
92
- "react-markdown": "^9.0.1",
93
- "rehype-raw": "^7.0.0",
94
- "rehype-sanitize": "^6.0.0",
95
- "remark-gfm": "^4.0.0",
96
- "rollup": "^3.17.3",
97
- "rollup-plugin-dts": "^5.2.0",
98
- "rollup-plugin-peer-deps-external": "^2.2.4",
99
- "statechart-lib": "^1.0.4",
100
- "tinycolor2": "^1.6.0",
101
- "ts-jest": "^29.0.5",
102
- "typescript": "~5.6.2",
103
- "typescript-eslint": "^8.10.0"
104
- }
105
- }
1
+ {
2
+ "name": "codicent-app-sdk",
3
+ "version": "0.7.9",
4
+ "description": "SDK for building AI-powered applications with Codicent",
5
+ "type": "module",
6
+ "main": "dist/cjs/index.js",
7
+ "module": "dist/esm/index.js",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/esm/index.js",
11
+ "require": "./dist/cjs/index.js"
12
+ }
13
+ },
14
+ "types": "dist/index.d.ts",
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/izaxon/codicent-app-sdk.git"
21
+ },
22
+ "keywords": [
23
+ "codicent",
24
+ "ai",
25
+ "sdk",
26
+ "react"
27
+ ],
28
+ "author": "Codicent Inside AB",
29
+ "license": "MIT",
30
+ "bugs": {
31
+ "url": "https://github.com/izaxon/codicent-app-sdk/issues"
32
+ },
33
+ "homepage": "https://izaxon.github.io/codicent-app-sdk",
34
+ "scripts": {
35
+ "build": "rollup -c",
36
+ "dev": "rollup -c -w",
37
+ "test": "jest",
38
+ "smoke": "node scripts/smoke.mjs",
39
+ "prepare": "npm run build",
40
+ "predeploy": "npm run build && cp -r dist/* docs/",
41
+ "deploy": "gh-pages -d docs",
42
+ "npm": "npm publish --access public"
43
+ },
44
+ "peerDependencies": {
45
+ "@fluentui/react-components": "^9.60.0",
46
+ "exceljs": "^4.4.0",
47
+ "i18next": ">=23.0.0",
48
+ "mermaid": "^11.3.0",
49
+ "react": ">=16.8.0",
50
+ "react-dom": ">=16.8.0",
51
+ "react-i18next": ">=12.0.0",
52
+ "react-router-dom": "^6.27.0"
53
+ },
54
+ "dependencies": {
55
+ "jsqr": "^1.4.0",
56
+ "lodash": "^4.17.21",
57
+ "nosleep.js": "^0.12.0",
58
+ "react-json-editor-ajrm": "^2.5.14",
59
+ "remark-gfm": "^4.0.0"
60
+ },
61
+ "overrides": {
62
+ "@babel/plugin-transform-modules-systemjs": "^7.29.4",
63
+ "@tootallnate/once": "^3.0.1",
64
+ "serialize-javascript": "^7.0.5",
65
+ "uuid": "^11.1.1"
66
+ },
67
+ "devDependencies": {
68
+ "@auth0/auth0-react": "^2.2.4",
69
+ "@babel/core": "^7.21.0",
70
+ "@babel/preset-env": "^7.20.2",
71
+ "@babel/preset-react": "^7.18.6",
72
+ "@babel/preset-typescript": "^7.21.0",
73
+ "@fluentui/react": "^8.123.0",
74
+ "@fluentui/react-datepicker-compat": "^0.6.3",
75
+ "@fluentui/react-icons": "^2.0.292",
76
+ "@fluentui/react-timepicker-compat": "^0.4.3",
77
+ "@openai/realtime-api-beta": "github:izaxon/openai-realtime-api-beta",
78
+ "@rollup/plugin-commonjs": "^24.0.1",
79
+ "@rollup/plugin-json": "^6.0.0",
80
+ "@rollup/plugin-node-resolve": "^15.0.1",
81
+ "@rollup/plugin-terser": "^0.4.0",
82
+ "@rollup/plugin-typescript": "^11.0.0",
83
+ "@stripe/stripe-js": "^5.2.0",
84
+ "@types/jest": "^29.4.0",
85
+ "@types/lodash": "^4.17.15",
86
+ "@types/node": "^18.14.1",
87
+ "@types/nosleep.js": "^0.9.0",
88
+ "@types/react": "^18.0.28",
89
+ "@types/react-dom": "^18.0.11",
90
+ "@types/react-json-editor-ajrm": "^2.5.6",
91
+ "exceljs": "^4.4.0",
92
+ "gh-pages": "^5.0.0",
93
+ "i18next": "^23.0.0",
94
+ "jest": "^29.4.3",
95
+ "jest-environment-jsdom": "^29.4.3",
96
+ "mermaid": "^11.3.0",
97
+ "react-i18next": "^15.6.0",
98
+ "react-markdown": "^9.0.1",
99
+ "rehype-raw": "^7.0.0",
100
+ "rehype-sanitize": "^6.0.0",
101
+ "remark-gfm": "^4.0.0",
102
+ "rollup": "^3.17.3",
103
+ "rollup-plugin-dts": "^5.2.0",
104
+ "rollup-plugin-peer-deps-external": "^2.2.4",
105
+ "statechart-lib": "^1.0.4",
106
+ "tinycolor2": "^1.6.0",
107
+ "ts-jest": "^29.0.5",
108
+ "typescript": "~5.6.2",
109
+ "typescript-eslint": "^8.10.0"
110
+ }
111
+ }