@kanonak-protocol/sdk 3.75.0 → 3.77.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/browser.d.ts +2 -0
  2. package/dist/browser.js +2 -2
  3. package/dist/chunk-CG43Z65M.js +2 -0
  4. package/dist/chunk-IUZZDC2U.js +1 -0
  5. package/dist/{chunk-FX7JDGL6.js → chunk-KXVSGB6Q.js} +1 -1
  6. package/dist/chunk-NPEGVH4R.js +84 -0
  7. package/dist/{chunk-GN2XODVC.js → chunk-PJMOM5H7.js} +1 -1
  8. package/dist/{chunk-F5ANO7MJ.js → chunk-RVOMWGIN.js} +1 -1
  9. package/dist/chunk-XQS5LDSO.js +1 -0
  10. package/dist/{chunk-X5TYWQRA.js → chunk-XWRVENU6.js} +1 -1
  11. package/dist/chunk-Z5ELOT2C.js +1 -0
  12. package/dist/index.d.ts +2 -2
  13. package/dist/index.js +26 -26
  14. package/dist/introspection/OntologyModel.d.ts +80 -7
  15. package/dist/introspection/ShaclConstraints.d.ts +48 -0
  16. package/dist/introspection/index.d.ts +1 -1
  17. package/dist/parsing/index.js +1 -1
  18. package/dist/reasoning/index.js +1 -1
  19. package/dist/resolution/TypeDirectedResolver.d.ts +11 -0
  20. package/dist/resolution/index.d.ts +1 -1
  21. package/dist/resolution/index.js +1 -1
  22. package/dist/search/index.js +1 -1
  23. package/dist/server/index.js +1 -1
  24. package/dist/transformations/index.js +1 -1
  25. package/dist/uri-helpers/UriHelpers.d.ts +6 -0
  26. package/dist/uri-helpers/index.d.ts +1 -1
  27. package/dist/uri-helpers/index.js +1 -1
  28. package/dist/validation/index.d.ts +1 -1
  29. package/dist/validation/index.js +1 -1
  30. package/dist/validation/rules/repository/DiamondNameClashRule.d.ts +30 -0
  31. package/dist/validation/rules/repository/OwlOneOfRule.d.ts +28 -0
  32. package/dist/validation/rules/repository/ShaclShapeRule.d.ts +32 -0
  33. package/dist/validation/rules/repository/index.d.ts +3 -0
  34. package/package.json +2 -2
  35. package/dist/chunk-BGQKZBNE.js +0 -1
  36. package/dist/chunk-C7RZIMEH.js +0 -80
  37. package/dist/chunk-CRKSKIAL.js +0 -1
  38. package/dist/chunk-G2DKKSZ4.js +0 -1
  39. package/dist/chunk-Y7TGQ7UF.js +0 -2
package/dist/index.d.ts CHANGED
@@ -8,7 +8,7 @@ export { GitIgnoreFilter } from './filtering/index.js';
8
8
  export type { IGitIgnoreFilter } from './filtering/index.js';
9
9
  export { KanonakParser, KanonakObjectParser, PropertyMetadata, KanonakDocumentPositions, parseWithPositions, findMarkdownLinkAt, } from './parsing/index.js';
10
10
  export type { IKanonakObjectParser, SourcePosition, ImportPackageEntry, ParsedDocumentWithPositions, } from './parsing/index.js';
11
- export { ResourceResolver, KanonakUri, KanonakUriBuilder, parseKanonakAddress, formatKanonakAddress, KanonakUrlResolver, TypeResolver, ResourceTypeClassifier, findInstancesByType, compareVersions, versionsEqual, formatVersion, parseVersionString, createVersion, isCompatibleVersion, isMajorCompatible, pickHighestDocument, versionOperatorFromChar, versionOperatorToChar, propertiesInScope, resolvePropertyStep, contextTypesOf, subjectUri, assertPackageIdentity, } from './resolution/index.js';
11
+ export { ResourceResolver, KanonakUri, KanonakUriBuilder, parseKanonakAddress, formatKanonakAddress, KanonakUrlResolver, TypeResolver, ResourceTypeClassifier, findInstancesByType, compareVersions, versionsEqual, formatVersion, parseVersionString, createVersion, isCompatibleVersion, isMajorCompatible, pickHighestDocument, versionOperatorFromChar, versionOperatorToChar, propertiesInScope, resolvePropertyStep, contextTypesOf, subjectUri, superClassChain, assertPackageIdentity, } from './resolution/index.js';
12
12
  export type { ResourceResolutionResult, ILogger, InstanceSearchResult, DocumentVersionPick, PropertyDescriptor, PropertyKind, StepResolution, KanonakAddress, UrlAddress, PublisherUrlAddress, PackageUrlAddress, ResourceUrlAddress, VersionSpec, UrlForm, } from './resolution/index.js';
13
13
  export { Kanonak, DefinedKanonak, SubjectKanonak, EmbeddedKanonak, ReferenceKanonak, LiteralKanonak } from './kanonaks/index.js';
14
14
  export type { IStatement } from './statements/index.js';
@@ -35,4 +35,4 @@ export { PackageBuilder, ImportBook, contentAddressedName, sanitizeName, Produce
35
35
  export type { BuiltPackage, ImportEntry, IPackageProducer, ProduceResult, VersionRange, IEntitlementPolicy, IMeter, ProduceContext, PackageAddress, EntitlementDecision, RequestPrincipal, } from './producer/index.js';
36
36
  export { canonicalForm, canonicalHash } from './canonical/index.js';
37
37
  export { buildOntologyModel } from './introspection/index.js';
38
- export type { OntologyModel, ClassDef, PropertyDef, ClassRef, TypeRef, BuildOntologyModelOptions, } from './introspection/index.js';
38
+ export type { OntologyModel, ClassDef, PropertyDef, ClassRef, TypeRef, EnumDef, EnumMember, BuildOntologyModelOptions, } from './introspection/index.js';
package/dist/index.js CHANGED
@@ -1,12 +1,12 @@
1
- import{a as hn,b as bn,c as Pn,d as wn,e as $e}from"./chunk-FX7JDGL6.js";import{a as pr,c as De,e as Ye,h as Ze,i as Qe,j as dr}from"./chunk-X5TYWQRA.js";import{a as yn,b as gn,c as kn,d as Y,e as Z,f as u}from"./chunk-Y7TGQ7UF.js";import{a as ur}from"./chunk-F5ANO7MJ.js";import"./chunk-QHABFCRC.js";import{a as Ht,b as zt,c as Wt,d as Gt,e as Jt,f as Qt,g as en,h as tn}from"./chunk-ATH6636H.js";import{b as qt,c as Xt,d as Zt}from"./chunk-LKBG2MK6.js";import{a as Ft}from"./chunk-4NO7MHS7.js";import{a as Rn,b as Cn,c as En,d as vn}from"./chunk-GN2XODVC.js";import{a as Kn,b as Dn}from"./chunk-PEUTCG3B.js";import{a as In}from"./chunk-PEJALHXK.js";import{a as Yt}from"./chunk-SC5M74NM.js";import{A as ir,B as sr,C as cr,G as lr,a as An,b as On,c as Tn,d as Vn,e as Un,f as Nn,g as _n,h as Ln,i as Mn,j as Fn,k as Hn,l as zn,m as Wn,n as Gn,o as Jn,p as qn,q as Xn,r as Yn,s as Zn,t as Qn,u as er,v as tr,w as nr,x as rr,y as or,z as ar}from"./chunk-C7RZIMEH.js";import"./chunk-SHDHMKMJ.js";import{a as b,b as Re,c as an,d as mn,e as fn,f as C}from"./chunk-G2DKKSZ4.js";import{a as A}from"./chunk-TJPQETHV.js";import{a as P,b as je,c as xn,d,e as $n,f as jn,g as Bn}from"./chunk-BGQKZBNE.js";import{a as E,f as v,i as T,j as w,k as Be,l as V,m as Xe}from"./chunk-CRKSKIAL.js";import{b as sn,c as cn,d as O,e as ln,f as un,h as pn,j as dn}from"./chunk-IOMNZBK4.js";import{a as nn,b as we,c as m,d as y,e as rn,f as on,g as Ce,h as Ee,i as ve,j as Ke,k as xe,l as Ie}from"./chunk-W6T7MOKY.js";import{a as Se}from"./chunk-FUUTGGJS.js";import{a as Vt,b as be,c as X,d as Pe,e as R,f as Ut,g as Nt,h as _t,i as Lt,j as Mt}from"./chunk-2ACBWC7K.js";import{a as Sn}from"./chunk-ODIECDN7.js";import{VersionOperator as Oi}from"@kanonak-protocol/types/document/models/enums";import{existsSync as $r,readFileSync as jr}from"fs";import{homedir as Br}from"os";import{join as Dr}from"path";import{execFile as mr}from"child_process";import{promisify as fr}from"util";var Q=fr(mr),ee="kanonak",te="/usr/bin/security",U=class{async get(e){let t=u(e);try{let{stdout:r}=await Q(te,["find-generic-password","-s",ee,"-a",t,"-w"],{timeout:1e4});try{return JSON.parse(r.trim())}catch{throw new Error(`Stored credential for '${t}' is corrupted (not valid JSON).
2
- Run 'kanonak logout ${t}' then 'kanonak login ${t}' to fix.`)}}catch(r){if(et(r,44))return null;throw new Error(`macOS Keychain read failed for '${t}': ${ne(r)}
1
+ import{a as sr,b as cr,c as lr,d as ur,e as ye}from"./chunk-KXVSGB6Q.js";import{a as tn,c as be,e as Oe,h as Ne,i as Ue,j as rn}from"./chunk-XWRVENU6.js";import{a as or,b as ir,c as ar,d as U,e as _,f as l,g as nn}from"./chunk-CG43Z65M.js";import{a as en}from"./chunk-RVOMWGIN.js";import"./chunk-QHABFCRC.js";import{a as Bt,b as At,c as Vt,d as Dt,e as Tt,f as Lt,g as Ft,h as Mt}from"./chunk-ATH6636H.js";import{b as Ot,c as Nt,d as _t}from"./chunk-LKBG2MK6.js";import{a as jt}from"./chunk-4NO7MHS7.js";import{a as pr,b as mr,c as fr,d as yr}from"./chunk-PJMOM5H7.js";import{a as gr,b as Rr}from"./chunk-PEUTCG3B.js";import{a as kr}from"./chunk-PEJALHXK.js";import{a as Ut}from"./chunk-SC5M74NM.js";import{A as Yr,B as Zr,C as Xr,L as Qr,a as Er,b as Cr,c as vr,d as xr,e as Kr,f as $r,g as Ir,h as jr,i as Br,j as Ar,k as Vr,l as Dr,m as Tr,n as Or,o as Nr,p as Ur,q as _r,r as Lr,s as Fr,t as Mr,u as Hr,v as zr,w as Wr,x as Gr,y as Jr,z as qr}from"./chunk-NPEGVH4R.js";import"./chunk-SHDHMKMJ.js";import{a as y,b as ce,c as Jt,d as tr,e as rr,f as E}from"./chunk-IUZZDC2U.js";import{a as S}from"./chunk-TJPQETHV.js";import{a as nr,b as ge,c as hr,d as g,e as br,f as Pr,g as wr,h as Sr}from"./chunk-Z5ELOT2C.js";import{f as N,k as C,l as he,m as ke,n as Te}from"./chunk-XQS5LDSO.js";import{b as qt,c as Yt,d as R,e as Zt,f as Xt,h as Qt,j as er}from"./chunk-IOMNZBK4.js";import{a as Ht,b as se,c as f,d as k,e as Wt,f as Gt,g as le,h as ue,i as de,j as pe,k as me,l as fe}from"./chunk-W6T7MOKY.js";import{a as zt}from"./chunk-FUUTGGJS.js";import{a as Et,b as ae,c as O,d as Ct,e as h,f as vt,g as xt,h as Kt,i as $t,j as It}from"./chunk-2ACBWC7K.js";import{a as dr}from"./chunk-ODIECDN7.js";import{VersionOperator as ca}from"@kanonak-protocol/types/document/models/enums";import{existsSync as Sn,readFileSync as Rn}from"fs";import{homedir as En}from"os";import{join as Cn}from"path";import{execFile as on}from"child_process";import{promisify as an}from"util";var L=an(on),F="kanonak",M="/usr/bin/security",v=class{async get(e){let t=l(e);try{let{stdout:n}=await L(M,["find-generic-password","-s",F,"-a",t,"-w"],{timeout:1e4});try{return JSON.parse(n.trim())}catch{throw new Error(`Stored credential for '${t}' is corrupted (not valid JSON).
2
+ Run 'kanonak logout ${t}' then 'kanonak login ${t}' to fix.`)}}catch(n){if(_e(n,44))return null;throw new Error(`macOS Keychain read failed for '${t}': ${H(n)}
3
3
  The Keychain may be locked or inaccessible.
4
- Try unlocking it via Keychain Access.app or running 'security unlock-keychain'.`)}}async store(e,t){let r=u(e),o=JSON.stringify(t);try{await Q(te,["add-generic-password","-s",ee,"-a",r,"-U","-w",o],{timeout:1e4})}catch(a){throw new Error(`macOS Keychain write failed for '${r}': ${ne(a)}
4
+ Try unlocking it via Keychain Access.app or running 'security unlock-keychain'.`)}}async store(e,t){let n=l(e),o=JSON.stringify(t);try{await L(M,["add-generic-password","-s",F,"-a",n,"-U","-w",o],{timeout:1e4})}catch(i){throw new Error(`macOS Keychain write failed for '${n}': ${H(i)}
5
5
  Ensure the Keychain is unlocked and the CLI has write permission.
6
- On managed devices, your IT policy may block credential storage.`)}}async remove(e){let t=u(e);try{await Q(te,["delete-generic-password","-s",ee,"-a",t],{timeout:1e4})}catch(r){if(et(r,44))return;console.warn(` Warning: macOS Keychain delete failed for '${t}': ${ne(r)}
7
- The credential may not have been fully removed.`)}}async list(){try{let{stdout:e}=await Q(te,["dump-keychain"],{timeout:1e4}),t=[],r=!1;for(let o of e.split(`
8
- `))if(o.includes(`"svce"<blob>="${ee}"`)&&(r=!0),r&&o.includes('"acct"<blob>=')){let a=o.match(/"acct"<blob>="([^"]+)"/);a&&t.push(a[1]),r=!1}return t}catch(e){return console.warn(` Warning: Could not enumerate Keychain entries: ${ne(e)}`),[]}}};function et(n,e){return typeof n=="object"&&n!==null&&"code"in n&&n.code===e}function ne(n){return n instanceof Error?n.message:String(n)}import{execFile as yr}from"child_process";import{promisify as gr}from"util";var kr=gr(yr),re="kanonak:",N=class{async get(e){let t=re+u(e),r=`
9
- ${ae}
6
+ On managed devices, your IT policy may block credential storage.`)}}async remove(e){let t=l(e);try{await L(M,["delete-generic-password","-s",F,"-a",t],{timeout:1e4})}catch(n){if(_e(n,44))return;console.warn(` Warning: macOS Keychain delete failed for '${t}': ${H(n)}
7
+ The credential may not have been fully removed.`)}}async list(){try{let{stdout:e}=await L(M,["dump-keychain"],{timeout:1e4}),t=[],n=!1;for(let o of e.split(`
8
+ `))if(o.includes(`"svce"<blob>="${F}"`)&&(n=!0),n&&o.includes('"acct"<blob>=')){let i=o.match(/"acct"<blob>="([^"]+)"/);i&&t.push(i[1]),n=!1}return t}catch(e){return console.warn(` Warning: Could not enumerate Keychain entries: ${H(e)}`),[]}}};function _e(r,e){return typeof r=="object"&&r!==null&&"code"in r&&r.code===e}function H(r){return r instanceof Error?r.message:String(r)}import{execFile as sn}from"child_process";import{promisify as cn}from"util";var ln=cn(sn),z="kanonak:",x=class{async get(e){let t=z+l(e),n=`
9
+ ${G}
10
10
  $target = [Console]::In.ReadLine()
11
11
  $ptr = [IntPtr]::Zero
12
12
  $result = [CredMan]::CredRead($target, 1, 0, [ref]$ptr)
@@ -18,8 +18,8 @@ try {
18
18
  [System.Text.Encoding]::Unicode.GetString($bytes)
19
19
  } finally {
20
20
  [CredMan]::CredFree($ptr)
21
- }`;try{let{stdout:o}=await oe(r,t),a=o.trim();return a?JSON.parse(a):null}catch{return null}}async store(e,t){let r=re+u(e),o=JSON.stringify(t),a=`
22
- ${ae}
21
+ }`;try{let{stdout:o}=await W(n,t),i=o.trim();return i?JSON.parse(i):null}catch{return null}}async store(e,t){let n=z+l(e),o=JSON.stringify(t),i=`
22
+ ${G}
23
23
  $target = [Console]::In.ReadLine()
24
24
  $json = [Console]::In.ReadLine()
25
25
  $bytes = [System.Text.Encoding]::Unicode.GetBytes($json)
@@ -35,13 +35,13 @@ try {
35
35
  if (-not $result) { throw "CredWrite failed" }
36
36
  } finally {
37
37
  [System.Runtime.InteropServices.Marshal]::FreeHGlobal($cred.CredentialBlob)
38
- }`;try{await oe(a,`${r}
39
- ${o}`)}catch(i){throw new Error(`Windows Credential Manager write failed: ${String(i)}`)}}async remove(e){let t=re+u(e),r=`
40
- ${ae}
38
+ }`;try{await W(i,`${n}
39
+ ${o}`)}catch(a){throw new Error(`Windows Credential Manager write failed: ${String(a)}`)}}async remove(e){let t=z+l(e),n=`
40
+ ${G}
41
41
  $target = [Console]::In.ReadLine()
42
- [CredMan]::CredDelete($target, 1, 0) | Out-Null`;try{await oe(r,t)}catch{}}async list(){let e=`
43
- ${ae}
44
- ${hr}
42
+ [CredMan]::CredDelete($target, 1, 0) | Out-Null`;try{await W(n,t)}catch{}}async list(){let e=`
43
+ ${G}
44
+ ${un}
45
45
  $prefix = [Console]::In.ReadLine()
46
46
  $count = 0
47
47
  $pCreds = [IntPtr]::Zero
@@ -55,8 +55,8 @@ if ([CredMan]::CredEnumerate($null, 0, [ref]$count, [ref]$pCreds)) {
55
55
  }
56
56
  }
57
57
  [CredMan]::CredFree($pCreds)
58
- }`;try{let{stdout:t}=await oe(e,re);return t.trim().split(`
59
- `).map(r=>r.trim()).filter(Boolean)}catch{return[]}}};async function oe(n,e){for(let t of["pwsh","powershell"])try{return await kr(t,["-NoProfile","-NonInteractive","-Command",n],{timeout:15e3,...e!==void 0&&{input:e}})}catch(r){if(t==="powershell")throw r}throw new Error("Neither pwsh nor powershell found")}var ae=`
58
+ }`;try{let{stdout:t}=await W(e,z);return t.trim().split(`
59
+ `).map(n=>n.trim()).filter(Boolean)}catch{return[]}}};async function W(r,e){for(let t of["pwsh","powershell"])try{return await ln(t,["-NoProfile","-NonInteractive","-Command",r],{timeout:15e3,...e!==void 0&&{input:e}})}catch(n){if(t==="powershell")throw n}throw new Error("Neither pwsh nor powershell found")}var G=`
60
60
  Add-Type -TypeDefinition @"
