graview 0.1.34 → 0.1.36
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/preview/{chunk.3C4RJIJU.js → chunk.272ZJXQP.js} +1 -1
- package/dist/preview/{chunk.ETWVQ3A2.js → chunk.27TLAVRR.js} +1 -1
- package/dist/preview/{chunk.34CYK2DF.js → chunk.2A2DLMT3.js} +1 -1
- package/dist/preview/{chunk.FBY5IUGU.js → chunk.2B4WVCVV.js} +1 -1
- package/dist/preview/{chunk.ZE4CTZQ3.js → chunk.3PT55HXT.js} +1 -1
- package/dist/preview/{chunk.YJCT3DV2.js → chunk.3SM2CHKF.js} +1 -1
- package/dist/preview/{chunk.G64AREGA.js → chunk.3ZIOAPI5.js} +1 -1
- package/dist/preview/{chunk.HCDKSDIS.js → chunk.42WJ6VJZ.js} +1 -1
- package/dist/preview/{chunk.RIW7SQH4.js → chunk.4B73P2WA.js} +1 -1
- package/dist/preview/{chunk.CPW465TM.js → chunk.4GXXD4NG.js} +1 -1
- package/dist/preview/chunk.4Q56V7GS.js +1 -0
- package/dist/preview/{chunk.T2L4NPSB.js → chunk.4STIUIT6.js} +1 -1
- package/dist/preview/chunk.53IKY7UP.js +1 -0
- package/dist/preview/chunk.56BPXB6E.js +1 -0
- package/dist/preview/{chunk.7HPPJVIV.js → chunk.5PU3RWYY.js} +2 -2
- package/dist/preview/chunk.64MJ5FRL.js +1 -0
- package/dist/preview/chunk.6II4BONS.js +25 -0
- package/dist/preview/{chunk.VMGWYCXU.js → chunk.6KMXLUOS.js} +1 -1
- package/dist/preview/{chunk.MWJUZG3C.js → chunk.6QDFBCV4.js} +2 -2
- package/dist/preview/{chunk.IHFNLKXV.js → chunk.6W7J76TK.js} +1 -1
- package/dist/preview/{chunk.ZTFW7RKP.js → chunk.6ZZZBDEG.js} +1 -1
- package/dist/preview/{chunk.VOFUIWAX.js → chunk.7CO7S6QM.js} +1 -1
- package/dist/preview/chunk.7G3B5QPH.js +1 -0
- package/dist/preview/chunk.7TBSVQSH.js +1 -0
- package/dist/preview/{chunk.QVKKXMNK.js → chunk.7YQYWOZR.js} +1 -1
- package/dist/preview/{chunk.4K5QCJFH.js → chunk.AAZFVCSP.js} +1 -1
- package/dist/preview/{chunk.ZSW74NVJ.js → chunk.ACEYGWMO.js} +1 -1
- package/dist/preview/{chunk.HJ56Q6WB.js → chunk.ACXA55GW.js} +1 -1
- package/dist/preview/{chunk.PNVR3CXR.js → chunk.BZ5VLPKB.js} +2 -2
- package/dist/preview/chunk.CE3NOADH.js +1 -0
- package/dist/preview/chunk.CNJENUPC.js +1 -0
- package/dist/preview/{chunk.DMNXYMLC.js → chunk.CRPT3ZT3.js} +1 -1
- package/dist/preview/{chunk.XXMYKBLT.js → chunk.CUCNT7MG.js} +1 -1
- package/dist/preview/{chunk.U5ACEYAN.js → chunk.D6RDTUX3.js} +1 -1
- package/dist/preview/{chunk.UHQD3NTK.js → chunk.DANDYIB5.js} +1 -1
- package/dist/preview/{chunk.UCIQIPBQ.js → chunk.DSP62QYK.js} +1 -1
- package/dist/preview/chunk.E77K6KBX.js +1 -0
- package/dist/preview/{chunk.HPD5ZDZH.js → chunk.EBLKEQ7O.js} +1 -1
- package/dist/preview/{chunk.VSOB2QEK.js → chunk.EDSPYKR4.js} +1 -1
- package/dist/preview/chunk.EQIGKXIG.js +1 -0
- package/dist/preview/{chunk.HWITWOP3.js → chunk.ER5ILWKY.js} +2 -2
- package/dist/preview/{chunk.7VUPKOKC.js → chunk.ET76FISZ.js} +1 -1
- package/dist/preview/{chunk.X7W27IRI.js → chunk.F5BCCGFK.js} +5 -5
- package/dist/preview/{chunk.7X2ZO5BD.js → chunk.FERBNBDE.js} +1 -1
- package/dist/preview/{chunk.FUQVNXLB.js → chunk.FQKH67BP.js} +1 -1
- package/dist/preview/{chunk.577PGFUT.js → chunk.FUR4IHWG.js} +1 -1
- package/dist/preview/chunk.FWBQVPMI.js +1 -0
- package/dist/preview/{chunk.FRS3S7DN.js → chunk.GOCUBIRW.js} +1 -1
- package/dist/preview/{chunk.CNMITOKP.js → chunk.GUDKPK42.js} +1 -1
- package/dist/preview/{chunk.QVUL2FSI.js → chunk.GXLAZGYT.js} +1 -1
- package/dist/preview/{chunk.Z7ZCR4LN.js → chunk.GZLYTPE7.js} +1 -1
- package/dist/preview/{chunk.35KI7XYV.js → chunk.H4T56OXM.js} +1 -1
- package/dist/preview/{chunk.JQDYGI6G.js → chunk.HPX3F7XX.js} +1 -1
- package/dist/preview/{chunk.WYEYYCBH.js → chunk.HZPTBPJY.js} +1 -1
- package/dist/preview/{chunk.PW7YH6JV.js → chunk.IB32NOV5.js} +1 -1
- package/dist/preview/{chunk.FSAHO3LV.js → chunk.IMRCAU4T.js} +1 -1
- package/dist/preview/{chunk.6A62UVAE.js → chunk.ITXIFDQ7.js} +1 -1
- package/dist/preview/{chunk.2YCFK5HU.js → chunk.J3TEJBI5.js} +1 -1
- package/dist/preview/{chunk.7WHWD5YJ.js → chunk.JLXQ6ZLI.js} +1 -1
- package/dist/preview/{chunk.6FBQP336.js → chunk.JZMA2AV7.js} +1 -1
- package/dist/preview/{chunk.B6VI576I.js → chunk.K5NJTE3F.js} +1 -1
- package/dist/preview/{chunk.FCRFQ7ZW.js → chunk.KBJG5SI2.js} +1 -1
- package/dist/preview/{chunk.3H4NVUWV.js → chunk.KU6NIMQX.js} +1 -1
- package/dist/preview/{chunk.LAF6GTBN.js → chunk.LA7535VO.js} +1 -1
- package/dist/preview/{chunk.RN3EZVV4.js → chunk.LMVCWYYG.js} +1 -1
- package/dist/preview/{chunk.2YGQVI6T.js → chunk.LNNFNJKN.js} +1 -1
- package/dist/preview/{chunk.RH45AW2W.js → chunk.M4FQ7SSM.js} +1 -1
- package/dist/preview/{chunk.UA5UYINM.js → chunk.MXJS67W4.js} +1 -1
- package/dist/preview/{chunk.LIIC25G6.js → chunk.NJ62C2GU.js} +1 -1
- package/dist/preview/{chunk.VZHV25JE.js → chunk.NNCTJSD3.js} +1 -1
- package/dist/preview/{chunk.LCFDM7XY.js → chunk.NWYOLGQ3.js} +1 -1
- package/dist/preview/{chunk.DNDHDDM6.js → chunk.O3OALXCI.js} +2 -2
- package/dist/preview/{chunk.ZJX6ZKKM.js → chunk.O6ROFVFD.js} +1 -1
- package/dist/preview/{chunk.KSXB4LDF.js → chunk.OF34OZ4V.js} +1 -1
- package/dist/preview/{chunk.RYEAMM73.js → chunk.OFJH7LDC.js} +1 -1
- package/dist/preview/{chunk.Q7TP4RFE.js → chunk.OH5BBE2B.js} +1 -1
- package/dist/preview/{chunk.CZRX2FDI.js → chunk.OREMUXB5.js} +1 -1
- package/dist/preview/{chunk.AHCI7ZDO.js → chunk.OXZRGP53.js} +1 -1
- package/dist/preview/chunk.OZR5NI4J.js +1 -0
- package/dist/preview/{chunk.PPUAPAWR.js → chunk.P75TPZWT.js} +1 -1
- package/dist/preview/{chunk.WLBXBNNH.js → chunk.PWOVXARZ.js} +1 -1
- package/dist/preview/chunk.Q63RPNUS.js +1 -0
- package/dist/preview/{chunk.XK4FVT2X.js → chunk.QDHUDLJB.js} +1 -1
- package/dist/preview/{chunk.HP3ZEDCD.js → chunk.QEALNWWL.js} +3 -3
- package/dist/preview/{chunk.APNN6BKF.js → chunk.QLMUGC7R.js} +1 -1
- package/dist/preview/{chunk.6VRJII5M.js → chunk.QTITRX5Q.js} +1 -1
- package/dist/preview/{chunk.GMOTRAKJ.js → chunk.R45BF6JV.js} +1 -1
- package/dist/preview/{chunk.F6WYSDSI.js → chunk.R7LRJS6B.js} +2 -2
- package/dist/preview/{chunk.3MWBWSYF.js → chunk.RKHEZ6KZ.js} +1 -1
- package/dist/preview/{chunk.XZYJRNRY.js → chunk.S6GJGTJE.js} +1 -1
- package/dist/preview/{chunk.7MTX33WD.js → chunk.SG23JC6D.js} +1 -1
- package/dist/preview/chunk.SSRP5SBR.js +1 -0
- package/dist/preview/{chunk.T3M4FALL.js → chunk.T2CN7UTZ.js} +2 -2
- package/dist/preview/{chunk.B2WRXGFI.js → chunk.T47DLH5Z.js} +1 -1
- package/dist/preview/{chunk.BU2DSZ2L.js → chunk.TGEF6TMM.js} +1 -1
- package/dist/preview/{chunk.7JNDZWD6.js → chunk.UJR3Y7MP.js} +1 -1
- package/dist/preview/{chunk.52QAIGCD.js → chunk.VHWUGSFW.js} +1 -1
- package/dist/preview/{chunk.6K2HASOH.js → chunk.W42P7NOL.js} +1 -1
- package/dist/preview/{chunk.2UPGH6FT.js → chunk.WGI5G6NM.js} +1 -1
- package/dist/preview/{chunk.VKH3ZPPQ.js → chunk.WHTQHU3M.js} +1 -1
- package/dist/preview/{chunk.6XO4PECH.js → chunk.WJ2TWU2I.js} +1 -1
- package/dist/preview/chunk.WQBDTLPZ.js +1 -0
- package/dist/preview/{chunk.TCSZZAYB.js → chunk.XBTZXWJX.js} +1 -1
- package/dist/preview/{chunk.OMMKD2NU.js → chunk.XRCGADKC.js} +1 -1
- package/dist/preview/{chunk.SIH6RCAI.js → chunk.Y3IJDWNS.js} +1 -1
- package/dist/preview/{chunk.HUKAVTMX.js → chunk.YNE5QR7Q.js} +1 -1
- package/dist/preview/{chunk.5EAQDBBE.js → chunk.ZDNJK2SX.js} +1 -1
- package/dist/preview/{chunk.QU356VB2.js → chunk.ZEW2OOZ5.js} +1 -1
- package/dist/preview/chunk.ZNS3LYJU.js +1 -0
- package/dist/preview/{chunk.YT2CYCVT.js → chunk.ZSSOTIFL.js} +1 -1
- package/dist/preview/{chunk.WAB6ZS2V.js → chunk.ZVMIHXVK.js} +1 -1
- package/dist/preview/{chunk.DUUARGPE.js → chunk.ZWZ5SEXT.js} +1 -1
- package/dist/preview/index.html +42 -42
- package/dist/preview/page.js +2 -2
- package/package.json +6 -6
- package/dist/preview/chunk.6P7P2AW7.js +0 -1
- package/dist/preview/chunk.E7EQ2VTE.js +0 -1
- package/dist/preview/chunk.GNSAKLP2.js +0 -1
- package/dist/preview/chunk.HH6P4BLT.js +0 -1
- package/dist/preview/chunk.HPEGQN6E.js +0 -1
- package/dist/preview/chunk.JZBBGY4B.js +0 -1
- package/dist/preview/chunk.KA3KI4UA.js +0 -1
- package/dist/preview/chunk.M5HADQPP.js +0 -1
- package/dist/preview/chunk.QPAUQJON.js +0 -1
- package/dist/preview/chunk.SHPXD6FC.js +0 -1
- package/dist/preview/chunk.TPX6AVJL.js +0 -1
- package/dist/preview/chunk.WPCGHGDA.js +0 -1
- package/dist/preview/chunk.YCIX53AR.js +0 -1
- package/dist/preview/chunk.YEYY273R.js +0 -1
- package/dist/preview/chunk.ZFWV4JAJ.js +0 -1
- package/dist/preview/chunk.ZPQKAJRI.js +0 -1
- package/dist/preview/chunk.ZTD2CNC3.js +0 -25
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var __graviewPreload=(base,files)=>{if(typeof document>"u")return;const asked=globalThis.__graviewPreloaded??=new Set;for(const file of files){const href=new URL(file,base).href;if(asked.has(href))continue;asked.add(href);const link=document.createElement("link");link.rel="modulepreload";link.href=href;document.head.append(link)}};import{a as Je}from"./chunk.QVKKXMNK.js";import{a as Ue}from"./chunk.ZSW74NVJ.js";import{a as Le}from"./chunk.U5ACEYAN.js";import{a as oe}from"./chunk.TI4OSTQV.js";import{a as re}from"./chunk.PPUAPAWR.js";import{e as ke}from"./chunk.PNVR3CXR.js";import{F as sn,I as je,O as Ne,Q as De,Y as He}from"./chunk.ZTD2CNC3.js";import{$ as _,Bb as Me,X as te,Z as L,ca as Ie,ea as me,fb as ve,fc as Ee,wb as Re,zb as ie}from"./chunk.X7W27IRI.js";import{b as he}from"./chunk.AJZBJBMO.js";var an=e=>/^(?:aggregate|kind):([^,]+)$/.exec(e)?.[1];function Fe(e,n){let t=e.about??[];if(e.field!==void 0&&e.on!==void 0&&n(e.on))return{on:"field",id:e.on,field:e.field};let i=t.filter(n);if(i.length>1)return{on:"selection",ids:i};if(e.on!==void 0&&n(e.on))return{on:"record",id:e.on};if(i.length===1)return{on:"record",id:i[0]};let o=[e.on,...t].map(r=>r===void 0?void 0:an(r)).find(r=>r!==void 0);return e.place!==void 0?{on:"lens",place:e.place,...o?{kind:o}:{}}:o!==void 0?{on:"list",kind:o}:{on:"place",place:"home"}}var K=e=>e.on==="record"||e.on==="field"?[e.id]:e.on==="selection"?e.ids:e.on==="act"&&e.id!==void 0?[e.id]:[],se=(e,n)=>e.tryDefinition(n)?.fields?.shape??{},G=(e,n)=>e.tryDefinition(n)?.edges??{},ae=(e,n)=>new Set(e.tryDefinition(n)?.display?.hide??[]),N=(e,n)=>te(e.tryDefinition(n.kind),n),be=(e,n,t)=>Ie(e.tryDefinition(n),t)||L(t),Ae=e=>typeof e=="boolean"?e?"yes":"no":String(e);function xe(e,n){let t=e.kindsKeptFrom(n);return new Set(e.schema.kinds.filter(i=>!t.has(i)))}function Se(e,n,t,i){if(!e.permits(n,t).ok)return!1;if(!i)return!0;try{return e.previewAll([n],{author:t}).ops.length>0}catch{return!1}}function de(e,n,t){let i=e,{principal:o}=t,r=t.each??8,l=oe(i)?.store??i,d=l.seenBy(o),a=l.schema,k=xe(l,o),c=s=>{let p=d.graph.getNode(s);return p&&k.has(p.kind)?p:void 0},f=l.allMutations(),g=new Map(f.map(s=>[s.name,s])),A=[],$=new Set,b=s=>{$.has(s.id)||($.add(s.id),A.push(s))},h=s=>s.slice(0,r),x=K(n).filter(s=>c(s)!==void 0);if(K(n).length>0&&x.length===0)return{target:n,candidates:[]};let m=x.length===1?c(x[0]):void 0,u=m?.kind??(n.on==="list"?n.kind:n.on==="lens"?n.kind??t.places?.find(s=>s.as===n.place)?.kind:void 0)??(n.on==="selection"?c(x[0])?.kind:void 0);if(u!==void 0&&!k.has(u))return{target:n,candidates:[]};let v=(s,p)=>`act:${s}${Object.keys(p).length>0?`:${Object.values(p).map(C=>String(C)).join(",")}`:""}`,P=(s,p,C,y,O)=>{s.destructive||Object.values(p).some(E=>typeof E=="string"&&l.graph.has(E)&&c(E)===void 0)||Se(l,{name:s.name,args:{...p}},o,y.length===0)&&b({type:"act",id:v(s.name,p),label:C,description:O??s.description??C,mutation:s.name,args:p,asks:y})};if(n.on!=="place"||t.acts)if(t.acts)for(let s of t.acts){let p=g.get(s.mutation);!p||s.destructive||n.on==="act"&&s.mutation!==n.act||P(p,s.args,s.label,(s.open??[]).filter(C=>!C.optional).map(C=>C.name),s.why)}else{let s=m?[m]:[];for(let p of f){if(n.on==="act"&&p.name!==n.act)continue;let C=p.input.shape??{},y=O=>Object.entries(C).filter(([E,w])=>E!==O&&w.safeParse?.(void 0).success===!1).map(([E])=>E);if(p.subject)for(let O of s)ie(a,p).includes(O.kind)&&P(p,{[p.subject.arg]:O.id},`${p.title??L(p.name)}: ${N(a,O)}`,y(p.subject.arg));else u!==void 0&&(p.creates??[]).includes(u)&&P(p,{},p.title??L(p.name),y(void 0))}}let W=A.filter(s=>s.type==="act");A.splice(0,A.length,...h(W));let q=(s,p)=>{let C=Me(a,f).get(s.kind),y=se(a,s.kind),O=ae(a,s.kind),E=[];for(let[w,j]of Object.entries(y)){if(p!==void 0?w!==p:O.has(w)||s[w]!==void 0)continue;let H=re(j),U=H?.type==="enum"?H.options??[]:H?.type==="boolean"?[!0,!1]:[];if(U.length===0)continue;let D=(C?.get(w)??[]).map(R=>g.get(R)).find(R=>R?.subject!==void 0&&Se(l,{name:R.name,args:{[R.subject.arg]:s.id,[w]:U.find(ge=>ge!==s[w])??U[0]}},o,!0));if(D?.subject)for(let R of U)s[w]!==R&&E.push({type:"fill",id:`fill:${s.id}:${w}:${Ae(R)}`,label:`${be(a,s.kind,w)}: ${Ae(R)}`,description:`Set ${be(a,s.kind,w).toLowerCase()} of ${N(a,s)} to ${Ae(R)}`,record:s.id,field:w,value:R,call:{name:D.name,args:{[D.subject.arg]:s.id,[w]:R}}})}for(let[w,j]of Object.entries(G(a,s.kind))){if(p!==void 0&&w!==p)continue;let H=j.to==="*"?[...k]:j.to.filter(I=>k.has(I)),U=new Set(d.graph.out(s.id,w).map(I=>I.id)),D=f.find(I=>(I.connects??[]).includes(w)&&I.subject!==void 0&&ie(a,I).includes(s.kind));if(!D?.subject)continue;let R=Re(D.input).find(I=>I.name!==D.subject.arg);if(!R)continue;let ge=H.flatMap(I=>R.kinds.length===0||R.kinds.includes(I)?d.graph.nodesOfKind(I):[]).filter(I=>I.id!==s.id&&!U.has(I.id)&&c(I.id)!==void 0);for(let I of h(ge)){let Pe={name:D.name,args:{[D.subject.arg]:s.id,[R.name]:I.id}};Se(l,Pe,o,!0)&&E.push({type:"fill",id:`fill:${s.id}:${w}:${I.id}`,label:`${L(w)}: ${N(a,I)}`,description:`Link ${N(a,s)} to ${N(a,I)}${j.description?` as ${j.description}`:""}`,record:s.id,field:w,value:I.id,call:Pe})}}return E};if(n.on==="field"&&m)for(let s of q(m,n.field))b(s);else if(m&&n.on==="record")for(let s of h(q(m)))b(s);let z=s=>{let p=_(a,s).toLowerCase(),C=[{type:"panel",id:`panel:${s}:list`,label:`A list of ${p}`,description:`Every ${me(a.tryDefinition(s),s).toLowerCase()} this viewer may see, as a list`,panel:{lens:"blocks",kind:s}}],y=ae(a,s);for(let[O,E]of Object.entries(se(a,s))){if(y.has(O))continue;let w=re(E),j=be(a,s,O).toLowerCase();if(w?.type==="enum")C.push({type:"panel",id:`panel:${s}:group:${O}`,label:`${F(p)} by ${j}`,description:`A list of ${p} grouped by ${j}`,panel:{lens:"blocks",kind:s,group:O}}),C.push({type:"panel",id:`panel:${s}:columns:${O}`,label:`Columns of ${p} by ${j}`,description:`${F(p)} in a column for each ${j}`,panel:{lens:"columns",kind:s,column:O}});else if(w?.type==="number"||w?.type==="integer"||w?.type==="date"||w?.type==="datetime"){let H=w.type==="date"||w.type==="datetime";C.push({type:"panel",id:`panel:${s}:sort:${O}`,label:`${F(p)} by ${j}`,description:`A list of ${p}, the ${H?"latest":"highest"} ${j} first`,panel:{lens:"blocks",kind:s,sort:{by:O,direction:"desc"}}}),H&&C.push({type:"panel",id:`panel:${s}:calendar:${O}`,label:`A calendar of ${p}`,description:`${F(p)} on a calendar by ${j}`,panel:{lens:"calendar",kind:s,start:O}})}}return C},ne=n.on==="place"?[...k]:u!==void 0?[u]:[];for(let s of ne)for(let p of h(z(s)))b(p);for(let s of h((t.places??[]).filter(p=>p.kind===void 0?n.on==="place":k.has(p.kind)&&(n.on==="place"||p.kind===u))))n.on==="lens"&&s.as===n.place||b({type:"place",id:`place:${s.as}`,label:s.title,description:`Go to ${s.title}`,place:s.as});if(m){let s=[];for(let[p,C]of Object.entries(G(a,m.kind)))for(let y of d.graph.out(m.id,p))c(y.id)&&s.push({type:"record",id:`record:${y.id}`,label:N(a,y),description:`${F(C.description??L(p))}: ${N(a,y)}`,record:y.id,relation:p});for(let p of a.kinds)for(let[C,y]of Object.entries(G(a,p)))if(!(y.to!=="*"&&!y.to.includes(m.kind)))for(let O of d.graph.in(m.id,C))O.kind===p&&c(O.id)&&s.push({type:"record",id:`record:${O.id}`,label:N(a,O),description:`${F(y.inverse??L(C))}: ${N(a,O)}`,record:O.id,relation:C});for(let p of h(s))b(p)}else if(n.on==="list"||n.on==="lens")for(let s of h(u!==void 0?d.graph.nodesOfKind(u):[]))c(s.id)&&b({type:"record",id:`record:${s.id}`,label:N(a,s),description:`Open ${N(a,s)}`,record:s.id});else if(n.on==="selection")for(let s of x){let p=c(s);b({type:"record",id:`record:${s}`,label:N(a,p),description:`Open ${N(a,p)}`,record:s})}return{target:n,candidates:A}}var F=e=>e&&`${e[0].toUpperCase()}${e.slice(1)}`,we=new WeakMap;function dn(e){let n=2166136261;for(let t=0;t<e.length;t++)n^=e.charCodeAt(t),n=Math.imul(n,16777619)>>>0;return n.toString(36)}function ln(e,n){let t=e,i=oe(t)?.store??t,o=i.schema,r=xe(i,n),d=i.allMutations().filter(b=>!b.destructive&&i.permits({name:b.name,args:{}},n).ok!==!1),a=`${[...r].join(",")}|${d.map(b=>b.name).join(",")}`,k=we.get(o)?.get(a);if(k)return k;let c=[...r].map(b=>{let h=ae(o,b),x={};for(let[u,v]of Object.entries(se(o,b))){if(h.has(u))continue;let P=re(v);P&&(x[u]=P.type==="enum"?`enum:${(P.options??[]).join("|")}`:P.type)}let m={};for(let[u,v]of Object.entries(G(o,b)))m[u]=v.to==="*"?[...r]:v.to.filter(P=>r.has(P));return{kind:b,noun:me(o.tryDefinition(b),b),plural:_(o,b),fields:x,relations:m}}),f=d.map(b=>({name:b.name,title:b.title??L(b.name),...b.subject?{on:ie(o,b).filter(h=>r.has(h))}:{}})),g={kinds:c,acts:f},A={version:dn(JSON.stringify(g)),...g},$=we.get(o)??new Map;return $.set(a,A),we.set(o,$),A}var cn=e=>e.name??e.id??e.kind;function Ge(e,n,t){let i=e,{principal:o}=t,r=oe(i)?.store??i,l=r.seenBy(o),d=r.schema,a=xe(r,o),k=m=>{let u=l.graph.getNode(m);return u&&a.has(u.kind)?u:void 0},c=m=>({id:m.id,kind:m.kind,label:N(d,m)}),f=K(n),g=f.length===1?k(f[0]):void 0,A=g?Object.fromEntries(Object.keys(se(d,g.kind)).filter(m=>!ae(d,g.kind).has(m)&&g[m]!==void 0&&m!=="label").map(m=>[m,g[m]])):{},$={on:n.on,...g?{record:{...c(g),fields:A}}:{},...n.on==="field"&&g?{field:n.field}:{},...n.on==="list"&&a.has(n.kind)?{kind:n.kind}:{},...n.on==="lens"?{place:n.place,...n.kind&&a.has(n.kind)?{kind:n.kind}:{}}:{},...n.on==="place"?{place:n.place}:{},...n.on==="act"?{act:n.act}:{}},b=[...new Set([...n.on==="selection"?n.ids:[],...t.selection??[]])].flatMap(m=>{let u=k(m);return u?[c(u)]:[]}),h=[];if(g){for(let m of Object.keys(G(d,g.kind)))for(let u of l.graph.out(g.id,m))k(u.id)&&h.push({...c(u),relation:m,direction:"out"});for(let m of d.kinds)for(let u of Object.keys(G(d,m)))for(let v of l.graph.in(g.id,u))v.kind===m&&k(v.id)&&h.push({...c(v),relation:u,direction:"in"})}let x=l.batches().filter(m=>!m.ops.every(ve)).slice(-(t.recent??6)).reverse().map(m=>({intent:m.intent,at:m.at,by:cn(m.author)}));return{...t.place!==void 0?{place:t.place}:{},target:$,selection:b,neighbors:h.slice(0,24),recent:x,schema:ln(r,o)}}function Q(e){if(!e.off)return e.fast??(e.decide?{model:e.name??"decide",decide:e.decide}:void 0)}function Be(e){return e.suggestOnOpen!==!1&&Q(e)!==void 0}function J(e){if(e.off)return;if(e.thinking)return e.thinking;let n=e.name??"model";if(e.complete){let t=e.complete;return{model:n,think:async({system:i,prompt:o})=>({text:await t(`${i}
|
|
1
|
+
var __graviewPreload=(base,files)=>{if(typeof document>"u")return;const asked=globalThis.__graviewPreloaded??=new Set;for(const file of files){const href=new URL(file,base).href;if(asked.has(href))continue;asked.add(href);const link=document.createElement("link");link.rel="modulepreload";link.href=href;document.head.append(link)}};import{a as Je}from"./chunk.7YQYWOZR.js";import{a as Ue}from"./chunk.ACEYGWMO.js";import{a as Le}from"./chunk.D6RDTUX3.js";import{a as oe}from"./chunk.TI4OSTQV.js";import{a as re}from"./chunk.P75TPZWT.js";import{e as ke}from"./chunk.BZ5VLPKB.js";import{F as sn,I as je,O as Ne,Q as De,Y as He}from"./chunk.6II4BONS.js";import{$ as _,Ab as ie,Cb as Me,X as te,Z as L,ca as Ie,ea as me,gb as ve,gc as Ee,xb as Re}from"./chunk.F5BCCGFK.js";import{b as he}from"./chunk.AJZBJBMO.js";var an=e=>/^(?:aggregate|kind):([^,]+)$/.exec(e)?.[1];function Fe(e,n){let t=e.about??[];if(e.field!==void 0&&e.on!==void 0&&n(e.on))return{on:"field",id:e.on,field:e.field};let i=t.filter(n);if(i.length>1)return{on:"selection",ids:i};if(e.on!==void 0&&n(e.on))return{on:"record",id:e.on};if(i.length===1)return{on:"record",id:i[0]};let o=[e.on,...t].map(r=>r===void 0?void 0:an(r)).find(r=>r!==void 0);return e.place!==void 0?{on:"lens",place:e.place,...o?{kind:o}:{}}:o!==void 0?{on:"list",kind:o}:{on:"place",place:"home"}}var K=e=>e.on==="record"||e.on==="field"?[e.id]:e.on==="selection"?e.ids:e.on==="act"&&e.id!==void 0?[e.id]:[],se=(e,n)=>e.tryDefinition(n)?.fields?.shape??{},G=(e,n)=>e.tryDefinition(n)?.edges??{},ae=(e,n)=>new Set(e.tryDefinition(n)?.display?.hide??[]),N=(e,n)=>te(e.tryDefinition(n.kind),n),be=(e,n,t)=>Ie(e.tryDefinition(n),t)||L(t),Ae=e=>typeof e=="boolean"?e?"yes":"no":String(e);function xe(e,n){let t=e.kindsKeptFrom(n);return new Set(e.schema.kinds.filter(i=>!t.has(i)))}function Se(e,n,t,i){if(!e.permits(n,t).ok)return!1;if(!i)return!0;try{return e.previewAll([n],{author:t}).ops.length>0}catch{return!1}}function de(e,n,t){let i=e,{principal:o}=t,r=t.each??8,l=oe(i)?.store??i,d=l.seenBy(o),a=l.schema,k=xe(l,o),c=s=>{let p=d.graph.getNode(s);return p&&k.has(p.kind)?p:void 0},f=l.allMutations(),g=new Map(f.map(s=>[s.name,s])),A=[],$=new Set,b=s=>{$.has(s.id)||($.add(s.id),A.push(s))},h=s=>s.slice(0,r),x=K(n).filter(s=>c(s)!==void 0);if(K(n).length>0&&x.length===0)return{target:n,candidates:[]};let m=x.length===1?c(x[0]):void 0,u=m?.kind??(n.on==="list"?n.kind:n.on==="lens"?n.kind??t.places?.find(s=>s.as===n.place)?.kind:void 0)??(n.on==="selection"?c(x[0])?.kind:void 0);if(u!==void 0&&!k.has(u))return{target:n,candidates:[]};let v=(s,p)=>`act:${s}${Object.keys(p).length>0?`:${Object.values(p).map(C=>String(C)).join(",")}`:""}`,P=(s,p,C,y,O)=>{s.destructive||Object.values(p).some(E=>typeof E=="string"&&l.graph.has(E)&&c(E)===void 0)||Se(l,{name:s.name,args:{...p}},o,y.length===0)&&b({type:"act",id:v(s.name,p),label:C,description:O??s.description??C,mutation:s.name,args:p,asks:y})};if(n.on!=="place"||t.acts)if(t.acts)for(let s of t.acts){let p=g.get(s.mutation);!p||s.destructive||n.on==="act"&&s.mutation!==n.act||P(p,s.args,s.label,(s.open??[]).filter(C=>!C.optional).map(C=>C.name),s.why)}else{let s=m?[m]:[];for(let p of f){if(n.on==="act"&&p.name!==n.act)continue;let C=p.input.shape??{},y=O=>Object.entries(C).filter(([E,w])=>E!==O&&w.safeParse?.(void 0).success===!1).map(([E])=>E);if(p.subject)for(let O of s)ie(a,p).includes(O.kind)&&P(p,{[p.subject.arg]:O.id},`${p.title??L(p.name)}: ${N(a,O)}`,y(p.subject.arg));else u!==void 0&&(p.creates??[]).includes(u)&&P(p,{},p.title??L(p.name),y(void 0))}}let W=A.filter(s=>s.type==="act");A.splice(0,A.length,...h(W));let q=(s,p)=>{let C=Me(a,f).get(s.kind),y=se(a,s.kind),O=ae(a,s.kind),E=[];for(let[w,j]of Object.entries(y)){if(p!==void 0?w!==p:O.has(w)||s[w]!==void 0)continue;let H=re(j),U=H?.type==="enum"?H.options??[]:H?.type==="boolean"?[!0,!1]:[];if(U.length===0)continue;let D=(C?.get(w)??[]).map(R=>g.get(R)).find(R=>R?.subject!==void 0&&Se(l,{name:R.name,args:{[R.subject.arg]:s.id,[w]:U.find(ge=>ge!==s[w])??U[0]}},o,!0));if(D?.subject)for(let R of U)s[w]!==R&&E.push({type:"fill",id:`fill:${s.id}:${w}:${Ae(R)}`,label:`${be(a,s.kind,w)}: ${Ae(R)}`,description:`Set ${be(a,s.kind,w).toLowerCase()} of ${N(a,s)} to ${Ae(R)}`,record:s.id,field:w,value:R,call:{name:D.name,args:{[D.subject.arg]:s.id,[w]:R}}})}for(let[w,j]of Object.entries(G(a,s.kind))){if(p!==void 0&&w!==p)continue;let H=j.to==="*"?[...k]:j.to.filter(I=>k.has(I)),U=new Set(d.graph.out(s.id,w).map(I=>I.id)),D=f.find(I=>(I.connects??[]).includes(w)&&I.subject!==void 0&&ie(a,I).includes(s.kind));if(!D?.subject)continue;let R=Re(D.input).find(I=>I.name!==D.subject.arg);if(!R)continue;let ge=H.flatMap(I=>R.kinds.length===0||R.kinds.includes(I)?d.graph.nodesOfKind(I):[]).filter(I=>I.id!==s.id&&!U.has(I.id)&&c(I.id)!==void 0);for(let I of h(ge)){let Pe={name:D.name,args:{[D.subject.arg]:s.id,[R.name]:I.id}};Se(l,Pe,o,!0)&&E.push({type:"fill",id:`fill:${s.id}:${w}:${I.id}`,label:`${L(w)}: ${N(a,I)}`,description:`Link ${N(a,s)} to ${N(a,I)}${j.description?` as ${j.description}`:""}`,record:s.id,field:w,value:I.id,call:Pe})}}return E};if(n.on==="field"&&m)for(let s of q(m,n.field))b(s);else if(m&&n.on==="record")for(let s of h(q(m)))b(s);let z=s=>{let p=_(a,s).toLowerCase(),C=[{type:"panel",id:`panel:${s}:list`,label:`A list of ${p}`,description:`Every ${me(a.tryDefinition(s),s).toLowerCase()} this viewer may see, as a list`,panel:{lens:"blocks",kind:s}}],y=ae(a,s);for(let[O,E]of Object.entries(se(a,s))){if(y.has(O))continue;let w=re(E),j=be(a,s,O).toLowerCase();if(w?.type==="enum")C.push({type:"panel",id:`panel:${s}:group:${O}`,label:`${F(p)} by ${j}`,description:`A list of ${p} grouped by ${j}`,panel:{lens:"blocks",kind:s,group:O}}),C.push({type:"panel",id:`panel:${s}:columns:${O}`,label:`Columns of ${p} by ${j}`,description:`${F(p)} in a column for each ${j}`,panel:{lens:"columns",kind:s,column:O}});else if(w?.type==="number"||w?.type==="integer"||w?.type==="date"||w?.type==="datetime"){let H=w.type==="date"||w.type==="datetime";C.push({type:"panel",id:`panel:${s}:sort:${O}`,label:`${F(p)} by ${j}`,description:`A list of ${p}, the ${H?"latest":"highest"} ${j} first`,panel:{lens:"blocks",kind:s,sort:{by:O,direction:"desc"}}}),H&&C.push({type:"panel",id:`panel:${s}:calendar:${O}`,label:`A calendar of ${p}`,description:`${F(p)} on a calendar by ${j}`,panel:{lens:"calendar",kind:s,start:O}})}}return C},ne=n.on==="place"?[...k]:u!==void 0?[u]:[];for(let s of ne)for(let p of h(z(s)))b(p);for(let s of h((t.places??[]).filter(p=>p.kind===void 0?n.on==="place":k.has(p.kind)&&(n.on==="place"||p.kind===u))))n.on==="lens"&&s.as===n.place||b({type:"place",id:`place:${s.as}`,label:s.title,description:`Go to ${s.title}`,place:s.as});if(m){let s=[];for(let[p,C]of Object.entries(G(a,m.kind)))for(let y of d.graph.out(m.id,p))c(y.id)&&s.push({type:"record",id:`record:${y.id}`,label:N(a,y),description:`${F(C.description??L(p))}: ${N(a,y)}`,record:y.id,relation:p});for(let p of a.kinds)for(let[C,y]of Object.entries(G(a,p)))if(!(y.to!=="*"&&!y.to.includes(m.kind)))for(let O of d.graph.in(m.id,C))O.kind===p&&c(O.id)&&s.push({type:"record",id:`record:${O.id}`,label:N(a,O),description:`${F(y.inverse??L(C))}: ${N(a,O)}`,record:O.id,relation:C});for(let p of h(s))b(p)}else if(n.on==="list"||n.on==="lens")for(let s of h(u!==void 0?d.graph.nodesOfKind(u):[]))c(s.id)&&b({type:"record",id:`record:${s.id}`,label:N(a,s),description:`Open ${N(a,s)}`,record:s.id});else if(n.on==="selection")for(let s of x){let p=c(s);b({type:"record",id:`record:${s}`,label:N(a,p),description:`Open ${N(a,p)}`,record:s})}return{target:n,candidates:A}}var F=e=>e&&`${e[0].toUpperCase()}${e.slice(1)}`,we=new WeakMap;function dn(e){let n=2166136261;for(let t=0;t<e.length;t++)n^=e.charCodeAt(t),n=Math.imul(n,16777619)>>>0;return n.toString(36)}function ln(e,n){let t=e,i=oe(t)?.store??t,o=i.schema,r=xe(i,n),d=i.allMutations().filter(b=>!b.destructive&&i.permits({name:b.name,args:{}},n).ok!==!1),a=`${[...r].join(",")}|${d.map(b=>b.name).join(",")}`,k=we.get(o)?.get(a);if(k)return k;let c=[...r].map(b=>{let h=ae(o,b),x={};for(let[u,v]of Object.entries(se(o,b))){if(h.has(u))continue;let P=re(v);P&&(x[u]=P.type==="enum"?`enum:${(P.options??[]).join("|")}`:P.type)}let m={};for(let[u,v]of Object.entries(G(o,b)))m[u]=v.to==="*"?[...r]:v.to.filter(P=>r.has(P));return{kind:b,noun:me(o.tryDefinition(b),b),plural:_(o,b),fields:x,relations:m}}),f=d.map(b=>({name:b.name,title:b.title??L(b.name),...b.subject?{on:ie(o,b).filter(h=>r.has(h))}:{}})),g={kinds:c,acts:f},A={version:dn(JSON.stringify(g)),...g},$=we.get(o)??new Map;return $.set(a,A),we.set(o,$),A}var cn=e=>e.name??e.id??e.kind;function Ge(e,n,t){let i=e,{principal:o}=t,r=oe(i)?.store??i,l=r.seenBy(o),d=r.schema,a=xe(r,o),k=m=>{let u=l.graph.getNode(m);return u&&a.has(u.kind)?u:void 0},c=m=>({id:m.id,kind:m.kind,label:N(d,m)}),f=K(n),g=f.length===1?k(f[0]):void 0,A=g?Object.fromEntries(Object.keys(se(d,g.kind)).filter(m=>!ae(d,g.kind).has(m)&&g[m]!==void 0&&m!=="label").map(m=>[m,g[m]])):{},$={on:n.on,...g?{record:{...c(g),fields:A}}:{},...n.on==="field"&&g?{field:n.field}:{},...n.on==="list"&&a.has(n.kind)?{kind:n.kind}:{},...n.on==="lens"?{place:n.place,...n.kind&&a.has(n.kind)?{kind:n.kind}:{}}:{},...n.on==="place"?{place:n.place}:{},...n.on==="act"?{act:n.act}:{}},b=[...new Set([...n.on==="selection"?n.ids:[],...t.selection??[]])].flatMap(m=>{let u=k(m);return u?[c(u)]:[]}),h=[];if(g){for(let m of Object.keys(G(d,g.kind)))for(let u of l.graph.out(g.id,m))k(u.id)&&h.push({...c(u),relation:m,direction:"out"});for(let m of d.kinds)for(let u of Object.keys(G(d,m)))for(let v of l.graph.in(g.id,u))v.kind===m&&k(v.id)&&h.push({...c(v),relation:u,direction:"in"})}let x=l.batches().filter(m=>!m.ops.every(ve)).slice(-(t.recent??6)).reverse().map(m=>({intent:m.intent,at:m.at,by:cn(m.author)}));return{...t.place!==void 0?{place:t.place}:{},target:$,selection:b,neighbors:h.slice(0,24),recent:x,schema:ln(r,o)}}function Q(e){if(!e.off)return e.fast??(e.decide?{model:e.name??"decide",decide:e.decide}:void 0)}function Be(e){return e.suggestOnOpen!==!1&&Q(e)!==void 0}function J(e){if(e.off)return;if(e.thinking)return e.thinking;let n=e.name??"model";if(e.complete){let t=e.complete;return{model:n,think:async({system:i,prompt:o})=>({text:await t(`${i}
|
|
2
2
|
|
|
3
|
-
${o}`)})}}if(e.turn){let t=e.turn;return{model:n,think:async({system:i,prompt:o})=>({text:await t({system:i,messages:[{role:"user",content:o}],tools:[],call:async()=>({error:"No tools here."})})})}}}var Oe=(e,n,t)=>e?n/1e6*(e.inputPerMillion??0)+t/1e6*(e.outputPerMillion??0):void 0,Ce=()=>`ai-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`;function fn(e,n,t=[]){let i=o=>{let r=e.graph.getNode(o);return r?te(e.schema.tryDefinition(r.kind),r):"a record"};switch(n.on){case"record":return i(n.id);case"field":return`${i(n.id)} \xB7 ${n.field}`;case"selection":return`${n.ids.length} records`;case"list":return e.schema.tryDefinition(n.kind)?_(e.schema,n.kind):n.kind;case"lens":case"place":return t.find(o=>o.as===n.place)?.title??(n.place==="home"?"Home":n.place);case"act":return n.act}}var We=e=>e.type!=="act"||e.asks.length===0,$e=(e,n)=>({id:e.id,type:e.type,label:e.label,...n!==void 0?{confidence:n}:{}});function Y(e,n){let t=n.interaction??Ce(),i=de(n.store,n.target,{principal:n.principal,...n.acts?{acts:n.acts}:{},...n.places?{places:n.places}:{}}),o=Ge(n.store,n.target,{principal:n.principal,...n.place?{place:n.place}:{},...n.selection?{selection:n.selection}:{}}),r=[];return{id:t,catalog:i,state:o,entry:{id:t,at:new Date().toISOString(),by:n.by??n.principal,target:n.target,targetLabel:fn(n.store,n.target,n.places)},usage:r,meter:l=>{r.push(l),e.meter?.({...l,interaction:t})}}}async function ce(e,n,t,i){let o=await e.decide(n,t),{inputTokens:r,outputTokens:l}=o.usage,d=Oe(e.price,r,l);return i({tier:"fast",model:e.model,inputTokens:r,outputTokens:l,...d!==void 0?{costUsd:d}:{}}),o.answers}async function V(e,n,t,i,o){let r=await e.think({system:n,prompt:t,state:i.state,catalog:i.catalog}),l=r.usage?.inputTokens,d=r.usage?.outputTokens,a=r.usage?.costUsd??(l!==void 0?Oe(e.price,l,d??0):void 0);return o({tier:"thinking",model:e.model,...l!==void 0?{inputTokens:l}:{},...d!==void 0?{outputTokens:d}:{},...a!==void 0?{costUsd:a}:{}}),Ue(r.text)}function fe(e,n){let t=new Map(e.map((i,o)=>[`c${o+1}`,i]));return{question:{type:"choice",instructions:n,criteria:Object.fromEntries([...t].map(([i,o])=>[i,`${o.label} \u2014 ${o.description}`]))},of:i=>t.get(i)}}function ue(e,n,t){if(e?.type!=="choice")return[];let i=e,o=Object.entries(i.probabilities).sort((r,l)=>l[1]-r[1]);return o.some(([r])=>r===i.choice)||o.unshift([i.choice,i.confidence]),o.flatMap(([r,l])=>{let d=n(r);return d?[{candidate:d,confidence:l}]:[]}).slice(0,t)}var M=(e,n,t,i)=>({interaction:{...e.entry,ask:{kind:t,said:n??""},offered:[],outcome:"failed",failed:i,usage:[...e.usage]},offers:[]}),X="AI isn't on here.";async function qe(e,n,t=3){let i=Y(e,n),o=n.said??"Suggest",r=i.catalog.candidates.filter(We).slice(0,24);if(r.length===0)return{interaction:{...i.entry,ask:{kind:"suggest",said:o},offered:[],outcome:"offered",usage:[]},offers:[]};let l=Q(e),d=J(e),a=[];try{if(l){let{question:k,of:c}=fe(r,"Which of these would the person most likely want to do next, here?"),f=await ce(l,{...i.state,candidates:r.map(g=>({id:g.id,type:g.type,says:g.description}))},{next:k},i.meter);a=ue(f.next,c,t)}else if(d){let k=await V(d,'You suggest what a person most likely wants to do next in an app. Answer only JSON: {"pick": [candidate ids, best first]}. Pick only ids from the candidates.',JSON.stringify({state:i.state,candidates:r.map(f=>({id:f.id,says:f.description}))}),i,i.meter);a=(Array.isArray(k?.pick)?k.pick.filter(f=>typeof f=="string"):[]).flatMap(f=>r.filter(g=>g.id===f)).slice(0,t).map(f=>({candidate:f}))}else return M(i,o,"suggest",X)}catch(k){return M(i,o,"suggest",k instanceof Error?k.message:String(k))}return{interaction:{...i.entry,ask:{kind:"suggest",said:o},offered:a.map(({candidate:k,confidence:c})=>$e(k,c)),outcome:"offered",usage:[...i.usage]},offers:a.map(({candidate:k})=>k)}}async function ze(e,n){let t=Y(e,n),i=n.said??"Fill in",o=t.catalog.candidates.filter(f=>f.type==="fill"),r=new Map;for(let f of o)r.set(f.field,[...r.get(f.field)??[],f]);if(r.size===0)return{interaction:{...t.entry,ask:{kind:"fill",said:i},offered:[],outcome:"offered",usage:[]},offers:[]};let l=Q(e),d=J(e),a=[];try{if(l){let f=[...r].map(([A,$],b)=>({key:`f${b+1}`,field:A,...fe($,`Which value fits "${A}" best for this record?`)})),g=await ce(l,t.state,Object.fromEntries(f.map(A=>[A.key,A.question])),t.meter);for(let A of f){let $=!un(n.store,n.target,A.field)&&pn(n.store,n.target,A.field)!=="one";a.push(...ue(g[A.key],A.of,$?3:1).filter((b,h)=>h===0||b.confidence>=.4))}}else if(d){let f=await V(d,`You fill in a record's fields in an app. Answer only JSON: {"fills": [candidate ids]}, at most one per field, only ids from the candidates.`,JSON.stringify({state:t.state,candidates:o.map($=>({id:$.id,says:$.description}))}),t,t.meter),g=Array.isArray(f?.fills)?f.fills.filter($=>typeof $=="string"):[],A=new Set;for(let $ of g){let b=o.find(h=>h.id===$);b?.type==="fill"&&!A.has(b.field)&&(A.add(b.field),a.push({candidate:b}))}}else return M(t,i,"fill",X)}catch(f){return M(t,i,"fill",f instanceof Error?f.message:String(f))}let k=t.usage.at(-1)?.model,c=Z(n.store,{interaction:t.id,target:n.target,basis:i,...k?{model:k}:{},proposals:a.flatMap(({candidate:f,confidence:g})=>f.type==="fill"?[{id:f.id,label:f.label,said:f.description,call:f.call,record:f.record,field:f.field,...g!==void 0?{confidence:g}:{}}]:[])},n.principal);return{interaction:{...t.entry,ask:{kind:"fill",said:i},offered:c.proposals.map(f=>({id:f.id,type:"fill",label:f.label,...f.confidence!==void 0?{confidence:f.confidence}:{}})),outcome:"offered",usage:[...t.usage]},offers:[],...c.proposals.length>0?{ghost:c}:{}}}function un(e,n,t){let i=n.on==="record"||n.on==="field"?n.id:void 0,o=i?e.graph.getNode(i)?.kind:void 0,r=(o?e.schema.tryDefinition(o)?.fields?.shape:void 0)??{};return t in r}function pn(e,n,t){let i=n.on==="record"||n.on==="field"?n.id:void 0,o=i?e.graph.getNode(i)?.kind:void 0;return o?e.schema.tryDefinition(o)?.edges?.[t]?.cardinality:void 0}async function _e(e,n){let t=Y(e,n),i=n.said??"Add one",o=new Set(n.store.allMutations().filter(c=>(c.creates??[]).length>0).map(c=>c.name)),r=t.catalog.candidates.filter(c=>c.type==="act"&&c.asks.length>0&&o.has(c.mutation));if(r.length===0)return M(t,i,"record","Nothing here makes a record.");let l=J(e);if(!l)return M(t,i,"record",X);let d;try{let c=await V(l,'You propose one new record for an app by filling in an act. Answer only JSON: {"act": a candidate id, "args": {argument: value}}. Use only the candidates, and fill every argument the act asks for with a value that fits the state.',JSON.stringify({ask:i,state:t.state,candidates:r.map(A=>({id:A.id,says:A.description,asks:A.asks}))}),t,t.meter),f=r.find(A=>A.id===c?.act),g=typeof c?.args=="object"&&c.args!==null?c.args:{};f&&(d={act:f,args:Object.fromEntries(Object.entries(g).filter(([A])=>f.asks.includes(A)))})}catch(c){return M(t,i,"record",c instanceof Error?c.message:String(c))}if(!d)return M(t,i,"record","The model named no act this app has here.");let a=t.usage.at(-1)?.model,k=Z(n.store,{interaction:t.id,target:n.target,basis:i,...a?{model:a}:{},proposals:[{id:d.act.id,label:d.act.label,said:d.act.description,call:{name:d.act.mutation,args:{...d.act.args,...d.args}}}]},n.principal);return k.proposals.length===0?M(t,i,"record","What the model proposed could not be made here."):{interaction:{...t.entry,ask:{kind:"record",said:i},offered:k.proposals.map(c=>({id:c.id,type:"act",label:c.said})),outcome:"offered",usage:[...t.usage]},offers:[d.act],ghost:k}}async function Ke(e,n){let t=Y(e,n),i=n.said??"Make a panel",o=t.catalog.candidates.filter(c=>c.type==="panel");if(o.length===0)return M(t,i,"panel","Nothing here can be drawn as a panel.");let r=Q(e),l=J(e),d;try{if(l){let c=await V(l,'You choose a panel to draw in an app. Answer only JSON: {"panel": a candidate id, "title": a short title}. Choose only among the candidates.',JSON.stringify({ask:i,state:t.state,candidates:o.map(g=>({id:g.id,says:g.description}))}),t,t.meter),f=o.find(g=>g.id===c?.panel);f&&(d={panel:f,...typeof c?.title=="string"&&c.title.trim()?{title:c.title.trim().slice(0,60)}:{}})}else if(r){let{question:c,of:f}=fe(o,`Which panel answers this best: ${i}`),g=ue((await ce(r,t.state,{panel:c},t.meter)).panel,f,1)[0];g?.candidate.type==="panel"&&(d={panel:g.candidate,confidence:g.confidence})}else return M(t,i,"panel",X)}catch(c){return M(t,i,"panel",c instanceof Error?c.message:String(c))}if(!d)return M(t,i,"panel","The model named no panel this app can draw.");let a=d.title??d.panel.label,k={title:a,recipe:{...d.panel.panel,title:a}};return{interaction:{...t.entry,ask:{kind:"panel",said:i},offered:[$e(d.panel,d.confidence)],outcome:"drawn",panel:k,usage:[...t.usage]},offers:[d.panel],panel:k}}function yn(e){return e.off?void 0:e.answer}var gn=`You answer a person's question about what they are looking at in an app, from the state given and nothing else. Answer only JSON: {"answer": one to three short sentences, "pick": [candidate ids that act on the answer, best first, at most three]}. Pick only ids from the candidates, and none when nothing fits. Never say an id to the person.`;async function Rn(e,n){let t=Y(e,n),i=n.said.trim(),o=t.catalog.candidates.filter(h=>We(h)||h.type==="panel"||h.type==="place"||h.type==="record").slice(0,32),r=yn(e),l=J(e),d=Q(e),a="",k=[],c=h=>h.flatMap(x=>o.filter(m=>m.id===x)).slice(0,3).map(x=>({candidate:x}));try{if(r){let h=await r.answer({said:i,target:n.target,targetLabel:t.entry.targetLabel,state:t.state,catalog:{target:t.catalog.target,candidates:o},...n.follows?{follows:n.follows}:{}}),x=h.usage?.inputTokens,m=h.usage?.outputTokens,u=h.usage?.costUsd??(x!==void 0?Oe(r.price,x,m??0):void 0);t.meter({tier:"thinking",model:r.model,...x!==void 0?{inputTokens:x}:{},...m!==void 0?{outputTokens:m}:{},...u!==void 0?{costUsd:u}:{}}),a=typeof h.text=="string"?h.text.trim():"",k=c(h.pick??[])}else if(l){let h=await V(l,gn,JSON.stringify({ask:i,about:t.entry.targetLabel,...n.follows?{follows:n.follows}:{},state:t.state,candidates:o.map(x=>({id:x.id,says:x.description}))}),t,t.meter);a=typeof h?.answer=="string"?h.answer.trim():"",k=c(Array.isArray(h?.pick)?h.pick:[])}else if(d&&o.length>0){let{question:h,of:x}=fe(o,`Which of these best answers, or acts on: ${i}`),m=await ce(d,{...t.state,asked:i,candidates:o.map(u=>({id:u.id,type:u.type,says:u.description}))},{answer:h},t.meter);k=ue(m.answer,x,3),a=k.length>0?`These fit \u201C${i}\u201D.`:""}else return M(t,i,"ask",X)}catch(h){return M(t,i,"ask",h instanceof Error?h.message:String(h))}if(!a&&k.length===0)return M(t,i,"ask","The AI had no answer to that here.");let f=t.usage.at(-1)?.model,g=k.flatMap(({candidate:h,confidence:x})=>{let m=le(h);return m?[{...m,...x!==void 0?{confidence:x}:{}}]:[]}),A=g.length>0?Z(n.store,{interaction:t.id,target:n.target,basis:i,...f?{model:f}:{},proposals:g},n.principal):void 0,$=k.map(({candidate:h})=>h).filter(h=>le(h)===void 0),b=[...$.map(h=>$e(h,k.find(x=>x.candidate===h)?.confidence)),...(A?.proposals??[]).map(h=>({id:h.id,type:h.field!==void 0?"fill":"act",label:h.label,...h.confidence!==void 0?{confidence:h.confidence}:{}}))];return{interaction:{...t.entry,ask:{kind:"ask",said:i},offered:b,outcome:"offered",...a?{answer:a}:{},usage:[...t.usage]},offers:$,...A&&A.proposals.length>0?{ghost:A}:{},...a?{answer:a}:{}}}function Z(e,n,t){let i=n.proposals.flatMap(o=>{try{let r=e.previewAll([o.call],{author:t}),l=r.ops.map(d=>d.intent).join("; ");return r.ops.length>0?[{...o,said:l||o.said}]:[]}catch{return[]}});return{...n,proposals:i}}function le(e){if(e.type==="fill")return{id:e.id,label:e.label,said:e.description,call:e.call,record:e.record,field:e.field};if(e.type==="act"&&e.asks.length===0)return{id:e.id,label:e.label,said:e.description,call:{name:e.mutation,args:{...e.args}}}}function Qe(e,n,t){let i=n.proposals.filter(r=>t.ids===void 0||t.ids.includes(r.id));if(i.length===0)return{ok:!1,refused:"Nothing was chosen."};let o=i.flatMap(r=>r.confidence===void 0?[]:[r.confidence]);try{let l=e.applyAll(i.map(d=>d.call),{author:t.author,via:`ai:${n.interaction}`,intent:n.basis,lineage:{basis:`Asked \u201C${n.basis}\u201D`,...n.model?{model:n.model}:{},...o.length>0?{confidence:Math.min(...o)}:{},interaction:n.interaction}}).ops[0]?.batch;return l?{ok:!0,batch:l,accepted:i.map(d=>d.id)}:{ok:!1,refused:"That changes nothing now."}}catch(r){return{ok:!1,refused:r instanceof Error?r.message:String(r)}}}function Ye(e,n,t){let i=e.ask.kind==="suggest"?n.length>0:e.offered.length>0&&e.offered.every(o=>n.includes(o.id));return{...e,outcome:i?"accepted":"partly",accepted:n,batches:[...e.batches??[],t]}}var Ve=e=>({...e,outcome:"dismissed"});var T=he(sn(),1);var S=he(De(),1);function Ze(e,n,t){let i=n.on==="selection"?n.ids:n.on==="record"||n.on==="field"?[n.id]:[],o=i.length>0?Je(e.store,i,{principal:e.principal,...i.length===1?{focus:i[0]}:{}}).affordances.map(r=>({mutation:r.mutation,label:r.label,args:r.args,open:r.open,why:r.why,...r.destructive?{destructive:!0}:{}})):void 0;return{store:e.store,target:n,principal:e.principal,interaction:Ce(),places:e.places,selection:e.selection,...o?{acts:o}:{},...e.place?{place:e.place}:{},...t?{said:t}:{}}}async function en(e,n,t){let i=await (__graviewPreload(import.meta.url,["./chunk.VMGWYCXU.js","./chunk.G4JJXA63.js","./chunk.LAF6GTBN.js","./chunk.QU356VB2.js","./chunk.ZSW74NVJ.js","./chunk.ZE4CTZQ3.js","./chunk.Q5WEOX3Q.js","./chunk.DMNXYMLC.js","./chunk.2YGQVI6T.js","./chunk.HPD5ZDZH.js","./chunk.WVUJXDXZ.js","./chunk.52QAIGCD.js","./chunk.PPUAPAWR.js","./chunk.IHFNLKXV.js","./chunk.577PGFUT.js","./chunk.FBY5IUGU.js","./chunk.4K5QCJFH.js","./chunk.Z7ZCR4LN.js","./chunk.RIW7SQH4.js","./chunk.FSAHO3LV.js","./chunk.X7W27IRI.js","./chunk.AJZBJBMO.js"]),import("./chunk.ZFWV4JAJ.js")),o=i.recipeDraft(n.recipe,{app:e.app,sight:i.draftSight(e.app,e.principal)});if(i.isDraftFailure(o))return o.failed;t?.(),e.seatTalk.setDraft(o,null),e.goTo.draft?.(),nn()}function nn(e=180){if(typeof document>"u")return;let n=document.querySelector('[data-testid="draft-keep"]'),t=document.activeElement,i=!t||t===document.body||t.closest?.("[inert]")!==null;if(n){i&&n.focus();return}e>0&&requestAnimationFrame(()=>nn(e-1))}async function ee(e,n,t,i,o){let r=Ze(e,t,i),l=n==="suggest"?await qe(e.ai,r):n==="fill"?await ze(e.ai,r):n==="record"?await _e(e.ai,r):await Ke(e.ai,r);if(l.interaction.outcome==="failed")return n!=="suggest"&&e.desk.record(l.interaction),l;let d=a=>{let k={...l.interaction,outcome:"failed",failed:a};return e.desk.record(k),{...l,interaction:k}};if(n==="fill"||n==="record"){if(!l.ghost||l.ghost.proposals.length===0)return d("Nothing here could be filled in.");o?.(),e.desk.setGhost({ghost:l.ghost}),e.desk.record(l.interaction)}if(n==="panel"&&l.panel){let a=await en(e,l.panel,o);if(a)return d(a);e.desk.record(l.interaction)}return l}var Te=new WeakMap,hn=64,Xe=new WeakMap;function mn(e){let n=Xe.get(e);if(!n){let t=n={n:0};Xe.set(e,t),e.subscribe(()=>void(t.n+=1))}return n.n}var tn=(e,n)=>{let t=K(n);return t.length>0?t.map(i=>e.graph.getNode(i)):[mn(e)]},on=(e,n)=>JSON.stringify({target:n,seat:e.principal}),rn=(e,n,t)=>{let i=tn(e.store,n);return t.schema===e.store.schema&&t.ai===e.ai&&i.length===t.depends.length&&i.every((o,r)=>o===t.depends[r])};function kn(e,n){let t=Te.get(e.store)?.get(on(e,n));return t?.result!==void 0&&rn(e,n,t)?t.result:void 0}function bn(e,n){let t=Te.get(e.store);t||Te.set(e.store,t=new Map);let i=on(e,n),o=t.get(i);if(o&&rn(e,n,o))return o.result?Promise.resolve(o.result):o.asked;let r=ee(e,"suggest",n),l={schema:e.store.schema,ai:e.ai,depends:tn(e.store,n),asked:r};t.delete(i),t.set(i,l),t.size>hn&&t.delete(t.keys().next().value);let d=t;return r.then(a=>{a.interaction.outcome!=="failed"?l.result=a:d.get(i)===l&&d.delete(i)}),r}async function An(e,n,t,i){let o=n.interaction,r=le(t);if(r){let l=o.usage?.at(-1)?.model,d=o.offered.find(k=>k.id===t.id)?.confidence,a=Z(e.store,{interaction:o.id,target:o.target,basis:`${o.ask.said}: ${t.label}`,...l?{model:l}:{},proposals:[{...r,...d!==void 0?{confidence:d}:{}}]},e.principal);if(a.proposals.length===0){let k="That can't be done now.";return e.desk.record({...o,outcome:"failed",failed:k}),k}i?.(),e.desk.setGhost({ghost:a}),e.desk.record(o);return}if(t.type==="panel"){let l=t.label,d={title:l,recipe:{...t.panel,title:l}},a=await en(e,d,i);return e.desk.record(a?{...o,outcome:"failed",failed:a}:{...o,outcome:"drawn",accepted:[t.id],panel:d}),a}i?.(),t.type==="place"?e.goTo.place(t.place):t.type==="record"&&e.goTo.record(t.record),e.desk.record({...o,outcome:"accepted",accepted:[t.id]})}async function Fn(e,n){if(n.ask.kind==="ask")return ke(e.desk,{target:n.target,asked:n.ask.said}),null;let t=n.ask.kind==="panel"||n.ask.kind==="record"?n.ask.kind:"fill";return ee(e,t,n.target,n.ask.said)}var B={padding:"5px 10px",fontSize:"0.875rem",borderRadius:8,width:"100%",textAlign:"left",borderWidth:1,borderStyle:"solid",borderColor:"transparent",background:"none",boxShadow:"none"},pe={margin:0,padding:"4px 10px",fontSize:"0.8125rem",color:"var(--graview-ink-muted)"};function Gn({target:e,close:n}){let t=Le(),i=(0,T.useMemo)(()=>Fe(e,y=>t.store.graph.has(y)),[e,t.store]),o=(0,T.useMemo)(()=>{let y=Ze(t,i);return de(t.store,i,{principal:t.principal,places:t.places,...y.acts?{acts:y.acts}:{}})},[t,i]),r=o.candidates.some(y=>y.type==="fill"),l=o.candidates.some(y=>y.type==="panel"),d=(0,T.useMemo)(()=>new Set(t.store.allMutations().filter(y=>(y.creates??[]).length>0).map(y=>y.name)),[t.store]),a=J(t.ai)!==void 0&&o.candidates.some(y=>y.type==="act"&&y.asks.length>0&&d.has(y.mutation)),k=Be(t.ai),c=kn(t,i),f=JSON.stringify(i),[g,A]=(0,T.useState)(!1),[$,b]=(0,T.useState)(null),[h,x]=(0,T.useState)(k&&c===void 0);(0,T.useEffect)(()=>{if(c!==void 0||!(k||g))return;let y=!0;return x(!0),bn(t,i).then(O=>{y&&(b(O),x(!1))}),()=>{y=!1}},[f,g]);let m=c??$,u=m?.interaction.outcome==="failed"?m.interaction.failed??"The AI could not suggest anything here.":null,v=(0,T.useRef)(!1),P=(0,T.useRef)(null);(0,T.useLayoutEffect)(()=>{m===null||!v.current||(v.current=!1,P.current?.querySelector("button")?.focus())},[m]);let W=(0,T.useRef)(!0);(0,T.useEffect)(()=>()=>{W.current=!1},[]);let[q,z]=(0,T.useState)(!1),[ne,s]=(0,T.useState)(null),p=y=>{if(q)return;z(!0),s(null);let O=!1;y(()=>{O=!0,n()}).then(w=>{W.current&&(z(!1),w?s(w):O||n())},w=>{W.current&&(z(!1),s(w instanceof Error?w.message:String(w)))})},C=y=>y.interaction.outcome==="failed"?y.interaction.failed??"The AI could not do that here.":void 0;return(0,S.jsxs)("div",{ref:P,"data-testid":"inline-ai",style:{display:"grid",gap:2},children:[h&&!g?(0,S.jsx)("p",{role:"status","data-testid":"inline-ai-thinking",style:pe,children:"Thinking\u2026"}):q?(0,S.jsx)("p",{role:"status","data-testid":"inline-ai-asking",style:pe,children:"Asking\u2026"}):ne?(0,S.jsx)("p",{role:"alert","data-testid":"inline-ai-failed",style:{...pe,color:"var(--graview-warn)"},children:ne}):u?(0,S.jsx)("p",{role:"status",style:pe,children:u}):null,(0,S.jsxs)("ul",{style:{margin:0,padding:0,listStyle:"none",display:"flex",flexDirection:"column",gap:2},children:[(m?.offers??[]).map(y=>(0,S.jsx)("li",{children:(0,S.jsxs)("button",{type:"button","data-menu-item":`ai-offer:${y.id}`,"data-ai-offer":y.id,"data-ai-offer-type":y.type,onClick:()=>p(O=>An(t,m,y,O)),style:B,children:[y.label,(0,S.jsxs)("span",{style:{color:"var(--graview-ink-faint)"},children:[" \xB7 ",y.type==="panel"?"a panel":y.type==="place"?"go there":y.type==="record"?"open it":"suggested"]})]})},y.id)),!k&&m===null?(0,S.jsx)("li",{children:(0,S.jsx)("button",{type:"button","data-menu-item":"ai-suggest","aria-disabled":g||void 0,onClick:y=>{g||(v.current=document.activeElement===y.currentTarget,A(!0))},style:B,children:g?"Thinking\u2026":"Suggest\u2026"})}):null,r?(0,S.jsx)("li",{children:(0,S.jsx)("button",{type:"button","data-menu-item":"ai-fill",onClick:()=>p(async y=>C(await ee(t,"fill",i,"Fill in",y))),style:B,children:"Fill in with AI"})}):null,a?(0,S.jsx)("li",{children:(0,S.jsx)("button",{type:"button","data-menu-item":"ai-record",onClick:()=>p(async y=>C(await ee(t,"record",i,"Add one",y))),style:B,children:"Add one with AI"})}):null,l?(0,S.jsx)("li",{children:(0,S.jsx)("button",{type:"button","data-menu-item":"ai-panel",onClick:()=>p(async y=>C(await ee(t,"panel",i,"Draw a panel",y))),style:B,children:"Draw a panel"})}):null,(0,S.jsx)("li",{children:(0,S.jsx)("button",{type:"button","data-menu-item":"ai-ask",onClick:()=>{let y=document.activeElement;n(),ke(t.desk,{target:i,returnTo:y instanceof HTMLElement&&y!==document.body?y:null})},style:B,children:"Ask about this\u2026"})})]})]})}var ye={display:"inline-flex",alignItems:"center",minHeight:28,padding:"2px 10px",fontSize:"0.8125rem",borderRadius:8};function Bn({placement:e="picture"}){let{store:n,principal:t,aiDesk:i}=He(),o=Ne(n,t),{ghost:r,entries:l}=je(i),[d,a]=(0,T.useState)(new Set);(0,T.useEffect)(()=>a(new Set),[r?.ghost.interaction]);let k=(0,T.useRef)(null),c=(0,T.useRef)(null),f=r?.batch;if((0,T.useEffect)(()=>{f!==void 0&&c.current?.focus()},[f]),!r)return null;let{ghost:g}=r,A=l.find(u=>u.id===g.interaction),$=()=>{let u=g.target.on==="record"||g.target.on==="field"?g.target.id:void 0,v=k.current?.closest("[data-graview-face], main")?.parentElement??document,P=(u?v.querySelector(`[data-graview-view="${CSS.escape(u)}"][tabindex]`):null)??document.querySelector("[data-graview-page-title]")??k.current?.closest("main")??document.querySelector("main");P&&!P.hasAttribute("tabindex")&&P.setAttribute("tabindex","-1"),P?.focus({preventScroll:!0}),i.setGhost(null)},b=g.proposals.filter(u=>!d.has(u.id)).map(u=>u.id),h=()=>{let u=Qe(o,g,{author:t,ids:b});if(!u.ok){i.setGhost({...r,refused:u.refused});return}A&&i.record(Ye(A,u.accepted,u.batch)),i.setGhost({ghost:g,batch:u.batch,took:u.accepted.length,...r.onCard?{onCard:!0}:{}})},x=()=>{A&&r.batch===void 0&&i.record(Ve(A)),$()},m=()=>{if(r.batch!==void 0)try{o.undo(r.batch,{author:t}),$()}catch(u){i.setGhost({...r,refused:u instanceof Error?u.message:String(u)})}};return(0,S.jsxs)("section",{ref:k,"data-testid":"ai-ghost","data-interaction":g.interaction,"aria-label":"Proposed by AI",style:{...e==="card"?{position:"static"}:{position:e==="page"?"fixed":"absolute",insetInline:"max(12px, calc(50% - 220px))",bottom:"calc(var(--graview-foot-room, 0px) + 72px)",zIndex:Ee("toast"),boxShadow:"var(--graview-lift-high)"},display:"grid",gap:8,padding:12,borderRadius:12,border:"1px dashed var(--graview-accent)",background:"var(--graview-float)",fontSize:"0.875rem"},children:[(0,S.jsx)("p",{style:{margin:0,color:"var(--graview-ink-muted)"},children:r.batch!==void 0?`Done: ${r.took===1?"one change":`${r.took} changes`}, as one.`:`Proposed by AI \xB7 ${g.basis}`}),r.batch===void 0?(0,S.jsx)("ul",{style:{margin:0,padding:0,listStyle:"none",display:"grid",gap:4},children:g.proposals.map(u=>(0,S.jsx)("li",{"data-ghost-proposal":u.id,children:(0,S.jsxs)("label",{style:{display:"flex",alignItems:"baseline",gap:8,cursor:"pointer"},children:[(0,S.jsx)("input",{type:"checkbox",checked:!d.has(u.id),onChange:v=>{let P=new Set(d);v.target.checked?P.delete(u.id):P.add(u.id),a(P)}}),(0,S.jsx)("span",{style:{fontStyle:"italic",color:"var(--graview-ink)"},children:u.said}),u.confidence!==void 0?(0,S.jsxs)("span",{style:{color:"var(--graview-ink-faint)"},children:[Math.round(u.confidence*100),"% sure"]}):null]})},u.id))}):null,r.refused?(0,S.jsx)("p",{role:"alert",style:{margin:0,color:"var(--graview-warn)"},children:r.refused}):null,(0,S.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:6},children:r.batch===void 0?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)("button",{type:"button","data-testid":"ghost-accept",disabled:b.length===0,onClick:h,style:ye,children:b.length===g.proposals.length?"Accept":`Accept ${b.length} of ${g.proposals.length}`}),(0,S.jsx)("button",{type:"button","data-testid":"ghost-dismiss",onClick:x,style:ye,children:"Dismiss"})]}):(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)("button",{type:"button",ref:c,"data-testid":"ghost-undo",onClick:m,style:ye,children:"Undo"}),(0,S.jsx)("button",{type:"button","data-testid":"ghost-close",onClick:$,style:ye,children:"Close"})]})})]})}export{Fe as a,K as b,de as c,fn as d,Rn as e,Ze as f,en as g,ee as h,kn as i,bn as j,An as k,Fn as l,Gn as m,Bn as n};
|
|
3
|
+
${o}`)})}}if(e.turn){let t=e.turn;return{model:n,think:async({system:i,prompt:o})=>({text:await t({system:i,messages:[{role:"user",content:o}],tools:[],call:async()=>({error:"No tools here."})})})}}}var Oe=(e,n,t)=>e?n/1e6*(e.inputPerMillion??0)+t/1e6*(e.outputPerMillion??0):void 0,Ce=()=>`ai-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`;function fn(e,n,t=[]){let i=o=>{let r=e.graph.getNode(o);return r?te(e.schema.tryDefinition(r.kind),r):"a record"};switch(n.on){case"record":return i(n.id);case"field":return`${i(n.id)} \xB7 ${n.field}`;case"selection":return`${n.ids.length} records`;case"list":return e.schema.tryDefinition(n.kind)?_(e.schema,n.kind):n.kind;case"lens":case"place":return t.find(o=>o.as===n.place)?.title??(n.place==="home"?"Home":n.place);case"act":return n.act}}var We=e=>e.type!=="act"||e.asks.length===0,$e=(e,n)=>({id:e.id,type:e.type,label:e.label,...n!==void 0?{confidence:n}:{}});function Y(e,n){let t=n.interaction??Ce(),i=de(n.store,n.target,{principal:n.principal,...n.acts?{acts:n.acts}:{},...n.places?{places:n.places}:{}}),o=Ge(n.store,n.target,{principal:n.principal,...n.place?{place:n.place}:{},...n.selection?{selection:n.selection}:{}}),r=[];return{id:t,catalog:i,state:o,entry:{id:t,at:new Date().toISOString(),by:n.by??n.principal,target:n.target,targetLabel:fn(n.store,n.target,n.places)},usage:r,meter:l=>{r.push(l),e.meter?.({...l,interaction:t})}}}async function ce(e,n,t,i){let o=await e.decide(n,t),{inputTokens:r,outputTokens:l}=o.usage,d=Oe(e.price,r,l);return i({tier:"fast",model:e.model,inputTokens:r,outputTokens:l,...d!==void 0?{costUsd:d}:{}}),o.answers}async function V(e,n,t,i,o){let r=await e.think({system:n,prompt:t,state:i.state,catalog:i.catalog}),l=r.usage?.inputTokens,d=r.usage?.outputTokens,a=r.usage?.costUsd??(l!==void 0?Oe(e.price,l,d??0):void 0);return o({tier:"thinking",model:e.model,...l!==void 0?{inputTokens:l}:{},...d!==void 0?{outputTokens:d}:{},...a!==void 0?{costUsd:a}:{}}),Ue(r.text)}function fe(e,n){let t=new Map(e.map((i,o)=>[`c${o+1}`,i]));return{question:{type:"choice",instructions:n,criteria:Object.fromEntries([...t].map(([i,o])=>[i,`${o.label} \u2014 ${o.description}`]))},of:i=>t.get(i)}}function ue(e,n,t){if(e?.type!=="choice")return[];let i=e,o=Object.entries(i.probabilities).sort((r,l)=>l[1]-r[1]);return o.some(([r])=>r===i.choice)||o.unshift([i.choice,i.confidence]),o.flatMap(([r,l])=>{let d=n(r);return d?[{candidate:d,confidence:l}]:[]}).slice(0,t)}var M=(e,n,t,i)=>({interaction:{...e.entry,ask:{kind:t,said:n??""},offered:[],outcome:"failed",failed:i,usage:[...e.usage]},offers:[]}),X="AI isn't on here.";async function qe(e,n,t=3){let i=Y(e,n),o=n.said??"Suggest",r=i.catalog.candidates.filter(We).slice(0,24);if(r.length===0)return{interaction:{...i.entry,ask:{kind:"suggest",said:o},offered:[],outcome:"offered",usage:[]},offers:[]};let l=Q(e),d=J(e),a=[];try{if(l){let{question:k,of:c}=fe(r,"Which of these would the person most likely want to do next, here?"),f=await ce(l,{...i.state,candidates:r.map(g=>({id:g.id,type:g.type,says:g.description}))},{next:k},i.meter);a=ue(f.next,c,t)}else if(d){let k=await V(d,'You suggest what a person most likely wants to do next in an app. Answer only JSON: {"pick": [candidate ids, best first]}. Pick only ids from the candidates.',JSON.stringify({state:i.state,candidates:r.map(f=>({id:f.id,says:f.description}))}),i,i.meter);a=(Array.isArray(k?.pick)?k.pick.filter(f=>typeof f=="string"):[]).flatMap(f=>r.filter(g=>g.id===f)).slice(0,t).map(f=>({candidate:f}))}else return M(i,o,"suggest",X)}catch(k){return M(i,o,"suggest",k instanceof Error?k.message:String(k))}return{interaction:{...i.entry,ask:{kind:"suggest",said:o},offered:a.map(({candidate:k,confidence:c})=>$e(k,c)),outcome:"offered",usage:[...i.usage]},offers:a.map(({candidate:k})=>k)}}async function ze(e,n){let t=Y(e,n),i=n.said??"Fill in",o=t.catalog.candidates.filter(f=>f.type==="fill"),r=new Map;for(let f of o)r.set(f.field,[...r.get(f.field)??[],f]);if(r.size===0)return{interaction:{...t.entry,ask:{kind:"fill",said:i},offered:[],outcome:"offered",usage:[]},offers:[]};let l=Q(e),d=J(e),a=[];try{if(l){let f=[...r].map(([A,$],b)=>({key:`f${b+1}`,field:A,...fe($,`Which value fits "${A}" best for this record?`)})),g=await ce(l,t.state,Object.fromEntries(f.map(A=>[A.key,A.question])),t.meter);for(let A of f){let $=!un(n.store,n.target,A.field)&&pn(n.store,n.target,A.field)!=="one";a.push(...ue(g[A.key],A.of,$?3:1).filter((b,h)=>h===0||b.confidence>=.4))}}else if(d){let f=await V(d,`You fill in a record's fields in an app. Answer only JSON: {"fills": [candidate ids]}, at most one per field, only ids from the candidates.`,JSON.stringify({state:t.state,candidates:o.map($=>({id:$.id,says:$.description}))}),t,t.meter),g=Array.isArray(f?.fills)?f.fills.filter($=>typeof $=="string"):[],A=new Set;for(let $ of g){let b=o.find(h=>h.id===$);b?.type==="fill"&&!A.has(b.field)&&(A.add(b.field),a.push({candidate:b}))}}else return M(t,i,"fill",X)}catch(f){return M(t,i,"fill",f instanceof Error?f.message:String(f))}let k=t.usage.at(-1)?.model,c=Z(n.store,{interaction:t.id,target:n.target,basis:i,...k?{model:k}:{},proposals:a.flatMap(({candidate:f,confidence:g})=>f.type==="fill"?[{id:f.id,label:f.label,said:f.description,call:f.call,record:f.record,field:f.field,...g!==void 0?{confidence:g}:{}}]:[])},n.principal);return{interaction:{...t.entry,ask:{kind:"fill",said:i},offered:c.proposals.map(f=>({id:f.id,type:"fill",label:f.label,...f.confidence!==void 0?{confidence:f.confidence}:{}})),outcome:"offered",usage:[...t.usage]},offers:[],...c.proposals.length>0?{ghost:c}:{}}}function un(e,n,t){let i=n.on==="record"||n.on==="field"?n.id:void 0,o=i?e.graph.getNode(i)?.kind:void 0,r=(o?e.schema.tryDefinition(o)?.fields?.shape:void 0)??{};return t in r}function pn(e,n,t){let i=n.on==="record"||n.on==="field"?n.id:void 0,o=i?e.graph.getNode(i)?.kind:void 0;return o?e.schema.tryDefinition(o)?.edges?.[t]?.cardinality:void 0}async function _e(e,n){let t=Y(e,n),i=n.said??"Add one",o=new Set(n.store.allMutations().filter(c=>(c.creates??[]).length>0).map(c=>c.name)),r=t.catalog.candidates.filter(c=>c.type==="act"&&c.asks.length>0&&o.has(c.mutation));if(r.length===0)return M(t,i,"record","Nothing here makes a record.");let l=J(e);if(!l)return M(t,i,"record",X);let d;try{let c=await V(l,'You propose one new record for an app by filling in an act. Answer only JSON: {"act": a candidate id, "args": {argument: value}}. Use only the candidates, and fill every argument the act asks for with a value that fits the state.',JSON.stringify({ask:i,state:t.state,candidates:r.map(A=>({id:A.id,says:A.description,asks:A.asks}))}),t,t.meter),f=r.find(A=>A.id===c?.act),g=typeof c?.args=="object"&&c.args!==null?c.args:{};f&&(d={act:f,args:Object.fromEntries(Object.entries(g).filter(([A])=>f.asks.includes(A)))})}catch(c){return M(t,i,"record",c instanceof Error?c.message:String(c))}if(!d)return M(t,i,"record","The model named no act this app has here.");let a=t.usage.at(-1)?.model,k=Z(n.store,{interaction:t.id,target:n.target,basis:i,...a?{model:a}:{},proposals:[{id:d.act.id,label:d.act.label,said:d.act.description,call:{name:d.act.mutation,args:{...d.act.args,...d.args}}}]},n.principal);return k.proposals.length===0?M(t,i,"record","What the model proposed could not be made here."):{interaction:{...t.entry,ask:{kind:"record",said:i},offered:k.proposals.map(c=>({id:c.id,type:"act",label:c.said})),outcome:"offered",usage:[...t.usage]},offers:[d.act],ghost:k}}async function Ke(e,n){let t=Y(e,n),i=n.said??"Make a panel",o=t.catalog.candidates.filter(c=>c.type==="panel");if(o.length===0)return M(t,i,"panel","Nothing here can be drawn as a panel.");let r=Q(e),l=J(e),d;try{if(l){let c=await V(l,'You choose a panel to draw in an app. Answer only JSON: {"panel": a candidate id, "title": a short title}. Choose only among the candidates.',JSON.stringify({ask:i,state:t.state,candidates:o.map(g=>({id:g.id,says:g.description}))}),t,t.meter),f=o.find(g=>g.id===c?.panel);f&&(d={panel:f,...typeof c?.title=="string"&&c.title.trim()?{title:c.title.trim().slice(0,60)}:{}})}else if(r){let{question:c,of:f}=fe(o,`Which panel answers this best: ${i}`),g=ue((await ce(r,t.state,{panel:c},t.meter)).panel,f,1)[0];g?.candidate.type==="panel"&&(d={panel:g.candidate,confidence:g.confidence})}else return M(t,i,"panel",X)}catch(c){return M(t,i,"panel",c instanceof Error?c.message:String(c))}if(!d)return M(t,i,"panel","The model named no panel this app can draw.");let a=d.title??d.panel.label,k={title:a,recipe:{...d.panel.panel,title:a}};return{interaction:{...t.entry,ask:{kind:"panel",said:i},offered:[$e(d.panel,d.confidence)],outcome:"drawn",panel:k,usage:[...t.usage]},offers:[d.panel],panel:k}}function yn(e){return e.off?void 0:e.answer}var gn=`You answer a person's question about what they are looking at in an app, from the state given and nothing else. Answer only JSON: {"answer": one to three short sentences, "pick": [candidate ids that act on the answer, best first, at most three]}. Pick only ids from the candidates, and none when nothing fits. Never say an id to the person.`;async function Rn(e,n){let t=Y(e,n),i=n.said.trim(),o=t.catalog.candidates.filter(h=>We(h)||h.type==="panel"||h.type==="place"||h.type==="record").slice(0,32),r=yn(e),l=J(e),d=Q(e),a="",k=[],c=h=>h.flatMap(x=>o.filter(m=>m.id===x)).slice(0,3).map(x=>({candidate:x}));try{if(r){let h=await r.answer({said:i,target:n.target,targetLabel:t.entry.targetLabel,state:t.state,catalog:{target:t.catalog.target,candidates:o},...n.follows?{follows:n.follows}:{}}),x=h.usage?.inputTokens,m=h.usage?.outputTokens,u=h.usage?.costUsd??(x!==void 0?Oe(r.price,x,m??0):void 0);t.meter({tier:"thinking",model:r.model,...x!==void 0?{inputTokens:x}:{},...m!==void 0?{outputTokens:m}:{},...u!==void 0?{costUsd:u}:{}}),a=typeof h.text=="string"?h.text.trim():"",k=c(h.pick??[])}else if(l){let h=await V(l,gn,JSON.stringify({ask:i,about:t.entry.targetLabel,...n.follows?{follows:n.follows}:{},state:t.state,candidates:o.map(x=>({id:x.id,says:x.description}))}),t,t.meter);a=typeof h?.answer=="string"?h.answer.trim():"",k=c(Array.isArray(h?.pick)?h.pick:[])}else if(d&&o.length>0){let{question:h,of:x}=fe(o,`Which of these best answers, or acts on: ${i}`),m=await ce(d,{...t.state,asked:i,candidates:o.map(u=>({id:u.id,type:u.type,says:u.description}))},{answer:h},t.meter);k=ue(m.answer,x,3),a=k.length>0?`These fit \u201C${i}\u201D.`:""}else return M(t,i,"ask",X)}catch(h){return M(t,i,"ask",h instanceof Error?h.message:String(h))}if(!a&&k.length===0)return M(t,i,"ask","The AI had no answer to that here.");let f=t.usage.at(-1)?.model,g=k.flatMap(({candidate:h,confidence:x})=>{let m=le(h);return m?[{...m,...x!==void 0?{confidence:x}:{}}]:[]}),A=g.length>0?Z(n.store,{interaction:t.id,target:n.target,basis:i,...f?{model:f}:{},proposals:g},n.principal):void 0,$=k.map(({candidate:h})=>h).filter(h=>le(h)===void 0),b=[...$.map(h=>$e(h,k.find(x=>x.candidate===h)?.confidence)),...(A?.proposals??[]).map(h=>({id:h.id,type:h.field!==void 0?"fill":"act",label:h.label,...h.confidence!==void 0?{confidence:h.confidence}:{}}))];return{interaction:{...t.entry,ask:{kind:"ask",said:i},offered:b,outcome:"offered",...a?{answer:a}:{},usage:[...t.usage]},offers:$,...A&&A.proposals.length>0?{ghost:A}:{},...a?{answer:a}:{}}}function Z(e,n,t){let i=n.proposals.flatMap(o=>{try{let r=e.previewAll([o.call],{author:t}),l=r.ops.map(d=>d.intent).join("; ");return r.ops.length>0?[{...o,said:l||o.said}]:[]}catch{return[]}});return{...n,proposals:i}}function le(e){if(e.type==="fill")return{id:e.id,label:e.label,said:e.description,call:e.call,record:e.record,field:e.field};if(e.type==="act"&&e.asks.length===0)return{id:e.id,label:e.label,said:e.description,call:{name:e.mutation,args:{...e.args}}}}function Qe(e,n,t){let i=n.proposals.filter(r=>t.ids===void 0||t.ids.includes(r.id));if(i.length===0)return{ok:!1,refused:"Nothing was chosen."};let o=i.flatMap(r=>r.confidence===void 0?[]:[r.confidence]);try{let l=e.applyAll(i.map(d=>d.call),{author:t.author,via:`ai:${n.interaction}`,intent:n.basis,lineage:{basis:`Asked \u201C${n.basis}\u201D`,...n.model?{model:n.model}:{},...o.length>0?{confidence:Math.min(...o)}:{},interaction:n.interaction}}).ops[0]?.batch;return l?{ok:!0,batch:l,accepted:i.map(d=>d.id)}:{ok:!1,refused:"That changes nothing now."}}catch(r){return{ok:!1,refused:r instanceof Error?r.message:String(r)}}}function Ye(e,n,t){let i=e.ask.kind==="suggest"?n.length>0:e.offered.length>0&&e.offered.every(o=>n.includes(o.id));return{...e,outcome:i?"accepted":"partly",accepted:n,batches:[...e.batches??[],t]}}var Ve=e=>({...e,outcome:"dismissed"});var T=he(sn(),1);var S=he(De(),1);function Ze(e,n,t){let i=n.on==="selection"?n.ids:n.on==="record"||n.on==="field"?[n.id]:[],o=i.length>0?Je(e.store,i,{principal:e.principal,...i.length===1?{focus:i[0]}:{}}).affordances.map(r=>({mutation:r.mutation,label:r.label,args:r.args,open:r.open,why:r.why,...r.destructive?{destructive:!0}:{}})):void 0;return{store:e.store,target:n,principal:e.principal,interaction:Ce(),places:e.places,selection:e.selection,...o?{acts:o}:{},...e.place?{place:e.place}:{},...t?{said:t}:{}}}async function en(e,n,t){let i=await (__graviewPreload(import.meta.url,["./chunk.6KMXLUOS.js","./chunk.G4JJXA63.js","./chunk.LA7535VO.js","./chunk.ZEW2OOZ5.js","./chunk.ACEYGWMO.js","./chunk.3PT55HXT.js","./chunk.Q5WEOX3Q.js","./chunk.CRPT3ZT3.js","./chunk.LNNFNJKN.js","./chunk.EBLKEQ7O.js","./chunk.WVUJXDXZ.js","./chunk.VHWUGSFW.js","./chunk.P75TPZWT.js","./chunk.6W7J76TK.js","./chunk.FUR4IHWG.js","./chunk.2B4WVCVV.js","./chunk.AAZFVCSP.js","./chunk.GZLYTPE7.js","./chunk.4B73P2WA.js","./chunk.IMRCAU4T.js","./chunk.F5BCCGFK.js","./chunk.AJZBJBMO.js"]),import("./chunk.7G3B5QPH.js")),o=i.recipeDraft(n.recipe,{app:e.app,sight:i.draftSight(e.app,e.principal)});if(i.isDraftFailure(o))return o.failed;t?.(),e.seatTalk.setDraft(o,null),e.goTo.draft?.(),nn()}function nn(e=180){if(typeof document>"u")return;let n=document.querySelector('[data-testid="draft-keep"]'),t=document.activeElement,i=!t||t===document.body||t.closest?.("[inert]")!==null;if(n){i&&n.focus();return}e>0&&requestAnimationFrame(()=>nn(e-1))}async function ee(e,n,t,i,o){let r=Ze(e,t,i),l=n==="suggest"?await qe(e.ai,r):n==="fill"?await ze(e.ai,r):n==="record"?await _e(e.ai,r):await Ke(e.ai,r);if(l.interaction.outcome==="failed")return n!=="suggest"&&e.desk.record(l.interaction),l;let d=a=>{let k={...l.interaction,outcome:"failed",failed:a};return e.desk.record(k),{...l,interaction:k}};if(n==="fill"||n==="record"){if(!l.ghost||l.ghost.proposals.length===0)return d("Nothing here could be filled in.");o?.(),e.desk.setGhost({ghost:l.ghost}),e.desk.record(l.interaction)}if(n==="panel"&&l.panel){let a=await en(e,l.panel,o);if(a)return d(a);e.desk.record(l.interaction)}return l}var Te=new WeakMap,hn=64,Xe=new WeakMap;function mn(e){let n=Xe.get(e);if(!n){let t=n={n:0};Xe.set(e,t),e.subscribe(()=>void(t.n+=1))}return n.n}var tn=(e,n)=>{let t=K(n);return t.length>0?t.map(i=>e.graph.getNode(i)):[mn(e)]},on=(e,n)=>JSON.stringify({target:n,seat:e.principal}),rn=(e,n,t)=>{let i=tn(e.store,n);return t.schema===e.store.schema&&t.ai===e.ai&&i.length===t.depends.length&&i.every((o,r)=>o===t.depends[r])};function kn(e,n){let t=Te.get(e.store)?.get(on(e,n));return t?.result!==void 0&&rn(e,n,t)?t.result:void 0}function bn(e,n){let t=Te.get(e.store);t||Te.set(e.store,t=new Map);let i=on(e,n),o=t.get(i);if(o&&rn(e,n,o))return o.result?Promise.resolve(o.result):o.asked;let r=ee(e,"suggest",n),l={schema:e.store.schema,ai:e.ai,depends:tn(e.store,n),asked:r};t.delete(i),t.set(i,l),t.size>hn&&t.delete(t.keys().next().value);let d=t;return r.then(a=>{a.interaction.outcome!=="failed"?l.result=a:d.get(i)===l&&d.delete(i)}),r}async function An(e,n,t,i){let o=n.interaction,r=le(t);if(r){let l=o.usage?.at(-1)?.model,d=o.offered.find(k=>k.id===t.id)?.confidence,a=Z(e.store,{interaction:o.id,target:o.target,basis:`${o.ask.said}: ${t.label}`,...l?{model:l}:{},proposals:[{...r,...d!==void 0?{confidence:d}:{}}]},e.principal);if(a.proposals.length===0){let k="That can't be done now.";return e.desk.record({...o,outcome:"failed",failed:k}),k}i?.(),e.desk.setGhost({ghost:a}),e.desk.record(o);return}if(t.type==="panel"){let l=t.label,d={title:l,recipe:{...t.panel,title:l}},a=await en(e,d,i);return e.desk.record(a?{...o,outcome:"failed",failed:a}:{...o,outcome:"drawn",accepted:[t.id],panel:d}),a}i?.(),t.type==="place"?e.goTo.place(t.place):t.type==="record"&&e.goTo.record(t.record),e.desk.record({...o,outcome:"accepted",accepted:[t.id]})}async function Fn(e,n){if(n.ask.kind==="ask")return ke(e.desk,{target:n.target,asked:n.ask.said}),null;let t=n.ask.kind==="panel"||n.ask.kind==="record"?n.ask.kind:"fill";return ee(e,t,n.target,n.ask.said)}var B={padding:"5px 10px",fontSize:"0.875rem",borderRadius:8,width:"100%",textAlign:"left",borderWidth:1,borderStyle:"solid",borderColor:"transparent",background:"none",boxShadow:"none"},pe={margin:0,padding:"4px 10px",fontSize:"0.8125rem",color:"var(--graview-ink-muted)"};function Gn({target:e,close:n}){let t=Le(),i=(0,T.useMemo)(()=>Fe(e,y=>t.store.graph.has(y)),[e,t.store]),o=(0,T.useMemo)(()=>{let y=Ze(t,i);return de(t.store,i,{principal:t.principal,places:t.places,...y.acts?{acts:y.acts}:{}})},[t,i]),r=o.candidates.some(y=>y.type==="fill"),l=o.candidates.some(y=>y.type==="panel"),d=(0,T.useMemo)(()=>new Set(t.store.allMutations().filter(y=>(y.creates??[]).length>0).map(y=>y.name)),[t.store]),a=J(t.ai)!==void 0&&o.candidates.some(y=>y.type==="act"&&y.asks.length>0&&d.has(y.mutation)),k=Be(t.ai),c=kn(t,i),f=JSON.stringify(i),[g,A]=(0,T.useState)(!1),[$,b]=(0,T.useState)(null),[h,x]=(0,T.useState)(k&&c===void 0);(0,T.useEffect)(()=>{if(c!==void 0||!(k||g))return;let y=!0;return x(!0),bn(t,i).then(O=>{y&&(b(O),x(!1))}),()=>{y=!1}},[f,g]);let m=c??$,u=m?.interaction.outcome==="failed"?m.interaction.failed??"The AI could not suggest anything here.":null,v=(0,T.useRef)(!1),P=(0,T.useRef)(null);(0,T.useLayoutEffect)(()=>{m===null||!v.current||(v.current=!1,P.current?.querySelector("button")?.focus())},[m]);let W=(0,T.useRef)(!0);(0,T.useEffect)(()=>()=>{W.current=!1},[]);let[q,z]=(0,T.useState)(!1),[ne,s]=(0,T.useState)(null),p=y=>{if(q)return;z(!0),s(null);let O=!1;y(()=>{O=!0,n()}).then(w=>{W.current&&(z(!1),w?s(w):O||n())},w=>{W.current&&(z(!1),s(w instanceof Error?w.message:String(w)))})},C=y=>y.interaction.outcome==="failed"?y.interaction.failed??"The AI could not do that here.":void 0;return(0,S.jsxs)("div",{ref:P,"data-testid":"inline-ai",style:{display:"grid",gap:2},children:[h&&!g?(0,S.jsx)("p",{role:"status","data-testid":"inline-ai-thinking",style:pe,children:"Thinking\u2026"}):q?(0,S.jsx)("p",{role:"status","data-testid":"inline-ai-asking",style:pe,children:"Asking\u2026"}):ne?(0,S.jsx)("p",{role:"alert","data-testid":"inline-ai-failed",style:{...pe,color:"var(--graview-warn)"},children:ne}):u?(0,S.jsx)("p",{role:"status",style:pe,children:u}):null,(0,S.jsxs)("ul",{style:{margin:0,padding:0,listStyle:"none",display:"flex",flexDirection:"column",gap:2},children:[(m?.offers??[]).map(y=>(0,S.jsx)("li",{children:(0,S.jsxs)("button",{type:"button","data-menu-item":`ai-offer:${y.id}`,"data-ai-offer":y.id,"data-ai-offer-type":y.type,onClick:()=>p(O=>An(t,m,y,O)),style:B,children:[y.label,(0,S.jsxs)("span",{style:{color:"var(--graview-ink-faint)"},children:[" \xB7 ",y.type==="panel"?"a panel":y.type==="place"?"go there":y.type==="record"?"open it":"suggested"]})]})},y.id)),!k&&m===null?(0,S.jsx)("li",{children:(0,S.jsx)("button",{type:"button","data-menu-item":"ai-suggest","aria-disabled":g||void 0,onClick:y=>{g||(v.current=document.activeElement===y.currentTarget,A(!0))},style:B,children:g?"Thinking\u2026":"Suggest\u2026"})}):null,r?(0,S.jsx)("li",{children:(0,S.jsx)("button",{type:"button","data-menu-item":"ai-fill",onClick:()=>p(async y=>C(await ee(t,"fill",i,"Fill in",y))),style:B,children:"Fill in with AI"})}):null,a?(0,S.jsx)("li",{children:(0,S.jsx)("button",{type:"button","data-menu-item":"ai-record",onClick:()=>p(async y=>C(await ee(t,"record",i,"Add one",y))),style:B,children:"Add one with AI"})}):null,l?(0,S.jsx)("li",{children:(0,S.jsx)("button",{type:"button","data-menu-item":"ai-panel",onClick:()=>p(async y=>C(await ee(t,"panel",i,"Draw a panel",y))),style:B,children:"Draw a panel"})}):null,(0,S.jsx)("li",{children:(0,S.jsx)("button",{type:"button","data-menu-item":"ai-ask",onClick:()=>{let y=document.activeElement;n(),ke(t.desk,{target:i,returnTo:y instanceof HTMLElement&&y!==document.body?y:null})},style:B,children:"Ask about this\u2026"})})]})]})}var ye={display:"inline-flex",alignItems:"center",minHeight:28,padding:"2px 10px",fontSize:"0.8125rem",borderRadius:8};function Bn({placement:e="picture"}){let{store:n,principal:t,aiDesk:i}=He(),o=Ne(n,t),{ghost:r,entries:l}=je(i),[d,a]=(0,T.useState)(new Set);(0,T.useEffect)(()=>a(new Set),[r?.ghost.interaction]);let k=(0,T.useRef)(null),c=(0,T.useRef)(null),f=r?.batch;if((0,T.useEffect)(()=>{f!==void 0&&c.current?.focus()},[f]),!r)return null;let{ghost:g}=r,A=l.find(u=>u.id===g.interaction),$=()=>{let u=g.target.on==="record"||g.target.on==="field"?g.target.id:void 0,v=k.current?.closest("[data-graview-face], main")?.parentElement??document,P=(u?v.querySelector(`[data-graview-view="${CSS.escape(u)}"][tabindex]`):null)??document.querySelector("[data-graview-page-title]")??k.current?.closest("main")??document.querySelector("main");P&&!P.hasAttribute("tabindex")&&P.setAttribute("tabindex","-1"),P?.focus({preventScroll:!0}),i.setGhost(null)},b=g.proposals.filter(u=>!d.has(u.id)).map(u=>u.id),h=()=>{let u=Qe(o,g,{author:t,ids:b});if(!u.ok){i.setGhost({...r,refused:u.refused});return}A&&i.record(Ye(A,u.accepted,u.batch)),i.setGhost({ghost:g,batch:u.batch,took:u.accepted.length,...r.onCard?{onCard:!0}:{}})},x=()=>{A&&r.batch===void 0&&i.record(Ve(A)),$()},m=()=>{if(r.batch!==void 0)try{o.undo(r.batch,{author:t}),$()}catch(u){i.setGhost({...r,refused:u instanceof Error?u.message:String(u)})}};return(0,S.jsxs)("section",{ref:k,"data-testid":"ai-ghost","data-interaction":g.interaction,"aria-label":"Proposed by AI",style:{...e==="card"?{position:"static"}:{position:e==="page"?"fixed":"absolute",insetInline:"max(12px, calc(50% - 220px))",bottom:"calc(var(--graview-foot-room, 0px) + 72px)",zIndex:Ee("toast"),boxShadow:"var(--graview-lift-high)"},display:"grid",gap:8,padding:12,borderRadius:12,border:"1px dashed var(--graview-accent)",background:"var(--graview-float)",fontSize:"0.875rem"},children:[(0,S.jsx)("p",{style:{margin:0,color:"var(--graview-ink-muted)"},children:r.batch!==void 0?`Done: ${r.took===1?"one change":`${r.took} changes`}, as one.`:`Proposed by AI \xB7 ${g.basis}`}),r.batch===void 0?(0,S.jsx)("ul",{style:{margin:0,padding:0,listStyle:"none",display:"grid",gap:4},children:g.proposals.map(u=>(0,S.jsx)("li",{"data-ghost-proposal":u.id,children:(0,S.jsxs)("label",{style:{display:"flex",alignItems:"baseline",gap:8,cursor:"pointer"},children:[(0,S.jsx)("input",{type:"checkbox",checked:!d.has(u.id),onChange:v=>{let P=new Set(d);v.target.checked?P.delete(u.id):P.add(u.id),a(P)}}),(0,S.jsx)("span",{style:{fontStyle:"italic",color:"var(--graview-ink)"},children:u.said}),u.confidence!==void 0?(0,S.jsxs)("span",{style:{color:"var(--graview-ink-faint)"},children:[Math.round(u.confidence*100),"% sure"]}):null]})},u.id))}):null,r.refused?(0,S.jsx)("p",{role:"alert",style:{margin:0,color:"var(--graview-warn)"},children:r.refused}):null,(0,S.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:6},children:r.batch===void 0?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)("button",{type:"button","data-testid":"ghost-accept",disabled:b.length===0,onClick:h,style:ye,children:b.length===g.proposals.length?"Accept":`Accept ${b.length} of ${g.proposals.length}`}),(0,S.jsx)("button",{type:"button","data-testid":"ghost-dismiss",onClick:x,style:ye,children:"Dismiss"})]}):(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)("button",{type:"button",ref:c,"data-testid":"ghost-undo",onClick:m,style:ye,children:"Undo"}),(0,S.jsx)("button",{type:"button","data-testid":"ghost-close",onClick:$,style:ye,children:"Close"})]})})]})}export{Fe as a,K as b,de as c,fn as d,Rn as e,Ze as f,en as g,ee as h,kn as i,bn as j,An as k,Fn as l,Gn as m,Bn as n};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as j,b as D}from"./chunk.
|
|
1
|
+
import{a as j,b as D}from"./chunk.GXLAZGYT.js";import"./chunk.IB32NOV5.js";import"./chunk.ZEW2OOZ5.js";import"./chunk.7YQYWOZR.js";import{a as I}from"./chunk.3SM2CHKF.js";import"./chunk.E77K6KBX.js";import"./chunk.UT6642FC.js";import{a as k,b as V}from"./chunk.MB7LKKUD.js";import"./chunk.VHWUGSFW.js";import"./chunk.P75TPZWT.js";import"./chunk.6W7J76TK.js";import"./chunk.FUR4IHWG.js";import"./chunk.2B4WVCVV.js";import"./chunk.AAZFVCSP.js";import"./chunk.GZLYTPE7.js";import"./chunk.4B73P2WA.js";import"./chunk.IMRCAU4T.js";import"./chunk.BZ5VLPKB.js";import{F as Q,Q as H,ta as x}from"./chunk.6II4BONS.js";import{_ as B,gc as q}from"./chunk.F5BCCGFK.js";import{b}from"./chunk.AJZBJBMO.js";var t=b(Q(),1);var a=b(H(),1);function U(r){let n=[];return r.applied.length>0&&r.intent&&n.push(`${r.intent}.`),r.unchanged.length>0&&n.push(`${r.unchanged.length} already so.`),r.allOrNothing&&n.push("None of it was kept."),n.join(" ")}function ie({store:r,chosen:n,principal:d,context:v,via:S,anchor:E,of:g,onChooseAll:A,onClear:p,onActed:F}){let[K,W]=(0,t.useState)(0);(0,t.useEffect)(()=>r.subscribe(()=>W(e=>e+1)),[r]);let m=n.join(`
|
|
2
2
|
`),{acts:h,withheld:N}=(0,t.useMemo)(()=>j(r,n,{...d?{principal:d}:{},...v?{context:v}:{}}),[r,m,d,v,K]),[L,u]=(0,t.useState)(!1),[l,c]=(0,t.useState)(null),[s,O]=(0,t.useState)(null),w=(0,t.useRef)(null),M=(0,t.useId)(),f=(0,t.useMemo)(()=>[...new Set(n.map(e=>r.graph.getNode(e)?.kind))],[r,m]),_=f.length===1&&f[0]?`${B(r.schema,f[0],n.length)} chosen`:`${n.length} chosen`,P=typeof matchMedia=="function"&&matchMedia("(pointer: coarse), (max-width: 599px)").matches?2:3,C=h.filter(e=>!e.more),G=C.slice(0,P),T=[...C.slice(P),...h.filter(e=>e.more)];(0,t.useEffect)(()=>{c(null),u(!1)},[m]),(0,t.useLayoutEffect)(()=>{let e=w.current;if(!e)return;if(typeof e.showPopover=="function"&&!x(e))try{e.showPopover()}catch{}let i=()=>{V(e,E?.()??null),dispatchEvent(new Event(k))};i(),addEventListener("resize",i),addEventListener("scroll",i,!0);let o=typeof ResizeObserver=="function"?new ResizeObserver(i):null;return o?.observe(e),()=>{if(o?.disconnect(),removeEventListener("resize",i),removeEventListener("scroll",i,!0),e.isConnected&&x(e))try{e.hidePopover()}catch{}dispatchEvent(new Event(k))}},[E]);let y=(0,t.useRef)({asking:l,onClear:p});y.current={asking:l,onClear:p},(0,t.useEffect)(()=>{let e=i=>{if(i.key!=="Escape"||i.defaultPrevented)return;let o=document.activeElement;if(!(!(w.current?.contains(o)??!1)&&(o instanceof HTMLTextAreaElement||o instanceof HTMLInputElement&&o.type!=="checkbox"||o instanceof HTMLSelectElement))){if(i.preventDefault(),i.stopPropagation(),y.current.asking){c(null);return}y.current.onClear()}};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[]);let R=(e,i={})=>{let o=D(r,{mutation:e.mutation,subject:e.subject,args:{...e.args,...i},label:e.label},n,{...d?{author:d}:{},...S?{via:S}:{},...v?{context:v}:{}});c(null),u(!1),O(o.refused.length>0||o.applied.length===0?o:null),F(o.refused.map(z=>z.id))},J=e=>{O(null),u(!1),e.open.length>0?c(e):R(e)},$=e=>(0,a.jsxs)("button",{type:"button",className:"graview-several-act","data-testid":"several-act","data-act":e.id,"data-mutation":e.mutation,...e.destructive?{"data-tone":"warn"}:{},"aria-pressed":l?.id===e.id?!0:void 0,onClick:()=>J(e),children:[e.label,e.open.length>0?"\u2026":""]},e.id);return(0,a.jsxs)("div",{ref:w,popover:"manual",role:"region","aria-label":"The chosen records",className:"graview-several-bar","data-testid":"several-bar","data-graview-foot":"","data-graview-overlay":"","data-graview-popover":"","data-graview-offstage":"",style:X,children:[(0,a.jsx)("style",{children:Y}),(0,a.jsxs)("div",{className:"graview-several-line",children:[(0,a.jsx)("span",{role:"status","aria-live":"polite",className:"graview-several-count","data-testid":"several-count",children:_}),(0,a.jsxs)("div",{role:"group","aria-label":`What to do with the ${n.length} chosen`,className:"graview-several-acts",children:[G.map($),T.length>0?(0,a.jsx)("button",{type:"button",className:"graview-several-act","data-testid":"several-more","aria-expanded":L,"aria-controls":M,onClick:()=>u(e=>!e),children:"More"}):null,A&&g!==void 0&&g>n.length?(0,a.jsxs)("button",{type:"button",className:"graview-several-quiet","data-testid":"several-all",onClick:A,children:["Choose all ",g]}):null,(0,a.jsx)("button",{type:"button",className:"graview-several-quiet","data-testid":"several-clear","aria-keyshortcuts":"Escape",title:"Put the choice down \u2014 Escape",onClick:p,children:"Clear"})]})]}),L?(0,a.jsx)("div",{id:M,role:"group","aria-label":"More",className:"graview-several-acts","data-testid":"several-more-acts",children:T.map($)}):null,h.length===0?(0,a.jsx)("p",{className:"graview-several-said","data-testid":"several-none",children:N.length>0?`Nothing here can be done to all of them by you: ${N[0].message}`:"Nothing can be done to all of these at once."}):null,l?(0,a.jsx)("div",{className:"graview-several-ask",role:"group","aria-label":`${l.label}, for all ${n.length}`,"data-testid":"several-ask",children:(0,a.jsx)(I,{store:r,affordance:l.affordance,onApply:e=>R(l,e),onCancel:()=>c(null)})}):null,s?(0,a.jsxs)("div",{role:"alert",className:"graview-several-said","data-testid":"several-outcome",children:[U(s),s.refused.length>0?(0,a.jsxs)(a.Fragment,{children:[" ",s.refused.length===1?"One was not changed, and is still chosen:":`${s.refused.length} were not changed, and are still chosen:`,(0,a.jsx)("ul",{"data-testid":"several-refused",children:s.refused.map(e=>(0,a.jsxs)("li",{"data-record":e.id,children:["\u201C",e.label,"\u201D \u2014 ",e.message]},e.id))})]}):null]}):null]})}var X={position:"fixed",inset:"auto",margin:0,zIndex:q("toast"),boxSizing:"border-box",width:"max-content",height:"auto",bottom:"calc(16px + env(safe-area-inset-bottom, 0px))",left:16,overflow:"visible"},Y=`
|
|
3
3
|
.graview-several-bar{display:grid;gap:8px;padding:8px 10px;border:1px solid var(--graview-edge);border-radius:var(--graview-radius,12px);background:var(--graview-float);color:var(--graview-ink);box-shadow:var(--graview-lift-high);font-size:.875rem;line-height:1.4;max-height:70vh;overflow:auto}
|
|
4
4
|
.graview-several-line{display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px;min-width:0}
|