@note3/utils 0.0.21 → 0.0.24

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.
@@ -0,0 +1,2 @@
1
+ import{v as i,x as s}from"./chunk-7XDDTUI3.min.js";function A(t){return typeof t=="string"?t:JSON.stringify(t)}function u(t,n,p,e){let o=A(t),r=e??i({content:o,parentID:n,after:p,ts:s()},7);return{en:r,applogs:[{en:r,at:"block/content",vl:o}]}}function I(t,n,p,e){let o=e??i({blockID:t,childOf:n,after:p,ts:s()},7);return{en:o,applogs:[{en:o,at:"relation/block",vl:t},{en:o,at:"relation/childOf",vl:n},{en:o,at:"relation/after",vl:p}]}}function g(t,n,p){let e=[],{en:o,applogs:r}=u(t.content,n,p);if(e.push(...r),n){let{applogs:a}=I(o,n,p??null);e.push(...a)}let l=null;if(t.children)for(let a of t.children){let c=g(a,o,l);e.push(...c.applogs),l=c.blockID}return{blockID:o,applogs:e}}function ct(t,n){let p=[],e=[],o=null;for(let r of t){let l=g(r,n,o);p.push(...l.applogs),e.push(l.blockID),o=l.blockID}return{rootIDs:e,applogs:p}}function At(t){return g(t)}export{u as a,I as b,g as c,ct as d,At as e};
2
+ //# sourceMappingURL=chunk-GEH2WV7I.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tree-builder.ts"],"sourcesContent":["import type { ApplogForInsertOptionalAgent, EntityID } from '@wovin/core/applog'\nimport { dateNowIso, getHashID } from '@wovin/core/applog'\nimport type { TiptapContent } from './note3-utils-nodeps'\n\n/**\n * Represents a single node in a tree structure.\n * Content can be a string or a Tiptap JSON object.\n * Children are optional and can be recursively nested.\n */\nexport interface TreeNode {\n\t/** Content as string or Tiptap object (auto-serialized) */\n\tcontent: string | TiptapContent\n\t/** Optional child nodes */\n\tchildren?: TreeNode[]\n}\n\n/**\n * Result of creating a single node with its applogs\n */\nexport interface NodeCreationResult {\n\tblockID: EntityID\n\tapplogs: ApplogForInsertOptionalAgent[]\n}\n\n/**\n * Result of creating a tree with applogs\n */\nexport interface TreeCreationResult {\n\trootIDs: EntityID[]\n\tapplogs: ApplogForInsertOptionalAgent[]\n}\n\n/**\n * Serializes content to a string.\n * If content is a TiptapContent object, it's stringified.\n * If content is already a string, it's returned as-is.\n */\nfunction serializeContent(content: string | TiptapContent): string {\n\treturn typeof content === 'string' ? content : JSON.stringify(content)\n}\n\n/**\n * Creates block applogs for a single piece of content.\n * Generates an entity ID using getHashID, including positional context\n * (parent and after) to ensure uniqueness even for identical content.\n *\n * @param content - String or TiptapContent object\n * @param parentID - Optional parent ID for positional context in hash\n * @param after - Optional previous sibling ID for positional context in hash\n * @param entityID - Optional pre-computed entity ID\n * @returns Object with generated entityID and applogs array\n */\nexport function createBlockApplogs(\n\tcontent: string | TiptapContent,\n\tparentID?: EntityID,\n\tafter?: EntityID | null,\n\tentityID?: EntityID,\n): { en: EntityID; applogs: ApplogForInsertOptionalAgent[] } {\n\tconst serialized = serializeContent(content)\n\tconst en = entityID ?? getHashID({ content: serialized, parentID, after, ts: dateNowIso() }, 7)\n\n\tconst applog: ApplogForInsertOptionalAgent = {\n\t\ten,\n\t\tat: 'block/content',\n\t\tvl: serialized,\n\t}\n\n\treturn {\n\t\ten,\n\t\tapplogs: [applog],\n\t}\n}\n\n/**\n * Creates relation applogs that connect a block as a child of a parent.\n * Generates three applogs: one for the block reference, one for the parent reference,\n * and one for the sibling ordering (after).\n *\n * @param blockID - The ID of the child block\n * @param childOf - The ID of the parent block\n * @param after - The ID of the previous sibling (or null if first child)\n * @param relationID - Optional pre-computed relation entity ID\n * @returns Object with relation entity ID and applogs array\n */\nexport function createRelationApplogs(\n\tblockID: EntityID,\n\tchildOf: EntityID,\n\tafter: EntityID | null,\n\trelationID?: EntityID,\n): { en: EntityID; applogs: ApplogForInsertOptionalAgent[] } {\n\tconst en = relationID ?? getHashID({ blockID, childOf, after, ts: dateNowIso() }, 7)\n\n\tconst applogs: ApplogForInsertOptionalAgent[] = [\n\t\t{ en, at: 'relation/block', vl: blockID },\n\t\t{ en, at: 'relation/childOf', vl: childOf },\n\t\t{ en, at: 'relation/after', vl: after },\n\t]\n\n\treturn {\n\t\ten,\n\t\tapplogs,\n\t}\n}\n\n/**\n * Recursively creates applogs for a single node and its children.\n * Maintains proper sibling ordering using the 'after' field.\n *\n * @param node - The node to create\n * @param parentID - Optional parent block ID. If provided, creates a relation to parent.\n * @param after - Optional previous sibling ID for proper ordering\n * @returns Object with block ID and flattened applogs array\n */\nexport function createSingleNodeApplogs(\n\tnode: TreeNode,\n\tparentID?: EntityID,\n\tafter?: EntityID | null,\n): NodeCreationResult {\n\tconst allApplogs: ApplogForInsertOptionalAgent[] = []\n\n\t// Create the block for this node, including positional context in the hash\n\tconst { en: blockID, applogs: blockApplogs } = createBlockApplogs(node.content, parentID, after)\n\tallApplogs.push(...blockApplogs)\n\n\t// Create relation to parent if parentID is provided\n\tif (parentID) {\n\t\tconst { applogs: relationApplogs } = createRelationApplogs(blockID, parentID, after ?? null)\n\t\tallApplogs.push(...relationApplogs)\n\t}\n\n\t// Recursively create children with proper 'after' ordering\n\tlet lastChildID: EntityID | null = null\n\tif (node.children) {\n\t\tfor (const child of node.children) {\n\t\t\tconst childResult = createSingleNodeApplogs(child, blockID, lastChildID)\n\t\t\tallApplogs.push(...childResult.applogs)\n\t\t\tlastChildID = childResult.blockID\n\t\t}\n\t}\n\n\treturn {\n\t\tblockID,\n\t\tapplogs: allApplogs,\n\t}\n}\n\n/**\n * Creates applogs for multiple root nodes (nodes without a parent).\n * All nodes are created as standalone roots.\n *\n * @param nodes - Array of root nodes\n * @returns Object with array of root IDs and flattened applogs\n *\n * @example\n * const nodes: TreeNode[] = [\n * { content: 'Root 1', children: [{ content: 'Child 1' }] },\n * { content: 'Root 2' }\n * ]\n * const { rootIDs, applogs } = createTreeApplogs(nodes)\n */\nexport function createTreeApplogs(nodes: TreeNode[]): TreeCreationResult\n/**\n * Creates applogs for multiple nodes as children of a parent.\n * All nodes are created as children of the specified parent.\n *\n * @param nodes - Array of nodes\n * @param parentID - Parent block ID. Nodes will be created as children of this parent.\n * @returns Object with array of created block IDs and flattened applogs\n *\n * @example\n * const subtree: TreeNode[] = [\n * { content: 'Child 1' },\n * { content: 'Child 2' }\n * ]\n * const { rootIDs, applogs } = createTreeApplogs(subtree, 'existingParentID')\n */\nexport function createTreeApplogs(nodes: TreeNode[], parentID: EntityID): TreeCreationResult\n\nexport function createTreeApplogs(nodes: TreeNode[], parentID?: EntityID): TreeCreationResult {\n\tconst allApplogs: ApplogForInsertOptionalAgent[] = []\n\tconst rootIDs: EntityID[] = []\n\n\tlet afterID: EntityID | null = null\n\tfor (const node of nodes) {\n\t\tconst result = createSingleNodeApplogs(node, parentID, afterID)\n\t\tallApplogs.push(...result.applogs)\n\t\trootIDs.push(result.blockID)\n\t\tafterID = result.blockID\n\t}\n\n\treturn {\n\t\trootIDs,\n\t\tapplogs: allApplogs,\n\t}\n}\n\n/**\n * Creates applogs for a single root node with its descendants.\n * Convenience function that returns just the root block ID instead of an array.\n *\n * @param root - The root node\n * @returns Object with root block ID and applogs\n *\n * @example\n * const node: TreeNode = {\n * content: 'Parent',\n * children: [\n * { content: 'Child 1' },\n * { content: 'Child 2' }\n * ]\n * }\n * const { blockID, applogs } = createSingleTree(node)\n */\nexport function createSingleTree(root: TreeNode): NodeCreationResult {\n\treturn createSingleNodeApplogs(root)\n}\n"],"mappings":"mDAqCA,SAASA,EAAiBC,EAAyC,CAClE,OAAO,OAAOA,GAAY,SAAWA,EAAU,KAAK,UAAUA,CAAO,CACtE,CAaO,SAASC,EACfD,EACAE,EACAC,EACAC,EAC4D,CAC5D,IAAMC,EAAaN,EAAiBC,CAAO,EACrCM,EAAKF,GAAYG,EAAU,CAAE,QAASF,EAAY,SAAAH,EAAU,MAAAC,EAAO,GAAIK,EAAW,CAAE,EAAG,CAAC,EAQ9F,MAAO,CACN,GAAAF,EACA,QAAS,CARmC,CAC5C,GAAAA,EACA,GAAI,gBACJ,GAAID,CACL,CAIiB,CACjB,CACD,CAaO,SAASI,EACfC,EACAC,EACAR,EACAS,EAC4D,CAC5D,IAAMN,EAAKM,GAAcL,EAAU,CAAE,QAAAG,EAAS,QAAAC,EAAS,MAAAR,EAAO,GAAIK,EAAW,CAAE,EAAG,CAAC,EAQnF,MAAO,CACN,GAAAF,EACA,QAR+C,CAC/C,CAAE,GAAAA,EAAI,GAAI,iBAAkB,GAAII,CAAQ,EACxC,CAAE,GAAAJ,EAAI,GAAI,mBAAoB,GAAIK,CAAQ,EAC1C,CAAE,GAAAL,EAAI,GAAI,iBAAkB,GAAIH,CAAM,CACvC,CAKA,CACD,CAWO,SAASU,EACfC,EACAZ,EACAC,EACqB,CACrB,IAAMY,EAA6C,CAAC,EAG9C,CAAE,GAAIL,EAAS,QAASM,CAAa,EAAIf,EAAmBa,EAAK,QAASZ,EAAUC,CAAK,EAI/F,GAHAY,EAAW,KAAK,GAAGC,CAAY,EAG3Bd,EAAU,CACb,GAAM,CAAE,QAASe,CAAgB,EAAIR,EAAsBC,EAASR,EAAUC,GAAS,IAAI,EAC3FY,EAAW,KAAK,GAAGE,CAAe,CACnC,CAGA,IAAIC,EAA+B,KACnC,GAAIJ,EAAK,SACR,QAAWK,KAASL,EAAK,SAAU,CAClC,IAAMM,EAAcP,EAAwBM,EAAOT,EAASQ,CAAW,EACvEH,EAAW,KAAK,GAAGK,EAAY,OAAO,EACtCF,EAAcE,EAAY,OAC3B,CAGD,MAAO,CACN,QAAAV,EACA,QAASK,CACV,CACD,CAkCO,SAASM,GAAkBC,EAAmBpB,EAAyC,CAC7F,IAAMa,EAA6C,CAAC,EAC9CQ,EAAsB,CAAC,EAEzBC,EAA2B,KAC/B,QAAWV,KAAQQ,EAAO,CACzB,IAAMG,EAASZ,EAAwBC,EAAMZ,EAAUsB,CAAO,EAC9DT,EAAW,KAAK,GAAGU,EAAO,OAAO,EACjCF,EAAQ,KAAKE,EAAO,OAAO,EAC3BD,EAAUC,EAAO,OAClB,CAEA,MAAO,CACN,QAAAF,EACA,QAASR,CACV,CACD,CAmBO,SAASW,GAAiBC,EAAoC,CACpE,OAAOd,EAAwBc,CAAI,CACpC","names":["serializeContent","content","createBlockApplogs","parentID","after","entityID","serialized","en","getHashID","dateNowIso","createRelationApplogs","blockID","childOf","relationID","createSingleNodeApplogs","node","allApplogs","blockApplogs","relationApplogs","lastChildID","child","childResult","createTreeApplogs","nodes","rootIDs","afterID","result","createSingleTree","root"]}
@@ -0,0 +1,2 @@
1
+ import{A as Z,B as C,a as M,b as _,c as q,d as E,e as J,f as A,g as H,h as T,i as B,j as W,k as j,l as u,m as F,n as $,o as k,p as h,q as V,r as f,s as Q,t as X,u as Y,w as G,y as x,z as w}from"./chunk-7XDDTUI3.min.js";var{WARN:ue,LOG:we,DEBUG:de,VERBOSE:U,ERROR:Oe}=W.setup(W.INFO),pe=f("queryDivergencesByPrev",function(e){de(`queryDivergencesByPrev<${e.nameAndSizeUntracked}>`),e.filters.includes("lastWriteWins")&&ue("queryDivergencesByPrev on thread lastWriteWins",e);let t=h(()=>{let s=new Map,i=new Set;U("all applogs:",e.applogs);for(let n of e.applogs){let a;n.pv&&(a=n.pv&&s.get(n.pv.toString()),i.delete(n.pv.toString())),U("traversing log",{log:n,prevLogs:a,leafs:Array.from(i)}),s.set(n.cid,a?[...a,n]:[n]),i.add(n.cid)}return Array.from(i).map(n=>{let a=new C(u({caller:"DivergenceLeaf",thread:e,pattern:`leaf: ${n}`}),s.get(n),e.filters,!0);return{log:a.latestLog,thread:a}})},{name:u({caller:"queryDivergencesByPrev",thread:e})});return U.isDisabled||A(()=>U("[queryDivergencesByPrev] result:",T(t))),t},{equals:M.structural});var ee=class{constructor(r,e,t=null){this.logsOfThisNode=r,this.variables=e,this.prevNode=t,B(this,{threadOfTrail:q})}get record(){return this.variables}get threadOfTrail(){return this.prevNode?x([this.logsOfThisNode,this.prevNode.threadOfTrail]):this.logsOfThisNode}get trailLogs(){return this.threadOfTrail.applogs}},P=class{constructor(r){this.nodes=r,B(this,{threadOfAllTrails:q,size:q,isEmpty:q})}get size(){return this.records.length}get isEmpty(){return this.records.length===0}get untrackedSize(){return E(()=>this.records.length)}get records(){return h(()=>this.nodes.map(({variables:r})=>r),{name:"QueryResult.records"})}get leafNodeThread(){return x(h(()=>this.nodes.map(({logsOfThisNode:r})=>r),{name:"QueryResult.leafNodeThread"}))}get leafNodeLogSet(){return h(()=>this.nodes.map(({logsOfThisNode:r})=>r.applogs),{name:"QueryResult.leafNodeLogSet"})}get leafNodeLogs(){return h(()=>this.nodes.flatMap(({logsOfThisNode:r})=>r.applogs),{name:"QueryResult.leafNodeLogs"})}get threadOfAllTrails(){return x(h(()=>this.nodes.map(r=>r.threadOfTrail),{name:"QueryResult.threadOfAllTrails"}))}get thread(){return this.threadOfAllTrails}get allApplogs(){return this.threadOfAllTrails.applogs}},{WARN:Te,LOG:I,DEBUG:N,VERBOSE:o,ERROR:O}=W.setup(W.INFO,{prefix:"[q]"}),L=null,ce=f("lastWriteWins",function(e,{inverseToOnlyReturnFirstLogs:t,tolerateAlreadyFiltered:s}={}){if(o(`lastWriteWins${t?".inversed":""} < ${e.nameAndSizeUntracked} > initializing`),e.filters.includes("lastWriteWins")){if(s)return N("[lastWriteWins] already filtered, but tolerateAlreadyFiltered=true, so returning"),e;throw O("thread already filtered lastWriteWins:",e.filters,{name:e.name})}let i,n=Z(e,function(l,y){let p=Q(l),c,v=[],m=p?null:[];p?(i=new Map,c=l.init):c=l.added;let b;for(let g=t?0:c.length-1;t?g<c.length:g>=0;t?g++:g--){let d=c[g],z=d.en+"|"+d.at;if(b&&(t?b>d.ts:b<d.ts))throw O("lastWriteWins.mapper logs not sorted:",b,t?">":"<",d.ts,{log:d,i:g,newLogs:c,inverseToOnlyReturnFirstLogs:t});b=d.ts;let S=i.get(z);(!S||(t?S.ts>d.ts:S.ts<d.ts))&&(S&&!p&&m.push(S),v.push(d),i.set(z,d))}return Y(v),o.isDisabled||o(`lastWriteWins${t?".inversed":""}<${e.nameAndSizeUntracked}> mapped event`,p?{...Object.fromEntries(Object.entries(l).map(([g,d])=>[g,d?.length])),toAdd:v.length,toRemove:m}:{...l,toAdd:v,toRemove:m}),p?{init:v}:{added:v,removed:m}},{name:`lastWriteWins${t?".inversed":""}`,extraFilterName:"lastWriteWins"});return o.isDisabled||A(()=>{o(`lastWriteWins<${e.nameAndSizeUntracked}> filtered down to`,n.applogs.length)}),n},{equals:$,argsDebugName:r=>u({caller:"lastWriteWins",thread:r})}),fe=f("withoutDeleted",function(e){if(o.isEnabled&&o(`withoutDeleted<${e.nameAndSizeUntracked}>`),e.filters.includes("withoutDeleted"))throw O("thread already filtered withoutDeleted:",e.filters,{name:e.name});let t=w(e,{at:["isDeleted","relation/isDeleted","block/isDeleted"],vl:!0},{name:"isDeleted"});o.isEnabled&&o(`withoutDeleted<${e.nameAndSizeUntracked}> deletionLogs:`,E(function(){return[...t.applogs]}));let s=u({caller:"allDeletedEntities",thread:e}),i=V(function(){return t.map(a=>a.en)},{name:s});return o.isEnabled&&A(()=>{o(`withoutDeleted<${e.nameAndSizeUntracked}> deleted:`,[...i])}),w(e,{"!en":i},{name:"withoutDeleted",extraFilterName:"withoutDeleted"})},{equals:$}),D=f("query",function r(e,t,s={},i={}){le();let n=K(e);N(`query<${n.nameAndSizeUntracked}>:`,t);let a=Array.isArray(t)?t:[t],l;if(a.length===1)l=null;else{let c=a.slice(0,-1);l=r(n,c,s,i)}let y=a[a.length-1],p=te(n,l,y,i);return o.isDisabled||A(()=>o("query result:",T(p))),p},{equals:k,argsDebugName:(r,e,t)=>u({caller:"query",thread:r,args:t?{pattern:e,startVars:t}:e})}),te=f("queryStep",function(e,t,s,i={}){if(N(`queryStep<${e.nameAndSizeUntracked}> with`,t?.untrackedSize??"all","nodes, pattern:",s),!Object.entries(s).length)throw new Error("Pattern is empty");function n(l){let[y,p]=G(s,l?.variables??{});o("[queryStep.doQuery] patternWithoutVars: ",y);let c=w(e,y),v=R(p),m=h(function(){let g=c.map(d=>({log:d,vars:v(d)}));return o.isEnabled&&o("[queryStep.doQuery] step node:",l?.variables," =>",g,"from:",E(()=>c.applogs)),g.map(({log:d,vars:z})=>{let S=Object.assign({},l?.variables,z);return new ee(X.fromArray([d],u({caller:"QueryNode",thread:c,pattern:`${j(S)}@${j(y)}`})),S,l)})},{name:u({caller:"doQuery.mapNodes",thread:c,pattern:s})});return o.isEnabled&&A(()=>o("[queryStep.doQuery] resultNodes:",[...m])),i.debug&&I("[queryStep] step result:",E(()=>m.map(({variables:b,logsOfThisNode:g})=>({variables:b,thread:g})))),m}let a=h(function(){return N(`[queryStep] Running with ${t?.nodes?.length} input nodes:`),t?[...t.nodes.flatMap(n)]:[...n(null)]},{name:u({caller:"queryStep",thread:e,pattern:s})});return o.isEnabled&&A(()=>o("[queryStep] observableResultNodes:",[...a])),new P(a)},{equals:k,argsDebugName:(r,e,t)=>u({caller:"queryStep",thread:r,pattern:t})}),ge=f("queryNot",function(e,t,s,i={}){let n=t.nodes;N(`queryNot<${e.nameAndSizeUntracked}> from: ${n.length} nodes`);let a=Array.isArray(s)?s:[s];for(let l of a){if(!Object.entries(s).length)throw new Error("Pattern is empty");n=n.filter(function({variables:p}){let[c,v]=G(l,p??{});o("[queryNot] patternWithoutVars: ",c);let m=w(e,c);return o("[queryNot] step node:",p," =>",m.size,"applogs"),o.isDisabled||o("[queryNot] step node:",p," => empty?",E(()=>m.applogs)),i.debug&&I("[queryNot] node result:",p,"=>",m.applogs),m.isEmpty})}return new P(n)},{equals:k,argsDebugName:(r,e,t)=>u({caller:"queryNot",thread:r,pattern:t})}),ye=f("filterAndMap",function(e,t,s){N(`filterAndMap<${e.nameAndSizeUntracked}>`,t);let i=w(e,t);o.isEnabled&&(o("[filterAndMap] filtered:",i.untrackedSize),A(()=>o("[filterAndMap] filtered:",i.applogs)));let n=u({thread:e,pattern:t,caller:"filterAndMap"}),a=h(()=>se(i,s),{name:n});return o.isDisabled||A(()=>o("[filterAndMap] mapped:",a)),a},{equals:M.structural,argsDebugName:(r,e)=>u({caller:"filterAndMap",thread:r,pattern:e})}),me=f("queryAndMap",function(e,t,s,i={}){let n=K(e);N(`queryAndMap<${n.nameAndSizeUntracked}>`,{patternOrPatterns:t,variables:i,map:s});let a=u({thread:n,caller:"queryAndMap"}),l=D(n,t);o("[queryAndMap] filtered count:",l.untrackedSize);let y=h(()=>ie(l,s),{name:a});return o.isDisabled||A(()=>o("[queryAndMap] result:",T(y))),y},{equals:M.structural,argsDebugName:(r,e)=>u({caller:"queryAndMap",thread:r,pattern:e})}),he=f("queryEntity",function(e,t,s,i){N(`queryEntity<${e.nameAndSizeUntracked}>`,s,t);let n=w(e,{en:s,at:ae(t,i)});return o("queryEntity applogs:",n.applogs),q(()=>n.isEmpty?null:Object.fromEntries(n.map(({at:a,vl:l})=>[a.slice(t.length+1),l])))},{equals:F,argsDebugName:(r,e,t)=>u({caller:"queryEntity",thread:r,args:{name:e,entityID:t}})}),ve=f("agentsOfThread",function(e){N(`agentsOfThread<${e.nameAndSizeUntracked}>`);let t=_.map(),s=J(n=>{for(let a of Q(n)?n.init:n.added){let l=t.get(a.ag)??0;t.set(a.ag,l+1)}for(let a of!Q(n)&&n.removed||[]){let l=t.get(a.ag);if(!l||l<1)throw O("[agentsOfThread] number is now negative",{log:a,event:n,mapped:t,prev:l});t.set(a.ag,l-1)}I(`agentsOfThread<${e.nameAndSizeUntracked}> processed event`,{event:n,mapped:t})});s({init:e.applogs});let i=e.subscribe(s);return H(t,i),t}),re=f("entityOverlap",function(e,t){return I(`entityOverlap<${e.nameAndSizeUntracked}, ${t.nameAndSizeUntracked}>`),q(()=>{let s=new Set(e.map(n=>n.en)),i=new Set(t.map(n=>n.en));return[...s].filter(n=>i.has(n))})});var Ae=f("entityOverlapCount",function(e,t){return q(()=>re(e,t).get().length)}),ne=f("querySingle",function(e,t,s={}){let i=D(e,t,s);return q(()=>{if(i.isEmpty)return null;if(i.size>1)throw O("[querySingle] got",i.size,"results:",i);let n=i.nodes[0].logsOfThisNode;if(n.size!=1)throw O("[querySingle] single result, but got",n.size,"logs:",n.applogs);return n.applogs[0]})},{equals:M.structural,argsDebugName:(r,e)=>u({caller:"querySingle",thread:r,pattern:e})}),be=f("querySingleAndMap",function(e,t,s,i={}){let n=ne(e,t,i);return q(()=>{let a=n.get();if(a)return typeof s=="string"?a[s]:R(s)(a)})},{equals:M.structural,argsDebugName:(r,e)=>u({caller:"querySingleAndMap",thread:r,pattern:e})}),se=function(e,t){return typeof t=="function"?e.map(t):typeof t=="string"?e.map(s=>s[t]):e.map(R(t))},ie=function(e,t){return typeof t=="function"?e.records.map(t):typeof t=="string"?e.nodes.map(s=>{if(!Object.hasOwn(s.record,t)){if(s.logsOfThisNode.size!==1)throw O(`not sure what to map (it's not a var and a result node log count of ${s.logsOfThisNode.size})`);return s.logsOfThisNode.firstLog[t]}return s.record[t]}):e.nodes.map(s=>R(t)(e))};function R(r){return e=>Object.entries(r).reduce((t,[s,i])=>(t[i]=e[s],t),{})}function ae(r,e){return e.map(t=>oe(r,t))}function oe(r,e){return`${r}/${e}`}function K(r,e){return Array.isArray(r)?C.fromArray(r,e||`threadFromArray[${r.length}]`,!0):r}function le(){if(L!=null&&performance.now()>=L)throw new qe(L)}var qe=class extends Error{constructor(r){super(r)}};function Ne(r,e,t,s){let i=function(a,l,y){if(y.includes(a))throw new Error(`[mapAndRecurseKids.loop] Circular reference detected: ${a}`);if(y.length>42)throw new Error("[mapAndRecurseKids.maxDepth] Maximum recursion depth (42) exceeded");let p=t({blockID:a,relID:l}),v=D(r,[{en:"?kidRelID",at:"relation/childOf",vl:a},{en:"?kidRelID",at:"relation/block",vl:"?kidID"}]).records.map(function({kidID:b,kidRelID:g}){return i(b,g,[...y,a])});return s(p,v)};return i(e,null,[])}function tt(r,e){let t=[];return Ne(r,e,({blockID:s,relID:i})=>{let n=D(r,[{en:s}]);if(t.push(...n.threadOfAllTrails.applogs),i){let a=D(r,[{en:i}]);t.push(...a.threadOfAllTrails.applogs)}},(s,i)=>{}),t}export{Ne as a,tt as b};
2
+ //# sourceMappingURL=chunk-WZPDIIA2.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../@wovin/core/src/query/divergences.ts","../../../@wovin/core/src/query/matchers.ts","../../../@wovin/core/src/query/types.ts","../../../@wovin/core/src/query/basic.ts","../src/applog-collection.ts"],"sourcesContent":["import { Logger } from 'besonders-logger'\nimport { autorun, comparer, toJS } from 'mobx'\nimport stringify from 'safe-stable-stringify'\nimport { Applog, CidString } from '../applog/datom-types'\nimport { computedFnDeepCompare, createDebugName, observableArrayMap } from '../mobx/mobx-utils'\nimport { Thread } from '../thread/basic'\nimport { ThreadInMemory } from '../thread/writeable'\n\nconst { WARN, LOG, DEBUG, VERBOSE, ERROR } = Logger.setup(Logger.INFO) // eslint-disable-line no-unused-vars\n\nexport interface DivergenceLeaf {\n\tlog: Applog\n\tthread: Thread\n}\n\nexport const queryDivergencesByPrev = computedFnDeepCompare('queryDivergencesByPrev', function queryConflictingByPrev(\n\tsourceThread: Thread,\n) {\n\tDEBUG(`queryDivergencesByPrev<${sourceThread.nameAndSizeUntracked}>`)\n\tif (sourceThread.filters.includes('lastWriteWins')) WARN(`queryDivergencesByPrev on thread lastWriteWins`, sourceThread)\n\n\tconst divergences = observableArrayMap(() => {\n\t\tconst logsForNode = new Map<CidString, Applog[]>()\n\t\tconst leafs = new Set<CidString>()\n\t\tVERBOSE('all applogs:', sourceThread.applogs)\n\t\tfor (const log of sourceThread.applogs) {\n\t\t\tlet prevLogs\n\t\t\tif (log.pv) {\n\t\t\t\tprevLogs = log.pv && logsForNode.get(log.pv.toString())\n\t\t\t\tleafs.delete(log.pv.toString())\n\t\t\t}\n\t\t\tVERBOSE('traversing log', { log, prevLogs, leafs: Array.from(leafs) })\n\t\t\tlogsForNode.set(log.cid, prevLogs ? [...prevLogs, log] : [log])\n\t\t\tleafs.add(log.cid)\n\t\t}\n\t\treturn Array.from(leafs).map(leafID => {\n\t\t\t// TODO use MappedThread?\n\t\t\tconst thread = new ThreadInMemory(\n\t\t\t\tcreateDebugName({\n\t\t\t\t\tcaller: 'DivergenceLeaf',\n\t\t\t\t\tthread: sourceThread,\n\t\t\t\t\tpattern: `leaf: ${leafID}`,\n\t\t\t\t}),\n\t\t\t\tlogsForNode.get(leafID),\n\t\t\t\tsourceThread.filters,\n\t\t\t\ttrue,\n\t\t\t\t// TODO: sourceThread,\n\t\t\t)\n\t\t\treturn ({ log: thread.latestLog, thread })\n\t\t})\n\t}, { name: createDebugName({ caller: 'queryDivergencesByPrev', thread: sourceThread }) })\n\tVERBOSE.isDisabled || autorun(() => VERBOSE(`[queryDivergencesByPrev] result:`, toJS(divergences)))\n\treturn divergences\n}, { equals: comparer.structural })\n\n// export const queryDivergencesOfEnAtByPrev = computedFnDeepCompare('queryDivergencesOfEnAtByPrev', function queryDivergencesOfEnAtByPrev(\n// \tsourceThread: Thread,\n// ) {\n// \tDEBUG(`queryDivergencesOfEnAtByPrev<${sourceThread.nameAndSizeUntracked}>`)\n// \tif (sourceThread.filters.includes('lastWriteWins')) WARN(`queryDivergencesOfEnAtByPrevFon thread lastWriteWins`, sourceThread)\n\n// \tconst divergences = observableArrayMap(() => {\n// \t\tconst logsForNode = new Map<CidString, Applog[]>()\n// \t\tconst leafs = new Map<string, Set<CidString>>() // [en,at]\n// \t\tVERBOSE('all applogs:', sourceThread.applogs)\n// \t\tfor (const log of sourceThread.applogs) {\n// \t\t\tconst key = stringify([log.en, log.at])\n// \t\t\tif (!leafs.has(key)) leafs.set(key, new Set())\n// \t\t\tlet prevLogs\n// \t\t\tif (log.pv) {\n// \t\t\t\tprevLogs = log.pv && logsForNode.get(log.pv.toString())\n// \t\t\t\tleafs.get(key).delete(log.pv.toString())\n// \t\t\t}\n// \t\t\tVERBOSE('traversing log', { key, log, prevLogs, leafs: Array.from(leafs) })\n// \t\t\tlogsForNode.set(log.cid, prevLogs ? [...prevLogs, log] : [log])\n// \t\t\tleafs.get(key).add(log.cid)\n// \t\t}\n// \t\treturn Array.from(leafs.entries()).map(([_enAt, leafs]) => {\n// \t\t\t// TODO use MappedThread?\n// \t\t\tconst thread = new ThreadInMemory(\n// \t\t\t\tcreateDebugName({\n// \t\t\t\t\tcaller: 'DivergenceLeaf',\n// \t\t\t\t\tthread: sourceThread,\n// \t\t\t\t\tpattern: `leaf: ${leafID}`,\n// \t\t\t\t}),\n// \t\t\t\tlogsForNode.get(leafID),\n// \t\t\t\tsourceThread.filters,\n// \t\t\t\ttrue,\n// \t\t\t\t// TODO: sourceThread,\n// \t\t\t)\n// \t\t\treturn ({ log: thread.latestLog, thread })\n// \t\t})\n// \t}, { name: createDebugName({ caller: 'queryDivergencesOfEnAtByPrev', thread: sourceThread }) })\n// \tVERBOSE.isDisabled || autorun(() => VERBOSE(`[queryDivergencesOfEnAtByPrev] result:`, toJS(divergences)))\n// \treturn divergences\n// }, { equals: comparer.structural })\n","import { DatomPart } from '../applog/datom-types'\n\nexport function includes(str: string) {\n\treturn (vl: DatomPart) => vl?.includes?.(str)\n}\nexport function includedIn(arr: string[]) {\n\treturn (vl: DatomPart) => arr?.includes?.(vl)\n}\n","import { computed, makeObservable, untracked } from 'mobx'\nimport { joinThreads } from '../applog/applog-helpers'\nimport { SearchContext } from '../applog/datom-types'\nimport { observableArrayMap } from '../mobx/mobx-utils'\nimport type { Thread } from '../thread/basic'\nimport { ReadonlyObservableArray } from '../types/typescript-utils'\n\nexport class QueryNode {\n\tconstructor(\n\t\treadonly logsOfThisNode: Thread,\n\t\treadonly variables: SearchContext,\n\t\treadonly prevNode: QueryNode | null = null,\n\t) {\n\t\tmakeObservable(this, {\n\t\t\tthreadOfTrail: computed, // ? intuitively only put the ones here that felt expensive to compute (join)\n\t\t})\n\t}\n\tget record() {\n\t\treturn this.variables // alias for end-user consumption\n\t}\n\n\tget threadOfTrail() {\n\t\tif (!this.prevNode) return this.logsOfThisNode\n\t\treturn joinThreads([\n\t\t\tthis.logsOfThisNode,\n\t\t\tthis.prevNode.threadOfTrail,\n\t\t])\n\t}\n\tget trailLogs() {\n\t\treturn this.threadOfTrail.applogs\n\t}\n}\n/**\n * The result of a query (-step)\n */\nexport class QueryResult {\n\tconstructor(\n\t\tpublic nodes: ReadonlyObservableArray<QueryNode>,\n\t) {\n\t\tmakeObservable(this, {\n\t\t\tthreadOfAllTrails: computed, // ? intuitively only put the ones here that felt expensive to compute (join)\n\t\t\tsize: computed, // ... or cheap to cache\n\t\t\tisEmpty: computed,\n\t\t})\n\t}\n\n\tget size() {\n\t\treturn this.records.length\n\t}\n\tget isEmpty() {\n\t\treturn this.records.length === 0\n\t}\n\tget untrackedSize() {\n\t\treturn untracked(() => this.records.length)\n\t}\n\n\tget records() {\n\t\treturn observableArrayMap(() => this.nodes.map(({ variables }) => variables), { name: 'QueryResult.records' })\n\t}\n\tget leafNodeThread() {\n\t\treturn joinThreads(\n\t\t\tobservableArrayMap(() => this.nodes.map(({ logsOfThisNode: thread }) => thread), { name: 'QueryResult.leafNodeThread' }),\n\t\t)\n\t}\n\tget leafNodeLogSet() {\n\t\treturn observableArrayMap(() => this.nodes.map(({ logsOfThisNode: thread }) => thread.applogs), { name: 'QueryResult.leafNodeLogSet' })\n\t}\n\tget leafNodeLogs() {\n\t\treturn observableArrayMap(() => this.nodes.flatMap(({ logsOfThisNode: thread }) => thread.applogs), {\n\t\t\tname: 'QueryResult.leafNodeLogs',\n\t\t})\n\t}\n\t// get trailThreads() {\n\t// \treturn observableArrayMap(() => this.nodes.map(({ trailThread }) => trailThread))\n\t// }\n\tget threadOfAllTrails() {\n\t\treturn joinThreads(observableArrayMap(() => this.nodes.map(node => node.threadOfTrail), { name: 'QueryResult.threadOfAllTrails' }))\n\t}\n\tget thread() {\n\t\treturn this.threadOfAllTrails // alias\n\t}\n\tget allApplogs() {\n\t\treturn this.threadOfAllTrails.applogs // mostly for easy logging\n\t}\n}\n","import { AgentHash, Applog, ApplogValue, DatalogQueryPattern, EntityID, SearchContext, ValueOrMatcher } from '../applog/datom-types'\n\nimport { Logger } from 'besonders-logger'\nimport { action, autorun, comparer, computed, makeObservable, observable, onBecomeObserved, toJS, untracked } from 'mobx'\n\nimport { isEmpty } from 'lodash-es'\nimport stringify from 'safe-stable-stringify'\nimport { resolveOrRemoveVariables, sortApplogsByTs } from '../applog/applog-utils'\nimport {\n\tapplogThreadComparer,\n\tcomputedFnDeepCompare,\n\tcomputedStructuralComparer,\n\tcreateDebugName,\n\tobservableArrayMap,\n\tobservableSetMap,\n\tqueryNodesComparer,\n} from '../mobx/mobx-utils'\nimport { isInitEvent, StaticThread, Thread, ThreadEvent } from '../thread/basic'\nimport { rollingFilter, rollingMapper, ThreadOnlyCurrent } from '../thread/filters'\nimport { MappedThread } from '../thread/mapped'\nimport { ThreadInMemory } from '../thread/writeable'\nimport { QueryNode, QueryResult } from './types'\n\nconst { WARN, LOG, DEBUG, VERBOSE, ERROR } = Logger.setup(Logger.INFO, { prefix: '[q]' }) // eslint-disable-line no-unused-vars\n\nlet globalQueryTimeoutTime = null\n\n// util.inspect.defaultOptions.depth = 5;\n\n// export interface QueryExecutorArguments {\n// db: Thread\n// // applogs: AppLog[]\n// nodes: SearchContextWithLog[]\n// }\n// export interface QueryExecutorResult {\n// // applogs: AppLog[]\n// nodes: SearchContextWithLog[]\n// }\n// export type QueryExecutor = (args: QueryExecutorArguments) => QueryExecutorResult\n\n/////////////\n// QUERIES //\n/////////////\n\n/**\n * Keep only the latest logs for each en&at (= last write wins)\n */\nexport const lastWriteWins = computedFnDeepCompare('lastWriteWins', function lastWriteWins(\n\tthread: Thread,\n\t{ inverseToOnlyReturnFirstLogs, tolerateAlreadyFiltered }: {\n\t\tinverseToOnlyReturnFirstLogs?: boolean\n\t\ttolerateAlreadyFiltered?: boolean\n\t} = {},\n): ThreadOnlyCurrent {\n\tVERBOSE(`lastWriteWins${inverseToOnlyReturnFirstLogs ? '.inversed' : ''} < ${thread.nameAndSizeUntracked} > initializing`)\n\t// if (thread.name.includes('lastWriteWins')) WARN(`thread already contains lastWriteWins:`, thread.name)\n\tif (thread.filters.includes('lastWriteWins')) {\n\t\tif (tolerateAlreadyFiltered) {\n\t\t\tDEBUG(`[lastWriteWins] already filtered, but tolerateAlreadyFiltered=true, so returning`)\n\t\t\treturn thread as ThreadOnlyCurrent\n\t\t}\n\t\tthrow ERROR(`thread already filtered lastWriteWins:`, thread.filters, { name: thread.name })\n\t}\n\n\tlet rollingMap: Map<string, Applog>\n\tconst mappedThread = rollingMapper(thread, function lastWriteWinsMapper(event, sourceThread) {\n\t\tconst isInitial = isInitEvent(event)\n\n\t\tlet newLogs: readonly Applog[]\n\t\tconst toAdd = [] as Applog[]\n\t\tconst toRemove = isInitial ? null : [] as Applog[]\n\t\tif (isInitial) {\n\t\t\trollingMap = new Map()\n\t\t\tnewLogs = event.init\n\t\t} else {\n\t\t\tnewLogs = event.added\n\t\t}\n\n\t\tlet tsCheck: string\n\t\tfor (\n\t\t\tlet i = inverseToOnlyReturnFirstLogs ? 0 : newLogs.length - 1;\n\t\t\tinverseToOnlyReturnFirstLogs ? i < newLogs.length : i >= 0;\n\t\t\tinverseToOnlyReturnFirstLogs ? i++ : i--\n\t\t) {\n\t\t\tconst log = newLogs[i]\n\t\t\tconst key = log.en + '|' + log.at // stringify([log.en, log.at]) - less efficient\n\n\t\t\t// TODO: use isoDateStrCompare ?\n\t\t\tif (tsCheck && (inverseToOnlyReturnFirstLogs ? tsCheck > log.ts : tsCheck < log.ts)) {\n\t\t\t\tthrow ERROR(`lastWriteWins.mapper logs not sorted:`, tsCheck, inverseToOnlyReturnFirstLogs ? '>' : '<', log.ts, {\n\t\t\t\t\tlog,\n\t\t\t\t\ti,\n\t\t\t\t\tnewLogs,\n\t\t\t\t\tinverseToOnlyReturnFirstLogs,\n\t\t\t\t})\n\t\t\t}\n\t\t\ttsCheck = log.ts\n\n\t\t\tconst existing = rollingMap.get(key)\n\t\t\tif (!existing || (inverseToOnlyReturnFirstLogs ? (existing.ts > log.ts) : (existing.ts < log.ts))) {\n\t\t\t\tif (existing && !isInitial) toRemove.push(existing)\n\t\t\t\ttoAdd.push(log)\n\t\t\t\trollingMap.set(key, log)\n\t\t\t}\n\t\t}\n\t\tsortApplogsByTs(toAdd) // HACK: find logical solution\n\t\tVERBOSE.isDisabled ||\n\t\t\tVERBOSE(\n\t\t\t\t`lastWriteWins${inverseToOnlyReturnFirstLogs ? '.inversed' : ''}<${thread.nameAndSizeUntracked}> mapped event`,\n\t\t\t\tisInitial ?\n\t\t\t\t\t{ ...Object.fromEntries(Object.entries(event).map(([k, v]) => [k, v?.length])), toAdd: toAdd.length, toRemove } :\n\t\t\t\t\t{ ...event, toAdd, toRemove },\n\t\t\t)\n\t\treturn isInitial ?\n\t\t\t{ init: toAdd }\n\t\t\t: { added: toAdd, removed: toRemove }\n\t}, { name: `lastWriteWins${inverseToOnlyReturnFirstLogs ? '.inversed' : ''}`, extraFilterName: 'lastWriteWins' })\n\tVERBOSE.isDisabled || autorun(() => {\n\t\tVERBOSE(`lastWriteWins<${thread.nameAndSizeUntracked}> filtered down to`, mappedThread.applogs.length) // using applogs.length, as size might not change, but we still want a log\n\t})\n\treturn mappedThread as ThreadOnlyCurrent\n\t// const filtered = observableArrayMap(() => {\n\t// VERBOSE(`lastWriteWins thread deps:`, getDependencyTree(thread.applogs), thread)\n\t// thread.applogs.forEach(applog => {\n\t// const key = stringify([applog.en, applog.at])\n\t// const existing = mapped.get(key)\n\t// if (!existing || existing.ts < applog.ts)\n\t// mapped.set(key, applog)\n\t// })\n\t// VERBOSE(`[lastWriteWins] mapped:`, mapped.size)\n\t// return Array.from(mapped.values())\n\t// }, { name: obsArrMapName })\n\t// VERBOSE(`lastWriteWins deps of filteredArr:`, getDependencyTree(filtered))\n\t// return new MappedThread(thread, filtered, `${thread.name} | lastWriteWins`)\n}, { equals: applogThreadComparer, argsDebugName: (thread) => createDebugName({ caller: 'lastWriteWins', thread }) })\n\n/**\n * Remove all applogs for entities that have an applog: { at: `isDeleted`, val: true }\n * ! WARNING: If not based on lastWriteWins, it will not respect un-deletions yet (isDeleted: false)\n */\nexport const withoutDeleted = computedFnDeepCompare('withoutDeleted', function withoutDeleted(\n\tthread: Thread,\n) {\n\tif (VERBOSE.isEnabled) VERBOSE(`withoutDeleted<${thread.nameAndSizeUntracked}>`)\n\t// if (thread.name.includes('withoutDeleted')) WARN(`thread already contains withoutDeleted:`, withoutDeleted)\n\tif (thread.filters.includes('withoutDeleted')) {\n\t\tthrow ERROR(`thread already filtered withoutDeleted:`, thread.filters, { name: thread.name })\n\t}\n\n\tconst deletionLogs = rollingFilter(\n\t\tthread, // TODO: handle un-delection\n\t\t{ at: ['isDeleted', 'relation/isDeleted', 'block/isDeleted'], vl: true },\n\t\t{ name: 'isDeleted' },\n\t)\n\tVERBOSE.isEnabled &&\n\t\tVERBOSE(\n\t\t\t`withoutDeleted<${thread.nameAndSizeUntracked}> deletionLogs:`,\n\t\t\tuntracked(function expensiveAssUntrackedVerboseFx() {\n\t\t\t\treturn [...deletionLogs.applogs]\n\t\t\t}),\n\t\t)\n\tconst obsArrMapName = createDebugName({ caller: 'allDeletedEntities', thread })\n\tconst deleted = observableSetMap(function observableSetMapForDeleted() {\n\t\treturn deletionLogs.map(log => log.en)\n\t}, { name: obsArrMapName })\n\t// if (VERBOSE.isEnabled) VERBOSE(`withoutDeleted<${db.nameAndSize}> deleted:`, untracked(() => [...deleted]))\n\tif (VERBOSE.isEnabled) {\n\t\tautorun(() => {\n\t\t\tVERBOSE(`withoutDeleted<${thread.nameAndSizeUntracked}> deleted:`, [...deleted])\n\t\t})\n\t}\n\n\treturn rollingFilter(thread, { '!en': deleted }, { name: `withoutDeleted`, extraFilterName: 'withoutDeleted' })\n}, { equals: applogThreadComparer })\n\n// export const filterStatic = computedFnDeepCompare('filterStatic', function filterStatic(\n// thread: Thread,\n// pattern: DatalogQueryPattern,\n// opts: { name?: string } = {},\n// ) {\n// VERBOSE(`filterStatic<${thread.nameAndSizeUntracked}>:`, pattern)\n// if (!Object.entries(pattern).length) throw new Error(`Pattern is empty`)\n// //TODO: deprecaate in favor of rollingFilter ?\n// return new Thread(thread, thread.applogs.filter(applog => {\n// for (const [field, patternValue] of Object.entries(pattern)) {\n// const applogValue = applog[field.startsWith('!') ? field.slice(1) : field]\n// if (!matchPartStatic(field, patternValue, applogValue))\n// return false\n// }\n// return true\n// }), `${thread.name} | ${opts.name || `filterStatic{${stringify(pattern)}}`}`)\n// }, { equals: applogThreadComparer })\n\nexport const query = computedFnDeepCompare('query', function query(\n\tthreadOrLogs: Thread | Applog[],\n\tpatternOrPatterns: DatalogQueryPattern | DatalogQueryPattern[],\n\tstartVariables: SearchContext = {},\n\topts: { debug?: boolean } = {},\n) {\n\tthrowOnTimeout()\n\tconst thread = threadFromMaybeArray(threadOrLogs)\n\tDEBUG(`query<${thread.nameAndSizeUntracked}>:`, patternOrPatterns)\n\tconst patterns = (Array.isArray(patternOrPatterns) ? patternOrPatterns : [patternOrPatterns]) as DatalogQueryPattern[]\n\n\tlet nodes: QueryResult | null\n\tif (patterns.length === 1) {\n\t\t// We are the first step, so start from scratch\n\t\tnodes = null\n\t} else {\n\t\t// Run the previous step(s) first (= recursion)\n\t\tconst pattersExceptLast = patterns.slice(0, -1)\n\t\t// recursively call this function to have partial queries cacheable\n\t\tnodes = query(thread, pattersExceptLast, startVariables, opts)\n\t}\n\tconst lastPattern = patterns[patterns.length - 1]\n\tconst stepResult = queryStep(thread, nodes, lastPattern, opts)\n\tVERBOSE.isDisabled || autorun(() => VERBOSE(`query result:`, toJS(stepResult)))\n\treturn stepResult\n}, {\n\tequals: queryNodesComparer,\n\targsDebugName: (thread, pattern, startVars) =>\n\t\tcreateDebugName({ caller: 'query', thread, args: startVars ? { pattern, startVars } : pattern }),\n})\n\nexport const queryStep = computedFnDeepCompare('queryStep', function queryStep(\n\tthread: Thread,\n\tnodeSet: QueryResult | null,\n\tpattern: DatalogQueryPattern,\n\t// variables: SearchContext = {},\n\topts: { debug?: boolean } = {},\n) {\n\tDEBUG(`queryStep<${thread.nameAndSizeUntracked}> with`, nodeSet?.untrackedSize ?? 'all', 'nodes, pattern:', pattern)\n\tif (!Object.entries(pattern).length) throw new Error(`Pattern is empty`)\n\n\tfunction doQuery(node: QueryNode | null) {\n\t\tconst [patternWithResolvedVars, variablesToFill] = resolveOrRemoveVariables(pattern, node?.variables ?? {})\n\t\tVERBOSE(`[queryStep.doQuery] patternWithoutVars: `, patternWithResolvedVars)\n\t\tconst applogsMatchingStatic = rollingFilter(thread, patternWithResolvedVars)\n\t\tconst varMapper = createObjMapper(variablesToFill)\n\t\tconst resultNodes = observableArrayMap(function queryStepDoStep() {\n\t\t\tconst newVarsAndTheirLog = applogsMatchingStatic.map(log => ({ log, vars: varMapper(log) }))\n\t\t\tif (VERBOSE.isEnabled) {\n\t\t\t\tVERBOSE(\n\t\t\t\t\t`[queryStep.doQuery] step node:`,\n\t\t\t\t\tnode?.variables,\n\t\t\t\t\t' =>',\n\t\t\t\t\tnewVarsAndTheirLog,\n\t\t\t\t\t'from:',\n\t\t\t\t\tuntracked(() => applogsMatchingStatic.applogs),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\treturn newVarsAndTheirLog.map(({ log, vars }) => {\n\t\t\t\tconst nodeVars = Object.assign({}, node?.variables, vars)\n\t\t\t\treturn new QueryNode(\n\t\t\t\t\t// TODO: ? Make single result nodes reactive using MappedThread - only really relevant if a result had multiple logs (or different paths would lead to the same result?)\n\t\t\t\t\t// ThreadInMemory.fromArray(\n\t\t\t\t\tStaticThread.fromArray(\n\t\t\t\t\t\t[log],\n\t\t\t\t\t\tcreateDebugName({\n\t\t\t\t\t\t\tcaller: 'QueryNode',\n\t\t\t\t\t\t\tthread: applogsMatchingStatic,\n\t\t\t\t\t\t\tpattern: `${stringify(nodeVars)}@${stringify(patternWithResolvedVars)}`,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t// true,\n\t\t\t\t\t),\n\t\t\t\t\tnodeVars,\n\t\t\t\t\tnode,\n\t\t\t\t)\n\t\t\t})\n\t\t}, { name: createDebugName({ caller: 'doQuery.mapNodes', thread: applogsMatchingStatic, pattern }) })\n\t\tif (VERBOSE.isEnabled) autorun(() => VERBOSE(`[queryStep.doQuery] resultNodes:`, [...resultNodes]))\n\t\tif (opts.debug) {\n\t\t\tLOG(\n\t\t\t\t`[queryStep] step result:`,\n\t\t\t\tuntracked(() =>\n\t\t\t\t\tresultNodes.map(({ variables, logsOfThisNode: thread }) => ({\n\t\t\t\t\t\tvariables,\n\t\t\t\t\t\tthread, // : /* util.inspect( */ thread.applogs, /* , { showHidden: false, depth: null }) */\n\t\t\t\t\t}))\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\treturn resultNodes\n\t}\n\tconst observableResultNodes = observableArrayMap(\n\t\tfunction queryStepGetResults() {\n\t\t\tDEBUG(`[queryStep] Running with ${nodeSet?.nodes?.length} input nodes:`)\n\t\t\tif (!nodeSet) {\n\t\t\t\t// first query step\n\t\t\t\treturn [...doQuery(null)] // HACK copy array bc otherwise the observableArrayMap doesn't seem to depend on the contents somehow\n\t\t\t} else {\n\t\t\t\t// subsequent query steps\n\t\t\t\treturn [...nodeSet.nodes.flatMap(doQuery)]\n\t\t\t}\n\t\t},\n\t\t{ name: createDebugName({ caller: 'queryStep', thread, pattern }) },\n\t)\n\n\tif (VERBOSE.isEnabled) autorun(() => VERBOSE(`[queryStep] observableResultNodes:`, [...observableResultNodes]))\n\treturn new QueryResult(observableResultNodes)\n}, { equals: queryNodesComparer, argsDebugName: (thread, _nodes, pattern) => createDebugName({ caller: 'queryStep', thread, pattern }) })\n\nexport const queryNot = computedFnDeepCompare('queryNot', function queryNot( // TODO: update old-style query\n\tthread: Thread,\n\tstartNodes: QueryResult,\n\tpatternOrPatterns: DatalogQueryPattern | DatalogQueryPattern[],\n\topts: { debug?: boolean } = {},\n) {\n\tlet nodes = startNodes.nodes\n\tDEBUG(`queryNot<${thread.nameAndSizeUntracked}> from: ${nodes.length} nodes`)\n\tconst patterns = (Array.isArray(patternOrPatterns) ? patternOrPatterns : [patternOrPatterns]) as DatalogQueryPattern[]\n\n\tfor (const pattern of patterns) {\n\t\tif (!Object.entries(patternOrPatterns).length) throw new Error(`Pattern is empty`)\n\t\tnodes = nodes.filter(function innerNodeFilter({ /* applogs, */ variables }) {\n\t\t\tconst [patternWithResolvedVars, _variablesToFill] = resolveOrRemoveVariables(pattern, variables ?? {})\n\t\t\tVERBOSE(`[queryNot] patternWithoutVars: `, patternWithResolvedVars)\n\t\t\tconst newApplogs = rollingFilter(thread, patternWithResolvedVars)\n\t\t\tVERBOSE(`[queryNot] step node:`, variables, ' =>', newApplogs.size, 'applogs')\n\t\t\tVERBOSE.isDisabled || VERBOSE(`[queryNot] step node:`, variables, ' => empty?', untracked(() => newApplogs.applogs))\n\n\t\t\tif (opts.debug) LOG(`[queryNot] node result:`, variables, '=>', newApplogs.applogs)\n\t\t\treturn newApplogs.isEmpty\n\t\t})\n\t}\n\treturn new QueryResult(nodes)\n}, { equals: queryNodesComparer, argsDebugName: (thread, nodes, pattern) => createDebugName({ caller: 'queryNot', thread, pattern }) })\n\n// export function or(queries: QueryExecutor[]) {\n// return tagged(\n// `or{${stringify(queries)} } `,\n// function orExecutor(args: QueryExecutorArguments) {\n// const { db, nodes: contexts } = args\n// VERBOSE('[or]', { queries, contexts })\n// let results = []\n// for (const query of queries) {\n// const res = query(args)\n// VERBOSE('[or] query', query, 'result =>', res)\n// results.push(...res.nodes)\n// }\n// return { contexts: results }\n// }\n// )\n// }\n\n// export type Tagged<T> = T & { tag: string }\n// export function tagged<T>(tag: string, thing: T): Tagged<T> {\n// const e = thing as (T & { tag: string })\n// e.tag = tag\n// return e\n// }\n\n//////////////////////\n// COMPOSED QUERIES //\n//////////////////////\n// createDebugName({ caller: 'useKidRelations' }, true)\nexport const filterAndMap = computedFnDeepCompare('filterAndMap', function filterAndMap<R>(\n\tthread: Thread,\n\tpattern: DatalogQueryPattern,\n\tmapper: (keyof Applog) | (Partial<{ [key in keyof Applog]: string }>) | ((applog: Applog) => R),\n) {\n\tDEBUG(`filterAndMap<${thread.nameAndSizeUntracked}>`, pattern)\n\n\tconst filtered = rollingFilter(thread, pattern)\n\tif (VERBOSE.isEnabled) {\n\t\tVERBOSE(`[filterAndMap] filtered:`, filtered.untrackedSize)\n\t\tautorun(() => VERBOSE(`[filterAndMap] filtered:`, filtered.applogs))\n\t}\n\n\tconst name = createDebugName({ thread, pattern, caller: 'filterAndMap' })\n\tconst mapped = observableArrayMap<ApplogValue | any>(() => mapThreadWith(filtered, mapper), { name }) // TODO typing:? Record<string, ApplogValue> ?\n\tVERBOSE.isDisabled || autorun(() => VERBOSE(`[filterAndMap] mapped:`, mapped))\n\treturn mapped\n}, { equals: comparer.structural, argsDebugName: (thread, pattern) => createDebugName({ caller: 'filterAndMap', thread, pattern }) })\n\nexport const queryAndMap = computedFnDeepCompare('queryAndMap', function queryAndMap<R>(\n\tthreadOrLogs: Thread | Applog[],\n\tpatternOrPatterns: Parameters<typeof query>[1],\n\tmapDef: string | (Partial<{ [key in keyof SearchContext]: string }>) | ((record: SearchContext) => R),\n\tvariables: SearchContext = {},\n) {\n\tconst thread = threadFromMaybeArray(threadOrLogs)\n\tDEBUG(`queryAndMap<${thread.nameAndSizeUntracked}>`, { patternOrPatterns, variables, map: mapDef })\n\tconst debugName = createDebugName({ thread, caller: 'queryAndMap' })\n\n\tconst queryResult = query(thread, patternOrPatterns)\n\tVERBOSE(`[queryAndMap] filtered count:`, queryResult.untrackedSize)\n\tconst mapped = observableArrayMap<ApplogValue | any>(\n\t\t() => mapQueryResultWith(queryResult, mapDef),\n\t\t{ name: debugName },\n\t)\n\tVERBOSE.isDisabled || autorun(() => VERBOSE(`[queryAndMap] result:`, toJS(mapped)))\n\treturn mapped\n}, { equals: comparer.structural, argsDebugName: (thread, pattern) => createDebugName({ caller: 'queryAndMap', thread, pattern }) })\n\nexport const queryEntity = computedFnDeepCompare('queryEntity', function queryEntity(\n\tthread: Thread,\n\tname: string,\n\tentityID: EntityID,\n\tattributes: readonly string[],\n) {\n\tDEBUG(`queryEntity<${thread.nameAndSizeUntracked}>`, entityID, name)\n\n\tconst filtered = rollingFilter(thread, { en: entityID, at: prefixAttrs(name, attributes) })\n\tVERBOSE(`queryEntity applogs:`, filtered.applogs)\n\treturn computed(() =>\n\t\tfiltered.isEmpty ? null : Object.fromEntries(\n\t\t\tfiltered.map(({ at, vl }) => [at.slice(name.length + 1), vl]),\n\t\t)\n\t)\n}, {\n\tequals: computedStructuralComparer,\n\targsDebugName: (thread, name, entityID) => createDebugName({ caller: 'queryEntity', thread, args: { name, entityID } }),\n})\n\nexport const agentsOfThread = computedFnDeepCompare('agentsOfThread', function agentsOfThread(\n\tthread: Thread,\n) {\n\tDEBUG(`agentsOfThread<${thread.nameAndSizeUntracked}>`)\n\n\tconst mapped = observable.map<string, number>()\n\tconst onEvent = action((event: ThreadEvent) => {\n\t\tfor (const log of (isInitEvent(event) ? event.init : event.added)) {\n\t\t\tconst prev = mapped.get(log.ag) ?? 0\n\t\t\tmapped.set(log.ag, prev + 1)\n\t\t}\n\t\tfor (const log of (!isInitEvent(event) && event.removed || [])) {\n\t\t\tconst prev = mapped.get(log.ag)\n\t\t\tif (!prev || prev < 1) throw ERROR(`[agentsOfThread] number is now negative`, { log, event, mapped, prev })\n\t\t\tmapped.set(log.ag, prev - 1)\n\t\t}\n\t\tLOG(`agentsOfThread<${thread.nameAndSizeUntracked}> processed event`, { event, mapped })\n\t})\n\n\tonEvent({ init: thread.applogs })\n\tconst unsubscribe = thread.subscribe(onEvent)\n\tonBecomeObserved(mapped, unsubscribe)\n\n\treturn mapped\n})\n\nexport const entityOverlap = computedFnDeepCompare('entityOverlap', function entityOverlapCount(\n\tthreadA: Thread,\n\tthreadB: Thread,\n) {\n\tLOG(`entityOverlap<${threadA.nameAndSizeUntracked}, ${threadB.nameAndSizeUntracked}>`)\n\n\treturn computed(() => {\n\t\tconst entitiesA = new Set(threadA.map(log => log.en))\n\t\tconst entitiesB = new Set(threadB.map(log => log.en))\n\t\treturn [...entitiesA].filter(en => entitiesB.has(en))\n\t})\n})\n\nexport const entityOverlapMap = function entityOverlapMap(\n\tthreadA: Thread,\n\tthreadB: Thread,\n\tthreadAName = 'incoming',\n\tthreadBName = 'current',\n) {\n\tconst useInferredVM = (en, thread: Thread) => en\n\tconst overlapping = entityOverlap(threadA, threadB).get()\n\tconst mapped = new Map()\n\toverlapping.forEach(eachEntityID => (\n\t\tmapped.set(eachEntityID, {\n\t\t\t[threadAName]: useInferredVM(eachEntityID, threadA),\n\t\t\t[threadBName]: useInferredVM(eachEntityID, threadB),\n\t\t})\n\t))\n}\n\nexport const entityOverlapCount = computedFnDeepCompare(\n\t'entityOverlapCount',\n\tfunction entityOverlapCount(threadA: Thread, threadB: Thread) {\n\t\treturn computed(() => entityOverlap(threadA, threadB).get().length)\n\t},\n)\nexport const querySingle = computedFnDeepCompare('querySingle', function querySingle(\n\tthreadOrLogs: Thread | Applog[],\n\tpatternOrPatterns: Parameters<typeof query>[1],\n\tvariables: SearchContext = {},\n) {\n\tconst result = query(threadOrLogs, patternOrPatterns, variables)\n\treturn computed(() => {\n\t\tif (result.isEmpty) return null\n\t\tif (result.size > 1) throw ERROR(`[querySingle] got`, result.size, `results:`, result)\n\t\tconst logsOfThisNode = result.nodes[0].logsOfThisNode\n\t\tif (logsOfThisNode.size != 1) throw ERROR(`[querySingle] single result, but got`, logsOfThisNode.size, `logs:`, logsOfThisNode.applogs)\n\t\treturn logsOfThisNode.applogs[0]\n\t})\n}, {\n\tequals: comparer.structural,\n\targsDebugName: (thread, pattern) => createDebugName({ caller: 'querySingle', thread, pattern }),\n})\n\nexport const querySingleAndMap = computedFnDeepCompare(\n\t'querySingleAndMap',\n\tfunction querySingleAndMap<MAP extends (keyof Applog | (Partial<{ [key in keyof Applog]: string }>))>(\n\t\tthreadOrLogs: Thread | Applog[],\n\t\tpatternOrPatterns: Parameters<typeof query>[1],\n\t\tmapDef: MAP,\n\t\tvariables: SearchContext = {},\n\t) {\n\t\tconst resultBox = querySingle(threadOrLogs, patternOrPatterns, variables)\n\t\treturn computed<ApplogValue | { [key in keyof MAP]: ApplogValue } | null>(() => {\n\t\t\tconst log = resultBox.get()\n\t\t\tif (!log) return undefined\n\t\t\tif (typeof mapDef === 'string') {\n\t\t\t\treturn log[mapDef as string]\n\t\t\t} else {\n\t\t\t\treturn createObjMapper(mapDef)(log)\n\t\t\t}\n\t\t})\n\t},\n\t{\n\t\tequals: comparer.structural,\n\t\targsDebugName: (thread, pattern) => createDebugName({ caller: 'querySingleAndMap', thread, pattern }),\n\t},\n)\n/////////////\n// HELPERS //\n/////////////\n\nexport const mapThreadWith = function filterAndMapGetterFx<R>(\n\tthread: Thread,\n\tmapDef: (keyof Applog) | (Partial<{ [key in keyof Applog]: string }>) | ((applog: Applog) => R),\n) {\n\tif (typeof mapDef === 'function') {\n\t\treturn thread.map(mapDef)\n\t} else if (typeof mapDef === 'string') {\n\t\treturn thread.map(log => log[mapDef])\n\t} else {\n\t\treturn thread.map(createObjMapper(mapDef))\n\t}\n}\nexport const mapQueryResultWith = function filterAndMapGetterFx<R>(\n\tqueryResult: QueryResult,\n\tmapDef: string | (Partial<{ [key in keyof SearchContext]: string }>) | ((record: SearchContext) => R),\n) {\n\tif (typeof mapDef === 'function') {\n\t\treturn queryResult.records.map(mapDef)\n\t} else if (typeof mapDef === 'string') {\n\t\treturn queryResult.nodes.map((node) => {\n\t\t\tif (!Object.hasOwn(node.record, mapDef)) {\n\t\t\t\tif (node.logsOfThisNode.size !== 1) {\n\t\t\t\t\tthrow ERROR(`not sure what to map (it's not a var and a result node log count of ${node.logsOfThisNode.size})`)\n\t\t\t\t}\n\t\t\t\treturn node.logsOfThisNode.firstLog[mapDef]\n\t\t\t}\n\t\t\treturn node.record[mapDef]\n\t\t})\n\t} else {\n\t\treturn queryResult.nodes.map((node) => {\n\t\t\treturn createObjMapper(mapDef)(queryResult)\n\t\t})\n\t}\n}\n/**\n * Map Applog to custom named record, e.g.:\n * { en: 'movieID', vl: 'movieName' }\n * will map the applog to { movieID: .., movieName: .. }\n */\nexport function createObjMapper<FROM extends string, TO extends string>(applogFieldMap: Partial<{ [key in FROM]: TO }>) {\n\treturn (applog: { [key in FROM]: any }) => {\n\t\treturn Object.entries(applogFieldMap).reduce((acc, [key, value]) => {\n\t\t\tacc[value as TO] = applog[key]\n\t\t\treturn acc\n\t\t}, {} as Partial<{ [key in TO]: ApplogValue }>)\n\t}\n}\n\nexport function startsWith(str: string) {\n\treturn (value) => value.startsWith(str)\n}\n\nexport function prefixAttrs(prefix: string, attrs: readonly string[]) {\n\treturn attrs.map(at => prefixAt(prefix, at))\n}\nexport function prefixAt(prefix: string, attr: string) {\n\treturn `${prefix}/${attr}`\n}\nexport function threadFromMaybeArray(threadOrLogs: Thread | Applog[], name?: string) {\n\tif (!Array.isArray(threadOrLogs)) {\n\t\treturn threadOrLogs\n\t}\n\treturn ThreadInMemory.fromArray(threadOrLogs, name || `threadFromArray[${threadOrLogs.length}]`, true)\n}\nexport function withTimeout<R>(timeoutMilliseconds: number, func: () => R) {\n\tif (globalQueryTimeoutTime) throw ERROR(`Nested timeout not supported`)\n\tglobalQueryTimeoutTime = performance.now() + timeoutMilliseconds\n\tconst result = func()\n\n\tglobalQueryTimeoutTime = null\n\treturn result\n}\nexport function throwOnTimeout() {\n\tif (globalQueryTimeoutTime == null) return\n\tif (performance.now() >= globalQueryTimeoutTime) {\n\t\tthrow new QueryTimeoutError(globalQueryTimeoutTime)\n\t}\n}\nclass QueryTimeoutError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message)\n\t}\n}\n","import type { Applog, EntityID } from '@wovin/core/applog'\nimport type { ThreadOnlyCurrentNoDeleted } from '@wovin/core/thread'\nimport { query } from '@wovin/core/query'\n\n/**\n * Generic recursive traversal utility for note tree structures.\n *\n * Traverses a note and all its descendants, applying a mapping function to each\n * node and combining results using a join function.\n *\n * @param thread - Pre-filtered thread (from `lastWriteWins(withoutDeleted(raw))`)\n * @param blockID - The root block ID to start traversal from\n * @param mapKid - Function to apply to each block/relation pair\n * @param joinResults - Function to combine parent result with children results\n * @returns The combined result of the traversal\n *\n * @throws Error if circular references are detected or depth exceeds 42 levels\n *\n * @internal Used by collectSubtreeApplogs; not typically used directly\n */\nexport function mapAndRecurseKids<R = void>(\n\tthread: ThreadOnlyCurrentNoDeleted,\n\tblockID: EntityID,\n\tmapKid: (kid: { relID: EntityID | null, blockID: EntityID }) => R,\n\tjoinResults: (blockResult: R, kidResults: R[]) => R,\n) {\n\tconst recurse = function recurseOuter(blockID: EntityID, relID: EntityID | null, trace: EntityID[]) {\n\t\t// Recursion checks\n\t\tif (trace.includes(blockID)) {\n\t\t\tthrow new Error(`[mapAndRecurseKids.loop] Circular reference detected: ${blockID}`)\n\t\t}\n\t\tif (trace.length > 42) {\n\t\t\tthrow new Error(`[mapAndRecurseKids.maxDepth] Maximum recursion depth (42) exceeded`)\n\t\t}\n\n\t\t// Process this block\n\t\tconst result = mapKid({ blockID, relID })\n\n\t\t// Process the children\n\t\tconst kidsQuery = query(thread, [\n\t\t\t{ en: '?kidRelID', at: 'relation/childOf', vl: blockID },\n\t\t\t{ en: '?kidRelID', at: 'relation/block', vl: '?kidID' },\n\t\t])\n\t\tconst kidResults = kidsQuery.records.map(function kidsQueryRecordsMapper({ kidID, kidRelID }) {\n\t\t\treturn recurse(kidID as EntityID, kidRelID as EntityID, [...trace, blockID])\n\t\t})\n\n\t\treturn joinResults(result, kidResults)\n\t}\n\treturn recurse(blockID, null, [])\n}\n\n/**\n * Collects all applogs for a note and its entire subtree (descendants).\n *\n * This is a non-reactive utility version for use in non-UI contexts (CLI, scripts, MCP server).\n * It returns a flat array of all applogs found during tree traversal.\n *\n * **Important**: The thread parameter MUST be pre-filtered using `lastWriteWins(withoutDeleted(thread))`\n * to ensure correct tree traversal. Unfiltered threads may:\n * - Include deleted blocks/relations (incorrect tree structure)\n * - Include multiple versions of the same applog (redundant)\n *\n * @param thread - Pre-filtered thread (must be result of `lastWriteWins(withoutDeleted(raw))`)\n * @param blockID - The root block ID to collect from\n * @returns Flat array of all applogs from the block and its descendants\n *\n * @example\n * ```typescript\n * import { collectSubtreeApplogs } from '@note3/utils'\n * import { lastWriteWins, withoutDeleted } from '@wovin/core'\n *\n * const filteredThread = withoutDeleted(lastWriteWins(rawThread))\n * const applogs = collectSubtreeApplogs(filteredThread, blockID)\n * console.log(`Collected ${applogs.length} applogs`)\n * ```\n */\nexport function collectSubtreeApplogs(\n\tthread: ThreadOnlyCurrentNoDeleted,\n\tblockID: EntityID,\n): Applog[] {\n\tconst collectedApplogs: Applog[] = []\n\n\tmapAndRecurseKids(thread, blockID, ({ blockID, relID }) => {\n\t\t// Collect ALL applogs for this block entity\n\t\tconst blockQuery = query(thread, [{ en: blockID }])\n\t\tcollectedApplogs.push(...blockQuery.threadOfAllTrails.applogs)\n\n\t\t// Collect ALL applogs for the relation entity (if present)\n\t\tif (relID) {\n\t\t\tconst relQuery = query(thread, [{ en: relID }])\n\t\t\tcollectedApplogs.push(...relQuery.threadOfAllTrails.applogs)\n\t\t}\n\n\t\treturn undefined\n\t}, (blockResult, kidResults) => {\n\t\treturn undefined\n\t})\n\n\treturn collectedApplogs\n}\n"],"mappings":"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","names":["WARN","LOG","DEBUG","VERBOSE","ERROR","g","queryDivergencesByPrev","computedFnDeepCompare","sourceThread","divergences","observableArrayMap","logsForNode","leafs","log","prevLogs","leafID","thread","ThreadInMemory","createDebugName","autorun","toJS","comparer","QueryNode","logsOfThisNode","variables","prevNode","makeObservable","computed","joinThreads","QueryResult","nodes","untracked","observableArrayMap","thread","node","WARN","LOG","DEBUG","VERBOSE","ERROR","g","globalQueryTimeoutTime","lastWriteWins","computedFnDeepCompare","inverseToOnlyReturnFirstLogs","tolerateAlreadyFiltered","rollingMap","mappedThread","rollingMapper","event","sourceThread","isInitial","isInitEvent","newLogs","toAdd","toRemove","tsCheck","i","log","key","existing","sortApplogsByTs","k","v","autorun","applogThreadComparer","createDebugName","withoutDeleted","deletionLogs","rollingFilter2","obsArrMapName","deleted","observableSetMap","query","threadOrLogs","patternOrPatterns","startVariables","opts","throwOnTimeout","threadFromMaybeArray","patterns","pattersExceptLast","lastPattern","stepResult","queryStep","toJS","queryNodesComparer","pattern","startVars","nodeSet","doQuery","patternWithResolvedVars","variablesToFill","resolveOrRemoveVariables","applogsMatchingStatic","varMapper","createObjMapper","resultNodes","newVarsAndTheirLog","vars","nodeVars","StaticThread","wrapper_default","observableResultNodes","_nodes","queryNot","startNodes","_variablesToFill","newApplogs","filterAndMap","mapper","filtered","name","mapped","mapThreadWith","comparer","queryAndMap","mapDef","debugName","queryResult","mapQueryResultWith","queryEntity","entityID","attributes","prefixAttrs","at","vl","computedStructuralComparer","agentsOfThread","observable","onEvent","action","prev","unsubscribe","onBecomeObserved","entityOverlap","threadA","threadB","entitiesA","entitiesB","en","entityOverlapCount","computedFnDeepCompare","threadA","threadB","computed","entityOverlap","querySingle","threadOrLogs","patternOrPatterns","variables","result","query","ERROR","logsOfThisNode","comparer","thread","pattern","createDebugName","querySingleAndMap","mapDef","resultBox","log","createObjMapper","mapThreadWith","mapQueryResultWith","queryResult","node","applogFieldMap","applog","acc","key","value","prefixAttrs","prefix","attrs","at","prefixAt","attr","threadFromMaybeArray","threadOrLogs","name","ThreadInMemory","throwOnTimeout","globalQueryTimeoutTime","QueryTimeoutError","message","mapAndRecurseKids","thread","blockID","mapKid","joinResults","recurse","relID","trace","result","kidResults","query","kidID","kidRelID","collectSubtreeApplogs","collectedApplogs","blockQuery","relQuery","blockResult"]}
@@ -1,2 +1,2 @@
1
- import{b as r,c as s}from"./chunk-LDNVHZO7.min.js";import{a as f}from"./chunk-KY36PVHK.min.js";function I(o,e){return!(e.en&&o.en!==e.en||e.at&&o.at!==e.at||e.vl!==void 0&&o.vl!==e.vl)}function y(o,e){return o.applogs.filter(t=>I(t,{at:"relation/childOf",vl:e})).map(t=>t.en)}function g(o,e){let n=new Set,t=new Set;for(let l of o.applogs)l.at==="relation/block"&&l.vl===e&&n.add(l.en);for(let l of n)for(let i of o.applogs)i.en===l&&i.at==="relation/childOf"&&i.vl!==null&&t.add(i.vl);return Array.from(t)}function c(o,e){let n={id:e};for(let t of o.applogs)if(t.en===e)switch(t.at){case"relation/block":n.block=t.vl;break;case"relation/childOf":n.childOf=t.vl;break;case"relation/after":n.after=t.vl;break;case"relation/isExpanded":n.isExpanded=t.vl;break;case"relation/isMirror":n.isMirror=t.vl;break;case"relation/isReply":n.isReply=t.vl;break;case"isDeleted":n.isDeleted=t.vl;break}return!n.block||n.childOf===void 0?null:n}function E(o,e){let t=o.applogs.filter(l=>l.at==="relation/childOf"&&l.vl===e).map(l=>l.en).map(l=>c(o,l)).filter(l=>l!==null);return f(t)}function b(o,e){return o.applogs.filter(t=>t.at==="relation/block"&&t.vl===e).map(t=>t.en).map(t=>c(o,t)).filter(t=>t!==null)}function u(o,e){let n=o.applogs.find(t=>t.en===e&&t.at==="block/content");return n?r(n.vl):null}function k(o,e){let n=u(o,e);return n?s(n):null}function v(o){let e=new Set;for(let i of o.applogs)i.at==="block/content"&&e.add(i.en);let n=new Set,t=new Map;for(let i of o.applogs)i.at==="relation/block"&&t.set(i.vl,i.en);for(let[i,p]of t)for(let a of o.applogs)if(a.en===p&&a.at==="relation/childOf"){a.vl!==null&&n.add(i);break}return Array.from(e).filter(i=>!n.has(i)).sort()}export{y as a,g as b,E as c,b as d,u as e,k as f,v as g};
2
- //# sourceMappingURL=chunk-44UQ54GR.min.js.map
1
+ import{a as f}from"./chunk-KY36PVHK.min.js";import{b as r,c as s}from"./chunk-LDNVHZO7.min.js";function I(o,e){return!(e.en&&o.en!==e.en||e.at&&o.at!==e.at||e.vl!==void 0&&o.vl!==e.vl)}function y(o,e){return o.applogs.filter(t=>I(t,{at:"relation/childOf",vl:e})).map(t=>t.en)}function g(o,e){let n=new Set,t=new Set;for(let l of o.applogs)l.at==="relation/block"&&l.vl===e&&n.add(l.en);for(let l of n)for(let i of o.applogs)i.en===l&&i.at==="relation/childOf"&&i.vl!==null&&t.add(i.vl);return Array.from(t)}function c(o,e){let n={id:e};for(let t of o.applogs)if(t.en===e)switch(t.at){case"relation/block":n.block=t.vl;break;case"relation/childOf":n.childOf=t.vl;break;case"relation/after":n.after=t.vl;break;case"relation/isExpanded":n.isExpanded=t.vl;break;case"relation/isMirror":n.isMirror=t.vl;break;case"relation/isReply":n.isReply=t.vl;break;case"isDeleted":n.isDeleted=t.vl;break}return!n.block||n.childOf===void 0?null:n}function E(o,e){let t=o.applogs.filter(l=>l.at==="relation/childOf"&&l.vl===e).map(l=>l.en).map(l=>c(o,l)).filter(l=>l!==null);return f(t)}function b(o,e){return o.applogs.filter(t=>t.at==="relation/block"&&t.vl===e).map(t=>t.en).map(t=>c(o,t)).filter(t=>t!==null)}function u(o,e){let n=o.applogs.find(t=>t.en===e&&t.at==="block/content");return n?r(n.vl):null}function k(o,e){let n=u(o,e);return n?s(n):null}function v(o){let e=new Set;for(let i of o.applogs)i.at==="block/content"&&e.add(i.en);let n=new Set,t=new Map;for(let i of o.applogs)i.at==="relation/block"&&t.set(i.vl,i.en);for(let[i,p]of t)for(let a of o.applogs)if(a.en===p&&a.at==="relation/childOf"){a.vl!==null&&n.add(i);break}return Array.from(e).filter(i=>!n.has(i)).sort()}export{y as a,g as b,E as c,b as d,u as e,k as f,v as g};
2
+ //# sourceMappingURL=chunk-XL6QVLYO.min.js.map
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export * from './applog-collection';
1
2
  export * from './helpers';