61
61
  using System;
62
62
  using System.Runtime.InteropServices;
@@ -87,13 +87,13 @@ public class CredMan {
87
87
  [DllImport("Advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
88
88
  public static extern bool CredEnumerate(string filter, int flags, out int count, out IntPtr credentials);
89
89
  }
90
- "@`,hr="";import{execFile as br,spawn as Pr}from"child_process";import{promisify as wr}from"util";var se=wr(br),ie="kanonak",_=class{async get(e){let t=u(e);try{let{stdout:r}=await se("secret-tool",["lookup","service",ie,"publisher",t],{timeout:1e4}),o=r.trim();return o?JSON.parse(o):null}catch{return null}}async store(e,t){let r=u(e),o=JSON.stringify(t);await new Promise((a,i)=>{let s=Pr("secret-tool",["store","--label",`Kanonak: ${r}`,"service",ie,"publisher",r],{stdio:["pipe","ignore","ignore"],timeout:1e4});s.stdin.write(o),s.stdin.end(),s.on("close",c=>{c===0?a():i(new Error(`secret-tool store exited with code ${c}`))}),s.on("error",i)})}async remove(e){let t=u(e);try{await se("secret-tool",["clear","service",ie,"publisher",t],{timeout:1e4})}catch{}}async list(){try{let{stdout:e}=await se("secret-tool",["search","service",ie],{timeout:1e4}),t=[];for(let r of e.split(`
91
- `)){let o=r.match(/attribute\.publisher\s*=\s*(.+)/);o&&t.push(o[1].trim())}return t}catch{return[]}}};async function Ae(){try{return await se("sh",["-c","command -v secret-tool"],{timeout:5e3}),!0}catch{return!1}}import{existsSync as tt,mkdirSync as nt,readFileSync as rt,writeFileSync as ot}from"fs";import{createCipheriv as Sr,createDecipheriv as Rr,randomBytes as at}from"crypto";import{homedir as Cr}from"os";import{join as Ve,dirname as it}from"path";var ct=Ve(Cr(),".config","kanonak"),L=Ve(ct,"keyring.key"),ce=Ve(ct,"credentials.enc"),st="aes-256-gcm",Oe=32,I=12,Te=16,M=class{async get(e){let t=this.loadStore(),r=u(e);return t[r]??null}async store(e,t){let r=this.loadStore(),o=u(e);r[o]=t,this.saveStore(r)}async remove(e){let t=this.loadStore(),r=u(e);delete t[r],this.saveStore(t)}async list(){let e=this.loadStore();return Object.keys(e)}loadStore(){if(!tt(ce))return{};try{let e=this.getOrCreateKey(),t=rt(ce);if(t.length<I+Te)return{};let r=t.subarray(0,I),o=t.subarray(I,I+Te),a=t.subarray(I+Te),i=Rr(st,e,r);i.setAuthTag(o);let s=Buffer.concat([i.update(a),i.final()]);return JSON.parse(s.toString("utf-8"))}catch{return{}}}saveStore(e){let t=this.getOrCreateKey(),r=at(I),o=Sr(st,t,r),a=Buffer.from(JSON.stringify(e),"utf-8"),i=Buffer.concat([o.update(a),o.final()]),s=o.getAuthTag(),c=Buffer.concat([r,s,i]);nt(it(ce),{recursive:!0}),ot(ce,c,{mode:384})}getOrCreateKey(){if(tt(L)){let t=rt(L);if(t.length!==Oe)throw new Error(`Credential keyring key is corrupted (expected ${Oe} bytes, got ${t.length}). Delete ${L} and re-authenticate.`);return t}let e=at(Oe);return nt(it(L),{recursive:!0}),ot(L,e,{mode:384}),e}};import{execFile as Er}from"child_process";import{promisify as vr}from"util";var Kr=vr(Er),lt=3e4,F=class{constructor(e){this.helperPath=e}helperPath;async get(e){let t=u(e);try{let o=(await this.runHelper("get",{publisher:t})).trim();return o?JSON.parse(o):null}catch(r){throw new Error(`Credential helper '${this.helperPath}' failed to read credential for '${t}': ${le(r)}
90
+ "@`,un="";import{execFile as dn,spawn as pn}from"child_process";import{promisify as mn}from"util";var q=mn(dn),J="kanonak",K=class{async get(e){let t=l(e);try{let{stdout:n}=await q("secret-tool",["lookup","service",J,"publisher",t],{timeout:1e4}),o=n.trim();return o?JSON.parse(o):null}catch{return null}}async store(e,t){let n=l(e),o=JSON.stringify(t);await new Promise((i,a)=>{let s=pn("secret-tool",["store","--label",`Kanonak: ${n}`,"service",J,"publisher",n],{stdio:["pipe","ignore","ignore"],timeout:1e4});s.stdin.write(o),s.stdin.end(),s.on("close",c=>{c===0?i():a(new Error(`secret-tool store exited with code ${c}`))}),s.on("error",a)})}async remove(e){let t=l(e);try{await q("secret-tool",["clear","service",J,"publisher",t],{timeout:1e4})}catch{}}async list(){try{let{stdout:e}=await q("secret-tool",["search","service",J],{timeout:1e4}),t=[];for(let n of e.split(`
91
+ `)){let o=n.match(/attribute\.publisher\s*=\s*(.+)/);o&&t.push(o[1].trim())}return t}catch{return[]}}};async function Pe(){try{return await q("sh",["-c","command -v secret-tool"],{timeout:5e3}),!0}catch{return!1}}import{existsSync as Le,mkdirSync as Fe,readFileSync as Me,writeFileSync as He}from"fs";import{createCipheriv as fn,createDecipheriv as yn,randomBytes as ze}from"crypto";import{homedir as gn}from"os";import{join as Re,dirname as We}from"path";var Je=Re(gn(),".config","kanonak"),$=Re(Je,"keyring.key"),Y=Re(Je,"credentials.enc"),Ge="aes-256-gcm",we=32,b=12,Se=16,I=class{async get(e){let t=this.loadStore(),n=l(e);return t[n]??null}async store(e,t){let n=this.loadStore(),o=l(e);n[o]=t,this.saveStore(n)}async remove(e){let t=this.loadStore(),n=l(e);delete t[n],this.saveStore(t)}async list(){let e=this.loadStore();return Object.keys(e)}loadStore(){if(!Le(Y))return{};try{let e=this.getOrCreateKey(),t=Me(Y);if(t.length<b+Se)return{};let n=t.subarray(0,b),o=t.subarray(b,b+Se),i=t.subarray(b+Se),a=yn(Ge,e,n);a.setAuthTag(o);let s=Buffer.concat([a.update(i),a.final()]);return JSON.parse(s.toString("utf-8"))}catch{return{}}}saveStore(e){let t=this.getOrCreateKey(),n=ze(b),o=fn(Ge,t,n),i=Buffer.from(JSON.stringify(e),"utf-8"),a=Buffer.concat([o.update(i),o.final()]),s=o.getAuthTag(),c=Buffer.concat([n,s,a]);Fe(We(Y),{recursive:!0}),He(Y,c,{mode:384})}getOrCreateKey(){if(Le($)){let t=Me($);if(t.length!==we)throw new Error(`Credential keyring key is corrupted (expected ${we} bytes, got ${t.length}). Delete ${$} and re-authenticate.`);return t}let e=ze(we);return Fe(We($),{recursive:!0}),He($,e,{mode:384}),e}};import{execFile as hn}from"child_process";import{promisify as kn}from"util";var bn=kn(hn),qe=3e4,j=class{constructor(e){this.helperPath=e}helperPath;async get(e){let t=l(e);try{let o=(await this.runHelper("get",{publisher:t})).trim();return o?JSON.parse(o):null}catch(n){throw new Error(`Credential helper '${this.helperPath}' failed to read credential for '${t}': ${Z(n)}
92
92
  Verify the helper binary exists, is executable, and implements the Kanonak credential helper protocol.
93
- Check the 'credentialHelper' path in ~/.kanonak/config.json.`)}}async store(e,t){let r=u(e);try{await this.runHelper("store",{publisher:r,credential:t})}catch(o){throw new Error(`Credential helper '${this.helperPath}' failed to store credential for '${r}': ${le(o)}
94
- Verify the helper binary supports the 'store' action.`)}}async remove(e){let t=u(e);try{await this.runHelper("erase",{publisher:t})}catch(r){console.warn(` Warning: Credential helper '${this.helperPath}' failed to erase credential for '${t}': ${le(r)}`)}}async list(){try{let e=await this.runHelper("list",void 0);return JSON.parse(e.trim())}catch(e){return console.warn(` Warning: Credential helper '${this.helperPath}' failed to list credentials: ${le(e)}`),[]}}async runHelper(e,t){try{let{stdout:r}=await Kr(this.helperPath,[e],{...t&&{input:JSON.stringify(t)},timeout:lt});return r}catch(r){throw xr(r)?new Error(`Credential helper not found at '${this.helperPath}'.
95
- Check the 'credentialHelper' path in ~/.kanonak/config.json.`):Ir(r)?new Error(`Credential helper '${this.helperPath}' timed out after ${lt/1e3}s on '${e}'.
96
- The helper may be waiting for authentication to an external vault.`):r}}};function le(n){return n instanceof Error?n.message:String(n)}function xr(n){return n instanceof Error&&"code"in n&&n.code==="ENOENT"}function Ir(n){return n instanceof Error&&"killed"in n&&n.killed}var Ue=Dr(Br(),".kanonak","config.json"),ue=class{backend=null;backendReady=null;async getBackend(){if(this.backend)return this.backend;if(this.backendReady)return this.backendReady;this.backendReady=this.resolveBackend();try{return this.backend=await this.backendReady,this.backend}catch(e){throw this.backendReady=null,e}}async getToken(e){let t=Ar(e);if(t)return t;let o=await(await this.getBackend()).get(e);return!o||!Z(o)?null:o.accessToken??null}async getCredential(e){return(await this.getBackend()).get(e)}async store(e,t){return(await this.getBackend()).store(e,t)}async remove(e){return(await this.getBackend()).remove(e)}async list(){return(await this.getBackend()).list()}async resolveBackend(){let e=Or();return e.credentialHelper?new F(e.credentialHelper):process.platform==="darwin"?new U:process.platform==="win32"?new N:await Ae()?new _:new M}};function Ar(n){let t="KANONAK_TOKEN_"+u(n).replace(/[.\-]/g,"_").toUpperCase();return process.env[t]??null}function Or(){if(!$r(Ue))return{};try{return JSON.parse(jr(Ue,"utf-8"))}catch(n){let e=n instanceof Error?n.message:String(n);return console.warn(` Warning: Failed to parse ${Ue}: ${e}
97
- Using default credential backend. Fix the JSON syntax or delete the file.`),{}}}import{createHash as Tr,createPrivateKey as Vr,generateKeyPairSync as Ur,randomUUID as Nr,sign as _r}from"crypto";function pt(){let{publicKey:n,privateKey:e}=Ur("ec",{namedCurve:"P-256"});return{publicKey:n.export({format:"jwk"}),privateKey:e.export({format:"jwk"})}}function H(n,e,t,r,o,a){let i={alg:"ES256",typ:"dpop+jwt",jwk:{kty:e.kty,crv:e.crv,x:e.x,y:e.y}},s={jti:Nr(),htm:t.toUpperCase(),htu:r,iat:Math.floor(Date.now()/1e3)};return o&&(s.ath=Tr("sha256").update(o).digest("base64url")),a&&(s.nonce=a),Lr(i,s,n)}function dt(n){return!n||n.length===0?!1:n.some(e=>e.toUpperCase()==="ES256")}function Lr(n,e,t){let r=ut(JSON.stringify(n)),o=ut(JSON.stringify(e)),a=`${r}.${o}`,i=Vr({key:t,format:"jwk"}),c=_r("SHA256",Buffer.from(a),{key:i,dsaEncoding:"ieee-p1363"}).toString("base64url");return`${a}.${c}`}function ut(n){return Buffer.from(n,"utf-8").toString("base64url")}function mt(n){let e=new Map;return async(t,r,o="GET")=>{if(!n)return fetch(t,{method:o});let a=await n.getCredential(r);if(!a?.accessToken)return fetch(t,{method:o});Y(a)&&console.warn(` Warning: Access token for '${r}' is expired. Run 'kanonak login ${r}' to re-authenticate.`);let i={};if(a.dpopKeyPair){let c=e.get(r);try{let l=H(a.dpopKeyPair.privateKey,a.dpopKeyPair.publicKey,o,t,a.accessToken,c);i.Authorization=`DPoP ${a.accessToken}`,i.DPoP=l}catch(l){let p=l instanceof Error?l.message:String(l);console.error(` Error: Failed to create DPoP proof for '${r}': ${p}
98
- The stored key pair may be corrupted. Run 'kanonak login ${r}' to re-authenticate.`),i.Authorization=`Bearer ${a.accessToken}`}}else i.Authorization=`Bearer ${a.accessToken}`;let s=await fetch(t,{method:o,headers:i});if(s.status===401&&a.dpopKeyPair){let c=s.headers.get("DPoP-Nonce");if(c){e.set(r,c);try{let l=H(a.dpopKeyPair.privateKey,a.dpopKeyPair.publicKey,o,t,a.accessToken,c);i.DPoP=l,s=await fetch(t,{method:o,headers:i})}catch{}}}return s}}import{readFileSync as Mr,writeFileSync as Fr,existsSync as Hr}from"fs";import{createHash as zr}from"crypto";import ft from"js-yaml";var yt="kanonak.lock",Wr=`# This file is generated by Kanonak CLI. Do not edit manually.
99
- `;function gt(n=yt){if(!Hr(n))return null;let e=Mr(n,"utf-8"),t=ft.load(e);return!t||typeof t!="object"||t.version!=="1"?null:{version:"1",lastUpdated:t.lastUpdated??new Date().toISOString(),packages:t.packages??{}}}function kt(n,e=yt){n.lastUpdated=new Date().toISOString();let t={};for(let o of Object.keys(n.packages).sort())t[o]=n.packages[o];n.packages=t;let r=ft.dump(n,{lineWidth:-1,sortKeys:!1,quotingType:'"'});Fr(e,Wr+r,"utf-8")}function ht(n){return`sha256:${zr("sha256").update(n).digest("hex")}`}import*as Le from"js-yaml";import{createHash as Gr}from"crypto";function Ne(n){let e=[];for(let r of n)r instanceof m&&e.push(Jr(r));return e.sort((r,o)=>r.uri<o.uri?-1:r.uri>o.uri?1:0),JSON.stringify({subjects:e})}function pe(n){let e=Ne(n);return`sha256:${Gr("sha256").update(e,"utf8").digest("hex")}`}function Jr(n){let e=eo(n),t=_e(n.statement);return{uri:e,statements:t}}function _e(n){let e=[];for(let t of n){let r=qr(t);r&&e.push(r)}return e.sort((t,r)=>t.predicate<r.predicate?-1:t.predicate>r.predicate?1:0),e}function qr(n){let e=Qr(n);if(!e)return;let t=Xr(n);if(t)return Zr(e,t)}function Xr(n){if(n instanceof Ce)return{type:"string",value:n.object};if(n instanceof Ee)return{type:"number",value:St(n.object)};if(n instanceof ve)return{type:"boolean",value:n.object};if(n instanceof Ke)return{type:"ref",value:Pt(n.object)};if(n instanceof xe){let e=n.object;return bt(e)}if(n instanceof Ie)return{type:"list",items:n.object.map(Yr)}}function bt(n){let e=_e(n.statement);return n.name&&n.name.length>0?{type:"embedded",name:n.name,statements:e}:{type:"embedded",statements:e}}function Yr(n){if(n instanceof y)return{type:"ref",value:Pt(n)};if(n instanceof b)return bt(n);if(n instanceof Re){let e=n.value;if(typeof e=="string")return{type:"string",value:e};if(typeof e=="number")return{type:"number",value:St(e)};if(typeof e=="boolean")return{type:"boolean",value:e}}if(n instanceof we)return{type:"embedded",statements:_e(n.statement)};throw new Error(`canonicalForm: list item of unrecognized kind (${n.constructor?.name??typeof n}); add canonicalization support before hashing data that contains it`)}function Zr(n,e){switch(e.type){case"string":return{predicate:n,type:"string",value:e.value};case"number":return{predicate:n,type:"number",value:e.value};case"boolean":return{predicate:n,type:"boolean",value:e.value};case"ref":return{predicate:n,type:"ref",value:e.value};case"embedded":return e.name!==void 0?{predicate:n,type:"embedded",name:e.name,statements:e.statements}:{predicate:n,type:"embedded",statements:e.statements};case"list":return{predicate:n,type:"list",items:e.items}}}function Qr(n){let e=n.predicate;if(e)return wt(e.subject)}function eo(n){let e=n.namespace??"",t=n.name??"";return`${e}/${t}`}function Pt(n){return wt(n.subject)}function wt(n){let e=n.version;return e&&typeof e.major=="number"?`${n.publisher}/${n.package_}@${e.major}.${e.minor}.${e.patch}/${n.name}`:`${n.publisher}/${n.package_}/${n.name}`}function St(n){if(Number.isNaN(n))throw new Error("canonicalForm: NaN cannot be canonicalized");if(!Number.isFinite(n))throw new Error("canonicalForm: \xB1Infinity cannot be canonicalized");return Object.is(n,-0)?"0":String(n)}import{VersionOperator as Rt}from"@kanonak-protocol/types/document/models/enums";var to="0.0.0",$=class{constructor(e,t=new A,r){this.repository=e;this.parser=t;this.objectParser=r??new C(this.parser)}repository;parser;objectParser;imports(){return new z}serializeValue(e,t){return vt(e,t)}async buildContentAddressed(e){let t=e.book.toImports(),r=await this.hashBody(e.publisher,t,e.body),o=Me(r),a={type:"EphemeralPackage",publisher:e.publisher,imports:t};e.contentHashProperty&&(a[e.contentHashProperty]=r),Object.assign(a,e.header??{}),a.imports=t;let i={[o]:a,...e.body},s=this.dump(i);return{yaml:s,byteCount:Et(s),contentHash:r,packageName:o,publisher:e.publisher,resourceCount:Object.keys(e.body).length}}async buildNamed(e){let t=e.book.toImports(),r={type:e.type??"Package",publisher:e.publisher,version:e.version,imports:t},o;e.contentHashProperty&&(o=await this.hashBody(e.publisher,t,e.body),r[e.contentHashProperty]=o),Object.assign(r,e.header??{}),r.imports=t;let a={[e.name]:r,...e.body},i=this.dump(a),s={yaml:i,byteCount:Et(i),packageName:e.name,publisher:e.publisher,resourceCount:Object.keys(e.body).length};return o!==void 0&&(s.contentHash=o),s}dump(e){return Le.dump(e,{lineWidth:-1})}async hashBody(e,t,r){let o={[Ct]:{type:"EphemeralPackage",publisher:e,imports:t},...r},a=this.parser.parse(Le.dump(o,{lineWidth:-1})),i=a.metadata.namespace_?.toString(),c=(await this.objectParser.parseKanonaks(new Xe(a,this.repository))).filter(l=>l instanceof m&&l.namespace===i&&l.name!==Ct);for(let l of c)l.namespace="ephemeral";return pe(c)}},Ct="__pkgbuilder_probe__";function Et(n){return new TextEncoder().encode(n).length}function Me(n){let e="sha256:",t=n.startsWith(e)?e.length:0;return`q-${n.slice(t,t+16)}`}var z=class{byKey=new Map;aliases=new Set;ensure(e,t,r,o,a=Rt.Major){let i=`${e}/${t}@${r}`,s=this.byKey.get(i);if(s)return s.alias;let c=this.uniqueAlias(o);return this.byKey.set(i,{publisher:e,package_:t,version:r,alias:c,match:a}),c}ref(e){if(!e.version||typeof e.version.major!="number")throw new Error(`Cannot serialize a reference to ${e.publisher}/${e.package_}/${e.name} without a version.`);return`${this.ensure(e.publisher,e.package_,R(e.version),e.package_)}.${e.name}`}refLatest(e,t,r,o){return`${this.ensure(e,t,to,o??t,Rt.Any)}.${r}`}toImports(){let e=new Map;for(let r of this.byKey.values()){let o=e.get(r.publisher)??[];o.push(r),e.set(r.publisher,o)}return[...e.keys()].sort().map(r=>({publisher:r,packages:e.get(r).sort((o,a)=>o.package_<a.package_?-1:1).map(o=>({package:o.package_,match:be(o.match),version:o.version,alias:o.alias}))}))}uniqueAlias(e){let t=W(e)||"pkg",r=t,o=2;for(;this.aliases.has(r);)r=`${t}${o++}`;return this.aliases.add(r),r}};function vt(n,e){if(n!=null){if(typeof n=="string"||typeof n=="number"||typeof n=="boolean")return n;if(n instanceof y)return e.ref(n.subject);if(Array.isArray(n)){let t=n.map(r=>vt(r,e)).filter(r=>r!==void 0);return t.length>0?t:void 0}if(n instanceof b)throw new Error("Embedded values are not yet supported by PackageBuilder. Produce a literal or a reference, or compose the embedded shape into the output class.");if(no(n))throw new Error(`Value produced a bare URI without a version (${n.publisher}/${n.package_}/${n.name}); cannot serialize it as a reference.`)}}function W(n){return n.replace(/[^A-Za-z0-9-]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")}function no(n){return typeof n=="object"&&n!==null&&typeof n.publisher=="string"&&typeof n.package_=="string"&&typeof n.name=="string"}var de=class{constructor(e){this.producers=e}producers;produced=new Map;producerFor(e,t){return this.producers.find(r=>r.canProduce(e,t))}async produceCached(e,t,r,o){let a=`${t}/${r}@${R(o)}`,i=this.produced.get(a);if(i)return i;let{document:s}=await e.produce(t,r,o);return this.produced.set(a,s),s}async getHighestCompatibleVersionAsync(e,t){let r=this.producerFor(e,t.packageName);if(!r)return null;let o={operator:t.versionOperator,version:t.version},a=await r.resolveVersion(e,t.packageName,o);return a?this.produceCached(r,e,t.packageName,a):null}async getDocumentAsync(e){let t;try{t=je(e)}catch{return null}if(t.kind!=="package"||!t.version)return null;let r=this.producerFor(t.publisher,t.package_);return r?this.produceCached(r,t.publisher,t.package_,t.version):null}async getDocumentsByNamespaceAsync(e,t){return Array.from(this.produced.values()).filter(r=>{let o=r.metadata.namespace_;return o!=null&&o.publisher===e&&o.package_===t})}async getAllDocumentsAsync(){return Array.from(this.produced.values())}async saveDocumentAsync(e,t){throw new Error("ProducerRepository is read-only: a producer is a source, not a store.")}async deleteDocumentAsync(e){throw new Error("ProducerRepository is read-only: a producer is a source, not a store.")}async clearNamespaceAsync(e,t){throw new Error("ProducerRepository is read-only: a producer is a source, not a store.")}async getAllDocumentReferencesAsync(){return[]}async getDocumentContentAsync(e){return null}async getDocumentUriAsync(e){return null}};var Fe={async authorize(){return{allowed:!0}}},He={async record(){}},G=class extends Error{constructor(t,r){let o=`${t.publisher}/${t.package_}${t.version?`@${t.version.major}.${t.version.minor}.${t.version.patch}`:""}`;super(`Not entitled to produce ${o}${r?`: ${r}`:""}`);this.address=t;this.reason=r;this.name="EntitlementDeniedError"}address;reason},me=class{inner;ctx;policy;meter;constructor(e,t,r=Fe,o=He){this.inner=e,this.ctx=t,this.policy=r,this.meter=o}canProduce(e,t){return this.inner.canProduce(e,t)}async resolveVersion(e,t,r){return await this.assertAllowed({publisher:e,package_:t,version:r.version}),this.inner.resolveVersion(e,t,r)}async produce(e,t,r){let o={publisher:e,package_:t,version:r};await this.assertAllowed(o);let a=await this.inner.produce(e,t,r);return await this.meter.record(this.ctx,o,a),a}async assertAllowed(e){let t=await this.policy.authorize(this.ctx,e);if(!t.allowed)throw new G(e,t.reason)}};var f="kanonak.org",g="view",Kt="core-kanonak",ro={publisher:f,package_:g,name:"rootView"},oo={publisher:f,package_:g,name:"bind"},ao={publisher:f,package_:g,name:"produces"},io={publisher:f,package_:g,name:"projections"},so={publisher:f,package_:g,name:"where"},co={publisher:f,package_:g,name:"value"},lo={publisher:f,package_:g,name:"as"},fe=class{constructor(e,t=new A){this.repository=e;this.parser=t;this.objectParser=new C(this.parser),this.builder=new $(this.repository,this.parser,this.objectParser)}repository;parser;objectParser;builder;async materialize(e,t={}){let r=await this.objectParser.parseKanonaks(this.repository),o=this.resolveView(r,e),a=w(o,oo);if(!a)throw new Error(`View ${o.namespace}/${o.name} declares no view.bind; cannot materialize.`);let i=w(o,ao);if(!i)throw new Error(`View ${o.namespace}/${o.name} is a selection view (no view.produces). In-graph materialization of selection views is not yet supported \u2014 declare a view.produces output class to reshape the result.`);let s=uo(o),c=xt(r,f,Kt),l=xt(r,f,g),p=this.builder.imports(),k=p.ensure(f,Kt,c,"ck"),h=p.ensure(f,g,l,"v"),S=p.ref(i),x=new Qe(this.repository,this.parser,this.objectParser),B=new Ye(x,r),J=this.readProjections(r,o),ge=fo(o,so),At=this.findInstances(r,a,await this.reason(t)),We={},Ot=new Set;for(let q of At){if(!await this.passesWhere(B,r,ge,q))continue;let he={type:S};for(let Je of J){let Tt=await this.evaluateValue(B,r,Je.value,q),qe=this.builder.serializeValue(It(Tt),p);qe!==void 0&&(he[p.ref(Je.as)]=qe)}let Ge=d(q);Ge&&(he[`${h}.derivedFrom`]=p.ref(Ge)),We[this.rowName(q,Ot)]=he}let ke={};t.resolvedAt&&(ke[`${k}.resolvedAt`]=t.resolvedAt),t.invocationId&&(ke[`${k}.id`]=t.invocationId);let D=await this.builder.buildContentAddressed({publisher:s,book:p,body:We,contentHashProperty:`${k}.contentHash`,header:ke});return{yaml:D.yaml,contentHash:D.contentHash,packageName:D.packageName,publisher:D.publisher,rowCount:D.resourceCount}}resolveView(e,t){let r=v(e,t);if(!r)throw new Error(`View ${t.publisher}/${t.package_}/${t.name} not found in the catalog.`);let o=w(r,ro);if(o){let a=v(e,o);if(!a)throw new Error(`ViewPackage ${t.name} names rootView ${o.name}, which is not in the catalog.`);return a}return r}readProjections(e,t){let r=[];for(let o of V(t,io)){let a=o instanceof b?o:o instanceof y?v(e,o.subject):void 0;if(!a)continue;let i=Be(a,co),s=w(a,lo);i&&s&&r.push({value:i,as:s})}return r}async reason(e){return new $e({profile:e.reasoningProfile??"owl-rl-classification"}).reason(this.repository)}findInstances(e,t,r){let o=mo(e),a=[],i=new Set;for(let s of r.getInstancesOfClass(t)){if(i.has(s))continue;i.add(s);let c=o.get(s);c&&a.push(c)}return a.sort((s,c)=>{let l=O(d(s)),p=O(d(c));return l<p?-1:l>p?1:0}),a}async passesWhere(e,t,r,o){for(let a of r){let i=await this.evaluateValue(e,t,a,o);if(!yo(i))return!1}return!0}async evaluateValue(e,t,r,o){let a=Ze(r,"view-projection",{catalog:t,depth:0}),i=new Map([["input",o]]);return e.evaluate(a,i)}rowName(e,t){let r=W(e.name)||"row",o=r,a=2;for(;t.has(o);)o=`${r}-${a++}`;return t.add(o),o}};function It(n){return De(n)?n.value:Array.isArray(n)?n.map(It):n}function uo(n){let e=d(n);if(!e)throw new Error(`Could not derive a publisher from view ${n.namespace}/${n.name}.`);return e.publisher}function xt(n,e,t){let r=po(n,e,t);if(!r)throw new Error(`Package ${e}/${t} is not in the catalog; it must be importable to materialize a view.`);return r}function po(n,e,t){let r;for(let o of n){if(!(o instanceof m))continue;let a=d(o);!a||a.publisher!==e||a.package_!==t||!a.version||(!r||X(a.version,r)>0)&&(r=a.version)}return r?R(r):void 0}function mo(n){let e=new Map,t=new Map;for(let r of n){if(!(r instanceof m))continue;let o=d(r);if(!o||!o.version)continue;let a=O(o),i=t.get(a);(!i||X(o.version,i)>0)&&(t.set(a,o.version),e.set(a,r))}return e}function fo(n,e){let t=Be(n,e);return t?[t]:V(n,e).filter(r=>r instanceof b)}function yo(n){return n===!0?!0:n===!1||n===void 0||n===null?!1:typeof n=="string"?n.length>0:typeof n=="number"?n!==0:De(n)?n.value.length>0:Array.isArray(n)?n.length>0:!!n}var K="kanonak.org",j="core-rdf",go="core-xsd",ko={publisher:K,package_:j,name:"domain"},ho={publisher:K,package_:j,name:"range"},$t={publisher:K,package_:j,name:"subClassOf"},jt={publisher:K,package_:j,name:"label"},Bt={publisher:K,package_:j,name:"comment"},bo=new Se(K,j,"Resource"),ye=n=>n;function ze(n,e){let t=w(n,e);if(t)return[t];let r=[];for(let o of V(n,e))o instanceof y&&r.push(o.subject);return r}function Po(n,e,t){let r=new Set([E(e)]);if(!t)return r;r.add(E(bo));let o=new Set,a=[e];for(;a.length>0;){let i=a.shift(),s=E(i);if(o.has(s))continue;o.add(s),r.add(s);let c=v(n,i);c&&a.push(...ze(c,$t))}return r}function wo(n,e,t){let r=v(n,e);if(r){let o=ye(r);if(P.isClassType(o))return{kind:"class",uri:d(r)??e,localName:r.name};if(P.isDatatypeType(o))return{kind:"datatype",uri:e}}return e.publisher===K&&e.package_===go?{kind:"datatype",uri:e}:t==="datatype"?{kind:"datatype",uri:e}:{kind:"class",uri:e,localName:e.name}}function So(n){let e=ye(n);return P.isObjectPropertyType(e)?"object":P.isDatatypePropertyType(e)?"datatype":"other"}function Ro(n,e,t){let r=Po(n,e,t),o=[],a=new Set;for(let i of n){if(!(i instanceof m))continue;let s=ye(i);if(!P.isAnyPropertyType(s)||!ze(i,ko).some(ge=>r.has(E(ge))))continue;let l=d(i);if(!l)continue;let p=E(l);if(a.has(p))continue;a.add(p);let k=w(i,ho);if(!k)throw new Error(`Property ${l.publisher}/${l.package_}/${l.name} has no rdfs.range; every property must declare a range. Validate the ontology before introspecting it.`);let h=So(i),S=wo(n,k,h),x=h==="object"?"object":h==="datatype"?"datatype":S.kind==="class"?"object":"datatype",B=T(i,jt),J=T(i,Bt);o.push({uri:l,localName:l.name,kind:x,range:S,...B!==void 0?{label:B}:{},...J!==void 0?{comment:J}:{}})}return o}async function Dt(n,e,t){let r=n.metadata?.namespace_;if(!r)throw new Error("buildOntologyModel: document has no namespace (publisher/package/version).");let o=t?.includeInherited??!1,a=await new C().parseKanonaks(e),i=[],s=new Set;for(let c of a){if(!(c instanceof m)||!P.isClassType(ye(c)))continue;let l=d(c);if(!l||l.publisher!==r.publisher||l.package_!==r.package_||l.version&&r.version&&!Pe(l.version,r.version))continue;let p=E(l);if(s.has(p))continue;s.add(p);let k=ze(c,$t).map(x=>({uri:x,localName:x.name})),h=T(c,jt),S=T(c,Bt);i.push({uri:l,localName:l.name,superClasses:k,properties:Ro(a,l,o),...h!==void 0?{label:h}:{},...S!==void 0?{comment:S}:{}})}return{classes:i}}export{tr as AmbiguousReferenceRule,ve as BooleanStatement,sr as ClassDefinitionRule,Wn as ClassHierarchyCycleRule,Wt as CompositeKanonakDocumentRepository,ue as CredentialStore,we as DefinedKanonak,Qn as DefinitionPropertyReferenceRule,zt as DocumentLocation,gn as EdgeType,b as EmbeddedKanonak,Fn as EmbeddedKanonakTypeRule,xe as EmbeddedStatement,G as EntitlementDeniedError,me as EntitlementProducer,Ht as FileSystemKanonakDocumentRepository,Sn as GitIgnoreFilter,kn as GraphBuilder,Zt as HttpKanonakDocumentRepository,z as ImportBook,Hn as ImportExistenceRule,Ft as InMemoryKanonakDocumentRepository,Zn as InstancePropertyReferenceRule,nn as Kanonak,Cn as KanonakDocumentPositions,C as KanonakObjectParser,lr as KanonakObjectValidator,A as KanonakParser,Se as KanonakUri,Kn as KanonakUriBuilder,In as KanonakUrlResolver,dn as KanonakVocabulary,Ie as ListStatement,Re as LiteralKanonak,Qt as LocalFirstRepository,dr as LookRenderer,cr as MarkdownLinkRule,an as MarkdownStatement,Yn as NamespaceImportCycleRule,Nn as NamespacePrefixRule,yn as NodeType,Ee as NumberStatement,Pn as OWL_RL_CLASSIFICATION_RULES,rr as ObjectPropertyImportRule,or as ObjectPropertyValueValidationRule,Tn as OntologyValidationError,An as OntologyValidationResult,$ as PackageBuilder,de as ProducerRepository,ar as PropertyDomainRule,Gn as PropertyHierarchyCycleRule,Rn as PropertyMetadata,nr as PropertyRangeReferenceRule,Jn as PropertyRangeRequiredRule,Ln as PropertyTypeSpecificityRule,ir as PropertyValueTypeRule,qt as PublisherConfigResolver,Xt as PublisherIndex,bn as RDFS_RULES,$e as Reasoner,wn as ReasoningResult,y as ReferenceKanonak,Ke as ReferenceStatement,Jt as RepositoryFactory,_n as ResourceNamingRule,sn as ResourceResolver,P as ResourceTypeClassifier,on as ScalarStatement,rn as Statement,Ce as StringStatement,qn as SubClassOfReferenceRule,Xn as SubPropertyOfReferenceRule,m as SubjectKanonak,Mn as SubjectKanonakTypeRequiredRule,hn as TripleStore,cn as TypeResolver,zn as UnresolvedReferenceRule,Un as ValidationCache,Vn as ValidationContext,On as ValidationSeverity,Oi as VersionOperator,fe as ViewMaterializer,er as XsdImportRule,Fe as allowAllPolicy,Yt as assertPackageIdentity,tn as buildLocalFirstRepository,Dt as buildOntologyModel,Ne as canonicalForm,pe as canonicalHash,en as collectKanonakFiles,X as compareVersions,ht as computeIntegrity,Me as contentAddressedName,Bn as contextTypesOf,mt as createAuthenticatedFetch,H as createDPoPProof,Ut as createVersion,fn as extractMarkdownLinks,ur as findDerivation,Dn as findInstancesByType,mn as findMalformedReferences,vn as findMarkdownLinkAt,xn as formatKanonakAddress,R as formatVersion,pt as generateDPoPKeyPair,Gt as getGlobalCachePath,Z as hasValidToken,_t as isCompatibleVersion,Y as isExpired,Lt as isMajorCompatible,gt as loadLockFile,ln as makeUriKey,He as noopMeter,u as normalizeHost,je as parseKanonakAddress,Nt as parseVersionString,En as parseWithPositions,Mt as pickHighestDocument,$n as propertiesInScope,pr as resolveDisplayValue,jn as resolvePropertyStep,W as sanitizeName,kt as saveLockFile,dt as serverSupportsDPoP,d as subjectUri,un as tripleKey,O as uriKey,pn as uriTriple,Vt as versionOperatorFromChar,be as versionOperatorToChar,Pe as versionsEqual};
93
+ Check the 'credentialHelper' path in ~/.kanonak/config.json.`)}}async store(e,t){let n=l(e);try{await this.runHelper("store",{publisher:n,credential:t})}catch(o){throw new Error(`Credential helper '${this.helperPath}' failed to store credential for '${n}': ${Z(o)}
94
+ Verify the helper binary supports the 'store' action.`)}}async remove(e){let t=l(e);try{await this.runHelper("erase",{publisher:t})}catch(n){console.warn(` Warning: Credential helper '${this.helperPath}' failed to erase credential for '${t}': ${Z(n)}`)}}async list(){try{let e=await this.runHelper("list",void 0);return JSON.parse(e.trim())}catch(e){return console.warn(` Warning: Credential helper '${this.helperPath}' failed to list credentials: ${Z(e)}`),[]}}async runHelper(e,t){try{let{stdout:n}=await bn(this.helperPath,[e],{...t&&{input:JSON.stringify(t)},timeout:qe});return n}catch(n){throw Pn(n)?new Error(`Credential helper not found at '${this.helperPath}'.
95
+ Check the 'credentialHelper' path in ~/.kanonak/config.json.`):wn(n)?new Error(`Credential helper '${this.helperPath}' timed out after ${qe/1e3}s on '${e}'.
96
+ The helper may be waiting for authentication to an external vault.`):n}}};function Z(r){return r instanceof Error?r.message:String(r)}function Pn(r){return r instanceof Error&&"code"in r&&r.code==="ENOENT"}function wn(r){return r instanceof Error&&"killed"in r&&r.killed}var Ee=Cn(En(),".kanonak","config.json"),X=class{backend=null;backendReady=null;async getBackend(){if(this.backend)return this.backend;if(this.backendReady)return this.backendReady;this.backendReady=this.resolveBackend();try{return this.backend=await this.backendReady,this.backend}catch(e){throw this.backendReady=null,e}}async getToken(e){let t=vn(e);if(t)return t;let o=await(await this.getBackend()).get(e);return!o||!_(o)?null:o.accessToken??null}async getCredential(e){return(await this.getBackend()).get(e)}async store(e,t){return(await this.getBackend()).store(e,t)}async remove(e){return(await this.getBackend()).remove(e)}async list(){return(await this.getBackend()).list()}async resolveBackend(){let e=xn();return e.credentialHelper?new j(e.credentialHelper):process.platform==="darwin"?new v:process.platform==="win32"?new x:await Pe()?new K:new I}};function vn(r){let t="KANONAK_TOKEN_"+l(r).replace(/[.\-]/g,"_").toUpperCase();return process.env[t]??null}function xn(){if(!Sn(Ee))return{};try{return JSON.parse(Rn(Ee,"utf-8"))}catch(r){let e=r instanceof Error?r.message:String(r);return console.warn(` Warning: Failed to parse ${Ee}: ${e}
97
+ Using default credential backend. Fix the JSON syntax or delete the file.`),{}}}import{createHash as Kn,createPrivateKey as $n,generateKeyPairSync as In,randomUUID as jn,sign as Bn}from"crypto";function Ze(){let{publicKey:r,privateKey:e}=In("ec",{namedCurve:"P-256"});return{publicKey:r.export({format:"jwk"}),privateKey:e.export({format:"jwk"})}}function B(r,e,t,n,o,i){let a={alg:"ES256",typ:"dpop+jwt",jwk:{kty:e.kty,crv:e.crv,x:e.x,y:e.y}},s={jti:jn(),htm:t.toUpperCase(),htu:n,iat:Math.floor(Date.now()/1e3)};return o&&(s.ath=Kn("sha256").update(o).digest("base64url")),i&&(s.nonce=i),An(a,s,r)}function Xe(r){return!r||r.length===0?!1:r.some(e=>e.toUpperCase()==="ES256")}function An(r,e,t){let n=Ye(JSON.stringify(r)),o=Ye(JSON.stringify(e)),i=`${n}.${o}`,a=$n({key:t,format:"jwk"}),c=Bn("SHA256",Buffer.from(i),{key:a,dsaEncoding:"ieee-p1363"}).toString("base64url");return`${i}.${c}`}function Ye(r){return Buffer.from(r,"utf-8").toString("base64url")}function Qe(r){let e=new Map;return async(t,n,o="GET")=>{if(!r)return fetch(t,{method:o});let i=await r.getCredential(n);if(!i?.accessToken)return fetch(t,{method:o});U(i)&&console.warn(` Warning: Access token for '${n}' is expired. Run 'kanonak login ${n}' to re-authenticate.`);let a={};if(i.dpopKeyPair){let c=e.get(n);try{let u=B(i.dpopKeyPair.privateKey,i.dpopKeyPair.publicKey,o,t,i.accessToken,c);a.Authorization=`DPoP ${i.accessToken}`,a.DPoP=u}catch(u){let d=u instanceof Error?u.message:String(u);console.error(` Error: Failed to create DPoP proof for '${n}': ${d}
98
+ The stored key pair may be corrupted. Run 'kanonak login ${n}' to re-authenticate.`),a.Authorization=`Bearer ${i.accessToken}`}}else a.Authorization=`Bearer ${i.accessToken}`;let s=await fetch(t,{method:o,headers:a});if(s.status===401&&i.dpopKeyPair){let c=s.headers.get("DPoP-Nonce");if(c){e.set(n,c);try{let u=B(i.dpopKeyPair.privateKey,i.dpopKeyPair.publicKey,o,t,i.accessToken,c);a.DPoP=u,s=await fetch(t,{method:o,headers:a})}catch{}}}return s}}import{readFileSync as Vn,writeFileSync as Dn,existsSync as Tn}from"fs";import{createHash as On}from"crypto";import et from"js-yaml";var tt="kanonak.lock",Nn=`# This file is generated by Kanonak CLI. Do not edit manually.
99
+ `;function rt(r=tt){if(!Tn(r))return null;let e=Vn(r,"utf-8"),t=et.load(e);return!t||typeof t!="object"||t.version!=="1"?null:{version:"1",lastUpdated:t.lastUpdated??new Date().toISOString(),packages:t.packages??{}}}function nt(r,e=tt){r.lastUpdated=new Date().toISOString();let t={};for(let o of Object.keys(r.packages).sort())t[o]=r.packages[o];r.packages=t;let n=et.dump(r,{lineWidth:-1,sortKeys:!1,quotingType:'"'});Dn(e,Nn+n,"utf-8")}function ot(r){return`sha256:${On("sha256").update(r).digest("hex")}`}import*as xe from"js-yaml";import{createHash as Un}from"crypto";function Ce(r){let e=[];for(let n of r)n instanceof f&&e.push(_n(n));return e.sort((n,o)=>n.uri<o.uri?-1:n.uri>o.uri?1:0),JSON.stringify({subjects:e})}function Q(r){let e=Ce(r);return`sha256:${Un("sha256").update(e,"utf8").digest("hex")}`}function _n(r){let e=Wn(r),t=ve(r.statement);return{uri:e,statements:t}}function ve(r){let e=[];for(let t of r){let n=Ln(t);n&&e.push(n)}return e.sort((t,n)=>t.predicate<n.predicate?-1:t.predicate>n.predicate?1:0),e}function Ln(r){let e=zn(r);if(!e)return;let t=Fn(r);if(t)return Hn(e,t)}function Fn(r){if(r instanceof le)return{type:"string",value:r.object};if(r instanceof ue)return{type:"number",value:ct(r.object)};if(r instanceof de)return{type:"boolean",value:r.object};if(r instanceof pe)return{type:"ref",value:at(r.object)};if(r instanceof me){let e=r.object;return it(e)}if(r instanceof fe)return{type:"list",items:r.object.map(Mn)}}function it(r){let e=ve(r.statement);return r.name&&r.name.length>0?{type:"embedded",name:r.name,statements:e}:{type:"embedded",statements:e}}function Mn(r){if(r instanceof k)return{type:"ref",value:at(r)};if(r instanceof y)return it(r);if(r instanceof ce){let e=r.value;if(typeof e=="string")return{type:"string",value:e};if(typeof e=="number")return{type:"number",value:ct(e)};if(typeof e=="boolean")return{type:"boolean",value:e}}if(r instanceof se)return{type:"embedded",statements:ve(r.statement)};throw new Error(`canonicalForm: list item of unrecognized kind (${r.constructor?.name??typeof r}); add canonicalization support before hashing data that contains it`)}function Hn(r,e){switch(e.type){case"string":return{predicate:r,type:"string",value:e.value};case"number":return{predicate:r,type:"number",value:e.value};case"boolean":return{predicate:r,type:"boolean",value:e.value};case"ref":return{predicate:r,type:"ref",value:e.value};case"embedded":return e.name!==void 0?{predicate:r,type:"embedded",name:e.name,statements:e.statements}:{predicate:r,type:"embedded",statements:e.statements};case"list":return{predicate:r,type:"list",items:e.items}}}function zn(r){let e=r.predicate;if(e)return st(e.subject)}function Wn(r){let e=r.namespace??"",t=r.name??"";return`${e}/${t}`}function at(r){return st(r.subject)}function st(r){let e=r.version;return e&&typeof e.major=="number"?`${r.publisher}/${r.package_}@${e.major}.${e.minor}.${e.patch}/${r.name}`:`${r.publisher}/${r.package_}/${r.name}`}function ct(r){if(Number.isNaN(r))throw new Error("canonicalForm: NaN cannot be canonicalized");if(!Number.isFinite(r))throw new Error("canonicalForm: \xB1Infinity cannot be canonicalized");return Object.is(r,-0)?"0":String(r)}import{VersionOperator as lt}from"@kanonak-protocol/types/document/models/enums";var Gn="0.0.0",P=class{constructor(e,t=new S,n){this.repository=e;this.parser=t;this.objectParser=n??new E(this.parser)}repository;parser;objectParser;imports(){return new A}serializeValue(e,t){return pt(e,t)}async buildContentAddressed(e){let t=e.book.toImports(),n=await this.hashBody(e.publisher,t,e.body),o=Ke(n),i={type:"EphemeralPackage",publisher:e.publisher,imports:t};e.contentHashProperty&&(i[e.contentHashProperty]=n),Object.assign(i,e.header??{}),i.imports=t;let a={[o]:i,...e.body},s=this.dump(a);return{yaml:s,byteCount:dt(s),contentHash:n,packageName:o,publisher:e.publisher,resourceCount:Object.keys(e.body).length}}async buildNamed(e){let t=e.book.toImports(),n={type:e.type??"Package",publisher:e.publisher,version:e.version,imports:t},o;e.contentHashProperty&&(o=await this.hashBody(e.publisher,t,e.body),n[e.contentHashProperty]=o),Object.assign(n,e.header??{}),n.imports=t;let i={[e.name]:n,...e.body},a=this.dump(i),s={yaml:a,byteCount:dt(a),packageName:e.name,publisher:e.publisher,resourceCount:Object.keys(e.body).length};return o!==void 0&&(s.contentHash=o),s}dump(e){return xe.dump(e,{lineWidth:-1})}async hashBody(e,t,n){let o={[ut]:{type:"EphemeralPackage",publisher:e,imports:t},...n},i=this.parser.parse(xe.dump(o,{lineWidth:-1})),a=i.metadata.namespace_?.toString(),c=(await this.objectParser.parseKanonaks(new Te(i,this.repository))).filter(u=>u instanceof f&&u.namespace===a&&u.name!==ut);for(let u of c)u.namespace="ephemeral";return Q(c)}},ut="__pkgbuilder_probe__";function dt(r){return new TextEncoder().encode(r).length}function Ke(r){let e="sha256:",t=r.startsWith(e)?e.length:0;return`q-${r.slice(t,t+16)}`}var A=class{byKey=new Map;aliases=new Set;ensure(e,t,n,o,i=lt.Major){let a=`${e}/${t}@${n}`,s=this.byKey.get(a);if(s)return s.alias;let c=this.uniqueAlias(o);return this.byKey.set(a,{publisher:e,package_:t,version:n,alias:c,match:i}),c}ref(e){if(!e.version||typeof e.version.major!="number")throw new Error(`Cannot serialize a reference to ${e.publisher}/${e.package_}/${e.name} without a version.`);return`${this.ensure(e.publisher,e.package_,h(e.version),e.package_)}.${e.name}`}refLatest(e,t,n,o){return`${this.ensure(e,t,Gn,o??t,lt.Any)}.${n}`}toImports(){let e=new Map;for(let n of this.byKey.values()){let o=e.get(n.publisher)??[];o.push(n),e.set(n.publisher,o)}return[...e.keys()].sort().map(n=>({publisher:n,packages:e.get(n).sort((o,i)=>o.package_<i.package_?-1:1).map(o=>({package:o.package_,match:ae(o.match),version:o.version,alias:o.alias}))}))}uniqueAlias(e){let t=V(e)||"pkg",n=t,o=2;for(;this.aliases.has(n);)n=`${t}${o++}`;return this.aliases.add(n),n}};function pt(r,e){if(r!=null){if(typeof r=="string"||typeof r=="number"||typeof r=="boolean")return r;if(r instanceof k)return e.ref(r.subject);if(Array.isArray(r)){let t=r.map(n=>pt(n,e)).filter(n=>n!==void 0);return t.length>0?t:void 0}if(r instanceof y)throw new Error("Embedded values are not yet supported by PackageBuilder. Produce a literal or a reference, or compose the embedded shape into the output class.");if(Jn(r))throw new Error(`Value produced a bare URI without a version (${r.publisher}/${r.package_}/${r.name}); cannot serialize it as a reference.`)}}function V(r){return r.replace(/[^A-Za-z0-9-]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")}function Jn(r){return typeof r=="object"&&r!==null&&typeof r.publisher=="string"&&typeof r.package_=="string"&&typeof r.name=="string"}var ee=class{constructor(e){this.producers=e}producers;produced=new Map;producerFor(e,t){return this.producers.find(n=>n.canProduce(e,t))}async produceCached(e,t,n,o){let i=`${t}/${n}@${h(o)}`,a=this.produced.get(i);if(a)return a;let{document:s}=await e.produce(t,n,o);return this.produced.set(i,s),s}async getHighestCompatibleVersionAsync(e,t){let n=this.producerFor(e,t.packageName);if(!n)return null;let o={operator:t.versionOperator,version:t.version},i=await n.resolveVersion(e,t.packageName,o);return i?this.produceCached(n,e,t.packageName,i):null}async getDocumentAsync(e){let t;try{t=ge(e)}catch{return null}if(t.kind!=="package"||!t.version)return null;let n=this.producerFor(t.publisher,t.package_);return n?this.produceCached(n,t.publisher,t.package_,t.version):null}async getDocumentsByNamespaceAsync(e,t){return Array.from(this.produced.values()).filter(n=>{let o=n.metadata.namespace_;return o!=null&&o.publisher===e&&o.package_===t})}async getAllDocumentsAsync(){return Array.from(this.produced.values())}async saveDocumentAsync(e,t){throw new Error("ProducerRepository is read-only: a producer is a source, not a store.")}async deleteDocumentAsync(e){throw new Error("ProducerRepository is read-only: a producer is a source, not a store.")}async clearNamespaceAsync(e,t){throw new Error("ProducerRepository is read-only: a producer is a source, not a store.")}async getAllDocumentReferencesAsync(){return[]}async getDocumentContentAsync(e){return null}async getDocumentUriAsync(e){return null}};var $e={async authorize(){return{allowed:!0}}},Ie={async record(){}},D=class extends Error{constructor(t,n){let o=`${t.publisher}/${t.package_}${t.version?`@${t.version.major}.${t.version.minor}.${t.version.patch}`:""}`;super(`Not entitled to produce ${o}${n?`: ${n}`:""}`);this.address=t;this.reason=n;this.name="EntitlementDeniedError"}address;reason},te=class{inner;ctx;policy;meter;constructor(e,t,n=$e,o=Ie){this.inner=e,this.ctx=t,this.policy=n,this.meter=o}canProduce(e,t){return this.inner.canProduce(e,t)}async resolveVersion(e,t,n){return await this.assertAllowed({publisher:e,package_:t,version:n.version}),this.inner.resolveVersion(e,t,n)}async produce(e,t,n){let o={publisher:e,package_:t,version:n};await this.assertAllowed(o);let i=await this.inner.produce(e,t,n);return await this.meter.record(this.ctx,o,i),i}async assertAllowed(e){let t=await this.policy.authorize(this.ctx,e);if(!t.allowed)throw new D(e,t.reason)}};var p="kanonak.org",m="view",mt="core-kanonak",qn={publisher:p,package_:m,name:"rootView"},Yn={publisher:p,package_:m,name:"bind"},Zn={publisher:p,package_:m,name:"produces"},Xn={publisher:p,package_:m,name:"projections"},Qn={publisher:p,package_:m,name:"where"},eo={publisher:p,package_:m,name:"value"},to={publisher:p,package_:m,name:"as"},re=class{constructor(e,t=new S){this.repository=e;this.parser=t;this.objectParser=new E(this.parser),this.builder=new P(this.repository,this.parser,this.objectParser)}repository;parser;objectParser;builder;async materialize(e,t={}){let n=await this.objectParser.parseKanonaks(this.repository),o=this.resolveView(n,e),i=C(o,Yn);if(!i)throw new Error(`View ${o.namespace}/${o.name} declares no view.bind; cannot materialize.`);let a=C(o,Zn);if(!a)throw new Error(`View ${o.namespace}/${o.name} is a selection view (no view.produces). In-graph materialization of selection views is not yet supported \u2014 declare a view.produces output class to reshape the result.`);let s=ro(o),c=ft(n,p,mt),u=ft(n,p,m),d=this.builder.imports(),ne=d.ensure(p,mt,c,"ck"),gt=d.ensure(p,m,u,"v"),ht=d.ref(a),kt=new Ue(this.repository,this.parser,this.objectParser),je=new Oe(kt,n),bt=this.readProjections(n,o),Pt=io(o,Qn),wt=this.findInstances(n,i,await this.reason(t)),Be={},St=new Set;for(let T of wt){if(!await this.passesWhere(je,n,Pt,T))continue;let ie={type:ht};for(let Ve of bt){let Rt=await this.evaluateValue(je,n,Ve.value,T),De=this.builder.serializeValue(yt(Rt),d);De!==void 0&&(ie[d.ref(Ve.as)]=De)}let Ae=g(T);Ae&&(ie[`${gt}.derivedFrom`]=d.ref(Ae)),Be[this.rowName(T,St)]=ie}let oe={};t.resolvedAt&&(oe[`${ne}.resolvedAt`]=t.resolvedAt),t.invocationId&&(oe[`${ne}.id`]=t.invocationId);let w=await this.builder.buildContentAddressed({publisher:s,book:d,body:Be,contentHashProperty:`${ne}.contentHash`,header:oe});return{yaml:w.yaml,contentHash:w.contentHash,packageName:w.packageName,publisher:w.publisher,rowCount:w.resourceCount}}resolveView(e,t){let n=N(e,t);if(!n)throw new Error(`View ${t.publisher}/${t.package_}/${t.name} not found in the catalog.`);let o=C(n,qn);if(o){let i=N(e,o);if(!i)throw new Error(`ViewPackage ${t.name} names rootView ${o.name}, which is not in the catalog.`);return i}return n}readProjections(e,t){let n=[];for(let o of ke(t,Xn)){let i=o instanceof y?o:o instanceof k?N(e,o.subject):void 0;if(!i)continue;let a=he(i,eo),s=C(i,to);a&&s&&n.push({value:a,as:s})}return n}async reason(e){return new ye({profile:e.reasoningProfile??"owl-rl-classification"}).reason(this.repository)}findInstances(e,t,n){let o=oo(e),i=[],a=new Set;for(let s of n.getInstancesOfClass(t)){if(a.has(s))continue;a.add(s);let c=o.get(s);c&&i.push(c)}return i.sort((s,c)=>{let u=R(g(s)),d=R(g(c));return u<d?-1:u>d?1:0}),i}async passesWhere(e,t,n,o){for(let i of n){let a=await this.evaluateValue(e,t,i,o);if(!ao(a))return!1}return!0}async evaluateValue(e,t,n,o){let i=Ne(n,"view-projection",{catalog:t,depth:0}),a=new Map([["input",o]]);return e.evaluate(i,a)}rowName(e,t){let n=V(e.name)||"row",o=n,i=2;for(;t.has(o);)o=`${n}-${i++}`;return t.add(o),o}};function yt(r){return be(r)?r.value:Array.isArray(r)?r.map(yt):r}function ro(r){let e=g(r);if(!e)throw new Error(`Could not derive a publisher from view ${r.namespace}/${r.name}.`);return e.publisher}function ft(r,e,t){let n=no(r,e,t);if(!n)throw new Error(`Package ${e}/${t} is not in the catalog; it must be importable to materialize a view.`);return n}function no(r,e,t){let n;for(let o of r){if(!(o instanceof f))continue;let i=g(o);!i||i.publisher!==e||i.package_!==t||!i.version||(!n||O(i.version,n)>0)&&(n=i.version)}return n?h(n):void 0}function oo(r){let e=new Map,t=new Map;for(let n of r){if(!(n instanceof f))continue;let o=g(n);if(!o||!o.version)continue;let i=R(o),a=t.get(i);(!a||O(o.version,a)>0)&&(t.set(i,o.version),e.set(i,n))}return e}function io(r,e){let t=he(r,e);return t?[t]:ke(r,e).filter(n=>n instanceof y)}function ao(r){return r===!0?!0:r===!1||r===void 0||r===null?!1:typeof r=="string"?r.length>0:typeof r=="number"?r!==0:be(r)?r.value.length>0:Array.isArray(r)?r.length>0:!!r}export{zr as AmbiguousReferenceRule,de as BooleanStatement,Zr as ClassDefinitionRule,Tr as ClassHierarchyCycleRule,Vt as CompositeKanonakDocumentRepository,X as CredentialStore,se as DefinedKanonak,Mr as DefinitionPropertyReferenceRule,At as DocumentLocation,ir as EdgeType,y as EmbeddedKanonak,Ar as EmbeddedKanonakTypeRule,me as EmbeddedStatement,D as EntitlementDeniedError,te as EntitlementProducer,Bt as FileSystemKanonakDocumentRepository,dr as GitIgnoreFilter,ar as GraphBuilder,_t as HttpKanonakDocumentRepository,A as ImportBook,Vr as ImportExistenceRule,jt as InMemoryKanonakDocumentRepository,Fr as InstancePropertyReferenceRule,Ht as Kanonak,mr as KanonakDocumentPositions,E as KanonakObjectParser,Qr as KanonakObjectValidator,S as KanonakParser,zt as KanonakUri,gr as KanonakUriBuilder,kr as KanonakUrlResolver,er as KanonakVocabulary,fe as ListStatement,ce as LiteralKanonak,Lt as LocalFirstRepository,rn as LookRenderer,Xr as MarkdownLinkRule,Jt as MarkdownStatement,Lr as NamespaceImportCycleRule,$r as NamespacePrefixRule,or as NodeType,ue as NumberStatement,lr as OWL_RL_CLASSIFICATION_RULES,Gr as ObjectPropertyImportRule,Jr as ObjectPropertyValueValidationRule,vr as OntologyValidationError,Er as OntologyValidationResult,P as PackageBuilder,ee as ProducerRepository,qr as PropertyDomainRule,Or as PropertyHierarchyCycleRule,pr as PropertyMetadata,Wr as PropertyRangeReferenceRule,Nr as PropertyRangeRequiredRule,jr as PropertyTypeSpecificityRule,Yr as PropertyValueTypeRule,Ot as PublisherConfigResolver,Nt as PublisherIndex,cr as RDFS_RULES,ye as Reasoner,ur as ReasoningResult,k as ReferenceKanonak,pe as ReferenceStatement,Tt as RepositoryFactory,Ir as ResourceNamingRule,qt as ResourceResolver,nr as ResourceTypeClassifier,Gt as ScalarStatement,Wt as Statement,le as StringStatement,Ur as SubClassOfReferenceRule,_r as SubPropertyOfReferenceRule,f as SubjectKanonak,Br as SubjectKanonakTypeRequiredRule,sr as TripleStore,Yt as TypeResolver,Dr as UnresolvedReferenceRule,Kr as ValidationCache,xr as ValidationContext,Cr as ValidationSeverity,ca as VersionOperator,re as ViewMaterializer,Hr as XsdImportRule,$e as allowAllPolicy,Ut as assertPackageIdentity,Mt as buildLocalFirstRepository,nn as buildOntologyModel,Ce as canonicalForm,Q as canonicalHash,Ft as collectKanonakFiles,O as compareVersions,ot as computeIntegrity,Ke as contentAddressedName,Sr as contextTypesOf,Qe as createAuthenticatedFetch,B as createDPoPProof,vt as createVersion,rr as extractMarkdownLinks,en as findDerivation,Rr as findInstancesByType,tr as findMalformedReferences,yr as findMarkdownLinkAt,hr as formatKanonakAddress,h as formatVersion,Ze as generateDPoPKeyPair,Dt as getGlobalCachePath,_ as hasValidToken,Kt as isCompatibleVersion,U as isExpired,$t as isMajorCompatible,rt as loadLockFile,Zt as makeUriKey,Ie as noopMeter,l as normalizeHost,ge as parseKanonakAddress,xt as parseVersionString,fr as parseWithPositions,It as pickHighestDocument,Pr as propertiesInScope,tn as resolveDisplayValue,wr as resolvePropertyStep,V as sanitizeName,nt as saveLockFile,Xe as serverSupportsDPoP,g as subjectUri,br as superClassChain,Xt as tripleKey,R as uriKey,Qt as uriTriple,Et as versionOperatorFromChar,ae as versionOperatorToChar,Ct as versionsEqual};
@@ -7,8 +7,9 @@ export interface ClassRef {
7
7
  localName: string;
8
8
  }
9
9
  /**
10
- * A property's range, discriminated into a datatype (an xsd datatype) or a
11
- * class (a durable reference to the target class across imports).
10
+ * A property's range, discriminated into a datatype (an xsd datatype or
11
+ * rdfs.Literal) or a class (a durable reference to the target class across
12
+ * imports).
12
13
  */
13
14
  export type TypeRef = {
14
15
  kind: 'datatype';
@@ -28,10 +29,20 @@ export interface PropertyDef {
28
29
  kind: 'datatype' | 'object';
29
30
  /** The range, resolved to a durable datatype or class reference. */
30
31
  range: TypeRef;
31
- /** Surfaced only when the ontology expresses it; otherwise unknown. */
32
32
  cardinality?: 'single' | 'list';
33
- /** Surfaced only when the ontology expresses it; otherwise unknown. */
34
33
  required?: boolean;
34
+ minCount?: number;
35
+ maxCount?: number;
36
+ enumValues?: (string | number | boolean)[];
37
+ pattern?: {
38
+ regex: string;
39
+ flags?: string;
40
+ };
41
+ minLength?: number;
42
+ maxLength?: number;
43
+ minInclusive?: number;
44
+ maxInclusive?: number;
45
+ message?: string;
35
46
  }
36
47
  export interface ClassDef {
37
48
  /** The class's durable canonical URI (publisher/package@version/name). */
@@ -48,8 +59,47 @@ export interface ClassDef {
48
59
  */
49
60
  properties: PropertyDef[];
50
61
  }
62
+ /**
63
+ * One member of a closed enumeration. A member is either a named INDIVIDUAL
64
+ * (the normal `owl:oneOf` case — an entity reference, durable across imports)
65
+ * or a LITERAL (a value with its datatype — the `sh:in` case, and the rare
66
+ * literal-bearing enumeration). The discriminant mirrors `TypeRef`.
67
+ */
68
+ export type EnumMember = {
69
+ kind: 'individual';
70
+ uri: KanonakUri;
71
+ localName: string;
72
+ label?: string;
73
+ } | {
74
+ kind: 'literal';
75
+ value: string | number | boolean;
76
+ datatype: KanonakUri;
77
+ };
78
+ /**
79
+ * A class promoted into the type contract as a closed enumeration by the
80
+ * `owl:oneOf` marker — its members are exactly the listed set. The generated
81
+ * enum's member key is each individual's `localName`; durable cross-references
82
+ * use `uri`; display uses `label`.
83
+ */
84
+ export interface EnumDef {
85
+ /** The enumerated class's durable canonical URI. */
86
+ uri: KanonakUri;
87
+ localName: string;
88
+ label?: string;
89
+ comment?: string;
90
+ /** The closed member set, in declaration order. */
91
+ members: EnumMember[];
92
+ }
51
93
  export interface OntologyModel {
52
94
  classes: ClassDef[];
95
+ /**
96
+ * Closed enumerations — classes carrying the `owl:oneOf` marker. An enumerated
97
+ * class ALSO appears in `classes` (non-lossy, with any declared properties);
98
+ * a generator emits the enum from its `EnumDef` and skips an empty interface
99
+ * when the class declares no properties. Property-level enumerations (`sh:in`)
100
+ * are NOT here — they live on the constrained `PropertyDef` (#52).
101
+ */
102
+ enums: EnumDef[];
53
103
  }
54
104
  export interface BuildOntologyModelOptions {
55
105
  /** Flatten inherited properties (from ancestors + rdfs.Resource) into each class. */
@@ -60,8 +110,31 @@ export interface BuildOntologyModelOptions {
60
110
  *
61
111
  * Enumerates the classes the package declares (matched by the document's own
62
112
  * publisher/package/version, not by name shape), resolves each one's direct
63
- * `subClassOf` parents and its property set, and resolves every property's
64
- * range to a durable datatype or class reference. Built entirely on the parsed
65
- * object model no `rdf:type` string matching, no alias assumptions.
113
+ * `subClassOf` parents and its property set, resolves every property's range to
114
+ * a durable datatype or class reference, and enriches each property with any
115
+ * SHACL constraints in the closure (cardinality, enums, facets).
116
+ *
117
+ * Closed enumerations (#53). A class is promoted into the type contract as an
118
+ * enumeration ONLY by an explicit marker — the `owl:oneOf` class-level marker
119
+ * (recognized by the durable `kanonak.org/core-owl` identity of `oneOf`, never
120
+ * by name shape or by "this class happens to have individuals"). For each such
121
+ * class an `EnumDef` is added to `model.enums`:
122
+ * - what is read: the `owl:oneOf` `rdf:List`, in declaration order;
123
+ * - member identity: each member that resolves to a defined resource is an
124
+ * INDIVIDUAL — the generated enum key is its `localName`, durable
125
+ * cross-references use `uri`, display uses `rdfs.label` (`label`); a member
126
+ * that is a literal is surfaced as a LITERAL value with its datatype, but a
127
+ * literal member of a class-level enumeration is a validation error
128
+ * (`OwlOneOfRule`) — class enumerations are individuals; literal value sets
129
+ * belong on a property via `sh:in`;
130
+ * - members defined in imports resolve through the closure;
131
+ * - an `owl:oneOf` class ALSO stays in `classes` (non-lossy, with any declared
132
+ * properties), so a class with both an enumeration and properties is
133
+ * complete; an empty `owl:oneOf` yields an `EnumDef` with no members.
134
+ * Data individuals with NO marker are never surfaced — they are runtime data,
135
+ * not schema.
136
+ *
137
+ * Built entirely on the parsed object model — no `rdf:type` string matching,
138
+ * no alias assumptions, no heuristics.
66
139
  */
67
140
  export declare function buildOntologyModel(doc: KanonakDocument, repo: IKanonakDocumentRepository, opts?: BuildOntologyModelOptions): Promise<OntologyModel>;
@@ -0,0 +1,48 @@
1
+ import type { Kanonak } from '../kanonaks/Kanonak.js';
2
+ import type { KanonakUri } from '../resolution/KanonakUri.js';
3
+ /**
4
+ * Constraints on a single property, normalized from a constraint vocabulary.
5
+ * Source-agnostic by design — the same shape is the target for SHACL today and
6
+ * any future inputs.
7
+ */
8
+ export interface PropertyConstraints {
9
+ cardinality?: 'single' | 'list';
10
+ required?: boolean;
11
+ minCount?: number;
12
+ maxCount?: number;
13
+ enumValues?: (string | number | boolean)[];
14
+ pattern?: {
15
+ regex: string;
16
+ flags?: string;
17
+ };
18
+ minLength?: number;
19
+ maxLength?: number;
20
+ minInclusive?: number;
21
+ maxInclusive?: number;
22
+ message?: string;
23
+ }
24
+ /** One PropertyShape's constraints, tagged with the property it constrains. */
25
+ interface ShapeForProperty {
26
+ pathKey: string;
27
+ constraints: PropertyConstraints;
28
+ }
29
+ /**
30
+ * Index of constraint-carrying shapes by target-class URI-key. Built once over
31
+ * the whole catalog so open-world shapes (a NodeShape in another package that
32
+ * targets this ontology's class) are picked up.
33
+ */
34
+ export type ShaclConstraintIndex = Map<string, ShapeForProperty[]>;
35
+ /**
36
+ * Build the constraint index from every `sh:NodeShape` in the catalog, keyed by
37
+ * the target class's URI-key. Each entry pairs a constrained property
38
+ * (`sh:path`) with the normalized constraints of its PropertyShape.
39
+ */
40
+ export declare function buildShaclConstraintIndex(catalog: Kanonak[]): ShaclConstraintIndex;
41
+ /**
42
+ * The effective constraints on a property for a class: the merge of every
43
+ * matching PropertyShape along the class's `subClassOf` chain, with shapes on
44
+ * more-derived classes overriding ancestors. Returns `undefined` when no shape
45
+ * constrains the property (so the property's constraint fields stay unknown).
46
+ */
47
+ export declare function effectiveConstraints(index: ShaclConstraintIndex, chain: KanonakUri[], propertyUri: KanonakUri): PropertyConstraints | undefined;
48
+ export {};
@@ -1,2 +1,2 @@
1
1
  export { buildOntologyModel } from './OntologyModel.js';
2
- export type { OntologyModel, ClassDef, PropertyDef, ClassRef, TypeRef, BuildOntologyModelOptions, } from './OntologyModel.js';
2
+ export type { OntologyModel, ClassDef, PropertyDef, ClassRef, TypeRef, EnumDef, EnumMember, BuildOntologyModelOptions, } from './OntologyModel.js';
@@ -1 +1 @@
1
- import{a as c,b as d,c as e,d as f}from"../chunk-GN2XODVC.js";import{f as b}from"../chunk-G2DKKSZ4.js";import{a}from"../chunk-TJPQETHV.js";import"../chunk-IOMNZBK4.js";import"../chunk-W6T7MOKY.js";import"../chunk-FUUTGGJS.js";import"../chunk-2ACBWC7K.js";export{d as KanonakDocumentPositions,b as KanonakObjectParser,a as KanonakParser,c as PropertyMetadata,f as findMarkdownLinkAt,e as parseWithPositions};
1
+ import{a as c,b as d,c as e,d as f}from"../chunk-PJMOM5H7.js";import{f as b}from"../chunk-IUZZDC2U.js";import{a}from"../chunk-TJPQETHV.js";import"../chunk-IOMNZBK4.js";import"../chunk-W6T7MOKY.js";import"../chunk-FUUTGGJS.js";import"../chunk-2ACBWC7K.js";export{d as KanonakDocumentPositions,b as KanonakObjectParser,a as KanonakParser,c as PropertyMetadata,f as findMarkdownLinkAt,e as parseWithPositions};
@@ -1 +1 @@
1
- import{a as g,b as h,c as i,d as j,e as k}from"../chunk-FX7JDGL6.js";import"../chunk-G2DKKSZ4.js";import"../chunk-TJPQETHV.js";import{d as a,e as b,f as c,h as d,i as e,j as f}from"../chunk-IOMNZBK4.js";import"../chunk-W6T7MOKY.js";import"../chunk-FUUTGGJS.js";import"../chunk-2ACBWC7K.js";export{f as KanonakVocabulary,i as OWL_RL_CLASSIFICATION_RULES,h as RDFS_RULES,k as Reasoner,j as ReasoningResult,g as TripleStore,e as canonicalizeBuiltinUri,b as makeUriKey,c as tripleKey,a as uriKey,d as uriTriple};
1
+ import{a as g,b as h,c as i,d as j,e as k}from"../chunk-KXVSGB6Q.js";import"../chunk-IUZZDC2U.js";import"../chunk-TJPQETHV.js";import{d as a,e as b,f as c,h as d,i as e,j as f}from"../chunk-IOMNZBK4.js";import"../chunk-W6T7MOKY.js";import"../chunk-FUUTGGJS.js";import"../chunk-2ACBWC7K.js";export{f as KanonakVocabulary,i as OWL_RL_CLASSIFICATION_RULES,h as RDFS_RULES,k as Reasoner,j as ReasoningResult,g as TripleStore,e as canonicalizeBuiltinUri,b as makeUriKey,c as tripleKey,a as uriKey,d as uriTriple};
@@ -8,13 +8,24 @@ export interface PropertyDescriptor {
8
8
  uri: KanonakUri;
9
9
  /** The property's rdfs.label, if declared. */
10
10
  label: string | undefined;
11
+ /** The property's rdfs.comment, if declared. */
12
+ comment: string | undefined;
11
13
  /** ObjectProperty / DatatypeProperty / other, classified by URI. */
12
14
  kind: PropertyKind;
13
15
  /** The property's declared range, if any. */
14
16
  range: KanonakUri | undefined;
17
+ /** The classes named by the property's `domain` (resolved). */
18
+ domains: KanonakUri[];
15
19
  }
16
20
  /** Build a subject's canonical URI from its namespace + name. */
17
21
  export declare function subjectUri(subject: SubjectKanonak): KanonakUri | undefined;
22
+ /**
23
+ * A class's `subClassOf` chain as `[self, …ancestors]` in breadth-first
24
+ * order, deduped. The single canonical ancestor walk — reused for scope
25
+ * computation here and for hierarchy-ordered merges (e.g. SHACL constraint
26
+ * inheritance) elsewhere, so there is one `subClassOf` traversal in the SDK.
27
+ */
28
+ export declare function superClassChain(catalog: Kanonak[], classUri: EntityUri): KanonakUri[];
18
29
  /**
19
30
  * Every property in scope for a class — those whose `domain` is the
20
31
  * class, an ancestor, or rdfs.Resource. Scans the catalog once. Powers
@@ -9,7 +9,7 @@ export { KanonakUrlResolver } from './KanonakUrlResolver.js';
9
9
  export type { UrlAddress, PublisherUrlAddress, PackageUrlAddress, ResourceUrlAddress, VersionSpec, UrlForm, } from './KanonakUrlResolver.js';
10
10
  export type { ResourceResolutionResult } from './ResourceResolutionResult.js';
11
11
  export { TypeResolver } from './TypeResolver.js';
12
- export { propertiesInScope, resolvePropertyStep, contextTypesOf, subjectUri, } from './TypeDirectedResolver.js';
12
+ export { propertiesInScope, resolvePropertyStep, contextTypesOf, subjectUri, superClassChain, } from './TypeDirectedResolver.js';
13
13
  export type { PropertyDescriptor, PropertyKind, StepResolution } from './TypeDirectedResolver.js';
14
14
  export { ResourceTypeClassifier } from './ResourceTypeClassifier.js';
15
15
  export { findInstancesByType } from './InstanceSearch.js';
@@ -1 +1 @@
1
- import{a as p,b as x}from"../chunk-PEUTCG3B.js";import{a as s}from"../chunk-PEJALHXK.js";import{a as k}from"../chunk-SC5M74NM.js";import{a as o,b as q,c as r,d as t,e as u,f as v,g as w}from"../chunk-BGQKZBNE.js";import"../chunk-CRKSKIAL.js";import{b as m,c as n}from"../chunk-IOMNZBK4.js";import"../chunk-W6T7MOKY.js";import{a as l}from"../chunk-FUUTGGJS.js";import{a,b,c,d,e,f,g,h,i,j}from"../chunk-2ACBWC7K.js";export{l as KanonakUri,p as KanonakUriBuilder,s as KanonakUrlResolver,m as ResourceResolver,o as ResourceTypeClassifier,n as TypeResolver,k as assertPackageIdentity,c as compareVersions,w as contextTypesOf,f as createVersion,x as findInstancesByType,r as formatKanonakAddress,e as formatVersion,h as isCompatibleVersion,i as isMajorCompatible,q as parseKanonakAddress,g as parseVersionString,j as pickHighestDocument,u as propertiesInScope,v as resolvePropertyStep,t as subjectUri,a as versionOperatorFromChar,b as versionOperatorToChar,d as versionsEqual};
1
+ import{a as p,b as y}from"../chunk-PEUTCG3B.js";import{a as s}from"../chunk-PEJALHXK.js";import{a as k}from"../chunk-SC5M74NM.js";import{a as o,b as q,c as r,d as t,e as u,f as v,g as w,h as x}from"../chunk-Z5ELOT2C.js";import"../chunk-XQS5LDSO.js";import{b as m,c as n}from"../chunk-IOMNZBK4.js";import"../chunk-W6T7MOKY.js";import{a as l}from"../chunk-FUUTGGJS.js";import{a,b,c,d,e,f,g,h,i,j}from"../chunk-2ACBWC7K.js";export{l as KanonakUri,p as KanonakUriBuilder,s as KanonakUrlResolver,m as ResourceResolver,o as ResourceTypeClassifier,n as TypeResolver,k as assertPackageIdentity,c as compareVersions,x as contextTypesOf,f as createVersion,y as findInstancesByType,r as formatKanonakAddress,e as formatVersion,h as isCompatibleVersion,i as isMajorCompatible,q as parseKanonakAddress,g as parseVersionString,j as pickHighestDocument,v as propertiesInScope,w as resolvePropertyStep,t as subjectUri,u as superClassChain,a as versionOperatorFromChar,b as versionOperatorToChar,d as versionsEqual};
@@ -1,4 +1,4 @@
1
- import{a as g}from"../chunk-X5TYWQRA.js";import"../chunk-QHABFCRC.js";import"../chunk-4NO7MHS7.js";import"../chunk-PEUTCG3B.js";import"../chunk-PEJALHXK.js";import"../chunk-SC5M74NM.js";import"../chunk-SHDHMKMJ.js";import"../chunk-G2DKKSZ4.js";import"../chunk-TJPQETHV.js";import{d as m,g as S}from"../chunk-BGQKZBNE.js";import{a as p,f as E}from"../chunk-CRKSKIAL.js";import"../chunk-IOMNZBK4.js";import{c as v}from"../chunk-W6T7MOKY.js";import"../chunk-FUUTGGJS.js";import{c as x}from"../chunk-2ACBWC7K.js";import{homedir as P}from"os";import{join as d}from"path";import{existsSync as M,mkdirSync as D,readFileSync as j,writeFileSync as O}from"fs";import{createHash as C}from"crypto";import{pathToFileURL as B}from"url";var h="Xenova/all-MiniLM-L6-v2",w="q8",b=32;async function F(r){let{pipeline:e,env:t}=r.transformers;t.cacheDir=r.modelCacheDir??d(P(),".kanonak","models");let n=await e("feature-extraction",h,{dtype:w});return async s=>(await n(s,{pooling:"mean",normalize:!0})).tolist()}async function z(r){let e=d(r,"node_modules","@huggingface","transformers"),t=JSON.parse(j(d(e,"package.json"),"utf-8")),n=I(t);if(!n)throw new Error(`@huggingface/transformers at ${e} exposes no resolvable ESM entry.`);let s=await import(B(d(e,n)).href);return typeof s.pipeline=="function"?s:s.default}function I(r){let e=r.exports,t=n=>typeof n=="string"?n:n?.default;return typeof e=="string"?e:t(e?.node?.import)??t(e?.import)??t(e?.default)??r.module??r.main}var y=null;async function U(){return y||(y=(async()=>{let r;try{r=await import("@huggingface/transformers")}catch(e){throw new Error(`Semantic search requires the embedding runtime, which is an optional dependency.
1
+ import{a as g}from"../chunk-XWRVENU6.js";import"../chunk-QHABFCRC.js";import"../chunk-4NO7MHS7.js";import"../chunk-PEUTCG3B.js";import"../chunk-PEJALHXK.js";import"../chunk-SC5M74NM.js";import"../chunk-SHDHMKMJ.js";import"../chunk-IUZZDC2U.js";import"../chunk-TJPQETHV.js";import{d as m,h as S}from"../chunk-Z5ELOT2C.js";import{a as p,f as E}from"../chunk-XQS5LDSO.js";import"../chunk-IOMNZBK4.js";import{c as v}from"../chunk-W6T7MOKY.js";import"../chunk-FUUTGGJS.js";import{c as x}from"../chunk-2ACBWC7K.js";import{homedir as P}from"os";import{join as d}from"path";import{existsSync as M,mkdirSync as D,readFileSync as j,writeFileSync as O}from"fs";import{createHash as C}from"crypto";import{pathToFileURL as B}from"url";var h="Xenova/all-MiniLM-L6-v2",w="q8",b=32;async function F(r){let{pipeline:e,env:t}=r.transformers;t.cacheDir=r.modelCacheDir??d(P(),".kanonak","models");let n=await e("feature-extraction",h,{dtype:w});return async s=>(await n(s,{pooling:"mean",normalize:!0})).tolist()}async function z(r){let e=d(r,"node_modules","@huggingface","transformers"),t=JSON.parse(j(d(e,"package.json"),"utf-8")),n=I(t);if(!n)throw new Error(`@huggingface/transformers at ${e} exposes no resolvable ESM entry.`);let s=await import(B(d(e,n)).href);return typeof s.pipeline=="function"?s:s.default}function I(r){let e=r.exports,t=n=>typeof n=="string"?n:n?.default;return typeof e=="string"?e:t(e?.node?.import)??t(e?.import)??t(e?.default)??r.module??r.main}var y=null;async function U(){return y||(y=(async()=>{let r;try{r=await import("@huggingface/transformers")}catch(e){throw new Error(`Semantic search requires the embedding runtime, which is an optional dependency.
2
2
  Install it with:
3
3
  npm install @huggingface/transformers
4
4
  (underlying import error: ${e.message})`)}return F({transformers:r})})()),y}function H(r,e){let t=0;for(let n=0;n<r.length;n++)t+=r[n]*e[n];return t}function R(r,e){return e?r.version?e.version?x(r.version,e.version)>0:!0:!1:!0}function K(r,e){let t=g(r,e),n=[t.label],s=S(e);if(s.length>0){let i=E(r,s[0]),a=i?g(r,i).label:s[0].name;a&&n.push(`\u2014 a ${a}.`)}return t.summary&&n.push(t.summary),n.join(" ")}function q(r){let e=new Map;for(let t of r){if(!(t instanceof v))continue;let n=m(t);if(!n)continue;let s=p(n),i=e.get(s);(!i||R(n,m(i)))&&e.set(s,t)}return[...e.values()].sort((t,n)=>{let s=m(t)?p(m(t)):t.name,i=m(n)?p(m(n)):n.name;return s.localeCompare(i)})}var k=class{entries=[];embedder;constructor(e={}){this.embedder=e.embedder}resolveEmbedder(){return this.embedder?Promise.resolve(this.embedder):U()}get size(){return this.entries.length}async build(e,t={}){let n=q(e);if(t.include&&(n=n.filter(t.include)),n.length===0)return this.entries=[],{size:0,cached:!1};let s=n.map(o=>K(e,o)),i=t.cacheDir,a;if(i){let o=C("sha256").update(h+"|"+w+`
@@ -1,3 +1,3 @@
1
- import{j as E}from"../chunk-X5TYWQRA.js";import"../chunk-QHABFCRC.js";import{a as Z,d as A,f as te,g as N}from"../chunk-ATH6636H.js";import{a as ee,b as re,c as V,d as I}from"../chunk-LKBG2MK6.js";import{a as X}from"../chunk-4NO7MHS7.js";import"../chunk-PEUTCG3B.js";import{a as oe}from"../chunk-PEJALHXK.js";import"../chunk-SC5M74NM.js";import"../chunk-SHDHMKMJ.js";import{f as L}from"../chunk-G2DKKSZ4.js";import{a as D}from"../chunk-TJPQETHV.js";import{b as O}from"../chunk-BGQKZBNE.js";import"../chunk-CRKSKIAL.js";import"../chunk-IOMNZBK4.js";import{c as ne}from"../chunk-W6T7MOKY.js";import"../chunk-FUUTGGJS.js";import{c as F,e as z,f as K,g as Q}from"../chunk-2ACBWC7K.js";import{readFileSync as ue,existsSync as de,readdirSync as me,writeFileSync as ge,mkdirSync as fe}from"fs";import{join as q}from"path";function se(n){let e=n.metadata?.namespace_;return e?`${e.publisher}/${e.package_}`:void 0}async function M(n,e){let t=new Set,r=[...n];for(;r.length>0;){let o=r.shift(),i=se(o);if(!i||t.has(i))continue;t.add(i);let d=o.metadata?.imports;if(d)for(let[c,f]of Object.entries(d))for(let g of f)try{let l=await e.getHighestCompatibleVersionAsync(c,g);l&&r.push(l)}catch{}}return t}var j=class{constructor(e,t){this.inner=e;this.scope=t}inner;scope;async getAllDocumentsAsync(){return(await this.inner.getAllDocumentsAsync()).filter(t=>{let r=se(t);return r!==void 0&&this.scope.has(r)})}getDocumentAsync(e){return this.inner.getDocumentAsync(e)}getDocumentsByNamespaceAsync(e,t){return this.inner.getDocumentsByNamespaceAsync(e,t)}getHighestCompatibleVersionAsync(e,t){return this.inner.getHighestCompatibleVersionAsync(e,t)}saveDocumentAsync(e,t){return this.inner.saveDocumentAsync(e,t)}deleteDocumentAsync(e){return this.inner.deleteDocumentAsync(e)}clearNamespaceAsync(e,t){return this.inner.clearNamespaceAsync(e,t)}getAllDocumentReferencesAsync(){return this.inner.getAllDocumentReferencesAsync()}getDocumentContentAsync(e){return this.inner.getDocumentContentAsync(e)}getDocumentUriAsync(e){return this.inner.getDocumentUriAsync(e)}};var ae=[{publisher:"kanonak.org",package_:"core-kanonak"},{publisher:"kanonak.org",package_:"site"},{publisher:"kanonak.org",package_:"link"},{publisher:"kanonak.org",package_:"look-tokens"},{publisher:"kanonak.org",package_:"look-styles"},{publisher:"kanonak.org",package_:"look"},{publisher:"kanonak.org",package_:"universal-look"}];function C(n){let e=n?.render;if(e&&e.length>0){let t=[];for(let r of e)try{let o=O(r);o.kind==="package"?t.push({publisher:o.publisher,package_:o.package_}):o.kind==="resource"&&t.push({publisher:o.uri.publisher,package_:o.uri.package_})}catch{}if(t.length>0)return t}return ae}function H(n){return`${n.publisher}/${n.package_}`}function B(n){let{publisher:e,availablePublishers:t,catalog:r,lookRenderer:o,localNamespaces:i,rawByNsKey:d,producers:c}=n,f=new Map,g=new Map,l=new Map,a=new Set;for(let m of r){if(!(m instanceof ne))continue;let y=m.namespace||"";if(!i.has(y))continue;f.set(`${y}/${m.name}`,m);let v=y.split("/")[1]??"",[x,p]=v.split("@");if(!x||!p)continue;let b=Q(p);b&&(a.has(v)||(a.add(v),g.has(x)||g.set(x,[]),g.get(x).push({verStr:p,version:b})),m.name===x&&l.set(v,m))}for(let m of g.values())m.sort((y,v)=>F(v.version,y.version));return{publisher:e,availablePublishers:t,catalog:r,lookRenderer:o,localNamespaces:i,rawByNsKey:d,bySubject:f,pkgVersions:g,pkgSelfByVer:l,...c?{producers:c}:{}}}async function T(n,e={}){let t=new D,r=new X(t),o=[],i=[];for(let p of N(n)){let b;try{b=ue(p,"utf-8")}catch{continue}let w;try{w=t.parse(b).metadata?.namespace_}catch{continue}if(!w?.version)continue;let $=w.version;i.push({publisher:w.publisher,package_:w.package_,verStr:`${$.major}.${$.minor}.${$.patch}`,version:$,source:b})}i.sort((p,b)=>F(b.version,p.version));for(let p of i)await r.saveDocumentAsync(t.parse(p.source),`${p.publisher}/${p.package_}@${p.verStr}`),o.push({publisher:p.publisher,package_:p.package_,verStr:p.verStr,source:p.source});let d=[...new Set(o.map(p=>p.publisher))].sort(),c=e.publisher;if(c){if(!d.includes(c))throw new Error(`Publisher "${c}" not found in workspace. Available: ${d.join(", ")||"(none)"}`)}else if(d.length===1)c=d[0];else throw d.length===0?new Error(`No Kanonak packages found under ${n}`):new Error(`Workspace has multiple publishers (${d.join(", ")}). Pass --publisher <domain> to choose which one to serve.`);let f=new Set,g=new Map;for(let p of o)p.publisher===c&&(f.add(`${p.publisher}/${p.package_}@${p.verStr}`),g.set(`${p.package_}@${p.verStr}`,p.source));let l=new Z(A(),!0,t),a=e.repository??new te(r,l,new I(e.httpCache?{getFromCache:e.httpCache.getFromCache,onFetch:e.httpCache.onFetch}:void 0)),m=C(void 0);if(!e.repository){let p=A(),b=s=>{let h=q(p,s);return de(h)?new Set(me(h).filter(k=>k.endsWith(".kan.yml")).map(k=>k.split("@")[0])):new Set},w=(s,h)=>o.some(k=>k.publisher===s&&k.package_===h),$=new V,u=new Map;for(let s of m)if(u.has(s.publisher)||u.set(s.publisher,b(s.publisher)),!(u.get(s.publisher).has(s.package_)||w(s.publisher,s.package_)))try{let h=await $.getHighestVersion(s.publisher,s.package_);if(!h)continue;let k=await $.getPackageUrl(s.publisher,s.package_,h),_=await fetch(k);if(!_.ok)continue;let le=await _.text(),J=q(p,s.publisher);fe(J,{recursive:!0}),ge(q(J,`${s.package_}@${h}.kan.yml`),le,"utf-8")}catch{}}let y=a;if(!e.repository){let p=(await r.getAllDocumentsAsync()).filter(w=>w.metadata.namespace_?.publisher===c),b=await M(p,a);for(let w of m)b.add(H(w));y=new j(a,b)}let v=await new L(t).parseKanonaks(y),x=new E(v);return B({publisher:c,availablePublishers:d,catalog:v,lookRenderer:x,localNamespaces:f,rawByNsKey:g})}import{existsSync as he,readFileSync as ke,writeFileSync as ye,mkdirSync as ve}from"fs";import{join as ie}from"path";async function U(n,e={}){let t=new D,r=O(n),o=r.kind==="resource"?r.uri.publisher:r.publisher,i=e.cacheRoot??A(),d=(u,s,h)=>ie(i,u,`${s}@${h}.kan.yml`),c=new I({getFromCache:(u,s,h)=>{let k=d(u,s,h);return he(k)?ke(k,"utf-8"):null},onFetch:(u,s,h,k)=>{let _=ie(i,u);ve(_,{recursive:!0}),ye(d(u,s,h),k,"utf-8")},...e.fetchFn?{fetchFn:e.fetchFn}:{}}),f=new V(e.fetchFn?{fetchFn:e.fetchFn}:void 0),g;if(r.kind==="resource"){let u=r.uri.version;g=[u?{package_:r.uri.package_,version:`${u.major}.${u.minor}.${u.patch}`}:{package_:r.uri.package_}]}else if(r.kind==="package"){let u=r.version;g=[u?{package_:r.package_,version:`${u.major}.${u.minor}.${u.patch}`}:{package_:r.package_}]}else g=(await f.listLatestPackages(o)).map(s=>({package_:s.packageName}));let l=async(u,s,h)=>{try{let k=h?t.buildImport(s,"=",h,u):t.buildImport(s,"*","0.0.0",u);return await c.getHighestCompatibleVersionAsync(u,k)}catch{return null}},a=[];for(let u of g){let s=await l(o,u.package_,u.version);s&&a.push(s)}if(a.length===0)throw new Error(`Could not fetch any package for address "${n}" from publisher "${o}".`);let m=await new re().getConfig(o).catch(()=>{}),y=[];for(let u of C(m)){let s=await l(u.publisher,u.package_,void 0);s&&y.push(s)}let v=await M([...a,...y],c),x=new j(c,v),p=await new L(t).parseKanonaks(x),b=new E(p),w=new Set,$=new Map;for(let u of await c.getAllDocumentsAsync()){let s=u.metadata.namespace_;if(!s||s.publisher!==o)continue;let h=`${s.version.major}.${s.version.minor}.${s.version.patch}`,k=`${s.publisher}/${s.package_}@${h}`;w.add(k);let _=await c.getDocumentContentAsync(k);_!==null&&$.set(`${s.package_}@${h}`,_)}return B({publisher:o,availablePublishers:[o],catalog:p,lookRenderer:b,localNamespaces:w,rawByNsKey:$})}import{VersionOperator as W}from"@kanonak-protocol/types/document/models/enums";var S={".html":"text/html; charset=utf-8",".css":"text/css; charset=utf-8",".svg":"image/svg+xml",".md":"text/markdown; charset=utf-8",".kan.yml":"application/yaml; charset=utf-8",".txt":"text/plain; charset=utf-8",".json":"application/json; charset=utf-8"},R=(n,e,t,r)=>({status:n,headers:{"Content-Type":e,...r||{}},body:t}),P=n=>R(404,S[".html"],`<!doctype html><meta charset=utf-8><title>404</title><h1>404</h1><p>Not found: ${n}</p>`),be=n=>({status:301,headers:{Location:n},body:""}),we=n=>({status:302,headers:{Location:n},body:""});function Se(n){switch(n.kind){case"exact":return{operator:W.Exact,version:K(n.major,n.minor,n.patch)};case"minor-pin":return{operator:W.Compatible,version:K(n.major,n.minor,0)};case"major-pin":return{operator:W.Major,version:K(n.major,0,0)};default:return{operator:W.Any,version:K(0,0,0)}}}async function Re(n,e,t,r){if(!r)return null;let o=n.producers?.find(f=>f.canProduce(n.publisher,e));if(!o)return null;let i=await o.resolveVersion(n.publisher,e,Se(t));if(!i)return null;let d=z(i);if(t.kind!=="exact")return we(`/${e}/${d}.kan.yml`);let{source:c}=await o.produce(n.publisher,e,i);return R(200,S[".kan.yml"],c)}function ce(n,e,t){let r=n.pkgVersions.get(e);if(!r||r.length===0)return null;switch(t.kind){case"any":return r[0].verStr;case"major-pin":return r.find(o=>o.version.major===t.major)?.verStr??null;case"minor-pin":return r.find(o=>o.version.major===t.major&&o.version.minor===t.minor)?.verStr??null;case"exact":return r.find(o=>o.version.major===t.major&&o.version.minor===t.minor&&o.version.patch===t.patch)?.verStr??null;default:return null}}async function G(n,e,t=""){let{lookRenderer:r,publisher:o}=n;if(e==="/.well-known/kanonak.json"){let a=ee(o);return n.producers&&n.producers.length>0&&(a.resolveByRedirect=!0),R(200,S[".json"],JSON.stringify(a,null,2))}if(e==="/index.txt"){let a=[...n.localNamespaces].map(m=>m.split("/")[1].replace("@","/")).sort();return R(200,S[".txt"],a.join(`
1
+ import{j as E}from"../chunk-XWRVENU6.js";import"../chunk-QHABFCRC.js";import{a as Z,d as A,f as te,g as N}from"../chunk-ATH6636H.js";import{a as ee,b as re,c as V,d as I}from"../chunk-LKBG2MK6.js";import{a as X}from"../chunk-4NO7MHS7.js";import"../chunk-PEUTCG3B.js";import{a as oe}from"../chunk-PEJALHXK.js";import"../chunk-SC5M74NM.js";import"../chunk-SHDHMKMJ.js";import{f as L}from"../chunk-IUZZDC2U.js";import{a as D}from"../chunk-TJPQETHV.js";import{b as O}from"../chunk-Z5ELOT2C.js";import"../chunk-XQS5LDSO.js";import"../chunk-IOMNZBK4.js";import{c as ne}from"../chunk-W6T7MOKY.js";import"../chunk-FUUTGGJS.js";import{c as F,e as z,f as K,g as Q}from"../chunk-2ACBWC7K.js";import{readFileSync as ue,existsSync as de,readdirSync as me,writeFileSync as ge,mkdirSync as fe}from"fs";import{join as q}from"path";function se(n){let e=n.metadata?.namespace_;return e?`${e.publisher}/${e.package_}`:void 0}async function M(n,e){let t=new Set,r=[...n];for(;r.length>0;){let o=r.shift(),i=se(o);if(!i||t.has(i))continue;t.add(i);let d=o.metadata?.imports;if(d)for(let[c,f]of Object.entries(d))for(let g of f)try{let l=await e.getHighestCompatibleVersionAsync(c,g);l&&r.push(l)}catch{}}return t}var j=class{constructor(e,t){this.inner=e;this.scope=t}inner;scope;async getAllDocumentsAsync(){return(await this.inner.getAllDocumentsAsync()).filter(t=>{let r=se(t);return r!==void 0&&this.scope.has(r)})}getDocumentAsync(e){return this.inner.getDocumentAsync(e)}getDocumentsByNamespaceAsync(e,t){return this.inner.getDocumentsByNamespaceAsync(e,t)}getHighestCompatibleVersionAsync(e,t){return this.inner.getHighestCompatibleVersionAsync(e,t)}saveDocumentAsync(e,t){return this.inner.saveDocumentAsync(e,t)}deleteDocumentAsync(e){return this.inner.deleteDocumentAsync(e)}clearNamespaceAsync(e,t){return this.inner.clearNamespaceAsync(e,t)}getAllDocumentReferencesAsync(){return this.inner.getAllDocumentReferencesAsync()}getDocumentContentAsync(e){return this.inner.getDocumentContentAsync(e)}getDocumentUriAsync(e){return this.inner.getDocumentUriAsync(e)}};var ae=[{publisher:"kanonak.org",package_:"core-kanonak"},{publisher:"kanonak.org",package_:"site"},{publisher:"kanonak.org",package_:"link"},{publisher:"kanonak.org",package_:"look-tokens"},{publisher:"kanonak.org",package_:"look-styles"},{publisher:"kanonak.org",package_:"look"},{publisher:"kanonak.org",package_:"universal-look"}];function C(n){let e=n?.render;if(e&&e.length>0){let t=[];for(let r of e)try{let o=O(r);o.kind==="package"?t.push({publisher:o.publisher,package_:o.package_}):o.kind==="resource"&&t.push({publisher:o.uri.publisher,package_:o.uri.package_})}catch{}if(t.length>0)return t}return ae}function H(n){return`${n.publisher}/${n.package_}`}function B(n){let{publisher:e,availablePublishers:t,catalog:r,lookRenderer:o,localNamespaces:i,rawByNsKey:d,producers:c}=n,f=new Map,g=new Map,l=new Map,a=new Set;for(let m of r){if(!(m instanceof ne))continue;let y=m.namespace||"";if(!i.has(y))continue;f.set(`${y}/${m.name}`,m);let v=y.split("/")[1]??"",[x,p]=v.split("@");if(!x||!p)continue;let b=Q(p);b&&(a.has(v)||(a.add(v),g.has(x)||g.set(x,[]),g.get(x).push({verStr:p,version:b})),m.name===x&&l.set(v,m))}for(let m of g.values())m.sort((y,v)=>F(v.version,y.version));return{publisher:e,availablePublishers:t,catalog:r,lookRenderer:o,localNamespaces:i,rawByNsKey:d,bySubject:f,pkgVersions:g,pkgSelfByVer:l,...c?{producers:c}:{}}}async function T(n,e={}){let t=new D,r=new X(t),o=[],i=[];for(let p of N(n)){let b;try{b=ue(p,"utf-8")}catch{continue}let w;try{w=t.parse(b).metadata?.namespace_}catch{continue}if(!w?.version)continue;let $=w.version;i.push({publisher:w.publisher,package_:w.package_,verStr:`${$.major}.${$.minor}.${$.patch}`,version:$,source:b})}i.sort((p,b)=>F(b.version,p.version));for(let p of i)await r.saveDocumentAsync(t.parse(p.source),`${p.publisher}/${p.package_}@${p.verStr}`),o.push({publisher:p.publisher,package_:p.package_,verStr:p.verStr,source:p.source});let d=[...new Set(o.map(p=>p.publisher))].sort(),c=e.publisher;if(c){if(!d.includes(c))throw new Error(`Publisher "${c}" not found in workspace. Available: ${d.join(", ")||"(none)"}`)}else if(d.length===1)c=d[0];else throw d.length===0?new Error(`No Kanonak packages found under ${n}`):new Error(`Workspace has multiple publishers (${d.join(", ")}). Pass --publisher <domain> to choose which one to serve.`);let f=new Set,g=new Map;for(let p of o)p.publisher===c&&(f.add(`${p.publisher}/${p.package_}@${p.verStr}`),g.set(`${p.package_}@${p.verStr}`,p.source));let l=new Z(A(),!0,t),a=e.repository??new te(r,l,new I(e.httpCache?{getFromCache:e.httpCache.getFromCache,onFetch:e.httpCache.onFetch}:void 0)),m=C(void 0);if(!e.repository){let p=A(),b=s=>{let h=q(p,s);return de(h)?new Set(me(h).filter(k=>k.endsWith(".kan.yml")).map(k=>k.split("@")[0])):new Set},w=(s,h)=>o.some(k=>k.publisher===s&&k.package_===h),$=new V,u=new Map;for(let s of m)if(u.has(s.publisher)||u.set(s.publisher,b(s.publisher)),!(u.get(s.publisher).has(s.package_)||w(s.publisher,s.package_)))try{let h=await $.getHighestVersion(s.publisher,s.package_);if(!h)continue;let k=await $.getPackageUrl(s.publisher,s.package_,h),_=await fetch(k);if(!_.ok)continue;let le=await _.text(),J=q(p,s.publisher);fe(J,{recursive:!0}),ge(q(J,`${s.package_}@${h}.kan.yml`),le,"utf-8")}catch{}}let y=a;if(!e.repository){let p=(await r.getAllDocumentsAsync()).filter(w=>w.metadata.namespace_?.publisher===c),b=await M(p,a);for(let w of m)b.add(H(w));y=new j(a,b)}let v=await new L(t).parseKanonaks(y),x=new E(v);return B({publisher:c,availablePublishers:d,catalog:v,lookRenderer:x,localNamespaces:f,rawByNsKey:g})}import{existsSync as he,readFileSync as ke,writeFileSync as ye,mkdirSync as ve}from"fs";import{join as ie}from"path";async function U(n,e={}){let t=new D,r=O(n),o=r.kind==="resource"?r.uri.publisher:r.publisher,i=e.cacheRoot??A(),d=(u,s,h)=>ie(i,u,`${s}@${h}.kan.yml`),c=new I({getFromCache:(u,s,h)=>{let k=d(u,s,h);return he(k)?ke(k,"utf-8"):null},onFetch:(u,s,h,k)=>{let _=ie(i,u);ve(_,{recursive:!0}),ye(d(u,s,h),k,"utf-8")},...e.fetchFn?{fetchFn:e.fetchFn}:{}}),f=new V(e.fetchFn?{fetchFn:e.fetchFn}:void 0),g;if(r.kind==="resource"){let u=r.uri.version;g=[u?{package_:r.uri.package_,version:`${u.major}.${u.minor}.${u.patch}`}:{package_:r.uri.package_}]}else if(r.kind==="package"){let u=r.version;g=[u?{package_:r.package_,version:`${u.major}.${u.minor}.${u.patch}`}:{package_:r.package_}]}else g=(await f.listLatestPackages(o)).map(s=>({package_:s.packageName}));let l=async(u,s,h)=>{try{let k=h?t.buildImport(s,"=",h,u):t.buildImport(s,"*","0.0.0",u);return await c.getHighestCompatibleVersionAsync(u,k)}catch{return null}},a=[];for(let u of g){let s=await l(o,u.package_,u.version);s&&a.push(s)}if(a.length===0)throw new Error(`Could not fetch any package for address "${n}" from publisher "${o}".`);let m=await new re().getConfig(o).catch(()=>{}),y=[];for(let u of C(m)){let s=await l(u.publisher,u.package_,void 0);s&&y.push(s)}let v=await M([...a,...y],c),x=new j(c,v),p=await new L(t).parseKanonaks(x),b=new E(p),w=new Set,$=new Map;for(let u of await c.getAllDocumentsAsync()){let s=u.metadata.namespace_;if(!s||s.publisher!==o)continue;let h=`${s.version.major}.${s.version.minor}.${s.version.patch}`,k=`${s.publisher}/${s.package_}@${h}`;w.add(k);let _=await c.getDocumentContentAsync(k);_!==null&&$.set(`${s.package_}@${h}`,_)}return B({publisher:o,availablePublishers:[o],catalog:p,lookRenderer:b,localNamespaces:w,rawByNsKey:$})}import{VersionOperator as W}from"@kanonak-protocol/types/document/models/enums";var S={".html":"text/html; charset=utf-8",".css":"text/css; charset=utf-8",".svg":"image/svg+xml",".md":"text/markdown; charset=utf-8",".kan.yml":"application/yaml; charset=utf-8",".txt":"text/plain; charset=utf-8",".json":"application/json; charset=utf-8"},R=(n,e,t,r)=>({status:n,headers:{"Content-Type":e,...r||{}},body:t}),P=n=>R(404,S[".html"],`<!doctype html><meta charset=utf-8><title>404</title><h1>404</h1><p>Not found: ${n}</p>`),be=n=>({status:301,headers:{Location:n},body:""}),we=n=>({status:302,headers:{Location:n},body:""});function Se(n){switch(n.kind){case"exact":return{operator:W.Exact,version:K(n.major,n.minor,n.patch)};case"minor-pin":return{operator:W.Compatible,version:K(n.major,n.minor,0)};case"major-pin":return{operator:W.Major,version:K(n.major,0,0)};default:return{operator:W.Any,version:K(0,0,0)}}}async function Re(n,e,t,r){if(!r)return null;let o=n.producers?.find(f=>f.canProduce(n.publisher,e));if(!o)return null;let i=await o.resolveVersion(n.publisher,e,Se(t));if(!i)return null;let d=z(i);if(t.kind!=="exact")return we(`/${e}/${d}.kan.yml`);let{source:c}=await o.produce(n.publisher,e,i);return R(200,S[".kan.yml"],c)}function ce(n,e,t){let r=n.pkgVersions.get(e);if(!r||r.length===0)return null;switch(t.kind){case"any":return r[0].verStr;case"major-pin":return r.find(o=>o.version.major===t.major)?.verStr??null;case"minor-pin":return r.find(o=>o.version.major===t.major&&o.version.minor===t.minor)?.verStr??null;case"exact":return r.find(o=>o.version.major===t.major&&o.version.minor===t.minor&&o.version.patch===t.patch)?.verStr??null;default:return null}}async function G(n,e,t=""){let{lookRenderer:r,publisher:o}=n;if(e==="/.well-known/kanonak.json"){let a=ee(o);return n.producers&&n.producers.length>0&&(a.resolveByRedirect=!0),R(200,S[".json"],JSON.stringify(a,null,2))}if(e==="/index.txt"){let a=[...n.localNamespaces].map(m=>m.split("/")[1].replace("@","/")).sort();return R(200,S[".txt"],a.join(`
2
2
  `)+`
3
3
  `)}if(e==="/"||e==="/index.html"||e==="/index.css"){let a=r.publisherSubject(o);return e==="/index.css"?R(200,S[".css"],r.renderStylesheet(a)):R(200,S[".html"],await r.renderDocument(a,{rootIndex:!0}))}let i=".html",d=!1,c=e;for(let a of[".kan.yml",".css",".svg",".md",".html"])if(e.endsWith(a)){i=a,d=!0,c=e.slice(0,-a.length);break}let f=!d&&/application\/yaml|text\/yaml/i.test(t),g=c.endsWith("/");g&&c!=="/"&&(c=c.slice(0,-1));let l=oe.parse(c,o);if(!l)return P(e);if(l.kind==="package"){let a=ce(n,l.package_,l.versionSpec);if(!a)return await Re(n,l.package_,l.versionSpec,i===".kan.yml"||f)??P(e);if(i===".kan.yml"||f){let v=n.rawByNsKey.get(`${l.package_}@${a}`);return v!==void 0?R(200,S[".kan.yml"],v):P(e)}let m=n.pkgSelfByVer.get(`${l.package_}@${a}`);if(!m)return P(e);if(i===".css")return R(200,S[".css"],r.renderStylesheet(m));if(!g)return be(c+"/");let y=l.versionSpec.kind==="any";if(y&&!r.hasDeclaredView(m)){let v=(n.pkgVersions.get(l.package_)||[]).map(x=>x.verStr);return R(200,S[".html"],r.renderPackageVersionList(l.package_,v,m))}return R(200,S[".html"],await r.renderDocument(m,y?{bareOverview:!0}:void 0))}if(l.kind==="resource"){let a=ce(n,l.package_,l.versionSpec);if(!a)return P(e);let m=n.bySubject.get(`${o}/${l.package_}@${a}/${l.name}`);if(!m)return P(e);switch(i){case".css":return R(200,S[".css"],r.renderStylesheet(m));case".svg":return R(200,S[".svg"],await r.renderSvg(m));case".md":{let y=r.renderRawMarkdown(m);return y===void 0?P(e):R(200,S[".md"],y)}default:return R(200,S[".html"],await r.renderDocument(m))}}return P(e)}import{readFileSync as xe}from"fs";var Y=class{constructor(e={}){this.options=e}options;models=new Map;workspaceIndex;clearCache(){this.models.clear(),this.workspaceIndex=void 0}getWorkspaceIndex(){if(this.workspaceIndex)return this.workspaceIndex;let e=new Set,t=new Set;if(this.options.root!==void 0){let r=new D;for(let o of N(this.options.root))try{let i=r.parse(xe(o,"utf-8")).metadata?.namespace_;if(!i?.version)continue;let d=i.version;e.add(`${i.publisher}/${i.package_}@${d.major}.${d.minor}.${d.patch}`),t.add(`${i.publisher}/${i.package_}`)}catch{}}return this.workspaceIndex={exact:e,pkgs:t},this.workspaceIndex}async modelFor(e,t,r){let o=this.getWorkspaceIndex(),i=this.options.fetchFn?{fetchFn:this.options.fetchFn}:{},d=t?r?o.exact.has(`${e}/${t}@${r}`):o.pkgs.has(`${e}/${t}`):[...o.pkgs].some(a=>a.startsWith(`${e}/`)),c,f;if(d&&this.options.root!==void 0){let a=this.options.root;c=`ws:${e}`,f=()=>T(a,{publisher:e})}else{let a=t?r?`${e}/${t}@${r}`:`${e}/${t}`:e;c=`rm:${a}`,f=()=>U(a,i)}let g=this.models.get(c);if(g)return g;let l=await f();return l.lookRenderer.setLinkMode("open-world"),this.models.set(c,l),l}async handle(e,t=""){let r=e.split("/").filter(Boolean);if(r.length===0)return{status:200,headers:{"Content-Type":"text/html; charset=utf-8"},body:pe()};let o=r[0];if(!o.includes("."))return{status:404,headers:{"Content-Type":"text/html; charset=utf-8"},body:"<!doctype html><meta charset=utf-8><title>404</title><h1>404</h1><p>Expected a publisher domain as the first path segment: <code>/{publisher}/{package}/{version}/{resource}</code></p>"};let i=r.length>=2&&(r[1]==="index.html"||r[1]==="index.css"||r[1]==="index.txt"||r[1]===".well-known"),d=!i&&r.length>=2?r[1]:void 0,c=!i&&r.length>=3&&/^\d+\.\d+\.\d+$/.test(r[2])?r[2]:void 0,f=await this.modelFor(o,d,c),g=e.endsWith("/")&&r.length>1?"/":"",l="/"+r.slice(1).join("/")+g,a=await G(f,l,t);return a.headers.Location?{...a,headers:{...a.headers,Location:`/${o}${a.headers.Location}`}}:a}};function pe(){return'<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Kanonak origin</title></head><body style="font-family:system-ui;max-width:40rem;margin:4rem auto;padding:0 1rem"><h1>Kanonak request-driven origin</h1><p>Open a resource by its address:</p><p><code>/{publisher}/{package}/{version}/{resource}</code></p><p>e.g. <code>/kanonak.org/capabilities/2.0.0/Capability</code></p></body></html>'}export{j as ClosureScopedRepository,Y as RequestRouter,ae as UNIVERSAL_RENDER_BASE,M as deriveImportClosure,pe as landingPage,U as loadResourceModel,T as loadServerModel,H as renderRefKey,C as resolveRenderContract,G as route};
@@ -1,4 +1,4 @@
1
- import{b as Y,c as An,d as Sn,e as ce,f as Te,g as O,h as wn,i as X,j as q}from"../chunk-X5TYWQRA.js";import{a as se}from"../chunk-F5ANO7MJ.js";import"../chunk-QHABFCRC.js";import"../chunk-4NO7MHS7.js";import"../chunk-GN2XODVC.js";import"../chunk-PEJALHXK.js";import{a as kn,b as bn,c as hn,d as Dn}from"../chunk-SHDHMKMJ.js";import{f as ie}from"../chunk-G2DKKSZ4.js";import{a as ae}from"../chunk-TJPQETHV.js";import{b as L,c as A,f as S}from"../chunk-CRKSKIAL.js";import"../chunk-IOMNZBK4.js";import{b as N,c as D,d as K,g as M,h as P,i as F,j as W,l as H}from"../chunk-W6T7MOKY.js";import"../chunk-FUUTGGJS.js";import{g as oe}from"../chunk-2ACBWC7K.js";var $e="kanonak.org",Ue="document-ast",i=e=>({publisher:$e,package_:Ue,name:e}),m={Document:i("Document"),Block:i("Block"),Inline:i("Inline"),StructuredValue:i("StructuredValue"),Heading:i("Heading"),Paragraph:i("Paragraph"),RawBlock:i("RawBlock"),Text:i("Text"),StructuredMap:i("StructuredMap"),StructuredEntry:i("StructuredEntry"),StructuredList:i("StructuredList"),StringScalar:i("StringScalar"),IntegerScalar:i("IntegerScalar"),EscapeHint:i("EscapeHint"),MediaType:i("MediaType"),metadata:i("metadata"),children:i("children"),level:i("level"),inlines:i("inlines"),text:i("text"),entries:i("entries"),key:i("key"),value:i("value"),escapeHint:i("escapeHint"),items:i("items"),stringValue:i("stringValue"),integerValue:i("integerValue"),rawContent:i("rawContent"),mediaType:i("mediaType"),mimeType:i("mimeType"),ESC_RAW:i("esc-raw"),ESC_YAML_SAFE:i("esc-yaml-safe"),ESC_TOML_STRING:i("esc-toml-string"),ESC_TOML_MULTILINE:i("esc-toml-multiline"),ESC_JSON:i("esc-json"),ESC_DYNAMODB_BOOL:i("esc-dynamodb-bool"),ESC_DYNAMODB_NUMBER:i("esc-dynamodb-number"),ESC_DYNAMODB_NULL:i("esc-dynamodb-null"),TEXT_PLAIN:i("text-plain"),TEXT_MARKDOWN:i("text-markdown"),TEXT_HTML:i("text-html"),TEXT_CSS:i("text-css"),APPLICATION_JSON:i("application-json"),TEXT_YAML:i("text-yaml"),IMAGE_SVG_XML:i("image-svg-xml"),ResourceLink:i("ResourceLink"),target:i("target"),linkLabel:i("linkLabel"),PropertyList:i("PropertyList"),propertyEntries:i("propertyEntries"),PropertyEntry:i("PropertyEntry"),propertyKey:i("propertyKey"),propertyValue:i("propertyValue"),Table:i("Table"),tableColumnLabels:i("tableColumnLabels"),tableRows:i("tableRows"),TableRow:i("TableRow"),tableCells:i("tableCells")};function ue(e,n){return e.publisher===n.publisher&&e.package_===n.package_&&e.name===n.name}var j=class{backendUri="kanonak.org/transformations/markdown-with-frontmatter";render(n,t){let r=xe(n.metadata,t),o=Le(n.children),s=["---",...r,"---","",o].join(`
1
+ import{b as Y,c as An,d as Sn,e as ce,f as Te,g as O,h as wn,i as X,j as q}from"../chunk-XWRVENU6.js";import{a as se}from"../chunk-RVOMWGIN.js";import"../chunk-QHABFCRC.js";import"../chunk-4NO7MHS7.js";import"../chunk-PJMOM5H7.js";import"../chunk-PEJALHXK.js";import{a as kn,b as bn,c as hn,d as Dn}from"../chunk-SHDHMKMJ.js";import{f as ie}from"../chunk-IUZZDC2U.js";import{a as ae}from"../chunk-TJPQETHV.js";import{b as L,c as A,f as S}from"../chunk-XQS5LDSO.js";import"../chunk-IOMNZBK4.js";import{b as N,c as D,d as K,g as M,h as P,i as F,j as W,l as H}from"../chunk-W6T7MOKY.js";import"../chunk-FUUTGGJS.js";import{g as oe}from"../chunk-2ACBWC7K.js";var $e="kanonak.org",Ue="document-ast",i=e=>({publisher:$e,package_:Ue,name:e}),m={Document:i("Document"),Block:i("Block"),Inline:i("Inline"),StructuredValue:i("StructuredValue"),Heading:i("Heading"),Paragraph:i("Paragraph"),RawBlock:i("RawBlock"),Text:i("Text"),StructuredMap:i("StructuredMap"),StructuredEntry:i("StructuredEntry"),StructuredList:i("StructuredList"),StringScalar:i("StringScalar"),IntegerScalar:i("IntegerScalar"),EscapeHint:i("EscapeHint"),MediaType:i("MediaType"),metadata:i("metadata"),children:i("children"),level:i("level"),inlines:i("inlines"),text:i("text"),entries:i("entries"),key:i("key"),value:i("value"),escapeHint:i("escapeHint"),items:i("items"),stringValue:i("stringValue"),integerValue:i("integerValue"),rawContent:i("rawContent"),mediaType:i("mediaType"),mimeType:i("mimeType"),ESC_RAW:i("esc-raw"),ESC_YAML_SAFE:i("esc-yaml-safe"),ESC_TOML_STRING:i("esc-toml-string"),ESC_TOML_MULTILINE:i("esc-toml-multiline"),ESC_JSON:i("esc-json"),ESC_DYNAMODB_BOOL:i("esc-dynamodb-bool"),ESC_DYNAMODB_NUMBER:i("esc-dynamodb-number"),ESC_DYNAMODB_NULL:i("esc-dynamodb-null"),TEXT_PLAIN:i("text-plain"),TEXT_MARKDOWN:i("text-markdown"),TEXT_HTML:i("text-html"),TEXT_CSS:i("text-css"),APPLICATION_JSON:i("application-json"),TEXT_YAML:i("text-yaml"),IMAGE_SVG_XML:i("image-svg-xml"),ResourceLink:i("ResourceLink"),target:i("target"),linkLabel:i("linkLabel"),PropertyList:i("PropertyList"),propertyEntries:i("propertyEntries"),PropertyEntry:i("PropertyEntry"),propertyKey:i("propertyKey"),propertyValue:i("propertyValue"),Table:i("Table"),tableColumnLabels:i("tableColumnLabels"),tableRows:i("tableRows"),TableRow:i("TableRow"),tableCells:i("tableCells")};function ue(e,n){return e.publisher===n.publisher&&e.package_===n.package_&&e.name===n.name}var j=class{backendUri="kanonak.org/transformations/markdown-with-frontmatter";render(n,t){let r=xe(n.metadata,t),o=Le(n.children),s=["---",...r,"---","",o].join(`
2
2
  `);return t?.trailingNewline&&(s.endsWith(`
3
3
  `)||(s+=`
4
4
  `)),s}};function xe(e,n){if(!e)return[];let t=new Map;for(let c of e.entries)t.set(I(c.key),c);let r=new Map;if(n?.metadataRenames)for(let[c,u]of n.metadataRenames)r.set(I(c),u);let a=(n?.metadataKeys??e.entries.map(c=>c.key)).map(I),s=[];for(let c of a){let u=t.get(c);if(!u)continue;let f=r.get(c),l=I(f??c),d=me(u.value,u.escapeHint);d!==void 0&&s.push(`${l}: ${d}`)}return s}function I(e){let n=e.lastIndexOf(".");return n===-1?e:e.substring(n+1)||e}function me(e,n){switch(e.kind){case"StringScalar":return Ve(e.stringValue,n);case"IntegerScalar":return String(e.integerValue);case"StructuredList":{let t=[];for(let r of e.items){let o=me(r,n);o!==void 0&&t.push(o)}return t.join(", ")}case"StructuredMap":return;default:return}}function Ve(e,n){return!n||ue(n,m.ESC_RAW)?e:ue(n,m.ESC_YAML_SAFE)?ve(e):e}function ve(e){return e.includes(`