@blocknote/xl-ai 0.40.0 → 0.41.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.
- package/dist/blocknote-xl-ai.cjs +3 -3
- package/dist/blocknote-xl-ai.cjs.map +1 -1
- package/dist/blocknote-xl-ai.js +288 -254
- package/dist/blocknote-xl-ai.js.map +1 -1
- package/dist/webpack-stats.json +1 -1
- package/package.json +5 -5
- package/src/AIExtension.ts +65 -1
- package/src/api/schema/__snapshots__/schemaToJSONSchema.test.ts.snap +2 -55
- package/types/src/AIExtension.d.ts +2 -0
- package/types/src/testUtil/cases/editors/blockFormatting.d.ts +2 -1
- package/types/src/testUtil/cases/editors/formattingAndMentions.d.ts +2 -1
- package/types/src/testUtil/cases/editors/simpleEditor.d.ts +4 -2
- package/types/src/testUtil/cases/editors/tables.d.ts +2 -1
- package/types/src/testUtil/cases/schemas/mention.d.ts +2 -1
package/dist/blocknote-xl-ai.cjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
"use strict";var ot=Object.defineProperty;var rt=(e,t,o)=>t in e?ot(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o;var q=(e,t,o)=>rt(e,typeof t!="symbol"?t+"":t,o);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const nt=require("@ai-sdk/react"),k=require("@blocknote/core"),$=require("@blocknote/prosemirror-suggest-changes"),H=require("prosemirror-model"),U=require("prosemirror-state"),st=require("prosemirror-tables"),J=require("prosemirror-view"),it=require("y-prosemirror"),at=require("lodash.isequal"),re=require("@ai-sdk/provider-utils"),T=require("ai"),x=require("prosemirror-transform"),ee=require("prosemirror-changeset"),y=require("react/jsx-runtime"),_=require("@blocknote/react"),w=require("react"),Ie=require("zustand"),te=require("@floating-ui/react"),Oe=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},lt=Oe(at),L=Oe(w),me=e=>{let t;const o=new Set,r=(c,d)=>{const f=typeof c=="function"?c(t):c;if(!Object.is(f,t)){const m=t;t=d??(typeof f!="object"||f===null)?f:Object.assign({},t,f),o.forEach(u=>u(t,m))}},n=()=>t,i={setState:r,getState:n,getInitialState:()=>l,subscribe:c=>(o.add(c),()=>o.delete(c))},l=t=e(r,n,i);return i},fe=e=>e?me(e):me;function ct(e){const{properties:t,required:o,$defs:r,...n}=e.inputSchema;return{schema:{type:"object",description:e.description,properties:{type:{type:"string",enum:[e.name]},...t},required:["type",...o??[]],additionalProperties:!1,...n},$defs:r}}function Me(e){const t=e.map(r=>ct(r)),o={};for(const r of t)for(const n in r.$defs){if(o[n]&&!lt.default(o[n],r.$defs[n]))throw new Error(`Duplicate, but different definition for ${n}`);o[n]=r.$defs[n]}return{type:"object",properties:{operations:{type:"array",items:{anyOf:t.map(r=>r.schema)}}},additionalProperties:!1,required:["operations"],$defs:Object.keys(o).length>0?o:void 0}}function Be(e,t){return{async sendAIRequest(o,r){const n=await t(o);return await e(o.chat.messages,n),o.chat.sendMessage(void 0,{...r,body:{...(r==null?void 0:r.body)??{},toolDefinitions:{applyDocumentOperations:{name:"applyDocumentOperations",inputSchema:Me(o.streamTools),outputSchema:{type:"object"}}}},metadata:{promptData:n}})}}}class ne extends Error{constructor(t,o,r){super(t,r),this.chunk=o,this.name="ChunkExecutionError"}}class Ee{constructor(t){q(this,"stream");this.streamTools=t,this.stream=this.createStream()}createStream(){let t;const o=new TransformStream({transform:async(i,l)=>{const c=typeof i=="string"?await ut(i,(t==null?void 0:t.isPossiblyPartial)??!1,this.streamTools):i;c&&(t=c,l.enqueue(c))},flush:i=>{t!=null&&t.isPossiblyPartial&&i.error(new Error("stream ended with a partial operation"))}}),r=o.readable.pipeThrough(this.createExecutor()),[n,s]=r.tee(),a=n.pipeTo(new WritableStream);return{writable:o.writable,readable:s,finishPromise:a}}createExecutor(){const t=this.streamTools.map(o=>o.executor());return new TransformStream({transform:async(o,r)=>{var s;let n=!1;for(const a of t)try{if(await a.execute(o)){r.enqueue({status:"ok",chunk:o}),n=!0;break}}catch(i){throw new ne(`Tool execution failed: ${re.getErrorMessage(i)}`,o,{cause:i})}if(!n){const a=((s=o.operation)==null?void 0:s.type)||"unknown";throw new Error(`No tool could handle operation of type: ${a}`)}}})}get writable(){return this.stream.writable}get readable(){return this.stream.readable}async finish(){await this.stream.finishPromise}async executeOperationsArray(t){const o=this.writable.getWriter();for await(const r of t){const n=await T.parsePartialJson(r);if(n.state==="undefined-input"||n.state==="failed-parse"||!n)return;await o.write(r)}await o.close(),await this.finish()}async execute(t){const o=this.writable.getWriter();for await(const r of t)await o.write(r);await o.close(),await this.finish()}async executeOne(t){await this.execute(async function*(){yield{operation:t,isUpdateToPreviousOperation:!1,isPossiblyPartial:!1,metadata:{}}}())}}async function ut(e,t,o){const r=await T.parsePartialJson(e);if(r.state==="undefined-input"||r.state==="failed-parse"||!r)return;const n=o.find(a=>{var i;return a.name===((i=r.value)==null?void 0:i.type)}),s=n&&n.validate(r.value);if(s!=null&&s.ok)return{operation:s.value,isPossiblyPartial:r.state==="repaired-parse",isUpdateToPreviousOperation:t,metadata:void 0}}function dt(e){return new ReadableStream({async start(t){try{for await(const o of e)t.enqueue(o);t.close()}catch(o){t.error(o)}}})}function _e(e){if(e.locked)throw new Error("Stream (source) is already locked and cannot be iterated.");const t=e.pipeThrough(new TransformStream);return t[Symbol.asyncIterator]=()=>{if(t.locked)throw new Error("Stream is already locked and cannot be iterated again.");const o=t.getReader();return{async next(){const{done:r,value:n}=await o.read();return r?{done:!0,value:void 0}:{done:!1,value:n}}}},t}function pt(e){return _e(dt(e))}async function*mt(e,t){var s;let o=0,r=!0,n;for await(const a of e)if((s=a.operations)!=null&&s.length){for(let i=o;i<a.operations.length;i++){const l=a.operations[i];n=l,yield{partialOperation:l,isUpdateToPreviousOperation:i===o&&!r,isPossiblyPartial:i===a.operations.length-1,metadata:t},r=!1}o=a.operations.length-1}if(!n)throw new Error("No operations seen");yield{partialOperation:n,isUpdateToPreviousOperation:!0,isPossiblyPartial:!1,metadata:t}}async function*ft(e,t){let o=!1;for await(const r of e){const n=r.operation;n.ok?(yield{operation:n.value,isUpdateToPreviousOperation:o?!1:r.isUpdateToPreviousOperation,isPossiblyPartial:r.isPossiblyPartial,metadata:r.metadata},o=!1):(o=o||!r.isUpdateToPreviousOperation,t==null||t({...r,operation:n}))}}async function*ht(e,t){for await(const o of e){const r=t.find(s=>s.name===o.partialOperation.type);if(!r){yield{operation:{ok:!1,error:`No matching function for ${o.partialOperation.type}`},isUpdateToPreviousOperation:o.isUpdateToPreviousOperation,isPossiblyPartial:o.isPossiblyPartial,metadata:o.metadata};continue}yield{operation:r.validate(o.partialOperation),isUpdateToPreviousOperation:o.isUpdateToPreviousOperation,isPossiblyPartial:o.isPossiblyPartial,metadata:o.metadata}}}async function*yt(e,t){const o=ht(e,t);yield*ft(o,n=>{if(!n.isPossiblyPartial)throw new Error("invalid operation: "+n.operation.error)})}function Ae(e,t,o){return pt(yt(mt(_e(e),o),t))}async function gt(e,t,o){const r=new Ee(e),n=bt();n.output.pipeTo(r.writable);const s=new Map;let a=!0;const i=t["~registerMessagesCallback"](()=>{kt(t,u=>{if(!s.has(u.toolCallId)){const h=St(e,u.toolName,u.toolCallId);n.append(h.operationsStream),s.set(u.toolCallId,h),a&&(a=!1,o==null||o())}return s.get(u.toolCallId)})});await new Promise(u=>{const h=t["~registerStatusCallback"](()=>{(t.status==="ready"||t.status==="error")&&(i(),h(),t.status!=="error"&&p(),u())}),p=t["~registerErrorCallback"](()=>{if(t.error){p();for(const S of s.values())S.complete||S.writer.abort(t.error)}})}),await n.finalize();const c=(await Promise.allSettled([r.finish()]))[0];let d;if(c.status==="rejected"){if(c.reason instanceof ne)d=c.reason;else if(!t.error)throw new Error("Unexpected: no ChunkExecutionError but also no chat.error (network error?)")}let f=!1;const m=Array.from(s.values().filter(u=>u.complete));if(m.forEach((u,h)=>{const p=u.toolCallId===(d==null?void 0:d.chunk.metadata.toolCallId);p&&(f=!0),t.addToolResult({tool:m[h].toolName,toolCallId:m[h].toolCallId,output:f===!1?{status:"ok"}:p?{status:"error",error:re.getErrorMessage(d)}:{status:"not-executed-previous-tool-errored"}})}),d)throw d;if(t.error)throw t.error}function bt(){let e,t=Promise.resolve(),o=!1;const r=new ReadableStream({start(a){e=a},cancel(a){o=!0,e.error(a)}});async function n(a){if(o)throw new Error("Appendable stream canceled, can't append");const i=a.getReader();return t=t.then(async()=>{for(;;)try{const{done:l,value:c}=await i.read();if(l||o)break;e.enqueue(c)}catch(l){o=!0,e.error(l);break}}),t}async function s(){await t,o||e.close()}return{output:r,append:n,finalize:s}}function kt(e,t){var o;for(const r of((o=e.lastMessage)==null?void 0:o.parts)??[]){if(!T.isToolUIPart(r)||r.type.replace("tool-","")!=="applyDocumentOperations")continue;const s=r.toolCallId,a=t({toolName:r.type.replace("tool-",""),toolCallId:s});wt(r,a)}}function St(e,t,o){const r=new TransformStream,n=Ae(r.readable,e,{toolCallId:o});return{writer:r.writable.getWriter(),complete:!1,operationsStream:n,toolName:t,toolCallId:o}}function wt(e,t){if(e.state==="input-streaming"){const o=e.input;o!==void 0&&t.writer.write(o)}else if(e.state==="input-available"){const o=e.input;if(o===void 0)throw new Error("input is undefined");t.complete||(t.complete=!0,t.writer.write(o),t.writer.close())}}function se(e){return(e.type==="paragraph"||!e.type)&&!e.content||Array.isArray(e.content)&&e.content.length===0}function xt(e,t,o=!0,r=!0){let n=0,s=e.length;if(o)for(;n<s&&t(e[n]);)n++;if(r)for(;s>n&&t(e[s-1]);)s--;return e.slice(n,s)}function P(e,t){return xt(e,r=>se(r)&&(t==null?void 0:t.cursorBlockId)!==r.id,(t==null?void 0:t.trimStart)??!1,(t==null?void 0:t.trimEnd)??!0)}function Ne(e){const{useSelection:t,deleteEmptyCursorBlock:o,streamToolsProvider:r}={useSelection:e.useSelection??!1,deleteEmptyCursorBlock:e.deleteEmptyCursorBlock??!0,streamToolsProvider:e.streamToolsProvider??M.html.getStreamToolsProvider()},n=t?void 0:e.editor.getTextCursorPosition().block,s=n&&o&&se(n)&&P(e.editor.document).length>0?n.id:void 0,a=t?e.editor.getSelectionCutBlocks():void 0,i=r.getStreamTools(e.editor,a?{from:a._meta.startPos,to:a._meta.endPos}:void 0,e.onBlockUpdated);return{editor:e.editor,chat:e.chat,userPrompt:e.userPrompt,selectedBlocks:a==null?void 0:a.blocks,streamTools:i,emptyCursorBlockToDelete:s}}async function Le(e){const{aiRequest:t,sender:o,chatRequestOptions:r,onStart:n}=e,s=gt(t.streamTools,t.chat,()=>{n==null||n(),t.emptyCursorBlockToDelete&&t.editor.getBlock(t.emptyCursorBlockToDelete)&&t.editor.removeBlocks([t.emptyCursorBlockToDelete])});await o.sendAIRequest(t,r),await s}function Tt(e,t){e.length>0&&e.push({role:"assistant",id:"document-state-"+e.length,parts:[{type:"text",text:"This is the latest state of the selection (ignore previous selections, you MUST issue operations against this latest version of the selection):"},{type:"text",text:JSON.stringify(t.htmlSelectedBlocks)},{type:"text",text:"This is the latest state of the document (INCLUDING the selected text), find the selected text in there to understand the context:"},{type:"text",text:JSON.stringify(t.htmlDocument)}]},{role:"user",id:"user-prompt-"+e.length,parts:[{type:"text",text:"The user asks you to do the following:"},{type:"text",text:t.userPrompt}]}),e.push({role:"system",id:"document-state-intro",parts:[{type:"text",text:"You're manipulating a selected part of a text document using HTML blocks. \n Make sure to follow the json schema provided and always include the trailing $ in ids.\n List items are 1 block with 1 list item each, so block content `<ul><li>item1</li></ul>` is valid, but `<ul><li>item1</li><li>item2</li></ul>` is invalid. We'll merge them automatically.\n This is the selection as an array of html blocks:"}]},{role:"system",id:"document-state-selection",parts:[{type:"text",text:JSON.stringify(t.htmlSelectedBlocks)}]},{role:"system",id:"document-state-context",parts:[{type:"text",text:"This is the entire document (INCLUDING the selected text), find the selected text in there to understand the context:"},{type:"text",text:JSON.stringify(t.htmlDocument)}]},{role:"user",id:"user-prompt",parts:[{type:"text",text:t.userPrompt}]})}function vt(e,t){if(e.length>0){e.push({role:"assistant",id:"document-state-"+e.length,parts:[{type:"text",text:"This is the latest state of the document (ignore previous documents, you MUST issue operations against this latest version of the document):"},{type:"text",text:JSON.stringify(t.htmlBlocks)}]},{role:"user",id:"user-prompt-"+e.length,parts:[{type:"text",text:t.userPrompt}]});return}e.push({role:"system",id:"document-state-intro",parts:[{type:"text",text:"You're manipulating a text document using HTML blocks. \n Make sure to follow the json schema provided. When referencing ids they MUST be EXACTLY the same (including the trailing $). \n List items are 1 block with 1 list item each, so block content `<ul><li>item1</li></ul>` is valid, but `<ul><li>item1</li><li>item2</li></ul>` is invalid. We'll merge them automatically.\n For code blocks, you can use the `data-language` attribute on a <code> block (wrapped with <pre>) to specify the language.\n This is the initial document as an array of html blocks (the cursor is BETWEEN two blocks as indicated by cursor: true):"}]},{role:"system",id:"document-state-data",parts:[{type:"text",text:JSON.stringify(t.htmlBlocks)}]},{role:"system",id:"extended-instructions",parts:[{type:"text",text:'First, determine what part of the document the user is talking about. You SHOULD probably take cursor info into account if needed.\n EXAMPLE: if user says "below" (without pointing to a specific part of the document) he / she probably indicates the block(s) after the cursor. \n EXAMPLE: If you want to insert content AT the cursor position (UNLESS indicated otherwise by the user), \n then you need `referenceId` to point to the block before the cursor with position `after` (or block below and `before`).\n \n '+(t.isEmptyDocument?"Because the document is empty, first update the empty block before adding new blocks.":"Prefer updating existing blocks over removing and adding (but this also depends on the user's question).")}]},{role:"user",id:"user-prompt",parts:[{type:"text",text:t.userPrompt}]})}const Pt=async(e,t)=>{t.selection?Tt(e,t):vt(e,t)};function X(e,t){const o=e.getTextCursorPosition(),r=[];for(const n of t){const s=n.id===o.block.id;r.push({id:n.id,block:n.block}),s&&r.push({cursor:!0})}return r}async function B(e,t){return await Promise.all(e.map(async o=>({id:o.id,block:await t(o)})))}function C(e){return e.flatMap(t=>[{...t,children:[]},...C(t.children)])}function j(e){return e.map(t=>typeof t=="object"&&t&&"id"in t?{...t,id:`${t.id}$`}:t)}async function Ct(e){return e.selectedBlocks?{...await De(e.editor,{selectedBlocks:e.selectedBlocks}),userPrompt:e.userPrompt}:{...await je(e.editor,{excludeBlockIds:e.emptyCursorBlockToDelete?[e.emptyCursorBlockToDelete]:void 0}),userPrompt:e.userPrompt}}async function je(e,t){const o=P(e.document).length===0,r=e.getTextCursorPosition().block.id,n=P(e.document,{cursorBlockId:r}),s=await B(C(n),async c=>e.blocksToHTMLLossy([c])),i=X(e,s).filter(c=>"cursor"in c||!(t.excludeBlockIds||[]).includes(c.id));return{selection:!1,htmlBlocks:j(i),isEmptyDocument:o}}async function De(e,t){const o=P(e.document).length===0,r=await B(C(t.selectedBlocks),async s=>e.blocksToHTMLLossy([s])),n=j(r);return{isEmptyDocument:o,selection:!0,htmlSelectedBlocks:n,htmlDocument:(await B(C(e.document),async s=>e.blocksToHTMLLossy([s]))).map(({block:s})=>({block:s}))}}function It(e){let t,o=!1;return e.descendants((r,n)=>o?!1:(r.isText&&(o=!0,t=n),!0)),t}function Z(e){var s;const t=k.getPmSchema(e),{modification:o}=t.marks,r=[],n=new x.Transform(e.before);for(let a=0;a<e.steps.length;a++){const i=e.steps[a],l=new x.Mapping(e.mapping.maps.slice(0,a)).invert();if(i.structure){if(i instanceof x.ReplaceStep){if(i.to!==i.from+1||i.slice.openStart!==0||i.slice.openEnd!==1||i.slice.content.size!==2)throw new Error("Structure change is not in expected format (ReplaceStep)")}else if(i instanceof x.ReplaceAroundStep){if(i.insert!==1||i.slice.size!==2||i.gapTo!==i.to-1||i.gapFrom!==i.from+1)throw new Error("Structure change is not in expected format (ReplaceAroundStep)")}else throw new Error("Step is not a ReplaceStep or ReplaceAroundStep");const b=l.map(i.from),g=i.slice.content.firstChild,O=n.doc.resolve(n.mapping.map(b)).nodeAfter;let v=g.marks||[];g.type!==O.type&&(v=o.create({type:"nodeType",previousValue:O.type.name,newValue:g.type.name}).addToSet(v));const z=new Set([...Object.keys(g.attrs),...Object.keys(O.attrs)]);for(const E of z)g.attrs[E]!==O.attrs[E]&&(v=o.create({type:"attr",attrName:E,previousValue:O.attrs[E],newValue:g.attrs[E]}).addToSet(v));const N=n.steps.length;n.setNodeMarkup(n.mapping.map(b),g.type,g.attrs,v),r.push({prosemirrorSteps:n.steps.slice(N),selection:void 0,type:"replace"});continue}if(!(i instanceof x.ReplaceStep))throw new Error("Step is not a ReplaceStep");const c=l.map(i.from),d=l.map(i.to);if(i.slice.openStart>0||i.slice.openEnd>0)throw new Error("Slice has openStart or openEnd > 0, but structure=false");r.push({prosemirrorSteps:[],selection:{anchor:n.mapping.map(c),head:n.mapping.map(d)},type:"select"});const f=i.slice.content.textBetween(0,i.slice.size),m=f===n.doc.textBetween(n.mapping.map(c),n.mapping.map(d));let u;if(m)u=i.slice.content.size;else if(f.length===0)u=i.slice.content.size;else{const b=It(i.slice.content);if(b===void 0)throw new Error("unexpected: no first character found");u=b+1}let h=n.mapping.map(d);const p=n.mapping.map(d);let S=!0;for(let b=u;b<=i.slice.content.size;b++){const g=S&&c!==d,O=n.steps.length;if(g){const N=n.doc.resolve(n.mapping.map(c));(s=N.nodeAfter)!=null&&s.isBlock&&n.addNodeMark(N.pos,t.mark("deletion",{})),n.addMark(N.pos,h,t.mark("deletion",{})),h=n.mapping.map(d)}const v=new H.Slice(i.slice.content.cut(0,b),0,0);n.replace(p,h,v).addMark(p,p+v.content.size,t.mark("insertion",{})),n.doc.nodesBetween(p,p+v.content.size,(N,E)=>E<p||E>p+v.content.size?!0:(N.isBlock&&n.addNodeMark(E,t.mark("insertion",{})),!1)),h=n.mapping.slice(O).map(h);const z=U.TextSelection.near(n.doc.resolve(p+v.content.size),-1);r.push({prosemirrorSteps:n.steps.slice(O),selection:{anchor:z.from,head:z.from},type:g?"replace":"insert"}),S=!1}}return r}async function ie(e){const t=Math.random()*.3+.85;if(e.type==="select")await new Promise(o=>setTimeout(o,100*t));else if(e.type==="insert")await new Promise(o=>setTimeout(o,10*t));else if(e.type==="replace")await new Promise(o=>setTimeout(o,200*t));else throw new k.UnreachableCaseError(e.type)}function ae(e,t){e.setMeta("addToHistory",!1),t.selection&&e.setMeta("aiAgent",{selection:{anchor:t.selection.anchor,head:t.selection.head}});for(const o of t.prosemirrorSteps)if(e.maybeStep(o).failed)throw new Error("failed to apply step");return e}function Ot(e,t,o){const r=new x.Transform(t);for(const a of e){const i=new x.ReplaceStep(r.mapping.map(a.fromA),r.mapping.map(a.toA),o.slice(a.fromB,a.toB));r.step(i)}const n=r.mapping.invert();let s=r.doc.content.findDiffStart(o.content);for(;s!==null;){const a=o.resolve(s).nodeAfter,i=r.doc.resolve(s).nodeAfter;if(!a||!i)throw new Error("diffNode not found");const l=!a.isLeaf&&a.content.eq(i.content),c=l?1:Math.min(a.nodeSize,i.nodeSize),d=s+c,f=n.map(s),m=n.map(d);let u=e.length;for(let p=0;p<e.length;p++)if(e[p].fromA>=m){u=p;break}e.splice(u,0,{fromA:f,toA:m,fromB:s,toB:d,deleted:[],inserted:[],type:l?"node-type-or-attr-update":"mark-update"}),r.step(new x.ReplaceStep(s,d,o.slice(s,d),l));const h=r.doc.content.findDiffStart(o.content);if(h===s)throw new Error("diffStart not moving");s=h}return e}const he=(e,t)=>{const o=new Set,r=new Set;e.descendants(a=>{a.type.name==="tableCell"&&o.add(JSON.stringify(a.toJSON()))}),t.descendants(a=>{a.type.name==="tableCell"&&r.add(JSON.stringify(a.toJSON()))});const n=new Set([...o].filter(a=>r.has(a)));return{encodeCharacter:a=>a,encodeNodeStart:a=>{if(a.type.name==="tableCell"){const i=JSON.stringify(a.toJSON());return n.has(i)?i:a.type.name}return a.type.name},encodeNodeEnd:a=>{if(a.type.name==="tableCell"){const i=JSON.stringify(a.toJSON());return n.has(i)?i:-1}return-1},compareTokens:(a,i)=>a===i}};function Q(e,t,o=!1,r,n){const s=k.getNodeById(e.id,t),a=new x.Transform(t);k.updateBlockTr(a,s.posBeforeNode,e.block,r,n);let i=a.doc,l=ee.ChangeSet.create(t,void 0,he(t,i));if(l=l.addSteps(i,a.mapping.maps,0),o&&l.changes.length>0){const f=l.changes[l.changes.length-1],m=f.toA-f.fromA,u=f.toB-f.fromB;if(m>u){const h=t.slice(f.fromA+u,f.toA);a.step(new x.ReplaceStep(f.toB,f.toB,h)),i=a.doc,l=ee.ChangeSet.create(l.startDoc,void 0,he(l.startDoc,i)),l=l.addSteps(i,a.mapping.maps,0)}}const c=[],d=ee.simplifyChanges(l.changes,i);for(let f=0;f<d.length;f++){const m=d[f],u=i.slice(m.fromB,m.toB);if(u.openEnd===1&&u.openStart===0&&(m.type="node-type-or-attr-update",u.size>2)){const h={fromA:m.fromA,toA:m.fromA+1,fromB:m.fromB,toB:m.fromB+1,deleted:[],inserted:[],type:"node-type-or-attr-update"},p={fromA:m.fromA+1,toA:m.toA,fromB:m.fromB+1,toB:m.toB,deleted:[],inserted:[]};d.splice(f,1,h,p),f++}}Ot(d,t,i);for(let f=0;f<d.length;f++){const m=d[f],u=i.slice(m.fromB,m.toB);if(u.openEnd>0&&u.size>1)throw new Error("unexpected, openEnd > 0 and size > 1, this should have been split into two steps");f===d.length-1&&o&&m.type==="mark-update"||c.push(new x.ReplaceStep(m.fromA,m.toA,u,m.type==="node-type-or-attr-update"))}return c}function Mt(e,t){if(!e||!Array.isArray(e)||e.length===0)return{ok:!1,error:"blocks is required"};const o=[];for(const r of e){const n=t(r);if(!n.ok)return{ok:!1,error:`Invalid block: ${n.error}`};o.push(n.value)}return{ok:!0,value:o}}function le(e){return(t,o)=>{const r=typeof e.schema=="function"?e.schema(t):e.schema;return{name:"add",description:e.description,inputSchema:{type:"object",properties:{referenceId:{type:"string",description:"MUST be an id of a block in the document"},position:{type:"string",enum:["before","after"],description:"`after` to add blocks AFTER (below) the block with `referenceId`, `before` to add the block BEFORE (above)"},blocks:{items:r.block,type:"array"}},required:["referenceId","position","blocks"],$defs:r.$defs},validate:n=>{if(n.type!=="add")return{ok:!1,error:"invalid operation type"};if(n.position!=="before"&&n.position!=="after")return{ok:!1,error:"invalid position"};if(!n.referenceId||!n.blocks)return{ok:!1,error:"referenceId and blocks are required"};let s=n.referenceId;if(o.idsSuffixed){if(!(s!=null&&s.endsWith("$")))return{ok:!1,error:"referenceId must end with $"};s=s.slice(0,-1)}if(!t.getBlock(s))return{ok:!1,error:"referenceId not found"};const i=Mt(n.blocks,l=>e.validateBlock(l,t));return i.ok?{ok:!0,value:{type:n.type,referenceId:s,position:n.position,blocks:i.value}}:i},executor:()=>{let n=[];const s={};return{execute:async a=>{var c;if(a.isUpdateToPreviousOperation||(n=[]),a.operation.type!=="add")return!1;const i=a.operation,l=await e.toJSONToolCall(t,{...a,operation:i});if(!l||a.isPossiblyPartial&&se(l.blocks[l.blocks.length-1]))return!0;for(let d=0;d<l.blocks.length;d++){const f=l.blocks[d],m=t.prosemirrorState.tr;let u=[];if(d<n.length){const h=await e.rebaseTool(n[d],t),S=Q({id:n[d],block:f},h.doc,!1).map(b=>b.map(h.invertMap));for(const b of S)m.step(b.map(m.mapping));u=Z(m),u=u.filter(b=>b.type!=="select")}else{const h=i.position==="after"?s[i.referenceId]:void 0,p=k.insertBlocks(m,[f],d>0?n[d-1]:h||i.referenceId,d>0?"after":i.position);n.push(...p.map(S=>S.id)),u=Z(m)}for(const h of u)o.withDelays&&await ie(h),t.transact(p=>{ae(p,h)}),(c=o.onBlockUpdate)==null||c.call(o,n[d])}return a.isPossiblyPartial||i.position==="after"&&(s[i.referenceId]=n[n.length-1]),!0}}}}}}function ce(e){return(t,o)=>{const r=typeof e.schema=="function"?e.schema(t):e.schema;return{name:"update",description:e.description,inputSchema:{type:"object",properties:{id:{type:"string",description:"id of block to update"},block:r.block},required:["id","block"],$defs:r.$defs},validate:n=>{if(n.type!=="update")return{ok:!1,error:"invalid operation type"};if(!n.id)return{ok:!1,error:"id is required"};let s=n.id;if(o.idsSuffixed){if(!(s!=null&&s.endsWith("$")))return{ok:!1,error:"id must end with $"};s=s.slice(0,-1)}if(!n.block)return{ok:!1,error:"block is required"};const a=t.getBlock(s);if(!a)return console.error("BLOCK NOT FOUND",s),{ok:!1,error:"block not found"};const i=e.validateBlock(n.block,t,a.type);return i.ok?{ok:!0,value:{type:n.type,id:s,block:i.value}}:i},executor:()=>{let s=50;const a=o.updateSelection?{from:k.trackPosition(t,o.updateSelection.from),to:k.trackPosition(t,o.updateSelection.to)}:void 0;return{execute:async i=>{var b;if(i.operation.type!=="update")return!1;const l=i.operation;if(i.isPossiblyPartial){const g=JSON.stringify(l.block).length;if(g<s)return!0;s=g+50}else s=50;const c=await e.rebaseTool(l.id,t),d=a?c.invertMap.invert().map(a.from()):void 0,f=a?c.invertMap.invert().map(a.to()):void 0,m=await e.toJSONToolCall(t,{...i,operation:l});if(!m)return!0;const u=Q(m,c.doc,i.isPossiblyPartial,d,f);if(u.length===1&&i.isPossiblyPartial)return!0;const h=u.map(g=>g.map(c.invertMap)),p=new x.Transform(t.prosemirrorState.doc);for(const g of h)p.step(g.map(p.mapping));const S=Z(p);for(const g of S)o.withDelays&&await ie(g),t.transact(O=>{ae(O,g)}),(b=o.onBlockUpdate)==null||b.call(o,l.id);return!0}}}}}}const ue=(e,t)=>({name:"delete",description:"Delete a block",inputSchema:{type:"object",properties:{id:{type:"string",description:"id of block to delete"}},required:["id"]},validate:o=>{if(o.type!=="delete")return{ok:!1,error:"invalid operation type"};if(!o.id)return{ok:!1,error:"id is required"};let r=o.id;if(t.idsSuffixed){if(!(r!=null&&r.endsWith("$")))return{ok:!1,error:"id must end with $"};r=r.slice(0,-1)}return e.getBlock(r)?{ok:!0,value:{type:"delete",id:r}}:{ok:!1,error:"block not found"}},executor:()=>({execute:async o=>{var a;if(o.operation.type!=="delete")return!1;const r=o.operation,n=e.prosemirrorState.tr;k.removeAndInsertBlocks(n,[r.id],[]);const s=Z(n);for(const i of s)t.withDelays&&await ie(i),e.transact(l=>{ae(l,i)}),(a=t.onBlockUpdate)==null||a.call(t,r.id);return!0}})});function ye(e){const t=e.lastIndexOf("<"),o=e.lastIndexOf(">");let r=e;if(t>o&&(r=e.substring(0,t),!r.trim()))return;const n=r.match(/&[a-zA-Z0-9]*$/);n&&(r=r.substring(0,r.length-n[0].length));const i=new DOMParser().parseFromString(`<div>${r}</div>`,"text/html").body.firstChild;return i?i.innerHTML:""}function W(e){let t;if($.applySuggestions(e.prosemirrorState,o=>{t=o}),!t)throw new Error("applySuggestionsTr is not set");return t}function Y(e,t){const o=t.mapping.invert();return{doc:t.doc,tr:()=>new x.Transform(t.doc),invertMap:o,rebaseTr:r=>{if(r.steps.length===0)throw new Error("No steps to apply");let n=e.prosemirrorState.tr;for(const s of r.steps){const a=s.map(o);if(!a)throw new Error("Step is not mapped");n=n.step(a)}return n}}}async function ge(e,t){var c;const o=W(t),r=k.getBlock(o.doc,e);if(!r)throw new Error("block not found");const n=await t.blocksToHTMLLossy([{...r,children:[]}]),s=(c=window.__TEST_OPTIONS)==null?void 0:c.mockID,a=await t.tryParseHTMLToBlocks(n);if(window.__TEST_OPTIONS&&(window.__TEST_OPTIONS.mockID=s),a.length!==1)throw new Error("html diff invalid block count");const i=a[0];if(i.id=e,Q({id:e,block:i},o.doc).length)throw new Error("html diff");return Y(t,o)}function be(e){return typeof e!="string"?{ok:!1,error:"block must be a string"}:{ok:!0,value:e}}const R={add:le({description:"Insert new blocks",schema:{block:{type:"string",description:"html of block (MUST be a single, VALID HTML element)"}},validateBlock:be,rebaseTool:ge,toJSONToolCall:async(e,t)=>{var n;const o=(n=window.__TEST_OPTIONS)==null?void 0:n.mockID,r=(await Promise.all(t.operation.blocks.map(async s=>{const a=t.isPossiblyPartial?ye(s):s;return a?(await e.tryParseHTMLToBlocks(a)).map(i=>(delete i.id,i)):[]}))).flat();if(window.__TEST_OPTIONS&&(window.__TEST_OPTIONS.mockID=o),r.length!==0)return{...t.operation,blocks:r}}}),update:ce({description:"Update a block",schema:{block:{type:"string",description:"html of block (MUST be a single HTML element)"}},validateBlock:be,rebaseTool:ge,toJSONToolCall:async(e,t)=>{const o=t.isPossiblyPartial?ye(t.operation.block):t.operation.block;if(!o)return;const r=(await e.tryParseHTMLToBlocks(o))[0];return window.__TEST_OPTIONS&&(window.__TEST_OPTIONS.mockID=void 0),delete r.id,{...t.operation,block:r}}}),delete:ue};function Bt(e,t,o,r,n){if(typeof r=="boolean"){const i=r?e.getSelectionCutBlocks():void 0;r=i?{from:i._meta.startPos,to:i._meta.endPos}:void 0}const s=o??{add:!0,update:!0,delete:!0};return[...s.update?[R.update(e,{idsSuffixed:!0,withDelays:t,updateSelection:r,onBlockUpdate:n})]:[],...s.add?[R.add(e,{idsSuffixed:!0,withDelays:t,onBlockUpdate:n})]:[],...s.delete?[R.delete(e,{idsSuffixed:!0,withDelays:t,onBlockUpdate:n})]:[]]}const Et={getStreamToolsProvider:(e={})=>({getStreamTools:(t,o,r)=>Bt(t,e.withDelays??!0,e.defaultStreamTools,o,r)}),tools:R,defaultPromptBuilder:Pt,defaultPromptInputDataBuilder:Ct,promptHelpers:{getDataForPromptNoSelection:je,getDataForPromptWithSelection:De}};async function _t(e){return e.selectedBlocks?{...await $e(e.editor,{selectedBlocks:e.selectedBlocks}),userPrompt:e.userPrompt}:{...await qe(e.editor,{excludeBlockIds:e.emptyCursorBlockToDelete?[e.emptyCursorBlockToDelete]:void 0}),userPrompt:e.userPrompt}}async function qe(e,t){const o=P(e.document).length===0,r=e.getTextCursorPosition().block.id,n=P(e.document,{cursorBlockId:r}),s=await B(C(n),async c=>({...c,children:void 0})),i=X(e,s).filter(c=>"cursor"in c||!(t.excludeBlockIds||[]).includes(c.id));return{selection:!1,jsonBlocks:j(i),isEmptyDocument:o}}async function $e(e,t){const o=P(e.document).length===0,r=await B(C(t.selectedBlocks),async s=>s),n=j(r);return{isEmptyDocument:o,selection:!0,jsonSelectedBlocks:n,jsonDocument:(await B(C(e.document),async s=>({...s,id:void 0,children:void 0}))).map(({block:s})=>({block:s}))}}function At(e){const t={},o={};return e.forEach(n=>{const{type:s,...a}=n.properties,i=JSON.stringify(a);t[i]?t[i].push(s.enum[0]):(t[i]=[s.enum[0]],o[i]=n)}),Object.keys(t).map(n=>{const s=o[n];return{...s,properties:{...s.properties,type:{type:"string",enum:t[n]}}}})}function Nt(e){return{type:"object",properties:Object.fromEntries(Object.entries(e).map(([t,o])=>[t,{type:o.propSchema}])),additionalProperties:!1}}function Lt(){return{type:"object",properties:{type:{type:"string",enum:["text"]},text:{type:"string"},styles:{$ref:"#/$defs/styles"}},additionalProperties:!1,required:["type","text"]}}function He(e){return{type:"object",properties:Object.fromEntries(Object.entries(e).filter(([t,o])=>o.default!==void 0).map(([t,o])=>[t,{type:typeof o.default,enum:o.values}])),additionalProperties:!1}}function jt(e){return{type:"array",items:{anyOf:Object.entries(e).map(([t,o])=>o==="text"?{$ref:"#/$defs/styledtext"}:o==="link"?{type:"object",properties:{type:{type:"string",enum:["link"]},content:{type:"array",items:{$ref:"#/$defs/styledtext"}},href:{type:"string"}},additionalProperties:!1,required:["type","href","content"]}:{type:"object",properties:{type:{type:"string",enum:[o.type]},content:o.content==="styled"?{type:"array",items:{$ref:"#/$defs/styledtext"}}:void 0,props:He(o.propSchema)},additionalProperties:!1,required:["type",...o.content==="styled"?["content"]:[]]})}}}function Dt(e){return{anyOf:At(Object.entries(e).map(([t,o])=>({type:"object",properties:{type:{type:"string",enum:[o.type]},content:o.content==="inline"?{$ref:"#/$defs/inlinecontent"}:o.content==="table"?{type:"object",properties:{}}:void 0,props:He(o.propSchema)},additionalProperties:!1,required:["type"]})))}}function qt(e){const t=JSON.parse(JSON.stringify({blockSchema:e.blockSchema,inlineContentSchema:e.inlineContentSchema,styleSchema:e.styleSchema}));return{removeFileBlocks(){return t.blockSchema=Object.fromEntries(Object.entries(t.blockSchema).filter(([o,r])=>{var n;return!((n=e.blockSpecs[r.type].implementation.meta)!=null&&n.fileBlockAccept)})),this},removeDefaultProps(){return t.blockSchema=Object.fromEntries(Object.entries(t.blockSchema).map(([o,r])=>[o,{...r,propSchema:Object.fromEntries(Object.entries(r.propSchema).filter(n=>typeof k.defaultProps[n[0]]>"u"))}])),this},get(){return t}}}function ke(e){return e=qt(e).removeFileBlocks().removeDefaultProps().get(),{$defs:{styles:Nt(e.styleSchema),styledtext:Lt(),inlinecontent:jt(e.inlineContentSchema),block:Dt(e.blockSchema)}}}function Ue(e,t){return!t.schema.inlineContentSchema[e.type]||k.isStyledTextInlineContent(e)&&!("text"in e)?!1:k.isLinkInlineContent(e)?!("content"in e)||!("href"in e)?!1:Ue(e.content,t):!0}function Se(e,t,o){const r=e.type||o,n=t.schema.blockSchema[r];if(!n)return{ok:!1,error:"block type not found in editor"};if(e.children,n.content==="none"){if(e.content)return{ok:!1,error:"block content not expected for this block type"}}else{if(!e.content)return{ok:!0,value:e};if(!Array.isArray(e.content))return{ok:!1,error:"block content must be an array"};if(n.content==="table")return{ok:!0,value:e};if(!e.content.every(s=>Ue(s,t)))return{ok:!1,error:"block content must be an array of inline content"}}return{ok:!0,value:e}}const V={add:le({description:"Insert new blocks",schema:e=>({block:{$ref:"#/$defs/block"},...ke(e.schema)}),validateBlock:Se,rebaseTool:async(e,t)=>Y(t,W(t)),toJSONToolCall:async(e,t)=>t.operation}),update:ce({description:"Update a block, the new block will replace the existing block.",schema:e=>({block:{$ref:"#/$defs/block"},...ke(e.schema)}),validateBlock:Se,rebaseTool:async(e,t)=>Y(t,W(t)),toJSONToolCall:async(e,t)=>{const o=Object.fromEntries(Object.entries(k.defaultProps).map(([r,n])=>[r,n.default]));return{...t.operation,block:{...t.operation.block,props:{...o,...t.operation.block.props}}}}}),delete:ue};function $t(e,t){e.length>0&&e.push({role:"assistant",id:"document-state-"+e.length,parts:[{type:"text",text:"This is the latest state of the selection (ignore previous selections, you MUST issue operations against this latest version of the selection):"},{type:"text",text:JSON.stringify(t.jsonSelectedBlocks)},{type:"text",text:"This is the latest state of the document (INCLUDING the selected text), find the selected text in there to understand the context:"},{type:"text",text:JSON.stringify(t.jsonDocument)}]},{role:"user",id:"user-prompt-"+e.length,parts:[{type:"text",text:"The user asks you to do the following:"},{type:"text",text:t.userPrompt}]}),e.push({role:"system",id:"document-state-intro",parts:[{type:"text",text:`You're manipulating a selected part of a text document using JSON blocks.
|
|
1
|
+
"use strict";var ot=Object.defineProperty;var rt=(e,t,o)=>t in e?ot(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o;var L=(e,t,o)=>rt(e,typeof t!="symbol"?t+"":t,o);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const nt=require("@ai-sdk/react"),b=require("@blocknote/core"),$=require("@blocknote/prosemirror-suggest-changes"),H=require("prosemirror-model"),U=require("prosemirror-state"),st=require("prosemirror-tables"),J=require("prosemirror-view"),it=require("y-prosemirror"),at=require("lodash.isequal"),re=require("@ai-sdk/provider-utils"),T=require("ai"),x=require("prosemirror-transform"),ee=require("prosemirror-changeset"),y=require("react/jsx-runtime"),_=require("@blocknote/react"),w=require("react"),Ie=require("zustand"),te=require("@floating-ui/react"),Oe=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},lt=Oe(at),j=Oe(w),me=e=>{let t;const o=new Set,r=(c,u)=>{const m=typeof c=="function"?c(t):c;if(!Object.is(m,t)){const p=t;t=u??(typeof m!="object"||m===null)?m:Object.assign({},t,m),o.forEach(d=>d(t,p))}},n=()=>t,i={setState:r,getState:n,getInitialState:()=>l,subscribe:c=>(o.add(c),()=>o.delete(c))},l=t=e(r,n,i);return i},fe=e=>e?me(e):me;function ct(e){const{properties:t,required:o,$defs:r,...n}=e.inputSchema;return{schema:{type:"object",description:e.description,properties:{type:{type:"string",enum:[e.name]},...t},required:["type",...o??[]],additionalProperties:!1,...n},$defs:r}}function Me(e){const t=e.map(r=>ct(r)),o={};for(const r of t)for(const n in r.$defs){if(o[n]&&!lt.default(o[n],r.$defs[n]))throw new Error(`Duplicate, but different definition for ${n}`);o[n]=r.$defs[n]}return{type:"object",properties:{operations:{type:"array",items:{anyOf:t.map(r=>r.schema)}}},additionalProperties:!1,required:["operations"],$defs:Object.keys(o).length>0?o:void 0}}function Be(e,t){return{async sendAIRequest(o,r){const n=await t(o);return await e(o.chat.messages,n),o.chat.sendMessage(void 0,{...r,body:{...(r==null?void 0:r.body)??{},toolDefinitions:{applyDocumentOperations:{name:"applyDocumentOperations",inputSchema:Me(o.streamTools),outputSchema:{type:"object"}}}},metadata:{promptData:n}})}}}class ne extends Error{constructor(t,o,r){super(t,r),this.chunk=o,this.name="ChunkExecutionError"}}class Ee{constructor(t){L(this,"stream");this.streamTools=t,this.stream=this.createStream()}createStream(){let t;const o=new TransformStream({transform:async(i,l)=>{const c=typeof i=="string"?await ut(i,(t==null?void 0:t.isPossiblyPartial)??!1,this.streamTools):i;c&&(t=c,l.enqueue(c))},flush:i=>{t!=null&&t.isPossiblyPartial&&i.error(new Error("stream ended with a partial operation"))}}),r=o.readable.pipeThrough(this.createExecutor()),[n,s]=r.tee(),a=n.pipeTo(new WritableStream);return{writable:o.writable,readable:s,finishPromise:a}}createExecutor(){const t=this.streamTools.map(o=>o.executor());return new TransformStream({transform:async(o,r)=>{var s;let n=!1;for(const a of t)try{if(await a.execute(o)){r.enqueue({status:"ok",chunk:o}),n=!0;break}}catch(i){throw new ne(`Tool execution failed: ${re.getErrorMessage(i)}`,o,{cause:i})}if(!n){const a=((s=o.operation)==null?void 0:s.type)||"unknown";throw new Error(`No tool could handle operation of type: ${a}`)}}})}get writable(){return this.stream.writable}get readable(){return this.stream.readable}async finish(){await this.stream.finishPromise}async executeOperationsArray(t){const o=this.writable.getWriter();for await(const r of t){const n=await T.parsePartialJson(r);if(n.state==="undefined-input"||n.state==="failed-parse"||!n)return;await o.write(r)}await o.close(),await this.finish()}async execute(t){const o=this.writable.getWriter();for await(const r of t)await o.write(r);await o.close(),await this.finish()}async executeOne(t){await this.execute(async function*(){yield{operation:t,isUpdateToPreviousOperation:!1,isPossiblyPartial:!1,metadata:{}}}())}}async function ut(e,t,o){const r=await T.parsePartialJson(e);if(r.state==="undefined-input"||r.state==="failed-parse"||!r)return;const n=o.find(a=>{var i;return a.name===((i=r.value)==null?void 0:i.type)}),s=n&&n.validate(r.value);if(s!=null&&s.ok)return{operation:s.value,isPossiblyPartial:r.state==="repaired-parse",isUpdateToPreviousOperation:t,metadata:void 0}}function dt(e){return new ReadableStream({async start(t){try{for await(const o of e)t.enqueue(o);t.close()}catch(o){t.error(o)}}})}function _e(e){if(e.locked)throw new Error("Stream (source) is already locked and cannot be iterated.");const t=e.pipeThrough(new TransformStream);return t[Symbol.asyncIterator]=()=>{if(t.locked)throw new Error("Stream is already locked and cannot be iterated again.");const o=t.getReader();return{async next(){const{done:r,value:n}=await o.read();return r?{done:!0,value:void 0}:{done:!1,value:n}}}},t}function pt(e){return _e(dt(e))}async function*mt(e,t){var s;let o=0,r=!0,n;for await(const a of e)if((s=a.operations)!=null&&s.length){for(let i=o;i<a.operations.length;i++){const l=a.operations[i];n=l,yield{partialOperation:l,isUpdateToPreviousOperation:i===o&&!r,isPossiblyPartial:i===a.operations.length-1,metadata:t},r=!1}o=a.operations.length-1}if(!n)throw new Error("No operations seen");yield{partialOperation:n,isUpdateToPreviousOperation:!0,isPossiblyPartial:!1,metadata:t}}async function*ft(e,t){let o=!1;for await(const r of e){const n=r.operation;n.ok?(yield{operation:n.value,isUpdateToPreviousOperation:o?!1:r.isUpdateToPreviousOperation,isPossiblyPartial:r.isPossiblyPartial,metadata:r.metadata},o=!1):(o=o||!r.isUpdateToPreviousOperation,t==null||t({...r,operation:n}))}}async function*ht(e,t){for await(const o of e){const r=t.find(s=>s.name===o.partialOperation.type);if(!r){yield{operation:{ok:!1,error:`No matching function for ${o.partialOperation.type}`},isUpdateToPreviousOperation:o.isUpdateToPreviousOperation,isPossiblyPartial:o.isPossiblyPartial,metadata:o.metadata};continue}yield{operation:r.validate(o.partialOperation),isUpdateToPreviousOperation:o.isUpdateToPreviousOperation,isPossiblyPartial:o.isPossiblyPartial,metadata:o.metadata}}}async function*yt(e,t){const o=ht(e,t);yield*ft(o,n=>{if(!n.isPossiblyPartial)throw new Error("invalid operation: "+n.operation.error)})}function Ae(e,t,o){return pt(yt(mt(_e(e),o),t))}async function gt(e,t,o){const r=new Ee(e),n=bt();n.output.pipeTo(r.writable);const s=new Map;let a=!0;const i=t["~registerMessagesCallback"](()=>{St(t,d=>{if(!s.has(d.toolCallId)){const h=kt(e,d.toolName,d.toolCallId);n.append(h.operationsStream),s.set(d.toolCallId,h),a&&(a=!1,o==null||o())}return s.get(d.toolCallId)})});await new Promise(d=>{const h=t["~registerStatusCallback"](()=>{(t.status==="ready"||t.status==="error")&&(i(),h(),t.status!=="error"&&f(),d())}),f=t["~registerErrorCallback"](()=>{if(t.error){f();for(const k of s.values())k.complete||k.writer.abort(t.error)}})}),await n.finalize();const c=(await Promise.allSettled([r.finish()]))[0];let u;if(c.status==="rejected"){if(c.reason instanceof ne)u=c.reason;else if(!t.error)throw new Error("Unexpected: no ChunkExecutionError but also no chat.error (network error?)")}let m=!1;const p=Array.from(s.values().filter(d=>d.complete));if(p.forEach((d,h)=>{const f=d.toolCallId===(u==null?void 0:u.chunk.metadata.toolCallId);f&&(m=!0),t.addToolResult({tool:p[h].toolName,toolCallId:p[h].toolCallId,output:m===!1?{status:"ok"}:f?{status:"error",error:re.getErrorMessage(u)}:{status:"not-executed-previous-tool-errored"}})}),u)throw u;if(t.error)throw t.error}function bt(){let e,t=Promise.resolve(),o=!1;const r=new ReadableStream({start(a){e=a},cancel(a){o=!0,e.error(a)}});async function n(a){if(o)throw new Error("Appendable stream canceled, can't append");const i=a.getReader();return t=t.then(async()=>{for(;;)try{const{done:l,value:c}=await i.read();if(l||o)break;e.enqueue(c)}catch(l){o=!0,e.error(l);break}}),t}async function s(){await t,o||e.close()}return{output:r,append:n,finalize:s}}function St(e,t){var o;for(const r of((o=e.lastMessage)==null?void 0:o.parts)??[]){if(!T.isToolUIPart(r)||r.type.replace("tool-","")!=="applyDocumentOperations")continue;const s=r.toolCallId,a=t({toolName:r.type.replace("tool-",""),toolCallId:s});wt(r,a)}}function kt(e,t,o){const r=new TransformStream,n=Ae(r.readable,e,{toolCallId:o});return{writer:r.writable.getWriter(),complete:!1,operationsStream:n,toolName:t,toolCallId:o}}function wt(e,t){if(e.state==="input-streaming"){const o=e.input;o!==void 0&&t.writer.write(o)}else if(e.state==="input-available"){const o=e.input;if(o===void 0)throw new Error("input is undefined");t.complete||(t.complete=!0,t.writer.write(o),t.writer.close())}}function se(e){return(e.type==="paragraph"||!e.type)&&!e.content||Array.isArray(e.content)&&e.content.length===0}function xt(e,t,o=!0,r=!0){let n=0,s=e.length;if(o)for(;n<s&&t(e[n]);)n++;if(r)for(;s>n&&t(e[s-1]);)s--;return e.slice(n,s)}function P(e,t){return xt(e,r=>se(r)&&(t==null?void 0:t.cursorBlockId)!==r.id,(t==null?void 0:t.trimStart)??!1,(t==null?void 0:t.trimEnd)??!0)}function Ne(e){const{useSelection:t,deleteEmptyCursorBlock:o,streamToolsProvider:r}={useSelection:e.useSelection??!1,deleteEmptyCursorBlock:e.deleteEmptyCursorBlock??!0,streamToolsProvider:e.streamToolsProvider??M.html.getStreamToolsProvider()},n=t?void 0:e.editor.getTextCursorPosition().block,s=n&&o&&se(n)&&P(e.editor.document).length>0?n.id:void 0,a=t?e.editor.getSelectionCutBlocks():void 0,i=r.getStreamTools(e.editor,a?{from:a._meta.startPos,to:a._meta.endPos}:void 0,e.onBlockUpdated);return{editor:e.editor,chat:e.chat,userPrompt:e.userPrompt,selectedBlocks:a==null?void 0:a.blocks,streamTools:i,emptyCursorBlockToDelete:s}}async function Le(e){const{aiRequest:t,sender:o,chatRequestOptions:r,onStart:n}=e,s=gt(t.streamTools,t.chat,()=>{n==null||n(),t.emptyCursorBlockToDelete&&t.editor.getBlock(t.emptyCursorBlockToDelete)&&t.editor.removeBlocks([t.emptyCursorBlockToDelete])});await o.sendAIRequest(t,r),await s}function Tt(e,t){e.length>0&&e.push({role:"assistant",id:"document-state-"+e.length,parts:[{type:"text",text:"This is the latest state of the selection (ignore previous selections, you MUST issue operations against this latest version of the selection):"},{type:"text",text:JSON.stringify(t.htmlSelectedBlocks)},{type:"text",text:"This is the latest state of the document (INCLUDING the selected text), find the selected text in there to understand the context:"},{type:"text",text:JSON.stringify(t.htmlDocument)}]},{role:"user",id:"user-prompt-"+e.length,parts:[{type:"text",text:"The user asks you to do the following:"},{type:"text",text:t.userPrompt}]}),e.push({role:"system",id:"document-state-intro",parts:[{type:"text",text:"You're manipulating a selected part of a text document using HTML blocks. \n Make sure to follow the json schema provided and always include the trailing $ in ids.\n List items are 1 block with 1 list item each, so block content `<ul><li>item1</li></ul>` is valid, but `<ul><li>item1</li><li>item2</li></ul>` is invalid. We'll merge them automatically.\n This is the selection as an array of html blocks:"}]},{role:"system",id:"document-state-selection",parts:[{type:"text",text:JSON.stringify(t.htmlSelectedBlocks)}]},{role:"system",id:"document-state-context",parts:[{type:"text",text:"This is the entire document (INCLUDING the selected text), find the selected text in there to understand the context:"},{type:"text",text:JSON.stringify(t.htmlDocument)}]},{role:"user",id:"user-prompt",parts:[{type:"text",text:t.userPrompt}]})}function vt(e,t){if(e.length>0){e.push({role:"assistant",id:"document-state-"+e.length,parts:[{type:"text",text:"This is the latest state of the document (ignore previous documents, you MUST issue operations against this latest version of the document):"},{type:"text",text:JSON.stringify(t.htmlBlocks)}]},{role:"user",id:"user-prompt-"+e.length,parts:[{type:"text",text:t.userPrompt}]});return}e.push({role:"system",id:"document-state-intro",parts:[{type:"text",text:"You're manipulating a text document using HTML blocks. \n Make sure to follow the json schema provided. When referencing ids they MUST be EXACTLY the same (including the trailing $). \n List items are 1 block with 1 list item each, so block content `<ul><li>item1</li></ul>` is valid, but `<ul><li>item1</li><li>item2</li></ul>` is invalid. We'll merge them automatically.\n For code blocks, you can use the `data-language` attribute on a <code> block (wrapped with <pre>) to specify the language.\n This is the initial document as an array of html blocks (the cursor is BETWEEN two blocks as indicated by cursor: true):"}]},{role:"system",id:"document-state-data",parts:[{type:"text",text:JSON.stringify(t.htmlBlocks)}]},{role:"system",id:"extended-instructions",parts:[{type:"text",text:'First, determine what part of the document the user is talking about. You SHOULD probably take cursor info into account if needed.\n EXAMPLE: if user says "below" (without pointing to a specific part of the document) he / she probably indicates the block(s) after the cursor. \n EXAMPLE: If you want to insert content AT the cursor position (UNLESS indicated otherwise by the user), \n then you need `referenceId` to point to the block before the cursor with position `after` (or block below and `before`).\n \n '+(t.isEmptyDocument?"Because the document is empty, first update the empty block before adding new blocks.":"Prefer updating existing blocks over removing and adding (but this also depends on the user's question).")}]},{role:"user",id:"user-prompt",parts:[{type:"text",text:t.userPrompt}]})}const Pt=async(e,t)=>{t.selection?Tt(e,t):vt(e,t)};function X(e,t){const o=e.getTextCursorPosition(),r=[];for(const n of t){const s=n.id===o.block.id;r.push({id:n.id,block:n.block}),s&&r.push({cursor:!0})}return r}async function B(e,t){return await Promise.all(e.map(async o=>({id:o.id,block:await t(o)})))}function C(e){return e.flatMap(t=>[{...t,children:[]},...C(t.children)])}function D(e){return e.map(t=>typeof t=="object"&&t&&"id"in t?{...t,id:`${t.id}$`}:t)}async function Ct(e){return e.selectedBlocks?{...await De(e.editor,{selectedBlocks:e.selectedBlocks}),userPrompt:e.userPrompt}:{...await je(e.editor,{excludeBlockIds:e.emptyCursorBlockToDelete?[e.emptyCursorBlockToDelete]:void 0}),userPrompt:e.userPrompt}}async function je(e,t){const o=P(e.document).length===0,r=e.getTextCursorPosition().block.id,n=P(e.document,{cursorBlockId:r}),s=await B(C(n),async c=>e.blocksToHTMLLossy([c])),i=X(e,s).filter(c=>"cursor"in c||!(t.excludeBlockIds||[]).includes(c.id));return{selection:!1,htmlBlocks:D(i),isEmptyDocument:o}}async function De(e,t){const o=P(e.document).length===0,r=await B(C(t.selectedBlocks),async s=>e.blocksToHTMLLossy([s])),n=D(r);return{isEmptyDocument:o,selection:!0,htmlSelectedBlocks:n,htmlDocument:(await B(C(e.document),async s=>e.blocksToHTMLLossy([s]))).map(({block:s})=>({block:s}))}}function It(e){let t,o=!1;return e.descendants((r,n)=>o?!1:(r.isText&&(o=!0,t=n),!0)),t}function Z(e){var s;const t=b.getPmSchema(e),{modification:o}=t.marks,r=[],n=new x.Transform(e.before);for(let a=0;a<e.steps.length;a++){const i=e.steps[a],l=new x.Mapping(e.mapping.maps.slice(0,a)).invert();if(i.structure){if(i instanceof x.ReplaceStep){if(i.to!==i.from+1||i.slice.openStart!==0||i.slice.openEnd!==1||i.slice.content.size!==2)throw new Error("Structure change is not in expected format (ReplaceStep)")}else if(i instanceof x.ReplaceAroundStep){if(i.insert!==1||i.slice.size!==2||i.gapTo!==i.to-1||i.gapFrom!==i.from+1)throw new Error("Structure change is not in expected format (ReplaceAroundStep)")}else throw new Error("Step is not a ReplaceStep or ReplaceAroundStep");const S=l.map(i.from),g=i.slice.content.firstChild,O=n.doc.resolve(n.mapping.map(S)).nodeAfter;let v=g.marks||[];g.type!==O.type&&(v=o.create({type:"nodeType",previousValue:O.type.name,newValue:g.type.name}).addToSet(v));const z=new Set([...Object.keys(g.attrs),...Object.keys(O.attrs)]);for(const E of z)g.attrs[E]!==O.attrs[E]&&(v=o.create({type:"attr",attrName:E,previousValue:O.attrs[E],newValue:g.attrs[E]}).addToSet(v));const N=n.steps.length;n.setNodeMarkup(n.mapping.map(S),g.type,g.attrs,v),r.push({prosemirrorSteps:n.steps.slice(N),selection:void 0,type:"replace"});continue}if(!(i instanceof x.ReplaceStep))throw new Error("Step is not a ReplaceStep");const c=l.map(i.from),u=l.map(i.to);if(i.slice.openStart>0||i.slice.openEnd>0)throw new Error("Slice has openStart or openEnd > 0, but structure=false");r.push({prosemirrorSteps:[],selection:{anchor:n.mapping.map(c),head:n.mapping.map(u)},type:"select"});const m=i.slice.content.textBetween(0,i.slice.size),p=m===n.doc.textBetween(n.mapping.map(c),n.mapping.map(u));let d;if(p)d=i.slice.content.size;else if(m.length===0)d=i.slice.content.size;else{const S=It(i.slice.content);if(S===void 0)throw new Error("unexpected: no first character found");d=S+1}let h=n.mapping.map(u);const f=n.mapping.map(u);let k=!0;for(let S=d;S<=i.slice.content.size;S++){const g=k&&c!==u,O=n.steps.length;if(g){const N=n.doc.resolve(n.mapping.map(c));(s=N.nodeAfter)!=null&&s.isBlock&&n.addNodeMark(N.pos,t.mark("deletion",{})),n.addMark(N.pos,h,t.mark("deletion",{})),h=n.mapping.map(u)}const v=new H.Slice(i.slice.content.cut(0,S),0,0);n.replace(f,h,v).addMark(f,f+v.content.size,t.mark("insertion",{})),n.doc.nodesBetween(f,f+v.content.size,(N,E)=>E<f||E>f+v.content.size?!0:(N.isBlock&&n.addNodeMark(E,t.mark("insertion",{})),!1)),h=n.mapping.slice(O).map(h);const z=U.TextSelection.near(n.doc.resolve(f+v.content.size),-1);r.push({prosemirrorSteps:n.steps.slice(O),selection:{anchor:z.from,head:z.from},type:g?"replace":"insert"}),k=!1}}return r}async function ie(e){const t=Math.random()*.3+.85;if(e.type==="select")await new Promise(o=>setTimeout(o,100*t));else if(e.type==="insert")await new Promise(o=>setTimeout(o,10*t));else if(e.type==="replace")await new Promise(o=>setTimeout(o,200*t));else throw new b.UnreachableCaseError(e.type)}function ae(e,t){e.setMeta("addToHistory",!1),t.selection&&e.setMeta("aiAgent",{selection:{anchor:t.selection.anchor,head:t.selection.head}});for(const o of t.prosemirrorSteps)if(e.maybeStep(o).failed)throw new Error("failed to apply step");return e}function Ot(e,t,o){const r=new x.Transform(t);for(const a of e){const i=new x.ReplaceStep(r.mapping.map(a.fromA),r.mapping.map(a.toA),o.slice(a.fromB,a.toB));r.step(i)}const n=r.mapping.invert();let s=r.doc.content.findDiffStart(o.content);for(;s!==null;){const a=o.resolve(s).nodeAfter,i=r.doc.resolve(s).nodeAfter;if(!a||!i)throw new Error("diffNode not found");const l=!a.isLeaf&&a.content.eq(i.content),c=l?1:Math.min(a.nodeSize,i.nodeSize),u=s+c,m=n.map(s),p=n.map(u);let d=e.length;for(let f=0;f<e.length;f++)if(e[f].fromA>=p){d=f;break}e.splice(d,0,{fromA:m,toA:p,fromB:s,toB:u,deleted:[],inserted:[],type:l?"node-type-or-attr-update":"mark-update"}),r.step(new x.ReplaceStep(s,u,o.slice(s,u),l));const h=r.doc.content.findDiffStart(o.content);if(h===s)throw new Error("diffStart not moving");s=h}return e}const he=(e,t)=>{const o=new Set,r=new Set;e.descendants(a=>{a.type.name==="tableCell"&&o.add(JSON.stringify(a.toJSON()))}),t.descendants(a=>{a.type.name==="tableCell"&&r.add(JSON.stringify(a.toJSON()))});const n=new Set([...o].filter(a=>r.has(a)));return{encodeCharacter:a=>a,encodeNodeStart:a=>{if(a.type.name==="tableCell"){const i=JSON.stringify(a.toJSON());return n.has(i)?i:a.type.name}return a.type.name},encodeNodeEnd:a=>{if(a.type.name==="tableCell"){const i=JSON.stringify(a.toJSON());return n.has(i)?i:-1}return-1},compareTokens:(a,i)=>a===i}};function Q(e,t,o=!1,r,n){const s=b.getNodeById(e.id,t),a=new x.Transform(t);b.updateBlockTr(a,s.posBeforeNode,e.block,r,n);let i=a.doc,l=ee.ChangeSet.create(t,void 0,he(t,i));if(l=l.addSteps(i,a.mapping.maps,0),o&&l.changes.length>0){const m=l.changes[l.changes.length-1],p=m.toA-m.fromA,d=m.toB-m.fromB;if(p>d){const h=t.slice(m.fromA+d,m.toA);a.step(new x.ReplaceStep(m.toB,m.toB,h)),i=a.doc,l=ee.ChangeSet.create(l.startDoc,void 0,he(l.startDoc,i)),l=l.addSteps(i,a.mapping.maps,0)}}const c=[],u=ee.simplifyChanges(l.changes,i);for(let m=0;m<u.length;m++){const p=u[m],d=i.slice(p.fromB,p.toB);if(d.openEnd===1&&d.openStart===0&&(p.type="node-type-or-attr-update",d.size>2)){const h={fromA:p.fromA,toA:p.fromA+1,fromB:p.fromB,toB:p.fromB+1,deleted:[],inserted:[],type:"node-type-or-attr-update"},f={fromA:p.fromA+1,toA:p.toA,fromB:p.fromB+1,toB:p.toB,deleted:[],inserted:[]};u.splice(m,1,h,f),m++}}Ot(u,t,i);for(let m=0;m<u.length;m++){const p=u[m],d=i.slice(p.fromB,p.toB);if(d.openEnd>0&&d.size>1)throw new Error("unexpected, openEnd > 0 and size > 1, this should have been split into two steps");m===u.length-1&&o&&p.type==="mark-update"||c.push(new x.ReplaceStep(p.fromA,p.toA,d,p.type==="node-type-or-attr-update"))}return c}function Mt(e,t){if(!e||!Array.isArray(e)||e.length===0)return{ok:!1,error:"blocks is required"};const o=[];for(const r of e){const n=t(r);if(!n.ok)return{ok:!1,error:`Invalid block: ${n.error}`};o.push(n.value)}return{ok:!0,value:o}}function le(e){return(t,o)=>{const r=typeof e.schema=="function"?e.schema(t):e.schema;return{name:"add",description:e.description,inputSchema:{type:"object",properties:{referenceId:{type:"string",description:"MUST be an id of a block in the document"},position:{type:"string",enum:["before","after"],description:"`after` to add blocks AFTER (below) the block with `referenceId`, `before` to add the block BEFORE (above)"},blocks:{items:r.block,type:"array"}},required:["referenceId","position","blocks"],$defs:r.$defs},validate:n=>{if(n.type!=="add")return{ok:!1,error:"invalid operation type"};if(n.position!=="before"&&n.position!=="after")return{ok:!1,error:"invalid position"};if(!n.referenceId||!n.blocks)return{ok:!1,error:"referenceId and blocks are required"};let s=n.referenceId;if(o.idsSuffixed){if(!(s!=null&&s.endsWith("$")))return{ok:!1,error:"referenceId must end with $"};s=s.slice(0,-1)}if(!t.getBlock(s))return{ok:!1,error:"referenceId not found"};const i=Mt(n.blocks,l=>e.validateBlock(l,t));return i.ok?{ok:!0,value:{type:n.type,referenceId:s,position:n.position,blocks:i.value}}:i},executor:()=>{let n=[];const s={};return{execute:async a=>{var c;if(a.isUpdateToPreviousOperation||(n=[]),a.operation.type!=="add")return!1;const i=a.operation,l=await e.toJSONToolCall(t,{...a,operation:i});if(!l||a.isPossiblyPartial&&se(l.blocks[l.blocks.length-1]))return!0;for(let u=0;u<l.blocks.length;u++){const m=l.blocks[u],p=t.prosemirrorState.tr;let d=[];if(u<n.length){const h=await e.rebaseTool(n[u],t),k=Q({id:n[u],block:m},h.doc,!1).map(S=>S.map(h.invertMap));for(const S of k)p.step(S.map(p.mapping));d=Z(p),d=d.filter(S=>S.type!=="select")}else{const h=i.position==="after"?s[i.referenceId]:void 0,f=b.insertBlocks(p,[m],u>0?n[u-1]:h||i.referenceId,u>0?"after":i.position);n.push(...f.map(k=>k.id)),d=Z(p)}for(const h of d)o.withDelays&&await ie(h),t.transact(f=>{ae(f,h)}),(c=o.onBlockUpdate)==null||c.call(o,n[u])}return a.isPossiblyPartial||i.position==="after"&&(s[i.referenceId]=n[n.length-1]),!0}}}}}}function ce(e){return(t,o)=>{const r=typeof e.schema=="function"?e.schema(t):e.schema;return{name:"update",description:e.description,inputSchema:{type:"object",properties:{id:{type:"string",description:"id of block to update"},block:r.block},required:["id","block"],$defs:r.$defs},validate:n=>{if(n.type!=="update")return{ok:!1,error:"invalid operation type"};if(!n.id)return{ok:!1,error:"id is required"};let s=n.id;if(o.idsSuffixed){if(!(s!=null&&s.endsWith("$")))return{ok:!1,error:"id must end with $"};s=s.slice(0,-1)}if(!n.block)return{ok:!1,error:"block is required"};const a=t.getBlock(s);if(!a)return console.error("BLOCK NOT FOUND",s),{ok:!1,error:"block not found"};const i=e.validateBlock(n.block,t,a.type);return i.ok?{ok:!0,value:{type:n.type,id:s,block:i.value}}:i},executor:()=>{let s=50;const a=o.updateSelection?{from:b.trackPosition(t,o.updateSelection.from),to:b.trackPosition(t,o.updateSelection.to)}:void 0;return{execute:async i=>{var S;if(i.operation.type!=="update")return!1;const l=i.operation;if(i.isPossiblyPartial){const g=JSON.stringify(l.block).length;if(g<s)return!0;s=g+50}else s=50;const c=await e.rebaseTool(l.id,t),u=a?c.invertMap.invert().map(a.from()):void 0,m=a?c.invertMap.invert().map(a.to()):void 0,p=await e.toJSONToolCall(t,{...i,operation:l});if(!p)return!0;const d=Q(p,c.doc,i.isPossiblyPartial,u,m);if(d.length===1&&i.isPossiblyPartial)return!0;const h=d.map(g=>g.map(c.invertMap)),f=new x.Transform(t.prosemirrorState.doc);for(const g of h)f.step(g.map(f.mapping));const k=Z(f);for(const g of k)o.withDelays&&await ie(g),t.transact(O=>{ae(O,g)}),(S=o.onBlockUpdate)==null||S.call(o,l.id);return!0}}}}}}const ue=(e,t)=>({name:"delete",description:"Delete a block",inputSchema:{type:"object",properties:{id:{type:"string",description:"id of block to delete"}},required:["id"]},validate:o=>{if(o.type!=="delete")return{ok:!1,error:"invalid operation type"};if(!o.id)return{ok:!1,error:"id is required"};let r=o.id;if(t.idsSuffixed){if(!(r!=null&&r.endsWith("$")))return{ok:!1,error:"id must end with $"};r=r.slice(0,-1)}return e.getBlock(r)?{ok:!0,value:{type:"delete",id:r}}:{ok:!1,error:"block not found"}},executor:()=>({execute:async o=>{var a;if(o.operation.type!=="delete")return!1;const r=o.operation,n=e.prosemirrorState.tr;b.removeAndInsertBlocks(n,[r.id],[]);const s=Z(n);for(const i of s)t.withDelays&&await ie(i),e.transact(l=>{ae(l,i)}),(a=t.onBlockUpdate)==null||a.call(t,r.id);return!0}})});function ye(e){const t=e.lastIndexOf("<"),o=e.lastIndexOf(">");let r=e;if(t>o&&(r=e.substring(0,t),!r.trim()))return;const n=r.match(/&[a-zA-Z0-9]*$/);n&&(r=r.substring(0,r.length-n[0].length));const i=new DOMParser().parseFromString(`<div>${r}</div>`,"text/html").body.firstChild;return i?i.innerHTML:""}function W(e){let t;if($.applySuggestions(e.prosemirrorState,o=>{t=o}),!t)throw new Error("applySuggestionsTr is not set");return t}function Y(e,t){const o=t.mapping.invert();return{doc:t.doc,tr:()=>new x.Transform(t.doc),invertMap:o,rebaseTr:r=>{if(r.steps.length===0)throw new Error("No steps to apply");let n=e.prosemirrorState.tr;for(const s of r.steps){const a=s.map(o);if(!a)throw new Error("Step is not mapped");n=n.step(a)}return n}}}async function ge(e,t){var c;const o=W(t),r=b.getBlock(o.doc,e);if(!r)throw new Error("block not found");const n=await t.blocksToHTMLLossy([{...r,children:[]}]),s=(c=window.__TEST_OPTIONS)==null?void 0:c.mockID,a=await t.tryParseHTMLToBlocks(n);if(window.__TEST_OPTIONS&&(window.__TEST_OPTIONS.mockID=s),a.length!==1)throw new Error("html diff invalid block count");const i=a[0];if(i.id=e,Q({id:e,block:i},o.doc).length)throw new Error("html diff");return Y(t,o)}function be(e){return typeof e!="string"?{ok:!1,error:"block must be a string"}:{ok:!0,value:e}}const R={add:le({description:"Insert new blocks",schema:{block:{type:"string",description:"html of block (MUST be a single, VALID HTML element)"}},validateBlock:be,rebaseTool:ge,toJSONToolCall:async(e,t)=>{var n;const o=(n=window.__TEST_OPTIONS)==null?void 0:n.mockID,r=(await Promise.all(t.operation.blocks.map(async s=>{const a=t.isPossiblyPartial?ye(s):s;return a?(await e.tryParseHTMLToBlocks(a)).map(i=>(delete i.id,i)):[]}))).flat();if(window.__TEST_OPTIONS&&(window.__TEST_OPTIONS.mockID=o),r.length!==0)return{...t.operation,blocks:r}}}),update:ce({description:"Update a block",schema:{block:{type:"string",description:"html of block (MUST be a single HTML element)"}},validateBlock:be,rebaseTool:ge,toJSONToolCall:async(e,t)=>{const o=t.isPossiblyPartial?ye(t.operation.block):t.operation.block;if(!o)return;const r=(await e.tryParseHTMLToBlocks(o))[0];return window.__TEST_OPTIONS&&(window.__TEST_OPTIONS.mockID=void 0),delete r.id,{...t.operation,block:r}}}),delete:ue};function Bt(e,t,o,r,n){if(typeof r=="boolean"){const i=r?e.getSelectionCutBlocks():void 0;r=i?{from:i._meta.startPos,to:i._meta.endPos}:void 0}const s=o??{add:!0,update:!0,delete:!0};return[...s.update?[R.update(e,{idsSuffixed:!0,withDelays:t,updateSelection:r,onBlockUpdate:n})]:[],...s.add?[R.add(e,{idsSuffixed:!0,withDelays:t,onBlockUpdate:n})]:[],...s.delete?[R.delete(e,{idsSuffixed:!0,withDelays:t,onBlockUpdate:n})]:[]]}const Et={getStreamToolsProvider:(e={})=>({getStreamTools:(t,o,r)=>Bt(t,e.withDelays??!0,e.defaultStreamTools,o,r)}),tools:R,defaultPromptBuilder:Pt,defaultPromptInputDataBuilder:Ct,promptHelpers:{getDataForPromptNoSelection:je,getDataForPromptWithSelection:De}};async function _t(e){return e.selectedBlocks?{...await $e(e.editor,{selectedBlocks:e.selectedBlocks}),userPrompt:e.userPrompt}:{...await qe(e.editor,{excludeBlockIds:e.emptyCursorBlockToDelete?[e.emptyCursorBlockToDelete]:void 0}),userPrompt:e.userPrompt}}async function qe(e,t){const o=P(e.document).length===0,r=e.getTextCursorPosition().block.id,n=P(e.document,{cursorBlockId:r}),s=await B(C(n),async c=>({...c,children:void 0})),i=X(e,s).filter(c=>"cursor"in c||!(t.excludeBlockIds||[]).includes(c.id));return{selection:!1,jsonBlocks:D(i),isEmptyDocument:o}}async function $e(e,t){const o=P(e.document).length===0,r=await B(C(t.selectedBlocks),async s=>s),n=D(r);return{isEmptyDocument:o,selection:!0,jsonSelectedBlocks:n,jsonDocument:(await B(C(e.document),async s=>({...s,id:void 0,children:void 0}))).map(({block:s})=>({block:s}))}}function At(e){const t={},o={};return e.forEach(n=>{const{type:s,...a}=n.properties,i=JSON.stringify(a);t[i]?t[i].push(s.enum[0]):(t[i]=[s.enum[0]],o[i]=n)}),Object.keys(t).map(n=>{const s=o[n];return{...s,properties:{...s.properties,type:{type:"string",enum:t[n]}}}})}function Nt(e){return{type:"object",properties:Object.fromEntries(Object.entries(e).map(([t,o])=>[t,{type:o.propSchema}])),additionalProperties:!1}}function Lt(){return{type:"object",properties:{type:{type:"string",enum:["text"]},text:{type:"string"},styles:{$ref:"#/$defs/styles"}},additionalProperties:!1,required:["type","text"]}}function He(e){return{type:"object",properties:Object.fromEntries(Object.entries(e).filter(([t,o])=>o.default!==void 0).map(([t,o])=>[t,{type:typeof o.default,enum:o.values}])),additionalProperties:!1}}function jt(e){return{type:"array",items:{anyOf:Object.entries(e).map(([t,o])=>o==="text"?{$ref:"#/$defs/styledtext"}:o==="link"?{type:"object",properties:{type:{type:"string",enum:["link"]},content:{type:"array",items:{$ref:"#/$defs/styledtext"}},href:{type:"string"}},additionalProperties:!1,required:["type","href","content"]}:{type:"object",properties:{type:{type:"string",enum:[o.type]},content:o.content==="styled"?{type:"array",items:{$ref:"#/$defs/styledtext"}}:void 0,props:He(o.propSchema)},additionalProperties:!1,required:["type",...o.content==="styled"?["content"]:[]]})}}}function Dt(e){return{anyOf:At(Object.entries(e).map(([t,o])=>({type:"object",properties:{type:{type:"string",enum:[o.type]},content:o.content==="inline"?{$ref:"#/$defs/inlinecontent"}:o.content==="table"?{type:"object",properties:{}}:void 0,props:He(o.propSchema)},additionalProperties:!1,required:["type"]})))}}function qt(e){const t=JSON.parse(JSON.stringify({blockSchema:e.blockSchema,inlineContentSchema:e.inlineContentSchema,styleSchema:e.styleSchema}));return{removeFileBlocks(){return t.blockSchema=Object.fromEntries(Object.entries(t.blockSchema).filter(([o,r])=>{var n;return!((n=e.blockSpecs[r.type].implementation.meta)!=null&&n.fileBlockAccept)})),this},removeDefaultProps(){return t.blockSchema=Object.fromEntries(Object.entries(t.blockSchema).map(([o,r])=>[o,{...r,propSchema:Object.fromEntries(Object.entries(r.propSchema).filter(n=>typeof b.defaultProps[n[0]]>"u"))}])),this},get(){return t}}}function Se(e){return e=qt(e).removeFileBlocks().removeDefaultProps().get(),{$defs:{styles:Nt(e.styleSchema),styledtext:Lt(),inlinecontent:jt(e.inlineContentSchema),block:Dt(e.blockSchema)}}}function Ue(e,t){return!t.schema.inlineContentSchema[e.type]||b.isStyledTextInlineContent(e)&&!("text"in e)?!1:b.isLinkInlineContent(e)?!("content"in e)||!("href"in e)?!1:Ue(e.content,t):!0}function ke(e,t,o){const r=e.type||o,n=t.schema.blockSchema[r];if(!n)return{ok:!1,error:"block type not found in editor"};if(e.children,n.content==="none"){if(e.content)return{ok:!1,error:"block content not expected for this block type"}}else{if(!e.content)return{ok:!0,value:e};if(!Array.isArray(e.content))return{ok:!1,error:"block content must be an array"};if(n.content==="table")return{ok:!0,value:e};if(!e.content.every(s=>Ue(s,t)))return{ok:!1,error:"block content must be an array of inline content"}}return{ok:!0,value:e}}const V={add:le({description:"Insert new blocks",schema:e=>({block:{$ref:"#/$defs/block"},...Se(e.schema)}),validateBlock:ke,rebaseTool:async(e,t)=>Y(t,W(t)),toJSONToolCall:async(e,t)=>t.operation}),update:ce({description:"Update a block, the new block will replace the existing block.",schema:e=>({block:{$ref:"#/$defs/block"},...Se(e.schema)}),validateBlock:ke,rebaseTool:async(e,t)=>Y(t,W(t)),toJSONToolCall:async(e,t)=>{const o=Object.fromEntries(Object.entries(b.defaultProps).map(([r,n])=>[r,n.default]));return{...t.operation,block:{...t.operation.block,props:{...o,...t.operation.block.props}}}}}),delete:ue};function $t(e,t){e.length>0&&e.push({role:"assistant",id:"document-state-"+e.length,parts:[{type:"text",text:"This is the latest state of the selection (ignore previous selections, you MUST issue operations against this latest version of the selection):"},{type:"text",text:JSON.stringify(t.jsonSelectedBlocks)},{type:"text",text:"This is the latest state of the document (INCLUDING the selected text), find the selected text in there to understand the context:"},{type:"text",text:JSON.stringify(t.jsonDocument)}]},{role:"user",id:"user-prompt-"+e.length,parts:[{type:"text",text:"The user asks you to do the following:"},{type:"text",text:t.userPrompt}]}),e.push({role:"system",id:"document-state-intro",parts:[{type:"text",text:`You're manipulating a selected part of a text document using JSON blocks.
|
|
2
2
|
Make sure to follow the json schema provided and always include the trailing $ in ids.
|
|
3
3
|
This is the selection as an array of JSON blocks:`},{type:"text",text:JSON.stringify(t.jsonSelectedBlocks)},{type:"text",text:"This is the entire document (INCLUDING the selected text), find the selected text in there to understand the context:"},{type:"text",text:JSON.stringify(t.jsonDocument)}]},{role:"user",id:"user-prompt",parts:[{type:"text",text:t.userPrompt}]})}function Ht(e,t){if(e.length>0){e.push({role:"assistant",id:"document-state-"+e.length,parts:[{type:"text",text:"This is the latest state of the document (ignore previous documents, you MUST issue operations against this latest version of the document):"},{type:"text",text:JSON.stringify(t.jsonBlocks)}]},{role:"user",id:"user-prompt-"+e.length,parts:[{type:"text",text:t.userPrompt}]});return}e.push({role:"system",id:"document-state",parts:[{type:"text",text:`You're manipulating a text document using JSON blocks.
|
|
4
4
|
Make sure to follow the json schema provided. When referencing ids they MUST be EXACTLY the same (including the trailing $).
|
|
5
|
-
This is the initial document as an array of JSON blocks (the cursor is BETWEEN two blocks as indicated by cursor: true):`},{type:"text",text:JSON.stringify(t.jsonBlocks)},{type:"text",text:'First, determine what part of the document the user is talking about. You SHOULD probably take cursor info into account if needed.\n EXAMPLE: if user says "below" (without pointing to a specific part of the document) he / she probably indicates the block(s) after the cursor. \n EXAMPLE: If you want to insert content AT the cursor position (UNLESS indicated otherwise by the user), \n then you need `referenceId` to point to the block before the cursor with position `after` (or block below and `before`).\n \n '+(t.isEmptyDocument?"Because the document is empty, first update the empty block before adding new blocks.":"Prefer updating existing blocks over removing and adding (but this also depends on the user's question).")}]},{role:"user",id:"user-prompt",parts:[{type:"text",text:t.userPrompt}]})}const Ut=async(e,t)=>{t.selection?$t(e,t):Ht(e,t)};function zt(e,t,o,r,n){if(typeof r=="boolean"){const i=r?e.getSelectionCutBlocks():void 0;r=i?{from:i._meta.startPos,to:i._meta.endPos}:void 0}const s=o??{add:!0,update:!0,delete:!0};return[...s.update?[V.update(e,{idsSuffixed:!0,withDelays:t,updateSelection:r,onBlockUpdate:n})]:[],...s.add?[V.add(e,{idsSuffixed:!0,withDelays:t,onBlockUpdate:n})]:[],...s.delete?[V.delete(e,{idsSuffixed:!0,withDelays:t,onBlockUpdate:n})]:[]]}const Jt={getStreamToolsProvider:(e={})=>({getStreamTools:(t,o,r)=>zt(t,e.withDelays??!0,e.defaultStreamTools,o,r)}),tools:V,defaultPromptBuilder:Ut,defaultPromptInputDataBuilder:_t,promptHelpers:{getDataForPromptNoSelection:qe,getDataForPromptWithSelection:$e}};async function Rt(e){return e.selectedBlocks?{...await Je(e.editor,{selectedBlocks:e.selectedBlocks}),userPrompt:e.userPrompt}:{...await ze(e.editor,{excludeBlockIds:e.emptyCursorBlockToDelete?[e.emptyCursorBlockToDelete]:void 0}),userPrompt:e.userPrompt}}async function ze(e,t){const o=P(e.document).length===0,r=e.getTextCursorPosition().block.id,n=P(e.document,{cursorBlockId:r}),s=await B(C(n),async c=>e.blocksToMarkdownLossy([c])),i=X(e,s).filter(c=>"cursor"in c||!(t.excludeBlockIds||[]).includes(c.id));return{selection:!1,markdownBlocks:
|
|
5
|
+
This is the initial document as an array of JSON blocks (the cursor is BETWEEN two blocks as indicated by cursor: true):`},{type:"text",text:JSON.stringify(t.jsonBlocks)},{type:"text",text:'First, determine what part of the document the user is talking about. You SHOULD probably take cursor info into account if needed.\n EXAMPLE: if user says "below" (without pointing to a specific part of the document) he / she probably indicates the block(s) after the cursor. \n EXAMPLE: If you want to insert content AT the cursor position (UNLESS indicated otherwise by the user), \n then you need `referenceId` to point to the block before the cursor with position `after` (or block below and `before`).\n \n '+(t.isEmptyDocument?"Because the document is empty, first update the empty block before adding new blocks.":"Prefer updating existing blocks over removing and adding (but this also depends on the user's question).")}]},{role:"user",id:"user-prompt",parts:[{type:"text",text:t.userPrompt}]})}const Ut=async(e,t)=>{t.selection?$t(e,t):Ht(e,t)};function zt(e,t,o,r,n){if(typeof r=="boolean"){const i=r?e.getSelectionCutBlocks():void 0;r=i?{from:i._meta.startPos,to:i._meta.endPos}:void 0}const s=o??{add:!0,update:!0,delete:!0};return[...s.update?[V.update(e,{idsSuffixed:!0,withDelays:t,updateSelection:r,onBlockUpdate:n})]:[],...s.add?[V.add(e,{idsSuffixed:!0,withDelays:t,onBlockUpdate:n})]:[],...s.delete?[V.delete(e,{idsSuffixed:!0,withDelays:t,onBlockUpdate:n})]:[]]}const Jt={getStreamToolsProvider:(e={})=>({getStreamTools:(t,o,r)=>zt(t,e.withDelays??!0,e.defaultStreamTools,o,r)}),tools:V,defaultPromptBuilder:Ut,defaultPromptInputDataBuilder:_t,promptHelpers:{getDataForPromptNoSelection:qe,getDataForPromptWithSelection:$e}};async function Rt(e){return e.selectedBlocks?{...await Je(e.editor,{selectedBlocks:e.selectedBlocks}),userPrompt:e.userPrompt}:{...await ze(e.editor,{excludeBlockIds:e.emptyCursorBlockToDelete?[e.emptyCursorBlockToDelete]:void 0}),userPrompt:e.userPrompt}}async function ze(e,t){const o=P(e.document).length===0,r=e.getTextCursorPosition().block.id,n=P(e.document,{cursorBlockId:r}),s=await B(C(n),async c=>e.blocksToMarkdownLossy([c])),i=X(e,s).filter(c=>"cursor"in c||!(t.excludeBlockIds||[]).includes(c.id));return{selection:!1,markdownBlocks:D(i),isEmptyDocument:o}}async function Je(e,t){const o=P(e.document).length===0,r=await B(C(t.selectedBlocks),async s=>e.blocksToMarkdownLossy([s])),n=D(r);return{isEmptyDocument:o,selection:!0,markdownSelectedBlocks:n,markdownDocument:(await B(C(e.document),async s=>e.blocksToMarkdownLossy([s]))).map(({block:s})=>({block:s}))}}async function we(e,t){const o=W(t),r=await t.blocksToMarkdownLossy([b.getBlock(o.doc,e)]),n=await t.tryParseMarkdownToBlocks(r),s=Q({id:e,block:n[0]},o.doc),a=new x.Mapping;for(const i of s){const l=i.map(a);if(!l)throw new Error("Failed to map step");o.step(l),a.appendMap(l.getMap())}return Y(t,o)}function xe(e){return typeof e!="string"?{ok:!1,error:"block must be a string"}:{ok:!0,value:e}}const F={add:le({description:"Insert new blocks",schema:{block:{$ref:"#/$defs/block"},$defs:{block:{type:"string",description:"markdown of block"}}},validateBlock:xe,rebaseTool:we,toJSONToolCall:async(e,t)=>{const o=await Promise.all(t.operation.blocks.map(async r=>{const n=(await e.tryParseMarkdownToBlocks(r.trim()))[0];return delete n.id,n}));return window.__TEST_OPTIONS&&(window.__TEST_OPTIONS.mockID=void 0),{...t.operation,blocks:o}}}),update:ce({description:"Update a block, the new block will replace the existing block.",schema:{block:{$ref:"#/$defs/block"},$defs:{block:{type:"string",description:"markdown of block"}}},validateBlock:xe,rebaseTool:we,toJSONToolCall:async(e,t)=>{const o=(await e.tryParseMarkdownToBlocks(t.operation.block.trim()))[0];return delete o.id,window.__TEST_OPTIONS&&(window.__TEST_OPTIONS.mockID=void 0),{...t.operation,block:o}}}),delete:ue};function Vt(e,t){e.length>0&&e.push({role:"assistant",id:"document-state-"+e.length,parts:[{type:"text",text:"This is the latest state of the selection (ignore previous selections, you MUST issue operations against this latest version of the selection):"},{type:"text",text:JSON.stringify(t.markdownSelectedBlocks)},{type:"text",text:"This is the latest state of the document (INCLUDING the selected text), find the selected text in there to understand the context:"},{type:"text",text:JSON.stringify(t.markdownDocument)}]},{role:"user",id:"user-prompt-"+e.length,parts:[{type:"text",text:"The user asks you to do the following:"},{type:"text",text:t.userPrompt}]}),e.push({role:"system",id:"document-state-intro",parts:[{type:"text",text:`You're manipulating a selected part of a text document using Markdown blocks.
|
|
6
6
|
Make sure to follow the json schema provided and always include the trailing $ in ids.
|
|
7
7
|
This is the selection as an array of Markdown blocks:`},{type:"text",text:JSON.stringify(t.markdownSelectedBlocks)},{type:"text",text:"This is the entire document (INCLUDING the selected text), find the selected text in there to understand the context:"},{type:"text",text:JSON.stringify(t.markdownDocument)}]},{role:"user",id:"user-prompt",parts:[{type:"text",text:t.userPrompt}]})}function Ft(e,t){if(e.length>0){e.push({role:"assistant",id:"document-state-"+e.length,parts:[{type:"text",text:"This is the latest state of the document (ignore previous documents, you MUST issue operations against this latest version of the document):"},{type:"text",text:JSON.stringify(t.markdownBlocks)}]},{role:"user",id:"user-prompt-"+e.length,parts:[{type:"text",text:t.userPrompt}]});return}e.push({role:"system",id:"document-state",parts:[{type:"text",text:`You're manipulating a text document using Markdown blocks.
|
|
8
8
|
Make sure to follow the json schema provided. When referencing ids they MUST be EXACTLY the same (including the trailing $).
|
|
9
|
-
This is the initial document as an array of Markdown blocks (the cursor is BETWEEN two blocks as indicated by cursor: true):`},{type:"text",text:JSON.stringify(t.markdownBlocks)},{type:"text",text:'First, determine what part of the document the user is talking about. You SHOULD probably take cursor info into account if needed.\n EXAMPLE: if user says "below" (without pointing to a specific part of the document) he / she probably indicates the block(s) after the cursor. \n EXAMPLE: If you want to insert content AT the cursor position (UNLESS indicated otherwise by the user), \n then you need `referenceId` to point to the block before the cursor with position `after` (or block below and `before`).\n \n '+(t.isEmptyDocument?"Because the document is empty, first update the empty block before adding new blocks.":"Prefer updating existing blocks over removing and adding (but this also depends on the user's question).")}]},{role:"user",id:"user-prompt",parts:[{type:"text",text:t.userPrompt}]})}const Zt=async(e,t)=>{t.selection?Vt(e,t):Ft(e,t)};function Wt(e,t,o,r,n){if(typeof r=="boolean"){const i=r?e.getSelectionCutBlocks():void 0;r=i?{from:i._meta.startPos,to:i._meta.endPos}:void 0}const s=o??{add:!0,update:!0,delete:!0};return[...s.update?[F.update(e,{idsSuffixed:!0,withDelays:t,updateSelection:r,onBlockUpdate:n})]:[],...s.add?[F.add(e,{idsSuffixed:!0,withDelays:t,onBlockUpdate:n})]:[],...s.delete?[F.delete(e,{idsSuffixed:!0,withDelays:t,onBlockUpdate:n})]:[]]}const Yt={getStreamToolsProvider:(e={})=>({getStreamTools:(t,o,r)=>Wt(t,e.withDelays??!0,e.defaultStreamTools,o,r)}),tools:F,defaultPromptBuilder:Zt,defaultPromptInputDataBuilder:Rt,promptHelpers:{getDataForPromptNoSelection:ze,getDataForPromptWithSelection:Je}},M={_experimental_json:Jt,_experimental_markdown:Yt,html:Et},Gt={addCursorPosition:X,flattenBlocks:C,suffixIDs:j,trimEmptyBlocks:P,convertBlocks:B},Te=new U.PluginKey("blocknote-agent-cursor");function Kt(e){return new U.Plugin({key:Te,view:t=>({}),state:{init:()=>({selection:void 0}),apply:(t,o)=>{const r=t.getMeta("aiAgent");return r?{selection:r.selection}:{selection:void 0}}},props:{decorations:t=>{const{doc:o}=t,{selection:r}=Te.getState(t),n=[];if(!r)return J.DecorationSet.create(o,[]);n.push(J.Decoration.widget(r.head,()=>Xt(e),{key:"agent-cursor",side:10}));const s=Math.min(r.anchor,r.head),a=Math.max(r.anchor,r.head);return n.push(J.Decoration.inline(s,a,it.defaultSelectionBuilder(e),{inclusiveEnd:!0,inclusiveStart:!1})),J.DecorationSet.create(o,n)}}})}const Xt=e=>{const t=document.createElement("span");t.classList.add("bn-collaboration-cursor__base"),t.setAttribute("data-active","true");const o=document.createElement("span");o.setAttribute("contentedEditable","false"),o.classList.add("bn-collaboration-cursor__caret"),o.setAttribute("style",`background-color: ${e.color}`);const r=document.createElement("span");return r.classList.add("bn-collaboration-cursor__label"),r.setAttribute("style",`background-color: ${e.color}`),r.insertBefore(document.createTextNode(e.name),null),o.insertBefore(r,null),t.insertBefore(document.createTextNode(""),null),t.insertBefore(o,null),t.insertBefore(document.createTextNode(""),null),t},Qt=new U.PluginKey("blocknote-ai-plugin");class de extends k.BlockNoteExtension{constructor(o,r){super();q(this,"chatSession");q(this,"_store",fe()(o=>({aiMenuState:"closed"})));q(this,"options");this.editor=o,this.options=fe()(n=>({...r})),this.addProsemirrorPlugin(new U.Plugin({key:Qt,filterTransaction:n=>{var a;const s=this.store.getState().aiMenuState;return!(s!=="closed"&&s.status==="ai-writing"&&(a=n.getMeta(st.fixTablesKey))!=null&&a.fixTables)}})),this.addProsemirrorPlugin($.suggestChanges()),this.addProsemirrorPlugin(Kt(r.agentCursor||{name:"AI",color:"#8bc6ff"}))}static key(){return"ai"}get store(){return this._store}openAIMenuAtBlock(o){this.editor.setForceSelectionVisible(!0),this.editor.isEditable=!1,this._store.setState({aiMenuState:{blockId:o,status:"user-input"}})}closeAIMenu(){this._store.setState({aiMenuState:"closed"}),this.chatSession=void 0,this.editor.setForceSelectionVisible(!1),this.editor.isEditable=!0,this.editor.focus()}acceptChanges(){var r;const o=this.editor.prosemirrorState.doc;this.editor.exec((n,s)=>$.revertSuggestions(n,a=>{s==null||s(a.setMeta("addToHistory",!1))})),this.editor.exec((n,s)=>{const a=n.tr;a.replace(0,a.doc.content.size,new H.Slice(H.Fragment.from(o),0,0));const i=n.apply(a);return $.applySuggestions(i,l=>{s==null||s(a.replace(0,a.doc.content.size,new H.Slice(H.Fragment.from(l.doc),0,0)))})}),(r=this.editor.forkYDocPlugin)==null||r.merge({keepChanges:!0}),this.closeAIMenu()}rejectChanges(){var o;this.editor.exec((r,n)=>$.revertSuggestions(r,s=>{n==null||n(s.setMeta("addToHistory",!1))})),(o=this.editor.forkYDocPlugin)==null||o.merge({keepChanges:!1}),this.closeAIMenu()}async retry(){var r;const{aiMenuState:o}=this.store.getState();if(o==="closed"||o.status!=="error"||!this.chatSession)throw new Error("retry() is only valid when a previous response failed");return((r=this.chatSession)==null?void 0:r.chat.status)==="error"?this.invokeAI({...this.chatSession.previousRequestOptions,userPrompt:"An error occured in the previous request. Please retry to accomplish the last user prompt."}):this.invokeAI({...this.chatSession.previousRequestOptions,userPrompt:"An error occured while executing the previous tool call. Please retry to accomplish the last user prompt."})}setAIResponseStatus(o){const r=this.store.getState().aiMenuState;if(r!=="closed")if(o==="ai-writing"&&this.editor.setForceSelectionVisible(!1),typeof o=="object"){if(o.status!=="error")throw new k.UnreachableCaseError(o.status);this._store.setState({aiMenuState:{status:o.status,error:o.error,blockId:r.blockId}})}else this._store.setState({aiMenuState:{status:o,blockId:r.blockId}})}async callLLM(o){return this.invokeAI(o)}async invokeAI(o){var r,n;this.setAIResponseStatus("thinking"),(r=this.editor.forkYDocPlugin)==null||r.fork();try{this.chatSession?this.chatSession.previousRequestOptions=o:this.chatSession={previousRequestOptions:o,chat:new nt.Chat({sendAutomaticallyWhen:()=>!1,transport:o.transport||this.options.getState().transport})};const s=this.chatSession.chat;o={...this.options.getState(),...o};const i=o.aiRequestSender??Be(M.html.defaultPromptBuilder,M.html.defaultPromptInputDataBuilder),l=Ne({editor:this.editor,chat:s,userPrompt:o.userPrompt,useSelection:o.useSelection,deleteEmptyCursorBlock:o.deleteEmptyCursorBlock,streamToolsProvider:o.streamToolsProvider,onBlockUpdated:c=>{this._store.setState({aiMenuState:{blockId:c,status:"ai-writing"}})}});await Le({aiRequest:l,sender:i,chatRequestOptions:o.chatRequestOptions,onStart:()=>{this.setAIResponseStatus("ai-writing")}}),this.setAIResponseStatus("user-reviewing")}catch(s){this.setAIResponseStatus({status:"error",error:s}),console.warn("Error calling LLM",s,(n=this.chatSession)==null?void 0:n.chat.messages)}}}function eo(e){return t=>new de(t,e)}function A(e){return e.extension(de)}const to=e=>async(t,o)=>{const r=new Request(t,o),n=e(r.url),s=new Request(n,{headers:r.headers,body:(o==null?void 0:o.body)||r.body,method:r.method,duplex:"half"});return await fetch(s)};var Re={color:void 0,size:void 0,className:void 0,style:void 0,attr:void 0},ve=L.default.createContext&&L.default.createContext(Re),oo=["attr","size","title"];function ro(e,t){if(e==null)return{};var o=no(e,t),r,n;if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n<s.length;n++)r=s[n],!(t.indexOf(r)>=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function no(e,t){if(e==null)return{};var o={};for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r)){if(t.indexOf(r)>=0)continue;o[r]=e[r]}return o}function G(){return G=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var o=arguments[t];for(var r in o)Object.prototype.hasOwnProperty.call(o,r)&&(e[r]=o[r])}return e},G.apply(this,arguments)}function Pe(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),o.push.apply(o,r)}return o}function K(e){for(var t=1;t<arguments.length;t++){var o=arguments[t]!=null?arguments[t]:{};t%2?Pe(Object(o),!0).forEach(function(r){so(e,r,o[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):Pe(Object(o)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(o,r))})}return e}function so(e,t,o){return t=io(t),t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function io(e){var t=ao(e,"string");return typeof t=="symbol"?t:t+""}function ao(e,t){if(typeof e!="object"||!e)return e;var o=e[Symbol.toPrimitive];if(o!==void 0){var r=o.call(e,t);if(typeof r!="object")return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function Ve(e){return e&&e.map((t,o)=>L.default.createElement(t.tag,K({key:o},t.attr),Ve(t.child)))}function I(e){return t=>L.default.createElement(lo,G({attr:K({},e.attr)},t),Ve(e.child))}function lo(e){var t=o=>{var{attr:r,size:n,title:s}=e,a=ro(e,oo),i=n||o.size||"1em",l;return o.className&&(l=o.className),e.className&&(l=(l?l+" ":"")+e.className),L.default.createElement("svg",G({stroke:"currentColor",fill:"currentColor",strokeWidth:"0"},o.attr,r,a,{className:l,style:K(K({color:e.color||o.color},o.style),e.style),height:i,width:i,xmlns:"http://www.w3.org/2000/svg"}),s&&L.default.createElement("title",null,s),e.children)};return ve!==void 0?L.default.createElement(ve.Consumer,null,o=>t(o)):t(Re)}function Fe(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M8 7V11L2 6L8 1V5H13C17.4183 5 21 8.58172 21 13C21 17.4183 17.4183 21 13 21H4V19H13C16.3137 19 19 16.3137 19 13C19 9.68629 16.3137 7 13 7H8Z"},child:[]}]})(e)}function Ce(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M17.8492 11.6983L17.1421 10.9912L7.24264 20.8907H3V16.648L14.3137 5.33432L19.9706 10.9912C20.3611 11.3817 20.3611 12.0149 19.9706 12.4054L12.8995 19.4765L11.4853 18.0622L17.8492 11.6983ZM15.7279 9.57696L14.3137 8.16274L5 17.4765V18.8907H6.41421L15.7279 9.57696ZM18.5563 2.50589L21.3848 5.33432C21.7753 5.72484 21.7753 6.35801 21.3848 6.74853L19.9706 8.16274L15.7279 3.9201L17.1421 2.50589C17.5327 2.11537 18.1658 2.11537 18.5563 2.50589Z"},child:[]}]})(e)}function co(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M15.1986 9.94447C14.7649 9.5337 14.4859 8.98613 14.4085 8.39384L14.0056 5.31138L11.275 6.79724C10.7503 7.08274 10.1433 7.17888 9.55608 7.06948L6.49998 6.50015L7.06931 9.55625C7.17871 10.1435 7.08257 10.7505 6.79707 11.2751L5.31121 14.0057L8.39367 14.4086C8.98596 14.4861 9.53353 14.7651 9.94431 15.1987L12.0821 17.4557L13.4178 14.6486C13.6745 14.1092 14.109 13.6747 14.6484 13.418L17.4555 12.0823L15.1986 9.94447ZM15.2238 15.5079L13.0111 20.1581C12.8687 20.4573 12.5107 20.5844 12.2115 20.442C12.1448 20.4103 12.0845 20.3665 12.0337 20.3129L8.49229 16.5741C8.39749 16.474 8.27113 16.4096 8.13445 16.3918L3.02816 15.7243C2.69958 15.6814 2.46804 15.3802 2.51099 15.0516C2.52056 14.9784 2.54359 14.9075 2.5789 14.8426L5.04031 10.3192C5.1062 10.1981 5.12839 10.058 5.10314 9.92253L4.16 4.85991C4.09931 4.53414 4.3142 4.22086 4.63997 4.16017C4.7126 4.14664 4.78711 4.14664 4.85974 4.16017L9.92237 5.10331C10.0579 5.12855 10.198 5.10637 10.319 5.04048L14.8424 2.57907C15.1335 2.42068 15.4979 2.52825 15.6562 2.81931C15.6916 2.88421 15.7146 2.95507 15.7241 3.02833L16.3916 8.13462C16.4095 8.2713 16.4739 8.39766 16.5739 8.49245L20.3127 12.0338C20.5533 12.2617 20.5636 12.6415 20.3357 12.8821C20.2849 12.9357 20.2246 12.9795 20.1579 13.0112L15.5078 15.224C15.3833 15.2832 15.283 15.3835 15.2238 15.5079ZM16.0206 17.435L17.4348 16.0208L21.6775 20.2634L20.2633 21.6776L16.0206 17.435Z"},child:[]}]})(e)}function uo(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M8.00008 6V9H5.00008V6H8.00008ZM3.00008 4V11H10.0001V4H3.00008ZM13.0001 4H21.0001V6H13.0001V4ZM13.0001 11H21.0001V13H13.0001V11ZM13.0001 18H21.0001V20H13.0001V18ZM10.7072 16.2071L9.29297 14.7929L6.00008 18.0858L4.20718 16.2929L2.79297 17.7071L6.00008 20.9142L10.7072 16.2071Z"},child:[]}]})(e)}function po(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M15 18H16.5C17.8807 18 19 16.8807 19 15.5C19 14.1193 17.8807 13 16.5 13H3V11H16.5C18.9853 11 21 13.0147 21 15.5C21 17.9853 18.9853 20 16.5 20H15V22L11 19L15 16V18ZM3 4H21V6H3V4ZM9 18V20H3V18H9Z"},child:[]}]})(e)}function mo(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M13 6V21H11V6H5V4H19V6H13Z"},child:[]}]})(e)}function fo(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M6.23509 6.45329C4.85101 7.89148 4 9.84636 4 12C4 16.4183 7.58172 20 12 20C13.0808 20 14.1116 19.7857 15.0521 19.3972C15.1671 18.6467 14.9148 17.9266 14.8116 17.6746C14.582 17.115 13.8241 16.1582 12.5589 14.8308C12.2212 14.4758 12.2429 14.2035 12.3636 13.3943L12.3775 13.3029C12.4595 12.7486 12.5971 12.4209 14.4622 12.1248C15.4097 11.9746 15.6589 12.3533 16.0043 12.8777C16.0425 12.9358 16.0807 12.9928 16.1198 13.0499C16.4479 13.5297 16.691 13.6394 17.0582 13.8064C17.2227 13.881 17.428 13.9751 17.7031 14.1314C18.3551 14.504 18.3551 14.9247 18.3551 15.8472V15.9518C18.3551 16.3434 18.3168 16.6872 18.2566 16.9859C19.3478 15.6185 20 13.8854 20 12C20 8.70089 18.003 5.8682 15.1519 4.64482C14.5987 5.01813 13.8398 5.54726 13.575 5.91C13.4396 6.09538 13.2482 7.04166 12.6257 7.11976C12.4626 7.14023 12.2438 7.12589 12.012 7.11097C11.3905 7.07058 10.5402 7.01606 10.268 7.75495C10.0952 8.2232 10.0648 9.49445 10.6239 10.1543C10.7134 10.2597 10.7307 10.4547 10.6699 10.6735C10.59 10.9608 10.4286 11.1356 10.3783 11.1717C10.2819 11.1163 10.0896 10.8931 9.95938 10.7412C9.64554 10.3765 9.25405 9.92233 8.74797 9.78176C8.56395 9.73083 8.36166 9.68867 8.16548 9.64736C7.6164 9.53227 6.99443 9.40134 6.84992 9.09302C6.74442 8.8672 6.74488 8.55621 6.74529 8.22764C6.74529 7.8112 6.74529 7.34029 6.54129 6.88256C6.46246 6.70541 6.35689 6.56446 6.23509 6.45329ZM12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22Z"},child:[]}]})(e)}function ho(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M9.9997 15.1709L19.1921 5.97852L20.6063 7.39273L9.9997 17.9993L3.63574 11.6354L5.04996 10.2212L9.9997 15.1709Z"},child:[]}]})(e)}function yo(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M9.9997 15.1709L19.1921 5.97852L20.6063 7.39273L9.9997 17.9993L3.63574 11.6354L5.04996 10.2212L9.9997 15.1709Z"},child:[]}]})(e)}function go(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M12 4C9.4095 4 7.10606 5.23053 5.64274 7.14274L8 9.5H2V3.5L4.21863 5.71863C6.05061 3.452 8.85558 2 12 2 17.5228 2 22 6.47715 22 12H20C20 7.58172 16.4183 4 12 4ZM4 12C4 16.4183 7.58172 20 12 20 14.5905 20 16.894 18.7695 18.3573 16.8573L16 14.5 22 14.5V20.5L19.7814 18.2814C17.9494 20.548 15.1444 22 12 22 6.47715 22 2 17.5228 2 12H4Z"},child:[]}]})(e)}function pe(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M17.0007 1.20825 18.3195 3.68108 20.7923 4.99992 18.3195 6.31876 17.0007 8.79159 15.6818 6.31876 13.209 4.99992 15.6818 3.68108 17.0007 1.20825ZM8.00065 4.33325 10.6673 9.33325 15.6673 11.9999 10.6673 14.6666 8.00065 19.6666 5.33398 14.6666.333984 11.9999 5.33398 9.33325 8.00065 4.33325ZM19.6673 16.3333 18.0007 13.2083 16.334 16.3333 13.209 17.9999 16.334 19.6666 18.0007 22.7916 19.6673 19.6666 22.7923 17.9999 19.6673 16.3333Z"},child:[]}]})(e)}function D(e){if(!e.dictionary.ai)throw new Error("AI dictionary not found");return e.dictionary.ai}function Ze(){const e=_.useBlockNoteContext();return D(e.editor)}const We=e=>{const t=_.useComponentsContext(),{onManualPromptSubmit:o,promptText:r,onPromptTextChange:n}=e,[s,a]=w.useState(""),i=r||s,l=w.useCallback(async p=>{p.key==="Enter"&&o(i)},[i,o]),c=w.useCallback(p=>{const S=p.currentTarget.value;n&&n(S),r===void 0&&a(S)},[n,a,r]),d=w.useMemo(()=>k.filterSuggestionItems(e.items,i),[i,e.items]),{selectedIndex:f,setSelectedIndex:m,handler:u}=_.useSuggestionMenuKeyboardHandler(d,p=>p.onItemClick()),h=w.useCallback(p=>{p.key==="Enter"?d.length>0?u(p):l(p):u(p)},[l,u,d.length]);return w.useEffect(()=>{m(0)},[i,m]),y.jsxs("div",{className:"bn-combobox",children:[y.jsx(t.Generic.Form.Root,{children:y.jsx(t.Generic.Form.TextInput,{className:"bn-combobox-input",name:"ai-prompt",variant:"large",icon:e.icon,value:i||"",autoFocus:!0,placeholder:e.placeholder,disabled:e.disabled,onKeyDown:h,onChange:c,autoComplete:"off",rightSection:e.rightSection},"input-"+e.disabled)}),y.jsx(t.SuggestionMenu.Root,{className:"bn-combobox-items",id:"ai-suggestion-menu",children:d.map((p,S)=>y.jsx(t.SuggestionMenu.Item,{className:k.mergeCSSClasses("bn-suggestion-menu-item",p.size==="small"?"bn-suggestion-menu-item-small":""),id:`bn-suggestion-menu-item-${S}`,isSelected:S===f,onClick:p.onItemClick,item:p},p.title))})]})};function bo(e){const t=D(e),o=A(e);return[{key:"continue_writing",title:t.ai_default_commands.continue_writing.title,aliases:t.ai_default_commands.continue_writing.aliases,icon:y.jsx(Ce,{size:18}),onItemClick:async()=>{await o.invokeAI({userPrompt:"Continue writing at the current cursor position related to the previous text. Add multiple blocks if needed. If the document looks like a template / draft, follow the template. Be extensive if needed.",streamToolsProvider:M.html.getStreamToolsProvider({defaultStreamTools:{add:!0,delete:!1,update:!1}})})},size:"small"},{key:"summarize",title:t.ai_default_commands.summarize.title,aliases:t.ai_default_commands.summarize.aliases,icon:y.jsx(po,{size:18}),onItemClick:async()=>{await o.invokeAI({userPrompt:"Summarize",streamToolsProvider:M.html.getStreamToolsProvider({defaultStreamTools:{add:!0,delete:!1,update:!1}})})},size:"small"},{key:"action_items",title:t.ai_default_commands.add_action_items.title,aliases:t.ai_default_commands.add_action_items.aliases,icon:y.jsx(uo,{size:18}),onItemClick:async()=>{await o.invokeAI({userPrompt:"Add action items",streamToolsProvider:M.html.getStreamToolsProvider({defaultStreamTools:{add:!0,delete:!1,update:!1}})})},size:"small"},{key:"write_anything",title:t.ai_default_commands.write_anything.title,aliases:t.ai_default_commands.write_anything.aliases,icon:y.jsx(Ce,{size:18}),onItemClick:r=>{r(t.ai_default_commands.write_anything.prompt_placeholder)},size:"small"}]}function ko(e){const t=D(e),o=A(e);return[{key:"improve_writing",title:t.ai_default_commands.improve_writing.title,aliases:t.ai_default_commands.improve_writing.aliases,icon:y.jsx(mo,{size:18}),onItemClick:async()=>{await o.invokeAI({useSelection:!0,userPrompt:"Improve writing",streamToolsProvider:M.html.getStreamToolsProvider({defaultStreamTools:{add:!1,delete:!1,update:!0}})})},size:"small"},{key:"fix_spelling",title:t.ai_default_commands.fix_spelling.title,aliases:t.ai_default_commands.fix_spelling.aliases,icon:y.jsx(yo,{size:18}),onItemClick:async()=>{await o.invokeAI({useSelection:!0,userPrompt:"Fix spelling",streamToolsProvider:M.html.getStreamToolsProvider({defaultStreamTools:{add:!1,delete:!1,update:!0}})})},size:"small"},{key:"translate",title:t.ai_default_commands.translate.title,aliases:t.ai_default_commands.translate.aliases,icon:y.jsx(fo,{size:18}),onItemClick:r=>{r(t.ai_default_commands.translate.prompt_placeholder)},size:"small"},{key:"simplify",title:t.ai_default_commands.simplify.title,aliases:t.ai_default_commands.simplify.aliases,icon:y.jsx(co,{size:18}),onItemClick:async()=>{await o.invokeAI({useSelection:!0,userPrompt:"Simplify",streamToolsProvider:M.html.getStreamToolsProvider({defaultStreamTools:{add:!1,delete:!1,update:!0}})})},size:"small"}]}function So(e){const t=D(e),o=A(e);return[{key:"accept",title:t.ai_menu.actions.accept.title,aliases:t.ai_menu.actions.accept.aliases,icon:y.jsx(ho,{size:18}),onItemClick:()=>{o.acceptChanges()},size:"small"},{key:"revert",title:t.ai_menu.actions.revert.title,aliases:t.ai_menu.actions.revert.aliases,icon:y.jsx(Fe,{size:18}),onItemClick:()=>{o.rejectChanges()},size:"small"}]}function wo(e){const t=D(e),o=A(e);return[{key:"retry",title:t.ai_menu.actions.retry.title,aliases:t.ai_menu.actions.retry.aliases,icon:y.jsx(go,{size:18}),onItemClick:async()=>{await o.retry()},size:"small"},{key:"cancel",title:t.ai_menu.actions.cancel.title,aliases:t.ai_menu.actions.cancel.aliases,icon:y.jsx(Fe,{size:18}),onItemClick:()=>{o.rejectChanges()},size:"small"}]}function Ye(e,t){return t==="user-input"?e.getSelection()?ko(e):bo(e):t==="user-reviewing"?So(e):t==="error"?wo(e):[]}const Ge=e=>{const t=_.useBlockNoteEditor(),[o,r]=w.useState(""),n=Ze(),s=_.useComponentsContext(),a=A(t),i=Ie.useStore(a.store,u=>u.aiMenuState!=="closed"?u.aiMenuState.status:"closed"),{items:l}=e,c=w.useMemo(()=>{let u=[];return l?u=l(t,i):u=Ye(t,i),u.map(h=>({...h,onItemClick:()=>{h.onItemClick(r)}}))},[l,i,t]),d=w.useCallback(async u=>{await a.invokeAI({userPrompt:u,useSelection:t.getSelection()!==void 0})},[a,t]);w.useEffect(()=>{(i==="user-reviewing"||i==="error")&&r("")},[i]);const f=w.useMemo(()=>i==="thinking"?n.ai_menu.status.thinking:i==="ai-writing"?n.ai_menu.status.editing:i==="error"?n.ai_menu.status.error:n.ai_menu.input_placeholder,[i,n]),m=w.useMemo(()=>{if(i==="thinking"||i==="ai-writing")return y.jsx(s.SuggestionMenu.Loader,{className:"bn-suggestion-menu-loader bn-combobox-right-section"});if(i==="error")return y.jsx("div",{className:"bn-combobox-right-section bn-combobox-error",children:y.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",height:"1em",viewBox:"0 -960 960 960",width:"1em",fill:"currentColor",children:y.jsx("path",{d:"M480-280q17 0 28.5-11.5T520-320q0-17-11.5-28.5T480-360q-17 0-28.5 11.5T440-320q0 17 11.5 28.5T480-280Zm0-160q17 0 28.5-11.5T520-480v-160q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640v160q0 17 11.5 28.5T480-440Zm0 360q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"})})})},[s,i]);return y.jsx(We,{onManualPromptSubmit:e.onManualPromptSubmit||d,items:c,promptText:o,onPromptTextChange:r,placeholder:f,disabled:i==="thinking"||i==="ai-writing",icon:y.jsx("div",{className:"bn-combobox-icon",children:y.jsx(pe,{})}),rightSection:m})},Ke=e=>{const t=e.blockID?document.querySelector(`[data-id="${e.blockID}"]`):void 0,o=w.useMemo(()=>t?{getBoundingClientRect:()=>t.getBoundingClientRect(),contextElement:t}:null,[t]),{isMounted:r,ref:n,style:s,getFloatingProps:a,isPositioned:i}=_.useUIElementPositioning(!!t,o,3e3,{canDismiss:{enabled:!0,escapeKey:!0,outsidePress:e.canDismissViaOutsidePress},placement:"bottom",middleware:[te.offset(10),te.size({apply({rects:l,elements:c}){Object.assign(c.floating.style,{width:`${l.reference.width}px`})}})],onOpenChange:e.onOpenChange,whileElementsMounted:(l,c,d)=>te.autoUpdate(l,c,d,{animationFrame:!0}),...e.floatingOptions});return r?y.jsx("div",{ref:n,style:{...s},...a(),children:i&&e.children}):null},xo=e=>{const t=_.useBlockNoteEditor(),o=A(t),r=Ie.useStore(o.store,a=>a.aiMenuState),n=r==="closed"?void 0:r.blockId,s=e.aiMenu||Ge;return y.jsx(Ke,{canDismissViaOutsidePress:r==="closed"||r.status==="user-input",blockID:n,onOpenChange:a=>{a||r==="closed"||(r.status==="user-input"?o.closeAIMenu():(r.status==="user-reviewing"||r.status==="error")&&o.rejectChanges())},children:y.jsx(s,{})})},To=()=>{const e=Ze(),t=_.useComponentsContext(),o=_.useBlockNoteEditor(),r=A(o),n=()=>{o.formattingToolbar.closeMenu();const s=o.getSelection();if(!s)throw new Error("No selection");const a=s.blocks[s.blocks.length-1].id;r.openAIMenuAtBlock(a)};return o.isEditable?y.jsx(t.Generic.Toolbar.Button,{className:"bn-button",label:e.formatting_toolbar.ai.tooltip,mainTooltip:e.formatting_toolbar.ai.tooltip,icon:y.jsx(pe,{}),onClick:n}):null},vo={AI:pe};function Po(e){const t=A(e);return[{key:"ai",onItemClick:()=>{const r=e.getTextCursorPosition();r.block.content&&Array.isArray(r.block.content)&&r.block.content.length===0&&r.prevBlock?t.openAIMenuAtBlock(r.prevBlock.id):t.openAIMenuAtBlock(r.block.id)},...D(e).slash_menu.ai,icon:y.jsx(vo.AI,{})}]}function Xe(e){return Object.fromEntries(Object.entries(e).map(([t,o])=>[t,T.tool({...o,inputSchema:T.jsonSchema(o.inputSchema),outputSchema:T.jsonSchema(o.outputSchema)})]))}function Qe(e,t){let o="";return e.pipeThrough(new TransformStream({start(r){r.enqueue({type:"start"}),r.enqueue({type:"start-step"}),r.enqueue({type:"tool-input-start",toolCallId:"call_object_1",toolName:t})},transform(r,n){switch(r.type){case"text-delta":o+=r.textDelta,n.enqueue({type:"tool-input-delta",toolCallId:"call_object_1",inputTextDelta:r.textDelta});break;case"object":case"finish":break;case"error":n.enqueue({type:"error",errorText:re.getErrorMessage(r.error)});break;default:{const s=r;throw new Error(`Unsupported chunk type: ${s}`)}}},async flush(r){r.enqueue({type:"tool-input-available",toolCallId:"call_object_1",toolName:t,input:JSON.parse(o)}),r.enqueue({type:"finish-step"}),r.enqueue({type:"finish"})}}))}function et(e,t){return new ReadableStream({start(r){r.enqueue({type:"start"}),r.enqueue({type:"start-step"}),r.enqueue({type:"tool-input-start",toolCallId:"call_object_1",toolName:t}),r.enqueue({type:"tool-input-delta",toolCallId:"call_object_1",inputTextDelta:JSON.stringify(e)}),r.enqueue({type:"tool-input-available",toolCallId:"call_object_1",toolName:t,input:e}),r.enqueue({type:"finish-step"}),r.enqueue({type:"finish"}),r.close()}})}const tt={"mistral.chat":{mode:"auto"},"google.generative-ai":{mode:"auto"},"groq.chat":{providerOptions:{groq:{structuredOutputs:!1}}}};function oe(e){return tt[e.provider]||{}}class Co{constructor(t){this.opts=t}async generateObject(t,o){const{model:r,_additionalOptions:n}=this.opts;if(typeof r=="string")throw new Error("model must be a LanguageModelV2");const s=Object.keys(o)[0],a=o[s].inputSchema,i=await T.generateObject({output:"object",schema:a,model:r,mode:"tool",messages:T.convertToModelMessages(t),...oe(r),...n??{}});return et(i.object,s)}async streamObject(t,o){const{model:r,_additionalOptions:n}=this.opts;if(typeof r=="string")throw new Error("model must be a LanguageModelV2");const s=Object.keys(o)[0],a=o[s].inputSchema,i=T.streamObject({output:"object",schema:a,model:r,mode:"tool",messages:T.convertToModelMessages(t),...oe(r),...n??{}});return Qe(i.fullStream,s)}async streamText(t,o){const{model:r,_additionalOptions:n}=this.opts;return T.streamText({model:r,messages:T.convertToModelMessages(t),tools:o,toolChoice:"required",...n??{}}).toUIMessageStream()}async sendMessages({messages:t,body:o}){const r=this.opts.stream??!0,n=o.toolDefinitions,s=Xe(n);if(this.opts.objectGeneration)return r?this.streamObject(t,s):this.generateObject(t,s);if(r)return await this.streamText(t,s);throw new Error("Not implemented (generateText)")}reconnectToStream(){throw new Error("Not implemented")}}exports.AIExtension=de;exports.AIMenu=Ge;exports.AIMenuController=xo;exports.AIToolbarButton=To;exports.BlockPositioner=Ke;exports.ChunkExecutionError=ne;exports.ClientSideTransport=Co;exports.PROVIDER_OVERRIDES=tt;exports.PromptSuggestionMenu=We;exports.StreamToolExecutor=Ee;exports.aiDocumentFormats=M;exports.buildAIRequest=Ne;exports.createAIExtension=eo;exports.createStreamToolsArraySchema=Me;exports.defaultAIRequestSender=Be;exports.executeAIRequest=Le;exports.fetchViaProxy=to;exports.getAIDictionary=D;exports.getAIExtension=A;exports.getAISlashMenuItems=Po;exports.getDefaultAIMenuItems=Ye;exports.getProviderOverrides=oe;exports.objectAsToolCallInUIMessageStream=et;exports.objectStreamToOperationsResult=Ae;exports.partialObjectStreamAsToolCallInUIMessageStream=Qe;exports.promptHelpers=Gt;exports.toolDefinitionsToToolSet=Xe;
|
|
9
|
+
This is the initial document as an array of Markdown blocks (the cursor is BETWEEN two blocks as indicated by cursor: true):`},{type:"text",text:JSON.stringify(t.markdownBlocks)},{type:"text",text:'First, determine what part of the document the user is talking about. You SHOULD probably take cursor info into account if needed.\n EXAMPLE: if user says "below" (without pointing to a specific part of the document) he / she probably indicates the block(s) after the cursor. \n EXAMPLE: If you want to insert content AT the cursor position (UNLESS indicated otherwise by the user), \n then you need `referenceId` to point to the block before the cursor with position `after` (or block below and `before`).\n \n '+(t.isEmptyDocument?"Because the document is empty, first update the empty block before adding new blocks.":"Prefer updating existing blocks over removing and adding (but this also depends on the user's question).")}]},{role:"user",id:"user-prompt",parts:[{type:"text",text:t.userPrompt}]})}const Zt=async(e,t)=>{t.selection?Vt(e,t):Ft(e,t)};function Wt(e,t,o,r,n){if(typeof r=="boolean"){const i=r?e.getSelectionCutBlocks():void 0;r=i?{from:i._meta.startPos,to:i._meta.endPos}:void 0}const s=o??{add:!0,update:!0,delete:!0};return[...s.update?[F.update(e,{idsSuffixed:!0,withDelays:t,updateSelection:r,onBlockUpdate:n})]:[],...s.add?[F.add(e,{idsSuffixed:!0,withDelays:t,onBlockUpdate:n})]:[],...s.delete?[F.delete(e,{idsSuffixed:!0,withDelays:t,onBlockUpdate:n})]:[]]}const Yt={getStreamToolsProvider:(e={})=>({getStreamTools:(t,o,r)=>Wt(t,e.withDelays??!0,e.defaultStreamTools,o,r)}),tools:F,defaultPromptBuilder:Zt,defaultPromptInputDataBuilder:Rt,promptHelpers:{getDataForPromptNoSelection:ze,getDataForPromptWithSelection:Je}},M={_experimental_json:Jt,_experimental_markdown:Yt,html:Et},Gt={addCursorPosition:X,flattenBlocks:C,suffixIDs:D,trimEmptyBlocks:P,convertBlocks:B},Te=new U.PluginKey("blocknote-agent-cursor");function Kt(e){return new U.Plugin({key:Te,view:t=>({}),state:{init:()=>({selection:void 0}),apply:(t,o)=>{const r=t.getMeta("aiAgent");return r?{selection:r.selection}:{selection:void 0}}},props:{decorations:t=>{const{doc:o}=t,{selection:r}=Te.getState(t),n=[];if(!r)return J.DecorationSet.create(o,[]);n.push(J.Decoration.widget(r.head,()=>Xt(e),{key:"agent-cursor",side:10}));const s=Math.min(r.anchor,r.head),a=Math.max(r.anchor,r.head);return n.push(J.Decoration.inline(s,a,it.defaultSelectionBuilder(e),{inclusiveEnd:!0,inclusiveStart:!1})),J.DecorationSet.create(o,n)}}})}const Xt=e=>{const t=document.createElement("span");t.classList.add("bn-collaboration-cursor__base"),t.setAttribute("data-active","true");const o=document.createElement("span");o.setAttribute("contentedEditable","false"),o.classList.add("bn-collaboration-cursor__caret"),o.setAttribute("style",`background-color: ${e.color}`);const r=document.createElement("span");return r.classList.add("bn-collaboration-cursor__label"),r.setAttribute("style",`background-color: ${e.color}`),r.insertBefore(document.createTextNode(e.name),null),o.insertBefore(r,null),t.insertBefore(document.createTextNode(""),null),t.insertBefore(o,null),t.insertBefore(document.createTextNode(""),null),t},Qt=new U.PluginKey("blocknote-ai-plugin");class de extends b.BlockNoteExtension{constructor(o,r){super();L(this,"chatSession");L(this,"scrollInProgress",!1);L(this,"autoScroll",!1);L(this,"_store",fe()(o=>({aiMenuState:"closed"})));L(this,"options");this.editor=o,this.options=fe()(n=>({...r})),this.addProsemirrorPlugin(new U.Plugin({key:Qt,filterTransaction:n=>{var a;const s=this.store.getState().aiMenuState;return!(s!=="closed"&&s.status==="ai-writing"&&(a=n.getMeta(st.fixTablesKey))!=null&&a.fixTables)}})),this.addProsemirrorPlugin($.suggestChanges()),this.addProsemirrorPlugin(Kt(r.agentCursor||{name:"AI",color:"#8bc6ff"})),document.addEventListener("scroll",()=>{this.scrollInProgress&&(this.autoScroll=!1),this.scrollInProgress=!0},!0),document.addEventListener("scrollend",()=>{this.scrollInProgress=!1},!0)}static key(){return"ai"}get store(){return this._store}openAIMenuAtBlock(o){var n;this.editor.setForceSelectionVisible(!0),this.editor.isEditable=!1,this._store.setState({aiMenuState:{blockId:o,status:"user-input"}});const r=(n=this.editor.domElement)==null?void 0:n.querySelector(`[data-node-type="blockContainer"][data-id="${o}"]`);r==null||r.scrollIntoView({block:"center"})}closeAIMenu(){this._store.setState({aiMenuState:"closed"}),this.chatSession=void 0,this.editor.setForceSelectionVisible(!1),this.editor.isEditable=!0,this.editor.focus()}acceptChanges(){var r;const o=this.editor.prosemirrorState.doc;this.editor.exec((n,s)=>$.revertSuggestions(n,a=>{s==null||s(a.setMeta("addToHistory",!1))})),this.editor.exec((n,s)=>{const a=n.tr;a.replace(0,a.doc.content.size,new H.Slice(H.Fragment.from(o),0,0));const i=n.apply(a);return $.applySuggestions(i,l=>{s==null||s(a.replace(0,a.doc.content.size,new H.Slice(H.Fragment.from(l.doc),0,0)))})}),(r=this.editor.forkYDocPlugin)==null||r.merge({keepChanges:!0}),this.closeAIMenu()}rejectChanges(){var o;this.editor.exec((r,n)=>$.revertSuggestions(r,s=>{n==null||n(s.setMeta("addToHistory",!1))})),(o=this.editor.forkYDocPlugin)==null||o.merge({keepChanges:!1}),this.closeAIMenu()}async retry(){var r;const{aiMenuState:o}=this.store.getState();if(o==="closed"||o.status!=="error"||!this.chatSession)throw new Error("retry() is only valid when a previous response failed");return((r=this.chatSession)==null?void 0:r.chat.status)==="error"?this.invokeAI({...this.chatSession.previousRequestOptions,userPrompt:"An error occured in the previous request. Please retry to accomplish the last user prompt."}):this.invokeAI({...this.chatSession.previousRequestOptions,userPrompt:"An error occured while executing the previous tool call. Please retry to accomplish the last user prompt."})}setAIResponseStatus(o){const r=this.store.getState().aiMenuState;if(r!=="closed")if(o==="ai-writing"&&this.editor.setForceSelectionVisible(!1),typeof o=="object"){if(o.status!=="error")throw new b.UnreachableCaseError(o.status);this._store.setState({aiMenuState:{status:o.status,error:o.error,blockId:r.blockId}})}else this._store.setState({aiMenuState:{status:o,blockId:r.blockId}})}async callLLM(o){return this.invokeAI(o)}async invokeAI(o){var r,n;this.setAIResponseStatus("thinking"),(r=this.editor.forkYDocPlugin)==null||r.fork();try{this.chatSession?this.chatSession.previousRequestOptions=o:this.chatSession={previousRequestOptions:o,chat:new nt.Chat({sendAutomaticallyWhen:()=>!1,transport:o.transport||this.options.getState().transport})};const s=this.chatSession.chat;o={...this.options.getState(),...o};const i=o.aiRequestSender??Be(M.html.defaultPromptBuilder,M.html.defaultPromptInputDataBuilder),l=Ne({editor:this.editor,chat:s,userPrompt:o.userPrompt,useSelection:o.useSelection,deleteEmptyCursorBlock:o.deleteEmptyCursorBlock,streamToolsProvider:o.streamToolsProvider,onBlockUpdated:c=>{if(this._store.setState({aiMenuState:{blockId:c,status:"ai-writing"}}),!this.autoScroll)return;const u=this._store.getState().aiMenuState,m=u==="closed"?void 0:u;if(!m||m.status!=="ai-writing")return;const p=b.getNodeById(m.blockId,this.editor.prosemirrorState.doc);if(!p)return;this.editor.prosemirrorView.domAtPos(p.posBeforeNode+1).node.scrollIntoView({block:"center"})}});await Le({aiRequest:l,sender:i,chatRequestOptions:o.chatRequestOptions,onStart:()=>{this.autoScroll=!0,this.setAIResponseStatus("ai-writing")}}),this.setAIResponseStatus("user-reviewing")}catch(s){this.setAIResponseStatus({status:"error",error:s}),console.warn("Error calling LLM",s,(n=this.chatSession)==null?void 0:n.chat.messages)}}}function eo(e){return t=>new de(t,e)}function A(e){return e.extension(de)}const to=e=>async(t,o)=>{const r=new Request(t,o),n=e(r.url),s=new Request(n,{headers:r.headers,body:(o==null?void 0:o.body)||r.body,method:r.method,duplex:"half"});return await fetch(s)};var Re={color:void 0,size:void 0,className:void 0,style:void 0,attr:void 0},ve=j.default.createContext&&j.default.createContext(Re),oo=["attr","size","title"];function ro(e,t){if(e==null)return{};var o=no(e,t),r,n;if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n<s.length;n++)r=s[n],!(t.indexOf(r)>=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function no(e,t){if(e==null)return{};var o={};for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r)){if(t.indexOf(r)>=0)continue;o[r]=e[r]}return o}function G(){return G=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var o=arguments[t];for(var r in o)Object.prototype.hasOwnProperty.call(o,r)&&(e[r]=o[r])}return e},G.apply(this,arguments)}function Pe(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),o.push.apply(o,r)}return o}function K(e){for(var t=1;t<arguments.length;t++){var o=arguments[t]!=null?arguments[t]:{};t%2?Pe(Object(o),!0).forEach(function(r){so(e,r,o[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):Pe(Object(o)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(o,r))})}return e}function so(e,t,o){return t=io(t),t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function io(e){var t=ao(e,"string");return typeof t=="symbol"?t:t+""}function ao(e,t){if(typeof e!="object"||!e)return e;var o=e[Symbol.toPrimitive];if(o!==void 0){var r=o.call(e,t);if(typeof r!="object")return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function Ve(e){return e&&e.map((t,o)=>j.default.createElement(t.tag,K({key:o},t.attr),Ve(t.child)))}function I(e){return t=>j.default.createElement(lo,G({attr:K({},e.attr)},t),Ve(e.child))}function lo(e){var t=o=>{var{attr:r,size:n,title:s}=e,a=ro(e,oo),i=n||o.size||"1em",l;return o.className&&(l=o.className),e.className&&(l=(l?l+" ":"")+e.className),j.default.createElement("svg",G({stroke:"currentColor",fill:"currentColor",strokeWidth:"0"},o.attr,r,a,{className:l,style:K(K({color:e.color||o.color},o.style),e.style),height:i,width:i,xmlns:"http://www.w3.org/2000/svg"}),s&&j.default.createElement("title",null,s),e.children)};return ve!==void 0?j.default.createElement(ve.Consumer,null,o=>t(o)):t(Re)}function Fe(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M8 7V11L2 6L8 1V5H13C17.4183 5 21 8.58172 21 13C21 17.4183 17.4183 21 13 21H4V19H13C16.3137 19 19 16.3137 19 13C19 9.68629 16.3137 7 13 7H8Z"},child:[]}]})(e)}function Ce(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M17.8492 11.6983L17.1421 10.9912L7.24264 20.8907H3V16.648L14.3137 5.33432L19.9706 10.9912C20.3611 11.3817 20.3611 12.0149 19.9706 12.4054L12.8995 19.4765L11.4853 18.0622L17.8492 11.6983ZM15.7279 9.57696L14.3137 8.16274L5 17.4765V18.8907H6.41421L15.7279 9.57696ZM18.5563 2.50589L21.3848 5.33432C21.7753 5.72484 21.7753 6.35801 21.3848 6.74853L19.9706 8.16274L15.7279 3.9201L17.1421 2.50589C17.5327 2.11537 18.1658 2.11537 18.5563 2.50589Z"},child:[]}]})(e)}function co(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M15.1986 9.94447C14.7649 9.5337 14.4859 8.98613 14.4085 8.39384L14.0056 5.31138L11.275 6.79724C10.7503 7.08274 10.1433 7.17888 9.55608 7.06948L6.49998 6.50015L7.06931 9.55625C7.17871 10.1435 7.08257 10.7505 6.79707 11.2751L5.31121 14.0057L8.39367 14.4086C8.98596 14.4861 9.53353 14.7651 9.94431 15.1987L12.0821 17.4557L13.4178 14.6486C13.6745 14.1092 14.109 13.6747 14.6484 13.418L17.4555 12.0823L15.1986 9.94447ZM15.2238 15.5079L13.0111 20.1581C12.8687 20.4573 12.5107 20.5844 12.2115 20.442C12.1448 20.4103 12.0845 20.3665 12.0337 20.3129L8.49229 16.5741C8.39749 16.474 8.27113 16.4096 8.13445 16.3918L3.02816 15.7243C2.69958 15.6814 2.46804 15.3802 2.51099 15.0516C2.52056 14.9784 2.54359 14.9075 2.5789 14.8426L5.04031 10.3192C5.1062 10.1981 5.12839 10.058 5.10314 9.92253L4.16 4.85991C4.09931 4.53414 4.3142 4.22086 4.63997 4.16017C4.7126 4.14664 4.78711 4.14664 4.85974 4.16017L9.92237 5.10331C10.0579 5.12855 10.198 5.10637 10.319 5.04048L14.8424 2.57907C15.1335 2.42068 15.4979 2.52825 15.6562 2.81931C15.6916 2.88421 15.7146 2.95507 15.7241 3.02833L16.3916 8.13462C16.4095 8.2713 16.4739 8.39766 16.5739 8.49245L20.3127 12.0338C20.5533 12.2617 20.5636 12.6415 20.3357 12.8821C20.2849 12.9357 20.2246 12.9795 20.1579 13.0112L15.5078 15.224C15.3833 15.2832 15.283 15.3835 15.2238 15.5079ZM16.0206 17.435L17.4348 16.0208L21.6775 20.2634L20.2633 21.6776L16.0206 17.435Z"},child:[]}]})(e)}function uo(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M8.00008 6V9H5.00008V6H8.00008ZM3.00008 4V11H10.0001V4H3.00008ZM13.0001 4H21.0001V6H13.0001V4ZM13.0001 11H21.0001V13H13.0001V11ZM13.0001 18H21.0001V20H13.0001V18ZM10.7072 16.2071L9.29297 14.7929L6.00008 18.0858L4.20718 16.2929L2.79297 17.7071L6.00008 20.9142L10.7072 16.2071Z"},child:[]}]})(e)}function po(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M15 18H16.5C17.8807 18 19 16.8807 19 15.5C19 14.1193 17.8807 13 16.5 13H3V11H16.5C18.9853 11 21 13.0147 21 15.5C21 17.9853 18.9853 20 16.5 20H15V22L11 19L15 16V18ZM3 4H21V6H3V4ZM9 18V20H3V18H9Z"},child:[]}]})(e)}function mo(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M13 6V21H11V6H5V4H19V6H13Z"},child:[]}]})(e)}function fo(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M6.23509 6.45329C4.85101 7.89148 4 9.84636 4 12C4 16.4183 7.58172 20 12 20C13.0808 20 14.1116 19.7857 15.0521 19.3972C15.1671 18.6467 14.9148 17.9266 14.8116 17.6746C14.582 17.115 13.8241 16.1582 12.5589 14.8308C12.2212 14.4758 12.2429 14.2035 12.3636 13.3943L12.3775 13.3029C12.4595 12.7486 12.5971 12.4209 14.4622 12.1248C15.4097 11.9746 15.6589 12.3533 16.0043 12.8777C16.0425 12.9358 16.0807 12.9928 16.1198 13.0499C16.4479 13.5297 16.691 13.6394 17.0582 13.8064C17.2227 13.881 17.428 13.9751 17.7031 14.1314C18.3551 14.504 18.3551 14.9247 18.3551 15.8472V15.9518C18.3551 16.3434 18.3168 16.6872 18.2566 16.9859C19.3478 15.6185 20 13.8854 20 12C20 8.70089 18.003 5.8682 15.1519 4.64482C14.5987 5.01813 13.8398 5.54726 13.575 5.91C13.4396 6.09538 13.2482 7.04166 12.6257 7.11976C12.4626 7.14023 12.2438 7.12589 12.012 7.11097C11.3905 7.07058 10.5402 7.01606 10.268 7.75495C10.0952 8.2232 10.0648 9.49445 10.6239 10.1543C10.7134 10.2597 10.7307 10.4547 10.6699 10.6735C10.59 10.9608 10.4286 11.1356 10.3783 11.1717C10.2819 11.1163 10.0896 10.8931 9.95938 10.7412C9.64554 10.3765 9.25405 9.92233 8.74797 9.78176C8.56395 9.73083 8.36166 9.68867 8.16548 9.64736C7.6164 9.53227 6.99443 9.40134 6.84992 9.09302C6.74442 8.8672 6.74488 8.55621 6.74529 8.22764C6.74529 7.8112 6.74529 7.34029 6.54129 6.88256C6.46246 6.70541 6.35689 6.56446 6.23509 6.45329ZM12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22Z"},child:[]}]})(e)}function ho(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M9.9997 15.1709L19.1921 5.97852L20.6063 7.39273L9.9997 17.9993L3.63574 11.6354L5.04996 10.2212L9.9997 15.1709Z"},child:[]}]})(e)}function yo(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M9.9997 15.1709L19.1921 5.97852L20.6063 7.39273L9.9997 17.9993L3.63574 11.6354L5.04996 10.2212L9.9997 15.1709Z"},child:[]}]})(e)}function go(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M12 4C9.4095 4 7.10606 5.23053 5.64274 7.14274L8 9.5H2V3.5L4.21863 5.71863C6.05061 3.452 8.85558 2 12 2 17.5228 2 22 6.47715 22 12H20C20 7.58172 16.4183 4 12 4ZM4 12C4 16.4183 7.58172 20 12 20 14.5905 20 16.894 18.7695 18.3573 16.8573L16 14.5 22 14.5V20.5L19.7814 18.2814C17.9494 20.548 15.1444 22 12 22 6.47715 22 2 17.5228 2 12H4Z"},child:[]}]})(e)}function pe(e){return I({attr:{viewBox:"0 0 24 24",fill:"currentColor"},child:[{tag:"path",attr:{d:"M17.0007 1.20825 18.3195 3.68108 20.7923 4.99992 18.3195 6.31876 17.0007 8.79159 15.6818 6.31876 13.209 4.99992 15.6818 3.68108 17.0007 1.20825ZM8.00065 4.33325 10.6673 9.33325 15.6673 11.9999 10.6673 14.6666 8.00065 19.6666 5.33398 14.6666.333984 11.9999 5.33398 9.33325 8.00065 4.33325ZM19.6673 16.3333 18.0007 13.2083 16.334 16.3333 13.209 17.9999 16.334 19.6666 18.0007 22.7916 19.6673 19.6666 22.7923 17.9999 19.6673 16.3333Z"},child:[]}]})(e)}function q(e){if(!e.dictionary.ai)throw new Error("AI dictionary not found");return e.dictionary.ai}function Ze(){const e=_.useBlockNoteContext();return q(e.editor)}const We=e=>{const t=_.useComponentsContext(),{onManualPromptSubmit:o,promptText:r,onPromptTextChange:n}=e,[s,a]=w.useState(""),i=r||s,l=w.useCallback(async f=>{f.key==="Enter"&&o(i)},[i,o]),c=w.useCallback(f=>{const k=f.currentTarget.value;n&&n(k),r===void 0&&a(k)},[n,a,r]),u=w.useMemo(()=>b.filterSuggestionItems(e.items,i),[i,e.items]),{selectedIndex:m,setSelectedIndex:p,handler:d}=_.useSuggestionMenuKeyboardHandler(u,f=>f.onItemClick()),h=w.useCallback(f=>{f.key==="Enter"?u.length>0?d(f):l(f):d(f)},[l,d,u.length]);return w.useEffect(()=>{p(0)},[i,p]),y.jsxs("div",{className:"bn-combobox",children:[y.jsx(t.Generic.Form.Root,{children:y.jsx(t.Generic.Form.TextInput,{className:"bn-combobox-input",name:"ai-prompt",variant:"large",icon:e.icon,value:i||"",autoFocus:!0,placeholder:e.placeholder,disabled:e.disabled,onKeyDown:h,onChange:c,autoComplete:"off",rightSection:e.rightSection},"input-"+e.disabled)}),y.jsx(t.SuggestionMenu.Root,{className:"bn-combobox-items",id:"ai-suggestion-menu",children:u.map((f,k)=>y.jsx(t.SuggestionMenu.Item,{className:b.mergeCSSClasses("bn-suggestion-menu-item",f.size==="small"?"bn-suggestion-menu-item-small":""),id:`bn-suggestion-menu-item-${k}`,isSelected:k===m,onClick:f.onItemClick,item:f},f.title))})]})};function bo(e){const t=q(e),o=A(e);return[{key:"continue_writing",title:t.ai_default_commands.continue_writing.title,aliases:t.ai_default_commands.continue_writing.aliases,icon:y.jsx(Ce,{size:18}),onItemClick:async()=>{await o.invokeAI({userPrompt:"Continue writing at the current cursor position related to the previous text. Add multiple blocks if needed. If the document looks like a template / draft, follow the template. Be extensive if needed.",streamToolsProvider:M.html.getStreamToolsProvider({defaultStreamTools:{add:!0,delete:!1,update:!1}})})},size:"small"},{key:"summarize",title:t.ai_default_commands.summarize.title,aliases:t.ai_default_commands.summarize.aliases,icon:y.jsx(po,{size:18}),onItemClick:async()=>{await o.invokeAI({userPrompt:"Summarize",streamToolsProvider:M.html.getStreamToolsProvider({defaultStreamTools:{add:!0,delete:!1,update:!1}})})},size:"small"},{key:"action_items",title:t.ai_default_commands.add_action_items.title,aliases:t.ai_default_commands.add_action_items.aliases,icon:y.jsx(uo,{size:18}),onItemClick:async()=>{await o.invokeAI({userPrompt:"Add action items",streamToolsProvider:M.html.getStreamToolsProvider({defaultStreamTools:{add:!0,delete:!1,update:!1}})})},size:"small"},{key:"write_anything",title:t.ai_default_commands.write_anything.title,aliases:t.ai_default_commands.write_anything.aliases,icon:y.jsx(Ce,{size:18}),onItemClick:r=>{r(t.ai_default_commands.write_anything.prompt_placeholder)},size:"small"}]}function So(e){const t=q(e),o=A(e);return[{key:"improve_writing",title:t.ai_default_commands.improve_writing.title,aliases:t.ai_default_commands.improve_writing.aliases,icon:y.jsx(mo,{size:18}),onItemClick:async()=>{await o.invokeAI({useSelection:!0,userPrompt:"Improve writing",streamToolsProvider:M.html.getStreamToolsProvider({defaultStreamTools:{add:!1,delete:!1,update:!0}})})},size:"small"},{key:"fix_spelling",title:t.ai_default_commands.fix_spelling.title,aliases:t.ai_default_commands.fix_spelling.aliases,icon:y.jsx(yo,{size:18}),onItemClick:async()=>{await o.invokeAI({useSelection:!0,userPrompt:"Fix spelling",streamToolsProvider:M.html.getStreamToolsProvider({defaultStreamTools:{add:!1,delete:!1,update:!0}})})},size:"small"},{key:"translate",title:t.ai_default_commands.translate.title,aliases:t.ai_default_commands.translate.aliases,icon:y.jsx(fo,{size:18}),onItemClick:r=>{r(t.ai_default_commands.translate.prompt_placeholder)},size:"small"},{key:"simplify",title:t.ai_default_commands.simplify.title,aliases:t.ai_default_commands.simplify.aliases,icon:y.jsx(co,{size:18}),onItemClick:async()=>{await o.invokeAI({useSelection:!0,userPrompt:"Simplify",streamToolsProvider:M.html.getStreamToolsProvider({defaultStreamTools:{add:!1,delete:!1,update:!0}})})},size:"small"}]}function ko(e){const t=q(e),o=A(e);return[{key:"accept",title:t.ai_menu.actions.accept.title,aliases:t.ai_menu.actions.accept.aliases,icon:y.jsx(ho,{size:18}),onItemClick:()=>{o.acceptChanges()},size:"small"},{key:"revert",title:t.ai_menu.actions.revert.title,aliases:t.ai_menu.actions.revert.aliases,icon:y.jsx(Fe,{size:18}),onItemClick:()=>{o.rejectChanges()},size:"small"}]}function wo(e){const t=q(e),o=A(e);return[{key:"retry",title:t.ai_menu.actions.retry.title,aliases:t.ai_menu.actions.retry.aliases,icon:y.jsx(go,{size:18}),onItemClick:async()=>{await o.retry()},size:"small"},{key:"cancel",title:t.ai_menu.actions.cancel.title,aliases:t.ai_menu.actions.cancel.aliases,icon:y.jsx(Fe,{size:18}),onItemClick:()=>{o.rejectChanges()},size:"small"}]}function Ye(e,t){return t==="user-input"?e.getSelection()?So(e):bo(e):t==="user-reviewing"?ko(e):t==="error"?wo(e):[]}const Ge=e=>{const t=_.useBlockNoteEditor(),[o,r]=w.useState(""),n=Ze(),s=_.useComponentsContext(),a=A(t),i=Ie.useStore(a.store,d=>d.aiMenuState!=="closed"?d.aiMenuState.status:"closed"),{items:l}=e,c=w.useMemo(()=>{let d=[];return l?d=l(t,i):d=Ye(t,i),d.map(h=>({...h,onItemClick:()=>{h.onItemClick(r)}}))},[l,i,t]),u=w.useCallback(async d=>{await a.invokeAI({userPrompt:d,useSelection:t.getSelection()!==void 0})},[a,t]);w.useEffect(()=>{(i==="user-reviewing"||i==="error")&&r("")},[i]);const m=w.useMemo(()=>i==="thinking"?n.ai_menu.status.thinking:i==="ai-writing"?n.ai_menu.status.editing:i==="error"?n.ai_menu.status.error:n.ai_menu.input_placeholder,[i,n]),p=w.useMemo(()=>{if(i==="thinking"||i==="ai-writing")return y.jsx(s.SuggestionMenu.Loader,{className:"bn-suggestion-menu-loader bn-combobox-right-section"});if(i==="error")return y.jsx("div",{className:"bn-combobox-right-section bn-combobox-error",children:y.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",height:"1em",viewBox:"0 -960 960 960",width:"1em",fill:"currentColor",children:y.jsx("path",{d:"M480-280q17 0 28.5-11.5T520-320q0-17-11.5-28.5T480-360q-17 0-28.5 11.5T440-320q0 17 11.5 28.5T480-280Zm0-160q17 0 28.5-11.5T520-480v-160q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640v160q0 17 11.5 28.5T480-440Zm0 360q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"})})})},[s,i]);return y.jsx(We,{onManualPromptSubmit:e.onManualPromptSubmit||u,items:c,promptText:o,onPromptTextChange:r,placeholder:m,disabled:i==="thinking"||i==="ai-writing",icon:y.jsx("div",{className:"bn-combobox-icon",children:y.jsx(pe,{})}),rightSection:p})},Ke=e=>{const t=e.blockID?document.querySelector(`[data-id="${e.blockID}"]`):void 0,o=w.useMemo(()=>t?{getBoundingClientRect:()=>t.getBoundingClientRect(),contextElement:t}:null,[t]),{isMounted:r,ref:n,style:s,getFloatingProps:a,isPositioned:i}=_.useUIElementPositioning(!!t,o,3e3,{canDismiss:{enabled:!0,escapeKey:!0,outsidePress:e.canDismissViaOutsidePress},placement:"bottom",middleware:[te.offset(10),te.size({apply({rects:l,elements:c}){Object.assign(c.floating.style,{width:`${l.reference.width}px`})}})],onOpenChange:e.onOpenChange,whileElementsMounted:(l,c,u)=>te.autoUpdate(l,c,u,{animationFrame:!0}),...e.floatingOptions});return r?y.jsx("div",{ref:n,style:{...s},...a(),children:i&&e.children}):null},xo=e=>{const t=_.useBlockNoteEditor(),o=A(t),r=Ie.useStore(o.store,a=>a.aiMenuState),n=r==="closed"?void 0:r.blockId,s=e.aiMenu||Ge;return y.jsx(Ke,{canDismissViaOutsidePress:r==="closed"||r.status==="user-input",blockID:n,onOpenChange:a=>{a||r==="closed"||(r.status==="user-input"?o.closeAIMenu():(r.status==="user-reviewing"||r.status==="error")&&o.rejectChanges())},children:y.jsx(s,{})})},To=()=>{const e=Ze(),t=_.useComponentsContext(),o=_.useBlockNoteEditor(),r=A(o),n=()=>{o.formattingToolbar.closeMenu();const s=o.getSelection();if(!s)throw new Error("No selection");const a=s.blocks[s.blocks.length-1].id;r.openAIMenuAtBlock(a)};return o.isEditable?y.jsx(t.Generic.Toolbar.Button,{className:"bn-button",label:e.formatting_toolbar.ai.tooltip,mainTooltip:e.formatting_toolbar.ai.tooltip,icon:y.jsx(pe,{}),onClick:n}):null},vo={AI:pe};function Po(e){const t=A(e);return[{key:"ai",onItemClick:()=>{const r=e.getTextCursorPosition();r.block.content&&Array.isArray(r.block.content)&&r.block.content.length===0&&r.prevBlock?t.openAIMenuAtBlock(r.prevBlock.id):t.openAIMenuAtBlock(r.block.id)},...q(e).slash_menu.ai,icon:y.jsx(vo.AI,{})}]}function Xe(e){return Object.fromEntries(Object.entries(e).map(([t,o])=>[t,T.tool({...o,inputSchema:T.jsonSchema(o.inputSchema),outputSchema:T.jsonSchema(o.outputSchema)})]))}function Qe(e,t){let o="";return e.pipeThrough(new TransformStream({start(r){r.enqueue({type:"start"}),r.enqueue({type:"start-step"}),r.enqueue({type:"tool-input-start",toolCallId:"call_object_1",toolName:t})},transform(r,n){switch(r.type){case"text-delta":o+=r.textDelta,n.enqueue({type:"tool-input-delta",toolCallId:"call_object_1",inputTextDelta:r.textDelta});break;case"object":case"finish":break;case"error":n.enqueue({type:"error",errorText:re.getErrorMessage(r.error)});break;default:{const s=r;throw new Error(`Unsupported chunk type: ${s}`)}}},async flush(r){r.enqueue({type:"tool-input-available",toolCallId:"call_object_1",toolName:t,input:JSON.parse(o)}),r.enqueue({type:"finish-step"}),r.enqueue({type:"finish"})}}))}function et(e,t){return new ReadableStream({start(r){r.enqueue({type:"start"}),r.enqueue({type:"start-step"}),r.enqueue({type:"tool-input-start",toolCallId:"call_object_1",toolName:t}),r.enqueue({type:"tool-input-delta",toolCallId:"call_object_1",inputTextDelta:JSON.stringify(e)}),r.enqueue({type:"tool-input-available",toolCallId:"call_object_1",toolName:t,input:e}),r.enqueue({type:"finish-step"}),r.enqueue({type:"finish"}),r.close()}})}const tt={"mistral.chat":{mode:"auto"},"google.generative-ai":{mode:"auto"},"groq.chat":{providerOptions:{groq:{structuredOutputs:!1}}}};function oe(e){return tt[e.provider]||{}}class Co{constructor(t){this.opts=t}async generateObject(t,o){const{model:r,_additionalOptions:n}=this.opts;if(typeof r=="string")throw new Error("model must be a LanguageModelV2");const s=Object.keys(o)[0],a=o[s].inputSchema,i=await T.generateObject({output:"object",schema:a,model:r,mode:"tool",messages:T.convertToModelMessages(t),...oe(r),...n??{}});return et(i.object,s)}async streamObject(t,o){const{model:r,_additionalOptions:n}=this.opts;if(typeof r=="string")throw new Error("model must be a LanguageModelV2");const s=Object.keys(o)[0],a=o[s].inputSchema,i=T.streamObject({output:"object",schema:a,model:r,mode:"tool",messages:T.convertToModelMessages(t),...oe(r),...n??{}});return Qe(i.fullStream,s)}async streamText(t,o){const{model:r,_additionalOptions:n}=this.opts;return T.streamText({model:r,messages:T.convertToModelMessages(t),tools:o,toolChoice:"required",...n??{}}).toUIMessageStream()}async sendMessages({messages:t,body:o}){const r=this.opts.stream??!0,n=o.toolDefinitions,s=Xe(n);if(this.opts.objectGeneration)return r?this.streamObject(t,s):this.generateObject(t,s);if(r)return await this.streamText(t,s);throw new Error("Not implemented (generateText)")}reconnectToStream(){throw new Error("Not implemented")}}exports.AIExtension=de;exports.AIMenu=Ge;exports.AIMenuController=xo;exports.AIToolbarButton=To;exports.BlockPositioner=Ke;exports.ChunkExecutionError=ne;exports.ClientSideTransport=Co;exports.PROVIDER_OVERRIDES=tt;exports.PromptSuggestionMenu=We;exports.StreamToolExecutor=Ee;exports.aiDocumentFormats=M;exports.buildAIRequest=Ne;exports.createAIExtension=eo;exports.createStreamToolsArraySchema=Me;exports.defaultAIRequestSender=Be;exports.executeAIRequest=Le;exports.fetchViaProxy=to;exports.getAIDictionary=q;exports.getAIExtension=A;exports.getAISlashMenuItems=Po;exports.getDefaultAIMenuItems=Ye;exports.getProviderOverrides=oe;exports.objectAsToolCallInUIMessageStream=et;exports.objectStreamToOperationsResult=Ae;exports.partialObjectStreamAsToolCallInUIMessageStream=Qe;exports.promptHelpers=Gt;exports.toolDefinitionsToToolSet=Xe;
|
|
10
10
|
//# sourceMappingURL=blocknote-xl-ai.cjs.map
|