2
3
  export * from './map';
3
4
  export * from './note3-regex-constants';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,OAAO,CAAA;AACrB,cAAc,yBAAyB,CAAA;AACvC,cAAc,sBAAsB,CAAA;AACpC,cAAc,WAAW,CAAA;AACzB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA;AACvB,cAAc,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,WAAW,CAAA;AACzB,cAAc,OAAO,CAAA;AACrB,cAAc,yBAAyB,CAAA;AACvC,cAAc,sBAAsB,CAAA;AACpC,cAAc,WAAW,CAAA;AACzB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA;AACvB,cAAc,qBAAqB,CAAA"}
package/dist/index.min.js CHANGED
@@ -1,2 +1,2 @@
1
- import{a as O,b as P,c as Q,d as R,e as S}from"./chunk-K5PSO7Y4.min.js";import"./chunk-KHOUPFOL.min.js";import{a as o,b as r,c as e,d as f,e as m}from"./chunk-PA6WBVCJ.min.js";import{a as p}from"./chunk-IFY2JCCQ.min.js";import{a as H,b as I,c as J,d as K,e as L,f as M,g as N}from"./chunk-44UQ54GR.min.js";import{a as u,b as v,c as w,d as y,e as z,f as A,g as B,h as C,i as D,j as E,k as F}from"./chunk-LDNVHZO7.min.js";import{a as t,b as x,c as a,d as b,e as c,f as d,g,h,i,j,k,l,m as n,n as q,o as s}from"./chunk-POX3PUJK.min.js";import{a as G}from"./chunk-KY36PVHK.min.js";import"./chunk-MXMMU6NF.min.js";export{i as RE_ANY_TAG_ONLY,s as RE_ANY_TAG_WITHCONTEXT,h as RE_AT_TAG_ONLY,q as RE_AT_TAG_WITHCONTEXT,d as RE_HASH_TAG_ONLY,l as RE_HASH_TAG_WITHCONTEXT,g as RE_PLUS_TAG_ONLY,n as RE_PLUS_TAG_WITHCONTEXT,c as RE_TAG_BODY,a as RE_TAG_BODY_CHAR,b as RE_TAG_BODY_REQUIRED_CHAR,k as RE_TAG_CONTEXT_POST,j as RE_TAG_CONTEXT_PRE,p as SetMap,x as TAG_MIN_LENGTH,t as TIPTAP_EMPTY,e as asyncIterableToArray,f as blobToAsyncIterable,F as contentVlToPlaintext,O as createBlockApplogs,P as createRelationApplogs,Q as createSingleNodeApplogs,S as createSingleTree,R as createTreeApplogs,E as getAllTagsInText,H as getChildIDs,J as getChildRelations,L as getContent,M as getContentText,I as getParentIDs,K as getParentRelations,N as getRootIDs,o as lazyVal,G as orderRelations,v as parseBlockContentValue,B as plainContentMatchAnyTag,A as plainContentMatchAtTag,y as plainContentMatchHashTag,z as plainContentMatchPlusTag,C as plainContentMatchTagGeneric,u as plaintextStringToTiptap,r as racePromises,D as rawContentMatchTag,m as recurseWithLoopProtection,w as tiptapToPlaintext};
1
+ import{a as Q,b as R,c as S,d as T,e as U}from"./chunk-GEH2WV7I.min.js";import"./chunk-KHOUPFOL.min.js";import{a as o,b as r}from"./chunk-WZPDIIA2.min.js";import"./chunk-7XDDTUI3.min.js";import{a as e,b as f,c as m,d as p,e as t}from"./chunk-PA6WBVCJ.min.js";import{a as x}from"./chunk-IFY2JCCQ.min.js";import{a as J,b as K,c as L,d as M,e as N,f as O,g as P}from"./chunk-XL6QVLYO.min.js";import{a as I}from"./chunk-KY36PVHK.min.js";import{a as w,b as y,c as z,d as A,e as B,f as C,g as D,h as E,i as F,j as G,k as H}from"./chunk-LDNVHZO7.min.js";import{a,b,c,d,e as g,f as h,g as i,h as j,i as k,j as l,k as n,l as q,m as s,n as u,o as v}from"./chunk-POX3PUJK.min.js";import"./chunk-MXMMU6NF.min.js";export{k as RE_ANY_TAG_ONLY,v as RE_ANY_TAG_WITHCONTEXT,j as RE_AT_TAG_ONLY,u as RE_AT_TAG_WITHCONTEXT,h as RE_HASH_TAG_ONLY,q as RE_HASH_TAG_WITHCONTEXT,i as RE_PLUS_TAG_ONLY,s as RE_PLUS_TAG_WITHCONTEXT,g as RE_TAG_BODY,c as RE_TAG_BODY_CHAR,d as RE_TAG_BODY_REQUIRED_CHAR,n as RE_TAG_CONTEXT_POST,l as RE_TAG_CONTEXT_PRE,x as SetMap,b as TAG_MIN_LENGTH,a as TIPTAP_EMPTY,m as asyncIterableToArray,p as blobToAsyncIterable,r as collectSubtreeApplogs,H as contentVlToPlaintext,Q as createBlockApplogs,R as createRelationApplogs,S as createSingleNodeApplogs,U as createSingleTree,T as createTreeApplogs,G as getAllTagsInText,J as getChildIDs,L as getChildRelations,N as getContent,O as getContentText,K as getParentIDs,M as getParentRelations,P as getRootIDs,e as lazyVal,o as mapAndRecurseKids,I as orderRelations,y as parseBlockContentValue,D as plainContentMatchAnyTag,C as plainContentMatchAtTag,A as plainContentMatchHashTag,B as plainContentMatchPlusTag,E as plainContentMatchTagGeneric,w as plaintextStringToTiptap,f as racePromises,F as rawContentMatchTag,t as recurseWithLoopProtection,z as tiptapToPlaintext};
2
2
  //# sourceMappingURL=index.min.js.map
