UNPKG

iobroker.javascript

Version:
2 lines 6.87 kB
import{f as e,jn as t}from"./_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-CxICLr5Z.js";import{t as n}from"./applyCodeEdit-D3nb7erO.js";var r=`iobroker.aichat.inline`;function i(e){if(!e)return{code:null,text:``};let t=e.match(/```[\w-]*\n([\s\S]*?)\n```/);return t?{code:t[1],text:e.replace(t[0],``).trim()}:{code:null,text:e}}var a=class a{constructor(n,r,i){t(this,`editor`,void 0),t(this,`monaco`,void 0),t(this,`host`,void 0),t(this,`domNode`,void 0),t(this,`input`,void 0),t(this,`status`,void 0),t(this,`responseBox`,void 0),t(this,`sendBtn`,void 0),t(this,`cancelBtn`,void 0),t(this,`applyBtn`,void 0),t(this,`openChatBtn`,void 0),t(this,`contentWidget`,null),t(this,`pendingResponse`,``),t(this,`pendingCode`,null),t(this,`initialRange`,null),t(this,`initialSelectedCode`,``),this.editor=n,this.monaco=r,this.host=i;let o=document.createElement(`div`);o.className=`iob-inline-chat`,o.style.cssText=[`background: var(--vscode-editor-background, #1e1e1e)`,`border: 1px solid rgba(128, 128, 128, 0.4)`,`border-radius: 6px`,`padding: 8px`,`min-width: 420px`,`max-width: 720px`,`box-shadow: 0 4px 12px rgba(0,0,0,0.3)`,`font-family: var(--vscode-font-family, system-ui)`,`font-size: 12px`,`color: var(--vscode-editor-foreground, #eee)`,`z-index: 100`].join(`; `);let s=document.createElement(`div`);s.textContent=`🤖 ${e.t(`AI inline chat`)}`,s.style.cssText=`font-weight: 600; margin-bottom: 6px; opacity: 0.8;`,o.appendChild(s),this.input=document.createElement(`textarea`),this.input.rows=2,this.input.placeholder=e.t(`Ask anything, or request a change (e.g. "what does this do?")`),this.input.style.cssText=[`width: 100%`,`box-sizing: border-box`,`background: rgba(0,0,0,0.2)`,`color: inherit`,`border: 1px solid rgba(128, 128, 128, 0.3)`,`border-radius: 4px`,`padding: 6px 8px`,`font-family: inherit`,`font-size: 12px`,`resize: vertical`].join(`; `),o.appendChild(this.input),this.status=document.createElement(`div`),this.status.style.cssText=`min-height: 16px; margin-top: 6px; opacity: 0.7; font-size: 11px;`,o.appendChild(this.status),this.responseBox=document.createElement(`pre`),this.responseBox.style.cssText=[`margin: 6px 0 0 0`,`padding: 6px`,`background: rgba(0,0,0,0.25)`,`border-radius: 4px`,`max-height: 240px`,`overflow: auto`,`white-space: pre-wrap`,`word-wrap: break-word`,`font-family: var(--vscode-editor-font-family, monospace)`,`font-size: 12px`,`display: none`].join(`; `),o.appendChild(this.responseBox);let c=document.createElement(`div`);c.style.cssText=`display: flex; gap: 6px; justify-content: flex-end; margin-top: 8px;`,this.cancelBtn=a.makeButton(e.t(`Cancel`),`Esc`,!1),this.openChatBtn=a.makeButton(e.t(`Open in chat`),``,!1),this.openChatBtn.style.display=`none`,this.applyBtn=a.makeButton(e.t(`Apply`),`Enter`,!0),this.applyBtn.style.display=`none`,this.sendBtn=a.makeButton(e.t(`Send`),`Ctrl+Enter`,!0),c.appendChild(this.cancelBtn),c.appendChild(this.openChatBtn),c.appendChild(this.applyBtn),c.appendChild(this.sendBtn),o.appendChild(c),this.domNode=o,this.input.addEventListener(`keydown`,e=>this.onInputKeyDown(e)),this.sendBtn.addEventListener(`click`,()=>this.submit()),this.cancelBtn.addEventListener(`click`,()=>this.hide()),this.applyBtn.addEventListener(`click`,()=>this.applyProposal()),this.openChatBtn.addEventListener(`click`,()=>this.escalateToChat()),o.addEventListener(`mousedown`,e=>e.stopPropagation()),o.addEventListener(`keydown`,e=>e.stopPropagation())}static makeButton(e,t,n){let r=document.createElement(`button`);return r.textContent=t?`${e} · ${t}`:e,r.style.cssText=[`background: ${n?`var(--vscode-button-background, #0e639c)`:`transparent`}`,`color: ${n?`var(--vscode-button-foreground, #fff)`:`inherit`}`,`border: 1px solid ${n?`transparent`:`rgba(128, 128, 128, 0.4)`}`,`border-radius: 4px`,`padding: 4px 10px`,`cursor: pointer`,`font-family: inherit`,`font-size: 11px`].join(`; `),r}onInputKeyDown(e){e.key===`Escape`?(e.preventDefault(),this.hide()):e.key===`Enter`&&(e.ctrlKey||e.metaKey)&&(e.preventDefault(),this.submit())}show(){let t=this.editor.getSelection(),n=this.editor.getModel();if(!n)return;this.initialRange=t&&!t.isEmpty()?t:null,this.initialSelectedCode=this.initialRange?n.getValueInRange(this.initialRange):``,this.input.value=``;let r=this.initialSelectedCode.split(` `).length;this.status.textContent=this.initialSelectedCode?e.t(`Selection: %s line(s)`,r):e.t(`No selection — the question will use context from the whole script.`),this.responseBox.style.display=`none`,this.responseBox.textContent=``,this.applyBtn.style.display=`none`,this.openChatBtn.style.display=`none`,this.sendBtn.style.display=``,this.pendingResponse=``,this.pendingCode=null;let i=this.buildContentWidget();this.editor.addContentWidget(i),this.contentWidget=i,setTimeout(()=>this.input.focus(),50)}hide(){this.contentWidget&&=(this.editor.removeContentWidget(this.contentWidget),null),this.editor.focus()}buildContentWidget(){var e;let t=this.editor.getSelection(),n=(t==null?void 0:t.endLineNumber)??((e=this.editor.getPosition())==null?void 0:e.lineNumber)??1,i=(t==null?void 0:t.endColumn)??1,a=this.domNode,o=this.monaco;return{getId(){return r},getDomNode(){return a},getPosition(){return{position:{lineNumber:n,column:i},preference:[o.editor.ContentWidgetPositionPreference.BELOW,o.editor.ContentWidgetPositionPreference.ABOVE]}}}}async submit(){let t=this.input.value.trim();if(!t){this.status.textContent=e.t(`Please enter a question.`);return}this.setLoading(!0);try{let e=await this.host.onSubmit({question:t,selectedCode:this.initialSelectedCode,range:this.initialRange});this.showResponse(e)}catch(t){this.status.textContent=`${e.t(`Error`)}: ${t.message||String(t)}`}finally{this.setLoading(!1)}}setLoading(t){this.sendBtn.disabled=t,this.input.disabled=t,this.status.textContent=t?e.t(`Thinking…`):``}showResponse(t){let n=i(t);this.pendingResponse=t,this.pendingCode=n.code,this.responseBox.textContent=n.code?n.code:n.text,this.responseBox.style.display=``,this.status.textContent=n.code?e.t(`Code proposal — press Apply to replace your selection.`):e.t(`Plain text answer.`),this.sendBtn.style.display=`none`,this.applyBtn.style.display=n.code?``:`none`,this.openChatBtn.style.display=``}applyProposal(){if(!this.pendingCode){this.hide();return}let e=this.initialRange?{startLine:this.initialRange.startLineNumber,startColumn:this.initialRange.startColumn,endLine:this.initialRange.endLineNumber,endColumn:this.initialRange.endColumn}:null;n(this.editor,this.monaco,e,this.pendingCode,{source:`inline-chat`}),this.hide()}escalateToChat(){this.host.onEscalateToChat&&this.host.onEscalateToChat({question:this.input.value.trim()||e.t(`Show more details`),selectedCode:this.initialSelectedCode,range:this.initialRange}),this.hide()}dispose(){this.hide()}};export{a as InlineChatWidget};