@popmelt.com/core 0.18.0 → 0.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/media.d.mts CHANGED
@@ -1,5 +1,6 @@
1
- import { q as ImageObjectBox, j as PopmeltSubjectBounds, r as VideoSubjectStore, s as VideoObjectBox } from './video-adapter-DzNtG67g.mjs';
2
- export { t as BrowserImageSubjectStoreOptions, u as ImageContentHasher, v as ImageObjectObservation, I as ImageRecognitionProvider, w as ImageSubjectAdapter, a as ImageSubjectAdapterOptions, x as ImageSubjectStore, y as PersistedImageAnalysis, z as PersistedImageSubject, F as PersistedImageSuppression, G as PersistedVideoAnalysis, H as PersistedVideoTrack, J as VideoBackwardAnalysisOptions, K as VideoBackwardAnalysisResult, L as VideoMotionAttempt, M as VideoMotionPolicy, N as VideoMotionPresenceDecision, Q as VideoMotionState, U as VideoSubjectAdapter, b as VideoSubjectAdapterOptions, W as VideoTrackKeyframe, X as VideoTrackObservation, Y as VideoTrackSegment, Z as VideoTrackSmoother, _ as VideoTrackingAnchor, $ as VideoTrackingAttempt, V as VideoTrackingProvider, a0 as VideoTrackingSeed, a1 as VideoTrackingSession, a2 as createBrowserImageSubjectStore, a3 as createImageSubjectAdapter, a4 as createMemoryImageSubjectStore, a5 as createVideoSubjectAdapter } from './video-adapter-DzNtG67g.mjs';
1
+ import { c as ImageObjectBox, d as VideoSubjectStore, e as VideoObjectBox } from './video-adapter-Gq8saCDn.mjs';
2
+ export { B as BrowserImageSubjectStoreOptions, f as ImageContentHasher, g as ImageObjectObservation, I as ImageRecognitionProvider, h as ImageSubjectAdapter, a as ImageSubjectAdapterOptions, i as ImageSubjectStore, P as PersistedImageAnalysis, j as PersistedImageSubject, k as PersistedImageSuppression, l as PersistedVideoAnalysis, m as PersistedVideoTrack, n as VideoBackwardAnalysisOptions, o as VideoBackwardAnalysisResult, p as VideoMotionAttempt, q as VideoMotionPolicy, r as VideoMotionPresenceDecision, s as VideoMotionState, t as VideoSubjectAdapter, b as VideoSubjectAdapterOptions, u as VideoTrackKeyframe, v as VideoTrackObservation, w as VideoTrackSegment, x as VideoTrackSmoother, y as VideoTrackingAnchor, z as VideoTrackingAttempt, V as VideoTrackingProvider, A as VideoTrackingSeed, C as VideoTrackingSession, D as createBrowserImageSubjectStore, E as createImageSubjectAdapter, F as createMemoryImageSubjectStore, G as createVideoSubjectAdapter } from './video-adapter-Gq8saCDn.mjs';
3
+ import { g as PopmeltSubjectBounds } from './subjects-CeqtFged.mjs';
3
4
 
