@capytale/iframe-react 1.2.2 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const L=require("react/jsx-runtime"),v=require("react");const X=Symbol("Comlink.proxy"),mt=Symbol("Comlink.endpoint"),Ct=Symbol("Comlink.releaseProxy"),N=Symbol("Comlink.finalizer"),V=Symbol("Comlink.thrown"),Z=t=>typeof t=="object"&&t!==null||typeof t=="function",pt={canHandle:t=>Z(t)&&t[X],serialize(t){const{port1:e,port2:n}=new MessageChannel;return z(t,e),[n,[n]]},deserialize(t){return t.start(),nt(t)}},vt={canHandle:t=>Z(t)&&V in t,serialize({value:t}){let e;return t instanceof Error?e={isError:!0,value:{message:t.message,name:t.name,stack:t.stack}}:e={isError:!1,value:t},[e,[]]},deserialize(t){throw t.isError?Object.assign(new Error(t.value.message),t.value):t.value}},tt=new Map([["proxy",pt],["throw",vt]]);function yt(t,e){for(const n of t)if(e===n||n==="*"||n instanceof RegExp&&n.test(e))return!0;return!1}function z(t,e=globalThis,n=["*"]){e.addEventListener("message",function i(o){if(!o||!o.data)return;if(!yt(n,o.origin)){console.warn(`Invalid origin '${o.origin}' for comlink proxy`);return}const{id:s,type:u,path:l}=Object.assign({path:[]},o.data),g=(o.data.argumentList||[]).map(J);let f;try{const d=l.slice(0,-1).reduce((p,S)=>p[S],t),m=l.reduce((p,S)=>p[S],t);switch(u){case"GET":f=m;break;case"SET":d[l.slice(-1)[0]]=J(o.data.value),f=!0;break;case"APPLY":f=m.apply(d,g);break;case"CONSTRUCT":{const p=new m(...g);f=st(p)}break;case"ENDPOINT":{const{port1:p,port2:S}=new MessageChannel;z(t,S),f=ht(p,[p])}break;case"RELEASE":f=void 0;break;default:return}}catch(d){f={value:d,[V]:0}}Promise.resolve(f).catch(d=>({value:d,[V]:0})).then(d=>{const[m,p]=O(d);e.postMessage(Object.assign(Object.assign({},m),{id:s}),p),u==="RELEASE"&&(e.removeEventListener("message",i),et(e),N in t&&typeof t[N]=="function"&&t[N]())}).catch(d=>{const[m,p]=O({value:new TypeError("Unserializable return value"),[V]:0});e.postMessage(Object.assign(Object.assign({},m),{id:s}),p)})}),e.start&&e.start()}function St(t){return t.constructor.name==="MessagePort"}function et(t){St(t)&&t.close()}function nt(t,e){const n=new Map;return t.addEventListener("message",function(o){const{data:s}=o;if(!s||!s.id)return;const u=n.get(s.id);if(u)try{u(s)}finally{n.delete(s.id)}}),H(t,n,[],e)}function M(t){if(t)throw new Error("Proxy has been released and is not useable")}function ot(t){return k(t,new Map,{type:"RELEASE"}).then(()=>{et(t)})}const j=new WeakMap,I="FinalizationRegistry"in globalThis&&new FinalizationRegistry(t=>{const e=(j.get(t)||0)-1;j.set(t,e),e===0&&ot(t)});function At(t,e){const n=(j.get(e)||0)+1;j.set(e,n),I&&I.register(t,e,t)}function wt(t){I&&I.unregister(t)}function H(t,e,n=[],i=function(){}){let o=!1;const s=new Proxy(i,{get(u,l){if(M(o),l===Ct)return()=>{wt(s),ot(t),e.clear(),o=!0};if(l==="then"){if(n.length===0)return{then:()=>s};const g=k(t,e,{type:"GET",path:n.map(f=>f.toString())}).then(J);return g.then.bind(g)}return H(t,e,[...n,l])},set(u,l,g){M(o);const[f,d]=O(g);return k(t,e,{type:"SET",path:[...n,l].map(m=>m.toString()),value:f},d).then(J)},apply(u,l,g){M(o);const f=n[n.length-1];if(f===mt)return k(t,e,{type:"ENDPOINT"}).then(J);if(f==="bind")return H(t,e,n.slice(0,-1));const[d,m]=Q(g);return k(t,e,{type:"APPLY",path:n.map(p=>p.toString()),argumentList:d},m).then(J)},construct(u,l){M(o);const[g,f]=Q(l);return k(t,e,{type:"CONSTRUCT",path:n.map(d=>d.toString()),argumentList:g},f).then(J)}});return At(s,t),s}function bt(t){return Array.prototype.concat.apply([],t)}function Q(t){const e=t.map(O);return[e.map(n=>n[0]),bt(e.map(n=>n[1]))]}const rt=new WeakMap;function ht(t,e){return rt.set(t,e),t}function st(t){return Object.assign(t,{[X]:!0})}function Ft(t,e=globalThis,n="*"){return{postMessage:(i,o)=>t.postMessage(i,n,o),addEventListener:e.addEventListener.bind(e),removeEventListener:e.removeEventListener.bind(e)}}function O(t){for(const[e,n]of tt)if(n.canHandle(t)){const[i,o]=n.serialize(t);return[{type:"HANDLER",name:e,value:i},o]}return[{type:"RAW",value:t},rt.get(t)||[]]}function J(t){switch(t.type){case"HANDLER":return tt.get(t.name).deserialize(t.value);case"RAW":return t.value}}function k(t,e,n,i){return new Promise(o=>{const s=Et();e.set(s,o),t.start&&t.start(),t.postMessage(Object.assign({id:s},n),i)})}function Et(){return new Array(4).fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-")}function Jt(t,e){return t.length===0?e:`[${t}] ${e}`}function Tt(t,e){let n=!1,i,o,s;function u(d){return Jt(t,d)}let l,g=!1;if(window.parent===window)console.warn(u("Contract link is not supported in standalone mode")),l={ready(){return Promise.resolve()},declare(){return Promise.resolve()},done(){return Promise.resolve()},provide(d,m,p){return Promise.resolve()}};else{const d=Ft(window.parent,void 0,e);z({declare(m){if(i==null)throw new Error(u("No handler for declare"));i(m)},done(){if(o==null)throw new Error(u("No handler for done"));o()},provide(m,p,S){if(s==null)throw new Error(u("No handler for provide"));s(m,p,S)}},d),l=nt(d),g=!0}const f=()=>{if(!n){if(i==null||o==null||s==null)return;n=!0,l.ready()}};return{declare:d=>l.declare(d),done:()=>l.done(),provide:(d,m,p)=>l.provide(d,m,st(p)),get name(){return t},get isReady(){return g},set onDeclare(d){i=d,f()},set onDone(d){o=d,f()},set onProvide(d){s=d,f()}}}function Rt(t){return function(e){let n,i=!1,o=!1,s,u,l=!1,g=!1,f,d,m,p;function S(){if(s!=null&&s!==0&&u!=null)return u}function F(a){if(s!=null&&u!=null&&!(a>s))return u}function b(){return m??(g?m=Promise.resolve():m=new Promise((a,c)=>{p=a}))}function T(){return f===void 0&&(f={get name(){return e},get version(){return s},get i(){return S()},v:a=>F(a)}),f}function x(){return d===void 0&&(d={get name(){return e},get version(){return g?s:void 0},get i(){return g?S():void 0},v:a=>g?F(a):void 0,get promise(){return s===0?Promise.reject(t("Remote interface not provided")):b().then(()=>{if(s===0)throw new Error(t("Remote interface not provided"));return T()})}}),d}function E(){p!=null&&(p(),p=void 0)}return{get name(){return e},get localVersion(){if(n!=null)return n},set localVersion(a){if(n!=null&&n!==a)throw new Error(t("A different local version is already set"));n=a},get localVersionSent(){return i},set localVersionSent(a){if(!a&&i)throw new Error(t("Local version already notified"));i=a,a&&n===0&&(o=!0)},get localInterfaceSent(){return o},set localInterfaceSent(a){if(n==null)throw new Error(t("Local version not set"));if(!a&&o)throw new Error(t("Local interface already sent."));o=a},get remoteVersion(){if(s!=null)return s},set remoteVersion(a){if(s!=null&&s!==a)throw new Error(t("A different remote version is already set for "+e+`(${s} -> ${a})`));s=a,a===0&&(l=!0)},get remoteVersionReceived(){return s!=null},setRemoteInterface:a=>{if(s==null)throw new Error(t("Remote version not set"));if(s===0){console.warn(t("Remote version is 0, remote interface is ignored."));return}if(l)throw new Error(t("Interface already provided."));u=a,l=!0},get remoteInterfaceReceived(){return l},depGroup:void 0,get isActivable(){return l&&o},get isActivated(){return g},activate(){if(!g){if(!l)throw new Error(t("Remote interface not provided."));if(!o)throw new Error(t("Local interface not sent"));g=!0,E()}},getRemote:()=>T(),getLazyRemote:()=>x(),get activationPromise(){return b()}}}}function kt(t){return function(e,n,i,o){let s=i,u=!1,l=!1;function g(){return e.every(f=>f.remoteVersionReceived&&f.localVersionSent)&&n.every(f=>f.remoteVersionReceived)}return{get isDeclared(){return l},set isDeclared(f){if(!f&&l)throw new Error(t("Factory already declared"));l=f},get isReady(){return g()},get isDone(){return u},get args(){return e},get deps(){return n},invoke(){if(u)throw new Error(t("Factory already invoked"));if(!g())throw new Error(t("Factory is not ready"));let f;o?f=e.map(p=>p.getRemote()):f=e[0].getRemote();let d;const m=n.length>0?n.map(p=>p.getRemote()):null;try{d=m==null?s(f):s(f,m)}catch(p){throw new Error(t("error in factory:"),{cause:p})}if(o||(d=[d]),d.length!=e.length)throw new Error(t("Invalid factory result"));return u=!0,s=null,d}}}}function xt(t){return function(e,n,i,o){let s=n,u=!1;function l(){return e.every(g=>g.isActivated)}return{get isReady(){return l()},get isDone(){return u},get args(){return e},invoke(){if(u||!l()){const d=new Error(t(u?"callback already invoked":"callback parameters are not ready"));throw o?.[1](d),d}const g=i?e.map(d=>d.getRemote()):e[0].getRemote();let f;try{f=s(g)}catch(d){o==null?console.error(t("error in callback:"),d):o[1](d)}finally{u=!0}o?.[0](f)}}}}function it(t,e){return t==null||t.length===0?e:`[${t}] ${e}`}function Lt(t){function e(a){return it(t.name,a)}const n=xt(e),i=Rt(e),o=kt(e),s={},u=[];let l=[],g;const f=()=>(g==null?g=0:g++,g);function d(a){let c=s[a];return c==null&&(c=i(a),c.localVersion==null&&(b&&(c.localVersion=0),T&&(c.localVersionSent=!0)),c.remoteVersion==null&&x&&(c.remoteVersion=0),s[a]=c),c}function m(a){return a.map(d)}function p(...a){const c=f(),C=Array(c).fill(!1);a.forEach(y=>{y.forEach(A=>{A.depGroup!=null&&(C[A.depGroup]=!0),A.depGroup=c})}),Object.values(s).forEach(y=>{y.depGroup!=null&&y.depGroup!==c&&C[y.depGroup]&&(y.depGroup=c)})}t.onDeclare=a=>{const c=m(a.map(C=>C.name));for(let C=0;C<a.length;C++)a[C].version!=null&&(c[C].remoteVersion=a[C].version);p(c),E()},t.onDone=()=>{x||(x=!0,Object.values(s).forEach(a=>{a.remoteVersion==null&&(a.remoteVersion=0)}),E())},t.onProvide=(a,c,C)=>{let y=s[a];if(y==null)throw new Error(e(`Contract not declared : ${a}`));if(y.remoteVersion!=c)throw new Error(e(`Remote declared version ${y.remoteVersion} of contract "${a}" but provided version ${c}.`));if(y.remoteInterfaceReceived)throw new Error(e(`Remote contract "${a}" is already provided.`));y.setRemoteInterface(C),E()};let S=!1,F=!1,b=!1,T=!1,x=!1;async function E(){if(F=!0,!S){for(S=!0;F;){if(F=!1,t.isReady){const a=u.filter(c=>!c.isDeclared);if(a.length>0)for(const c of a){const C=Array(c.args.length+c.deps.length);c.args.forEach((y,A)=>C[A]=y),c.deps.forEach((y,A)=>C[A+c.args.length]=y),await t.declare(C.map(y=>({name:y.name,version:y.localVersion}))),C.forEach(y=>{y.localVersion!=null&&(y.localVersionSent=!0)}),c.isDeclared=!0}}if(t.isReady&&b&&u.every(a=>a.isDeclared)){const a=Object.values(s).filter(c=>!c.localVersionSent&&c.localVersion!=null);if(a.length>0)for(const c of a)await t.declare([{name:c.name,version:c.localVersion}]),c.localVersionSent=!0;T||(T=!0,await t.done())}if(t.isReady){const a=u.filter(c=>!c.isDone&&c.isReady);if(a.length>0)for(const c of a){const C=c.invoke();for(let y=0;y<c.args.length;y++){const A=c.args[y];await t.provide(A.name,A.localVersion,C[y]),A.localInterfaceSent=!0}}}if(g!=null){const a=Array(g+1).fill(null);for(const c in s){const C=s[c];C.depGroup!=null&&(C.isActivable?a[C.depGroup]==null&&!C.isActivated&&(a[C.depGroup]=!0):a[C.depGroup]=!1)}if(a.some(c=>c===!0))for(const c in s){const C=s[c];C.depGroup!=null&&a[C.depGroup]&&C.activate()}}if(t.isReady){const a=l;l=[];const c=[];for(const C of a)!C.isDone&&C.isReady?C.invoke():c.push(C);c.push(...l),l=c}}S=!1}}return{get(a){return d(a)},declareFactory:(a,c,C,y)=>{if(b)throw new Error(e("Cannot declare a factory after done has been set to true."));const A=m(a.map(h=>h.name));{const h=A.filter($=>$.localVersion!=null);if(h.length>0)throw new Error(e("Cannot declare a factory for already implemented contracts : "+h.map($=>$.name).join(", ")))}for(let h=0;h<a.length;h++)A[h].localVersion=a[h].version;const R=m(c);p(A,R);const gt=o(A,R,C,y);u.push(gt),E()},declareCallback(a,c,C,y){const A=m(a),R=n(A,c,C,y);!S&&l.length===0&&R.isReady?R.invoke():(l.push(R),E())},get done(){return b},set done(a){if(b){if(!a)throw new Error(e("Cannot set done to false after it has been set to true."))}else a&&(b=!0,Object.values(s).forEach(c=>{c.localVersion==null&&(c.localVersion=0)}),E())}}}const Mt=/^\d+$/;function Gt(t){const[e,n,i]=t.split(":",3);if(n==null||i!=null||!Mt.test(n))return null;const o=parseInt(n);return isNaN(o)||o===0?null:{name:e,version:o}}function Dt(t){const e=Lt(t);function n(i){return it(t.name,i)}return{plug(i,o,s=void 0){if(e.done)throw new Error(n("Cannot plug after plugsDone."));s==null&&(s=o,o=[]);let u=!0;Array.isArray(i)||(i=[i],u=!1);const l=i.map(g=>{const f=Gt(g);if(f==null)throw new Error(n("Invalid contract id : "+g));return f});e.declareFactory(l,o,s,u)},plugsDone(){e.done=!0},use(i,o){let s=!0;Array.isArray(i)||(i=[i],s=!1),e.declareCallback(i,o,s)},exec(i,o){let s=!0;return Array.isArray(i)||(i=[i],s=!1),new Promise((...u)=>{e.declareCallback(i,o,s,u)})},get(i){return i.map(o=>e.get(o).getLazyRemote())}}}const at="app-agent";let q;function Pt(t){return q!=null||(q=Dt(Tt(at,t))),q}console.log(`[${at}@1.0.12] loaded`);const _=t=>{let e;const n=new Set,i=(f,d)=>{const m=typeof f=="function"?f(e):f;if(!Object.is(m,e)){const p=e;e=d??(typeof m!="object"||m===null)?m:Object.assign({},e,m),n.forEach(S=>S(e,p))}},o=()=>e,l={setState:i,getState:o,getInitialState:()=>g,subscribe:f=>(n.add(f),()=>n.delete(f))},g=e=t(i,o,l);return l},Vt=(t=>t?_(t):_),jt=t=>t;function It(t,e=jt){const n=v.useSyncExternalStore(t.subscribe,v.useCallback(()=>e(t.getState()),[t,e]),v.useCallback(()=>e(t.getInitialState()),[t,e]));return v.useDebugValue(n),n}const U=t=>{const e=Vt(t),n=i=>It(e,i);return Object.assign(n,e),n},lt=(t=>t?U(t):U),Ot=t=>(e,n,i)=>{const o=i.subscribe;return i.subscribe=((u,l,g)=>{let f=u;if(l){const d=g?.equalityFn||Object.is;let m=u(i.getState());f=p=>{const S=u(p);if(!d(m,S)){const F=m;l(m=S,F)}},g?.fireImmediately&&l(m,m)}return o(f)}),t(e,n,i)},$t=Ot,r=lt()($t(t=>({ready:!1,workflow:"current",mode:"assignment",theme:"light",saveCount:0,canSave:!1,afterSaveCount:0,isDirtyCount:0,loadedTextContent:null,loadedJsonContent:null,loadedJsonActivityContent:null,loadedJsonAssignmentContent:null,loadedJsonActivityBinaryData:null,loadedJsonAssignmentBinaryData:null,getTextContentFunction:()=>{throw console.error("[React bindings] getTextContentFunction is not set"),new Error("[React bindings] getTextContentFunction is not set")},getJsonContentFunction:()=>{throw console.error("[React bindings] getJsonContentFunction is not set"),new Error("[React bindings] getJsonContentFunction is not set")},getJsonActivityContentFunction:()=>{throw console.error("[React bindings] getJsonActivityContentFunction is not set"),new Error("[React bindings] getJsonActivityContentFunction is not set")},getJsonAssignmentContentFunction:()=>{throw console.error("[React bindings] getJsonAssignmentContentFunction is not set"),new Error("[React bindings] getJsonAssignmentContentFunction is not set")},getJsonActivitySplitContentFunction:()=>{throw console.error("[React bindings] getJsonActivitySplitContentFunction is not set"),new Error("[React bindings] getJsonActivitySplitContentFunction is not set")},getJsonAssignmentSplitContentFunction:()=>{throw console.error("[React bindings] getJsonAssignmentSplitContentFunction is not set"),new Error("[React bindings] getJsonAssignmentSplitContentFunction is not set")},sidebarActions:{},quickActions:{},activitySettingsCallback:null,llmGetFirstMessageContextFunction:null,setLlmGetFirstMessageContextFunction:e=>{t({llmGetFirstMessageContextFunction:e})},llmGetAllMessagesContextFunction:null,setLlmGetAllMessagesContextFunction:e=>{t({llmGetAllMessagesContextFunction:e})},llmGetAvailableToolsFunction:null,setLlmGetAvailableToolsFunction:e=>{t({llmGetAvailableToolsFunction:e})},llmCallToolFunction:null,setLlmCallToolFunction:e=>{t({llmCallToolFunction:e})},setGetTextContentFunction:e=>{t({getTextContentFunction:e})},llmDescribeToolFunction:null,setLlmDescribeToolFunction:e=>{t({llmDescribeToolFunction:e})},setGetJsonContentFunction:e=>{t({getJsonContentFunction:e})},setGetJsonActivityContentFunction:e=>{t({getJsonActivityContentFunction:e})},setGetJsonAssignmentContentFunction:e=>{t({getJsonAssignmentContentFunction:e})},setGetJsonActivitySplitContentFunction:e=>{t({getJsonActivitySplitContentFunction:e})},setGetJsonAssignmentSplitContentFunction:e=>{t({getJsonAssignmentSplitContentFunction:e})},setSidebarActions:e=>{t({sidebarActions:e})},setQuickActions:e=>{t({quickActions:e})},setActivitySettingsCallback:e=>{t({activitySettingsCallback:e})},incSaveCount:()=>t(e=>({saveCount:e.saveCount+1})),incDirtyCount:()=>t(e=>({isDirtyCount:e.isDirtyCount+1}))})));let Y=!1;const Nt=["meta-player-events:1","meta-player-ui:1","mode:1","reload:1","theme:1","workflow:1","trigger-save:1","simple-content(text):1","simple-content(json):1","simple-binary-data(text):1","simple-content-eval(text):1","simple-content-eval(json):1","separate-contents(json):1","separate-dual-contents(json):1","llm:1"],K={"mode:1":{setMode:t=>{r.setState({mode:t})}},"reload:1":{reloaded:t=>{console.log("[React bindings] Reloaded with state:",t),console.error("[React bindings] Not implemented yet")}},"theme:1":{setTheme:t=>{if(t===null){r.setState({theme:null});return}if(t!=="light"&&t!=="dark"){console.warn(`[React bindings] Invalid theme: ${t}. Expected 'light' or 'dark'.`),r.setState({theme:null});return}r.setState({theme:t})}},"workflow:1":{setWorkflow:t=>{r.setState({workflow:t})}},"workflow:2":{setWorkflow:t=>{r.setState({workflow:t})}},"trigger-save:1":{setCanSave(t){r.setState({canSave:t})}},"simple-content(text):1":{contentSaved:()=>{r.setState(t=>({afterSaveCount:t.afterSaveCount+1}))},getContent:()=>r.getState().getTextContentFunction(),loadContent:t=>{r.setState({loadedTextContent:t})}},"simple-content(json):1":{contentSaved:()=>{r.setState(t=>({afterSaveCount:t.afterSaveCount+1}))},getContent:()=>r.getState().getJsonContentFunction(),loadContent:t=>{r.setState({loadedJsonContent:t})}},"simple-binary-data(text):1":{contentSaved:()=>{r.setState(t=>({afterSaveCount:t.afterSaveCount+1}))},getContent:()=>r.getState().getTextContentFunction(),loadContent:t=>{r.setState({loadedTextContent:t})}},"simple-content-eval(text):1":{contentSaved:()=>{r.setState(t=>({afterSaveCount:t.afterSaveCount+1}))},getContent:()=>r.getState().getTextContentFunction(),loadContent:t=>{r.setState({loadedTextContent:t})},getAssignmentContent:()=>{throw new Error("getAssignmentContent is not implemented for simple-content-eval(text)")}},"simple-content-eval(json):1":{contentSaved:()=>{r.setState(t=>({afterSaveCount:t.afterSaveCount+1}))},getContent:()=>r.getState().getJsonContentFunction(),loadContent:t=>{r.setState({loadedJsonContent:t})},getAssignmentContent:()=>{throw new Error("getAssignmentContent is not implemented for simple-content-eval(json)")}},"simple-content-eval(json):2":{contentSaved:()=>{r.setState(t=>({afterSaveCount:t.afterSaveCount+1}))},getContent:()=>r.getState().getJsonContentFunction(),loadContent:t=>{r.setState({loadedJsonContent:t})},getAssignmentContent:()=>{throw new Error("getAssignmentContent is not implemented for simple-content-eval(json)")}},"simple-content-eval(text):2":{contentSaved:()=>{r.setState(t=>({afterSaveCount:t.afterSaveCount+1}))},getContent:()=>r.getState().getTextContentFunction(),loadContent:t=>{r.setState({loadedTextContent:t})},getAssignmentContent:()=>{throw new Error("getAssignmentContent is not implemented for simple-content-eval(text)")}},"separate-contents(json):1":{contentSaved:()=>{r.setState(t=>({afterSaveCount:t.afterSaveCount+1}))},loadContent:(t,e)=>{r.setState({loadedJsonActivityContent:t,loadedJsonAssignmentContent:e})},getActivityContent:()=>r.getState().getJsonActivityContentFunction(),getAssignmentContent:()=>r.getState().getJsonAssignmentContentFunction()},"separate-contents-eval(json):1":{contentSaved:()=>{r.setState(t=>({afterSaveCount:t.afterSaveCount+1}))},loadContent:(t,e)=>{r.setState({loadedJsonActivityContent:t,loadedJsonAssignmentContent:e})},getActivityContent:()=>r.getState().getJsonActivityContentFunction(),getAssignmentContent:()=>r.getState().getJsonAssignmentContentFunction()},"separate-contents-eval(json):2":{contentSaved:()=>{r.setState(t=>({afterSaveCount:t.afterSaveCount+1}))},loadContent:(t,e)=>{r.setState({loadedJsonActivityContent:t,loadedJsonAssignmentContent:e})},getActivityContent:()=>r.getState().getJsonActivityContentFunction(),getAssignmentContent:()=>r.getState().getJsonAssignmentContentFunction()},"separate-dual-contents(json):1":{contentSaved:()=>{r.setState(t=>({afterSaveCount:t.afterSaveCount+1}))},loadContent:({activityContent:t,assignmentContent:e,activityBinaryData:n,assignmentBinaryData:i})=>{r.setState({loadedJsonActivityContent:t,loadedJsonAssignmentContent:e,loadedJsonActivityBinaryData:n,loadedJsonAssignmentBinaryData:i})},getActivityContentAndData:()=>r.getState().getJsonActivitySplitContentFunction(),getAssignmentContentAndData:()=>r.getState().getJsonAssignmentSplitContentFunction()},"meta-player-anti-cheat:1":{lock:()=>{},unlock:()=>{}},"meta-player-ui:1":{executeAction(t){if(t.startsWith("qa")){const n=r.getState().quickActions[t];n?n():console.error(`[React bindings] Quick action not found: ${t}`)}else{const n=r.getState().sidebarActions[t];n?n():console.error(`[React bindings] Sidebar action not found: ${t}`)}},executeFileUpload(t,e){if(t.startsWith("qa")){const i=r.getState().quickActions[t];i?i(e):console.error(`[React bindings] Quick action not found: ${t}`)}else{const i=r.getState().sidebarActions[t];i?i(e):console.error(`[React bindings] Sidebar action not found: ${t}`)}},updateSettings(t){const e=r.getState().activitySettingsCallback;e?e(t):console.warn("activitySettingsCallback is not set. Changes:",t)}},"meta-player-events:1":{handleEvent(t){t==="all-loaded"&&r.setState({ready:!0})}},"llm:1":{getFirstMessageContext:t=>{const e=r.getState().llmGetFirstMessageContextFunction;return e?e(t):""},getAllMessagesContext:t=>{const e=r.getState().llmGetAllMessagesContextFunction;return e?e(t):""},getAvailableTools:t=>{const e=r.getState().llmGetAvailableToolsFunction;return e?e(t):[]},callTool:(t,e)=>{const n=r.getState().llmCallToolFunction;if(!n)throw new Error("LLM call tool function is not set");return n(t,e)},getToolCallDescription:(t,e)=>{const n=r.getState().llmDescribeToolFunction;if(!n)throw new Error("LLM describe tool function is not set");return n(t,e)}}},w=Pt();function qt(t){if(!Y){Y=!0;for(const e of t){if(!Nt.includes(e))continue;if(!(e in K)){console.warn(`[React bindings] Contract handler for ${e} is not defined. Skipping plug.`);continue}const n=K[e];w.plug([e],([])=>[n])}w.plugsDone();for(const e of["simple-content(text):1","simple-content(json):1","simple-binary-data(text):1","simple-content-eval(text):1","simple-content-eval(json):1","simple-content-eval(json):2","simple-content-eval(text):2","separate-contents(json):1","separate-dual-contents(json):1"])if(t.includes(e)){const n=e.split(":")[0];w.use([n],([i])=>{r.subscribe(o=>o.isDirtyCount,()=>{i.i?.contentChanged()})})}}}const Bt=()=>r(t=>{if(t.mode===null)throw new Error("Mode is not set. Have you used contract 'mode'?");return t.mode}),Wt=()=>r(t=>{if(t.workflow===null)throw new Error("Workflow is not set. Have you used contract 'workflow'?");return t.workflow}),Ht=()=>r(t=>{if(t.theme===null)throw new Error("Theme is not set. Have you used contract 'theme'?");return t.theme}),zt=()=>r(t=>t.incSaveCount),Qt=()=>r(t=>t.incDirtyCount),_t=()=>r(t=>t.loadedTextContent),Ut=()=>r(t=>t.loadedJsonContent),Yt=()=>r(t=>t.loadedJsonActivityContent),Kt=()=>r(t=>t.loadedJsonAssignmentContent),Xt=()=>r(t=>t.loadedJsonActivityBinaryData),Zt=()=>r(t=>t.loadedJsonAssignmentBinaryData),te=()=>v.useCallback(()=>r.getState().loadedTextContent,[]),ee=()=>v.useCallback(()=>r.getState().loadedJsonContent,[]),ne=()=>v.useCallback(()=>r.getState().loadedJsonActivityContent,[]),oe=()=>v.useCallback(()=>r.getState().loadedJsonAssignmentContent,[]),re=()=>v.useCallback(()=>({content:r.getState().loadedJsonActivityContent,binaryData:r.getState().loadedJsonActivityBinaryData}),[]),se=()=>v.useCallback(()=>({content:r.getState().loadedJsonAssignmentContent,binaryData:r.getState().loadedJsonAssignmentBinaryData}),[]),ie=t=>{const e=r(n=>n.setGetTextContentFunction);v.useEffect(()=>{e(t)},[t,e])},ae=t=>{const e=r(n=>n.setGetJsonContentFunction);v.useEffect(()=>{e(t)},[t,e])},le=t=>{const e=r(n=>n.setGetJsonActivityContentFunction);v.useEffect(()=>{e(t)},[t,e])},ce=t=>{const e=r(n=>n.setGetJsonAssignmentContentFunction);v.useEffect(()=>{e(t)},[t,e])},ue=t=>{const e=r(n=>n.setGetJsonActivitySplitContentFunction);v.useEffect(()=>{e(t)},[t,e])},de=t=>{const e=r(n=>n.setGetJsonAssignmentSplitContentFunction);v.useEffect(()=>{e(t)},[t,e])},fe=t=>{const e=r(n=>n.afterSaveCount);v.useEffect(()=>{e>0&&t()},[e])},ge=()=>(t,e)=>{w.use(["meta-player-ui"],([n])=>{if(n.version===0){console.error("[React bindings] Le MétaPlayer ne supporte pas le contrat meta-player-ui");return}n.i?.previewTextFile(t,e)})},me=()=>(t,e)=>{w.use(["meta-player-ui"],([n])=>{if(n.version===0){console.error("[React bindings] Le MétaPlayer ne supporte pas le contrat meta-player-ui");return}n.i?.previewImageFile(t,e)})};let G=0,B=0;const Ce=(t,e)=>{const n=v.useMemo(t,e),i=r(o=>o.setSidebarActions);v.useEffect(()=>(G++,G>1&&console.error("[React bindings] Capytale iframe React: Multiple sidebar actions registered: ",G),()=>{G--}),[]),v.useEffect(()=>(w.use(["meta-player-ui"],([o])=>{if(o.version===0){console.error("[React bindings] Le MétaPlayer ne supporte pas le contrat meta-player-ui");return}B++;const s=n.map((l,g)=>({type:l.type,title:l.title,icon:l.icon,id:`sa-${B}-${g}`,...l.type==="file-upload"?{accept:l.accept}:{}})),u={};n.forEach((l,g)=>{u[`sa-${B}-${g}`]=l.action}),o.i?.setSidebarActionButtons(s),i(u)}),()=>{i({}),w.use(["meta-player-ui"],([o])=>{if(o.version===0){console.error("[React bindings] Le MétaPlayer ne supporte pas le contrat meta-player-ui");return}o.i?.setSidebarActionButtons([])})}),[n])};let D=0,W=0;const pe=(t,e)=>{const n=v.useMemo(t,e),i=r(o=>o.setQuickActions);v.useEffect(()=>(D++,D>1&&console.error("[React bindings] Capytale iframe React: Multiple quick actions registered: ",D),()=>{D--}),[]),v.useEffect(()=>(w.use(["meta-player-ui"],([o])=>{if(o.version===0){console.error("[React bindings] Le MétaPlayer ne supporte pas le contrat meta-player-ui");return}W++;const s=n.map((l,g)=>({type:l.type,title:l.title,icon:l.icon,id:`qa-${W}-${g}`,...l.type==="file-upload"?{accept:l.accept}:{}})),u={};n.forEach((l,g)=>{u[`qa-${W}-${g}`]=l.action}),o.i?.setQuickActionButtons(s),i(u)}),()=>{i({}),w.use(["meta-player-ui"],([o])=>{if(o.version===0){console.error("[React bindings] Le MétaPlayer ne supporte pas le contrat meta-player-ui");return}o.i?.setQuickActionButtons([])})}),[n])};let P=0;const ct=(t,e,n)=>{const i=v.useMemo(t,n),o=r(s=>s.setActivitySettingsCallback);v.useEffect(()=>(P++,P>1&&console.error("[React bindings] Capytale iframe React: Multiple settings registered: ",P),()=>{P--}),[]),v.useEffect(()=>(w.use(["meta-player-ui"],([s])=>{if(s.version===0){console.error("[React bindings] Le MétaPlayer ne supporte pas le contrat meta-player-ui");return}s.i?.setSettingsUI(i)}),o(e),()=>{o(null)}),[i])},ut=()=>v.useCallback(e=>w.exec(["meta-player-ui"],([n])=>{if(n.version===0)throw console.error("[React bindings] Le MétaPlayer ne supporte pas le contrat meta-player-ui"),new Error("Le MétaPlayer ne supporte pas le contrat meta-player-ui");return n.i?.showToast(e)}),[]),dt=()=>v.useCallback(e=>w.exec(["meta-player-ui"],([n])=>{if(n.version===0)throw console.error("[React bindings] Le MétaPlayer ne supporte pas le contrat meta-player-ui"),new Error("Le MétaPlayer ne supporte pas le contrat meta-player-ui");return n.i?.clearToast(e)}),[]),ve=()=>v.useCallback(()=>w.exec(["meta-player-ui"],([e])=>{if(e.version===0)throw console.error("[React bindings] Le MétaPlayer ne supporte pas le contrat meta-player-ui"),new Error("Le MétaPlayer ne supporte pas le contrat meta-player-ui");return e.i?.clearToasts()}),[]),ft=(t,e)=>{const n=ut(),i=dt();return v.useEffect(()=>{if(t==null)return;const o=n(t);return()=>{o.then(s=>{s!=null&&i(s)})}},[n,i,...e]),null},ye=()=>v.useCallback(()=>w.exec(["trigger-save"],([e])=>{if(e.version===0)throw console.error("[React bindings] Le MétaPlayer ne supporte pas le contrat trigger-save"),new Error("Le MétaPlayer ne supporte pas le contrat trigger-save");return e.i?.triggerSave()}),[]),Se=()=>r(t=>t.canSave),Ae=(t,e)=>{const n=r(i=>i.setLlmGetFirstMessageContextFunction);v.useEffect(()=>(n(t),()=>{n(null)}),[e,n])},we=(t,e)=>{const n=r(i=>i.setLlmGetAllMessagesContextFunction);v.useEffect(()=>(n(t),()=>{n(null)}),[e,n])},be=(t,e,n,i)=>{const o=r(l=>l.setLlmGetAvailableToolsFunction),s=r(l=>l.setLlmCallToolFunction),u=r(l=>l.setLlmDescribeToolFunction);v.useEffect(()=>(o(t),s(e),u(n),()=>{o(null),s(null),u(null)}),[i,o,s,u])};function he(t){const e={};for(const n of t.fields)e[n.name]=n.defaultValue;return e}function Fe(t){return{[t.name]:t.defaultValues}}function Ee(t){return{[t.name]:t.defaultValue}}function Je(t){switch(t.type){case"form":return he(t);case"checkboxes":case"switches":return Fe(t);case"radio":return Ee(t);default:return{}}}function Te(t){const e={};for(const n of t)Object.assign(e,Je(n));return e}function Re(t){const n=lt()(i=>({...Te(t)}));return n.activitySettings=t,n}function ke(t){ct(()=>t.activitySettings,e=>{t.setState(e)},[])}function xe({store:t}){return ke(t),null}const Le=["meta-player-events:1","meta-player-ui:1","mode:1","workflow:1"];function Me({children:t,contracts:e,loadOnlyWhenReady:n=!0,activitySettingsStore:i}){const o=r(s=>s.ready);return v.useEffect(()=>{const s=[...e];for(const u of Le)s.includes(u)||s.push(u);qt(s)},[]),n&&!o?L.jsx("div",{className:"capy-loading-container",children:"Chargement en cours..."}):L.jsxs(L.Fragment,{children:[i&&L.jsx(xe,{store:i}),t]})}function Ge({message:t}){return ft(t,[t]),null}exports.Capytale=Me;exports.TemporaryToast=Ge;exports.createActivitySettingsStore=Re;exports.useAfterSaveAction=fe;exports.useCanSave=Se;exports.useClearToast=dt;exports.useClearToasts=ve;exports.useGetLoadedJsonActivityContent=ne;exports.useGetLoadedJsonActivitySplitContent=re;exports.useGetLoadedJsonAssignmentContent=oe;exports.useGetLoadedJsonAssignmentSplitContent=se;exports.useGetLoadedJsonContent=ee;exports.useGetLoadedTextContent=te;exports.useJsonActivityContentSaveFunction=le;exports.useJsonActivitySplitContentSaveFunction=ue;exports.useJsonAssignmentContentSaveFunction=ce;exports.useJsonAssignmentSplitContentSaveFunction=de;exports.useJsonContentSaveFunction=ae;exports.useLLMAllMessagesContext=we;exports.useLLMFirstMessageContext=Ae;exports.useLLMTools=be;exports.useLoadedJsonActivityBinaryData=Xt;exports.useLoadedJsonActivityContent=Yt;exports.useLoadedJsonAssignmentBinaryData=Zt;exports.useLoadedJsonAssignmentContent=Kt;exports.useLoadedJsonContent=Ut;exports.useLoadedTextContent=_t;exports.useMode=Bt;exports.useNotifyIsDirty=Qt;exports.usePreviewImageFile=me;exports.usePreviewTextFile=ge;exports.useQuickActions=pe;exports.useRequestSave=zt;exports.useSettings=ct;exports.useShowToast=ut;exports.useSidebarActions=Ce;exports.useTextContentSaveFunction=ie;exports.useTheme=Ht;exports.useToast=ft;exports.useTriggerSave=ye;exports.useWorkflow=Wt;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const L=require("react/jsx-runtime"),C=require("react");const X=Symbol("Comlink.proxy"),mt=Symbol("Comlink.endpoint"),vt=Symbol("Comlink.releaseProxy"),N=Symbol("Comlink.finalizer"),V=Symbol("Comlink.thrown"),Z=t=>typeof t=="object"&&t!==null||typeof t=="function",pt={canHandle:t=>Z(t)&&t[X],serialize(t){const{port1:e,port2:n}=new MessageChannel;return z(t,e),[n,[n]]},deserialize(t){return t.start(),nt(t)}},Ct={canHandle:t=>Z(t)&&V in t,serialize({value:t}){let e;return t instanceof Error?e={isError:!0,value:{message:t.message,name:t.name,stack:t.stack}}:e={isError:!1,value:t},[e,[]]},deserialize(t){throw t.isError?Object.assign(new Error(t.value.message),t.value):t.value}},tt=new Map([["proxy",pt],["throw",Ct]]);function yt(t,e){for(const n of t)if(e===n||n==="*"||n instanceof RegExp&&n.test(e))return!0;return!1}function z(t,e=globalThis,n=["*"]){e.addEventListener("message",function r(o){if(!o||!o.data)return;if(!yt(n,o.origin)){console.warn(`Invalid origin '${o.origin}' for comlink proxy`);return}const{id:i,type:u,path:l}=Object.assign({path:[]},o.data),g=(o.data.argumentList||[]).map(J);let f;try{const d=l.slice(0,-1).reduce((p,S)=>p[S],t),m=l.reduce((p,S)=>p[S],t);switch(u){case"GET":f=m;break;case"SET":d[l.slice(-1)[0]]=J(o.data.value),f=!0;break;case"APPLY":f=m.apply(d,g);break;case"CONSTRUCT":{const p=new m(...g);f=st(p)}break;case"ENDPOINT":{const{port1:p,port2:S}=new MessageChannel;z(t,S),f=ht(p,[p])}break;case"RELEASE":f=void 0;break;default:return}}catch(d){f={value:d,[V]:0}}Promise.resolve(f).catch(d=>({value:d,[V]:0})).then(d=>{const[m,p]=O(d);e.postMessage(Object.assign(Object.assign({},m),{id:i}),p),u==="RELEASE"&&(e.removeEventListener("message",r),et(e),N in t&&typeof t[N]=="function"&&t[N]())}).catch(d=>{const[m,p]=O({value:new TypeError("Unserializable return value"),[V]:0});e.postMessage(Object.assign(Object.assign({},m),{id:i}),p)})}),e.start&&e.start()}function St(t){return t.constructor.name==="MessagePort"}function et(t){St(t)&&t.close()}function nt(t,e){const n=new Map;return t.addEventListener("message",function(o){const{data:i}=o;if(!i||!i.id)return;const u=n.get(i.id);if(u)try{u(i)}finally{n.delete(i.id)}}),H(t,n,[],e)}function M(t){if(t)throw new Error("Proxy has been released and is not useable")}function ot(t){return k(t,new Map,{type:"RELEASE"}).then(()=>{et(t)})}const j=new WeakMap,I="FinalizationRegistry"in globalThis&&new FinalizationRegistry(t=>{const e=(j.get(t)||0)-1;j.set(t,e),e===0&&ot(t)});function wt(t,e){const n=(j.get(e)||0)+1;j.set(e,n),I&&I.register(t,e,t)}function At(t){I&&I.unregister(t)}function H(t,e,n=[],r=function(){}){let o=!1;const i=new Proxy(r,{get(u,l){if(M(o),l===vt)return()=>{At(i),ot(t),e.clear(),o=!0};if(l==="then"){if(n.length===0)return{then:()=>i};const g=k(t,e,{type:"GET",path:n.map(f=>f.toString())}).then(J);return g.then.bind(g)}return H(t,e,[...n,l])},set(u,l,g){M(o);const[f,d]=O(g);return k(t,e,{type:"SET",path:[...n,l].map(m=>m.toString()),value:f},d).then(J)},apply(u,l,g){M(o);const f=n[n.length-1];if(f===mt)return k(t,e,{type:"ENDPOINT"}).then(J);if(f==="bind")return H(t,e,n.slice(0,-1));const[d,m]=Q(g);return k(t,e,{type:"APPLY",path:n.map(p=>p.toString()),argumentList:d},m).then(J)},construct(u,l){M(o);const[g,f]=Q(l);return k(t,e,{type:"CONSTRUCT",path:n.map(d=>d.toString()),argumentList:g},f).then(J)}});return wt(i,t),i}function bt(t){return Array.prototype.concat.apply([],t)}function Q(t){const e=t.map(O);return[e.map(n=>n[0]),bt(e.map(n=>n[1]))]}const rt=new WeakMap;function ht(t,e){return rt.set(t,e),t}function st(t){return Object.assign(t,{[X]:!0})}function Ft(t,e=globalThis,n="*"){return{postMessage:(r,o)=>t.postMessage(r,n,o),addEventListener:e.addEventListener.bind(e),removeEventListener:e.removeEventListener.bind(e)}}function O(t){for(const[e,n]of tt)if(n.canHandle(t)){const[r,o]=n.serialize(t);return[{type:"HANDLER",name:e,value:r},o]}return[{type:"RAW",value:t},rt.get(t)||[]]}function J(t){switch(t.type){case"HANDLER":return tt.get(t.name).deserialize(t.value);case"RAW":return t.value}}function k(t,e,n,r){return new Promise(o=>{const i=Et();e.set(i,o),t.start&&t.start(),t.postMessage(Object.assign({id:i},n),r)})}function Et(){return new Array(4).fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-")}function Jt(t,e){return t.length===0?e:`[${t}] ${e}`}function Tt(t,e){let n=!1,r,o,i;function u(d){return Jt(t,d)}let l,g=!1;if(window.parent===window)console.warn(u("Contract link is not supported in standalone mode")),l={ready(){return Promise.resolve()},declare(){return Promise.resolve()},done(){return Promise.resolve()},provide(d,m,p){return Promise.resolve()}};else{const d=Ft(window.parent,void 0,e);z({declare(m){if(r==null)throw new Error(u("No handler for declare"));r(m)},done(){if(o==null)throw new Error(u("No handler for done"));o()},provide(m,p,S){if(i==null)throw new Error(u("No handler for provide"));i(m,p,S)}},d),l=nt(d),g=!0}const f=()=>{if(!n){if(r==null||o==null||i==null)return;n=!0,l.ready()}};return{declare:d=>l.declare(d),done:()=>l.done(),provide:(d,m,p)=>l.provide(d,m,st(p)),get name(){return t},get isReady(){return g},set onDeclare(d){r=d,f()},set onDone(d){o=d,f()},set onProvide(d){i=d,f()}}}function Rt(t){return function(e){let n,r=!1,o=!1,i,u,l=!1,g=!1,f,d,m,p;function S(){if(i!=null&&i!==0&&u!=null)return u}function F(a){if(i!=null&&u!=null&&!(a>i))return u}function b(){return m??(g?m=Promise.resolve():m=new Promise((a,c)=>{p=a}))}function T(){return f===void 0&&(f={get name(){return e},get version(){return i},get i(){return S()},v:a=>F(a)}),f}function x(){return d===void 0&&(d={get name(){return e},get version(){return g?i:void 0},get i(){return g?S():void 0},v:a=>g?F(a):void 0,get promise(){return i===0?Promise.reject(t("Remote interface not provided")):b().then(()=>{if(i===0)throw new Error(t("Remote interface not provided"));return T()})}}),d}function E(){p!=null&&(p(),p=void 0)}return{get name(){return e},get localVersion(){if(n!=null)return n},set localVersion(a){if(n!=null&&n!==a)throw new Error(t("A different local version is already set"));n=a},get localVersionSent(){return r},set localVersionSent(a){if(!a&&r)throw new Error(t("Local version already notified"));r=a,a&&n===0&&(o=!0)},get localInterfaceSent(){return o},set localInterfaceSent(a){if(n==null)throw new Error(t("Local version not set"));if(!a&&o)throw new Error(t("Local interface already sent."));o=a},get remoteVersion(){if(i!=null)return i},set remoteVersion(a){if(i!=null&&i!==a)throw new Error(t("A different remote version is already set for "+e+`(${i} -> ${a})`));i=a,a===0&&(l=!0)},get remoteVersionReceived(){return i!=null},setRemoteInterface:a=>{if(i==null)throw new Error(t("Remote version not set"));if(i===0){console.warn(t("Remote version is 0, remote interface is ignored."));return}if(l)throw new Error(t("Interface already provided."));u=a,l=!0},get remoteInterfaceReceived(){return l},depGroup:void 0,get isActivable(){return l&&o},get isActivated(){return g},activate(){if(!g){if(!l)throw new Error(t("Remote interface not provided."));if(!o)throw new Error(t("Local interface not sent"));g=!0,E()}},getRemote:()=>T(),getLazyRemote:()=>x(),get activationPromise(){return b()}}}}function kt(t){return function(e,n,r,o){let i=r,u=!1,l=!1;function g(){return e.every(f=>f.remoteVersionReceived&&f.localVersionSent)&&n.every(f=>f.remoteVersionReceived)}return{get isDeclared(){return l},set isDeclared(f){if(!f&&l)throw new Error(t("Factory already declared"));l=f},get isReady(){return g()},get isDone(){return u},get args(){return e},get deps(){return n},invoke(){if(u)throw new Error(t("Factory already invoked"));if(!g())throw new Error(t("Factory is not ready"));let f;o?f=e.map(p=>p.getRemote()):f=e[0].getRemote();let d;const m=n.length>0?n.map(p=>p.getRemote()):null;try{d=m==null?i(f):i(f,m)}catch(p){throw new Error(t("error in factory:"),{cause:p})}if(o||(d=[d]),d.length!=e.length)throw new Error(t("Invalid factory result"));return u=!0,i=null,d}}}}function xt(t){return function(e,n,r,o){let i=n,u=!1;function l(){return e.every(g=>g.isActivated)}return{get isReady(){return l()},get isDone(){return u},get args(){return e},invoke(){if(u||!l()){const d=new Error(t(u?"callback already invoked":"callback parameters are not ready"));throw o?.[1](d),d}const g=r?e.map(d=>d.getRemote()):e[0].getRemote();let f;try{f=i(g)}catch(d){o==null?console.error(t("error in callback:"),d):o[1](d)}finally{u=!0}o?.[0](f)}}}}function it(t,e){return t==null||t.length===0?e:`[${t}] ${e}`}function Lt(t){function e(a){return it(t.name,a)}const n=xt(e),r=Rt(e),o=kt(e),i={},u=[];let l=[],g;const f=()=>(g==null?g=0:g++,g);function d(a){let c=i[a];return c==null&&(c=r(a),c.localVersion==null&&(b&&(c.localVersion=0),T&&(c.localVersionSent=!0)),c.remoteVersion==null&&x&&(c.remoteVersion=0),i[a]=c),c}function m(a){return a.map(d)}function p(...a){const c=f(),v=Array(c).fill(!1);a.forEach(y=>{y.forEach(w=>{w.depGroup!=null&&(v[w.depGroup]=!0),w.depGroup=c})}),Object.values(i).forEach(y=>{y.depGroup!=null&&y.depGroup!==c&&v[y.depGroup]&&(y.depGroup=c)})}t.onDeclare=a=>{const c=m(a.map(v=>v.name));for(let v=0;v<a.length;v++)a[v].version!=null&&(c[v].remoteVersion=a[v].version);p(c),E()},t.onDone=()=>{x||(x=!0,Object.values(i).forEach(a=>{a.remoteVersion==null&&(a.remoteVersion=0)}),E())},t.onProvide=(a,c,v)=>{let y=i[a];if(y==null)throw new Error(e(`Contract not declared : ${a}`));if(y.remoteVersion!=c)throw new Error(e(`Remote declared version ${y.remoteVersion} of contract "${a}" but provided version ${c}.`));if(y.remoteInterfaceReceived)throw new Error(e(`Remote contract "${a}" is already provided.`));y.setRemoteInterface(v),E()};let S=!1,F=!1,b=!1,T=!1,x=!1;async function E(){if(F=!0,!S){for(S=!0;F;){if(F=!1,t.isReady){const a=u.filter(c=>!c.isDeclared);if(a.length>0)for(const c of a){const v=Array(c.args.length+c.deps.length);c.args.forEach((y,w)=>v[w]=y),c.deps.forEach((y,w)=>v[w+c.args.length]=y),await t.declare(v.map(y=>({name:y.name,version:y.localVersion}))),v.forEach(y=>{y.localVersion!=null&&(y.localVersionSent=!0)}),c.isDeclared=!0}}if(t.isReady&&b&&u.every(a=>a.isDeclared)){const a=Object.values(i).filter(c=>!c.localVersionSent&&c.localVersion!=null);if(a.length>0)for(const c of a)await t.declare([{name:c.name,version:c.localVersion}]),c.localVersionSent=!0;T||(T=!0,await t.done())}if(t.isReady){const a=u.filter(c=>!c.isDone&&c.isReady);if(a.length>0)for(const c of a){const v=c.invoke();for(let y=0;y<c.args.length;y++){const w=c.args[y];await t.provide(w.name,w.localVersion,v[y]),w.localInterfaceSent=!0}}}if(g!=null){const a=Array(g+1).fill(null);for(const c in i){const v=i[c];v.depGroup!=null&&(v.isActivable?a[v.depGroup]==null&&!v.isActivated&&(a[v.depGroup]=!0):a[v.depGroup]=!1)}if(a.some(c=>c===!0))for(const c in i){const v=i[c];v.depGroup!=null&&a[v.depGroup]&&v.activate()}}if(t.isReady){const a=l;l=[];const c=[];for(const v of a)!v.isDone&&v.isReady?v.invoke():c.push(v);c.push(...l),l=c}}S=!1}}return{get(a){return d(a)},declareFactory:(a,c,v,y)=>{if(b)throw new Error(e("Cannot declare a factory after done has been set to true."));const w=m(a.map(h=>h.name));{const h=w.filter($=>$.localVersion!=null);if(h.length>0)throw new Error(e("Cannot declare a factory for already implemented contracts : "+h.map($=>$.name).join(", ")))}for(let h=0;h<a.length;h++)w[h].localVersion=a[h].version;const R=m(c);p(w,R);const gt=o(w,R,v,y);u.push(gt),E()},declareCallback(a,c,v,y){const w=m(a),R=n(w,c,v,y);!S&&l.length===0&&R.isReady?R.invoke():(l.push(R),E())},get done(){return b},set done(a){if(b){if(!a)throw new Error(e("Cannot set done to false after it has been set to true."))}else a&&(b=!0,Object.values(i).forEach(c=>{c.localVersion==null&&(c.localVersion=0)}),E())}}}const Mt=/^\d+$/;function Pt(t){const[e,n,r]=t.split(":",3);if(n==null||r!=null||!Mt.test(n))return null;const o=parseInt(n);return isNaN(o)||o===0?null:{name:e,version:o}}function Gt(t){const e=Lt(t);function n(r){return it(t.name,r)}return{plug(r,o,i=void 0){if(e.done)throw new Error(n("Cannot plug after plugsDone."));i==null&&(i=o,o=[]);let u=!0;Array.isArray(r)||(r=[r],u=!1);const l=r.map(g=>{const f=Pt(g);if(f==null)throw new Error(n("Invalid contract id : "+g));return f});e.declareFactory(l,o,i,u)},plugsDone(){e.done=!0},use(r,o){let i=!0;Array.isArray(r)||(r=[r],i=!1),e.declareCallback(r,o,i)},exec(r,o){let i=!0;return Array.isArray(r)||(r=[r],i=!1),new Promise((...u)=>{e.declareCallback(r,o,i,u)})},get(r){return r.map(o=>e.get(o).getLazyRemote())}}}const at="app-agent";let q;function Dt(t){return q!=null||(q=Gt(Tt(at,t))),q}console.log(`[${at}@1.0.12] loaded`);const _=t=>{let e;const n=new Set,r=(f,d)=>{const m=typeof f=="function"?f(e):f;if(!Object.is(m,e)){const p=e;e=d??(typeof m!="object"||m===null)?m:Object.assign({},e,m),n.forEach(S=>S(e,p))}},o=()=>e,l={setState:r,getState:o,getInitialState:()=>g,subscribe:f=>(n.add(f),()=>n.delete(f))},g=e=t(r,o,l);return l},Vt=(t=>t?_(t):_),jt=t=>t;function It(t,e=jt){const n=C.useSyncExternalStore(t.subscribe,C.useCallback(()=>e(t.getState()),[t,e]),C.useCallback(()=>e(t.getInitialState()),[t,e]));return C.useDebugValue(n),n}const U=t=>{const e=Vt(t),n=r=>It(e,r);return Object.assign(n,e),n},lt=(t=>t?U(t):U),Ot=t=>(e,n,r)=>{const o=r.subscribe;return r.subscribe=((u,l,g)=>{let f=u;if(l){const d=g?.equalityFn||Object.is;let m=u(r.getState());f=p=>{const S=u(p);if(!d(m,S)){const F=m;l(m=S,F)}},g?.fireImmediately&&l(m,m)}return o(f)}),t(e,n,r)},$t=Ot,s=lt()($t(t=>({ready:!1,workflow:"current",mode:"assignment",theme:"light",saveCount:0,canSave:!1,afterSaveCount:0,isDirtyCount:0,loadedTextContent:null,loadedJsonContent:null,loadedJsonActivityContent:null,loadedJsonAssignmentContent:null,loadedJsonActivityBinaryData:null,loadedJsonAssignmentBinaryData:null,getTextContentFunction:()=>{throw console.error("[React bindings] getTextContentFunction is not set"),new Error("[React bindings] getTextContentFunction is not set")},getJsonContentFunction:()=>{throw console.error("[React bindings] getJsonContentFunction is not set"),new Error("[React bindings] getJsonContentFunction is not set")},getJsonActivityContentFunction:()=>{throw console.error("[React bindings] getJsonActivityContentFunction is not set"),new Error("[React bindings] getJsonActivityContentFunction is not set")},getJsonAssignmentContentFunction:()=>{throw console.error("[React bindings] getJsonAssignmentContentFunction is not set"),new Error("[React bindings] getJsonAssignmentContentFunction is not set")},getJsonActivitySplitContentFunction:()=>{throw console.error("[React bindings] getJsonActivitySplitContentFunction is not set"),new Error("[React bindings] getJsonActivitySplitContentFunction is not set")},getJsonAssignmentSplitContentFunction:()=>{throw console.error("[React bindings] getJsonAssignmentSplitContentFunction is not set"),new Error("[React bindings] getJsonAssignmentSplitContentFunction is not set")},sidebarActions:{},quickActions:{},activitySettingsCallback:null,llmGetFirstMessageContextFunction:null,setLlmGetFirstMessageContextFunction:e=>{t({llmGetFirstMessageContextFunction:e})},llmGetAllMessagesContextFunction:null,setLlmGetAllMessagesContextFunction:e=>{t({llmGetAllMessagesContextFunction:e})},llmGetAvailableToolsFunction:null,setLlmGetAvailableToolsFunction:e=>{t({llmGetAvailableToolsFunction:e})},llmCallToolFunction:null,setLlmCallToolFunction:e=>{t({llmCallToolFunction:e})},setGetTextContentFunction:e=>{t({getTextContentFunction:e})},llmDescribeToolFunction:null,setLlmDescribeToolFunction:e=>{t({llmDescribeToolFunction:e})},setGetJsonContentFunction:e=>{t({getJsonContentFunction:e})},setGetJsonActivityContentFunction:e=>{t({getJsonActivityContentFunction:e})},setGetJsonAssignmentContentFunction:e=>{t({getJsonAssignmentContentFunction:e})},setGetJsonActivitySplitContentFunction:e=>{t({getJsonActivitySplitContentFunction:e})},setGetJsonAssignmentSplitContentFunction:e=>{t({getJsonAssignmentSplitContentFunction:e})},setSidebarActions:e=>{t({sidebarActions:e})},setQuickActions:e=>{t({quickActions:e})},setActivitySettingsCallback:e=>{t({activitySettingsCallback:e})},incSaveCount:()=>t(e=>({saveCount:e.saveCount+1})),incDirtyCount:()=>t(e=>({isDirtyCount:e.isDirtyCount+1})),previewStartPreviewFunction:null,previewStopPreviewFunction:null,setPreviewStartPreviewFunction:e=>{t({previewStartPreviewFunction:e})},setPreviewStopPreviewFunction:e=>{t({previewStopPreviewFunction:e})}})));let Y=!1;const Nt=["meta-player-events:1","meta-player-ui:1","mode:1","reload:1","theme:1","workflow:1","trigger-save:1","simple-content(text):1","simple-content(json):1","simple-binary-data(text):1","simple-content-eval(text):1","simple-content-eval(json):1","separate-contents(json):1","separate-dual-contents(json):1","llm:1"],K={"mode:1":{setMode:t=>{s.setState({mode:t})}},"reload:1":{reloaded:t=>{console.log("[React bindings] Reloaded with state:",t),console.error("[React bindings] Not implemented yet")}},"theme:1":{setTheme:t=>{if(t===null){s.setState({theme:null});return}if(t!=="light"&&t!=="dark"){console.warn(`[React bindings] Invalid theme: ${t}. Expected 'light' or 'dark'.`),s.setState({theme:null});return}s.setState({theme:t})}},"workflow:1":{setWorkflow:t=>{s.setState({workflow:t})}},"workflow:2":{setWorkflow:t=>{s.setState({workflow:t})}},"trigger-save:1":{setCanSave(t){s.setState({canSave:t})}},"simple-content(text):1":{contentSaved:()=>{s.setState(t=>({afterSaveCount:t.afterSaveCount+1}))},getContent:()=>s.getState().getTextContentFunction(),loadContent:t=>{s.setState({loadedTextContent:t})}},"simple-content(json):1":{contentSaved:()=>{s.setState(t=>({afterSaveCount:t.afterSaveCount+1}))},getContent:()=>s.getState().getJsonContentFunction(),loadContent:t=>{s.setState({loadedJsonContent:t})}},"simple-binary-data(text):1":{contentSaved:()=>{s.setState(t=>({afterSaveCount:t.afterSaveCount+1}))},getContent:()=>s.getState().getTextContentFunction(),loadContent:t=>{s.setState({loadedTextContent:t})}},"simple-content-eval(text):1":{contentSaved:()=>{s.setState(t=>({afterSaveCount:t.afterSaveCount+1}))},getContent:()=>s.getState().getTextContentFunction(),loadContent:t=>{s.setState({loadedTextContent:t})},getAssignmentContent:()=>{throw new Error("getAssignmentContent is not implemented for simple-content-eval(text)")}},"simple-content-eval(json):1":{contentSaved:()=>{s.setState(t=>({afterSaveCount:t.afterSaveCount+1}))},getContent:()=>s.getState().getJsonContentFunction(),loadContent:t=>{s.setState({loadedJsonContent:t})},getAssignmentContent:()=>{throw new Error("getAssignmentContent is not implemented for simple-content-eval(json)")}},"simple-content-eval(json):2":{contentSaved:()=>{s.setState(t=>({afterSaveCount:t.afterSaveCount+1}))},getContent:()=>s.getState().getJsonContentFunction(),loadContent:t=>{s.setState({loadedJsonContent:t})},getAssignmentContent:()=>{throw new Error("getAssignmentContent is not implemented for simple-content-eval(json)")}},"simple-content-eval(text):2":{contentSaved:()=>{s.setState(t=>({afterSaveCount:t.afterSaveCount+1}))},getContent:()=>s.getState().getTextContentFunction(),loadContent:t=>{s.setState({loadedTextContent:t})},getAssignmentContent:()=>{throw new Error("getAssignmentContent is not implemented for simple-content-eval(text)")}},"separate-contents(json):1":{contentSaved:()=>{s.setState(t=>({afterSaveCount:t.afterSaveCount+1}))},loadContent:(t,e)=>{s.setState({loadedJsonActivityContent:t,loadedJsonAssignmentContent:e})},getActivityContent:()=>s.getState().getJsonActivityContentFunction(),getAssignmentContent:()=>s.getState().getJsonAssignmentContentFunction()},"separate-contents-eval(json):1":{contentSaved:()=>{s.setState(t=>({afterSaveCount:t.afterSaveCount+1}))},loadContent:(t,e)=>{s.setState({loadedJsonActivityContent:t,loadedJsonAssignmentContent:e})},getActivityContent:()=>s.getState().getJsonActivityContentFunction(),getAssignmentContent:()=>s.getState().getJsonAssignmentContentFunction()},"separate-contents-eval(json):2":{contentSaved:()=>{s.setState(t=>({afterSaveCount:t.afterSaveCount+1}))},loadContent:(t,e)=>{s.setState({loadedJsonActivityContent:t,loadedJsonAssignmentContent:e})},getActivityContent:()=>s.getState().getJsonActivityContentFunction(),getAssignmentContent:()=>s.getState().getJsonAssignmentContentFunction()},"separate-dual-contents(json):1":{contentSaved:()=>{s.setState(t=>({afterSaveCount:t.afterSaveCount+1}))},loadContent:({activityContent:t,assignmentContent:e,activityBinaryData:n,assignmentBinaryData:r})=>{s.setState({loadedJsonActivityContent:t,loadedJsonAssignmentContent:e,loadedJsonActivityBinaryData:n,loadedJsonAssignmentBinaryData:r})},getActivityContentAndData:()=>s.getState().getJsonActivitySplitContentFunction(),getAssignmentContentAndData:()=>s.getState().getJsonAssignmentSplitContentFunction()},"anti-cheat:1":{lock:()=>{},unlock:()=>{}},"meta-player-ui:1":{executeAction(t){if(t.startsWith("qa")){const n=s.getState().quickActions[t];n?n():console.error(`[React bindings] Quick action not found: ${t}`)}else{const n=s.getState().sidebarActions[t];n?n():console.error(`[React bindings] Sidebar action not found: ${t}`)}},executeFileUpload(t,e){if(t.startsWith("qa")){const r=s.getState().quickActions[t];r?r(e):console.error(`[React bindings] Quick action not found: ${t}`)}else{const r=s.getState().sidebarActions[t];r?r(e):console.error(`[React bindings] Sidebar action not found: ${t}`)}},updateSettings(t){const e=s.getState().activitySettingsCallback;e?e(t):console.warn("activitySettingsCallback is not set. Changes:",t)}},"meta-player-events:1":{handleEvent(t){t==="all-loaded"&&s.setState({ready:!0})}},"llm:1":{getFirstMessageContext:t=>{const e=s.getState().llmGetFirstMessageContextFunction;return e?e(t):""},getAllMessagesContext:t=>{const e=s.getState().llmGetAllMessagesContextFunction;return e?e(t):""},getAvailableTools:t=>{const e=s.getState().llmGetAvailableToolsFunction;return e?e(t):[]},callTool:(t,e,n)=>{const r=s.getState().llmCallToolFunction;if(!r)throw new Error("LLM call tool function is not set");return r(t,e,n)},getToolCallDescription:(t,e,n)=>{const r=s.getState().llmDescribeToolFunction;if(!r)throw new Error("LLM describe tool function is not set");return r(t,e,n)}},"preview:1":{startPreview:()=>{const t=s.getState().previewStartPreviewFunction;return t?t():!1},stopPreview:()=>{const t=s.getState().previewStopPreviewFunction;if(!t)throw new Error("Preview stop function is not set");return t()}}},A=Dt();function qt(t){if(!Y){Y=!0;for(const e of t){if(!Nt.includes(e))continue;if(!(e in K)){console.warn(`[React bindings] Contract handler for ${e} is not defined. Skipping plug.`);continue}const n=K[e];A.plug([e],([])=>[n])}A.plugsDone();for(const e of["simple-content(text):1","simple-content(json):1","simple-binary-data(text):1","simple-content-eval(text):1","simple-content-eval(json):1","simple-content-eval(json):2","simple-content-eval(text):2","separate-contents(json):1","separate-dual-contents(json):1"])if(t.includes(e)){const n=e.split(":")[0];A.use([n],([r])=>{s.subscribe(o=>o.isDirtyCount,()=>{r.i?.contentChanged()})})}}}const Bt=()=>s(t=>{if(t.mode===null)throw new Error("Mode is not set. Have you used contract 'mode'?");return t.mode}),Wt=()=>s(t=>{if(t.workflow===null)throw new Error("Workflow is not set. Have you used contract 'workflow'?");return t.workflow}),Ht=()=>s(t=>{if(t.theme===null)throw new Error("Theme is not set. Have you used contract 'theme'?");return t.theme}),zt=()=>s(t=>t.incSaveCount),Qt=()=>s(t=>t.incDirtyCount),_t=()=>s(t=>t.loadedTextContent),Ut=()=>s(t=>t.loadedJsonContent),Yt=()=>s(t=>t.loadedJsonActivityContent),Kt=()=>s(t=>t.loadedJsonAssignmentContent),Xt=()=>s(t=>t.loadedJsonActivityBinaryData),Zt=()=>s(t=>t.loadedJsonAssignmentBinaryData),te=()=>C.useCallback(()=>s.getState().loadedTextContent,[]),ee=()=>C.useCallback(()=>s.getState().loadedJsonContent,[]),ne=()=>C.useCallback(()=>s.getState().loadedJsonActivityContent,[]),oe=()=>C.useCallback(()=>s.getState().loadedJsonAssignmentContent,[]),re=()=>C.useCallback(()=>({content:s.getState().loadedJsonActivityContent,binaryData:s.getState().loadedJsonActivityBinaryData}),[]),se=()=>C.useCallback(()=>({content:s.getState().loadedJsonAssignmentContent,binaryData:s.getState().loadedJsonAssignmentBinaryData}),[]),ie=t=>{const e=s(n=>n.setGetTextContentFunction);C.useEffect(()=>{e(t)},[t,e])},ae=t=>{const e=s(n=>n.setGetJsonContentFunction);C.useEffect(()=>{e(t)},[t,e])},le=t=>{const e=s(n=>n.setGetJsonActivityContentFunction);C.useEffect(()=>{e(t)},[t,e])},ce=t=>{const e=s(n=>n.setGetJsonAssignmentContentFunction);C.useEffect(()=>{e(t)},[t,e])},ue=t=>{const e=s(n=>n.setGetJsonActivitySplitContentFunction);C.useEffect(()=>{e(t)},[t,e])},de=t=>{const e=s(n=>n.setGetJsonAssignmentSplitContentFunction);C.useEffect(()=>{e(t)},[t,e])},fe=t=>{const e=s(n=>n.afterSaveCount);C.useEffect(()=>{e>0&&t()},[e])},ge=()=>(t,e)=>{A.use(["meta-player-ui"],([n])=>{if(n.version===0){console.error("[React bindings] Le MétaPlayer ne supporte pas le contrat meta-player-ui");return}n.i?.previewTextFile(t,e)})},me=()=>(t,e)=>{A.use(["meta-player-ui"],([n])=>{if(n.version===0){console.error("[React bindings] Le MétaPlayer ne supporte pas le contrat meta-player-ui");return}n.i?.previewImageFile(t,e)})};let P=0,B=0;const ve=(t,e)=>{const n=C.useMemo(t,e),r=s(o=>o.setSidebarActions);C.useEffect(()=>(P++,P>1&&console.error("[React bindings] Capytale iframe React: Multiple sidebar actions registered: ",P),()=>{P--}),[]),C.useEffect(()=>(A.use(["meta-player-ui"],([o])=>{if(o.version===0){console.error("[React bindings] Le MétaPlayer ne supporte pas le contrat meta-player-ui");return}B++;const i=n.map((l,g)=>({type:l.type,title:l.title,icon:l.icon,id:`sa-${B}-${g}`,...l.type==="file-upload"?{accept:l.accept}:{}})),u={};n.forEach((l,g)=>{u[`sa-${B}-${g}`]=l.action}),o.i?.setSidebarActionButtons(i),r(u)}),()=>{r({}),A.use(["meta-player-ui"],([o])=>{if(o.version===0){console.error("[React bindings] Le MétaPlayer ne supporte pas le contrat meta-player-ui");return}o.i?.setSidebarActionButtons([])})}),[n])};let G=0,W=0;const pe=(t,e)=>{const n=C.useMemo(t,e),r=s(o=>o.setQuickActions);C.useEffect(()=>(G++,G>1&&console.error("[React bindings] Capytale iframe React: Multiple quick actions registered: ",G),()=>{G--}),[]),C.useEffect(()=>(A.use(["meta-player-ui"],([o])=>{if(o.version===0){console.error("[React bindings] Le MétaPlayer ne supporte pas le contrat meta-player-ui");return}W++;const i=n.map((l,g)=>({type:l.type,title:l.title,icon:l.icon,id:`qa-${W}-${g}`,...l.type==="file-upload"?{accept:l.accept}:{}})),u={};n.forEach((l,g)=>{u[`qa-${W}-${g}`]=l.action}),o.i?.setQuickActionButtons(i),r(u)}),()=>{r({}),A.use(["meta-player-ui"],([o])=>{if(o.version===0){console.error("[React bindings] Le MétaPlayer ne supporte pas le contrat meta-player-ui");return}o.i?.setQuickActionButtons([])})}),[n])};let D=0;const ct=(t,e,n)=>{const r=C.useMemo(t,n),o=s(i=>i.setActivitySettingsCallback);C.useEffect(()=>(D++,D>1&&console.error("[React bindings] Capytale iframe React: Multiple settings registered: ",D),()=>{D--}),[]),C.useEffect(()=>(A.use(["meta-player-ui"],([i])=>{if(i.version===0){console.error("[React bindings] Le MétaPlayer ne supporte pas le contrat meta-player-ui");return}i.i?.setSettingsUI(r)}),o(e),()=>{o(null)}),[r])},ut=()=>C.useCallback(e=>A.exec(["meta-player-ui"],([n])=>{if(n.version===0)throw console.error("[React bindings] Le MétaPlayer ne supporte pas le contrat meta-player-ui"),new Error("Le MétaPlayer ne supporte pas le contrat meta-player-ui");return n.i?.showToast(e)}),[]),dt=()=>C.useCallback(e=>A.exec(["meta-player-ui"],([n])=>{if(n.version===0)throw console.error("[React bindings] Le MétaPlayer ne supporte pas le contrat meta-player-ui"),new Error("Le MétaPlayer ne supporte pas le contrat meta-player-ui");return n.i?.clearToast(e)}),[]),Ce=()=>C.useCallback(()=>A.exec(["meta-player-ui"],([e])=>{if(e.version===0)throw console.error("[React bindings] Le MétaPlayer ne supporte pas le contrat meta-player-ui"),new Error("Le MétaPlayer ne supporte pas le contrat meta-player-ui");return e.i?.clearToasts()}),[]),ft=(t,e)=>{const n=ut(),r=dt();return C.useEffect(()=>{if(t==null)return;const o=n(t);return()=>{o.then(i=>{i!=null&&r(i)})}},[n,r,...e]),null},ye=()=>C.useCallback(()=>A.exec(["trigger-save"],([e])=>{if(e.version===0)throw console.error("[React bindings] Le MétaPlayer ne supporte pas le contrat trigger-save"),new Error("Le MétaPlayer ne supporte pas le contrat trigger-save");return e.i?.triggerSave()}),[]),Se=()=>s(t=>t.canSave),we=(t,e)=>{const n=s(r=>r.setLlmGetFirstMessageContextFunction);C.useEffect(()=>(n(t),()=>{n(null)}),[e,n])},Ae=(t,e)=>{const n=s(r=>r.setLlmGetAllMessagesContextFunction);C.useEffect(()=>(n(t),()=>{n(null)}),[e,n])},be=(t,e,n,r)=>{const o=s(l=>l.setLlmGetAvailableToolsFunction),i=s(l=>l.setLlmCallToolFunction),u=s(l=>l.setLlmDescribeToolFunction);C.useEffect(()=>(o(t),i(e),u(n),()=>{o(null),i(null),u(null)}),[r,o,i,u])};function he(t){const e={};for(const n of t.fields)e[n.name]=n.defaultValue;return e}function Fe(t){return{[t.name]:t.defaultValues}}function Ee(t){return{[t.name]:t.defaultValue}}function Je(t){switch(t.type){case"form":return he(t);case"checkboxes":case"switches":return Fe(t);case"radio":return Ee(t);default:return{}}}function Te(t){const e={};for(const n of t)Object.assign(e,Je(n));return e}function Re(t){const n=lt()(r=>({...Te(t)}));return n.activitySettings=t,n}function ke(t){ct(()=>t.activitySettings,e=>{t.setState(e)},[])}function xe({store:t}){return ke(t),null}const Le=["meta-player-events:1","meta-player-ui:1","mode:1","workflow:1"];function Me({children:t,contracts:e,loadOnlyWhenReady:n=!0,activitySettingsStore:r}){const o=s(i=>i.ready);return C.useEffect(()=>{const i=[...e];for(const u of Le)i.includes(u)||i.push(u);qt(i)},[]),n&&!o?L.jsx("div",{className:"capy-loading-container",children:"Chargement en cours..."}):L.jsxs(L.Fragment,{children:[r&&L.jsx(xe,{store:r}),t]})}function Pe({message:t}){return ft(t,[t]),null}exports.Capytale=Me;exports.TemporaryToast=Pe;exports.createActivitySettingsStore=Re;exports.useAfterSaveAction=fe;exports.useCanSave=Se;exports.useClearToast=dt;exports.useClearToasts=Ce;exports.useGetLoadedJsonActivityContent=ne;exports.useGetLoadedJsonActivitySplitContent=re;exports.useGetLoadedJsonAssignmentContent=oe;exports.useGetLoadedJsonAssignmentSplitContent=se;exports.useGetLoadedJsonContent=ee;exports.useGetLoadedTextContent=te;exports.useJsonActivityContentSaveFunction=le;exports.useJsonActivitySplitContentSaveFunction=ue;exports.useJsonAssignmentContentSaveFunction=ce;exports.useJsonAssignmentSplitContentSaveFunction=de;exports.useJsonContentSaveFunction=ae;exports.useLLMAllMessagesContext=Ae;exports.useLLMFirstMessageContext=we;exports.useLLMTools=be;exports.useLoadedJsonActivityBinaryData=Xt;exports.useLoadedJsonActivityContent=Yt;exports.useLoadedJsonAssignmentBinaryData=Zt;exports.useLoadedJsonAssignmentContent=Kt;exports.useLoadedJsonContent=Ut;exports.useLoadedTextContent=_t;exports.useMode=Bt;exports.useNotifyIsDirty=Qt;exports.usePreviewImageFile=me;exports.usePreviewTextFile=ge;exports.useQuickActions=pe;exports.useRequestSave=zt;exports.useSettings=ct;exports.useShowToast=ut;exports.useSidebarActions=ve;exports.useTextContentSaveFunction=ie;exports.useTheme=Ht;exports.useToast=ft;exports.useTriggerSave=ye;exports.useWorkflow=Wt;
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@ import { CapytaleContracts } from '@capytale/contracts';
2
2
  import { JSX as JSX_2 } from 'react/jsx-runtime';