@@ -1,2 +1,2 @@
1
- import{a,b,c,d,e,f,g}from"./chunk-44UQ54GR.min.js";import"./chunk-LDNVHZO7.min.js";import"./chunk-POX3PUJK.min.js";import"./chunk-KY36PVHK.min.js";import"./chunk-MXMMU6NF.min.js";export{a as getChildIDs,c as getChildRelations,e as getContent,f as getContentText,b as getParentIDs,d as getParentRelations,g as getRootIDs};
1
+ import{a,b,c,d,e,f,g}from"./chunk-XL6QVLYO.min.js";import"./chunk-KY36PVHK.min.js";import"./chunk-LDNVHZO7.min.js";import"./chunk-POX3PUJK.min.js";import"./chunk-MXMMU6NF.min.js";export{a as getChildIDs,c as getChildRelations,e as getContent,f as getContentText,b as getParentIDs,d as getParentRelations,g as getRootIDs};
2
2
  //# sourceMappingURL=queries.min.js.map
@@ -27,13 +27,16 @@ export interface TreeCreationResult {
27
27
  }
28
28
  /**
29
29
  * Creates block applogs for a single piece of content.
30
- * Generates an entity ID using getHashID.
30
+ * Generates an entity ID using getHashID, including positional context
31
+ * (parent and after) to ensure uniqueness even for identical content.
31
32
  *
32
33
  * @param content - String or TiptapContent object
34
+ * @param parentID - Optional parent ID for positional context in hash
35
+ * @param after - Optional previous sibling ID for positional context in hash
33
36
  * @param entityID - Optional pre-computed entity ID
34
37
  * @returns Object with generated entityID and applogs array
35
38
  */
