PageSourceSearch

https://phasoric.com/assets/resource-service-C2BGoH03.js

js phasoric.com collected 2026-10-02 01:42:04 UTC 3,523 bytes, 1 lines download raw bytes

1import{r as w}from"./rolldown-runtime-BNNRdYrd.js";import{V as p}from"./index-D2055s_4.js";import{r as i}from"./db-CXCmPHI7.js";import{a as y,c as g,i as v,l as F,n as R,o as S,s as _,t as d}from"./resource-model-B1LoNgVt.js";var $=w({resourceForSource:()=>C,upsertResource:()=>m,upsertResourceFromRecord:()=>E,upsertResourcesFromRecords:()=>I}),l=Object.freeze({note:S,attachment:v,capture:y,researchSource:g,researchArtifact:_,syncInventory:F});function f(e,t){const s=t.contentFingerprint||e?.contentFingerprint||"",o=e?R(e,{...t,id:e.id,contentFingerprint:s}):null,c=[...new Set([...e?.aliases||[],...t.aliases||[],e?.canonicalUri&&e.canonicalUri!==t.canonicalUri?e.canonicalUri:"",e?.sourceKey&&String(e.sourceKey)!==String(t.sourceKey)?String(e.sourceKey):""].filter(Boolean))].slice(-100);return{resource:{...e,...t,id:e?.id||t.id,aliases:c,contentFingerprint:s,trust:t.trust?.state==="untracked"&&e?.trust?.state&&e.trust.state!=="untracked"?e.trust:t.trust,createdAt:e?.createdAt||t.createdAt,status:t.status==="deleted"?"deleted":o?.changed?"changed":["changed","stale"].includes(e?.status)?e.status:t.status,updatedAt:Date.now()},change:o}}async function A(e,t){const s=new Map((await t.resources.bulkGet(e.map(o=>o.id))).filter(Boolean).map(o=>[o.id,o]));return e.map(o=>s.get(o.id)||null)}async function m(e,{database:t=i}={}){const s=d(e),o=await t.resources.get(s.id)||await t.resources.where("identity").equals(s.identity).first(),{resource:c,change:r}=f(o,s);return await t.resources.put(c),!o&&typeof window<"u"&&p("resource_created",{source_type:c.type,provider:c.provider||"local"}),typeof window<"u"&&window.dispatchEvent(new CustomEvent(o?r?.changed?"resource-changed":"resource-updated":"resource-created",{detail:{resourceId:c.id,type:c.type,provider:c.provider,change:r}})),{resource:c,created:!o,change:r}}async function I(e=[],{database:t=i}={}){const s=[...new Map(e.map(({kind:r,record:n})=>l[r]?.(n)).filter(Boolean).map(r=>d(r)).map(r=>[r.id,r])).values()];if(!s.length)return[];const o=await A(s,t),c=s.map((r,n)=>({...f(o[n],r),created:!o[n]}));if(await t.resources.bulkPut(c.map(r=>r.resource)),typeof window<"u"){const r=c.filter(u=>u.created),n=c.filter(u=>u.change?.changed);for(const u of new Set(r.map(a=>a.resource.type))){const a=r.filter(h=>h.resource.type===u).length;p("resource_created",{source_type:u,count_bucket:a>100?"100_plus":a>10?"11_to_100":a>1?"2_to_10":"1"})}n.length?window.dispatchEvent(new CustomEvent("resource-changed",{detail:{resourceIds:n.map(u=>u.resource.id).slice(0,100),changeCount:n.length,batched:!0}})):window.dispatchEvent(new CustomEvent("resource-updated",{detail:{resourceIds:c.map(u=>u.resource.id).slice(0,100),updateCount:c.length,batched:!0}}))}return c}async function E(e,t,{database:s=i}={}){const o=l[e];if(!o)throw new Error(`Unsupported Resource adapter: ${e}`);const c=o(t);return c?m(c,{database:s}):null}async function C(e={},{database:t=i}={}){if(e.resourceId)return t.resources.get(e.resourceId);const s=[e.id,e.noteId,e.attachmentId,e.path].filter(Boolean).map(String);if(!s.length)return null;const o=String(e.type||"").toLowerCase(),c=o==="note"?s.map(r=>`note:${r}`):o==="attachment"||o==="pdf"||o==="image"?s.map(r=>`attachment:${r}`):o==="research-source"?s.map(r=>`research:${r}`):[];for(const r of c){const n=await t.resources.where("identity").equals(r).first();if(n)return n}return t.resources.filter(r=>s.includes(String(r.sourceKey))||r.aliases?.some(n=>s.includes(String(n)))).first()}export{E as i,$ as n,m as r,C as t};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.