3
3
  import { PropsWithChildren } from 'react';
4
4
  import { StoreApi } from 'zustand';
5
+ import { Types } from '@capytale/contracts';
5
6
 
6
7
  export declare type Action = {
7
8
  type: "action";
@@ -87,35 +88,12 @@ declare type ActivitySettingsTextArea = {
87
88
  defaultValue: string;
88
89
  };
89
90
 
90
- declare type AddId<C, I extends {
91
- name: string;
92
- variant?: string;
93
- }> = I extends {
94
- variant: string;
95
- } ? C & {
96
- name: `${I['name']}(${I['variant']})`;
97
- } : C & {
98
- name: I['name'];
99
- };
100
-
101
- /**
102
- * Un type utilitaire pour ajouter les propriétés d'identifications à un contrat
103
- * ou à un tuple de contrats.
104
- *
105
- * @param C Le type de contrat ou de tuple de contrats.
106
- * @param I Le nom et éventuellement la variante à ajouter.
107
- */
108
- declare type AddIdData<C, I extends {
109
- name: string;
110
- variant?: string;
111
- }> = C extends {}[] ? {
112
- [Index in keyof C]: AddId<C[Index], I>;
113
- } : AddId<C, I>;
114
-
115
91
  declare type AllContractNames = keyof AllContracts;
116
92
 
117
93
  declare type AllContracts = CapytaleContracts & CustomContracts;
118
94
 
95
+ declare type BooleanFunction = () => boolean | Promise<boolean>;
96
+
119
97
  export declare function Capytale<T extends ActivitySettings>({ children, contracts, loadOnlyWhenReady, activitySettingsStore, }: PropsWithChildren<CapytaleProps<T>>): JSX_2.Element;
120
98
 
121
99
  declare type CapytaleProps<T extends ActivitySettings> = {
@@ -124,49 +102,6 @@ declare type CapytaleProps<T extends ActivitySettings> = {
124
102
  activitySettingsStore?: ReturnType<typeof createActivitySettingsStore<T>>;
125
103
  };
126
104
 
127
- declare type ChatCompletionCustomTool = never;
128
-
129
- declare type ChatCompletionFunctionTool = {
130
- function: {
131
- /**
132
- * The name of the function to be called. Must be a-z, A-Z, 0-9, or contain
133
- * underscores and dashes, with a maximum length of 64.
134
- */
135
- name: string;
136
- /**
137
- * A description of what the function does, used by the model to choose when and
138
- * how to call the function.
139
- */
140
- description?: string;
141
- /**
142
- * The parameters the functions accepts, described as a JSON Schema object. See the
143
- * [guide](https://platform.openai.com/docs/guides/function-calling) for examples,
144
- * and the
145
- * [JSON Schema reference](https://json-schema.org/understanding-json-schema/) for
146
- * documentation about the format.
147
- *
148
- * Omitting `parameters` defines a function with an empty parameter list.
149
- */
150
- parameters?: {
151
- [key: string]: unknown;
152
- };
153
- /**
154
- * Whether to enable strict schema adherence when generating the function call. If
155
- * set to true, the model will follow the exact schema defined in the `parameters`
156
- * field. Only a subset of JSON Schema is supported when `strict` is `true`. Learn
157
- * more about Structured Outputs in the
158
- * [function calling guide](https://platform.openai.com/docs/guides/function-calling).
159
- */
160
- strict?: boolean | null;
161
- };
162
- /**
163
- * The type of the tool. Currently, only `function` is supported.
164
- */
165
- type: "function";
166
- };
167
-
168
- declare type ChatCompletionTool = ChatCompletionFunctionTool | ChatCompletionCustomTool;
169
-
170
105
  /**
171
106
  * Un type utilitaire pour indexer un ensemble de contrats par leur identifiant complet.
172
107
  *
@@ -187,12 +122,6 @@ export declare function createActivitySettingsStore<T extends ActivitySettings>(
187
122
  };
188
123
 
189
124
  declare type CustomContracts = CollectionOf<[
190
- AddIdData<MetaPlayerAntiCheatV1, {
191
- name: "meta-player-anti-cheat";
192
- }>,
193
- AddIdData<LLMV1, {
194
- name: "llm";
195
- }>
196
125
  ]>;
197
126
 
198
127
  declare type ForcedContactNames = "meta-player-events:1" | "mode:1" | "workflow:1" | "meta-player-ui:1";
@@ -269,9 +198,9 @@ export declare type InferValue<T> = T extends readonly (infer Section)[] ? Union
269
198
 
270
199
  declare type LLMFunction = ((mode: "create" | "assignment" | "review" | "view") => string) | ((mode: "create" | "assignment" | "review" | "view") => Promise<string>);
271
200
 
272
- declare type LLMToolCallDescriptionFunction = (toolName: string, toolArguments: any) => string | Promise<string>;
201
+ declare type LLMToolCallDescriptionFunction = (toolName: string, toolArguments: any, mode: "create" | "assignment" | "review" | "view") => string | Promise<string>;
273
202
 
274
- declare type LLMToolExecuteFunction = (toolName: string, toolArguments: any) => {
203
+ declare type LLMToolExecuteFunction = (toolName: string, toolArguments: any, mode: "create" | "assignment" | "review" | "view") => {
275
204
  result: any;
276
205
  success: boolean;
277
206
  } | Promise<{
@@ -279,70 +208,7 @@ declare type LLMToolExecuteFunction = (toolName: string, toolArguments: any) =>
279
208
  success: boolean;
280
209
  }>;
281
210
 
282
- declare type LLMToolFunction = ((mode: "create" | "assignment" | "review" | "view") => ChatCompletionTool[]) | ((mode: "create" | "assignment" | "review" | "view") => Promise<ChatCompletionTool[]>);
283
-
284
- declare type LLMV1 = {
285
- version: 1;
286
- /**
287
- * L'interface qui expose le *MetaPlayer* à l'*Application*.
288
- */
289
- metaplayer: {};
290
- /**
291
- * L'interface qui expose l'*Application* au *MetaPlayer*.
292
- */
293
- application: {
294
- /**
295
- * Le *MetaPlayer* appelle cette méthode pour demander à l'*Application* quel contexte donner au premier message
296
- * d'une conversation avec le LLM (avant tout autre contexte).
297
- *
298
- * @param mode le mode en cours.
299
- */
300
- getFirstMessageContext(mode: "create" | "assignment" | "review" | "view"): string;
301
- /**
302
- * Le *MetaPlayer* appelle cette méthode pour demander à l'*Application* quel contexte donner à tous les messages
303
- * d'une conversation avec le LLM (y-compris le premier message).
304
- */
305
- getAllMessagesContext(mode: "create" | "assignment" | "review" | "view"): string;
306
- /**
307
- * Le *MetaPlayer* appelle cette méthode pour demander à l'*Application* quels outils
308
- * sont disponibles pour le LLM.
309
- */
310
- getAvailableTools(mode: "create" | "assignment" | "review" | "view"): ChatCompletionTool[];
311
- /**
312
- * Le *MetaPlayer* appelle cette méthode pour demander à l'*Application* d'exécuter un outil. Doit renvoyer le
313
- * résultat sous forme d'objet (qui doit être sérializable en JSON) ainsi qu'un booléen indiquant si l'opération a
314
- * réussi (uniquement utilisé pour l'interface utilisateur, la communication de l'échec au LLM doit être gérée
315
- * dans le résultat, en accord avec la description de l'outil).
316
- */
317
- callTool(toolName: string, toolArguments: any): {
318
- result: any;
319
- success: boolean;
320
- };
321
- /**
322
- * Le *MetaPlayer* appelle cette méthode pour demander à l'*Application* la description courte d'un appel
323
- * d'outil (à afficher à l'utilisateur dans la fenêtre de chat).
324
- */
325
- getToolCallDescription(toolName: string, toolArguments: any): string;
326
- };
327
- };
328
-
329
- declare type MetaPlayerAntiCheatV1 = {
330
- version: 1;
331
- /**
332
- * L'interface qui expose le *MetaPlayer* à l'*Application*.
333
- */
334
- metaplayer: {
335
- reportGainedFocus(): void;
336
- reportLostFocus(): void;
337
- };
338
- /**
339
- * L'interface qui expose l'*Application* au *MetaPlayer*.
340
- */
341
- application: {
342
- lock(): void;
343
- unlock(): void;
344
- };
345
- };
211
+ declare type LLMToolFunction = ((mode: "create" | "assignment" | "review" | "view") => Types.ChatCompletionTool[]) | ((mode: "create" | "assignment" | "review" | "view") => Promise<Types.ChatCompletionTool[]>);
346
212
 
347
213
  declare type MPToastMessage = {
348
214
  /**
@@ -371,6 +237,8 @@ declare type MPToastMessage = {
371
237
  life?: number;
372
238
  };
373
239
 
240
+ declare type SimpleProcedure = () => void;
241
+
374
242
  export declare function TemporaryToast({ message }: {
375
243
  message: MPToastMessage;
376
244
  }): null;
@@ -441,6 +309,8 @@ export declare const useMode: () => "create" | "assignment" | "review" | "view";
441
309
 
442
310
  export declare const useNotifyIsDirty: () => () => void;
443
311
 
312
+ export declare const usePreview: (startPreview: BooleanFunction, stopPreview: SimpleProcedure, deps: readonly unknown[]) => void;
313
+
444
314
  export declare const usePreviewImageFile: () => (title: string, url: string) => void;
445
315
 
446
316
  export declare const usePreviewTextFile: () => (title: string, content: string) => void;