36
- export declare function createBlockApplogs(content: string | TiptapContent, entityID?: EntityID): {
39
+ export declare function createBlockApplogs(content: string | TiptapContent, parentID?: EntityID, after?: EntityID | null, entityID?: EntityID): {
37
40
  en: EntityID;
38
41
  applogs: ApplogForInsertOptionalAgent[];
39
42
  };
@@ -1 +1 @@
1
- {"version":3,"file":"tree-builder.d.ts","sourceRoot":"","sources":["../src/tree-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAEhF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEzD;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACxB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,GAAG,aAAa,CAAA;IAC/B,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,QAAQ,CAAA;IACjB,OAAO,EAAE,4BAA4B,EAAE,CAAA;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,QAAQ,EAAE,CAAA;IACnB,OAAO,EAAE,4BAA4B,EAAE,CAAA;CACvC;AAWD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CACjC,OAAO,EAAE,MAAM,GAAG,aAAa,EAC/B,QAAQ,CAAC,EAAE,QAAQ,GACjB;IAAE,EAAE,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,4BAA4B,EAAE,CAAA;CAAE,CAc3D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,QAAQ,EACjB,KAAK,EAAE,QAAQ,GAAG,IAAI,EACtB,UAAU,CAAC,EAAE,QAAQ,GACnB;IAAE,EAAE,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,4BAA4B,EAAE,CAAA;CAAE,CAa3D;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACtC,IAAI,EAAE,QAAQ,EACd,QAAQ,CAAC,EAAE,QAAQ,EACnB,KAAK,CAAC,EAAE,QAAQ,GAAG,IAAI,GACrB,kBAAkB,CA2BpB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,kBAAkB,CAAA;AACxE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,kBAAkB,CAAA;AAoB5F;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,kBAAkB,CAEnE"}
1
+ {"version":3,"file":"tree-builder.d.ts","sourceRoot":"","sources":["../src/tree-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAEhF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEzD;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACxB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,GAAG,aAAa,CAAA;IAC/B,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,QAAQ,CAAA;IACjB,OAAO,EAAE,4BAA4B,EAAE,CAAA;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,QAAQ,EAAE,CAAA;IACnB,OAAO,EAAE,4BAA4B,EAAE,CAAA;CACvC;AAWD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CACjC,OAAO,EAAE,MAAM,GAAG,aAAa,EAC/B,QAAQ,CAAC,EAAE,QAAQ,EACnB,KAAK,CAAC,EAAE,QAAQ,GAAG,IAAI,EACvB,QAAQ,CAAC,EAAE,QAAQ,GACjB;IAAE,EAAE,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,4BAA4B,EAAE,CAAA;CAAE,CAc3D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,QAAQ,EACjB,KAAK,EAAE,QAAQ,GAAG,IAAI,EACtB,UAAU,CAAC,EAAE,QAAQ,GACnB;IAAE,EAAE,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,4BAA4B,EAAE,CAAA;CAAE,CAa3D;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACtC,IAAI,EAAE,QAAQ,EACd,QAAQ,CAAC,EAAE,QAAQ,EACnB,KAAK,CAAC,EAAE,QAAQ,GAAG,IAAI,GACrB,kBAAkB,CA2BpB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,kBAAkB,CAAA;AACxE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,kBAAkB,CAAA;AAoB5F;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,kBAAkB,CAEnE"}
@@ -1,2 +1,2 @@
1
- import{a,b,c,d,e}from"./chunk-K5PSO7Y4.min.js";import"./chunk-MXMMU6NF.min.js";export{a as createBlockApplogs,b as createRelationApplogs,c as createSingleNodeApplogs,e as createSingleTree,d as createTreeApplogs};
1
+ import{a,b,c,d,e}from"./chunk-GEH2WV7I.min.js";import"./chunk-7XDDTUI3.min.js";import"./chunk-MXMMU6NF.min.js";export{a as createBlockApplogs,b as createRelationApplogs,c as createSingleNodeApplogs,e as createSingleTree,d as createTreeApplogs};
2
2
  //# sourceMappingURL=tree-builder.min.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@note3/utils",
3
- "version": "0.0.21",
3
+ "version": "0.0.24",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "main": "./dist/index.min.js",
@@ -27,7 +27,7 @@
27
27
  "bundle": false
28
28
  },
29
29
  "dependencies": {
30
- "@wovin/core": "0.0.21",
30
+ "@wovin/core": "0.0.24",
31
31
  "besonders-logger": "1.0.2",
32
32
  "comlink": "^4.4.2",
33
33
  "core-js": "^3.45.1",