4
5
  declare function unprojectImagePoint(image: HTMLImageElement, clientPoint: {
5
6
  x: number;
@@ -1 +1 @@
1
- import{a as p,b as d,c as l,d as g}from"./chunk-GQOEG3E5.mjs";import"./chunk-NOHXTT24.mjs";import{Buffer as c}from"buffer";function u(e){return typeof e=="string"?e:e instanceof Uint8Array?c.from(e).toString("utf8"):String(e??"")}function m(e,t,r){let o=e.url||"";if(r.port===null||!(e.headers.accept?.includes("text/html")||o==="/"||o.endsWith(".html")))return;let a=t.write.bind(t),s=t.end.bind(t),n="";t.write=(i=>(n+=u(i),!0)),t.end=(i=>(i!==void 0&&(n+=u(i)),n=n.replace("<head>",`<head><script type="text/javascript">${g(r)}</script>`),t.getHeader("content-length")&&t.setHeader("content-length",c.byteLength(n)),a(n,"utf8"),s()))}function y(e){let t=e?.basePath??"/popmelt",r={port:null,projectId:null};return{name:"popmelt",hooks:{async"astro:server:setup"({server:o}){r=await p(e,o,4321),await d(r,o);let a=l(t,()=>r);o.middlewares.use((s,n,i)=>{if((s.url||"").startsWith(t))return a(s,n,i);m(s,n,r),i()})}}}}export{y as popmelt};
1
+ import{a as p,b as d,c as l,d as g}from"./chunk-P2Y3NJ7A.mjs";import"./chunk-NOHXTT24.mjs";import{Buffer as c}from"buffer";function u(e){return typeof e=="string"?e:e instanceof Uint8Array?c.from(e).toString("utf8"):String(e??"")}function m(e,t,r){let o=e.url||"";if(r.port===null||!(e.headers.accept?.includes("text/html")||o==="/"||o.endsWith(".html")))return;let a=t.write.bind(t),s=t.end.bind(t),n="";t.write=(i=>(n+=u(i),!0)),t.end=(i=>(i!==void 0&&(n+=u(i)),n=n.replace("<head>",`<head><script type="text/javascript">${g(r)}</script>`),t.getHeader("content-length")&&t.setHeader("content-length",c.byteLength(n)),a(n,"utf8"),s()))}function y(e){let t=e?.basePath??"/popmelt",r={port:null,projectId:null};return{name:"popmelt",hooks:{async"astro:server:setup"({server:o}){r=await p(e,o,4321),await d(r,o);let a=l(t,()=>r);o.middlewares.use((s,n,i)=>{if((s.url||"").startsWith(t))return a(s,n,i);m(s,n,r),i()})}}}}export{y as popmelt};
@@ -1 +1 @@
1
- import{a as n,b as i,c as o,d as a}from"./chunk-GQOEG3E5.mjs";import"./chunk-NOHXTT24.mjs";function s(r){let d=r?.basePath??"/popmelt",e={port:null,projectId:null};return{name:"popmelt",async configureServer(t){e=await n(r,t,5173),await i(e,t),t.middlewares.use(o(d,()=>e))},transformIndexHtml(){if(e.port!==null)return[{tag:"script",attrs:{type:"text/javascript"},children:a(e),injectTo:"head-prepend"}]}}}export{s as popmelt};
1
+ import{a as n,b as i,c as o,d as a}from"./chunk-P2Y3NJ7A.mjs";import"./chunk-NOHXTT24.mjs";function s(r){let d=r?.basePath??"/popmelt",e={port:null,projectId:null};return{name:"popmelt",async configureServer(t){e=await n(r,t,5173),await i(e,t),t.middlewares.use(o(d,()=>e))},transformIndexHtml(){if(e.port!==null)return[{tag:"script",attrs:{type:"text/javascript"},children:a(e),injectTo:"head-prepend"}]}}}export{s as popmelt};
@@ -1,4 +1,4 @@
1
- import{a as ii,b as si}from"./chunk-NOHXTT24.mjs";import{spawn as du}from"child_process";import{closeSync as cu,openSync as lu}from"fs";import{appendFile as pu,mkdir as uu,readFile as mu,realpath as fu}from"fs/promises";import{dirname as hu,join as ei}from"path";import{fileURLToPath as gu}from"url";function zt(n){return Ca(n).slice(0,12)}var _a=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298];function Ca(n){let e=typeof TextEncoder<"u"?Array.from(new TextEncoder().encode(n)):$a(n),t=e.length*8;for(e.push(128);e.length%64!==56;)e.push(0);for(let g=7;g>=0;g--)e.push(t/Math.pow(2,g*8)&255);let o=1779033703,r=3144134277,i=1013904242,s=2773480762,a=1359893119,d=2600822924,c=528734635,y=1541459225,w=new Array(64);for(let g=0;g<e.length;g+=64){for(let m=0;m<16;m++){let f=g+m*4;w[m]=(e[f]<<24|e[f+1]<<16|e[f+2]<<8|e[f+3])>>>0}for(let m=16;m<64;m++){let f=ct(w[m-15],7)^ct(w[m-15],18)^w[m-15]>>>3,M=ct(w[m-2],17)^ct(w[m-2],19)^w[m-2]>>>10;w[m]=w[m-16]+f+w[m-7]+M>>>0}let S=o,b=r,h=i,p=s,I=a,v=d,u=c,x=y;for(let m=0;m<64;m++){let f=ct(I,6)^ct(I,11)^ct(I,25),M=I&v^~I&u,$=x+f+M+_a[m]+w[m]>>>0,E=ct(S,2)^ct(S,13)^ct(S,22),F=S&b^S&h^b&h,Y=E+F>>>0;x=u,u=v,v=I,I=p+$>>>0,p=h,h=b,b=S,S=$+Y>>>0}o=o+S>>>0,r=r+b>>>0,i=i+h>>>0,s=s+p>>>0,a=a+I>>>0,d=d+v>>>0,c=c+u>>>0,y=y+x>>>0}return[o,r,i,s,a,d,c,y].map(g=>g.toString(16).padStart(8,"0")).join("")}function ct(n,e){return n>>>e|n<<32-e}function $a(n){let e=[];for(let t=0;t<n.length;t++){let o=n.charCodeAt(t);o<128?e.push(o):o<2048?e.push(192|o>>6,128|o&63):e.push(224|o>>12,128|o>>6&63,128|o&63)}return e}var ai={name:"@popmelt.com/core",version:"0.18.0",description:"A tiny, powerful design layer for humans and AI",license:"PolyForm-Shield-1.0.0",author:"Popmelt <reb@popmelt.com> (https://popmelt.com)",homepage:"https://github.com/popmelt/core",bugs:{url:"https://github.com/popmelt/core/issues"},repository:{type:"git",url:"git+https://github.com/popmelt/core.git"},keywords:["ai","annotations","collaboration","devtools","react","visual-feedback"],bin:{popmelt:"dist/cli.mjs"},sideEffects:!1,engines:{node:">=18.0.0"},scripts:{build:"tsup",clean:"git clean -xdf .turbo node_modules dist",format:'prettier --check "**/*.{ts,tsx}"',lint:"eslint . && node scripts/check-eslint-suppressions.mjs","pack:smoke":"node scripts/pack-smoke.mjs","peer:smoke":"node scripts/peer-compat-smoke.mjs",prepublishOnly:"pnpm run verify",test:"vitest run","test:coverage":"vitest run --coverage.enabled","test:watch":"vitest",typecheck:"tsc --noEmit --incremental false",verify:"pnpm run typecheck && pnpm run format && pnpm run lint && pnpm run test:coverage && pnpm run build && pnpm run pack:smoke"},exports:{".":{types:"./dist/index.d.mts",import:"./dist/index.mjs"},"./provider":{types:"./dist/index.d.mts",import:"./dist/index.mjs"},"./server":{types:"./dist/server.d.mts",import:"./dist/server.mjs"},"./memory":{types:"./dist/memory.d.mts",import:"./dist/memory.mjs"},"./memory/legacy":{types:"./dist/memory-legacy.d.mts",import:"./dist/memory-legacy.mjs"},"./memory/store":{types:"./dist/memory-store.d.mts",import:"./dist/memory-store.mjs"},"./next":{types:"./dist/plugin-next.d.mts",import:"./dist/plugin-next.mjs",default:"./dist/plugin-next.mjs"},"./vite":{types:"./dist/plugin-vite.d.mts",import:"./dist/plugin-vite.mjs",default:"./dist/plugin-vite.mjs"},"./astro":{types:"./dist/plugin-astro.d.mts",import:"./dist/plugin-astro.mjs",default:"./dist/plugin-astro.mjs"},"./media":{types:"./dist/media.d.mts",import:"./dist/media.mjs"},"./three":{types:"./dist/adapter-three.d.mts",import:"./dist/adapter-three.mjs"}},files:["dist","codex-plugin","LICENSE","README.md","THIRD_PARTY_NOTICES.md"],dependencies:{"modern-screenshot":"4.7.0",ws:"8.21.3"},peerDependencies:{"lucide-react":">=1.23.0",next:">=14.0.0",react:">=18.0.0","react-dom":">=18.0.0",three:">=0.150.0"},peerDependenciesMeta:{next:{optional:!0},three:{optional:!0}},devDependencies:{"@kit/eslint-config":"workspace:^","@tanstack/react-router":"1.120.5","@types/react":"19.1.0","@types/react-dom":"19.1.2","@types/three":"^0.185.4","@types/ws":"8.18.1","@vitejs/plugin-react":"^5.1.1","@vitest/coverage-v8":"3.2.4",eslint:"^9.24.0",geist:"1.7.2",jsdom:"26.1.0","lucide-react":"^1.23.0",next:"15.3.8",prettier:"^3.5.3",react:"19.1.0","react-dom":"19.1.0",three:"^0.185.1",tsup:"^8.5.1",typescript:"^5.8.3",vite:"7.3.6",vitest:"^3.2.4"}};var mt=ai.version;import{execFileSync as _p,spawn as fa}from"child_process";import{randomUUID as yt}from"crypto";import{mkdir as Cp,readFile as $p,readdir as Op,realpath as Dp,stat as ba,unlink as Np,writeFile as Ko}from"fs/promises";import{createServer as Bp}from"http";import{tmpdir as Jp}from"os";import{basename as Ho,isAbsolute as Zr,join as it,relative as qp,resolve as Lp}from"path";function di(n){let e=n.instruction?.trim();return e?n.attachments?.some(o=>o.name?.trim()===e)?null:e:null}function Zo(n,e){let t=n?.tagName?.toLowerCase(),o=n?.id?`#${n.id}`:"",r=n?.className?`.${n.className.trim().split(/\s+/).slice(0,2).join(".")}`:"",i=t?`${t}${o}${r}`:e;return n?.reactComponent?`<${n.reactComponent}> ${i}`:i}function Da(n){let e=n.elements?.[0]?.reactComponent||n.elements?.[0]?.tagName||n.linkedSelector,t=n.type&&n.type!=="annotation"?`${n.type} annotation`:"Annotation";return e?`${t} on ${e}`:t}function ci(n){let e=n.annotations.map(r=>{let i=r.interactionEpisode?.steps.length??0;return{kind:"annotation",annotationId:r.id,pathname:r.pathname,text:di(r)??Da(r),...i>0?{interactionEpisodeStepCount:i}:{}}}),t=new Map,o=r=>{let i=`${r.pathname??""}:${r.durableSelector??r.selector}`,s=t.get(i);if(s){s.changes.push(r.text),r.annotationNumber!==void 0&&(s.annotationNumber===void 0||r.annotationNumber<s.annotationNumber)&&(s.annotationNumber=r.annotationNumber);return}let a={kind:"changes",elementKey:i,elementLabel:Zo(r.element,r.selector),...r.annotationNumber!==void 0?{annotationNumber:r.annotationNumber}:{},pathname:r.pathname,changes:[r.text]};t.set(i,a),e.push(a)};for(let r of n.styleModifications??[])for(let i of r.changes)o({...r,text:`${i.property}: ${i.original||"unset"} \u2192 ${i.modified||"unset"}${i.token?` (${i.token})`:""}`});for(let r of n.textModifications??[])o({...r,text:`Text: ${r.original||"empty"} \u2192 ${r.modified||"empty"}`});for(let r of n.domModifications??[])o({...r,text:r.operation==="copy"?"Copied element":"Moved element"});return n.spacingTokenChanges?.length&&e.push({kind:"changes",elementKey:"spacing-tokens",elementLabel:"Spacing tokens",changes:n.spacingTokenChanges.map(r=>`${r.tokenName}: ${r.originalPx}px \u2192 ${r.newPx}px`)}),e}function li(n){let e=n.annotations.flatMap(r=>{let i=di(r);return i?[{instruction:i,pathname:r.pathname}]:[]});if(e.length===0)return;if(new Set(e.map(r=>r.pathname).filter(Boolean)).size<=1)return e.map(r=>r.instruction).join(`
1
+ import{a as ii,b as si}from"./chunk-NOHXTT24.mjs";import{spawn as du}from"child_process";import{closeSync as cu,openSync as lu}from"fs";import{appendFile as pu,mkdir as uu,readFile as mu,realpath as fu}from"fs/promises";import{dirname as hu,join as ei}from"path";import{fileURLToPath as gu}from"url";function zt(n){return Ca(n).slice(0,12)}var _a=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298];function Ca(n){let e=typeof TextEncoder<"u"?Array.from(new TextEncoder().encode(n)):$a(n),t=e.length*8;for(e.push(128);e.length%64!==56;)e.push(0);for(let g=7;g>=0;g--)e.push(t/Math.pow(2,g*8)&255);let o=1779033703,r=3144134277,i=1013904242,s=2773480762,a=1359893119,d=2600822924,c=528734635,y=1541459225,w=new Array(64);for(let g=0;g<e.length;g+=64){for(let m=0;m<16;m++){let f=g+m*4;w[m]=(e[f]<<24|e[f+1]<<16|e[f+2]<<8|e[f+3])>>>0}for(let m=16;m<64;m++){let f=ct(w[m-15],7)^ct(w[m-15],18)^w[m-15]>>>3,M=ct(w[m-2],17)^ct(w[m-2],19)^w[m-2]>>>10;w[m]=w[m-16]+f+w[m-7]+M>>>0}let S=o,b=r,h=i,p=s,I=a,v=d,u=c,x=y;for(let m=0;m<64;m++){let f=ct(I,6)^ct(I,11)^ct(I,25),M=I&v^~I&u,$=x+f+M+_a[m]+w[m]>>>0,E=ct(S,2)^ct(S,13)^ct(S,22),F=S&b^S&h^b&h,Y=E+F>>>0;x=u,u=v,v=I,I=p+$>>>0,p=h,h=b,b=S,S=$+Y>>>0}o=o+S>>>0,r=r+b>>>0,i=i+h>>>0,s=s+p>>>0,a=a+I>>>0,d=d+v>>>0,c=c+u>>>0,y=y+x>>>0}return[o,r,i,s,a,d,c,y].map(g=>g.toString(16).padStart(8,"0")).join("")}function ct(n,e){return n>>>e|n<<32-e}function $a(n){let e=[];for(let t=0;t<n.length;t++){let o=n.charCodeAt(t);o<128?e.push(o):o<2048?e.push(192|o>>6,128|o&63):e.push(224|o>>12,128|o>>6&63,128|o&63)}return e}var ai={name:"@popmelt.com/core",version:"0.18.1",description:"A tiny, powerful design layer for humans and AI",license:"PolyForm-Shield-1.0.0",author:"Popmelt <reb@popmelt.com> (https://popmelt.com)",homepage:"https://github.com/popmelt/core",bugs:{url:"https://github.com/popmelt/core/issues"},repository:{type:"git",url:"git+https://github.com/popmelt/core.git"},keywords:["ai","annotations","collaboration","devtools","react","visual-feedback"],bin:{popmelt:"dist/cli.mjs"},sideEffects:!1,packageManager:"pnpm@9.12.0",engines:{node:">=18.0.0"},scripts:{build:"tsup",clean:"git clean -xdf .turbo node_modules dist",format:'prettier --check "**/*.{ts,tsx}"',lint:"eslint . && node scripts/check-eslint-suppressions.mjs","pack:smoke":"node scripts/pack-smoke.mjs","peer:smoke":"node scripts/peer-compat-smoke.mjs",prepublishOnly:"pnpm run verify",test:"vitest run","test:coverage":"vitest run --coverage.enabled","test:watch":"vitest",typecheck:"tsc --noEmit --incremental false",verify:"pnpm run typecheck && pnpm run format && pnpm run lint && pnpm run test:coverage && pnpm run build && pnpm run pack:smoke"},exports:{".":{types:"./dist/index.d.mts",import:"./dist/index.mjs"},"./provider":{types:"./dist/index.d.mts",import:"./dist/index.mjs"},"./server":{types:"./dist/server.d.mts",import:"./dist/server.mjs"},"./memory":{types:"./dist/memory.d.mts",import:"./dist/memory.mjs"},"./memory/legacy":{types:"./dist/memory-legacy.d.mts",import:"./dist/memory-legacy.mjs"},"./memory/store":{types:"./dist/memory-store.d.mts",import:"./dist/memory-store.mjs"},"./next":{types:"./dist/plugin-next.d.mts",import:"./dist/plugin-next.mjs",default:"./dist/plugin-next.mjs"},"./vite":{types:"./dist/plugin-vite.d.mts",import:"./dist/plugin-vite.mjs",default:"./dist/plugin-vite.mjs"},"./astro":{types:"./dist/plugin-astro.d.mts",import:"./dist/plugin-astro.mjs",default:"./dist/plugin-astro.mjs"},"./media":{types:"./dist/media.d.mts",import:"./dist/media.mjs"},"./three":{types:"./dist/adapter-three.d.mts",import:"./dist/adapter-three.mjs"},"./react-three-fiber":{types:"./dist/adapter-react-three-fiber.d.mts",import:"./dist/adapter-react-three-fiber.mjs"}},files:["dist","codex-plugin","LICENSE","README.md","THIRD_PARTY_NOTICES.md"],dependencies:{"modern-screenshot":"4.7.0",ws:"8.21.3"},peerDependencies:{"lucide-react":">=1.23.0",next:">=14.0.0",react:">=18.0.0","react-dom":">=18.0.0","@react-three/fiber":">=8.0.0",three:">=0.150.0"},peerDependenciesMeta:{next:{optional:!0},"@react-three/fiber":{optional:!0},three:{optional:!0}},devDependencies:{"@kit/eslint-config":"workspace:^","@react-three/fiber":"9.7.0","@tanstack/react-router":"1.120.5","@types/react":"19.1.0","@types/react-dom":"19.1.2","@types/three":"^0.185.4","@types/ws":"8.18.1","@vitejs/plugin-react":"^5.1.1","@vitest/coverage-v8":"3.2.4",eslint:"^9.24.0",geist:"1.7.2",jsdom:"26.1.0","lucide-react":"^1.23.0",next:"15.5.24",prettier:"3.5.3",react:"19.1.0","react-dom":"19.1.0",three:"^0.185.1",tsup:"^8.5.1",typescript:"^5.8.3",vite:"7.3.6",vitest:"3.2.4"}};var mt=ai.version;import{execFileSync as _p,spawn as fa}from"child_process";import{randomUUID as yt}from"crypto";import{mkdir as Cp,readFile as $p,readdir as Op,realpath as Dp,stat as ba,unlink as Np,writeFile as Ko}from"fs/promises";import{createServer as Bp}from"http";import{tmpdir as Jp}from"os";import{basename as Ho,isAbsolute as Zr,join as it,relative as qp,resolve as Lp}from"path";function di(n){let e=n.instruction?.trim();return e?n.attachments?.some(o=>o.name?.trim()===e)?null:e:null}function Zo(n,e){let t=n?.tagName?.toLowerCase(),o=n?.id?`#${n.id}`:"",r=n?.className?`.${n.className.trim().split(/\s+/).slice(0,2).join(".")}`:"",i=t?`${t}${o}${r}`:e;return n?.reactComponent?`<${n.reactComponent}> ${i}`:i}function Da(n){let e=n.elements?.[0]?.reactComponent||n.elements?.[0]?.tagName||n.linkedSelector,t=n.type&&n.type!=="annotation"?`${n.type} annotation`:"Annotation";return e?`${t} on ${e}`:t}function ci(n){let e=n.annotations.map(r=>{let i=r.interactionEpisode?.steps.length??0;return{kind:"annotation",annotationId:r.id,pathname:r.pathname,text:di(r)??Da(r),...i>0?{interactionEpisodeStepCount:i}:{}}}),t=new Map,o=r=>{let i=`${r.pathname??""}:${r.durableSelector??r.selector}`,s=t.get(i);if(s){s.changes.push(r.text),r.annotationNumber!==void 0&&(s.annotationNumber===void 0||r.annotationNumber<s.annotationNumber)&&(s.annotationNumber=r.annotationNumber);return}let a={kind:"changes",elementKey:i,elementLabel:Zo(r.element,r.selector),...r.annotationNumber!==void 0?{annotationNumber:r.annotationNumber}:{},pathname:r.pathname,changes:[r.text]};t.set(i,a),e.push(a)};for(let r of n.styleModifications??[])for(let i of r.changes)o({...r,text:`${i.property}: ${i.original||"unset"} \u2192 ${i.modified||"unset"}${i.token?` (${i.token})`:""}`});for(let r of n.textModifications??[])o({...r,text:`Text: ${r.original||"empty"} \u2192 ${r.modified||"empty"}`});for(let r of n.domModifications??[])o({...r,text:r.operation==="copy"?"Copied element":"Moved element"});return n.spacingTokenChanges?.length&&e.push({kind:"changes",elementKey:"spacing-tokens",elementLabel:"Spacing tokens",changes:n.spacingTokenChanges.map(r=>`${r.tokenName}: ${r.originalPx}px \u2192 ${r.newPx}px`)}),e}function li(n){let e=n.annotations.flatMap(r=>{let i=di(r);return i?[{instruction:i,pathname:r.pathname}]:[]});if(e.length===0)return;if(new Set(e.map(r=>r.pathname).filter(Boolean)).size<=1)return e.map(r=>r.instruction).join(`
2
2
 
3
3
  `);let o=new Map;for(let r of e){let i=r.pathname||"(unknown)",s=o.get(i)??[];s.push(r.instruction),o.set(i,s)}return[...o.entries()].map(([r,i])=>`\`${r}\`
4
4
  ${i.map(s=>`- ${s}`).join(`
package/dist/server.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import{spawn as uu}from"child_process";import{closeSync as mu,openSync as fu}from"fs";import{appendFile as hu,mkdir as gu,readFile as yu,realpath as Iu}from"fs/promises";import{dirname as wu,join as ti}from"path";import{fileURLToPath as vu}from"url";function zt(n){return $a(n).slice(0,12)}var Ca=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298];function $a(n){let e=typeof TextEncoder<"u"?Array.from(new TextEncoder().encode(n)):Oa(n),t=e.length*8;for(e.push(128);e.length%64!==56;)e.push(0);for(let g=7;g>=0;g--)e.push(t/Math.pow(2,g*8)&255);let o=1779033703,r=3144134277,i=1013904242,s=2773480762,a=1359893119,d=2600822924,c=528734635,y=1541459225,w=new Array(64);for(let g=0;g<e.length;g+=64){for(let m=0;m<16;m++){let f=g+m*4;w[m]=(e[f]<<24|e[f+1]<<16|e[f+2]<<8|e[f+3])>>>0}for(let m=16;m<64;m++){let f=ct(w[m-15],7)^ct(w[m-15],18)^w[m-15]>>>3,M=ct(w[m-2],17)^ct(w[m-2],19)^w[m-2]>>>10;w[m]=w[m-16]+f+w[m-7]+M>>>0}let S=o,b=r,h=i,p=s,I=a,v=d,u=c,x=y;for(let m=0;m<64;m++){let f=ct(I,6)^ct(I,11)^ct(I,25),M=I&v^~I&u,$=x+f+M+Ca[m]+w[m]>>>0,E=ct(S,2)^ct(S,13)^ct(S,22),F=S&b^S&h^b&h,Y=E+F>>>0;x=u,u=v,v=I,I=p+$>>>0,p=h,h=b,b=S,S=$+Y>>>0}o=o+S>>>0,r=r+b>>>0,i=i+h>>>0,s=s+p>>>0,a=a+I>>>0,d=d+v>>>0,c=c+u>>>0,y=y+x>>>0}return[o,r,i,s,a,d,c,y].map(g=>g.toString(16).padStart(8,"0")).join("")}function ct(n,e){return n>>>e|n<<32-e}function Oa(n){let e=[];for(let t=0;t<n.length;t++){let o=n.charCodeAt(t);o<128?e.push(o):o<2048?e.push(192|o>>6,128|o&63):e.push(224|o>>12,128|o>>6&63,128|o&63)}return e}var si={name:"@popmelt.com/core",version:"0.18.0",description:"A tiny, powerful design layer for humans and AI",license:"PolyForm-Shield-1.0.0",author:"Popmelt <reb@popmelt.com> (https://popmelt.com)",homepage:"https://github.com/popmelt/core",bugs:{url:"https://github.com/popmelt/core/issues"},repository:{type:"git",url:"git+https://github.com/popmelt/core.git"},keywords:["ai","annotations","collaboration","devtools","react","visual-feedback"],bin:{popmelt:"dist/cli.mjs"},sideEffects:!1,engines:{node:">=18.0.0"},scripts:{build:"tsup",clean:"git clean -xdf .turbo node_modules dist",format:'prettier --check "**/*.{ts,tsx}"',lint:"eslint . && node scripts/check-eslint-suppressions.mjs","pack:smoke":"node scripts/pack-smoke.mjs","peer:smoke":"node scripts/peer-compat-smoke.mjs",prepublishOnly:"pnpm run verify",test:"vitest run","test:coverage":"vitest run --coverage.enabled","test:watch":"vitest",typecheck:"tsc --noEmit --incremental false",verify:"pnpm run typecheck && pnpm run format && pnpm run lint && pnpm run test:coverage && pnpm run build && pnpm run pack:smoke"},exports:{".":{types:"./dist/index.d.mts",import:"./dist/index.mjs"},"./provider":{types:"./dist/index.d.mts",import:"./dist/index.mjs"},"./server":{types:"./dist/server.d.mts",import:"./dist/server.mjs"},"./memory":{types:"./dist/memory.d.mts",import:"./dist/memory.mjs"},"./memory/legacy":{types:"./dist/memory-legacy.d.mts",import:"./dist/memory-legacy.mjs"},"./memory/store":{types:"./dist/memory-store.d.mts",import:"./dist/memory-store.mjs"},"./next":{types:"./dist/plugin-next.d.mts",import:"./dist/plugin-next.mjs",default:"./dist/plugin-next.mjs"},"./vite":{types:"./dist/plugin-vite.d.mts",import:"./dist/plugin-vite.mjs",default:"./dist/plugin-vite.mjs"},"./astro":{types:"./dist/plugin-astro.d.mts",import:"./dist/plugin-astro.mjs",default:"./dist/plugin-astro.mjs"},"./media":{types:"./dist/media.d.mts",import:"./dist/media.mjs"},"./three":{types:"./dist/adapter-three.d.mts",import:"./dist/adapter-three.mjs"}},files:["dist","codex-plugin","LICENSE","README.md","THIRD_PARTY_NOTICES.md"],dependencies:{"modern-screenshot":"4.7.0",ws:"8.21.3"},peerDependencies:{"lucide-react":">=1.23.0",next:">=14.0.0",react:">=18.0.0","react-dom":">=18.0.0",three:">=0.150.0"},peerDependenciesMeta:{next:{optional:!0},three:{optional:!0}},devDependencies:{"@kit/eslint-config":"workspace:^","@tanstack/react-router":"1.120.5","@types/react":"19.1.0","@types/react-dom":"19.1.2","@types/three":"^0.185.4","@types/ws":"8.18.1","@vitejs/plugin-react":"^5.1.1","@vitest/coverage-v8":"3.2.4",eslint:"^9.24.0",geist:"1.7.2",jsdom:"26.1.0","lucide-react":"^1.23.0",next:"15.3.8",prettier:"^3.5.3",react:"19.1.0","react-dom":"19.1.0",three:"^0.185.1",tsup:"^8.5.1",typescript:"^5.8.3",vite:"7.3.6",vitest:"^3.2.4"}};var mt=si.version;import{execFileSync as Cp,spawn as ma}from"child_process";import{randomUUID as yt}from"crypto";import{mkdir as $p,readFile as Op,readdir as Dp,realpath as Np,stat as va,unlink as Bp,writeFile as Ko}from"fs/promises";import{createServer as Jp}from"http";import{tmpdir as qp}from"os";import{basename as Ho,isAbsolute as Zr,join as it,relative as Lp,resolve as Fp}from"path";function ai(n){let e=n.instruction?.trim();return e?n.attachments?.some(o=>o.name?.trim()===e)?null:e:null}function Zo(n,e){let t=n?.tagName?.toLowerCase(),o=n?.id?`#${n.id}`:"",r=n?.className?`.${n.className.trim().split(/\s+/).slice(0,2).join(".")}`:"",i=t?`${t}${o}${r}`:e;return n?.reactComponent?`<${n.reactComponent}> ${i}`:i}function Na(n){let e=n.elements?.[0]?.reactComponent||n.elements?.[0]?.tagName||n.linkedSelector,t=n.type&&n.type!=="annotation"?`${n.type} annotation`:"Annotation";return e?`${t} on ${e}`:t}function di(n){let e=n.annotations.map(r=>{let i=r.interactionEpisode?.steps.length??0;return{kind:"annotation",annotationId:r.id,pathname:r.pathname,text:ai(r)??Na(r),...i>0?{interactionEpisodeStepCount:i}:{}}}),t=new Map,o=r=>{let i=`${r.pathname??""}:${r.durableSelector??r.selector}`,s=t.get(i);if(s){s.changes.push(r.text),r.annotationNumber!==void 0&&(s.annotationNumber===void 0||r.annotationNumber<s.annotationNumber)&&(s.annotationNumber=r.annotationNumber);return}let a={kind:"changes",elementKey:i,elementLabel:Zo(r.element,r.selector),...r.annotationNumber!==void 0?{annotationNumber:r.annotationNumber}:{},pathname:r.pathname,changes:[r.text]};t.set(i,a),e.push(a)};for(let r of n.styleModifications??[])for(let i of r.changes)o({...r,text:`${i.property}: ${i.original||"unset"} \u2192 ${i.modified||"unset"}${i.token?` (${i.token})`:""}`});for(let r of n.textModifications??[])o({...r,text:`Text: ${r.original||"empty"} \u2192 ${r.modified||"empty"}`});for(let r of n.domModifications??[])o({...r,text:r.operation==="copy"?"Copied element":"Moved element"});return n.spacingTokenChanges?.length&&e.push({kind:"changes",elementKey:"spacing-tokens",elementLabel:"Spacing tokens",changes:n.spacingTokenChanges.map(r=>`${r.tokenName}: ${r.originalPx}px \u2192 ${r.newPx}px`)}),e}function ci(n){let e=n.annotations.flatMap(r=>{let i=ai(r);return i?[{instruction:i,pathname:r.pathname}]:[]});if(e.length===0)return;if(new Set(e.map(r=>r.pathname).filter(Boolean)).size<=1)return e.map(r=>r.instruction).join(`
1
+ import{spawn as uu}from"child_process";import{closeSync as mu,openSync as fu}from"fs";import{appendFile as hu,mkdir as gu,readFile as yu,realpath as Iu}from"fs/promises";import{dirname as wu,join as ti}from"path";import{fileURLToPath as vu}from"url";function zt(n){return $a(n).slice(0,12)}var Ca=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298];function $a(n){let e=typeof TextEncoder<"u"?Array.from(new TextEncoder().encode(n)):Oa(n),t=e.length*8;for(e.push(128);e.length%64!==56;)e.push(0);for(let g=7;g>=0;g--)e.push(t/Math.pow(2,g*8)&255);let o=1779033703,r=3144134277,i=1013904242,s=2773480762,a=1359893119,d=2600822924,c=528734635,y=1541459225,w=new Array(64);for(let g=0;g<e.length;g+=64){for(let m=0;m<16;m++){let f=g+m*4;w[m]=(e[f]<<24|e[f+1]<<16|e[f+2]<<8|e[f+3])>>>0}for(let m=16;m<64;m++){let f=ct(w[m-15],7)^ct(w[m-15],18)^w[m-15]>>>3,M=ct(w[m-2],17)^ct(w[m-2],19)^w[m-2]>>>10;w[m]=w[m-16]+f+w[m-7]+M>>>0}let S=o,b=r,h=i,p=s,I=a,v=d,u=c,x=y;for(let m=0;m<64;m++){let f=ct(I,6)^ct(I,11)^ct(I,25),M=I&v^~I&u,$=x+f+M+Ca[m]+w[m]>>>0,E=ct(S,2)^ct(S,13)^ct(S,22),F=S&b^S&h^b&h,Y=E+F>>>0;x=u,u=v,v=I,I=p+$>>>0,p=h,h=b,b=S,S=$+Y>>>0}o=o+S>>>0,r=r+b>>>0,i=i+h>>>0,s=s+p>>>0,a=a+I>>>0,d=d+v>>>0,c=c+u>>>0,y=y+x>>>0}return[o,r,i,s,a,d,c,y].map(g=>g.toString(16).padStart(8,"0")).join("")}function ct(n,e){return n>>>e|n<<32-e}function Oa(n){let e=[];for(let t=0;t<n.length;t++){let o=n.charCodeAt(t);o<128?e.push(o):o<2048?e.push(192|o>>6,128|o&63):e.push(224|o>>12,128|o>>6&63,128|o&63)}return e}var si={name:"@popmelt.com/core",version:"0.18.1",description:"A tiny, powerful design layer for humans and AI",license:"PolyForm-Shield-1.0.0",author:"Popmelt <reb@popmelt.com> (https://popmelt.com)",homepage:"https://github.com/popmelt/core",bugs:{url:"https://github.com/popmelt/core/issues"},repository:{type:"git",url:"git+https://github.com/popmelt/core.git"},keywords:["ai","annotations","collaboration","devtools","react","visual-feedback"],bin:{popmelt:"dist/cli.mjs"},sideEffects:!1,packageManager:"pnpm@9.12.0",engines:{node:">=18.0.0"},scripts:{build:"tsup",clean:"git clean -xdf .turbo node_modules dist",format:'prettier --check "**/*.{ts,tsx}"',lint:"eslint . && node scripts/check-eslint-suppressions.mjs","pack:smoke":"node scripts/pack-smoke.mjs","peer:smoke":"node scripts/peer-compat-smoke.mjs",prepublishOnly:"pnpm run verify",test:"vitest run","test:coverage":"vitest run --coverage.enabled","test:watch":"vitest",typecheck:"tsc --noEmit --incremental false",verify:"pnpm run typecheck && pnpm run format && pnpm run lint && pnpm run test:coverage && pnpm run build && pnpm run pack:smoke"},exports:{".":{types:"./dist/index.d.mts",import:"./dist/index.mjs"},"./provider":{types:"./dist/index.d.mts",import:"./dist/index.mjs"},"./server":{types:"./dist/server.d.mts",import:"./dist/server.mjs"},"./memory":{types:"./dist/memory.d.mts",import:"./dist/memory.mjs"},"./memory/legacy":{types:"./dist/memory-legacy.d.mts",import:"./dist/memory-legacy.mjs"},"./memory/store":{types:"./dist/memory-store.d.mts",import:"./dist/memory-store.mjs"},"./next":{types:"./dist/plugin-next.d.mts",import:"./dist/plugin-next.mjs",default:"./dist/plugin-next.mjs"},"./vite":{types:"./dist/plugin-vite.d.mts",import:"./dist/plugin-vite.mjs",default:"./dist/plugin-vite.mjs"},"./astro":{types:"./dist/plugin-astro.d.mts",import:"./dist/plugin-astro.mjs",default:"./dist/plugin-astro.mjs"},"./media":{types:"./dist/media.d.mts",import:"./dist/media.mjs"},"./three":{types:"./dist/adapter-three.d.mts",import:"./dist/adapter-three.mjs"},"./react-three-fiber":{types:"./dist/adapter-react-three-fiber.d.mts",import:"./dist/adapter-react-three-fiber.mjs"}},files:["dist","codex-plugin","LICENSE","README.md","THIRD_PARTY_NOTICES.md"],dependencies:{"modern-screenshot":"4.7.0",ws:"8.21.3"},peerDependencies:{"lucide-react":">=1.23.0",next:">=14.0.0",react:">=18.0.0","react-dom":">=18.0.0","@react-three/fiber":">=8.0.0",three:">=0.150.0"},peerDependenciesMeta:{next:{optional:!0},"@react-three/fiber":{optional:!0},three:{optional:!0}},devDependencies:{"@kit/eslint-config":"workspace:^","@react-three/fiber":"9.7.0","@tanstack/react-router":"1.120.5","@types/react":"19.1.0","@types/react-dom":"19.1.2","@types/three":"^0.185.4","@types/ws":"8.18.1","@vitejs/plugin-react":"^5.1.1","@vitest/coverage-v8":"3.2.4",eslint:"^9.24.0",geist:"1.7.2",jsdom:"26.1.0","lucide-react":"^1.23.0",next:"15.5.24",prettier:"3.5.3",react:"19.1.0","react-dom":"19.1.0",three:"^0.185.1",tsup:"^8.5.1",typescript:"^5.8.3",vite:"7.3.6",vitest:"3.2.4"}};var mt=si.version;import{execFileSync as Cp,spawn as ma}from"child_process";import{randomUUID as yt}from"crypto";import{mkdir as $p,readFile as Op,readdir as Dp,realpath as Np,stat as va,unlink as Bp,writeFile as Ko}from"fs/promises";import{createServer as Jp}from"http";import{tmpdir as qp}from"os";import{basename as Ho,isAbsolute as Zr,join as it,relative as Lp,resolve as Fp}from"path";function ai(n){let e=n.instruction?.trim();return e?n.attachments?.some(o=>o.name?.trim()===e)?null:e:null}function Zo(n,e){let t=n?.tagName?.toLowerCase(),o=n?.id?`#${n.id}`:"",r=n?.className?`.${n.className.trim().split(/\s+/).slice(0,2).join(".")}`:"",i=t?`${t}${o}${r}`:e;return n?.reactComponent?`<${n.reactComponent}> ${i}`:i}function Na(n){let e=n.elements?.[0]?.reactComponent||n.elements?.[0]?.tagName||n.linkedSelector,t=n.type&&n.type!=="annotation"?`${n.type} annotation`:"Annotation";return e?`${t} on ${e}`:t}function di(n){let e=n.annotations.map(r=>{let i=r.interactionEpisode?.steps.length??0;return{kind:"annotation",annotationId:r.id,pathname:r.pathname,text:ai(r)??Na(r),...i>0?{interactionEpisodeStepCount:i}:{}}}),t=new Map,o=r=>{let i=`${r.pathname??""}:${r.durableSelector??r.selector}`,s=t.get(i);if(s){s.changes.push(r.text),r.annotationNumber!==void 0&&(s.annotationNumber===void 0||r.annotationNumber<s.annotationNumber)&&(s.annotationNumber=r.annotationNumber);return}let a={kind:"changes",elementKey:i,elementLabel:Zo(r.element,r.selector),...r.annotationNumber!==void 0?{annotationNumber:r.annotationNumber}:{},pathname:r.pathname,changes:[r.text]};t.set(i,a),e.push(a)};for(let r of n.styleModifications??[])for(let i of r.changes)o({...r,text:`${i.property}: ${i.original||"unset"} \u2192 ${i.modified||"unset"}${i.token?` (${i.token})`:""}`});for(let r of n.textModifications??[])o({...r,text:`Text: ${r.original||"empty"} \u2192 ${r.modified||"empty"}`});for(let r of n.domModifications??[])o({...r,text:r.operation==="copy"?"Copied element":"Moved element"});return n.spacingTokenChanges?.length&&e.push({kind:"changes",elementKey:"spacing-tokens",elementLabel:"Spacing tokens",changes:n.spacingTokenChanges.map(r=>`${r.tokenName}: ${r.originalPx}px \u2192 ${r.newPx}px`)}),e}function ci(n){let e=n.annotations.flatMap(r=>{let i=ai(r);return i?[{instruction:i,pathname:r.pathname}]:[]});if(e.length===0)return;if(new Set(e.map(r=>r.pathname).filter(Boolean)).size<=1)return e.map(r=>r.instruction).join(`
2
2
 
3
3
  `);let o=new Map;for(let r of e){let i=r.pathname||"(unknown)",s=o.get(i)??[];s.push(r.instruction),o.set(i,s)}return[...o.entries()].map(([r,i])=>`\`${r}\`
4
4
  ${i.map(s=>`- ${s}`).join(`
@@ -409,340 +409,4 @@ type PopmeltSubjectAdapter = {
409
409
  removeSubject?(key: string): void;
410
410
  };
411
411
 
412
- /** Geometry is normalized against the loaded image, not its rendered size. */
413
- type ImageObjectBox = {
414
- left: number;
415
- top: number;
416
- width: number;
417
- height: number;
418
- };
419
- /** A provider's observation; no inference runtime is required by Core. */
420
- type ImageObjectObservation = {
421
- label: string;
422
- score: number;
423
- box: ImageObjectBox;
424
- };
425
-
426
- type PersistedImageSubject = {
427
- id: string;
428
- label: string;
429
- detectedLabel?: string;
430
- score: number;
431
- box: ImageObjectBox;
432
- detectedBox?: ImageObjectBox;
433
- origin: 'detected' | 'manual';
434
- boundsOverridden?: boolean;
435
- };
436
- type PersistedImageSuppression = {
437
- detectedLabel: string;
438
- detectedBox: ImageObjectBox;
439
- };
440
- type PersistedImageAnalysis = {
441
- schemaVersion: 1;
442
- source: string;
443
- imageHash: string;
444
- inferenceKey: string;
445
- dedupeKey: string;
446
- subjects: readonly PersistedImageSubject[];
447
- /** Inferred objects explicitly removed by the user for this image hash. */
448
- suppressions?: readonly PersistedImageSuppression[];
449
- updatedAt: number;
450
- };
451
- type ImageSubjectStore = {
452
- load(key: string): PersistedImageAnalysis | null | Promise<PersistedImageAnalysis | null>;
453
- save(key: string, analysis: PersistedImageAnalysis): void | Promise<void>;
454
- remove?(key: string): void | Promise<void>;
455
- /** Older content-hash versions retained before the active record changed. */
456
- loadHistory?(key: string): readonly PersistedImageAnalysis[] | Promise<readonly PersistedImageAnalysis[]>;
457
- };
458
- type BrowserImageSubjectStoreOptions = {
459
- /** Prefix used for browser storage entries. */
460
- namespace?: string;
461
- /** Override localStorage, primarily for embedded browsers and tests. */
462
- storage?: Storage;
463
- };
464
- declare function createBrowserImageSubjectStore(options?: BrowserImageSubjectStoreOptions): ImageSubjectStore;
465
- declare function createMemoryImageSubjectStore(): ImageSubjectStore;
466
-
467
- type ImageContentHasher = (image: HTMLImageElement) => string | Promise<string>;
468
- /** Optional perception boundary. Core keeps media authoring usable without it. */
469
- type ImageRecognitionProvider = {
470
- cacheKey: string;
471
- configurationKey: string;
472
- detect(image: HTMLImageElement): Promise<readonly ImageObjectObservation[]>;
473
- reconcile(observations: readonly ImageObjectObservation[], previousSubjects: readonly PersistedImageSubject[], suppressions: readonly PersistedImageSuppression[]): readonly PersistedImageSubject[];
474
- dispose?(): void | Promise<void>;
475
- };
476
- type ImageSubjectAdapterOptions = {
477
- /** Optional perception; omit for manual-only image annotation. */
478
- recognition?: ImageRecognitionProvider;
479
- /** Restore saved subjects without hashing or running recognition. */
480
- hydrateOnly?: boolean;
481
- /** Images to analyze when the adapter starts. Defaults to every image. */
482
- selector?: string;
483
- /** Root to scan and observe. Defaults to document. */
484
- root?: Document | Element;
485
- /** Observe added images and src changes. Defaults to true. */
486
- observe?: boolean;
487
- /** Override the durable Core adapter id. */
488
- id?: string;
489
- /** Persist detections and user overrides. Omit to keep adapter state ephemeral. */
490
- store?: ImageSubjectStore;
491
- /** Override content hashing, primarily for authenticated or virtual images. */
492
- imageHasher?: ImageContentHasher;
493
- onError?: (error: unknown, image: HTMLImageElement) => void;
494
- };
495
- declare class ImageSubjectAdapter implements PopmeltSubjectAdapter {
496
- private readonly options;
497
- readonly surfaceKind: "image";
498
- readonly id: string;
499
- private readonly records;
500
- private readonly imageKeys;
501
- private readonly analyzedSources;
502
- private readonly pending;
503
- private readonly analysisMetadata;
504
- private readonly suppressions;
505
- private readonly writeChains;
506
- private readonly pendingWrites;
507
- private readonly observer;
508
- private refreshQueued;
509
- private destroyed;
510
- private readyPromise;
511
- private manualSequence;
512
- constructor(options?: ImageSubjectAdapterOptions);
513
- whenReady(): Promise<void>;
514
- listSubjects(): readonly PopmeltSubject[];
515
- refresh(): Promise<void>;
516
- hitTest(clientPoint: {
517
- x: number;
518
- y: number;
519
- }): PopmeltSubject | null;
520
- resolve(key: string): PopmeltSubject | null;
521
- restoreSubject(key: string, elementInfo: ElementInfo): PopmeltSubject | null;
522
- private imageObjectContext;
523
- captureSubject(key: string): Promise<Blob | null>;
524
- beginCreate(clientPoint: {
525
- x: number;
526
- y: number;
527
- }): PopmeltSubjectCreationSession | null;
528
- renameSubject(key: string, label: string): PopmeltSubject | null;
529
- updateSubjectBounds(key: string, bounds: PopmeltSubjectBounds): PopmeltSubject | null;
530
- removeSubject(key: string): void;
531
- destroy(): Promise<void>;
532
- private queueRefresh;
533
- private analyze;
534
- private replaceImageRecords;
535
- private imageIdentity;
536
- private matchingImages;
537
- private clampedImagePoint;
538
- private newObjectId;
539
- private persistImage;
540
- private saveImage;
541
- private imageSubjects;
542
- private persistencePayload;
543
- private removeImage;
544
- }
545
- declare function createImageSubjectAdapter(options?: ImageSubjectAdapterOptions): ImageSubjectAdapter;
546
-
547
- type VideoObjectBox = ImageObjectBox;
548
- type VideoTrackingAnchor = PopmeltSubjectTrackingAnchor;
549
- type VideoTrackKeyframe = {
550
- time: number;
551
- box: VideoObjectBox;
552
- score: number;
553
- source: 'manual' | 'tracked';
554
- };
555
- type VideoTrackObservation = {
556
- time: number;
557
- box: VideoObjectBox;
558
- score: number;
559
- };
560
- type VideoTrackingAttempt = {
561
- /** Expand the normal local search crop during reacquisition. */
562
- searchScale?: number;
563
- };
564
- type VideoTrackSegment = {
565
- /** First media time at which this object is confidently observable. */
566
- start: number;
567
- /** Last confidently observable media time. Omitted while the segment is open. */
568
- end?: number;
569
- };
570
- type VideoTrackingSeed = {
571
- video: HTMLVideoElement;
572
- time: number;
573
- box: VideoObjectBox;
574
- anchors?: readonly VideoTrackingAnchor[];
575
- };
576
- type VideoTrackingSession = {
577
- track(video: HTMLVideoElement, time: number, attempt?: VideoTrackingAttempt): Promise<VideoTrackObservation | null>;
578
- reseed?(seed: VideoTrackingSeed): void | Promise<void>;
579
- dispose?(): void | Promise<void>;
580
- };
581
- type VideoTrackSmoother = {
582
- /** Builds one presentation frame from a chronological durable observation. */
583
- smooth(frame: VideoTrackKeyframe): VideoTrackKeyframe;
584
- };
585
- type VideoMotionState = {
586
- visible: boolean;
587
- misses: number;
588
- hits: number;
589
- lostAt?: number;
590
- };
591
- type VideoMotionPresenceDecision = {
592
- state: VideoMotionState;
593
- action: 'accept' | 'hold' | 'close' | 'reopen';
594
- };
595
- type VideoMotionAttempt = {
596
- framesPerSecond: number;
597
- tracking: VideoTrackingAttempt;
598
- };
599
- type VideoBackwardAnalysisOptions = {
600
- source: HTMLVideoElement;
601
- seedTime: number;
602
- keyframes: readonly VideoTrackKeyframe[];
603
- anchors: readonly VideoTrackingAnchor[];
604
- maximumFramesPerSecond: number;
605
- cancelled: () => boolean;
606
- forwardWork: () => Promise<void> | undefined;
607
- };
608
- type VideoBackwardAnalysisResult = {
609
- earliestTime: number;
610
- keyframes: VideoTrackKeyframe[];
611
- };
612
- /**
613
- * Pixel-derived motion policy supplied by a perception extension. Core invokes
614
- * it, then stores and renders the resulting durable and presentation tracks.
615
- */
616
- type VideoMotionPolicy = {
617
- createSmoother(): VideoTrackSmoother;
618
- attempt(options: {
619
- state: VideoMotionState;
620
- time: number;
621
- maximumFramesPerSecond: number;
622
- }): VideoMotionAttempt;
623
- observe(options: {
624
- state: VideoMotionState;
625
- time: number;
626
- observation: VideoTrackObservation | null;
627
- }): VideoMotionPresenceDecision;
628
- analyzeBackward(options: VideoBackwardAnalysisOptions): Promise<VideoBackwardAnalysisResult>;
629
- };
630
- /** Optional local perception boundary. Core owns tracks and authoring. */
631
- type VideoTrackingProvider = {
632
- cacheKey: string;
633
- configurationKey: string;
634
- motion: VideoMotionPolicy;
635
- createSession(seed: VideoTrackingSeed): Promise<VideoTrackingSession>;
636
- dispose?(): void | Promise<void>;
637
- };
638
- type PersistedVideoTrack = {
639
- id: string;
640
- label: string;
641
- origin: 'manual' | 'detected';
642
- keyframes: readonly VideoTrackKeyframe[];
643
- /** See-derived display geometry, persisted so Core can replay it alone. */
644
- presentationKeyframes?: readonly VideoTrackKeyframe[];
645
- anchors?: readonly VideoTrackingAnchor[];
646
- /** Explicit visible spans. Missing on schema-v1 tracks, which migrate open-ended. */
647
- segments?: readonly VideoTrackSegment[];
648
- /** Furthest media time already covered by forward inference. */
649
- analyzedThrough?: number;
650
- createdAt: number;
651
- updatedAt: number;
652
- };
653
- type PersistedVideoAnalysis = {
654
- schemaVersion: 1 | 2 | 3;
655
- source: string;
656
- duration: number;
657
- tracks: readonly PersistedVideoTrack[];
658
- updatedAt: number;
659
- };
660
- type VideoSubjectStore = {
661
- load(key: string): PersistedVideoAnalysis | null | Promise<PersistedVideoAnalysis | null>;
662
- save(key: string, analysis: PersistedVideoAnalysis): void | Promise<void>;
663
- remove?(key: string): void | Promise<void>;
664
- };
665
-
666
- type VideoSubjectAdapterOptions = {
667
- tracking?: VideoTrackingProvider;
668
- selector?: string;
669
- root?: Document | Element;
670
- observe?: boolean;
671
- id?: string;
672
- store?: VideoSubjectStore;
673
- maxTrackingFramesPerSecond?: number;
674
- onError?: (error: unknown, video: HTMLVideoElement) => void;
675
- };
676
- declare class VideoSubjectAdapter implements PopmeltSubjectAdapter {
677
- private readonly options;
678
- readonly surfaceKind: "video";
679
- readonly id: string;
680
- private readonly records;
681
- private readonly videoKeys;
682
- private readonly metadata;
683
- private readonly analyzedSources;
684
- private readonly listeners;
685
- private readonly frameHandles;
686
- private readonly persistTimers;
687
- private readonly writeChains;
688
- private readonly pendingWrites;
689
- private readonly observer;
690
- private refreshQueued;
691
- private destroyed;
692
- private manualSequence;
693
- private activeTrackingKey;
694
- private readyPromise;
695
- constructor(options?: VideoSubjectAdapterOptions);
696
- whenReady(): Promise<void>;
697
- listSubjects(): readonly PopmeltSubject[];
698
- refresh(): Promise<void>;
699
- hitTest(point: {
700
- x: number;
701
- y: number;
702
- }): PopmeltSubject | null;
703
- resolve(key: string): PopmeltSubject | null;
704
- captureSubject(key: string): Promise<Blob | null>;
705
- beginCreate(point: {
706
- x: number;
707
- y: number;
708
- }): PopmeltSubjectCreationSession | null;
709
- renameSubject(key: string, label: string): PopmeltSubject | null;
710
- updateSubjectBounds(key: string, bounds: PopmeltSubjectBounds): PopmeltSubject | null;
711
- updateSubjectTrackingAnchors(key: string, anchors: readonly PopmeltSubjectTrackingAnchor[]): PopmeltSubject | null;
712
- removeSubject(key: string): void;
713
- destroy(): Promise<void>;
714
- private analyze;
715
- private addVideoListeners;
716
- private removeVideoListeners;
717
- private scheduleFrame;
718
- private trackVideo;
719
- private startSession;
720
- private reseed;
721
- private failTracking;
722
- private activeRecordFor;
723
- private activateMostRecentRecord;
724
- private activateTrackingRecord;
725
- private scheduleBackwardAnalysis;
726
- private cancelBackwardAnalysis;
727
- private runBackwardAnalysis;
728
- private acceptObservation;
729
- private openSegment;
730
- private closeSegment;
731
- private insertKeyframe;
732
- private rebuildPresentationTrack;
733
- private clearLiveFrames;
734
- private videoObjectContext;
735
- private replaceVideoRecords;
736
- private persistVideo;
737
- private schedulePersistence;
738
- private flushScheduledPersistence;
739
- private matchingVideos;
740
- private videoIdentity;
741
- private newObjectId;
742
- private removeVideoRecords;
743
- private removeVideo;
744
- private queueRefresh;
745
- }
746
- declare function createVideoSubjectAdapter(options?: VideoSubjectAdapterOptions): VideoSubjectAdapter;
747
-
748
- export { type VideoTrackingAttempt as $, type Annotation as A, type BridgeStatus as B, type ClaudeResponse as C, type DomModification as D, type ElementInfo as E, type PersistedImageSuppression as F, type PersistedVideoAnalysis as G, type PersistedVideoTrack as H, type ImageRecognitionProvider as I, type VideoBackwardAnalysisOptions as J, type VideoBackwardAnalysisResult as K, type VideoMotionAttempt as L, type VideoMotionPolicy as M, type VideoMotionPresenceDecision as N, type OpaqueTargetReference as O, type PopmeltSubjectAdapter as P, type VideoMotionState as Q, type ReactSourceLocation as R, type SubjectFeedbackAttachment as S, type TextModification as T, VideoSubjectAdapter as U, type VideoTrackingProvider as V, type VideoTrackKeyframe as W, type VideoTrackObservation as X, type VideoTrackSegment as Y, type VideoTrackSmoother as Z, type VideoTrackingAnchor as _, type ImageSubjectAdapterOptions as a, type VideoTrackingSeed as a0, type VideoTrackingSession as a1, createBrowserImageSubjectStore as a2, createImageSubjectAdapter as a3, createMemoryImageSubjectStore as a4, createVideoSubjectAdapter as a5, type VideoSubjectAdapterOptions as b, type AnnotationAttachment as c, type StyleModification as d, type SpacingTokenChange as e, type AnnotationType as f, type ImageObjectContext as g, type Point as h, type PopmeltSubject as i, type PopmeltSubjectBounds as j, type PopmeltSubjectCreationSession as k, type PopmeltSubjectTrackingAnchor as l, type PopmeltSurfaceSnapshot as m, type StyleChange as n, type ToolType as o, type VideoObjectContext as p, type ImageObjectBox as q, type VideoSubjectStore as r, type VideoObjectBox as s, type BrowserImageSubjectStoreOptions as t, type ImageContentHasher as u, type ImageObjectObservation as v, ImageSubjectAdapter as w, type ImageSubjectStore as x, type PersistedImageAnalysis as y, type PersistedImageSubject as z };
412
+ export type { Annotation as A, BridgeStatus as B, ClaudeResponse as C, DomModification as D, ElementInfo as E, ImageObjectContext as I, OpaqueTargetReference as O, PopmeltSubjectAdapter as P, ReactSourceLocation as R, SubjectFeedbackAttachment as S, TextModification as T, VideoObjectContext as V, AnnotationAttachment as a, StyleModification as b, SpacingTokenChange as c, AnnotationType as d, Point as e, PopmeltSubject as f, PopmeltSubjectBounds as g, PopmeltSubjectCreationSession as h, PopmeltSubjectTrackingAnchor as i, PopmeltSurfaceSnapshot as j, StyleChange as k, ToolType as l };