@kanonak-protocol/cli 3.6.0 → 3.7.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.
package/dist/index.js CHANGED
@@ -1,31 +1,31 @@
1
1
  #!/usr/bin/env node
2
- import{Command as tl}from"commander";import{readFileSync as rl}from"fs";import{fileURLToPath as ol}from"url";import{dirname as al,join as il}from"path";import{KanonakParser as sl,PublisherIndex as cl,CredentialStore as ll,createAuthenticatedFetch as ul}from"@kanonak-protocol/sdk";import{readFileSync as Po,statSync as Ko}from"fs";import{resolve as Do,dirname as Eo}from"path";import{KanonakParser as Co,KanonakObjectValidator as Ao,ValidationSeverity as Zn}from"@kanonak-protocol/sdk";import{readFileSync as ko,readdirSync as ho}from"fs";import{join as yo,dirname as bo,basename as Yn}from"path";import{InMemoryKanonakDocumentRepository as wo,FileSystemKanonakDocumentRepository as $o,HttpKanonakDocumentRepository as So,getGlobalCachePath as vo}from"@kanonak-protocol/sdk";import{mkdirSync as lo,readFileSync as Jn,writeFileSync as Xn,existsSync as an,appendFileSync as uo}from"fs";import{join as fo,dirname as mo,isAbsolute as po}from"path";import{getGlobalCachePath as go}from"@kanonak-protocol/sdk";var V=class{constructor(e=go()){this.cacheDir=e;this.isProjectLocal=!po(e)}cacheDir;gitignoreChecked=!1;isProjectLocal;get(e,t,r){let o=this.getPath(e,t,r);return an(o)?Jn(o,"utf-8"):null}put(e,t,r,o){let a=this.getPath(e,t,r);lo(mo(a),{recursive:!0}),Xn(a,o,"utf-8"),this.isProjectLocal&&this.ensureGitignore()}has(e,t,r){return an(this.getPath(e,t,r))}ensureGitignore(){if(this.gitignoreChecked)return;this.gitignoreChecked=!0;let e=".gitignore",t=this.cacheDir;if(an(e)){if(Jn(e,"utf-8").split(`
3
- `).some(o=>o.trim()===t||o.trim()===t+"/"))return;uo(e,`
2
+ import{Command as tl}from"commander";import{readFileSync as rl}from"fs";import{fileURLToPath as ol}from"url";import{dirname as al,join as il}from"path";import{KanonakParser as sl,PublisherIndex as cl,CredentialStore as ll,createAuthenticatedFetch as ul}from"@kanonak-protocol/sdk";import{readFileSync as Ko,statSync as Do}from"fs";import{resolve as Eo,dirname as Ao}from"path";import{KanonakParser as Co,KanonakObjectValidator as Ro,ValidationSeverity as Zn}from"@kanonak-protocol/sdk";import{readFileSync as ho,readdirSync as yo}from"fs";import{join as wo,dirname as bo,basename as Yn}from"path";import{InMemoryKanonakDocumentRepository as $o,FileSystemKanonakDocumentRepository as So,HttpKanonakDocumentRepository as vo,getGlobalCachePath as Po}from"@kanonak-protocol/sdk";import{mkdirSync as uo,readFileSync as Jn,writeFileSync as Xn,existsSync as an,appendFileSync as fo}from"fs";import{join as mo,dirname as po,isAbsolute as go}from"path";import{getGlobalCachePath as ko}from"@kanonak-protocol/sdk";var M=class{constructor(e=ko()){this.cacheDir=e;this.isProjectLocal=!go(e)}cacheDir;gitignoreChecked=!1;isProjectLocal;get(e,t,r){let o=this.getPath(e,t,r);return an(o)?Jn(o,"utf-8"):null}put(e,t,r,o){let a=this.getPath(e,t,r);uo(po(a),{recursive:!0}),Xn(a,o,"utf-8"),this.isProjectLocal&&this.ensureGitignore()}has(e,t,r){return an(this.getPath(e,t,r))}ensureGitignore(){if(this.gitignoreChecked)return;this.gitignoreChecked=!0;let e=".gitignore",t=this.cacheDir;if(an(e)){if(Jn(e,"utf-8").split(`
3
+ `).some(o=>o.trim()===t||o.trim()===t+"/"))return;fo(e,`
4
4
  ${t}/
5
5
  `)}else Xn(e,`${t}/
6
- `)}getPath(e,t,r){return fo(this.cacheDir,e,`${t}@${r}.kan.yml`)}};function he(n){let e=n;for(;;){let t=bo(e);if(t===e)break;if(Yn(e).includes(".")||Yn(t).includes(".")){e=t;continue}break}return e}function Ce(n,e){for(let t of ho(n,{withFileTypes:!0})){let r=yo(n,t.name);t.isDirectory()&&t.name!=="node_modules"&&t.name!==".kanonak"?Ce(r,e):t.name.endsWith(".kan.yml")&&e.push(r)}}var sn=class{repos;constructor(...e){this.repos=e}async getHighestCompatibleVersionAsync(e,t){for(let r of this.repos)try{let o=await r.getHighestCompatibleVersionAsync(e,t);if(o)return o}catch{}return null}async getAllDocumentsAsync(){let e=[];for(let t of this.repos)try{e.push(...await t.getAllDocumentsAsync())}catch{}return e}async getDocumentAsync(e){for(let t of this.repos)try{let r=await t.getDocumentAsync(e);if(r)return r}catch{}return null}async getDocumentsByNamespaceAsync(e,t){for(let r of this.repos)try{let o=await r.getDocumentsByNamespaceAsync(e,t);if(o.length>0)return o}catch{}return[]}async saveDocumentAsync(e,t){await this.repos[0].saveDocumentAsync(e,t)}async deleteDocumentAsync(e){await this.repos[0].deleteDocumentAsync(e)}async clearNamespaceAsync(e,t){await this.repos[0].clearNamespaceAsync(e,t)}async getAllDocumentReferencesAsync(){return this.repos[0].getAllDocumentReferencesAsync()}async getDocumentContentAsync(e){for(let t of this.repos)try{let r=await t.getDocumentContentAsync(e);if(r)return r}catch{}return null}async getDocumentUriAsync(e){for(let t of this.repos)try{let r=await t.getDocumentUriAsync(e);if(r)return r}catch{}return null}};async function j(n,e){let t=[];Ce(n,t);let r=new wo(e);for(let s of t)try{let c=ko(s,"utf-8"),l=e.parse(c),d=l.metadata.namespace_;if(d){let f=`${d.publisher}/${d.package_}@${d.version}`;await r.saveDocumentAsync(l,f)}}catch{}let o=new $o(vo(),!0,e),a=new V,i=new So({getFromCache:(s,c,l)=>a.get(s,c,l),onFetch:(s,c,l,d)=>a.put(s,c,l,d)});return new sn(r,o,i)}async function Qn(n){let e=Do(n),t=Ko(e),r=t.isDirectory()?he(e):he(Eo(e)),o=new Co,a=new Ao(o),i=await j(r,o),s=[];if(t.isDirectory()?Ce(e,s):s.push(e),s.length===0){console.log("No .kan.yml files found.");return}let c=0,l=0;for(let d of s){let f=Po(d,"utf-8"),p=o.parseWithErrors(f);if(p.errors&&p.errors.length>0){console.log(`
7
- ${d}:`);for(let h of p.errors)console.log(` ERROR (parse): ${h.message} [line ${h.line}:${h.column}]`),c++;continue}let k=p.document;if(!k){console.log(`
8
- ${d}:`),console.log(" ERROR: Failed to parse document"),c++;continue}let b=await a.validateAsync(k,i),g=b.errors.filter(h=>h.severity===Zn.Error),y=b.errors.filter(h=>h.severity===Zn.Warning);if(g.length>0||y.length>0){let h=k.metadata.namespace_,w=h?`${h.publisher}/${h.package_}@${h.version}`:d;console.log(`
9
- ${w}:`);for(let $ of g)console.log(` ERROR: ${$.message}`),$.suggestion&&console.log(` -> ${$.suggestion}`);for(let $ of y)console.log(` WARN: ${$.message}`)}c+=g.length,l+=y.length}console.log(`
10
- ${s.length} file(s) validated. ${c} error(s), ${l} warning(s).`),c>0&&process.exit(1)}import{KanonakParser as Ro,PublisherIndex as _o,CredentialStore as Io,createAuthenticatedFetch as To}from"@kanonak-protocol/sdk";import{loadLockFile as jo,saveLockFile as Uo,computeIntegrity as Oo}from"@kanonak-protocol/sdk";function z(n){if(!n)return null;let e=n.indexOf("/");if(e===-1)return null;let t=n.substring(0,e),r=n.substring(e+1);if(!t||!r)return null;let o,a=null,i=null,s=r.indexOf("@");if(s!==-1){o=r.substring(0,s);let c=r.substring(s+1),l=c.indexOf("/");l===-1?a=c||null:(a=c.substring(0,l)||null,i=c.substring(l+1)||null)}else{let c=r.indexOf("/");c===-1?o=r:(o=r.substring(0,c),i=r.substring(c+1)||null)}return!o||i&&i.includes("/")||a&&a.includes("@")?null:{publisher:t,packageName:o,version:a,instanceName:i}}async function et(n){let e=new V,t=new Ro,r=new Io,o=To(r),a=new _o({fetchFn:o}),i=jo()??{version:"1",lastUpdated:new Date().toISOString(),packages:{}};if(!n){Object.keys(i.packages).length===0&&(console.error("No kanonak.lock file found or lock file is empty."),console.error("Usage: kanonak install {publisher}/{package}[@{version}]"),process.exit(1)),console.log(`Installing ${Object.keys(i.packages).length} package(s) from kanonak.lock...`);for(let[b,g]of Object.entries(i.packages)){let y=b.indexOf("/"),h=b.substring(0,y),w=b.substring(y+1),$=e.get(h,w,g.version);if($)console.log(` ${b}@${g.version} (cached)`);else{let S=g.resolved,D=await o(S,h);if(!D.ok)throw new Error(`Failed to fetch ${S} (${D.status} ${D.statusText})`);$=await D.text(),e.put(h,w,g.version,$),console.log(` ${b}@${g.version}`)}}console.log(`
11
- Installed ${Object.keys(i.packages).length} package(s) from lock file.`);return}let s=z(n);s||(console.error(`Invalid package reference: "${n}"`),console.error("Expected format: {publisher}/{package}[@{version}]"),process.exit(1));let{publisher:c,packageName:l,version:d,instanceName:f}=s;f&&(console.error(`\`kanonak install\` works on whole packages \u2014 got an instance suffix "/${f}".`),console.error(`Try: kanonak install ${c}/${l}${d?"@"+d:""}`),console.error("(Use `kanonak <capability> add` if you want to install one named instance.)"),process.exit(1));let p=d??await a.getHighestVersion(c,l);p||(console.error(`Could not resolve version for "${c}/${l}".`),console.error("Check the spelling, or run a search to see what the publisher offers."),process.exit(1)),console.log(`Installing ${c}/${l}@${p}...`);let k=new Set;await nt(c,l,p,e,t,a,o,k,i),Uo(i),console.log(`
12
- Installed ${k.size} package(s).`)}async function nt(n,e,t,r,o,a,i,s,c){let l=`${n}/${e}@${t}`;if(s.has(l))return;s.add(l);let d=`${n}/${e}`,f=r.get(n,e,t),p;if(f)console.log(` ${l} (cached)`),p=await a.getPackageUrl(n,e,t);else{p=await a.getPackageUrl(n,e,t);let g=await i(p,n);if(!g.ok)throw new Error(`Failed to fetch ${p} (${g.status} ${g.statusText})`);f=await g.text(),r.put(n,e,t,f),console.log(` ${l}`)}let k={},b=o.parse(f);if(b.metadata.imports)for(let[g,y]of Object.entries(b.metadata.imports))for(let h of y){let w=await a.resolveVersion(g,h);w?(k[`${g}/${h.packageName}`]=w,await nt(g,h.packageName,w,r,o,a,i,s,c)):console.error(` WARNING: Could not resolve ${g}/${h.packageName} ${h.package_}`)}c.packages[d]={version:t,resolved:p,integrity:Oo(f),dependencies:k}}import{readFileSync as xo}from"fs";import{resolve as No,dirname as Lo}from"path";import{KanonakParser as Fo}from"@kanonak-protocol/sdk";async function tt(n){let e=No(n),t=xo(e,"utf-8"),r=new Fo,o=r.parse(t),a=o.metadata.namespace_,i=a?`${a.publisher}/${a.package_}@${a.version}`:n;if(console.log(i),!o.metadata.imports){console.log(" (no imports)");return}let s=he(Lo(e)),c=await j(s,r),l=new Set;for(let[d,f]of Object.entries(o.metadata.imports))for(let p of f)await rt(d,p,c,l," ")}async function rt(n,e,t,r,o){let a=`${n}/${e.packageName}`;if(r.has(a)){console.log(`${o}${a} (${e.package_}) [circular]`);return}r.add(a);let i;try{i=await t.getHighestCompatibleVersionAsync(n,e)}catch{console.log(`${o}${a} (${e.package_}) [fetch failed]`);return}if(!i){console.log(`${o}${a} (${e.package_}) [not found]`);return}let s=i.metadata.namespace_?.version?.toString()??"?";if(console.log(`${o}${n}/${e.packageName}@${s}`),i.metadata.imports)for(let[c,l]of Object.entries(i.metadata.imports))for(let d of l)await rt(c,d,t,r,o+" ")}import{createHash as Mo,randomBytes as it}from"crypto";import{createServer as Bo}from"http";import{execFile as cn}from"child_process";import{CredentialStore as Ho,generateDPoPKeyPair as zo,createDPoPProof as ot,serverSupportsDPoP as qo}from"@kanonak-protocol/sdk";import{normalizeHost as Vo}from"@kanonak-protocol/sdk";var X=class{cache=new Map;async discover(e){let t=Vo(e);if(this.cache.has(t))return this.cache.get(t);let r=`https://${t}/.well-known/oauth-authorization-server`,o=await this.tryEndpoint(r);if(!o){let a=`https://${t}/.well-known/openid-configuration`;o=await this.tryEndpoint(a)}return this.cache.set(t,o),o}async supportsOAuth(e){return await this.discover(e)!==null}static supportsPkceS256(e){return e.codeChallengeMethodsSupported?.some(t=>t.toUpperCase()==="S256")??!1}static supportsDynamicRegistration(e){return!!e.registrationEndpoint}static supportsAuthorizationCode(e){return e.responseTypesSupported?.some(t=>t.toLowerCase()==="code")??!1}async tryEndpoint(e){let t;try{t=await fetch(e)}catch(o){let a=o instanceof Error?o.message:String(o);return a.includes("ENOTFOUND")||a.includes("ECONNREFUSED")?(console.error(` OAuth discovery: ${e} \u2014 host unreachable (${a})`),console.error(" If the server is behind a VPN, ensure you are connected.")):a.includes("CERT")||a.includes("SSL")||a.includes("TLS")?(console.error(` OAuth discovery: ${e} \u2014 TLS error (${a})`),console.error(" If using a custom CA certificate, set NODE_EXTRA_CA_CERTS=/path/to/ca.pem")):console.error(` OAuth discovery: ${e} \u2014 network error: ${a}`),null}if(!t.ok)return t.status===404||(t.status===403?(console.error(` OAuth discovery: ${e} \u2014 HTTP 403 Forbidden`),console.error(" Access may be blocked by a firewall, proxy, or WAF.")):t.status>=500&&(console.error(` OAuth discovery: ${e} \u2014 HTTP ${t.status} server error`),console.error(" The authorization server returned an internal error. Contact your IDP administrator."))),null;let r;try{r=await t.json()}catch{return console.error(` OAuth discovery: ${e} \u2014 response is not valid JSON`),console.error(" The endpoint may be returning HTML instead of JSON. Check IDP configuration."),null}return{issuer:ye(r.issuer),authorizationEndpoint:ye(r.authorization_endpoint),tokenEndpoint:ye(r.token_endpoint),registrationEndpoint:ye(r.registration_endpoint),revocationEndpoint:ye(r.revocation_endpoint),scopesSupported:ie(r.scopes_supported),responseTypesSupported:ie(r.response_types_supported),grantTypesSupported:ie(r.grant_types_supported),codeChallengeMethodsSupported:ie(r.code_challenge_methods_supported),tokenEndpointAuthMethodsSupported:ie(r.token_endpoint_auth_methods_supported),dpopSigningAlgValuesSupported:ie(r.dpop_signing_alg_values_supported)}}};function ye(n){return typeof n=="string"?n:null}function ie(n){return Array.isArray(n)?n.filter(e=>typeof e=="string"):null}var ce=class{discovery;credentialStore;constructor(e,t){this.discovery=e??new X,this.credentialStore=t??new Ho}async authorize(e,t=[]){console.log(`Starting OAuth flow for ${e}...`);let r=await this.discovery.discover(e);if(!r)return O(`No OAuth discovery endpoint found for '${e}'.
6
+ `)}getPath(e,t,r){return mo(this.cacheDir,e,`${t}@${r}.kan.yml`)}};function he(n){let e=n;for(;;){let t=bo(e);if(t===e)break;if(Yn(e).includes(".")||Yn(t).includes(".")){e=t;continue}break}return e}function Ae(n,e){for(let t of yo(n,{withFileTypes:!0})){let r=wo(n,t.name);t.isDirectory()&&t.name!=="node_modules"&&t.name!==".kanonak"?Ae(r,e):t.name.endsWith(".kan.yml")&&e.push(r)}}var sn=class{repos;constructor(...e){this.repos=e}async getHighestCompatibleVersionAsync(e,t){for(let r of this.repos)try{let o=await r.getHighestCompatibleVersionAsync(e,t);if(o)return o}catch{}return null}async getAllDocumentsAsync(){let e=[];for(let t of this.repos)try{e.push(...await t.getAllDocumentsAsync())}catch{}return e}async getDocumentAsync(e){for(let t of this.repos)try{let r=await t.getDocumentAsync(e);if(r)return r}catch{}return null}async getDocumentsByNamespaceAsync(e,t){for(let r of this.repos)try{let o=await r.getDocumentsByNamespaceAsync(e,t);if(o.length>0)return o}catch{}return[]}async saveDocumentAsync(e,t){await this.repos[0].saveDocumentAsync(e,t)}async deleteDocumentAsync(e){await this.repos[0].deleteDocumentAsync(e)}async clearNamespaceAsync(e,t){await this.repos[0].clearNamespaceAsync(e,t)}async getAllDocumentReferencesAsync(){return this.repos[0].getAllDocumentReferencesAsync()}async getDocumentContentAsync(e){for(let t of this.repos)try{let r=await t.getDocumentContentAsync(e);if(r)return r}catch{}return null}async getDocumentUriAsync(e){for(let t of this.repos)try{let r=await t.getDocumentUriAsync(e);if(r)return r}catch{}return null}};async function j(n,e){let t=[];Ae(n,t);let r=new $o(e);for(let s of t)try{let c=ho(s,"utf-8"),l=e.parse(c),f=l.metadata.namespace_;if(f){let m=`${f.publisher}/${f.package_}@${f.version}`;await r.saveDocumentAsync(l,m)}}catch{}let o=new So(Po(),!0,e),a=new M,i=new vo({getFromCache:(s,c,l)=>a.get(s,c,l),onFetch:(s,c,l,f)=>a.put(s,c,l,f)});return new sn(r,o,i)}async function Qn(n){let e=Eo(n),t=Do(e),r=t.isDirectory()?he(e):he(Ao(e)),o=new Co,a=new Ro(o),i=await j(r,o),s=[];if(t.isDirectory()?Ae(e,s):s.push(e),s.length===0){console.log("No .kan.yml files found.");return}let c=0,l=0;for(let f of s){let m=Ko(f,"utf-8"),p=o.parseWithErrors(m);if(p.errors&&p.errors.length>0){console.log(`
7
+ ${f}:`);for(let h of p.errors)console.log(` ERROR (parse): ${h.message} [line ${h.line}:${h.column}]`),c++;continue}let k=p.document;if(!k){console.log(`
8
+ ${f}:`),console.log(" ERROR: Failed to parse document"),c++;continue}let w=await a.validateAsync(k,i),g=w.errors.filter(h=>h.severity===Zn.Error),y=w.errors.filter(h=>h.severity===Zn.Warning);if(g.length>0||y.length>0){let h=k.metadata.namespace_,b=h?`${h.publisher}/${h.package_}@${h.version}`:f;console.log(`
9
+ ${b}:`);for(let $ of g)console.log(` ERROR: ${$.message}`),$.suggestion&&console.log(` -> ${$.suggestion}`);for(let $ of y)console.log(` WARN: ${$.message}`)}c+=g.length,l+=y.length}console.log(`
10
+ ${s.length} file(s) validated. ${c} error(s), ${l} warning(s).`),c>0&&process.exit(1)}import{KanonakParser as _o,PublisherIndex as Io,CredentialStore as To,createAuthenticatedFetch as jo}from"@kanonak-protocol/sdk";import{loadLockFile as Uo,saveLockFile as Oo,computeIntegrity as No}from"@kanonak-protocol/sdk";function q(n){if(!n)return null;let e=n.indexOf("/");if(e===-1)return null;let t=n.substring(0,e),r=n.substring(e+1);if(!t||!r)return null;let o,a=null,i=null,s=r.indexOf("@");if(s!==-1){o=r.substring(0,s);let c=r.substring(s+1),l=c.indexOf("/");l===-1?a=c||null:(a=c.substring(0,l)||null,i=c.substring(l+1)||null)}else{let c=r.indexOf("/");c===-1?o=r:(o=r.substring(0,c),i=r.substring(c+1)||null)}return!o||i&&i.includes("/")||a&&a.includes("@")?null:{publisher:t,packageName:o,version:a,instanceName:i}}async function et(n){let e=new M,t=new _o,r=new To,o=jo(r),a=new Io({fetchFn:o}),i=Uo()??{version:"1",lastUpdated:new Date().toISOString(),packages:{}};if(!n){Object.keys(i.packages).length===0&&(console.error("No kanonak.lock file found or lock file is empty."),console.error("Usage: kanonak install {publisher}/{package}[@{version}]"),process.exit(1)),console.log(`Installing ${Object.keys(i.packages).length} package(s) from kanonak.lock...`);for(let[w,g]of Object.entries(i.packages)){let y=w.indexOf("/"),h=w.substring(0,y),b=w.substring(y+1),$=e.get(h,b,g.version);if($)console.log(` ${w}@${g.version} (cached)`);else{let P=g.resolved,D=await o(P,h);if(!D.ok)throw new Error(`Failed to fetch ${P} (${D.status} ${D.statusText})`);$=await D.text(),e.put(h,b,g.version,$),console.log(` ${w}@${g.version}`)}}console.log(`
11
+ Installed ${Object.keys(i.packages).length} package(s) from lock file.`);return}let s=q(n);s||(console.error(`Invalid package reference: "${n}"`),console.error("Expected format: {publisher}/{package}[@{version}]"),process.exit(1));let{publisher:c,packageName:l,version:f,instanceName:m}=s;m&&(console.error(`\`kanonak install\` works on whole packages \u2014 got an instance suffix "/${m}".`),console.error(`Try: kanonak install ${c}/${l}${f?"@"+f:""}`),console.error("(Use `kanonak <capability> add` if you want to install one named instance.)"),process.exit(1));let p=f??await a.getHighestVersion(c,l);p||(console.error(`Could not resolve version for "${c}/${l}".`),console.error("Check the spelling, or run a search to see what the publisher offers."),process.exit(1)),console.log(`Installing ${c}/${l}@${p}...`);let k=new Set;await nt(c,l,p,e,t,a,o,k,i),Oo(i),console.log(`
12
+ Installed ${k.size} package(s).`)}async function nt(n,e,t,r,o,a,i,s,c){let l=`${n}/${e}@${t}`;if(s.has(l))return;s.add(l);let f=`${n}/${e}`,m=r.get(n,e,t),p;if(m)console.log(` ${l} (cached)`),p=await a.getPackageUrl(n,e,t);else{p=await a.getPackageUrl(n,e,t);let g=await i(p,n);if(!g.ok)throw new Error(`Failed to fetch ${p} (${g.status} ${g.statusText})`);m=await g.text(),r.put(n,e,t,m),console.log(` ${l}`)}let k={},w=o.parse(m);if(w.metadata.imports)for(let[g,y]of Object.entries(w.metadata.imports))for(let h of y){let b=await a.resolveVersion(g,h);b?(k[`${g}/${h.packageName}`]=b,await nt(g,h.packageName,b,r,o,a,i,s,c)):console.error(` WARNING: Could not resolve ${g}/${h.packageName} ${h.package_}`)}c.packages[f]={version:t,resolved:p,integrity:No(m),dependencies:k}}import{readFileSync as xo}from"fs";import{resolve as Vo,dirname as Lo}from"path";import{KanonakParser as Fo}from"@kanonak-protocol/sdk";async function tt(n){let e=Vo(n),t=xo(e,"utf-8"),r=new Fo,o=r.parse(t),a=o.metadata.namespace_,i=a?`${a.publisher}/${a.package_}@${a.version}`:n;if(console.log(i),!o.metadata.imports){console.log(" (no imports)");return}let s=he(Lo(e)),c=await j(s,r),l=new Set;for(let[f,m]of Object.entries(o.metadata.imports))for(let p of m)await rt(f,p,c,l," ")}async function rt(n,e,t,r,o){let a=`${n}/${e.packageName}`;if(r.has(a)){console.log(`${o}${a} (${e.package_}) [circular]`);return}r.add(a);let i;try{i=await t.getHighestCompatibleVersionAsync(n,e)}catch{console.log(`${o}${a} (${e.package_}) [fetch failed]`);return}if(!i){console.log(`${o}${a} (${e.package_}) [not found]`);return}let s=i.metadata.namespace_?.version?.toString()??"?";if(console.log(`${o}${n}/${e.packageName}@${s}`),i.metadata.imports)for(let[c,l]of Object.entries(i.metadata.imports))for(let f of l)await rt(c,f,t,r,o+" ")}import{createHash as Bo,randomBytes as it}from"crypto";import{createServer as Ho}from"http";import{execFile as cn}from"child_process";import{CredentialStore as zo,generateDPoPKeyPair as qo,createDPoPProof as ot,serverSupportsDPoP as Wo}from"@kanonak-protocol/sdk";import{normalizeHost as Mo}from"@kanonak-protocol/sdk";var Y=class{cache=new Map;async discover(e){let t=Mo(e);if(this.cache.has(t))return this.cache.get(t);let r=`https://${t}/.well-known/oauth-authorization-server`,o=await this.tryEndpoint(r);if(!o){let a=`https://${t}/.well-known/openid-configuration`;o=await this.tryEndpoint(a)}return this.cache.set(t,o),o}async supportsOAuth(e){return await this.discover(e)!==null}static supportsPkceS256(e){return e.codeChallengeMethodsSupported?.some(t=>t.toUpperCase()==="S256")??!1}static supportsDynamicRegistration(e){return!!e.registrationEndpoint}static supportsAuthorizationCode(e){return e.responseTypesSupported?.some(t=>t.toLowerCase()==="code")??!1}async tryEndpoint(e){let t;try{t=await fetch(e)}catch(o){let a=o instanceof Error?o.message:String(o);return a.includes("ENOTFOUND")||a.includes("ECONNREFUSED")?(console.error(` OAuth discovery: ${e} \u2014 host unreachable (${a})`),console.error(" If the server is behind a VPN, ensure you are connected.")):a.includes("CERT")||a.includes("SSL")||a.includes("TLS")?(console.error(` OAuth discovery: ${e} \u2014 TLS error (${a})`),console.error(" If using a custom CA certificate, set NODE_EXTRA_CA_CERTS=/path/to/ca.pem")):console.error(` OAuth discovery: ${e} \u2014 network error: ${a}`),null}if(!t.ok)return t.status===404||(t.status===403?(console.error(` OAuth discovery: ${e} \u2014 HTTP 403 Forbidden`),console.error(" Access may be blocked by a firewall, proxy, or WAF.")):t.status>=500&&(console.error(` OAuth discovery: ${e} \u2014 HTTP ${t.status} server error`),console.error(" The authorization server returned an internal error. Contact your IDP administrator."))),null;let r;try{r=await t.json()}catch{return console.error(` OAuth discovery: ${e} \u2014 response is not valid JSON`),console.error(" The endpoint may be returning HTML instead of JSON. Check IDP configuration."),null}return{issuer:ye(r.issuer),authorizationEndpoint:ye(r.authorization_endpoint),tokenEndpoint:ye(r.token_endpoint),registrationEndpoint:ye(r.registration_endpoint),revocationEndpoint:ye(r.revocation_endpoint),scopesSupported:ie(r.scopes_supported),responseTypesSupported:ie(r.response_types_supported),grantTypesSupported:ie(r.grant_types_supported),codeChallengeMethodsSupported:ie(r.code_challenge_methods_supported),tokenEndpointAuthMethodsSupported:ie(r.token_endpoint_auth_methods_supported),dpopSigningAlgValuesSupported:ie(r.dpop_signing_alg_values_supported)}}};function ye(n){return typeof n=="string"?n:null}function ie(n){return Array.isArray(n)?n.filter(e=>typeof e=="string"):null}var ce=class{discovery;credentialStore;constructor(e,t){this.discovery=e??new Y,this.credentialStore=t??new zo}async authorize(e,t=[]){console.log(`Starting OAuth flow for ${e}...`);let r=await this.discovery.discover(e);if(!r)return O(`No OAuth discovery endpoint found for '${e}'.
13
13
  The server must expose one of:
14
14
  - https://${e}/.well-known/oauth-authorization-server (RFC 8414)
15
15
  - https://${e}/.well-known/openid-configuration (OpenID Connect)
16
16
  Verify the hostname is correct and HTTPS is configured.
17
17
  If using a corporate proxy, ensure it is not blocking the discovery request.`);let o=[];if(r.authorizationEndpoint||o.push("authorization_endpoint"),r.tokenEndpoint||o.push("token_endpoint"),o.length>0)return O(`OAuth metadata for '${e}' is missing required fields: ${o.join(", ")}.
18
- Contact the IDP administrator to ensure these are included in the discovery document.`);let a=qo(r.dpopSigningAlgValuesSupported),i=null;if(a){console.log(" Server supports DPoP (RFC 9449) \u2014 generating key pair...");try{i=zo()}catch(D){return O(`Failed to generate DPoP key pair: ${se(D)}
19
- Ensure your Node.js installation supports EC P-256 curves.`)}}let{redirectUri:s,port:c,waitForCallback:l,close:d}=await Qo(),f=await this.credentialStore.getCredential(e),p=f?.clientId??null,k=f?.clientSecret??null;if(!p&&r.registrationEndpoint){console.log(" Registering dynamic OAuth client (RFC 7591)...");let D=await this.registerClient(r.registrationEndpoint,s);if(!D.success)return d(),O(D.error);p=D.clientId,k=D.clientSecret??null}if(!p)return d(),O(`No OAuth client credentials for '${e}' and the server does not support dynamic client registration (no registration_endpoint in metadata).
18
+ Contact the IDP administrator to ensure these are included in the discovery document.`);let a=Wo(r.dpopSigningAlgValuesSupported),i=null;if(a){console.log(" Server supports DPoP (RFC 9449) \u2014 generating key pair...");try{i=qo()}catch(D){return O(`Failed to generate DPoP key pair: ${se(D)}
19
+ Ensure your Node.js installation supports EC P-256 curves.`)}}let{redirectUri:s,port:c,waitForCallback:l,close:f}=await ea(),m=await this.credentialStore.getCredential(e),p=m?.clientId??null,k=m?.clientSecret??null;if(!p&&r.registrationEndpoint){console.log(" Registering dynamic OAuth client (RFC 7591)...");let D=await this.registerClient(r.registrationEndpoint,s);if(!D.success)return f(),O(D.error);p=D.clientId,k=D.clientSecret??null}if(!p)return f(),O(`No OAuth client credentials for '${e}' and the server does not support dynamic client registration (no registration_endpoint in metadata).
20
20
  You must pre-register a client with your IDP and configure the client_id.
21
21
  Ask your IDP administrator to enable dynamic client registration (RFC 7591),
22
- or add a registration_endpoint to the OAuth metadata.`);let b=Go(),g=Jo(b),y=Xo(),h=Yo(r.authorizationEndpoint,p,s,t,y,g);console.log(` Opening browser for authorization on port ${c}...`),console.log(" If the browser doesn't open, navigate to:"),console.log(` ${h}`),na(h);let w=await l();if(d(),!w)return O(`Authorization timed out after 5 minutes.
22
+ or add a registration_endpoint to the OAuth metadata.`);let w=Jo(),g=Xo(w),y=Yo(),h=Zo(r.authorizationEndpoint,p,s,t,y,g);console.log(` Opening browser for authorization on port ${c}...`),console.log(" If the browser doesn't open, navigate to:"),console.log(` ${h}`),ta(h);let b=await l();if(f(),!b)return O(`Authorization timed out after 5 minutes.
23
23
  The browser authorization was not completed in time.
24
- Re-run 'kanonak login ${e}' and complete the browser authorization promptly.`);if(!w.code){let D=w.error?`: ${w.error}`:"";return O(`No authorization code received${D}.
24
+ Re-run 'kanonak login ${e}' and complete the browser authorization promptly.`);if(!b.code){let D=b.error?`: ${b.error}`:"";return O(`No authorization code received${D}.
25
25
  The IDP may have rejected the authorization request.
26
- Check the IDP admin console for error details.`)}if(w.state!==y)return O(`Authorization state mismatch \u2014 possible CSRF attack.
26
+ Check the IDP admin console for error details.`)}if(b.state!==y)return O(`Authorization state mismatch \u2014 possible CSRF attack.
27
27
  The response did not match the expected session.
28
- Re-run 'kanonak login ${e}' to start a fresh authorization flow.`);console.log(" Exchanging authorization code for tokens...");let $=await this.exchangeCode(r.tokenEndpoint,p,k,w.code,s,b,i);if(!$.success)return O($.error);let S={clientId:p,clientSecret:k,accessToken:$.tokens.accessToken,refreshToken:$.tokens.refreshToken,expiresAt:$.tokens.expiresIn?new Date(Date.now()+$.tokens.expiresIn*1e3).toISOString():null,tokenEndpoint:r.tokenEndpoint,dpopKeyPair:i};return await this.credentialStore.store(e,S),console.log(` Successfully authenticated with ${e}`),a&&console.log(" DPoP proof-of-possession is active"),{success:!0,host:e}}async refresh(e){let t=await this.credentialStore.getCredential(e);if(!t)return O(`No stored credentials for '${e}'. Run 'kanonak login ${e}' to authenticate first.`);if(!t.refreshToken)return O(`No refresh token available for '${e}'.
28
+ Re-run 'kanonak login ${e}' to start a fresh authorization flow.`);console.log(" Exchanging authorization code for tokens...");let $=await this.exchangeCode(r.tokenEndpoint,p,k,b.code,s,w,i);if(!$.success)return O($.error);let P={clientId:p,clientSecret:k,accessToken:$.tokens.accessToken,refreshToken:$.tokens.refreshToken,expiresAt:$.tokens.expiresIn?new Date(Date.now()+$.tokens.expiresIn*1e3).toISOString():null,tokenEndpoint:r.tokenEndpoint,dpopKeyPair:i};return await this.credentialStore.store(e,P),console.log(` Successfully authenticated with ${e}`),a&&console.log(" DPoP proof-of-possession is active"),{success:!0,host:e}}async refresh(e){let t=await this.credentialStore.getCredential(e);if(!t)return O(`No stored credentials for '${e}'. Run 'kanonak login ${e}' to authenticate first.`);if(!t.refreshToken)return O(`No refresh token available for '${e}'.
29
29
  The authorization server may not issue refresh tokens for this client.
30
30
  Run 'kanonak login ${e}' to re-authenticate.`);if(!t.clientId)return O(`No client ID in stored credentials for '${e}'.
31
31
  The stored credential may be corrupted. Run 'kanonak logout ${e}' then 'kanonak login ${e}'.`);let r=t.tokenEndpoint;if(!r){let a=await this.discovery.discover(e);if(!a?.tokenEndpoint)return O(`Cannot find token endpoint for '${e}'.
@@ -39,59 +39,59 @@ Installed ${k.size} package(s).`)}async function nt(n,e,t,r,o,a,i,s,c){let l=`${
39
39
  HTTP ${r.status}: ${i}
40
40
  The IDP may not support dynamic registration for public clients.
41
41
  Ask your IDP administrator to enable RFC 7591 support, or pre-register a client manually.`}}let o=await r.json(),a=o.client_id;return a?{success:!0,clientId:a,clientSecret:o.client_secret}:{success:!1,error:`Dynamic client registration response from ${e} did not contain a client_id.
42
- The IDP response may be malformed. Contact your IDP administrator.`}}async exchangeCode(e,t,r,o,a,i,s){let c=new URLSearchParams({grant_type:"authorization_code",client_id:t,code:o,redirect_uri:a,code_verifier:i});r&&c.set("client_secret",r);let l={"Content-Type":"application/x-www-form-urlencoded"};if(s)try{l.DPoP=ot(s.privateKey,s.publicKey,"POST",e)}catch(f){return{success:!1,error:`Failed to create DPoP proof for token exchange: ${se(f)}
43
- The stored key pair may be corrupted. Run 'kanonak login' to re-authenticate.`}}let d;try{d=await fetch(e,{method:"POST",headers:l,body:c.toString()})}catch(f){return{success:!1,error:`Token exchange request to ${e} failed: ${se(f)}
44
- Ensure the token endpoint is reachable.`}}if(!d.ok){let f=await ln(d),p=Wo(f);return{success:!1,error:`Token exchange failed.
42
+ The IDP response may be malformed. Contact your IDP administrator.`}}async exchangeCode(e,t,r,o,a,i,s){let c=new URLSearchParams({grant_type:"authorization_code",client_id:t,code:o,redirect_uri:a,code_verifier:i});r&&c.set("client_secret",r);let l={"Content-Type":"application/x-www-form-urlencoded"};if(s)try{l.DPoP=ot(s.privateKey,s.publicKey,"POST",e)}catch(m){return{success:!1,error:`Failed to create DPoP proof for token exchange: ${se(m)}
43
+ The stored key pair may be corrupted. Run 'kanonak login' to re-authenticate.`}}let f;try{f=await fetch(e,{method:"POST",headers:l,body:c.toString()})}catch(m){return{success:!1,error:`Token exchange request to ${e} failed: ${se(m)}
44
+ Ensure the token endpoint is reachable.`}}if(!f.ok){let m=await ln(f),p=Go(m);return{success:!1,error:`Token exchange failed.
45
45
  Endpoint: ${e}
46
- HTTP ${d.status}: ${f}`+(p?`
47
- ${p}`:"")}}return{success:!0,tokens:at(await d.json())}}async refreshTokenRequest(e,t,r,o,a){let i=new URLSearchParams({grant_type:"refresh_token",client_id:t,refresh_token:o});r&&i.set("client_secret",r);let s={"Content-Type":"application/x-www-form-urlencoded"};if(a)try{s.DPoP=ot(a.privateKey,a.publicKey,"POST",e)}catch(l){return{success:!1,error:`Failed to create DPoP proof for token refresh: ${se(l)}`}}let c;try{c=await fetch(e,{method:"POST",headers:s,body:i.toString()})}catch(l){return{success:!1,error:`Token refresh request to ${e} failed: ${se(l)}`}}if(!c.ok){let l=await ln(c);return{success:!1,error:`Token refresh failed \u2014 HTTP ${c.status}: ${l}`}}return{success:!0,tokens:at(await c.json())}}async revokeToken(e,t,r){await fetch(e,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({token:t,client_id:r}).toString()})}};function O(n){return{success:!1,error:n}}function at(n){return{accessToken:n.access_token,refreshToken:n.refresh_token,expiresIn:typeof n.expires_in=="number"?n.expires_in:void 0}}function se(n){return n instanceof Error?n.message:String(n)}async function ln(n){try{return await n.text()}catch{return"(could not read response body)"}}function Wo(n){try{let e=JSON.parse(n);switch(e.error){case"invalid_grant":return"Hint: The authorization code may have expired or already been used. Re-run the login flow.";case"invalid_client":return"Hint: The client credentials were rejected. The client_id may be invalid or the client_secret may be wrong.";case"redirect_uri_mismatch":return"Hint: The redirect_uri does not match what was registered with the IDP.";case"unsupported_grant_type":return"Hint: The IDP does not support authorization_code grants. Contact your IDP administrator.";case"invalid_scope":return"Hint: One or more requested scopes are not allowed. Check the scopes configured on the IDP.";case"use_dpop_nonce":return"Hint: The server requires a DPoP nonce. This should be handled automatically \u2014 please report this as a bug.";default:return e.error_description?`IDP says: ${e.error_description}`:null}}catch{return null}}function Go(){return it(32).toString("base64url")}function Jo(n){return Mo("sha256").update(n).digest("base64url")}function Xo(){return it(16).toString("base64url")}function Yo(n,e,t,r,o,a){let i=new URLSearchParams({client_id:e,response_type:"code",redirect_uri:t,scope:r.join(" "),state:o,code_challenge:a,code_challenge_method:"S256"});return`${n}?${i}`}var Zo=300*1e3;async function Qo(){return new Promise(n=>{let e=Bo((o,a)=>{let i=new URL(o.url,"http://localhost"),s=i.searchParams.get("code")??void 0,c=i.searchParams.get("state")??void 0,l=i.searchParams.get("error")??i.searchParams.get("error_description")??void 0,d=l?ea(l):null,f=d?`<html><body><h1>Authorization failed</h1><p>${d}</p></body></html>`:"<html><body><h1>Authorization successful!</h1><p>You can close this window.</p></body></html>";a.writeHead(200,{"Content-Type":"text/html"}),a.end(f),t({code:s,state:c,error:l})}),t,r=new Promise(o=>{t=o,setTimeout(()=>{o(null),e.close()},Zo)});e.listen(0,"127.0.0.1",()=>{let o=e.address();n({redirectUri:`http://localhost:${o.port}/callback`,port:o.port,waitForCallback:()=>r,close:()=>e.close()})})})}function ea(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function na(n){try{process.platform==="win32"?cn("cmd",["/c","start","",n]):process.platform==="darwin"?cn("open",[n]):cn("xdg-open",[n])}catch{console.log(" Could not open browser automatically. Please navigate to the URL above manually.")}}import{CredentialStore as ta}from"@kanonak-protocol/sdk";async function st(n){try{let e=new X,t=new ta,o=await new ce(e,t).authorize(n);o.success?console.log(`
46
+ HTTP ${f.status}: ${m}`+(p?`
47
+ ${p}`:"")}}return{success:!0,tokens:at(await f.json())}}async refreshTokenRequest(e,t,r,o,a){let i=new URLSearchParams({grant_type:"refresh_token",client_id:t,refresh_token:o});r&&i.set("client_secret",r);let s={"Content-Type":"application/x-www-form-urlencoded"};if(a)try{s.DPoP=ot(a.privateKey,a.publicKey,"POST",e)}catch(l){return{success:!1,error:`Failed to create DPoP proof for token refresh: ${se(l)}`}}let c;try{c=await fetch(e,{method:"POST",headers:s,body:i.toString()})}catch(l){return{success:!1,error:`Token refresh request to ${e} failed: ${se(l)}`}}if(!c.ok){let l=await ln(c);return{success:!1,error:`Token refresh failed \u2014 HTTP ${c.status}: ${l}`}}return{success:!0,tokens:at(await c.json())}}async revokeToken(e,t,r){await fetch(e,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({token:t,client_id:r}).toString()})}};function O(n){return{success:!1,error:n}}function at(n){return{accessToken:n.access_token,refreshToken:n.refresh_token,expiresIn:typeof n.expires_in=="number"?n.expires_in:void 0}}function se(n){return n instanceof Error?n.message:String(n)}async function ln(n){try{return await n.text()}catch{return"(could not read response body)"}}function Go(n){try{let e=JSON.parse(n);switch(e.error){case"invalid_grant":return"Hint: The authorization code may have expired or already been used. Re-run the login flow.";case"invalid_client":return"Hint: The client credentials were rejected. The client_id may be invalid or the client_secret may be wrong.";case"redirect_uri_mismatch":return"Hint: The redirect_uri does not match what was registered with the IDP.";case"unsupported_grant_type":return"Hint: The IDP does not support authorization_code grants. Contact your IDP administrator.";case"invalid_scope":return"Hint: One or more requested scopes are not allowed. Check the scopes configured on the IDP.";case"use_dpop_nonce":return"Hint: The server requires a DPoP nonce. This should be handled automatically \u2014 please report this as a bug.";default:return e.error_description?`IDP says: ${e.error_description}`:null}}catch{return null}}function Jo(){return it(32).toString("base64url")}function Xo(n){return Bo("sha256").update(n).digest("base64url")}function Yo(){return it(16).toString("base64url")}function Zo(n,e,t,r,o,a){let i=new URLSearchParams({client_id:e,response_type:"code",redirect_uri:t,scope:r.join(" "),state:o,code_challenge:a,code_challenge_method:"S256"});return`${n}?${i}`}var Qo=300*1e3;async function ea(){return new Promise(n=>{let e=Ho((o,a)=>{let i=new URL(o.url,"http://localhost"),s=i.searchParams.get("code")??void 0,c=i.searchParams.get("state")??void 0,l=i.searchParams.get("error")??i.searchParams.get("error_description")??void 0,f=l?na(l):null,m=f?`<html><body><h1>Authorization failed</h1><p>${f}</p></body></html>`:"<html><body><h1>Authorization successful!</h1><p>You can close this window.</p></body></html>";a.writeHead(200,{"Content-Type":"text/html"}),a.end(m),t({code:s,state:c,error:l})}),t,r=new Promise(o=>{t=o,setTimeout(()=>{o(null),e.close()},Qo)});e.listen(0,"127.0.0.1",()=>{let o=e.address();n({redirectUri:`http://localhost:${o.port}/callback`,port:o.port,waitForCallback:()=>r,close:()=>e.close()})})})}function na(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function ta(n){try{process.platform==="win32"?cn("cmd",["/c","start","",n]):process.platform==="darwin"?cn("open",[n]):cn("xdg-open",[n])}catch{console.log(" Could not open browser automatically. Please navigate to the URL above manually.")}}import{CredentialStore as ra}from"@kanonak-protocol/sdk";async function st(n){try{let e=new Y,t=new ra,o=await new ce(e,t).authorize(n);o.success?console.log(`
48
48
  Authenticated with ${n}.`):(console.error(`
49
49
  Authentication failed:
50
50
  ${o.error}`),process.exit(1))}catch(e){let t=e instanceof Error?e.message:String(e);console.error(`
51
51
  Authentication failed unexpectedly:
52
52
  ${t}`),console.error(`
53
- If this persists, see https://github.com/kanonak-protocol for support channels.`),process.exit(1)}}import{CredentialStore as ra}from"@kanonak-protocol/sdk";async function ct(n){try{let e=new X,t=new ra,o=await new ce(e,t).logout(n);o.success?console.log(`Logged out from ${n}.`):(console.error(`
53
+ If this persists, see https://github.com/kanonak-protocol for support channels.`),process.exit(1)}}import{CredentialStore as oa}from"@kanonak-protocol/sdk";async function ct(n){try{let e=new Y,t=new oa,o=await new ce(e,t).logout(n);o.success?console.log(`Logged out from ${n}.`):(console.error(`
54
54
  Logout failed:
55
55
  ${o.error}`),process.exit(1))}catch(e){let t=e instanceof Error?e.message:String(e);console.error(`
56
56
  Logout failed unexpectedly:
57
- ${t}`),process.exit(1)}}import{Command as Ta}from"commander";import{KanonakParser as ja,KanonakObjectParser as Ua,PublisherIndex as Oa,CredentialStore as xa,createAuthenticatedFetch as Na,computeIntegrity as La}from"@kanonak-protocol/sdk";import{readFileSync as oa,writeFileSync as aa,existsSync as ia}from"fs";import{join as sa}from"path";import lt from"js-yaml";import{getGlobalCachePath as ca}from"@kanonak-protocol/sdk";var la=`# This file is generated by Kanonak CLI. Do not edit manually.
58
- `;function ut(){let n=ca();return sa(n,"..","capabilities.lock")}function le(){let n=ut();if(!ia(n))return{version:"1",lastUpdated:new Date().toISOString(),capabilities:{}};let e=oa(n,"utf-8"),t=lt.load(e);return!t||typeof t!="object"||t.version!=="1"?{version:"1",lastUpdated:new Date().toISOString(),capabilities:{}}:{version:"1",lastUpdated:t.lastUpdated??new Date().toISOString(),capabilities:t.capabilities??{}}}function be(n){n.lastUpdated=new Date().toISOString();let e={};for(let r of Object.keys(n.capabilities).sort())e[r]=n.capabilities[r];n.capabilities=e;let t=lt.dump(n,{lineWidth:-1,sortKeys:!1,quotingType:'"'});aa(ut(),la+t,"utf-8")}var E=class{constructor(e,t){this.doc=e;this.broader=t}doc;broader;async getAllDocumentsAsync(){return[this.doc]}async getDocumentAsync(e){return this.broader.getDocumentAsync(e)}async getDocumentsByNamespaceAsync(e,t){return this.broader.getDocumentsByNamespaceAsync(e,t)}async getHighestCompatibleVersionAsync(e,t){return this.broader.getHighestCompatibleVersionAsync(e,t)}async saveDocumentAsync(){throw new Error("SingleDocumentRepository is read-only")}async deleteDocumentAsync(){throw new Error("SingleDocumentRepository is read-only")}async clearNamespaceAsync(){throw new Error("SingleDocumentRepository is read-only")}async getAllDocumentReferencesAsync(){return[]}async getDocumentContentAsync(e){return this.broader.getDocumentContentAsync(e)}async getDocumentUriAsync(e){return this.broader.getDocumentUriAsync(e)}};import{existsSync as ka,readdirSync as ha,readFileSync as ya}from"fs";import{join as mt}from"path";import{KanonakObjectParser as ba,EmbeddedKanonak as ht,ReferenceKanonak as yt,getGlobalCachePath as wa}from"@kanonak-protocol/sdk";import{SubjectKanonak as dt,DefinedKanonak as ua,StringStatement as da,NumberStatement as fa,BooleanStatement as ma,ReferenceStatement as ft,EmbeddedStatement as pu,ListStatement as pa}from"@kanonak-protocol/sdk";function B(n){return`${n.publisher}/${n.package_}/${n.name}`}function U(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}function v(n,e){if(!(n instanceof ua))return!1;for(let t of n.statement)if(t.predicate?.subject?.name==="type"&&t instanceof ft){let o=t.object;if(U(o.subject,e))return!0}return!1}function C(n,e){let t=[];for(let r of n)r instanceof dt&&v(r,e)&&t.push(r);return t}function we(n,e){let t=e.version,r=t&&typeof t.major=="number"?`${e.publisher}/${e.package_}@${t.major}.${t.minor}.${t.patch}`:void 0;for(let o of n){if(!(o instanceof dt)||o.name!==e.name)continue;let a=o.namespace||"";if(r!==void 0){if(a===r)return o}else if(a.startsWith(`${e.publisher}/${e.package_}@`))return o}}function un(n,e){for(let t of n.statement){let r=t.predicate;if(r?.subject&&U(r.subject,e))return t}}function ga(n,e){let t=un(n,e);if(t&&(t instanceof da||t instanceof fa||t instanceof ma))return t.object}function R(n,e){let t=ga(n,e);return typeof t=="string"?t:void 0}function ue(n,e){let t=un(n,e);if(t instanceof ft)return t.object.subject}function dn(n,e){let t=un(n,e);return t instanceof pa?t.object??[]:[]}var _="kanonak.org",I="capabilities",fn={publisher:_,package_:I,name:"Capability"},$a={publisher:_,package_:I,name:"commandName"},bt={publisher:_,package_:I,name:"description"},Sa={publisher:_,package_:I,name:"managesType"},va={publisher:_,package_:I,name:"deploymentTarget"},Pa={publisher:_,package_:I,name:"hasCommand"},Ka={publisher:_,package_:I,name:"subcommandName"},Da={publisher:_,package_:I,name:"performs"},Ea={publisher:_,package_:I,name:"hasArgument"},Ca={publisher:_,package_:I,name:"argumentName"},pt={publisher:_,package_:I,name:"isRequired"},gt={publisher:_,package_:I,name:"isOption"},Aa={publisher:_,package_:I,name:"defaultValue"};async function wt(n,e,t){let r=le(),o=new ba,a=[],i=!1;for(let[s,c]of Object.entries(r.capabilities)){let l=c,d=n.get(l.publisher,l.package_,l.version);if(!d){let f=await Ra(s,l,e,o,t);if(f)console.error(` Healed capability "${s}": ${l.publisher}/${l.package_}@${l.version} \u2192 ${f.entry.publisher}/${f.entry.package_}@${f.entry.version} (package was renamed)`),r.capabilities[s]=f.entry,l=f.entry,d=f.content,i=!0;else{console.error(` WARNING: Cached content missing for capability "${s}" (${l.publisher}/${l.package_}@${l.version}). Reinstall it with: kanonak capability remove ${s} && kanonak capability add ${l.publisher}/${l.package_}`);continue}}try{let f=e.parse(d),p=new E(f,t),k=await o.parseKanonaks(p),b=$t(k,l.publisher,l.package_,l.version);b?a.push(b):console.error(` WARNING: No Capability instance found in "${s}" (${l.publisher}/${l.package_}@${l.version})`)}catch(f){console.error(` WARNING: Failed to parse capability "${s}": ${f}`)}}return i&&be(r),a}async function Ra(n,e,t,r,o){let a=mt(wa(),e.publisher);if(!ka(a))return;let i=[];for(let s of ha(a)){if(!s.endsWith(".kan.yml"))continue;let c=s.slice(0,-8),l=c.lastIndexOf("@");if(l===-1)continue;let d=c.substring(0,l),f=c.substring(l+1);if(d===e.package_&&f===e.version)continue;let p;try{p=ya(mt(a,s),"utf-8")}catch{continue}let k;try{let b=t.parse(p),g=new E(b,o),y=await r.parseKanonaks(g);k=$t(y,e.publisher,d,f)?.commandName}catch{continue}k===n&&i.push({entry:{publisher:e.publisher,package_:d,version:f,resolved:`kanonak://${e.publisher}/${d}@${f}`,integrity:""},content:p})}if(i.length===1)return i[0]}function $t(n,e,t,r){let o=C(n,fn);if(o.length===0)return;let a=o[0],i=R(a,$a)??"",s=R(a,bt)??"",c=ue(a,Sa),l=ue(a,va),d=[];for(let f of dn(a,Pa)){let p=_a(f,n);p&&d.push(p)}return{commandName:i,description:s,managesTypeKey:c?B(c):"",deploymentTargetKey:l?B(l):"",commands:d,publisher:e,package_:t,version:r}}function _a(n,e){let t;if(n instanceof ht)t=n;else if(n instanceof yt){let c=St(e,n.subject.publisher,n.subject.package_,n.subject.name);c&&(t=c)}if(!t)return;let r=R(t,Ka)??"",o=R(t,bt)??"",a=ue(t,Da),i=dn(t,Ea),s=[];for(let c of i){let l=Ia(c,e);l&&s.push(l)}return{subcommandName:r,description:o,arguments:s,actionKey:a?B(a):""}}function Ia(n,e){let t;if(n instanceof ht)t=n;else if(n instanceof yt){let c=St(e,n.subject.publisher,n.subject.package_,n.subject.name);c&&(t=c)}if(!t)return;let r=R(t,Ca)??"",o=R(t,pt)==="true"||kt(t,pt)===!0,a=R(t,gt)==="true"||kt(t,gt)===!0,i=R(t,Aa),s={argumentName:r,required:o,isOption:a};return i!==void 0&&(s.defaultValue=i),s}function kt(n,e){for(let t of n.statement){let r=t,o=r.predicate;if(o?.subject&&o.subject.publisher===e.publisher&&o.subject.package_===e.package_&&o.subject.name===e.name)return typeof r.object=="boolean"?r.object:void 0}}function St(n,e,t,r){for(let o of n){if(!("name"in o)||!("namespace"in o))continue;let a=o;if(a.name===r&&!(!a.namespace||typeof a.namespace!="string")&&a.namespace.startsWith(`${e}/${t}@`))return o}}var Fa={publisher:_,package_:I,name:"commandName"};function vt(){let n=new Ta("capability").description("Manage Kanonak CLI capabilities (pluggable command groups)");return n.command("add <package>").description("Install a capability from a Kanonak publisher").action(async e=>{await Va(e)}),n.command("remove <name>").description("Remove an installed capability").action(async e=>{await Ma(e)}),n.command("list").description("List installed capabilities").action(async()=>{await Ba()}),n}async function Va(n){let e=z(n);e||(console.error(`Invalid package reference: "${n}"`),console.error("Expected format: {publisher}/{package}[@{version}]"),process.exit(1));let{publisher:t,packageName:r,version:o,instanceName:a}=e;a&&(console.error(`\`kanonak capability add\` installs whole packages \u2014 got an instance suffix "/${a}".`),console.error(`Try: kanonak capability add ${t}/${r}${o?"@"+o:""}`),process.exit(1));let i=new V,s=new ja,c=new Ua,l=new xa,d=Na(l),f=new Oa({fetchFn:d}),p=o??await f.getHighestVersion(t,r);p||(console.error(`Could not resolve version for "${t}/${r}".`),process.exit(1)),console.log(`Installing capability ${t}/${r}@${p}...`);let k=i.get(t,r,p);if(!k){let T=await f.getPackageUrl(t,r,p),F=await d(T,t);if(!F.ok)throw new Error(`Failed to fetch ${T} (${F.status} ${F.statusText})`);k=await F.text(),i.put(t,r,p,k)}let b=s.parse(k),g=await j(process.cwd(),s),y=new E(b,g),h=await c.parseKanonaks(y),w=C(h,fn);w.length===0&&(console.error(`Package ${t}/${r}@${p} does not contain a ${_}/${I}/Capability instance.`),process.exit(1));let $=w[0],S=R($,Fa);S||(console.error(`Capability instance in ${t}/${r}@${p} has no commandName property.`),process.exit(1));let D=le();D.capabilities[S]={publisher:t,package_:r,version:p,resolved:await f.getPackageUrl(t,r,p),integrity:La(k)},be(D),console.log(`
59
- Installed capability "${S}".`),console.log(`Run "kanonak ${S} --help" to get started.`)}async function Ma(n){let e=le();e.capabilities[n]||(console.error(`Capability "${n}" is not installed.`),process.exit(1));let t=e.capabilities[n];delete e.capabilities[n],be(e),console.log(`Removed capability "${n}" (${t.publisher}/${t.package_}@${t.version}).`)}async function Ba(){let n=le(),e=Object.entries(n.capabilities);if(e.length===0){console.log("No capabilities installed."),console.log("Install one with: kanonak capability add {publisher}/{package}");return}console.log(`Installed capabilities:
60
- `);for(let[t,r]of e)console.log(` ${t} ${r.publisher}/${r.package_}@${r.version}`)}import{Command as De}from"commander";import{readFileSync as zi,writeFileSync as qi,mkdirSync as Wi,existsSync as sr,statSync as Gi}from"fs";import{join as Ji,resolve as Xi}from"path";import{KanonakParser as Cn,KanonakObjectParser as An,SubjectKanonak as Yi,Reasoner as Zi,KanonakVocabulary as Qi,makeUriKey as lr,pickHighestDocument as Rn,formatVersion as ur}from"@kanonak-protocol/sdk";var Ha="kanonak.org",za="transformations";var m=n=>({publisher:Ha,package_:za,name:n}),u={Transformation:m("Transformation"),InstanceTransformation:m("InstanceTransformation"),SetTransformation:m("SetTransformation"),inputPattern:m("inputPattern"),rule:m("rule"),artifactName:m("artifactName"),outputs:m("outputs"),formatOverrides:m("formatOverrides"),partitionBy:m("partitionBy"),InputPattern:m("InputPattern"),matchesClass:m("matchesClass"),requires:m("requires"),sortBy:m("sortBy"),SortKey:m("SortKey"),byProperty:m("byProperty"),order:m("order"),SortOrder:m("SortOrder"),ascending:m("ascending"),descending:m("descending"),OutputFormat:m("OutputFormat"),backendUri:m("backendUri"),FormatOverride:m("FormatOverride"),formatTarget:m("formatTarget"),metadataKeys:m("metadataKeys"),metadataRenames:m("metadataRenames"),trailingNewline:m("trailingNewline"),omitWrapper:m("omitWrapper"),RenameEntry:m("RenameEntry"),fromKey:m("fromKey"),toKey:m("toKey"),FMT_MARKDOWN_FRONTMATTER:m("markdown-with-frontmatter"),FMT_PLAIN_MARKDOWN:m("plain-markdown"),FMT_TOML:m("toml"),FMT_JSON:m("json"),FMT_HTML:m("html"),FMT_SVG:m("svg"),Expression:m("Expression"),ListSourcedExpression:m("ListSourcedExpression"),ListAggregate:m("ListAggregate"),IteratingExpression:m("IteratingExpression"),BuildAstNode:m("BuildAstNode"),astClass:m("astClass"),set:m("set"),AstFieldBinding:m("AstFieldBinding"),field:m("field"),bindValue:m("bindValue"),When:m("When"),condition:m("condition"),thenBuild:m("thenBuild"),elseBuild:m("elseBuild"),Concat:m("Concat"),parts:m("parts"),Fallback:m("Fallback"),primary:m("primary"),alternate:m("alternate"),StringLiteral:m("StringLiteral"),stringLiteral:m("stringLiteral"),IntegerLiteral:m("IntegerLiteral"),integerLiteral:m("integerLiteral"),DecimalLiteral:m("DecimalLiteral"),decimalLiteral:m("decimalLiteral"),BooleanLiteral:m("BooleanLiteral"),booleanLiteral:m("booleanLiteral"),VarRef:m("VarRef"),varName:m("varName"),PropertyRead:m("PropertyRead"),readSource:m("readSource"),readProp:m("readProp"),Traverse:m("Traverse"),traverseSource:m("traverseSource"),through:m("through"),step:m("step"),UriName:m("UriName"),uriNameOf:m("uriNameOf"),UriPublisher:m("UriPublisher"),uriPublisherOf:m("uriPublisherOf"),UriPackage:m("UriPackage"),uriPackageOf:m("uriPackageOf"),UriVersion:m("UriVersion"),uriVersionOf:m("uriVersionOf"),SubjectUri:m("SubjectUri"),subjectOf:m("subjectOf"),UriLiteral:m("UriLiteral"),refTo:m("refTo"),DisplayLabel:m("DisplayLabel"),labelTarget:m("labelTarget"),labelSource:m("labelSource"),ResolveRef:m("ResolveRef"),resolveSource:m("resolveSource"),Normalize:m("Normalize"),normSource:m("normSource"),normKind:m("normKind"),NormalizeKind:m("NormalizeKind"),NORM_TRIM_END:m("trim-end"),IsSet:m("IsSet"),checkExpr:m("checkExpr"),ExpressionFragment:m("ExpressionFragment"),body:m("body"),CallFragment:m("CallFragment"),fragmentRef:m("fragmentRef"),source:m("source"),Join:m("Join"),separator:m("separator"),Count:m("Count"),Sum:m("Sum"),Min:m("Min"),Max:m("Max"),Average:m("Average"),loopVar:m("loopVar"),ForEach:m("ForEach"),emit:m("emit"),ListMap:m("ListMap"),mapBody:m("mapBody"),Filter:m("Filter"),predicate:m("predicate"),PartitionBy:m("PartitionBy"),partitionKey:m("partitionKey"),DistinctBy:m("DistinctBy"),distinctKey:m("distinctKey"),Partition:m("Partition"),key:m("key"),members:m("members"),AllStatements:m("AllStatements"),statementsOf:m("statementsOf"),StatementPredicate:m("StatementPredicate"),predicateOf:m("predicateOf"),StatementValue:m("StatementValue"),valueOf:m("valueOf"),DateFormat:m("DateFormat"),dateSource:m("dateSource"),dateFormat:m("dateFormat"),BinaryArithmetic:m("BinaryArithmetic"),arithLeft:m("arithLeft"),arithRight:m("arithRight"),Add:m("Add"),Subtract:m("Subtract"),Multiply:m("Multiply"),Divide:m("Divide"),Reverse:m("Reverse")};import{DefinedKanonak as Qt,ReferenceKanonak as er,StringStatement as nr,NumberStatement as tr,BooleanStatement as rr,ReferenceStatement as or,ListStatement as ar}from"@kanonak-protocol/sdk";var qa="kanonak.org",Wa="document-ast",K=n=>({publisher:qa,package_:Wa,name:n}),H={Document:K("Document"),Block:K("Block"),Inline:K("Inline"),StructuredValue:K("StructuredValue"),Heading:K("Heading"),Paragraph:K("Paragraph"),RawBlock:K("RawBlock"),Text:K("Text"),StructuredMap:K("StructuredMap"),StructuredEntry:K("StructuredEntry"),StructuredList:K("StructuredList"),StringScalar:K("StringScalar"),IntegerScalar:K("IntegerScalar"),EscapeHint:K("EscapeHint"),MediaType:K("MediaType"),metadata:K("metadata"),children:K("children"),level:K("level"),inlines:K("inlines"),text:K("text"),entries:K("entries"),key:K("key"),value:K("value"),escapeHint:K("escapeHint"),items:K("items"),stringValue:K("stringValue"),integerValue:K("integerValue"),rawContent:K("rawContent"),mediaType:K("mediaType"),mimeType:K("mimeType"),ESC_RAW:K("esc-raw"),ESC_YAML_SAFE:K("esc-yaml-safe"),ESC_TOML_STRING:K("esc-toml-string"),ESC_TOML_MULTILINE:K("esc-toml-multiline"),ESC_JSON:K("esc-json"),TEXT_PLAIN:K("text-plain"),TEXT_MARKDOWN:K("text-markdown"),TEXT_HTML:K("text-html"),APPLICATION_JSON:K("application-json"),TEXT_YAML:K("text-yaml"),IMAGE_SVG_XML:K("image-svg-xml")};function Pt(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}var Re=class{backendUri="kanonak.org/transformations/markdown-with-frontmatter";render(e,t){let r=Ga(e.metadata,t),o=Ya(e.children),i=["---",...r,"---","",o].join(`
57
+ ${t}`),process.exit(1)}}import{Command as ja}from"commander";import{KanonakParser as Ua,KanonakObjectParser as Oa,PublisherIndex as Na,CredentialStore as xa,createAuthenticatedFetch as Va,computeIntegrity as La}from"@kanonak-protocol/sdk";import{readFileSync as aa,writeFileSync as ia,existsSync as sa}from"fs";import{join as ca}from"path";import lt from"js-yaml";import{getGlobalCachePath as la}from"@kanonak-protocol/sdk";var ua=`# This file is generated by Kanonak CLI. Do not edit manually.
58
+ `;function ut(){let n=la();return ca(n,"..","capabilities.lock")}function le(){let n=ut();if(!sa(n))return{version:"1",lastUpdated:new Date().toISOString(),capabilities:{}};let e=aa(n,"utf-8"),t=lt.load(e);return!t||typeof t!="object"||t.version!=="1"?{version:"1",lastUpdated:new Date().toISOString(),capabilities:{}}:{version:"1",lastUpdated:t.lastUpdated??new Date().toISOString(),capabilities:t.capabilities??{}}}function we(n){n.lastUpdated=new Date().toISOString();let e={};for(let r of Object.keys(n.capabilities).sort())e[r]=n.capabilities[r];n.capabilities=e;let t=lt.dump(n,{lineWidth:-1,sortKeys:!1,quotingType:'"'});ia(ut(),ua+t,"utf-8")}var E=class{constructor(e,t){this.doc=e;this.broader=t}doc;broader;async getAllDocumentsAsync(){return[this.doc]}async getDocumentAsync(e){return this.broader.getDocumentAsync(e)}async getDocumentsByNamespaceAsync(e,t){return this.broader.getDocumentsByNamespaceAsync(e,t)}async getHighestCompatibleVersionAsync(e,t){return this.broader.getHighestCompatibleVersionAsync(e,t)}async saveDocumentAsync(){throw new Error("SingleDocumentRepository is read-only")}async deleteDocumentAsync(){throw new Error("SingleDocumentRepository is read-only")}async clearNamespaceAsync(){throw new Error("SingleDocumentRepository is read-only")}async getAllDocumentReferencesAsync(){return[]}async getDocumentContentAsync(e){return this.broader.getDocumentContentAsync(e)}async getDocumentUriAsync(e){return this.broader.getDocumentUriAsync(e)}};import{existsSync as ha,readdirSync as ya,readFileSync as wa}from"fs";import{join as mt}from"path";import{KanonakObjectParser as ba,EmbeddedKanonak as ht,ReferenceKanonak as yt,getGlobalCachePath as $a}from"@kanonak-protocol/sdk";import{SubjectKanonak as dt,DefinedKanonak as da,StringStatement as fa,NumberStatement as ma,BooleanStatement as pa,ReferenceStatement as ft,EmbeddedStatement as pu,ListStatement as ga}from"@kanonak-protocol/sdk";function H(n){return`${n.publisher}/${n.package_}/${n.name}`}function U(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}function v(n,e){if(!(n instanceof da))return!1;for(let t of n.statement)if(t.predicate?.subject?.name==="type"&&t instanceof ft){let o=t.object;if(U(o.subject,e))return!0}return!1}function C(n,e){let t=[];for(let r of n)r instanceof dt&&v(r,e)&&t.push(r);return t}function be(n,e){let t=e.version,r=t&&typeof t.major=="number"?`${e.publisher}/${e.package_}@${t.major}.${t.minor}.${t.patch}`:void 0;for(let o of n){if(!(o instanceof dt)||o.name!==e.name)continue;let a=o.namespace||"";if(r!==void 0){if(a===r)return o}else if(a.startsWith(`${e.publisher}/${e.package_}@`))return o}}function un(n,e){for(let t of n.statement){let r=t.predicate;if(r?.subject&&U(r.subject,e))return t}}function ka(n,e){let t=un(n,e);if(t&&(t instanceof fa||t instanceof ma||t instanceof pa))return t.object}function R(n,e){let t=ka(n,e);return typeof t=="string"?t:void 0}function ue(n,e){let t=un(n,e);if(t instanceof ft)return t.object.subject}function dn(n,e){let t=un(n,e);return t instanceof ga?t.object??[]:[]}var _="kanonak.org",I="capabilities",fn={publisher:_,package_:I,name:"Capability"},Sa={publisher:_,package_:I,name:"commandName"},wt={publisher:_,package_:I,name:"description"},va={publisher:_,package_:I,name:"managesType"},Pa={publisher:_,package_:I,name:"deploymentTarget"},Ka={publisher:_,package_:I,name:"hasCommand"},Da={publisher:_,package_:I,name:"subcommandName"},Ea={publisher:_,package_:I,name:"performs"},Aa={publisher:_,package_:I,name:"hasArgument"},Ca={publisher:_,package_:I,name:"argumentName"},pt={publisher:_,package_:I,name:"isRequired"},gt={publisher:_,package_:I,name:"isOption"},Ra={publisher:_,package_:I,name:"defaultValue"};async function bt(n,e,t){let r=le(),o=new ba,a=[],i=!1;for(let[s,c]of Object.entries(r.capabilities)){let l=c,f=n.get(l.publisher,l.package_,l.version);if(!f){let m=await _a(s,l,e,o,t);if(m)console.error(` Healed capability "${s}": ${l.publisher}/${l.package_}@${l.version} \u2192 ${m.entry.publisher}/${m.entry.package_}@${m.entry.version} (package was renamed)`),r.capabilities[s]=m.entry,l=m.entry,f=m.content,i=!0;else{console.error(` WARNING: Cached content missing for capability "${s}" (${l.publisher}/${l.package_}@${l.version}). Reinstall it with: kanonak capability remove ${s} && kanonak capability add ${l.publisher}/${l.package_}`);continue}}try{let m=e.parse(f),p=new E(m,t),k=await o.parseKanonaks(p),w=$t(k,l.publisher,l.package_,l.version);w?a.push(w):console.error(` WARNING: No Capability instance found in "${s}" (${l.publisher}/${l.package_}@${l.version})`)}catch(m){console.error(` WARNING: Failed to parse capability "${s}": ${m}`)}}return i&&we(r),a}async function _a(n,e,t,r,o){let a=mt($a(),e.publisher);if(!ha(a))return;let i=[];for(let s of ya(a)){if(!s.endsWith(".kan.yml"))continue;let c=s.slice(0,-8),l=c.lastIndexOf("@");if(l===-1)continue;let f=c.substring(0,l),m=c.substring(l+1);if(f===e.package_&&m===e.version)continue;let p;try{p=wa(mt(a,s),"utf-8")}catch{continue}let k;try{let w=t.parse(p),g=new E(w,o),y=await r.parseKanonaks(g);k=$t(y,e.publisher,f,m)?.commandName}catch{continue}k===n&&i.push({entry:{publisher:e.publisher,package_:f,version:m,resolved:`kanonak://${e.publisher}/${f}@${m}`,integrity:""},content:p})}if(i.length===1)return i[0]}function $t(n,e,t,r){let o=C(n,fn);if(o.length===0)return;let a=o[0],i=R(a,Sa)??"",s=R(a,wt)??"",c=ue(a,va),l=ue(a,Pa),f=[];for(let m of dn(a,Ka)){let p=Ia(m,n);p&&f.push(p)}return{commandName:i,description:s,managesTypeKey:c?H(c):"",deploymentTargetKey:l?H(l):"",commands:f,publisher:e,package_:t,version:r}}function Ia(n,e){let t;if(n instanceof ht)t=n;else if(n instanceof yt){let c=St(e,n.subject.publisher,n.subject.package_,n.subject.name);c&&(t=c)}if(!t)return;let r=R(t,Da)??"",o=R(t,wt)??"",a=ue(t,Ea),i=dn(t,Aa),s=[];for(let c of i){let l=Ta(c,e);l&&s.push(l)}return{subcommandName:r,description:o,arguments:s,actionKey:a?H(a):""}}function Ta(n,e){let t;if(n instanceof ht)t=n;else if(n instanceof yt){let c=St(e,n.subject.publisher,n.subject.package_,n.subject.name);c&&(t=c)}if(!t)return;let r=R(t,Ca)??"",o=R(t,pt)==="true"||kt(t,pt)===!0,a=R(t,gt)==="true"||kt(t,gt)===!0,i=R(t,Ra),s={argumentName:r,required:o,isOption:a};return i!==void 0&&(s.defaultValue=i),s}function kt(n,e){for(let t of n.statement){let r=t,o=r.predicate;if(o?.subject&&o.subject.publisher===e.publisher&&o.subject.package_===e.package_&&o.subject.name===e.name)return typeof r.object=="boolean"?r.object:void 0}}function St(n,e,t,r){for(let o of n){if(!("name"in o)||!("namespace"in o))continue;let a=o;if(a.name===r&&!(!a.namespace||typeof a.namespace!="string")&&a.namespace.startsWith(`${e}/${t}@`))return o}}var Fa={publisher:_,package_:I,name:"commandName"};function vt(){let n=new ja("capability").description("Manage Kanonak CLI capabilities (pluggable command groups)");return n.command("add <package>").description("Install a capability from a Kanonak publisher").action(async e=>{await Ma(e)}),n.command("remove <name>").description("Remove an installed capability").action(async e=>{await Ba(e)}),n.command("list").description("List installed capabilities").action(async()=>{await Ha()}),n}async function Ma(n){let e=q(n);e||(console.error(`Invalid package reference: "${n}"`),console.error("Expected format: {publisher}/{package}[@{version}]"),process.exit(1));let{publisher:t,packageName:r,version:o,instanceName:a}=e;a&&(console.error(`\`kanonak capability add\` installs whole packages \u2014 got an instance suffix "/${a}".`),console.error(`Try: kanonak capability add ${t}/${r}${o?"@"+o:""}`),process.exit(1));let i=new M,s=new Ua,c=new Oa,l=new xa,f=Va(l),m=new Na({fetchFn:f}),p=o??await m.getHighestVersion(t,r);p||(console.error(`Could not resolve version for "${t}/${r}".`),process.exit(1)),console.log(`Installing capability ${t}/${r}@${p}...`);let k=i.get(t,r,p);if(!k){let T=await m.getPackageUrl(t,r,p),F=await f(T,t);if(!F.ok)throw new Error(`Failed to fetch ${T} (${F.status} ${F.statusText})`);k=await F.text(),i.put(t,r,p,k)}let w=s.parse(k),g=await j(process.cwd(),s),y=new E(w,g),h=await c.parseKanonaks(y),b=C(h,fn);b.length===0&&(console.error(`Package ${t}/${r}@${p} does not contain a ${_}/${I}/Capability instance.`),process.exit(1));let $=b[0],P=R($,Fa);P||(console.error(`Capability instance in ${t}/${r}@${p} has no commandName property.`),process.exit(1));let D=le();D.capabilities[P]={publisher:t,package_:r,version:p,resolved:await m.getPackageUrl(t,r,p),integrity:La(k)},we(D),console.log(`
59
+ Installed capability "${P}".`),console.log(`Run "kanonak ${P} --help" to get started.`)}async function Ba(n){let e=le();e.capabilities[n]||(console.error(`Capability "${n}" is not installed.`),process.exit(1));let t=e.capabilities[n];delete e.capabilities[n],we(e),console.log(`Removed capability "${n}" (${t.publisher}/${t.package_}@${t.version}).`)}async function Ha(){let n=le(),e=Object.entries(n.capabilities);if(e.length===0){console.log("No capabilities installed."),console.log("Install one with: kanonak capability add {publisher}/{package}");return}console.log(`Installed capabilities:
60
+ `);for(let[t,r]of e)console.log(` ${t} ${r.publisher}/${r.package_}@${r.version}`)}import{Command as De}from"commander";import{readFileSync as zi,writeFileSync as qi,mkdirSync as Wi,existsSync as cr,statSync as Gi}from"fs";import{join as Ji,resolve as Xi}from"path";import{KanonakParser as An,KanonakObjectParser as Cn,SubjectKanonak as Yi,Reasoner as Zi,KanonakVocabulary as Qi,makeUriKey as ur,pickHighestDocument as Rn,formatVersion as dr}from"@kanonak-protocol/sdk";var za="kanonak.org",qa="transformations";var d=n=>({publisher:za,package_:qa,name:n}),u={Transformation:d("Transformation"),InstanceTransformation:d("InstanceTransformation"),SetTransformation:d("SetTransformation"),inputPattern:d("inputPattern"),rule:d("rule"),artifactName:d("artifactName"),outputs:d("outputs"),formatOverrides:d("formatOverrides"),partitionBy:d("partitionBy"),InputPattern:d("InputPattern"),matchesClass:d("matchesClass"),requires:d("requires"),sortBy:d("sortBy"),SortKey:d("SortKey"),byProperty:d("byProperty"),order:d("order"),SortOrder:d("SortOrder"),ascending:d("ascending"),descending:d("descending"),OutputFormat:d("OutputFormat"),backendUri:d("backendUri"),FormatOverride:d("FormatOverride"),formatTarget:d("formatTarget"),metadataKeys:d("metadataKeys"),metadataRenames:d("metadataRenames"),trailingNewline:d("trailingNewline"),omitWrapper:d("omitWrapper"),RenameEntry:d("RenameEntry"),fromKey:d("fromKey"),toKey:d("toKey"),FMT_MARKDOWN_FRONTMATTER:d("markdown-with-frontmatter"),FMT_PLAIN_MARKDOWN:d("plain-markdown"),FMT_TOML:d("toml"),FMT_JSON:d("json"),FMT_HTML:d("html"),FMT_SVG:d("svg"),Expression:d("Expression"),ListSourcedExpression:d("ListSourcedExpression"),ListAggregate:d("ListAggregate"),IteratingExpression:d("IteratingExpression"),BuildAstNode:d("BuildAstNode"),astClass:d("astClass"),set:d("set"),AstFieldBinding:d("AstFieldBinding"),field:d("field"),bindValue:d("bindValue"),When:d("When"),condition:d("condition"),thenBuild:d("thenBuild"),elseBuild:d("elseBuild"),Concat:d("Concat"),parts:d("parts"),Fallback:d("Fallback"),primary:d("primary"),alternate:d("alternate"),StringLiteral:d("StringLiteral"),stringLiteral:d("stringLiteral"),IntegerLiteral:d("IntegerLiteral"),integerLiteral:d("integerLiteral"),DecimalLiteral:d("DecimalLiteral"),decimalLiteral:d("decimalLiteral"),BooleanLiteral:d("BooleanLiteral"),booleanLiteral:d("booleanLiteral"),VarRef:d("VarRef"),varName:d("varName"),PropertyRead:d("PropertyRead"),readSource:d("readSource"),readProp:d("readProp"),Traverse:d("Traverse"),traverseSource:d("traverseSource"),through:d("through"),step:d("step"),UriName:d("UriName"),uriNameOf:d("uriNameOf"),UriPublisher:d("UriPublisher"),uriPublisherOf:d("uriPublisherOf"),UriPackage:d("UriPackage"),uriPackageOf:d("uriPackageOf"),UriVersion:d("UriVersion"),uriVersionOf:d("uriVersionOf"),SubjectUri:d("SubjectUri"),subjectOf:d("subjectOf"),UriLiteral:d("UriLiteral"),refTo:d("refTo"),DisplayLabel:d("DisplayLabel"),labelTarget:d("labelTarget"),labelSource:d("labelSource"),ResolveRef:d("ResolveRef"),resolveSource:d("resolveSource"),Normalize:d("Normalize"),normSource:d("normSource"),normKind:d("normKind"),NormalizeKind:d("NormalizeKind"),NORM_TRIM_END:d("trim-end"),IsSet:d("IsSet"),checkExpr:d("checkExpr"),ExpressionFragment:d("ExpressionFragment"),body:d("body"),CallFragment:d("CallFragment"),fragmentRef:d("fragmentRef"),source:d("source"),Join:d("Join"),separator:d("separator"),Count:d("Count"),Sum:d("Sum"),Min:d("Min"),Max:d("Max"),Average:d("Average"),loopVar:d("loopVar"),ForEach:d("ForEach"),emit:d("emit"),ListMap:d("ListMap"),mapBody:d("mapBody"),Filter:d("Filter"),predicate:d("predicate"),PartitionBy:d("PartitionBy"),partitionKey:d("partitionKey"),DistinctBy:d("DistinctBy"),distinctKey:d("distinctKey"),Partition:d("Partition"),key:d("key"),members:d("members"),AllStatements:d("AllStatements"),statementsOf:d("statementsOf"),StatementPredicate:d("StatementPredicate"),predicateOf:d("predicateOf"),StatementValue:d("StatementValue"),valueOf:d("valueOf"),DateFormat:d("DateFormat"),dateSource:d("dateSource"),dateFormat:d("dateFormat"),BinaryArithmetic:d("BinaryArithmetic"),arithLeft:d("arithLeft"),arithRight:d("arithRight"),Add:d("Add"),Subtract:d("Subtract"),Multiply:d("Multiply"),Divide:d("Divide"),Reverse:d("Reverse"),WindowedMap:d("WindowedMap"),windowSize:d("windowSize"),windowVar:d("windowVar"),windowBody:d("windowBody"),PairwiseMap:d("PairwiseMap"),firstVar:d("firstVar"),secondVar:d("secondVar"),pairBody:d("pairBody"),Scan:d("Scan"),initialState:d("initialState"),stateVar:d("stateVar"),elementVar:d("elementVar"),accumulate:d("accumulate"),ListItemAt:d("ListItemAt"),itemIndex:d("itemIndex")};import{DefinedKanonak as er,ReferenceKanonak as nr,StringStatement as tr,NumberStatement as rr,BooleanStatement as or,ReferenceStatement as ar,ListStatement as ir}from"@kanonak-protocol/sdk";var Wa="kanonak.org",Ga="document-ast",K=n=>({publisher:Wa,package_:Ga,name:n}),z={Document:K("Document"),Block:K("Block"),Inline:K("Inline"),StructuredValue:K("StructuredValue"),Heading:K("Heading"),Paragraph:K("Paragraph"),RawBlock:K("RawBlock"),Text:K("Text"),StructuredMap:K("StructuredMap"),StructuredEntry:K("StructuredEntry"),StructuredList:K("StructuredList"),StringScalar:K("StringScalar"),IntegerScalar:K("IntegerScalar"),EscapeHint:K("EscapeHint"),MediaType:K("MediaType"),metadata:K("metadata"),children:K("children"),level:K("level"),inlines:K("inlines"),text:K("text"),entries:K("entries"),key:K("key"),value:K("value"),escapeHint:K("escapeHint"),items:K("items"),stringValue:K("stringValue"),integerValue:K("integerValue"),rawContent:K("rawContent"),mediaType:K("mediaType"),mimeType:K("mimeType"),ESC_RAW:K("esc-raw"),ESC_YAML_SAFE:K("esc-yaml-safe"),ESC_TOML_STRING:K("esc-toml-string"),ESC_TOML_MULTILINE:K("esc-toml-multiline"),ESC_JSON:K("esc-json"),TEXT_PLAIN:K("text-plain"),TEXT_MARKDOWN:K("text-markdown"),TEXT_HTML:K("text-html"),APPLICATION_JSON:K("application-json"),TEXT_YAML:K("text-yaml"),IMAGE_SVG_XML:K("image-svg-xml")};function Pt(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}var Re=class{backendUri="kanonak.org/transformations/markdown-with-frontmatter";render(e,t){let r=Ja(e.metadata,t),o=Za(e.children),i=["---",...r,"---","",o].join(`
61
61
  `);return t?.trailingNewline&&(i.endsWith(`
62
62
  `)||(i+=`
63
- `)),i}};function Ga(n,e){if(!n)return[];let t=new Map;for(let s of n.entries)t.set(Ae(s.key),s);let r=new Map;if(e?.metadataRenames)for(let[s,c]of e.metadataRenames)r.set(Ae(s),c);let a=(e?.metadataKeys??n.entries.map(s=>s.key)).map(Ae),i=[];for(let s of a){let c=t.get(s);if(!c)continue;let l=r.get(s),d=Ae(l??s),f=Dt(c.value,c.escapeHint);f!==void 0&&i.push(`${d}: ${f}`)}return i}function Ae(n){let e=n.lastIndexOf(".");return e===-1?n:n.substring(e+1)||n}function Dt(n,e){switch(n.kind){case"StringScalar":return Ja(n.stringValue,e);case"IntegerScalar":return String(n.integerValue);case"StructuredList":{let t=[];for(let r of n.items){let o=Dt(r,e);o!==void 0&&t.push(o)}return t.join(", ")}case"StructuredMap":return;default:return}}function Ja(n,e){return!e||Pt(e,H.ESC_RAW)?n:Pt(e,H.ESC_YAML_SAFE)?Xa(n):n}function Xa(n){return n.includes(`
63
+ `)),i}};function Ja(n,e){if(!n)return[];let t=new Map;for(let s of n.entries)t.set(Ce(s.key),s);let r=new Map;if(e?.metadataRenames)for(let[s,c]of e.metadataRenames)r.set(Ce(s),c);let a=(e?.metadataKeys??n.entries.map(s=>s.key)).map(Ce),i=[];for(let s of a){let c=t.get(s);if(!c)continue;let l=r.get(s),f=Ce(l??s),m=Dt(c.value,c.escapeHint);m!==void 0&&i.push(`${f}: ${m}`)}return i}function Ce(n){let e=n.lastIndexOf(".");return e===-1?n:n.substring(e+1)||n}function Dt(n,e){switch(n.kind){case"StringScalar":return Xa(n.stringValue,e);case"IntegerScalar":return String(n.integerValue);case"StructuredList":{let t=[];for(let r of n.items){let o=Dt(r,e);o!==void 0&&t.push(o)}return t.join(", ")}case"StructuredMap":return;default:return}}function Xa(n,e){return!e||Pt(e,z.ESC_RAW)?n:Pt(e,z.ESC_YAML_SAFE)?Ya(n):n}function Ya(n){return n.includes(`
64
64
  `)?`|-
65
65
  ${n.replace(/\n/g,`
66
- `).trimEnd()}`:/[:#\[\]{}&*!|>'"%@`,]/.test(n)?`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`:n}function Ya(n){let e=[];for(let t of n){let r=Za(t);r&&e.push(r)}return e.join(`
66
+ `).trimEnd()}`:/[:#\[\]{}&*!|>'"%@`,]/.test(n)?`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`:n}function Za(n){let e=[];for(let t of n){let r=Qa(t);r&&e.push(r)}return e.join(`
67
67
 
68
- `)}function Za(n){switch(n.kind){case"Heading":return`${"#".repeat(n.level)} ${Kt(n.inlines)}`;case"Paragraph":return Kt(n.inlines);case"RawBlock":return n.rawContent;default:return""}}function Kt(n){let e=[];for(let t of n)t.kind==="Text"&&e.push(t.text);return e.join("")}function Qa(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}var _e=class{backendUri="kanonak.org/transformations/toml";render(e,t){let o=ei(e.metadata,t).join(`
68
+ `)}function Qa(n){switch(n.kind){case"Heading":return`${"#".repeat(n.level)} ${Kt(n.inlines)}`;case"Paragraph":return Kt(n.inlines);case"RawBlock":return n.rawContent;default:return""}}function Kt(n){let e=[];for(let t of n)t.kind==="Text"&&e.push(t.text);return e.join("")}function ei(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}var _e=class{backendUri="kanonak.org/transformations/toml";render(e,t){let o=ni(e.metadata,t).join(`
69
69
  `);return t?.trailingNewline&&(o.endsWith(`
70
70
  `)||(o+=`
71
- `)),o}};function ei(n,e){if(!n)return[];let t=new Map;for(let a of n.entries)t.set(a.key,a);let r=e?.metadataKeys??n.entries.map(a=>a.key),o=[];for(let a of r){let i=t.get(a);if(!i)continue;let s=e?.metadataRenames.get(a)??a,c=Et(i.value,i.escapeHint);c!==void 0&&o.push(`${s} = ${c}`)}return o}function Et(n,e){switch(n.kind){case"StringScalar":return ni(n.stringValue,e);case"IntegerScalar":return String(n.integerValue);case"StructuredList":{let t=[];for(let r of n.items){let o=Et(r,e);o!==void 0&&t.push(o)}return`[${t.join(", ")}]`}case"StructuredMap":return;default:return}}function ni(n,e){return e&&Qa(e,H.ESC_TOML_MULTILINE)?ri(n):ti(n)}function ti(n){return`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n")}"`}function ri(n){return`"""
71
+ `)),o}};function ni(n,e){if(!n)return[];let t=new Map;for(let a of n.entries)t.set(a.key,a);let r=e?.metadataKeys??n.entries.map(a=>a.key),o=[];for(let a of r){let i=t.get(a);if(!i)continue;let s=e?.metadataRenames.get(a)??a,c=Et(i.value,i.escapeHint);c!==void 0&&o.push(`${s} = ${c}`)}return o}function Et(n,e){switch(n.kind){case"StringScalar":return ti(n.stringValue,e);case"IntegerScalar":return String(n.integerValue);case"StructuredList":{let t=[];for(let r of n.items){let o=Et(r,e);o!==void 0&&t.push(o)}return`[${t.join(", ")}]`}case"StructuredMap":return;default:return}}function ti(n,e){return e&&ei(e,z.ESC_TOML_MULTILINE)?oi(n):ri(n)}function ri(n){return`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n")}"`}function oi(n){return`"""
72
72
  ${n.replace(/"""/g,'\\"\\"\\"')}
73
73
  """`}var Ie=class{backendUri="kanonak.org/transformations/json";render(e,t){let r=JSON.stringify(e,null,2);return t?.trailingNewline&&!r.endsWith(`
74
74
  `)?r+`
75
- `:r}};function At(n){let e=n.replace(/\r\n/g,`
75
+ `:r}};function Ct(n){let e=n.replace(/\r\n/g,`
76
76
  `).split(`
77
- `),t=[],r=0;for(;r<e.length;){let o=e[r];if(o.trim()===""){r++;continue}let a=/^(\s*)```(\S*)\s*$/.exec(o);if(a){let c=a[2],l=[];for(r++;r<e.length&&!/^(\s*)```\s*$/.test(e[r]);)l.push(e[r]),r++;r++;let d=Rt(l.join(`
78
- `)),f=c?` class="language-${_t(c)}"`:"";t.push(`<pre><code${f}>${d}</code></pre>`);continue}let i=/^(#{1,6})\s+(.*)$/.exec(o);if(i){let c=i[1].length,l=de(i[2].trim());t.push(`<h${c}>${l}</h${c}>`),r++;continue}if(o.includes("|")&&r+1<e.length&&Ct(e[r+1])){let c=mn(o),l=oi(e[r+1]);r+=2;let d=[];for(;r<e.length&&e[r].trim()!==""&&e[r].includes("|");)d.push(mn(e[r])),r++;t.push(ai(c,l,d));continue}if(/^\s*[-*]\s+/.test(o)){let c=[];for(;r<e.length&&/^\s*[-*]\s+/.test(e[r]);){let l=[e[r].replace(/^\s*[-*]\s+/,"")];for(r++;r<e.length&&e[r].trim()!==""&&!/^\s*[-*]\s+/.test(e[r])&&!/^\s*\d+\.\s+/.test(e[r]);)l.push(e[r]),r++;r<e.length&&e[r].trim()===""&&r++,c.push(`<li>${de(l.join(" ").trim())}</li>`)}t.push(`<ul>
77
+ `),t=[],r=0;for(;r<e.length;){let o=e[r];if(o.trim()===""){r++;continue}let a=/^(\s*)```(\S*)\s*$/.exec(o);if(a){let c=a[2],l=[];for(r++;r<e.length&&!/^(\s*)```\s*$/.test(e[r]);)l.push(e[r]),r++;r++;let f=Rt(l.join(`
78
+ `)),m=c?` class="language-${_t(c)}"`:"";t.push(`<pre><code${m}>${f}</code></pre>`);continue}let i=/^(#{1,6})\s+(.*)$/.exec(o);if(i){let c=i[1].length,l=de(i[2].trim());t.push(`<h${c}>${l}</h${c}>`),r++;continue}if(o.includes("|")&&r+1<e.length&&At(e[r+1])){let c=mn(o),l=ai(e[r+1]);r+=2;let f=[];for(;r<e.length&&e[r].trim()!==""&&e[r].includes("|");)f.push(mn(e[r])),r++;t.push(ii(c,l,f));continue}if(/^\s*[-*]\s+/.test(o)){let c=[];for(;r<e.length&&/^\s*[-*]\s+/.test(e[r]);){let l=[e[r].replace(/^\s*[-*]\s+/,"")];for(r++;r<e.length&&e[r].trim()!==""&&!/^\s*[-*]\s+/.test(e[r])&&!/^\s*\d+\.\s+/.test(e[r]);)l.push(e[r]),r++;r<e.length&&e[r].trim()===""&&r++,c.push(`<li>${de(l.join(" ").trim())}</li>`)}t.push(`<ul>
79
79
  ${c.join(`
80
80
  `)}
81
81
  </ul>`);continue}if(/^\s*\d+\.\s+/.test(o)){let c=[];for(;r<e.length&&/^\s*\d+\.\s+/.test(e[r]);){let l=[e[r].replace(/^\s*\d+\.\s+/,"")];for(r++;r<e.length&&e[r].trim()!==""&&!/^\s*\d+\.\s+/.test(e[r])&&!/^\s*[-*]\s+/.test(e[r]);)l.push(e[r]),r++;r<e.length&&e[r].trim()===""&&r++,c.push(`<li>${de(l.join(" ").trim())}</li>`)}t.push(`<ol>
82
82
  ${c.join(`
83
83
  `)}
84
- </ol>`);continue}let s=[o];for(r++;r<e.length&&e[r].trim()!==""&&!/^(#{1,6})\s+/.test(e[r])&&!/^(\s*)```/.test(e[r])&&!/^\s*[-*]\s+/.test(e[r])&&!/^\s*\d+\.\s+/.test(e[r])&&!(e[r].includes("|")&&r+1<e.length&&Ct(e[r+1]));)s.push(e[r]),r++;t.push(`<p>${de(s.join(" "))}</p>`)}return t.join(`
85
- `)}function Ct(n){return n.includes("-")?/^[\s|:-]+$/.test(n):!1}function mn(n){let e=n.trim();return e.startsWith("|")&&(e=e.slice(1)),e.endsWith("|")&&(e=e.slice(0,-1)),e.split("|").map(t=>t.trim())}function oi(n){return mn(n).map(e=>{let t=e.startsWith(":"),r=e.endsWith(":");return t&&r?"center":r?"right":t?"left":null})}function ai(n,e,t){let r=i=>{let s=e[i];return s?` style="text-align:${s}"`:""},o=n.map((i,s)=>`<th${r(s)}>${de(i)}</th>`).join(""),a=t.map(i=>`<tr>${i.map((c,l)=>`<td${r(l)}>${de(c)}</td>`).join("")}</tr>`).join(`
84
+ </ol>`);continue}let s=[o];for(r++;r<e.length&&e[r].trim()!==""&&!/^(#{1,6})\s+/.test(e[r])&&!/^(\s*)```/.test(e[r])&&!/^\s*[-*]\s+/.test(e[r])&&!/^\s*\d+\.\s+/.test(e[r])&&!(e[r].includes("|")&&r+1<e.length&&At(e[r+1]));)s.push(e[r]),r++;t.push(`<p>${de(s.join(" "))}</p>`)}return t.join(`
85
+ `)}function At(n){return n.includes("-")?/^[\s|:-]+$/.test(n):!1}function mn(n){let e=n.trim();return e.startsWith("|")&&(e=e.slice(1)),e.endsWith("|")&&(e=e.slice(0,-1)),e.split("|").map(t=>t.trim())}function ai(n){return mn(n).map(e=>{let t=e.startsWith(":"),r=e.endsWith(":");return t&&r?"center":r?"right":t?"left":null})}function ii(n,e,t){let r=i=>{let s=e[i];return s?` style="text-align:${s}"`:""},o=n.map((i,s)=>`<th${r(s)}>${de(i)}</th>`).join(""),a=t.map(i=>`<tr>${i.map((c,l)=>`<td${r(l)}>${de(c)}</td>`).join("")}</tr>`).join(`
86
86
  `);return`<table>
87
87
  <thead><tr>${o}</tr></thead>
88
88
  <tbody>
89
89
  ${a}
90
90
  </tbody>
91
- </table>`}function de(n){let e=Rt(n);return e=e.replace(/`([^`\n]+)`/g,(t,r)=>`<code>${r}</code>`),e=e.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(t,r,o)=>`<a href="${_t(o)}">${r}</a>`),e=e.replace(/\*\*([^*\n]+)\*\*/g,(t,r)=>`<strong>${r}</strong>`),e=e.replace(/(^|[^*])\*([^*\n]+)\*(?!\*)/g,(t,r,o)=>`${r}<em>${o}</em>`),e=e.replace(/(^|[\s(])_([^_\n]+)_(?=[\s).,;:!?]|$)/g,(t,r,o)=>`${r}<em>${o}</em>`),e}function Rt(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function _t(n){return n.replace(/"/g,"&quot;").replace(/&/g,"&amp;")}function pn(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}var Te=class{backendUri="kanonak.org/transformations/html";render(e,t){let r=ci(e.children);if(t?.omitWrapper){let s=r.endsWith(`
91
+ </table>`}function de(n){let e=Rt(n);return e=e.replace(/`([^`\n]+)`/g,(t,r)=>`<code>${r}</code>`),e=e.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(t,r,o)=>`<a href="${_t(o)}">${r}</a>`),e=e.replace(/\*\*([^*\n]+)\*\*/g,(t,r)=>`<strong>${r}</strong>`),e=e.replace(/(^|[^*])\*([^*\n]+)\*(?!\*)/g,(t,r,o)=>`${r}<em>${o}</em>`),e=e.replace(/(^|[\s(])_([^_\n]+)_(?=[\s).,;:!?]|$)/g,(t,r,o)=>`${r}<em>${o}</em>`),e}function Rt(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function _t(n){return n.replace(/"/g,"&quot;").replace(/&/g,"&amp;")}function pn(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}var Te=class{backendUri="kanonak.org/transformations/html";render(e,t){let r=li(e.children);if(t?.omitWrapper){let s=r.endsWith(`
92
92
  `)?r:`${r}
93
93
  `;return t.trailingNewline===!1&&s.endsWith(`
94
- `)?s.slice(0,-1):s}let o=ii(e.metadata)??"Untitled",a=si(e.metadata,t),i=`<!DOCTYPE html>
94
+ `)?s.slice(0,-1):s}let o=si(e.metadata)??"Untitled",a=ci(e.metadata,t),i=`<!DOCTYPE html>
95
95
  <html lang="en">
96
96
  <head>
97
97
  <meta charset="utf-8">
@@ -121,17 +121,17 @@ ${a}${r}
121
121
  </body>
122
122
  </html>
123
123
  `;return t?.trailingNewline===!1&&i.endsWith(`
124
- `)?i.slice(0,-1):i}};function ii(n){if(n){for(let e of n.entries)if((e.key==="title"||e.key==="name")&&e.value.kind==="StringScalar")return e.value.stringValue}}function si(n,e){if(!n||n.entries.length===0)return"";let t=e?.metadataKeys??n.entries.map(a=>a.key),r=new Map(n.entries.map(a=>[a.key,a])),o=[];for(let a of t){let i=r.get(a);if(!i)continue;let s=e?.metadataRenames.get(a)??a,c=Tt(i.value);c!==void 0&&o.push(` <dt>${$e(s)}</dt>
124
+ `)?i.slice(0,-1):i}};function si(n){if(n){for(let e of n.entries)if((e.key==="title"||e.key==="name")&&e.value.kind==="StringScalar")return e.value.stringValue}}function ci(n,e){if(!n||n.entries.length===0)return"";let t=e?.metadataKeys??n.entries.map(a=>a.key),r=new Map(n.entries.map(a=>[a.key,a])),o=[];for(let a of t){let i=r.get(a);if(!i)continue;let s=e?.metadataRenames.get(a)??a,c=Tt(i.value);c!==void 0&&o.push(` <dt>${$e(s)}</dt>
125
125
  <dd>${c}</dd>`)}return o.length===0?"":`<dl class="metadata">
126
126
  ${o.join(`
127
127
  `)}
128
128
  </dl>
129
- `}function Tt(n){switch(n.kind){case"StringScalar":return $e(n.stringValue);case"IntegerScalar":return String(n.integerValue);case"StructuredList":{let e=[];for(let t of n.items){let r=Tt(t);r!==void 0&&e.push(`<code>${r}</code>`)}return e.join(", ")}case"StructuredMap":return;default:return}}function ci(n){let e=[];for(let t of n){let r=li(t);r&&e.push(r)}return e.join(`
130
- `)}function li(n){switch(n.kind){case"Heading":{let e=Math.max(1,Math.min(6,n.level));return`<h${e}>${It(n.inlines)}</h${e}>`}case"Paragraph":return`<p>${It(n.inlines)}</p>`;case"RawBlock":return ui(n);default:return""}}function ui(n){let e=n.mediaType;return e&&pn(e,H.TEXT_MARKDOWN)?At(n.rawContent):e&&pn(e,H.TEXT_HTML)?n.rawContent:e&&pn(e,H.IMAGE_SVG_XML)?`<figure class="svg-figure">
129
+ `}function Tt(n){switch(n.kind){case"StringScalar":return $e(n.stringValue);case"IntegerScalar":return String(n.integerValue);case"StructuredList":{let e=[];for(let t of n.items){let r=Tt(t);r!==void 0&&e.push(`<code>${r}</code>`)}return e.join(", ")}case"StructuredMap":return;default:return}}function li(n){let e=[];for(let t of n){let r=ui(t);r&&e.push(r)}return e.join(`
130
+ `)}function ui(n){switch(n.kind){case"Heading":{let e=Math.max(1,Math.min(6,n.level));return`<h${e}>${It(n.inlines)}</h${e}>`}case"Paragraph":return`<p>${It(n.inlines)}</p>`;case"RawBlock":return di(n);default:return""}}function di(n){let e=n.mediaType;return e&&pn(e,z.TEXT_MARKDOWN)?Ct(n.rawContent):e&&pn(e,z.TEXT_HTML)?n.rawContent:e&&pn(e,z.IMAGE_SVG_XML)?`<figure class="svg-figure">
131
131
  ${n.rawContent}
132
- </figure>`:`<pre${e?` class="media-${di(e.name)}"`:""}><code>${$e(n.rawContent)}</code></pre>`}function It(n){let e=[];for(let t of n)t.kind==="Text"&&e.push($e(t.text));return e.join("")}function $e(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function di(n){return n.replace(/"/g,"&quot;").replace(/&/g,"&amp;")}function fi(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}var je=class{backendUri="kanonak.org/transformations/svg";render(e,t){for(let r of e.children)if(r.kind==="RawBlock"&&r.mediaType&&fi(r.mediaType,H.IMAGE_SVG_XML)){let o=r.rawContent;return t?.trailingNewline&&!o.endsWith(`
132
+ </figure>`:`<pre${e?` class="media-${fi(e.name)}"`:""}><code>${$e(n.rawContent)}</code></pre>`}function It(n){let e=[];for(let t of n)t.kind==="Text"&&e.push($e(t.text));return e.join("")}function $e(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function fi(n){return n.replace(/"/g,"&quot;").replace(/&/g,"&amp;")}function mi(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}var je=class{backendUri="kanonak.org/transformations/svg";render(e,t){for(let r of e.children)if(r.kind==="RawBlock"&&r.mediaType&&mi(r.mediaType,z.IMAGE_SVG_XML)){let o=r.rawContent;return t?.trailingNewline&&!o.endsWith(`
133
133
  `)&&(o+=`
134
- `),o}return'<svg xmlns="http://www.w3.org/2000/svg" width="1" height="1"/>'}};import{SubjectKanonak as mi}from"@kanonak-protocol/sdk";var Ue=class{constructor(e,t,r){this.repository=e;this.parser=t;this.objectParser=r}repository;parser;objectParser;cache=new Map;async resolveSubject(e,t){let r=we(t,e);if(r)return r;let o=e.version,a=o&&typeof o.major=="number"?`@${o.major}.${o.minor}.${o.patch}`:"",i=`${e.publisher}/${e.package_}${a}`,s=this.cache.get(i);if(!s){let l=await this.repository.getDocumentsByNamespaceAsync(e.publisher,e.package_);if(l.length===0)return;let d=o&&typeof o.major=="number"?l.find(p=>{let k=p.metadata?.namespace_?.version;return k&&k.major===o.major&&k.minor===o.minor&&k.patch===o.patch})??l[0]:l[0],f=new E(d,this.repository);s=await this.objectParser.parseKanonaks(f),this.cache.set(i,s)}let c=we(s,e);if(c)return c;for(let l of s)if(l instanceof mi&&l.name===e.name)return l}};import{EmbeddedKanonak as Se,ReferenceKanonak as Ft,SubjectKanonak as pi,ListStatement as Z,ReferenceStatement as hn,EmbeddedStatement as pe,StringStatement as Vt,NumberStatement as gi,BooleanStatement as ki}from"@kanonak-protocol/sdk";var A=class extends Error{constructor(t,r){super(`${t} (at ${r})`);this.path=r}path},jt=16;function ge(n,e){let t=n.name,r={catalog:e,depth:0};if(v(n,u.InstanceTransformation))return hi(n,t,r);if(v(n,u.SetTransformation))return yi(n,t,r);throw new A("Subject is not a recognized v3 transformation type \u2014 expected InstanceTransformation or SetTransformation",t)}function hi(n,e,t){return{kind:"instance",name:n.name,inputPattern:Mt(n,e),rule:Oe(n,u.rule,`${e}.rule`,t),artifactName:Oe(n,u.artifactName,`${e}.artifactName`,t),outputs:Bt(n,`${e}.outputs`),overrides:Ht(n,`${e}.formatOverrides`,t)}}function yi(n,e,t){let r=Q(n,u.partitionBy);return{kind:"set",name:n.name,inputPattern:Mt(n,e),rule:Oe(n,u.rule,`${e}.rule`,t),artifactName:Oe(n,u.artifactName,`${e}.artifactName`,t),outputs:Bt(n,`${e}.outputs`),overrides:Ht(n,`${e}.formatOverrides`,t),partitionBy:r}}function Mt(n,e){let t=ve(n,u.inputPattern);if(!t)throw new A("inputPattern is required",e);return bi(t,`${e}.inputPattern`)}function bi(n,e){let t=Q(n,u.matchesClass);if(!t)throw new A("matchesClass is required",e);let r=[];for(let i of N(n,u.requires))if(i instanceof hn)r.push(kn(i.object.subject));else if(i instanceof Z)for(let s of i.object)s instanceof Ft&&r.push(kn(s.subject));let o=[],a=0;for(let i of N(n,u.sortBy))if(i instanceof Z)for(let s of i.object)s instanceof Se&&o.push(Ut(s,`${e}.sortBy[${a++}]`));else i instanceof pe&&o.push(Ut(i.object,`${e}.sortBy[${a++}]`));return{matchesClass:t,requires:r,sortBy:o}}function Ut(n,e){let t=Q(n,u.byProperty);if(!t)throw new A("SortKey.byProperty is required",e);let r=Q(n,u.order);if(!r)throw new A("SortKey.order is required",e);if(U(r,u.ascending))return{byProperty:t,order:"ascending"};if(U(r,u.descending))return{byProperty:t,order:"descending"};throw new A(`SortKey.order must reference tx.ascending or tx.descending; got ${r.publisher}/${r.package_}/${r.name}`,e)}function Oe(n,e,t,r){let o=ve(n,e);if(!o)throw new A("expression is required",t);return me(o,t,r)}function me(n,e,t){if(v(n,u.StringLiteral))return{kind:"string-literal",value:Y(n,u.stringLiteral,e)};if(v(n,u.IntegerLiteral))return{kind:"integer-literal",value:Lt(n,u.integerLiteral,e)};if(v(n,u.DecimalLiteral))return{kind:"decimal-literal",value:Lt(n,u.decimalLiteral,e)};if(v(n,u.BooleanLiteral))return{kind:"boolean-literal",value:Ai(n,u.booleanLiteral,e)};if(v(n,u.VarRef))return{kind:"var-ref",varName:Y(n,u.varName,e)};if(v(n,u.PropertyRead))return{kind:"property-read",source:P(n,u.readSource,`${e}.readSource`,t),readProp:ne(n,u.readProp,e,"readProp")};if(v(n,u.Traverse))return{kind:"traverse",source:P(n,u.traverseSource,`${e}.traverseSource`,t),through:ne(n,u.through,e,"through"),step:P(n,u.step,`${e}.step`,t)};if(v(n,u.BuildAstNode))return{kind:"build-ast-node",astClass:ne(n,u.astClass,e,"astClass"),set:Si(n,`${e}.set`,t)};if(v(n,u.When))return{kind:"when",condition:P(n,u.condition,`${e}.condition`,t),thenBuild:P(n,u.thenBuild,`${e}.thenBuild`,t),elseBuild:wi(n,u.elseBuild,`${e}.elseBuild`,t)};if(v(n,u.Concat))return{kind:"concat",parts:$i(n,u.parts,`${e}.parts`,t)};if(v(n,u.Fallback))return{kind:"fallback",primary:P(n,u.primary,`${e}.primary`,t),alternate:P(n,u.alternate,`${e}.alternate`,t)};if(v(n,u.UriName))return{kind:"uri-name",source:P(n,u.uriNameOf,`${e}.uriNameOf`,t)};if(v(n,u.UriPublisher))return{kind:"uri-publisher",source:P(n,u.uriPublisherOf,`${e}.uriPublisherOf`,t)};if(v(n,u.UriPackage))return{kind:"uri-package",source:P(n,u.uriPackageOf,`${e}.uriPackageOf`,t)};if(v(n,u.UriVersion))return{kind:"uri-version",source:P(n,u.uriVersionOf,`${e}.uriVersionOf`,t)};if(v(n,u.SubjectUri))return{kind:"subject-uri",source:P(n,u.subjectOf,`${e}.subjectOf`,t)};if(v(n,u.UriLiteral))return{kind:"uri-literal",refTo:ne(n,u.refTo,e,"refTo")};if(v(n,u.DisplayLabel))return{kind:"display-label",labelTarget:ne(n,u.labelTarget,e,"labelTarget"),labelSource:ne(n,u.labelSource,e,"labelSource")};if(v(n,u.ResolveRef))return{kind:"resolve-ref",source:P(n,u.resolveSource,`${e}.resolveSource`,t)};if(v(n,u.Normalize))return{kind:"normalize",source:P(n,u.normSource,`${e}.normSource`,t),normKind:vi(n,e)};if(v(n,u.IsSet))return{kind:"is-set",check:P(n,u.checkExpr,`${e}.checkExpr`,t)};if(v(n,u.CallFragment))return Ki(n,e,t);if(v(n,u.Join))return{kind:"join",source:P(n,u.source,`${e}.source`,t),separator:Y(n,u.separator,e)};if(v(n,u.Count))return{kind:"count",source:P(n,u.source,`${e}.source`,t)};if(v(n,u.Sum))return{kind:"sum",source:P(n,u.source,`${e}.source`,t)};if(v(n,u.Min))return{kind:"min",source:P(n,u.source,`${e}.source`,t)};if(v(n,u.Max))return{kind:"max",source:P(n,u.source,`${e}.source`,t)};if(v(n,u.Average))return{kind:"average",source:P(n,u.source,`${e}.source`,t)};if(v(n,u.ForEach))return{kind:"for-each",source:P(n,u.source,`${e}.source`,t),loopVar:Y(n,u.loopVar,e),emit:P(n,u.emit,`${e}.emit`,t)};if(v(n,u.ListMap))return{kind:"list-map",source:P(n,u.source,`${e}.source`,t),loopVar:Y(n,u.loopVar,e),mapBody:P(n,u.mapBody,`${e}.mapBody`,t)};if(v(n,u.Filter))return{kind:"filter",source:P(n,u.source,`${e}.source`,t),loopVar:Y(n,u.loopVar,e),predicate:P(n,u.predicate,`${e}.predicate`,t)};if(v(n,u.PartitionBy))return{kind:"partition-by",source:P(n,u.source,`${e}.source`,t),loopVar:Y(n,u.loopVar,e),partitionKey:P(n,u.partitionKey,`${e}.partitionKey`,t)};if(v(n,u.DistinctBy))return{kind:"distinct-by",source:P(n,u.source,`${e}.source`,t),loopVar:Y(n,u.loopVar,e),distinctKey:P(n,u.distinctKey,`${e}.distinctKey`,t)};if(v(n,u.AllStatements))return{kind:"all-statements",source:P(n,u.statementsOf,`${e}.statementsOf`,t)};if(v(n,u.StatementPredicate))return{kind:"statement-predicate",source:P(n,u.predicateOf,`${e}.predicateOf`,t)};if(v(n,u.StatementValue))return{kind:"statement-value",source:P(n,u.valueOf,`${e}.valueOf`,t)};if(v(n,u.DateFormat))return{kind:"date-format",source:P(n,u.dateSource,`${e}.dateSource`,t),format:Pi(n,e)};if(v(n,u.Add))return{kind:"add",left:P(n,u.arithLeft,`${e}.arithLeft`,t),right:P(n,u.arithRight,`${e}.arithRight`,t)};if(v(n,u.Subtract))return{kind:"subtract",left:P(n,u.arithLeft,`${e}.arithLeft`,t),right:P(n,u.arithRight,`${e}.arithRight`,t)};if(v(n,u.Multiply))return{kind:"multiply",left:P(n,u.arithLeft,`${e}.arithLeft`,t),right:P(n,u.arithRight,`${e}.arithRight`,t)};if(v(n,u.Divide))return{kind:"divide",left:P(n,u.arithLeft,`${e}.arithLeft`,t),right:P(n,u.arithRight,`${e}.arithRight`,t)};if(v(n,u.Reverse))return{kind:"reverse",source:P(n,u.source,`${e}.source`,t)};throw new A("Expression is not of a recognized v3 type \u2014 embedded has no matching subclass of tx.Expression",e)}function P(n,e,t,r){let o=ve(n,e);if(!o)throw new A("child expression is required",t);return me(o,t,r)}function wi(n,e,t,r){let o=ve(n,e);if(o)return me(o,t,r)}function $i(n,e,t,r){let o=[],a=0;for(let i of N(n,e))if(i instanceof Z)for(let s of i.object)s instanceof Se&&o.push(me(s,`${t}[${a++}]`,r));else i instanceof pe&&o.push(me(i.object,`${t}[${a++}]`,r));return o}function Si(n,e,t){let r=[],o=0;for(let a of N(n,u.set))if(a instanceof Z)for(let i of a.object)i instanceof Se&&r.push(Ot(i,`${e}[${o++}]`,t));else a instanceof pe&&r.push(Ot(a.object,`${e}[${o++}]`,t));return r}function Ot(n,e,t){return{field:ne(n,u.field,e,"field"),value:P(n,u.bindValue,`${e}.bindValue`,t)}}function vi(n,e){let t=Q(n,u.normKind);if(!t)throw new A("normKind is required",e);if(U(t,u.NORM_TRIM_END))return"trim-end";throw new A(`Unknown NormalizeKind: ${t.publisher}/${t.package_}/${t.name}`,e)}var xt=new Set(["iso-date","iso-datetime","short-date","long-date","year","month-year"]);function Pi(n,e){let t=fe(n,u.dateFormat);if(!t)throw new A("dateFormat is required",e);if(!xt.has(t))throw new A(`Unknown dateFormat "${t}"; supported: ${[...xt].join(", ")}`,e);return t}function Ki(n,e,t){if(t.depth>=jt)throw new A(`Fragment recursion exceeded MAX_FRAGMENT_DEPTH (${jt})`,e);let r=Q(n,u.fragmentRef);if(!r)throw new A("fragmentRef is required",e);let o=Di(t.catalog,r);if(!o)throw new A(`ExpressionFragment not found: ${r.publisher}/${r.package_}/${r.name}`,e);let a=ve(o,u.body);if(!a)throw new A(`ExpressionFragment ${r.name} has no body`,e);return{kind:"call-fragment",body:me(a,`${e}.fragment(${r.name})`,{catalog:t.catalog,depth:t.depth+1})}}function Di(n,e){for(let t of n)if(!(!(t instanceof pi)||t.name!==e.name||!(t.namespace||"").startsWith(`${e.publisher}/${e.package_}@`))&&v(t,u.ExpressionFragment))return t}function Bt(n,e){let t=new Set;for(let r of N(n,u.outputs))if(r instanceof hn)t.add(r.object.subject.name);else if(r instanceof Z)for(let o of r.object)o instanceof Ft&&t.add(o.subject.name);if(t.size===0)throw new A("outputs is required (at least one OutputFormat)",e);return t}function Ht(n,e,t){let r=new Map,o=0;for(let a of N(n,u.formatOverrides))if(a instanceof Z){for(let i of a.object)if(i instanceof Se){let[s,c]=Nt(i,`${e}[${o++}]`);r.set(s,c)}}else if(a instanceof pe){let[i,s]=Nt(a.object,`${e}[${o++}]`);r.set(i,s)}return r}function Nt(n,e){let t=Q(n,u.formatTarget);if(!t)throw new A("formatTarget is required",e);let r=[];for(let s of N(n,u.metadataKeys))if(s instanceof Vt)r.push(s.object);else if(s instanceof Z)for(let c of s.object){let l=c.value;typeof l=="string"&&r.push(l)}let o=new Map;for(let s of N(n,u.metadataRenames))if(s instanceof Z){for(let c of s.object)if(c instanceof Se){let l=fe(c,u.fromKey),d=fe(c,u.toKey);l&&d&&o.set(l,d)}}else if(s instanceof pe){let c=s.object,l=fe(c,u.fromKey),d=fe(c,u.toKey);l&&d&&o.set(l,d)}let a=gn(n,u.trailingNewline),i=gn(n,u.omitWrapper);return[t.name,{metadataKeys:r.length>0?r:void 0,metadataRenames:o,trailingNewline:a,omitWrapper:i}]}function Ei(n){return n.predicate?.subject}function N(n,e){let t=[];for(let r of n.statement){let o=Ei(r);o&&U(o,e)&&t.push(r)}return t}function ve(n,e){for(let t of N(n,e))if(t instanceof pe)return t.object}function Q(n,e){for(let t of N(n,e))if(t instanceof hn)return kn(t.object.subject)}function fe(n,e){for(let t of N(n,e))if(t instanceof Vt)return t.object}function Ci(n,e){for(let t of N(n,e))if(t instanceof gi)return t.object}function gn(n,e){for(let t of N(n,e))if(t instanceof ki)return t.object}function Y(n,e,t){let r=fe(n,e);if(r===void 0)throw new A(`${e.name} (string) is required`,t);return r}function Lt(n,e,t){let r=Ci(n,e);if(r===void 0)throw new A(`${e.name} (number) is required`,t);return r}function Ai(n,e,t){let r=gn(n,e);if(r===void 0)throw new A(`${e.name} (boolean) is required`,t);return r}function ne(n,e,t,r){let o=Q(n,e);if(!o)throw new A(`${r} (URI reference) is required`,t);return o}function kn(n){return{publisher:n.publisher,package_:n.package_,name:n.name}}import{DefinedKanonak as Pe,EmbeddedKanonak as Ri,ReferenceKanonak as J,SubjectKanonak as bn,StringStatement as wn,NumberStatement as $n,BooleanStatement as Sn,ReferenceStatement as Le,EmbeddedStatement as vn,ListStatement as Fe}from"@kanonak-protocol/sdk";var G=class extends Error{},Ne=class{constructor(e,t){this.resolver=e;this.catalog=t}resolver;catalog;async evaluate(e,t){switch(e.kind){case"string-literal":return e.value;case"integer-literal":return e.value;case"decimal-literal":return e.value;case"boolean-literal":return e.value;case"uri-literal":return{...e.refTo};case"var-ref":{if(!t.has(e.varName))throw new G(`Unbound variable "${e.varName}"`);return t.get(e.varName)}case"concat":{let r=[];for(let o of e.parts){let a=await this.evaluate(o,t);if(a!=null)if(Array.isArray(a))for(let i of a)r.push(i);else r.push(a)}return r}case"fallback":{let r=await this.evaluate(e.primary,t);return qt(r)?r:this.evaluate(e.alternate,t)}case"when":return await this.evaluate(e.condition,t)===!0?this.evaluate(e.thenBuild,t):e.elseBuild?this.evaluate(e.elseBuild,t):void 0;case"is-set":{let r=await this.evaluate(e.check,t);return qt(r)}case"property-read":{let r=await this.evaluate(e.source,t);return zt(r,e.readProp)}case"traverse":{let r=await this.evaluate(e.source,t);if(!(r instanceof Pe))return;let o=Ii(r,e.through),a=[];for(let i of o){let s=await this.resolver.resolveSubject(i,this.catalog);if(!s)continue;let c=new Map(t);c.set("input",s);let l=await this.evaluate(e.step,c);l!=null&&a.push(xe(l))}return a.join("")}case"uri-name":{let r=await this.evaluate(e.source,t);return Ke(r)?r.name:r instanceof J?r.subject.name:r instanceof bn?r.name:r instanceof Ri?r.name??"":void 0}case"uri-publisher":{let r=await this.evaluate(e.source,t);return yn(r)?.publisher}case"uri-package":{let r=await this.evaluate(e.source,t);return yn(r)?.package_}case"uri-version":{let r=await this.evaluate(e.source,t);return yn(r)?.version}case"subject-uri":{let r=await this.evaluate(e.source,t);if(r instanceof bn){let o=r.namespace??"",a=r.name??"";return!o||!a?void 0:`${o}/${a}`}if(r instanceof J){let o=r.subject,a=o.version;return a&&typeof a.major=="number"?`${o.publisher}/${o.package_}@${a.major}.${a.minor}.${a.patch}/${o.name}`:`${o.publisher}/${o.package_}/${o.name}`}return}case"display-label":{let r=await this.resolver.resolveSubject({...e.labelTarget},this.catalog);return r?zt(r,e.labelSource):void 0}case"resolve-ref":{let r=await this.evaluate(e.source,t);return r instanceof J?await this.resolver.resolveSubject(r.subject,this.catalog):Ke(r)?await this.resolver.resolveSubject(r,this.catalog):void 0}case"normalize":{let r=await this.evaluate(e.source,t),o=r==null?"":xe(r);return e.normKind==="trim-end"?o.replace(/[\s\r\n]+$/u,""):o}case"build-ast-node":{let r={kind:e.astClass.name};for(let o of e.set){let a=await this.evaluate(o.value,t);if(a==null||Array.isArray(a)&&a.length===0)continue;let i=o.field.name;Array.isArray(a)&&ji.has(i)&&a.every(s=>Ui(s))&&(a=a.map(s=>String(s)).join("")),r[i]=a}return r}case"call-fragment":return this.evaluate(e.body,t);case"join":return(await this.evaluateList(e.source,t)).map(o=>o==null?"":xe(o)).join(e.separator);case"count":return(await this.evaluateList(e.source,t)).length;case"sum":{let r=await this.evaluateList(e.source,t),o=0;for(let a of r)o+=x(a,"Sum");return o}case"min":{let r=await this.evaluateList(e.source,t);if(r.length===0)throw new G("Min on an empty list is undefined; guard with IsSet");let o=x(r[0],"Min");for(let a=1;a<r.length;a++){let i=x(r[a],"Min");i<o&&(o=i)}return o}case"max":{let r=await this.evaluateList(e.source,t);if(r.length===0)throw new G("Max on an empty list is undefined; guard with IsSet");let o=x(r[0],"Max");for(let a=1;a<r.length;a++){let i=x(r[a],"Max");i>o&&(o=i)}return o}case"average":{let r=await this.evaluateList(e.source,t);if(r.length===0)throw new G("Average on an empty list is undefined; guard with IsSet");let o=0;for(let a of r)o+=x(a,"Average");return o/r.length}case"for-each":{let r=await this.evaluateList(e.source,t),o=[];for(let a of r){let i=new Map(t);i.set(e.loopVar,a);let s=await this.evaluate(e.emit,i);if(s!=null)if(Array.isArray(s))for(let c of s)o.push(c);else o.push(s)}return o}case"list-map":{let r=await this.evaluateList(e.source,t),o=[];for(let a of r){let i=new Map(t);i.set(e.loopVar,a),o.push(await this.evaluate(e.mapBody,i))}return o}case"filter":{let r=await this.evaluateList(e.source,t),o=[];for(let a of r){let i=new Map(t);i.set(e.loopVar,a),await this.evaluate(e.predicate,i)===!0&&o.push(a)}return o}case"partition-by":{let r=await this.evaluateList(e.source,t),o=new Map,a=[];for(let i of r){let s=new Map(t);s.set(e.loopVar,i);let c=await this.evaluate(e.partitionKey,s),l=Gt(c),d=o.get(l);d||(d={kind:"Partition",key:c,members:[]},o.set(l,d),a.push(l)),d.members.push(i)}return a.map(i=>o.get(i))}case"distinct-by":{let r=await this.evaluateList(e.source,t),o=new Set,a=[];for(let i of r){let s=new Map(t);s.set(e.loopVar,i);let c=await this.evaluate(e.distinctKey,s),l=Gt(c);o.has(l)||(o.add(l),a.push(i))}return a}case"all-statements":{let r=await this.evaluate(e.source,t);return r instanceof Pe?r.statement:[]}case"statement-predicate":{let r=await this.evaluate(e.source,t);if(Wt(r)){let o=r.predicate;if(o instanceof J)return o}return}case"statement-value":{let r=await this.evaluate(e.source,t);return Wt(r)?Ni(r):void 0}case"date-format":{let r=await this.evaluate(e.source,t),o=r==null?"":xe(r);return o?xi(o,e.format):""}case"add":{let r=x(await this.evaluate(e.left,t),"Add"),o=x(await this.evaluate(e.right,t),"Add");return r+o}case"subtract":{let r=x(await this.evaluate(e.left,t),"Subtract"),o=x(await this.evaluate(e.right,t),"Subtract");return r-o}case"multiply":{let r=x(await this.evaluate(e.left,t),"Multiply"),o=x(await this.evaluate(e.right,t),"Multiply");return r*o}case"divide":{let r=x(await this.evaluate(e.left,t),"Divide"),o=x(await this.evaluate(e.right,t),"Divide");if(o===0)throw new G("Divide by zero; guard with When");return r/o}case"reverse":return[...await this.evaluateList(e.source,t)].reverse();default:{let r=e;throw new G("Unknown expression kind")}}}async evaluateList(e,t){let r=await this.evaluate(e,t);return r==null?[]:Array.isArray(r)?r:[r]}};function zt(n,e){if(n instanceof Pe)return _i(n,e);if(Ti(n))return U(e,u.key)?n.key:U(e,u.members)?n.members:void 0}function _i(n,e){for(let t of n.statement){let r=Jt(t);if(!(!r||!U(r,e))&&(t instanceof wn||t instanceof $n||t instanceof Sn||t instanceof Le||t instanceof vn||t instanceof Fe))return t.object}}function Ii(n,e){let t=[];for(let r of n.statement){let o=Jt(r);if(!(!o||!U(o,e))){if(r instanceof Le)t.push(r.object.subject);else if(r instanceof Fe)for(let a of r.object)a instanceof J&&t.push(a.subject)}}return t}function Jt(n){return n.predicate?.subject}function xe(n){if(n==null)return"";if(typeof n=="string")return n;if(typeof n=="number"||typeof n=="boolean")return String(n);if(n instanceof Pe)return n.name??"";if(n instanceof J)return n.subject.name;if(Ke(n))return n.name;let e=n.value;return typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):""}function qt(n){return n==null?!1:typeof n=="string"||Array.isArray(n)?n.length>0:typeof n=="boolean"?n===!0:!0}function Ke(n){return typeof n=="object"&&n!==null&&typeof n.publisher=="string"&&typeof n.package_=="string"&&typeof n.name=="string"}function Ti(n){return typeof n=="object"&&n!==null&&n.kind==="Partition"&&Array.isArray(n.members)}function x(n,e){if(typeof n=="number"&&Number.isFinite(n))return n;throw new G(`${e} requires numeric elements; got ${Oi(n)}`)}function yn(n){if(n instanceof bn){let e=n.namespace??"",t=e.indexOf("/"),r=e.indexOf("@",t+1);return t<0||r<0?void 0:{publisher:e.substring(0,t),package_:e.substring(t+1,r),version:e.substring(r+1),name:n.name??""}}if(n instanceof J){let e=n.subject,t=e.version;return{publisher:e.publisher,package_:e.package_,version:t&&typeof t.major=="number"?`${t.major}.${t.minor}.${t.patch}`:"",name:e.name}}if(Ke(n))return{publisher:n.publisher,package_:n.package_,version:"",name:n.name}}var ji=new Set(["stringValue","text","rawContent","key"]);function Ui(n){return typeof n=="string"||typeof n=="number"||typeof n=="boolean"}function Oi(n){return n===void 0?"undefined":n===null?"null":Array.isArray(n)?`array(${n.length})`:typeof n}function xi(n,e){let t=new Date(n);if(isNaN(t.getTime()))return"";let r=t.getUTCFullYear(),o=["January","February","March","April","May","June","July","August","September","October","November","December"][t.getUTCMonth()],a=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"][t.getUTCMonth()],i=t.getUTCDate(),s=(c,l=2)=>String(c).padStart(l,"0");switch(e){case"iso-date":return`${r}-${s(t.getUTCMonth()+1)}-${s(i)}`;case"iso-datetime":return`${r}-${s(t.getUTCMonth()+1)}-${s(i)}T${s(t.getUTCHours())}:${s(t.getUTCMinutes())}:${s(t.getUTCSeconds())}Z`;case"short-date":return`${a} ${i}`;case"long-date":return`${o} ${i}, ${r}`;case"year":return String(r);case"month-year":return`${o} ${r}`}}function Wt(n){return n instanceof wn||n instanceof $n||n instanceof Sn||n instanceof Le||n instanceof vn||n instanceof Fe}function Ni(n){return n instanceof wn||n instanceof $n||n instanceof Sn?String(n.object??""):n instanceof Le?n.object?.subject?.name??"":n instanceof vn?"[embedded]":n instanceof Fe?(n.object??[]).map(t=>{if(t instanceof J)return t.subject.name;let r=t.name;if(r&&r.length>0)return r;let o=t.value;return typeof o=="string"||typeof o=="number"||typeof o=="boolean"?String(o):"[embedded]"}).join(", "):""}function Gt(n){if(n===void 0)return"\0undef";if(n===null)return"\0null";if(typeof n=="string")return`s:${n}`;if(typeof n=="number")return`n:${n}`;if(typeof n=="boolean")return`b:${n}`;if(n instanceof J){let e=n.subject;return`r:${e.publisher}/${e.package_}/${e.name}`}if(n instanceof Pe){let e=n.name??"";return`k:${n.namespace??""}/${e}`}return Ke(n)?`u:${n.publisher}/${n.package_}/${n.name}`:`o:${JSON.stringify(n)}`}var Ve={"markdown-with-frontmatter":{formatUri:"kanonak.org/transformations/markdown-with-frontmatter",extension:".md"},"plain-markdown":{formatUri:"kanonak.org/transformations/plain-markdown",extension:".md"},toml:{formatUri:"kanonak.org/transformations/toml",extension:".toml"},json:{formatUri:"kanonak.org/transformations/json",extension:".json"},html:{formatUri:"kanonak.org/transformations/html",extension:".html"},svg:{formatUri:"kanonak.org/transformations/svg",extension:".svg"}},ee=class extends Error{},M=class{backends=new Map;constructor(){this.register(new Re),this.register(new _e),this.register(new Ie),this.register(new Te),this.register(new je)}register(e){this.backends.set(e.backendUri,e)}async run(e){let t=e.transformationKanonaks??e.allKanonaks,r=ge(e.transformation,t);if(!r.outputs.has(e.outputFormat))throw new ee(`Transformation "${r.name}" does not declare output format "${e.outputFormat}". Declared: ${Array.from(r.outputs).join(", ")}`);let o=this.findBackend(e.outputFormat);if(!o)throw new ee(`No backend registered for OutputFormat "${e.outputFormat}".`);let a=new Ue(e.repository,e.parser,e.objectParser),i=new Ne(a,e.allKanonaks);return r.kind==="instance"?this.runInstance(r,e,o,i):this.runSet(r,e,o,i)}async runInstance(e,t,r,o){let a=Xt(t.instances,e.inputPattern.requires),i=Yt(a,e.inputPattern.sortBy),s=[];for(let c of i){let l=new Map;l.set("input",c);let d=await o.evaluate(e.rule,l);Pn(d,e.name,`input "${c.name}"`);let f=Kn(await o.evaluate(e.artifactName,l),e.name,`input "${c.name}"`),p=e.overrides.get(t.outputFormat),k=r.render(d,p);s.push({fileName:f,format:t.outputFormat,content:k,source:{kind:"instance",sourceName:c.name}})}return s}async runSet(e,t,r,o){let a=Xt(t.instances,e.inputPattern.requires),i=Yt(a,e.inputPattern.sortBy);return e.partitionBy?this.runSetWithPartition(e,i,t,r,o):this.runSetSingle(e,i,t,r,o)}async runSetSingle(e,t,r,o,a){let i=new Map;i.set("inputs",t);let s=await a.evaluate(e.rule,i);Pn(s,e.name,"set");let c=Kn(await a.evaluate(e.artifactName,i),e.name,"set"),l=e.overrides.get(r.outputFormat),d=o.render(s,l);return[{fileName:c,format:r.outputFormat,content:d,source:{kind:"set",memberCount:t.length}}]}async runSetWithPartition(e,t,r,o,a){let i=e.partitionBy,s=new Map,c=[];for(let d of t){let f=Vi(d,i);if(f==null)continue;let p=Mi(f),k=s.get(p);k||(k={keyValue:f,keyDisplay:Bi(f),members:[]},s.set(p,k),c.push(p)),k.members.push(d)}let l=[];for(let d of c){let f=s.get(d),p=new Map;p.set("inputs",f.members),p.set("key",f.keyValue);let k=await a.evaluate(e.rule,p);Pn(k,e.name,`partition "${f.keyDisplay}"`);let b=Kn(await a.evaluate(e.artifactName,p),e.name,`partition "${f.keyDisplay}"`),g=e.overrides.get(r.outputFormat),y=o.render(k,g);l.push({fileName:b,format:r.outputFormat,content:y,source:{kind:"set",memberCount:f.members.length,partitionKey:f.keyDisplay}})}return l}findBackend(e){let t=Ve[e];if(t)return this.backends.get(t.formatUri)}};function Xt(n,e){return e.length===0?n:n.filter(t=>{for(let r of e)if(!Fi(t,r))return!1;return!0})}function Yt(n,e){if(e.length===0)return n;let t=[...n];return t.sort((r,o)=>{for(let a of e){let i=Zt(r,a.byProperty),s=Zt(o,a.byProperty),c=Li(i,s,a.order);if(c!==0)return c}return 0}),t}function Zt(n,e){for(let t of n.statement){let r=Dn(t);if(!(!r||!U(r,e))){if(t instanceof nr||t instanceof tr||t instanceof rr)return t.object;if(t instanceof ar)throw new ee(`Sort property "${e.name}" on instance "${n.name??"?"}" resolves to a list \u2014 list-typed properties are not sortable. Use a scalar property.`);if(t instanceof or)throw new ee(`Sort property "${e.name}" on instance "${n.name??"?"}" resolves to a reference \u2014 reference-typed properties don't have a natural total order. Use a scalar property.`)}}}function Li(n,e,t){if(n===void 0&&e===void 0)return 0;if(n===void 0)return t==="ascending"?1:-1;if(e===void 0)return t==="ascending"?-1:1;let r;return typeof n=="number"&&typeof e=="number"?r=n-e:r=String(n).localeCompare(String(e)),t==="ascending"?r:-r}function Fi(n,e){for(let t of n.statement){let r=Dn(t);if(!r||!U(r,e))continue;let o=t.object;if(o!=null&&!(typeof o=="string"&&o.length===0)&&!(Array.isArray(o)&&o.length===0))return!0}return!1}function Vi(n,e){for(let t of n.statement){let r=Dn(t);if(!(!r||!U(r,e))&&(t instanceof nr||t instanceof tr||t instanceof rr||t instanceof or||t instanceof ar))return t.object}}function Dn(n){return n.predicate?.subject}function Mi(n){if(n===void 0)return" undef";if(n===null)return" null";if(typeof n=="string")return`s:${n}`;if(typeof n=="number")return`n:${n}`;if(typeof n=="boolean")return`b:${n}`;if(n instanceof er){let e=n.subject;return`r:${e.publisher}/${e.package_}/${e.name}`}if(n instanceof Qt){let e=n.name??"";return`k:${n.namespace??""}/${e}`}if(typeof n=="object"&&n!==null&&typeof n.name=="string"&&typeof n.publisher=="string"){let e=n;return`u:${e.publisher}/${e.package_}/${e.name}`}return`o:${JSON.stringify(n)}`}function Bi(n){return n==null?"":typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"?String(n):n instanceof er?n.subject.name:n instanceof Qt?n.name??"":typeof n=="object"&&n!==null&&typeof n.name=="string"?n.name:""}function Pn(n,e,t){if(typeof n!="object"||n===null||n.kind!=="Document")throw new ee(`Transformation "${e}" rule did not yield a Document for ${t}. Got: ${ir(n)}`)}function Kn(n,e,t){if(typeof n=="string")return n;if(Array.isArray(n)&&n.every(Hi))return n.map(r=>String(r)).join("");throw new ee(`Transformation "${e}" artifactName did not yield a string for ${t}. Got: ${ir(n)}`)}function Hi(n){return typeof n=="string"||typeof n=="number"||typeof n=="boolean"}function ir(n){if(n===void 0)return"undefined";if(n===null)return"null";if(Array.isArray(n))return`array(${n.length})`;if(typeof n=="object"){let e=n.kind;return e?`object(kind=${e})`:"object"}return typeof n}function En(n){return[...C(n,u.InstanceTransformation),...C(n,u.SetTransformation)]}function dr(){let n=new De("transform").description("Run ontology-driven transformations against Kanonak packages. Transformations are declarative YAML rules (instances of `kanonak.org/transformations/Transformation`) that convert ontology instances into output files. The runner produces one or more Artifacts per matched input; format backends serialize them to Markdown, HTML, SVG, TOML, JSON, or (with post-processing) PDF.").addHelpText("after",`
134
+ `),o}return'<svg xmlns="http://www.w3.org/2000/svg" width="1" height="1"/>'}};import{SubjectKanonak as pi}from"@kanonak-protocol/sdk";var Ue=class{constructor(e,t,r){this.repository=e;this.parser=t;this.objectParser=r}repository;parser;objectParser;cache=new Map;async resolveSubject(e,t){let r=be(t,e);if(r)return r;let o=e.version,a=o&&typeof o.major=="number"?`@${o.major}.${o.minor}.${o.patch}`:"",i=`${e.publisher}/${e.package_}${a}`,s=this.cache.get(i);if(!s){let l=await this.repository.getDocumentsByNamespaceAsync(e.publisher,e.package_);if(l.length===0)return;let f=o&&typeof o.major=="number"?l.find(p=>{let k=p.metadata?.namespace_?.version;return k&&k.major===o.major&&k.minor===o.minor&&k.patch===o.patch})??l[0]:l[0],m=new E(f,this.repository);s=await this.objectParser.parseKanonaks(m),this.cache.set(i,s)}let c=be(s,e);if(c)return c;for(let l of s)if(l instanceof pi&&l.name===e.name)return l}};import{EmbeddedKanonak as Se,ReferenceKanonak as Lt,SubjectKanonak as gi,ListStatement as Z,ReferenceStatement as hn,EmbeddedStatement as pe,StringStatement as Ft,NumberStatement as ki,BooleanStatement as hi}from"@kanonak-protocol/sdk";var A=class extends Error{constructor(t,r){super(`${t} (at ${r})`);this.path=r}path},jt=16;function ge(n,e){let t=n.name,r={catalog:e,depth:0};if(v(n,u.InstanceTransformation))return yi(n,t,r);if(v(n,u.SetTransformation))return wi(n,t,r);throw new A("Subject is not a recognized v3 transformation type \u2014 expected InstanceTransformation or SetTransformation",t)}function yi(n,e,t){return{kind:"instance",name:n.name,inputPattern:Mt(n,e),rule:Oe(n,u.rule,`${e}.rule`,t),artifactName:Oe(n,u.artifactName,`${e}.artifactName`,t),outputs:Bt(n,`${e}.outputs`),overrides:Ht(n,`${e}.formatOverrides`,t)}}function wi(n,e,t){let r=Q(n,u.partitionBy);return{kind:"set",name:n.name,inputPattern:Mt(n,e),rule:Oe(n,u.rule,`${e}.rule`,t),artifactName:Oe(n,u.artifactName,`${e}.artifactName`,t),outputs:Bt(n,`${e}.outputs`),overrides:Ht(n,`${e}.formatOverrides`,t),partitionBy:r}}function Mt(n,e){let t=ve(n,u.inputPattern);if(!t)throw new A("inputPattern is required",e);return bi(t,`${e}.inputPattern`)}function bi(n,e){let t=Q(n,u.matchesClass);if(!t)throw new A("matchesClass is required",e);let r=[];for(let i of V(n,u.requires))if(i instanceof hn)r.push(kn(i.object.subject));else if(i instanceof Z)for(let s of i.object)s instanceof Lt&&r.push(kn(s.subject));let o=[],a=0;for(let i of V(n,u.sortBy))if(i instanceof Z)for(let s of i.object)s instanceof Se&&o.push(Ut(s,`${e}.sortBy[${a++}]`));else i instanceof pe&&o.push(Ut(i.object,`${e}.sortBy[${a++}]`));return{matchesClass:t,requires:r,sortBy:o}}function Ut(n,e){let t=Q(n,u.byProperty);if(!t)throw new A("SortKey.byProperty is required",e);let r=Q(n,u.order);if(!r)throw new A("SortKey.order is required",e);if(U(r,u.ascending))return{byProperty:t,order:"ascending"};if(U(r,u.descending))return{byProperty:t,order:"descending"};throw new A(`SortKey.order must reference tx.ascending or tx.descending; got ${r.publisher}/${r.package_}/${r.name}`,e)}function Oe(n,e,t,r){let o=ve(n,e);if(!o)throw new A("expression is required",t);return me(o,t,r)}function me(n,e,t){if(v(n,u.StringLiteral))return{kind:"string-literal",value:x(n,u.stringLiteral,e)};if(v(n,u.IntegerLiteral))return{kind:"integer-literal",value:Vt(n,u.integerLiteral,e)};if(v(n,u.DecimalLiteral))return{kind:"decimal-literal",value:Vt(n,u.decimalLiteral,e)};if(v(n,u.BooleanLiteral))return{kind:"boolean-literal",value:Ci(n,u.booleanLiteral,e)};if(v(n,u.VarRef))return{kind:"var-ref",varName:x(n,u.varName,e)};if(v(n,u.PropertyRead))return{kind:"property-read",source:S(n,u.readSource,`${e}.readSource`,t),readProp:ne(n,u.readProp,e,"readProp")};if(v(n,u.Traverse))return{kind:"traverse",source:S(n,u.traverseSource,`${e}.traverseSource`,t),through:ne(n,u.through,e,"through"),step:S(n,u.step,`${e}.step`,t)};if(v(n,u.BuildAstNode))return{kind:"build-ast-node",astClass:ne(n,u.astClass,e,"astClass"),set:vi(n,`${e}.set`,t)};if(v(n,u.When))return{kind:"when",condition:S(n,u.condition,`${e}.condition`,t),thenBuild:S(n,u.thenBuild,`${e}.thenBuild`,t),elseBuild:$i(n,u.elseBuild,`${e}.elseBuild`,t)};if(v(n,u.Concat))return{kind:"concat",parts:Si(n,u.parts,`${e}.parts`,t)};if(v(n,u.Fallback))return{kind:"fallback",primary:S(n,u.primary,`${e}.primary`,t),alternate:S(n,u.alternate,`${e}.alternate`,t)};if(v(n,u.UriName))return{kind:"uri-name",source:S(n,u.uriNameOf,`${e}.uriNameOf`,t)};if(v(n,u.UriPublisher))return{kind:"uri-publisher",source:S(n,u.uriPublisherOf,`${e}.uriPublisherOf`,t)};if(v(n,u.UriPackage))return{kind:"uri-package",source:S(n,u.uriPackageOf,`${e}.uriPackageOf`,t)};if(v(n,u.UriVersion))return{kind:"uri-version",source:S(n,u.uriVersionOf,`${e}.uriVersionOf`,t)};if(v(n,u.SubjectUri))return{kind:"subject-uri",source:S(n,u.subjectOf,`${e}.subjectOf`,t)};if(v(n,u.UriLiteral))return{kind:"uri-literal",refTo:ne(n,u.refTo,e,"refTo")};if(v(n,u.DisplayLabel))return{kind:"display-label",labelTarget:ne(n,u.labelTarget,e,"labelTarget"),labelSource:ne(n,u.labelSource,e,"labelSource")};if(v(n,u.ResolveRef))return{kind:"resolve-ref",source:S(n,u.resolveSource,`${e}.resolveSource`,t)};if(v(n,u.Normalize))return{kind:"normalize",source:S(n,u.normSource,`${e}.normSource`,t),normKind:Pi(n,e)};if(v(n,u.IsSet))return{kind:"is-set",check:S(n,u.checkExpr,`${e}.checkExpr`,t)};if(v(n,u.CallFragment))return Di(n,e,t);if(v(n,u.Join))return{kind:"join",source:S(n,u.source,`${e}.source`,t),separator:x(n,u.separator,e)};if(v(n,u.Count))return{kind:"count",source:S(n,u.source,`${e}.source`,t)};if(v(n,u.Sum))return{kind:"sum",source:S(n,u.source,`${e}.source`,t)};if(v(n,u.Min))return{kind:"min",source:S(n,u.source,`${e}.source`,t)};if(v(n,u.Max))return{kind:"max",source:S(n,u.source,`${e}.source`,t)};if(v(n,u.Average))return{kind:"average",source:S(n,u.source,`${e}.source`,t)};if(v(n,u.ForEach))return{kind:"for-each",source:S(n,u.source,`${e}.source`,t),loopVar:x(n,u.loopVar,e),emit:S(n,u.emit,`${e}.emit`,t)};if(v(n,u.ListMap))return{kind:"list-map",source:S(n,u.source,`${e}.source`,t),loopVar:x(n,u.loopVar,e),mapBody:S(n,u.mapBody,`${e}.mapBody`,t)};if(v(n,u.Filter))return{kind:"filter",source:S(n,u.source,`${e}.source`,t),loopVar:x(n,u.loopVar,e),predicate:S(n,u.predicate,`${e}.predicate`,t)};if(v(n,u.PartitionBy))return{kind:"partition-by",source:S(n,u.source,`${e}.source`,t),loopVar:x(n,u.loopVar,e),partitionKey:S(n,u.partitionKey,`${e}.partitionKey`,t)};if(v(n,u.DistinctBy))return{kind:"distinct-by",source:S(n,u.source,`${e}.source`,t),loopVar:x(n,u.loopVar,e),distinctKey:S(n,u.distinctKey,`${e}.distinctKey`,t)};if(v(n,u.AllStatements))return{kind:"all-statements",source:S(n,u.statementsOf,`${e}.statementsOf`,t)};if(v(n,u.StatementPredicate))return{kind:"statement-predicate",source:S(n,u.predicateOf,`${e}.predicateOf`,t)};if(v(n,u.StatementValue))return{kind:"statement-value",source:S(n,u.valueOf,`${e}.valueOf`,t)};if(v(n,u.DateFormat))return{kind:"date-format",source:S(n,u.dateSource,`${e}.dateSource`,t),format:Ki(n,e)};if(v(n,u.Add))return{kind:"add",left:S(n,u.arithLeft,`${e}.arithLeft`,t),right:S(n,u.arithRight,`${e}.arithRight`,t)};if(v(n,u.Subtract))return{kind:"subtract",left:S(n,u.arithLeft,`${e}.arithLeft`,t),right:S(n,u.arithRight,`${e}.arithRight`,t)};if(v(n,u.Multiply))return{kind:"multiply",left:S(n,u.arithLeft,`${e}.arithLeft`,t),right:S(n,u.arithRight,`${e}.arithRight`,t)};if(v(n,u.Divide))return{kind:"divide",left:S(n,u.arithLeft,`${e}.arithLeft`,t),right:S(n,u.arithRight,`${e}.arithRight`,t)};if(v(n,u.Reverse))return{kind:"reverse",source:S(n,u.source,`${e}.source`,t)};if(v(n,u.WindowedMap)){let r=zt(n,u.windowSize);if(r===void 0||!Number.isInteger(r)||r<1)throw new A("windowSize must be a positive integer",`${e}.windowSize`);return{kind:"windowed-map",source:S(n,u.source,`${e}.source`,t),windowSize:r,windowVar:x(n,u.windowVar,e),windowBody:S(n,u.windowBody,`${e}.windowBody`,t)}}if(v(n,u.PairwiseMap))return{kind:"pairwise-map",source:S(n,u.source,`${e}.source`,t),firstVar:x(n,u.firstVar,e),secondVar:x(n,u.secondVar,e),pairBody:S(n,u.pairBody,`${e}.pairBody`,t)};if(v(n,u.Scan))return{kind:"scan",source:S(n,u.source,`${e}.source`,t),initialState:S(n,u.initialState,`${e}.initialState`,t),stateVar:x(n,u.stateVar,e),elementVar:x(n,u.elementVar,e),accumulate:S(n,u.accumulate,`${e}.accumulate`,t)};if(v(n,u.ListItemAt))return{kind:"list-item-at",source:S(n,u.source,`${e}.source`,t),itemIndex:S(n,u.itemIndex,`${e}.itemIndex`,t)};throw new A("Expression is not of a recognized v3 type \u2014 embedded has no matching subclass of tx.Expression",e)}function S(n,e,t,r){let o=ve(n,e);if(!o)throw new A("child expression is required",t);return me(o,t,r)}function $i(n,e,t,r){let o=ve(n,e);if(o)return me(o,t,r)}function Si(n,e,t,r){let o=[],a=0;for(let i of V(n,e))if(i instanceof Z)for(let s of i.object)s instanceof Se&&o.push(me(s,`${t}[${a++}]`,r));else i instanceof pe&&o.push(me(i.object,`${t}[${a++}]`,r));return o}function vi(n,e,t){let r=[],o=0;for(let a of V(n,u.set))if(a instanceof Z)for(let i of a.object)i instanceof Se&&r.push(Ot(i,`${e}[${o++}]`,t));else a instanceof pe&&r.push(Ot(a.object,`${e}[${o++}]`,t));return r}function Ot(n,e,t){return{field:ne(n,u.field,e,"field"),value:S(n,u.bindValue,`${e}.bindValue`,t)}}function Pi(n,e){let t=Q(n,u.normKind);if(!t)throw new A("normKind is required",e);if(U(t,u.NORM_TRIM_END))return"trim-end";throw new A(`Unknown NormalizeKind: ${t.publisher}/${t.package_}/${t.name}`,e)}var Nt=new Set(["iso-date","iso-datetime","short-date","long-date","year","month-year"]);function Ki(n,e){let t=fe(n,u.dateFormat);if(!t)throw new A("dateFormat is required",e);if(!Nt.has(t))throw new A(`Unknown dateFormat "${t}"; supported: ${[...Nt].join(", ")}`,e);return t}function Di(n,e,t){if(t.depth>=jt)throw new A(`Fragment recursion exceeded MAX_FRAGMENT_DEPTH (${jt})`,e);let r=Q(n,u.fragmentRef);if(!r)throw new A("fragmentRef is required",e);let o=Ei(t.catalog,r);if(!o)throw new A(`ExpressionFragment not found: ${r.publisher}/${r.package_}/${r.name}`,e);let a=ve(o,u.body);if(!a)throw new A(`ExpressionFragment ${r.name} has no body`,e);return{kind:"call-fragment",body:me(a,`${e}.fragment(${r.name})`,{catalog:t.catalog,depth:t.depth+1})}}function Ei(n,e){for(let t of n)if(!(!(t instanceof gi)||t.name!==e.name||!(t.namespace||"").startsWith(`${e.publisher}/${e.package_}@`))&&v(t,u.ExpressionFragment))return t}function Bt(n,e){let t=new Set;for(let r of V(n,u.outputs))if(r instanceof hn)t.add(r.object.subject.name);else if(r instanceof Z)for(let o of r.object)o instanceof Lt&&t.add(o.subject.name);if(t.size===0)throw new A("outputs is required (at least one OutputFormat)",e);return t}function Ht(n,e,t){let r=new Map,o=0;for(let a of V(n,u.formatOverrides))if(a instanceof Z){for(let i of a.object)if(i instanceof Se){let[s,c]=xt(i,`${e}[${o++}]`);r.set(s,c)}}else if(a instanceof pe){let[i,s]=xt(a.object,`${e}[${o++}]`);r.set(i,s)}return r}function xt(n,e){let t=Q(n,u.formatTarget);if(!t)throw new A("formatTarget is required",e);let r=[];for(let s of V(n,u.metadataKeys))if(s instanceof Ft)r.push(s.object);else if(s instanceof Z)for(let c of s.object){let l=c.value;typeof l=="string"&&r.push(l)}let o=new Map;for(let s of V(n,u.metadataRenames))if(s instanceof Z){for(let c of s.object)if(c instanceof Se){let l=fe(c,u.fromKey),f=fe(c,u.toKey);l&&f&&o.set(l,f)}}else if(s instanceof pe){let c=s.object,l=fe(c,u.fromKey),f=fe(c,u.toKey);l&&f&&o.set(l,f)}let a=gn(n,u.trailingNewline),i=gn(n,u.omitWrapper);return[t.name,{metadataKeys:r.length>0?r:void 0,metadataRenames:o,trailingNewline:a,omitWrapper:i}]}function Ai(n){return n.predicate?.subject}function V(n,e){let t=[];for(let r of n.statement){let o=Ai(r);o&&U(o,e)&&t.push(r)}return t}function ve(n,e){for(let t of V(n,e))if(t instanceof pe)return t.object}function Q(n,e){for(let t of V(n,e))if(t instanceof hn)return kn(t.object.subject)}function fe(n,e){for(let t of V(n,e))if(t instanceof Ft)return t.object}function zt(n,e){for(let t of V(n,e))if(t instanceof ki)return t.object}function gn(n,e){for(let t of V(n,e))if(t instanceof hi)return t.object}function x(n,e,t){let r=fe(n,e);if(r===void 0)throw new A(`${e.name} (string) is required`,t);return r}function Vt(n,e,t){let r=zt(n,e);if(r===void 0)throw new A(`${e.name} (number) is required`,t);return r}function Ci(n,e,t){let r=gn(n,e);if(r===void 0)throw new A(`${e.name} (boolean) is required`,t);return r}function ne(n,e,t,r){let o=Q(n,e);if(!o)throw new A(`${r} (URI reference) is required`,t);return o}function kn(n){return{publisher:n.publisher,package_:n.package_,name:n.name}}import{DefinedKanonak as Pe,EmbeddedKanonak as Ri,ReferenceKanonak as X,SubjectKanonak as wn,StringStatement as bn,NumberStatement as $n,BooleanStatement as Sn,ReferenceStatement as Ve,EmbeddedStatement as vn,ListStatement as Le}from"@kanonak-protocol/sdk";var J=class extends Error{},xe=class{constructor(e,t){this.resolver=e;this.catalog=t}resolver;catalog;async evaluate(e,t){switch(e.kind){case"string-literal":return e.value;case"integer-literal":return e.value;case"decimal-literal":return e.value;case"boolean-literal":return e.value;case"uri-literal":return{...e.refTo};case"var-ref":{if(!t.has(e.varName))throw new J(`Unbound variable "${e.varName}"`);return t.get(e.varName)}case"concat":{let r=[];for(let o of e.parts){let a=await this.evaluate(o,t);if(a!=null)if(Array.isArray(a))for(let i of a)r.push(i);else r.push(a)}return r}case"fallback":{let r=await this.evaluate(e.primary,t);return Wt(r)?r:this.evaluate(e.alternate,t)}case"when":return await this.evaluate(e.condition,t)===!0?this.evaluate(e.thenBuild,t):e.elseBuild?this.evaluate(e.elseBuild,t):void 0;case"is-set":{let r=await this.evaluate(e.check,t);return Wt(r)}case"property-read":{let r=await this.evaluate(e.source,t);return qt(r,e.readProp)}case"traverse":{let r=await this.evaluate(e.source,t);if(!(r instanceof Pe))return;let o=Ii(r,e.through),a=[];for(let i of o){let s=await this.resolver.resolveSubject(i,this.catalog);if(!s)continue;let c=new Map(t);c.set("input",s);let l=await this.evaluate(e.step,c);l!=null&&a.push(Ne(l))}return a.join("")}case"uri-name":{let r=await this.evaluate(e.source,t);return Ke(r)?r.name:r instanceof X?r.subject.name:r instanceof wn?r.name:r instanceof Ri?r.name??"":void 0}case"uri-publisher":{let r=await this.evaluate(e.source,t);return yn(r)?.publisher}case"uri-package":{let r=await this.evaluate(e.source,t);return yn(r)?.package_}case"uri-version":{let r=await this.evaluate(e.source,t);return yn(r)?.version}case"subject-uri":{let r=await this.evaluate(e.source,t);if(r instanceof wn){let o=r.namespace??"",a=r.name??"";return!o||!a?void 0:`${o}/${a}`}if(r instanceof X){let o=r.subject,a=o.version;return a&&typeof a.major=="number"?`${o.publisher}/${o.package_}@${a.major}.${a.minor}.${a.patch}/${o.name}`:`${o.publisher}/${o.package_}/${o.name}`}return}case"display-label":{let r=await this.resolver.resolveSubject({...e.labelTarget},this.catalog);return r?qt(r,e.labelSource):void 0}case"resolve-ref":{let r=await this.evaluate(e.source,t);return r instanceof X?await this.resolver.resolveSubject(r.subject,this.catalog):Ke(r)?await this.resolver.resolveSubject(r,this.catalog):void 0}case"normalize":{let r=await this.evaluate(e.source,t),o=r==null?"":Ne(r);return e.normKind==="trim-end"?o.replace(/[\s\r\n]+$/u,""):o}case"build-ast-node":{let r={kind:e.astClass.name};for(let o of e.set){let a=await this.evaluate(o.value,t);if(a==null||Array.isArray(a)&&a.length===0)continue;let i=o.field.name;Array.isArray(a)&&ji.has(i)&&a.every(s=>Ui(s))&&(a=a.map(s=>String(s)).join("")),r[i]=a}return r}case"call-fragment":return this.evaluate(e.body,t);case"join":return(await this.evaluateList(e.source,t)).map(o=>o==null?"":Ne(o)).join(e.separator);case"count":return(await this.evaluateList(e.source,t)).length;case"sum":{let r=await this.evaluateList(e.source,t),o=0;for(let a of r)o+=N(a,"Sum");return o}case"min":{let r=await this.evaluateList(e.source,t);if(r.length===0)throw new J("Min on an empty list is undefined; guard with IsSet");let o=N(r[0],"Min");for(let a=1;a<r.length;a++){let i=N(r[a],"Min");i<o&&(o=i)}return o}case"max":{let r=await this.evaluateList(e.source,t);if(r.length===0)throw new J("Max on an empty list is undefined; guard with IsSet");let o=N(r[0],"Max");for(let a=1;a<r.length;a++){let i=N(r[a],"Max");i>o&&(o=i)}return o}case"average":{let r=await this.evaluateList(e.source,t);if(r.length===0)throw new J("Average on an empty list is undefined; guard with IsSet");let o=0;for(let a of r)o+=N(a,"Average");return o/r.length}case"for-each":{let r=await this.evaluateList(e.source,t),o=[];for(let a of r){let i=new Map(t);i.set(e.loopVar,a);let s=await this.evaluate(e.emit,i);if(s!=null)if(Array.isArray(s))for(let c of s)o.push(c);else o.push(s)}return o}case"list-map":{let r=await this.evaluateList(e.source,t),o=[];for(let a of r){let i=new Map(t);i.set(e.loopVar,a),o.push(await this.evaluate(e.mapBody,i))}return o}case"filter":{let r=await this.evaluateList(e.source,t),o=[];for(let a of r){let i=new Map(t);i.set(e.loopVar,a),await this.evaluate(e.predicate,i)===!0&&o.push(a)}return o}case"partition-by":{let r=await this.evaluateList(e.source,t),o=new Map,a=[];for(let i of r){let s=new Map(t);s.set(e.loopVar,i);let c=await this.evaluate(e.partitionKey,s),l=Jt(c),f=o.get(l);f||(f={kind:"Partition",key:c,members:[]},o.set(l,f),a.push(l)),f.members.push(i)}return a.map(i=>o.get(i))}case"distinct-by":{let r=await this.evaluateList(e.source,t),o=new Set,a=[];for(let i of r){let s=new Map(t);s.set(e.loopVar,i);let c=await this.evaluate(e.distinctKey,s),l=Jt(c);o.has(l)||(o.add(l),a.push(i))}return a}case"all-statements":{let r=await this.evaluate(e.source,t);return r instanceof Pe?r.statement:[]}case"statement-predicate":{let r=await this.evaluate(e.source,t);if(Gt(r)){let o=r.predicate;if(o instanceof X)return o}return}case"statement-value":{let r=await this.evaluate(e.source,t);return Gt(r)?xi(r):void 0}case"date-format":{let r=await this.evaluate(e.source,t),o=r==null?"":Ne(r);return o?Ni(o,e.format):""}case"add":{let r=N(await this.evaluate(e.left,t),"Add"),o=N(await this.evaluate(e.right,t),"Add");return r+o}case"subtract":{let r=N(await this.evaluate(e.left,t),"Subtract"),o=N(await this.evaluate(e.right,t),"Subtract");return r-o}case"multiply":{let r=N(await this.evaluate(e.left,t),"Multiply"),o=N(await this.evaluate(e.right,t),"Multiply");return r*o}case"divide":{let r=N(await this.evaluate(e.left,t),"Divide"),o=N(await this.evaluate(e.right,t),"Divide");if(o===0)throw new J("Divide by zero; guard with When");return r/o}case"reverse":return[...await this.evaluateList(e.source,t)].reverse();case"windowed-map":{let r=await this.evaluateList(e.source,t);if(r.length<e.windowSize)return[];let o=[];for(let a=0;a+e.windowSize<=r.length;a++){let i=r.slice(a,a+e.windowSize),s=new Map(t);s.set(e.windowVar,i);let c=await this.evaluate(e.windowBody,s);if(c!=null)if(Array.isArray(c))for(let l of c)o.push(l);else o.push(c)}return o}case"pairwise-map":{let r=await this.evaluateList(e.source,t);if(r.length<2)return[];let o=[];for(let a=0;a+1<r.length;a++){let i=new Map(t);i.set(e.firstVar,r[a]),i.set(e.secondVar,r[a+1]);let s=await this.evaluate(e.pairBody,i);if(s!=null)if(Array.isArray(s))for(let c of s)o.push(c);else o.push(s)}return o}case"scan":{let r=await this.evaluateList(e.source,t);if(r.length===0)return[];let o=await this.evaluate(e.initialState,t),a=[];for(let i of r){let s=new Map(t);s.set(e.stateVar,o),s.set(e.elementVar,i);let c=await this.evaluate(e.accumulate,s);a.push(c),o=c}return a}case"list-item-at":{let r=await this.evaluateList(e.source,t),o=await this.evaluate(e.itemIndex,t);return typeof o!="number"||!Number.isInteger(o)||o<0||o>=r.length?void 0:r[o]}default:{let r=e;throw new J("Unknown expression kind")}}}async evaluateList(e,t){let r=await this.evaluate(e,t);return r==null?[]:Array.isArray(r)?r:[r]}};function qt(n,e){if(n instanceof Pe)return _i(n,e);if(Ti(n))return U(e,u.key)?n.key:U(e,u.members)?n.members:void 0}function _i(n,e){for(let t of n.statement){let r=Xt(t);if(!(!r||!U(r,e))&&(t instanceof bn||t instanceof $n||t instanceof Sn||t instanceof Ve||t instanceof vn||t instanceof Le))return t.object}}function Ii(n,e){let t=[];for(let r of n.statement){let o=Xt(r);if(!(!o||!U(o,e))){if(r instanceof Ve)t.push(r.object.subject);else if(r instanceof Le)for(let a of r.object)a instanceof X&&t.push(a.subject)}}return t}function Xt(n){return n.predicate?.subject}function Ne(n){if(n==null)return"";if(typeof n=="string")return n;if(typeof n=="number"||typeof n=="boolean")return String(n);if(n instanceof Pe)return n.name??"";if(n instanceof X)return n.subject.name;if(Ke(n))return n.name;let e=n.value;return typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):""}function Wt(n){return n==null?!1:typeof n=="string"||Array.isArray(n)?n.length>0:typeof n=="boolean"?n===!0:!0}function Ke(n){return typeof n=="object"&&n!==null&&typeof n.publisher=="string"&&typeof n.package_=="string"&&typeof n.name=="string"}function Ti(n){return typeof n=="object"&&n!==null&&n.kind==="Partition"&&Array.isArray(n.members)}function N(n,e){if(typeof n=="number"&&Number.isFinite(n))return n;throw new J(`${e} requires numeric elements; got ${Oi(n)}`)}function yn(n){if(n instanceof wn){let e=n.namespace??"",t=e.indexOf("/"),r=e.indexOf("@",t+1);return t<0||r<0?void 0:{publisher:e.substring(0,t),package_:e.substring(t+1,r),version:e.substring(r+1),name:n.name??""}}if(n instanceof X){let e=n.subject,t=e.version;return{publisher:e.publisher,package_:e.package_,version:t&&typeof t.major=="number"?`${t.major}.${t.minor}.${t.patch}`:"",name:e.name}}if(Ke(n))return{publisher:n.publisher,package_:n.package_,version:"",name:n.name}}var ji=new Set(["stringValue","text","rawContent","key"]);function Ui(n){return typeof n=="string"||typeof n=="number"||typeof n=="boolean"}function Oi(n){return n===void 0?"undefined":n===null?"null":Array.isArray(n)?`array(${n.length})`:typeof n}function Ni(n,e){let t=new Date(n);if(isNaN(t.getTime()))return"";let r=t.getUTCFullYear(),o=["January","February","March","April","May","June","July","August","September","October","November","December"][t.getUTCMonth()],a=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"][t.getUTCMonth()],i=t.getUTCDate(),s=(c,l=2)=>String(c).padStart(l,"0");switch(e){case"iso-date":return`${r}-${s(t.getUTCMonth()+1)}-${s(i)}`;case"iso-datetime":return`${r}-${s(t.getUTCMonth()+1)}-${s(i)}T${s(t.getUTCHours())}:${s(t.getUTCMinutes())}:${s(t.getUTCSeconds())}Z`;case"short-date":return`${a} ${i}`;case"long-date":return`${o} ${i}, ${r}`;case"year":return String(r);case"month-year":return`${o} ${r}`}}function Gt(n){return n instanceof bn||n instanceof $n||n instanceof Sn||n instanceof Ve||n instanceof vn||n instanceof Le}function xi(n){return n instanceof bn||n instanceof $n||n instanceof Sn?String(n.object??""):n instanceof Ve?n.object?.subject?.name??"":n instanceof vn?"[embedded]":n instanceof Le?(n.object??[]).map(t=>{if(t instanceof X)return t.subject.name;let r=t.name;if(r&&r.length>0)return r;let o=t.value;return typeof o=="string"||typeof o=="number"||typeof o=="boolean"?String(o):"[embedded]"}).join(", "):""}function Jt(n){if(n===void 0)return"\0undef";if(n===null)return"\0null";if(typeof n=="string")return`s:${n}`;if(typeof n=="number")return`n:${n}`;if(typeof n=="boolean")return`b:${n}`;if(n instanceof X){let e=n.subject;return`r:${e.publisher}/${e.package_}/${e.name}`}if(n instanceof Pe){let e=n.name??"";return`k:${n.namespace??""}/${e}`}return Ke(n)?`u:${n.publisher}/${n.package_}/${n.name}`:`o:${JSON.stringify(n)}`}var Fe={"markdown-with-frontmatter":{formatUri:"kanonak.org/transformations/markdown-with-frontmatter",extension:".md"},"plain-markdown":{formatUri:"kanonak.org/transformations/plain-markdown",extension:".md"},toml:{formatUri:"kanonak.org/transformations/toml",extension:".toml"},json:{formatUri:"kanonak.org/transformations/json",extension:".json"},html:{formatUri:"kanonak.org/transformations/html",extension:".html"},svg:{formatUri:"kanonak.org/transformations/svg",extension:".svg"}},ee=class extends Error{},B=class{backends=new Map;constructor(){this.register(new Re),this.register(new _e),this.register(new Ie),this.register(new Te),this.register(new je)}register(e){this.backends.set(e.backendUri,e)}async run(e){let t=e.transformationKanonaks??e.allKanonaks,r=ge(e.transformation,t);if(!r.outputs.has(e.outputFormat))throw new ee(`Transformation "${r.name}" does not declare output format "${e.outputFormat}". Declared: ${Array.from(r.outputs).join(", ")}`);let o=this.findBackend(e.outputFormat);if(!o)throw new ee(`No backend registered for OutputFormat "${e.outputFormat}".`);let a=new Ue(e.repository,e.parser,e.objectParser),i=new xe(a,e.allKanonaks);return r.kind==="instance"?this.runInstance(r,e,o,i):this.runSet(r,e,o,i)}async runInstance(e,t,r,o){let a=Yt(t.instances,e.inputPattern.requires),i=Zt(a,e.inputPattern.sortBy),s=[];for(let c of i){let l=new Map;l.set("input",c);let f=await o.evaluate(e.rule,l);Pn(f,e.name,`input "${c.name}"`);let m=Kn(await o.evaluate(e.artifactName,l),e.name,`input "${c.name}"`),p=e.overrides.get(t.outputFormat),k=r.render(f,p);s.push({fileName:m,format:t.outputFormat,content:k,source:{kind:"instance",sourceName:c.name}})}return s}async runSet(e,t,r,o){let a=Yt(t.instances,e.inputPattern.requires),i=Zt(a,e.inputPattern.sortBy);return e.partitionBy?this.runSetWithPartition(e,i,t,r,o):this.runSetSingle(e,i,t,r,o)}async runSetSingle(e,t,r,o,a){let i=new Map;i.set("inputs",t);let s=await a.evaluate(e.rule,i);Pn(s,e.name,"set");let c=Kn(await a.evaluate(e.artifactName,i),e.name,"set"),l=e.overrides.get(r.outputFormat),f=o.render(s,l);return[{fileName:c,format:r.outputFormat,content:f,source:{kind:"set",memberCount:t.length}}]}async runSetWithPartition(e,t,r,o,a){let i=e.partitionBy,s=new Map,c=[];for(let f of t){let m=Fi(f,i);if(m==null)continue;let p=Mi(m),k=s.get(p);k||(k={keyValue:m,keyDisplay:Bi(m),members:[]},s.set(p,k),c.push(p)),k.members.push(f)}let l=[];for(let f of c){let m=s.get(f),p=new Map;p.set("inputs",m.members),p.set("key",m.keyValue);let k=await a.evaluate(e.rule,p);Pn(k,e.name,`partition "${m.keyDisplay}"`);let w=Kn(await a.evaluate(e.artifactName,p),e.name,`partition "${m.keyDisplay}"`),g=e.overrides.get(r.outputFormat),y=o.render(k,g);l.push({fileName:w,format:r.outputFormat,content:y,source:{kind:"set",memberCount:m.members.length,partitionKey:m.keyDisplay}})}return l}findBackend(e){let t=Fe[e];if(t)return this.backends.get(t.formatUri)}};function Yt(n,e){return e.length===0?n:n.filter(t=>{for(let r of e)if(!Li(t,r))return!1;return!0})}function Zt(n,e){if(e.length===0)return n;let t=[...n];return t.sort((r,o)=>{for(let a of e){let i=Qt(r,a.byProperty),s=Qt(o,a.byProperty),c=Vi(i,s,a.order);if(c!==0)return c}return 0}),t}function Qt(n,e){for(let t of n.statement){let r=Dn(t);if(!(!r||!U(r,e))){if(t instanceof tr||t instanceof rr||t instanceof or)return t.object;if(t instanceof ir)throw new ee(`Sort property "${e.name}" on instance "${n.name??"?"}" resolves to a list \u2014 list-typed properties are not sortable. Use a scalar property.`);if(t instanceof ar)throw new ee(`Sort property "${e.name}" on instance "${n.name??"?"}" resolves to a reference \u2014 reference-typed properties don't have a natural total order. Use a scalar property.`)}}}function Vi(n,e,t){if(n===void 0&&e===void 0)return 0;if(n===void 0)return t==="ascending"?1:-1;if(e===void 0)return t==="ascending"?-1:1;let r;return typeof n=="number"&&typeof e=="number"?r=n-e:r=String(n).localeCompare(String(e)),t==="ascending"?r:-r}function Li(n,e){for(let t of n.statement){let r=Dn(t);if(!r||!U(r,e))continue;let o=t.object;if(o!=null&&!(typeof o=="string"&&o.length===0)&&!(Array.isArray(o)&&o.length===0))return!0}return!1}function Fi(n,e){for(let t of n.statement){let r=Dn(t);if(!(!r||!U(r,e))&&(t instanceof tr||t instanceof rr||t instanceof or||t instanceof ar||t instanceof ir))return t.object}}function Dn(n){return n.predicate?.subject}function Mi(n){if(n===void 0)return" undef";if(n===null)return" null";if(typeof n=="string")return`s:${n}`;if(typeof n=="number")return`n:${n}`;if(typeof n=="boolean")return`b:${n}`;if(n instanceof nr){let e=n.subject;return`r:${e.publisher}/${e.package_}/${e.name}`}if(n instanceof er){let e=n.name??"";return`k:${n.namespace??""}/${e}`}if(typeof n=="object"&&n!==null&&typeof n.name=="string"&&typeof n.publisher=="string"){let e=n;return`u:${e.publisher}/${e.package_}/${e.name}`}return`o:${JSON.stringify(n)}`}function Bi(n){return n==null?"":typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"?String(n):n instanceof nr?n.subject.name:n instanceof er?n.name??"":typeof n=="object"&&n!==null&&typeof n.name=="string"?n.name:""}function Pn(n,e,t){if(typeof n!="object"||n===null||n.kind!=="Document")throw new ee(`Transformation "${e}" rule did not yield a Document for ${t}. Got: ${sr(n)}`)}function Kn(n,e,t){if(typeof n=="string")return n;if(Array.isArray(n)&&n.every(Hi))return n.map(r=>String(r)).join("");throw new ee(`Transformation "${e}" artifactName did not yield a string for ${t}. Got: ${sr(n)}`)}function Hi(n){return typeof n=="string"||typeof n=="number"||typeof n=="boolean"}function sr(n){if(n===void 0)return"undefined";if(n===null)return"null";if(Array.isArray(n))return`array(${n.length})`;if(typeof n=="object"){let e=n.kind;return e?`object(kind=${e})`:"object"}return typeof n}function En(n){return[...C(n,u.InstanceTransformation),...C(n,u.SetTransformation)]}function fr(){let n=new De("transform").description("Run ontology-driven transformations against Kanonak packages. Transformations are declarative YAML rules (instances of `kanonak.org/transformations/Transformation`) that convert ontology instances into output files. The runner produces one or more Artifacts per matched input; format backends serialize them to Markdown, HTML, SVG, TOML, JSON, or (with post-processing) PDF.").addHelpText("after",`
135
135
  Examples:
136
136
 
137
137
  # List every Transformation available in the local workspace
@@ -169,9 +169,9 @@ Examples:
169
169
 
170
170
  # List the registered format backends
171
171
  $ kanonak transform formats
172
- `);return n.addCommand(es()),n.addCommand(os()),n.addCommand(is()),n.addCommand(cs()),n}function es(){return new De("run").description("Run a transformation against an input scope and write the resulting Artifacts to disk.").argument("<transformation>","Transformation URI (`publisher/package/name`, optional `@version`) or just the local name if unique in the workspace.").requiredOption("--scope <scope>","Input source \u2014 either a package URI `publisher/package[@version]` (resolved via the local workspace + cache + HTTP tiers) or a file path to a `.kan.yml` document. Repeatable: pass `--scope X --scope Y` to aggregate matching instances across multiple packages, useful for index pages and other cross-package SetTransformations.",ns,[]).option("--format <name>","OutputFormat name to target (e.g. `markdown-with-frontmatter`, `html`, `svg`, `json`). If omitted and the transformation declares exactly one output, that single format is used.").option("--out <dir>","Directory to write artifacts into.",".").action(async(n,e)=>{try{await ts(n,e)}catch(t){console.error(`Error: ${t.message}`),process.exit(1)}})}function ns(n,e){return[...e,n]}async function ts(n,e){let t=new Cn,r=new An,o=await j(process.cwd(),t),a=await fr(n,o,r),{transformation:i,transformationKanonaks:s}=a;console.log(`Transformation: ${Be(i)}`);let c=ge(i,s);e.scope.length===0&&(console.error("At least one --scope is required."),process.exit(1));let l=[],d=new Map;for(let w of e.scope){let $=await ls(w,o,t,r);l.push(...$);let S=await fs($,c.inputPattern.matchesClass,o);for(let D of S){let T=ms(D);T&&!d.has(T)&&d.set(T,D)}console.log(`Scope: ${w} \u2014 found ${S.length} instance(s) of ${c.inputPattern.matchesClass.publisher}/${c.inputPattern.matchesClass.package_}/${c.inputPattern.matchesClass.name}`)}let f=[...d.values()],p=l;e.scope.length>1&&console.log(`Total across ${e.scope.length} scope(s): ${f.length} unique instance(s)`),f.length===0&&c.kind==="instance"&&(console.error("No matching input instances across the supplied scope(s). Check the transformation's inputPattern.matchesClass vs. the scope package(s)."),process.exit(1));let k=rs(c.outputs,e.format);console.log(`Output format: ${k}`);let b=Ve[k];if(!b)throw new Error(`Unknown format "${k}". Run \`kanonak transform formats\` to see what the runner supports.`);let y=await new M().run({transformation:i,instances:f,allKanonaks:p,transformationKanonaks:s,repository:o,parser:t,objectParser:r,outputFormat:k}),h=Xi(e.out);Wi(h,{recursive:!0});for(let w of y){let $=ds(w.fileName),S=Ji(h,`${$}${b.extension}`);qi(S,w.content,"utf-8"),console.log(` wrote ${S}`)}console.log(`Done. ${y.length} artifact(s) written to ${h}`)}function rs(n,e){if(e){if(!n.has(e))throw new Error(`Transformation does not declare --format "${e}" in its outputs. Declared outputs: ${Array.from(n).sort().join(", ")}`);return e}if(n.size===1)return Array.from(n)[0];throw new Error(`Transformation supports multiple output formats (${Array.from(n).sort().join(", ")}); pass --format <name> to select one.`)}function os(){return new De("list").description("Scan the local workspace + cache for every Transformation instance and print a one-line summary per hit.").action(async()=>{try{await as()}catch(n){console.error(`Error: ${n.message}`),process.exit(1)}})}async function as(){let n=new Cn,e=new An,t=await j(process.cwd(),n),r=await t.getAllDocumentsAsync(),o=new Map;for(let i of r)try{let s=new E(i,t),c=await e.parseKanonaks(s),l=En(c);for(let d of l){let f=_n(d);if(!f)continue;let p=o.get(f)??[];p.push({tx:d,kanonaks:c,doc:i}),o.set(f,p)}}catch{}let a=[];for(let i of o.values()){if(i.length===1){a.push(cr(i[0].tx,i[0].kanonaks));continue}let s=Rn(i.map(l=>l.doc));if(!s.chosen)continue;let c=i.find(l=>l.doc===s.chosen);c&&a.push(cr(c.tx,c.kanonaks))}if(a.length===0){console.log("No Transformation instances found in the current workspace.");return}a.sort((i,s)=>i.uri.localeCompare(s.uri));for(let i of a)console.log(`${i.uri}`),console.log(` matches: ${i.matchesClass}`),console.log(` outputs: ${i.outputs.join(", ")}`)}function is(){return new De("show").description("Compile a transformation and print a human-readable summary (input pattern, outputs, format overrides, rule shape).").argument("<transformation>","Transformation URI or local name").action(async n=>{try{await ss(n)}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}})}async function ss(n){let e=new Cn,t=new An,r=await j(process.cwd(),e),{transformation:o,transformationKanonaks:a}=await fr(n,r,t),i=ge(o,a);if(console.log(`Transformation: ${Be(o)}`),console.log(),console.log("Input pattern:"),console.log(` Matches class: ${Me(i.inputPattern.matchesClass)}`),i.inputPattern.requires.length>0){console.log(" Required properties:");for(let s of i.inputPattern.requires)console.log(` - ${Me(s)}`)}else console.log(" Required properties: (none)");if(console.log(),console.log(`Outputs: ${Array.from(i.outputs).sort().join(", ")}`),console.log(),i.overrides.size>0){console.log("Format overrides:");for(let[s,c]of i.overrides){if(console.log(` ${s}:`),c.metadataKeys&&console.log(` metadata keys: ${c.metadataKeys.join(", ")}`),c.metadataRenames.size>0){let l=[];for(let[d,f]of c.metadataRenames)l.push(`${d} \u2192 ${f}`);console.log(` metadata renames: ${l.join(", ")}`)}c.trailingNewline!==void 0&&console.log(` trailing newline: ${c.trailingNewline}`)}console.log()}console.log(`Rule root kind: ${i.rule.kind}`),i.rule.kind==="build-ast-node"&&(console.log(`Rule root AST class: ${Me(i.rule.astClass)}`),console.log(`Rule root bindings: ${i.rule.set.length} field(s)`)),console.log(`Artifact name root kind: ${i.artifactName.kind}`)}function cs(){return new De("formats").description("List the OutputFormat names the runner can serialize to.").action(()=>{console.log("Registered format backends:");let n=Object.entries(Ve).sort(([e],[t])=>e.localeCompare(t));for(let[e,t]of n)console.log(` ${e.padEnd(28)} ${t.extension.padEnd(6)} ${t.formatUri}`)})}async function fr(n,e,t){let r,o,a;if(n.includes("/")){let p=n.indexOf("@"),k=n;if(p!==-1){let g=n.indexOf("/",p);if(g===-1)throw new Error(`Transformation URI "${n}" has @version but no trailing /<name>`);k=n.substring(0,p)+n.substring(g)}let b=k.split("/");if(b.length<3)throw new Error(`Invalid transformation URI "${n}" \u2014 expected publisher/package/name or publisher/package@version/name`);r=b[0],o=b[1],a=b.slice(2).join("/")}else a=n;if(r&&o){let p=await e.getDocumentsByNamespaceAsync(r,o);if(p.length===0)throw new Error(`Package ${r}/${o} not found in the local workspace or cache.`);let k=us(n),b=mr(p,k,`${r}/${o}`),g=new E(b,e),y=await t.parseKanonaks(g),h=we(y,{publisher:r,package_:o,name:a,version:""});if(!h){let w=En(y),$=w.find(S=>S.name===a);if(!$)throw new Error(`Transformation "${a}" not found in package ${r}/${o}. Package contains ${w.length} Transformation(s): ${w.map(S=>S.name).join(", ")||"(none)"}`);return{transformation:$,transformationKanonaks:y}}return{transformation:h,transformationKanonaks:y}}let i=await e.getAllDocumentsAsync(),s=new Map;for(let p of i)try{let k=new E(p,e),b=await t.parseKanonaks(k),g=En(b);for(let y of g){if(y.name!==a)continue;let h=_n(y);if(!h)continue;let w=s.get(h)??[];w.push({tx:y,kanonaks:b,doc:p}),s.set(h,w)}}catch{}if(s.size===0)throw new Error(`No Transformation named "${a}" found in the workspace. Try \`kanonak transform list\` to see available transformations.`);if(s.size>1){let p=Array.from(s.keys()).sort().join(`
172
+ `);return n.addCommand(es()),n.addCommand(os()),n.addCommand(is()),n.addCommand(cs()),n}function es(){return new De("run").description("Run a transformation against an input scope and write the resulting Artifacts to disk.").argument("<transformation>","Transformation URI (`publisher/package/name`, optional `@version`) or just the local name if unique in the workspace.").requiredOption("--scope <scope>","Input source \u2014 either a package URI `publisher/package[@version]` (resolved via the local workspace + cache + HTTP tiers) or a file path to a `.kan.yml` document. Repeatable: pass `--scope X --scope Y` to aggregate matching instances across multiple packages, useful for index pages and other cross-package SetTransformations.",ns,[]).option("--format <name>","OutputFormat name to target (e.g. `markdown-with-frontmatter`, `html`, `svg`, `json`). If omitted and the transformation declares exactly one output, that single format is used.").option("--out <dir>","Directory to write artifacts into.",".").action(async(n,e)=>{try{await ts(n,e)}catch(t){console.error(`Error: ${t.message}`),process.exit(1)}})}function ns(n,e){return[...e,n]}async function ts(n,e){let t=new An,r=new Cn,o=await j(process.cwd(),t),a=await mr(n,o,r),{transformation:i,transformationKanonaks:s}=a;console.log(`Transformation: ${Be(i)}`);let c=ge(i,s);e.scope.length===0&&(console.error("At least one --scope is required."),process.exit(1));let l=[],f=new Map;for(let b of e.scope){let $=await ls(b,o,t,r);l.push(...$);let P=await fs($,c.inputPattern.matchesClass,o);for(let D of P){let T=ms(D);T&&!f.has(T)&&f.set(T,D)}console.log(`Scope: ${b} \u2014 found ${P.length} instance(s) of ${c.inputPattern.matchesClass.publisher}/${c.inputPattern.matchesClass.package_}/${c.inputPattern.matchesClass.name}`)}let m=[...f.values()],p=l;e.scope.length>1&&console.log(`Total across ${e.scope.length} scope(s): ${m.length} unique instance(s)`),m.length===0&&c.kind==="instance"&&(console.error("No matching input instances across the supplied scope(s). Check the transformation's inputPattern.matchesClass vs. the scope package(s)."),process.exit(1));let k=rs(c.outputs,e.format);console.log(`Output format: ${k}`);let w=Fe[k];if(!w)throw new Error(`Unknown format "${k}". Run \`kanonak transform formats\` to see what the runner supports.`);let y=await new B().run({transformation:i,instances:m,allKanonaks:p,transformationKanonaks:s,repository:o,parser:t,objectParser:r,outputFormat:k}),h=Xi(e.out);Wi(h,{recursive:!0});for(let b of y){let $=ds(b.fileName),P=Ji(h,`${$}${w.extension}`);qi(P,b.content,"utf-8"),console.log(` wrote ${P}`)}console.log(`Done. ${y.length} artifact(s) written to ${h}`)}function rs(n,e){if(e){if(!n.has(e))throw new Error(`Transformation does not declare --format "${e}" in its outputs. Declared outputs: ${Array.from(n).sort().join(", ")}`);return e}if(n.size===1)return Array.from(n)[0];throw new Error(`Transformation supports multiple output formats (${Array.from(n).sort().join(", ")}); pass --format <name> to select one.`)}function os(){return new De("list").description("Scan the local workspace + cache for every Transformation instance and print a one-line summary per hit.").action(async()=>{try{await as()}catch(n){console.error(`Error: ${n.message}`),process.exit(1)}})}async function as(){let n=new An,e=new Cn,t=await j(process.cwd(),n),r=await t.getAllDocumentsAsync(),o=new Map;for(let i of r)try{let s=new E(i,t),c=await e.parseKanonaks(s),l=En(c);for(let f of l){let m=_n(f);if(!m)continue;let p=o.get(m)??[];p.push({tx:f,kanonaks:c,doc:i}),o.set(m,p)}}catch{}let a=[];for(let i of o.values()){if(i.length===1){a.push(lr(i[0].tx,i[0].kanonaks));continue}let s=Rn(i.map(l=>l.doc));if(!s.chosen)continue;let c=i.find(l=>l.doc===s.chosen);c&&a.push(lr(c.tx,c.kanonaks))}if(a.length===0){console.log("No Transformation instances found in the current workspace.");return}a.sort((i,s)=>i.uri.localeCompare(s.uri));for(let i of a)console.log(`${i.uri}`),console.log(` matches: ${i.matchesClass}`),console.log(` outputs: ${i.outputs.join(", ")}`)}function is(){return new De("show").description("Compile a transformation and print a human-readable summary (input pattern, outputs, format overrides, rule shape).").argument("<transformation>","Transformation URI or local name").action(async n=>{try{await ss(n)}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}})}async function ss(n){let e=new An,t=new Cn,r=await j(process.cwd(),e),{transformation:o,transformationKanonaks:a}=await mr(n,r,t),i=ge(o,a);if(console.log(`Transformation: ${Be(o)}`),console.log(),console.log("Input pattern:"),console.log(` Matches class: ${Me(i.inputPattern.matchesClass)}`),i.inputPattern.requires.length>0){console.log(" Required properties:");for(let s of i.inputPattern.requires)console.log(` - ${Me(s)}`)}else console.log(" Required properties: (none)");if(console.log(),console.log(`Outputs: ${Array.from(i.outputs).sort().join(", ")}`),console.log(),i.overrides.size>0){console.log("Format overrides:");for(let[s,c]of i.overrides){if(console.log(` ${s}:`),c.metadataKeys&&console.log(` metadata keys: ${c.metadataKeys.join(", ")}`),c.metadataRenames.size>0){let l=[];for(let[f,m]of c.metadataRenames)l.push(`${f} \u2192 ${m}`);console.log(` metadata renames: ${l.join(", ")}`)}c.trailingNewline!==void 0&&console.log(` trailing newline: ${c.trailingNewline}`)}console.log()}console.log(`Rule root kind: ${i.rule.kind}`),i.rule.kind==="build-ast-node"&&(console.log(`Rule root AST class: ${Me(i.rule.astClass)}`),console.log(`Rule root bindings: ${i.rule.set.length} field(s)`)),console.log(`Artifact name root kind: ${i.artifactName.kind}`)}function cs(){return new De("formats").description("List the OutputFormat names the runner can serialize to.").action(()=>{console.log("Registered format backends:");let n=Object.entries(Fe).sort(([e],[t])=>e.localeCompare(t));for(let[e,t]of n)console.log(` ${e.padEnd(28)} ${t.extension.padEnd(6)} ${t.formatUri}`)})}async function mr(n,e,t){let r,o,a;if(n.includes("/")){let p=n.indexOf("@"),k=n;if(p!==-1){let g=n.indexOf("/",p);if(g===-1)throw new Error(`Transformation URI "${n}" has @version but no trailing /<name>`);k=n.substring(0,p)+n.substring(g)}let w=k.split("/");if(w.length<3)throw new Error(`Invalid transformation URI "${n}" \u2014 expected publisher/package/name or publisher/package@version/name`);r=w[0],o=w[1],a=w.slice(2).join("/")}else a=n;if(r&&o){let p=await e.getDocumentsByNamespaceAsync(r,o);if(p.length===0)throw new Error(`Package ${r}/${o} not found in the local workspace or cache.`);let k=us(n),w=pr(p,k,`${r}/${o}`),g=new E(w,e),y=await t.parseKanonaks(g),h=be(y,{publisher:r,package_:o,name:a,version:""});if(!h){let b=En(y),$=b.find(P=>P.name===a);if(!$)throw new Error(`Transformation "${a}" not found in package ${r}/${o}. Package contains ${b.length} Transformation(s): ${b.map(P=>P.name).join(", ")||"(none)"}`);return{transformation:$,transformationKanonaks:y}}return{transformation:h,transformationKanonaks:y}}let i=await e.getAllDocumentsAsync(),s=new Map;for(let p of i)try{let k=new E(p,e),w=await t.parseKanonaks(k),g=En(w);for(let y of g){if(y.name!==a)continue;let h=_n(y);if(!h)continue;let b=s.get(h)??[];b.push({tx:y,kanonaks:w,doc:p}),s.set(h,b)}}catch{}if(s.size===0)throw new Error(`No Transformation named "${a}" found in the workspace. Try \`kanonak transform list\` to see available transformations.`);if(s.size>1){let p=Array.from(s.keys()).sort().join(`
173
173
  `);throw new Error(`Multiple Transformations named "${a}" in the workspace \u2014 disambiguate with a full publisher/package/name URI:
174
- ${p}`)}let c=Array.from(s.values())[0];if(c.length===1)return{transformation:c[0].tx,transformationKanonaks:c[0].kanonaks};let l=new Map(c.map(p=>[p.doc,p])),d=Rn(c.map(p=>p.doc));if(!d.chosen)throw new Error(`Could not select a Transformation version for "${a}".`);let f=l.get(d.chosen);if(d.multipleVersionsPresent){let p=g=>{let y=g.metadata.namespace_?.version;return y?ur(y):""},k=f.tx.namespace??"",b=k.includes("@")?k.substring(0,k.indexOf("@")):k;console.warn(`Warning: Transformation "${a}" has ${c.length} versions present (${c.map(g=>p(g.doc)).filter(Boolean).join(", ")}); using @${p(d.chosen)}. Pin with ${b}@<version>/${a} to suppress this warning.`)}return{transformation:f.tx,transformationKanonaks:f.kanonaks}}async function ls(n,e,t,r){if(/^[.\/\\]/.test(n)||/^[A-Za-z]:/.test(n)||n.endsWith(".kan.yml")||sr(n)&&Gi(n).isFile()){if(!sr(n))throw new Error(`Scope file not found: ${n}`);let b=zi(n,"utf-8"),g=t.parse(b),y=new E(g,e);return r.parseKanonaks(y)}let a=n.indexOf("@"),i=a===-1?n:n.substring(0,a),s=a===-1?void 0:n.substring(a+1),c=i.indexOf("/");if(c===-1)throw new Error(`Invalid scope "${n}" \u2014 expected a file path or publisher/package[@version] URI`);let l=i.substring(0,c),d=i.substring(c+1),f=await e.getDocumentsByNamespaceAsync(l,d);if(f.length===0)throw new Error(`Scope package ${l}/${d} not found in the local workspace or cache.`);let p=mr(f,s,`${l}/${d}`),k=new E(p,e);return r.parseKanonaks(k)}function us(n){let e=n.indexOf("@");if(e===-1)return;let t=n.substring(e+1),r=t.indexOf("/");return r===-1?t:t.substring(0,r)}function mr(n,e,t){let r=a=>{let i=a.metadata.namespace_?.version;return i?ur(i):""},o=Rn(n,{requestedVersion:e});if(o.exactRequestedVersionMissing){let a=n.map(r).filter(Boolean).sort().join(", ");throw new Error(`${t}@${e} not found in the local workspace or cache. Available versions: ${a||"(none with parseable namespace)"}`)}if(!o.chosen)throw new Error(`${t} not found in the local workspace or cache.`);return!e&&o.multipleVersionsPresent&&console.warn(`Warning: ${t} has ${n.length} versions present (${n.map(r).filter(Boolean).join(", ")}); using @${r(o.chosen)}. Pin with ${t}@<version> to suppress this warning.`),o.chosen}function cr(n,e){try{let t=ge(n,e);return{uri:Be(n),matchesClass:Me(t.inputPattern.matchesClass),outputs:Array.from(t.outputs).sort()}}catch(t){return{uri:Be(n),matchesClass:`(compile error: ${t.message})`,outputs:[]}}}function Be(n){let e=n.namespace||"",t=e.indexOf("@");return`${t===-1?e:e.substring(0,t)}/${n.name}`}function Me(n){return`${n.publisher}/${n.package_}/${n.name}`}function ds(n){return n.replace(/[\\/:*?"<>|\s]+/g,"_").replace(/^_+|_+$/g,"")}async function fs(n,e,t){let r=new Map;for(let i of n){if(!(i instanceof Yi))continue;let s=_n(i);s&&r.set(s,i)}let o=[];try{o=(await new Zi({vocabulary:new Qi}).reason(t)).getInstancesOfClass(lr(e.publisher,e.package_,e.name))}catch{}let a=[];for(let i of o){let s=r.get(i);s&&a.push(s)}return a.length>0?a:C(n,e)}function _n(n){let e=n.namespace??"",t=e.indexOf("@"),r=t===-1?e:e.substring(0,t),o=r.indexOf("/");return o===-1||!n.name?null:lr(r.substring(0,o),r.substring(o+1),n.name)}function ms(n){let e=n.namespace??"";return!e||!n.name?null:`${e}/${n.name}`}import{Command as ps}from"commander";import{writeFileSync as gs,mkdirSync as ks}from"fs";import{join as hs,resolve as ys}from"path";import{KanonakParser as bs,KanonakObjectParser as ws,SubjectKanonak as kr,findDerivation as $s}from"@kanonak-protocol/sdk";var Ss={publisher:"kanonak.org",package_:"formats",name:"html"},vs={publisher:"kanonak.org",package_:"derivation",name:"default"},Ps={html:".html",markdown:".md",json:".json",yaml:".yaml",xml:".xml",svg:".svg",typescript:".ts","c-sharp":".cs",rust:".rs",python:".py"};function Ks(n){return n==="markdown"?"markdown-with-frontmatter":n}function hr(){return new ps("derive").description("Materialize a derived artifact from a Kanonak resource by walking the polymorphic derivation discovery: instance overrides \u2192 class hierarchy \u2192 universal defaults. The result is written to disk.").argument("<resource>","Resource URI in the form publisher/package[@version]/name. Identifies the specific instance to derive.").option("--format <name>","Format instance name (e.g. html, markdown, json). Defaults to html.","html").option("--variant <name>","Variant instance name (e.g. default, compact, summary). Defaults to default.","default").option("--out <dir>","Directory to write the artifact into.",".").addHelpText("after",`
174
+ ${p}`)}let c=Array.from(s.values())[0];if(c.length===1)return{transformation:c[0].tx,transformationKanonaks:c[0].kanonaks};let l=new Map(c.map(p=>[p.doc,p])),f=Rn(c.map(p=>p.doc));if(!f.chosen)throw new Error(`Could not select a Transformation version for "${a}".`);let m=l.get(f.chosen);if(f.multipleVersionsPresent){let p=g=>{let y=g.metadata.namespace_?.version;return y?dr(y):""},k=m.tx.namespace??"",w=k.includes("@")?k.substring(0,k.indexOf("@")):k;console.warn(`Warning: Transformation "${a}" has ${c.length} versions present (${c.map(g=>p(g.doc)).filter(Boolean).join(", ")}); using @${p(f.chosen)}. Pin with ${w}@<version>/${a} to suppress this warning.`)}return{transformation:m.tx,transformationKanonaks:m.kanonaks}}async function ls(n,e,t,r){if(/^[.\/\\]/.test(n)||/^[A-Za-z]:/.test(n)||n.endsWith(".kan.yml")||cr(n)&&Gi(n).isFile()){if(!cr(n))throw new Error(`Scope file not found: ${n}`);let w=zi(n,"utf-8"),g=t.parse(w),y=new E(g,e);return r.parseKanonaks(y)}let a=n.indexOf("@"),i=a===-1?n:n.substring(0,a),s=a===-1?void 0:n.substring(a+1),c=i.indexOf("/");if(c===-1)throw new Error(`Invalid scope "${n}" \u2014 expected a file path or publisher/package[@version] URI`);let l=i.substring(0,c),f=i.substring(c+1),m=await e.getDocumentsByNamespaceAsync(l,f);if(m.length===0)throw new Error(`Scope package ${l}/${f} not found in the local workspace or cache.`);let p=pr(m,s,`${l}/${f}`),k=new E(p,e);return r.parseKanonaks(k)}function us(n){let e=n.indexOf("@");if(e===-1)return;let t=n.substring(e+1),r=t.indexOf("/");return r===-1?t:t.substring(0,r)}function pr(n,e,t){let r=a=>{let i=a.metadata.namespace_?.version;return i?dr(i):""},o=Rn(n,{requestedVersion:e});if(o.exactRequestedVersionMissing){let a=n.map(r).filter(Boolean).sort().join(", ");throw new Error(`${t}@${e} not found in the local workspace or cache. Available versions: ${a||"(none with parseable namespace)"}`)}if(!o.chosen)throw new Error(`${t} not found in the local workspace or cache.`);return!e&&o.multipleVersionsPresent&&console.warn(`Warning: ${t} has ${n.length} versions present (${n.map(r).filter(Boolean).join(", ")}); using @${r(o.chosen)}. Pin with ${t}@<version> to suppress this warning.`),o.chosen}function lr(n,e){try{let t=ge(n,e);return{uri:Be(n),matchesClass:Me(t.inputPattern.matchesClass),outputs:Array.from(t.outputs).sort()}}catch(t){return{uri:Be(n),matchesClass:`(compile error: ${t.message})`,outputs:[]}}}function Be(n){let e=n.namespace||"",t=e.indexOf("@");return`${t===-1?e:e.substring(0,t)}/${n.name}`}function Me(n){return`${n.publisher}/${n.package_}/${n.name}`}function ds(n){return n.replace(/[\\/:*?"<>|\s]+/g,"_").replace(/^_+|_+$/g,"")}async function fs(n,e,t){let r=new Map;for(let i of n){if(!(i instanceof Yi))continue;let s=_n(i);s&&r.set(s,i)}let o=[];try{o=(await new Zi({vocabulary:new Qi}).reason(t)).getInstancesOfClass(ur(e.publisher,e.package_,e.name))}catch{}let a=[];for(let i of o){let s=r.get(i);s&&a.push(s)}return a.length>0?a:C(n,e)}function _n(n){let e=n.namespace??"",t=e.indexOf("@"),r=t===-1?e:e.substring(0,t),o=r.indexOf("/");return o===-1||!n.name?null:ur(r.substring(0,o),r.substring(o+1),n.name)}function ms(n){let e=n.namespace??"";return!e||!n.name?null:`${e}/${n.name}`}import{Command as ps}from"commander";import{writeFileSync as gs,mkdirSync as ks}from"fs";import{join as hs,resolve as ys}from"path";import{KanonakParser as ws,KanonakObjectParser as bs,SubjectKanonak as hr,findDerivation as $s}from"@kanonak-protocol/sdk";var Ss={publisher:"kanonak.org",package_:"formats",name:"html"},vs={publisher:"kanonak.org",package_:"derivation",name:"default"},Ps={html:".html",markdown:".md",json:".json",yaml:".yaml",xml:".xml",svg:".svg",typescript:".ts","c-sharp":".cs",rust:".rs",python:".py"};function Ks(n){return n==="markdown"?"markdown-with-frontmatter":n}function yr(){return new ps("derive").description("Materialize a derived artifact from a Kanonak resource by walking the polymorphic derivation discovery: instance overrides \u2192 class hierarchy \u2192 universal defaults. The result is written to disk.").argument("<resource>","Resource URI in the form publisher/package[@version]/name. Identifies the specific instance to derive.").option("--format <name>","Format instance name (e.g. html, markdown, json). Defaults to html.","html").option("--variant <name>","Variant instance name (e.g. default, compact, summary). Defaults to default.","default").option("--out <dir>","Directory to write the artifact into.",".").addHelpText("after",`
175
175
  Examples:
176
176
 
177
177
  # Render a resource as HTML using whatever derivation the discovery
@@ -182,12 +182,12 @@ Examples:
182
182
 
183
183
  # Materialize the JSON view (universal default unless overridden).
184
184
  $ kanonak derive my-publisher.com/my-package/my-resource --format json
185
- `).action(async(n,e)=>{try{await Ds(n,e)}catch(t){console.error(`Error: ${t.message}`),process.exit(1)}})}async function Ds(n,e){let t=z(n);if(!t||!t.instanceName)throw new Error(`Invalid resource URI "${n}". Expected publisher/package[@version]/instance.`);let r=new bs,o=new ws,a=await j(process.cwd(),r),i=await o.parseKanonaks(a),s=Es(i,t);if(!s)throw new Error(`Resource ${t.publisher}/${t.packageName}${t.version?`@${t.version}`:""}/${t.instanceName} not found in the workspace or cache.`);console.log(`Resource: ${pr(s)}`);let c=As(e.format),l=Rs(e.variant),d=$s(s,c,l,i);if(!d)throw new Error(`No derivation found for resource ${pr(s)} at (format=${e.format}, variant=${e.variant}). The class hierarchy declares no binding and no universal default applies.`);console.log(`Derivation: ${_s(d)} \u2192 ${gr(d.transformation)}`);let f=Cs(i,d.transformation);if(!f)throw new Error(`Transformation ${gr(d.transformation)} not found in the workspace or cache. The binding pointed at a transformation the resolver cannot locate.`);let p=Ks(e.format),b=await new M().run({transformation:f,instances:[s],allKanonaks:i,repository:a,parser:r,objectParser:o,outputFormat:p}),g=ys(e.out);ks(g,{recursive:!0});let y=Ps[e.format]??"";for(let h of b){let w=Is(h.fileName),$=hs(g,`${w}${y}`);gs($,h.content,"utf-8"),console.log(` wrote ${$}`)}console.log(`Done. ${b.length} artifact(s) written to ${g}`)}function Es(n,e){for(let t of n){if(!(t instanceof kr)||t.name!==e.instanceName)continue;let r=t.namespace||"",o=`${e.publisher}/${e.packageName}@`;if(r.startsWith(o))if(e.version){if(r===`${e.publisher}/${e.packageName}@${e.version}`)return t}else return t}}function Cs(n,e){let t=`${e.publisher}/${e.package_}@${e.version}`;for(let r of n)if(r instanceof kr&&r.name===e.name&&r.namespace===t)return r}function As(n){if(n.includes("/")){let e=z(n);if(!e||!e.instanceName)throw new Error(`Invalid --format URI "${n}".`);return{publisher:e.publisher,package_:e.packageName,name:e.instanceName}}return{...Ss,name:n}}function Rs(n){if(n.includes("/")){let e=z(n);if(!e||!e.instanceName)throw new Error(`Invalid --variant URI "${n}".`);return{publisher:e.publisher,package_:e.packageName,name:e.instanceName}}return{...vs,name:n}}function pr(n){return`${n.namespace}/${n.name}`}function gr(n){return`${n.publisher}/${n.package_}@${n.version}/${n.name}`}function _s(n){return n.source==="instance"?"instance override":`class ${n.source.publisher}/${n.source.package_}/${n.source.name}`}function Is(n){return n.replace(/[^a-zA-Z0-9._@-]+/g,"_")}import{Command as Sr}from"commander";import{writeFileSync as In,mkdirSync as He}from"fs";import{join as Tn,resolve as Ts,dirname as jn}from"path";import{KanonakParser as js,KanonakObjectParser as Us,SubjectKanonak as vr,ReferenceStatement as Os,ReferenceKanonak as xs,ListStatement as Ns,StringStatement as Pr,EmbeddedStatement as Ls,findDerivation as yr}from"@kanonak-protocol/sdk";var q="kanonak.org",W="site",br={publisher:"kanonak.org",package_:"formats",name:"html"},wr={publisher:"kanonak.org",package_:"derivation",name:"default"};function Kr(){let n=new Sr("site").description("Materialize a publisher's site \u2014 every StaticPage and AggregateView in the workspace gets rendered to its declared output path under the --out directory.");return n.addCommand(Fs()),n}function Fs(){return new Sr("build").description("Walk the workspace, find every StaticPage and AggregateView, and write each materialized artifact to its declared output path under the --out directory.").option("--out <dir>","Output base directory.","./_site").action(async n=>{try{await Vs(n)}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}})}async function Vs(n){let e=new js,t=new Us,r=await j(process.cwd(),e),o=await t.parseKanonaks(r),a=Ts(n.out);He(a,{recursive:!0});let i=await r.getAllDocumentsAsync(),s=new Set;for(let g of i){let y=g.metadata.namespace_?.toString();y&&s.add(y)}let c={publisher:q,package_:W,name:"StaticPage"},l={publisher:q,package_:W,name:"ResourcePage"},d={publisher:q,package_:W,name:"AggregateView"},f=C(o,c).filter(g=>s.has(g.namespace||"")),p=C(o,l).filter(g=>s.has(g.namespace||"")),k=C(o,d).filter(g=>s.has(g.namespace||""));console.log(`Found ${f.length} StaticPage(s), ${p.length} ResourcePage(s), and ${k.length} AggregateView(s) in the workspace.`);let b=new M;for(let g of f){let y=Un(g,q,W,"outputPath")??`${g.name}.html`,h=yr(g,br,wr,o);if(!h){console.warn(` [skip] ${g.name}: no HTML/default derivation found (check class hierarchy or universal-derivations is loaded)`);continue}let w=On(o,h.transformation);if(!w){console.warn(` [skip] ${g.name}: transformation ${xn(h.transformation)} not found`);continue}let $=await b.run({transformation:w,instances:[g],allKanonaks:o,repository:r,parser:e,objectParser:t,outputFormat:"html"});if($.length===0){console.warn(` [skip] ${g.name}: transformation produced no artifacts`);continue}let S=Tn(a,y);He(jn(S),{recursive:!0}),In(S,$[0].content,"utf-8"),console.log(` wrote ${S} (StaticPage ${g.name})`)}for(let g of p){let y=Un(g,q,W,"outputPath")??`${g.name}.html`,h=$r(g,q,W,"pageOf");if(!h){console.warn(` [skip] ${g.name}: no pageOf declared`);continue}let w=o.find(F=>F instanceof vr&&F.name===h.name&&(F.namespace||"").startsWith(`${h.publisher}/${h.package_}@`));if(!w){console.warn(` [skip] ${g.name}: pageOf target ${h.publisher}/${h.package_}/${h.name} not found`);continue}let $=yr(w,br,wr,o);if(!$){console.warn(` [skip] ${g.name}: no derivation for target ${w.name}`);continue}let S=On(o,$.transformation);if(!S){console.warn(` [skip] ${g.name}: transformation ${xn($.transformation)} not found`);continue}let D=await b.run({transformation:S,instances:[w],allKanonaks:o,repository:r,parser:e,objectParser:t,outputFormat:"html"});if(D.length===0){console.warn(` [skip] ${g.name}: transformation produced no artifacts`);continue}let T=Tn(a,y);He(jn(T),{recursive:!0}),In(T,D[0].content,"utf-8"),console.log(` wrote ${T} (ResourcePage ${g.name} \u2192 ${w.name})`)}for(let g of k){let y=Un(g,q,W,"outputPath");if(!y){console.warn(` [skip] ${g.name}: no outputPath declared`);continue}let h=$r(g,q,W,"scopeClass");if(!h){console.warn(` [skip] ${g.name}: no scopeClass declared`);continue}let w={publisher:h.publisher,package_:h.package_,name:h.name},$=Ms(g,q,W,"scopeSources"),S=Bs(g);if(!S){console.warn(` [skip] ${g.name}: no transformation declared`);continue}let D=On(o,S);if(!D){console.warn(` [skip] ${g.name}: transformation ${xn(S)} not found`);continue}let T=await zs($,r),F=[],qn=new Set;for(let io of T){let so=await qs(io,r,e,t),co=C(so,w);for(let on of co){let Gn=`${on.namespace}/${on.name}`;qn.has(Gn)||(qn.add(Gn),F.push(on))}}console.log(` ${g.name}: ${F.length} instance(s) of ${w.publisher}/${w.package_}/${w.name} across ${T.length} scope(s)`);let Wn=await b.run({transformation:D,instances:F,allKanonaks:o,repository:r,parser:e,objectParser:t,outputFormat:"html"});if(Wn.length===0){console.warn(` [skip] ${g.name}: transformation produced no artifacts`);continue}let rn=Tn(a,y);He(jn(rn),{recursive:!0}),In(rn,Wn[0].content,"utf-8"),console.log(` wrote ${rn} (AggregateView ${g.name})`)}console.log("Site build complete.")}function Un(n,e,t,r){for(let o of n.statement)if(o instanceof Pr&&ze(o,e,t,r))return o.object}function Ms(n,e,t,r){for(let o of n.statement){if(!(o instanceof Ns)||!ze(o,e,t,r))continue;let a=[];for(let i of o.object??[]){let s=i.value;typeof s=="string"&&a.push(s)}return a}return[]}function $r(n,e,t,r){for(let o of n.statement)if(o instanceof Os&&ze(o,e,t,r)&&o.object instanceof xs)return{publisher:o.object.subject.publisher,package_:o.object.subject.package_,name:o.object.subject.name}}function Bs(n){for(let e of n.statement)if(e instanceof Ls&&ze(e,q,W,"transformation"))return Hs(e.object)}function Hs(n){let e,t,r,o;for(let a of n.statement){if(!(a instanceof Pr))continue;let i=a.predicate?.subject?.name;i==="publisher"?e=a.object:i==="package"?t=a.object:i==="version"?r=a.object:i==="name"&&(o=a.object)}if(!(!e||!t||!r||!o))return{publisher:e,package_:t,version:r,name:o}}function ze(n,e,t,r){let o=n.predicate?.subject;return o?o.publisher===e&&o.package_===t&&o.name===r:!1}function On(n,e){let t=`${e.publisher}/${e.package_}@${e.version}`;for(let r of n)if(r instanceof vr&&r.name===e.name&&r.namespace===t)return r}function xn(n){return`${n.publisher}/${n.package_}@${n.version}/${n.name}`}async function zs(n,e){let t=[];for(let r of n){let o=r.indexOf("@*");if(o===-1){t.push(r);continue}let a=r.substring(0,o),i=a.indexOf("/");if(i===-1){t.push(r);continue}let s=a.substring(0,i),c=a.substring(i+1),l=await e.getDocumentsByNamespaceAsync(s,c);for(let d of l){let f=d.metadata.namespace_;if(!f)continue;let p=f.version;t.push(`${f.publisher}/${f.package_}@${p.major}.${p.minor}.${p.patch}`)}}return t}async function qs(n,e,t,r){let o=n.indexOf("/"),a=n.indexOf("@");if(o===-1||a===-1)return[];let i=n.substring(0,o),s=n.substring(o+1,a),c=n.substring(a+1),l=await e.getDocumentsByNamespaceAsync(i,s);for(let d of l){let f=d.metadata.namespace_?.version;if(f&&`${f.major}.${f.minor}.${f.patch}`===c){let p=new E(d,e);return r.parseKanonaks(p)}}return[]}import{Command as Ws}from"commander";import{KanonakParser as Gs,PublisherIndex as Dr,CredentialStore as Er,createAuthenticatedFetch as Cr,FileSystemKanonakDocumentRepository as Js,Reasoner as Xs,KanonakVocabulary as Ys,getGlobalCachePath as Zs,makeUriKey as Qs}from"@kanonak-protocol/sdk";function ec(n){let e=n.split("/");if(e.length!==3)return null;let[t,r,o]=e;return!t||!r||!o?null:{publisher:t,package_:r,name:o}}function Ar(){return new Ws("search").description("Browse a publisher's catalogue or find instances of a class via the SDK reasoner").argument("<publisher>","Publisher domain (e.g. kanonak.org)").option("--type <uri>","Class URI to search for, in publisher/package/Name form").action(async(n,e)=>{e.type?await tc(n,e.type):await nc(n)})}async function nc(n){let e=new Er,t=Cr(e),r=new Dr({fetchFn:t}),o;try{o=await r.listLatestPackages(n)}catch(i){console.error(`Failed to fetch publisher index for ${n}: ${i.message}`),process.exit(1)}if(o.length===0){console.log(`No packages found at ${n}.`);return}console.log(`Packages published by ${n}:
186
- `);let a=o.reduce((i,s)=>Math.max(i,s.packageName.length),0);for(let{packageName:i,version:s}of o)console.log(` ${i.padEnd(a)} @${s}`)}async function tc(n,e){let t=ec(e);t||(console.error(`Invalid --type value: ${e}`),console.error("Expected: publisher/package/Name (e.g. kanonak.org/capabilities/Capability)"),process.exit(1));let r=new Gs,o=new Er,a=Cr(o),i=new Dr({fetchFn:a}),s=new V,c=new Set,l=[];try{l=await i.listLatestPackages(n)}catch(y){console.error(`Failed to fetch publisher index for ${n}: ${y.message}`),process.exit(1)}for(let{packageName:y,version:h}of l)c.add(`${n}|${y}|${h}`);await Nn(i,s,a,"kanonak.org","core-rdf",c),await Nn(i,s,a,"kanonak.org","core-owl",c),await Nn(i,s,a,t.publisher,t.package_,c);for(let y of c){let[h,w,$]=y.split("|");if(!s.has(h,w,$))try{let S=await i.getPackageUrl(h,w,$),D=await a(S,h);if(!D.ok){console.error(`Warning: failed to fetch ${h}/${w}@${$}: ${D.status} ${D.statusText}`);continue}let T=await D.text();s.put(h,w,$,T)}catch(S){console.error(`Warning: failed to fetch ${h}/${w}@${$}: ${S.message}`)}}let d=new Js(Zs(),!0,r),p=await new Xs({vocabulary:new Ys}).reason(d),k=Qs(t.publisher,t.package_,t.name),g=p.getInstancesOfClass(k).filter(y=>y!==k);if(g.length===0){console.log(`No instances of ${k} found in ${n}'s catalogue.`);return}console.log(`Instances of ${k} in ${n}'s catalogue:
187
- `),g.sort();for(let y of g)console.log(` ${y}`)}async function Nn(n,e,t,r,o,a){try{let i=await n.getHighestVersion(r,o);if(!i)return;a.add(`${r}|${o}|${i}`)}catch{}}import{Command as Rr}from"commander";function ke(n){return`${_}/${I}/${n}`}var Ln={[ke("fetch-and-deploy")]:(n,e,t,r)=>n.add(e,t[0],r),[ke("remove-deployed")]:(n,e,t,r)=>n.remove(e,t[0],r),[ke("list-deployed")]:(n,e,t,r)=>n.list(e,r),[ke("update-deployed")]:(n,e,t,r)=>n.update(e,t[0],r),[ke("search-available")]:(n,e,t,r)=>n.search(e,r),[ke("show-info")]:(n,e,t,r)=>n.info(e,t[0],r)};function _r(n,e,t){for(let r of e){let o=new Rr(r.commandName).description(r.description.trim());for(let a of r.commands){let i=o.command(rc(a));i.description(a.description);for(let s of a.arguments)if(s.isOption){let c=s.defaultValue!=null?`--${s.argumentName} [value]`:`--${s.argumentName} <value>`;i.option(c,"",s.defaultValue)}i.action(async(...s)=>{let c=oc(s);await ac(t,r,a,s,c)})}n.addCommand(o)}}function rc(n){let e=n.arguments.filter(t=>!t.isOption).map(t=>t.required?`<${t.argumentName}>`:`[${t.argumentName}]`);return[n.subcommandName,...e].join(" ")}function oc(n){for(let e=n.length-1;e>=0;e--)if(n[e]&&typeof n[e]=="object"&&!(n[e]instanceof Rr))return n[e];return{}}async function ac(n,e,t,r,o){let a=[];for(let s of r)if(typeof s=="string")a.push(s);else break;t.actionKey||(console.error(`Capability subcommand '${t.subcommandName}' has no resolved \`performs:\` Action. Every CapabilityCommand must declare a performs value pointing at a named Action instance from the capabilities ontology. Known actions: ${Object.keys(Ln).join(", ")}.`),process.exit(1));let i=Ln[t.actionKey];i||(console.error(`Capability subcommand '${t.subcommandName}' references unknown Action '${t.actionKey}'. Known actions: ${Object.keys(Ln).join(", ")}.`),process.exit(1)),await i(n,e,a,o)}import{existsSync as Ir,readFileSync as ic,statSync as Tr}from"fs";import{resolve as sc}from"path";import{KanonakObjectParser as cc,PublisherIndex as Fn,PublisherConfigResolver as lc,formatVersion as jr,pickHighestDocument as uc}from"@kanonak-protocol/sdk";var qe=class{constructor(e,t,r,o,a,i){this.fileCache=e;this.parser=t;this.publisherIndex=r;this.fetchFn=o;this.handlerRegistry=a;this.repository=i}fileCache;parser;publisherIndex;fetchFn;handlerRegistry;repository;objectParser=new cc;async add(e,t,r){let o=this.tryLoadFromLocalFile(t);if(o){this.fileCache.put(o.publisher,o.packageName,o.version,o.content),await this.deployFromDoc(e,o.doc,o.publisher,o.packageName,o.version,void 0,`local file ${t}`,r);return}let a=z(t);a||(console.error(`Invalid package reference: "${t}"`),console.error(""),console.error("Accepted forms:"),console.error(" publisher/package (install all instances, latest version)"),console.error(" publisher/package@version (install all instances, pinned)"),console.error(" publisher/package/instance (install one instance, latest version)"),console.error(" publisher/package@version/instance (install one instance, pinned)"),console.error(" ./path/to/file.kan.yml (install all instances from a local document)"),console.error(""),console.error("Tip: copy a URI directly from `kanonak "+e.commandName+" search`."),process.exit(1));let{publisher:i,packageName:s,version:c,instanceName:l}=a,d=await this.repository.getDocumentsByNamespaceAsync(i,s);if(d.length>0){let k=uc(d,{requestedVersion:c??void 0});if(k.chosen){let b=k.chosen.metadata.namespace_;(!b||!b.version)&&(console.error(`Document for ${i}/${s} is missing namespace metadata.`),process.exit(1));let g=jr(b.version);this.fileCache.put(i,s,g,this.parser.save(k.chosen)),await this.deployFromDoc(e,k.chosen,i,s,g,l??void 0,`${i}/${s}@${g}`,r);return}}let f=c??await this.publisherIndex.getHighestVersion(i,s);f||(console.error(`Could not resolve version for "${i}/${s}".`),await this.printPackageSuggestions(i,s,e.commandName),process.exit(1));let p=this.fileCache.get(i,s,f);if(!p){let k=await this.publisherIndex.getPackageUrl(i,s,f),b=await this.fetchFn(k,i);b.ok||(b.status===404?(console.error(`Package ${i}/${s}@${f} not found at ${k}.`),console.error(`The publisher index lists this version but the file is missing \u2014 it may have been unpublished. Try \`kanonak ${e.commandName} search\` to see the current catalogue.`)):console.error(`Failed to fetch ${k} (${b.status} ${b.statusText}).`),process.exit(1)),p=await b.text(),this.fileCache.put(i,s,f,p)}await this.deployFromDoc(e,this.parser.parse(p),i,s,f,l??void 0,`${i}/${s}@${f}`,r)}tryLoadFromLocalFile(e){if(!(/^[.\/\\]/.test(e)||/^[A-Za-z]:[\\/]/.test(e)||e.endsWith(".kan.yml")||Ir(e)&&Tr(e).isFile()))return;let r=sc(e);(!Ir(r)||!Tr(r).isFile())&&(console.error(`Local file not found: ${e}`),process.exit(1));let o=ic(r,"utf-8"),a=this.parser.parse(o),i=a.metadata.namespace_;return(!i||!i.version)&&(console.error(`${e} has no namespace metadata; cannot determine publisher/package/version. A Kanonak document must declare \`type: Package\` with publisher and version.`),process.exit(1)),{doc:a,content:o,publisher:i.publisher,packageName:i.package_,version:jr(i.version)}}async deployFromDoc(e,t,r,o,a,i,s,c){let l=new E(t,this.repository),d=await this.objectParser.parseKanonaks(l),f=Ur(e.managesTypeKey);f||(console.error(`Capability "${e.commandName}" has no resolved managesType.`),process.exit(1));let p=C(d,f);p.length===0&&(console.error(`${s} does not contain any ${B(f)} instances.`),process.exit(1));let k=p;if(i&&(k=p.filter(y=>y.name===i),k.length===0)){console.error(`Instance "${i}" not found in ${s}.`),console.error(""),console.error(`Available ${B(f)} instance(s):`);for(let y of p)console.error(` - ${y.name}`);console.error(""),console.error("To install all of them, drop the instance suffix:"),console.error(` kanonak ${e.commandName} add ${r}/${o}`),process.exit(1)}let b=i?`${i} from ${s}`:`${k.length} ${B(f)} instance(s) from ${s}`;console.log(`Installing ${b}...`);let g=this.handlerRegistry.get(e.deploymentTargetKey);g?await g.deploy({instances:k,allKanonaks:d,repository:this.repository,options:c}):console.log(`Cached ${r}/${o}@${a} (no deployment handler for "${e.deploymentTargetKey}")`)}async printPackageSuggestions(e,t,r){let o;try{o=await this.publisherIndex.listLatestPackages(e)}catch{return}let a=o.map(i=>({name:i.packageName,version:i.version,score:dc(t,i.packageName)})).filter(i=>i.score>0).sort((i,s)=>s.score-i.score).slice(0,5);if(a.length!==0){console.error(""),console.error("Did you mean one of:");for(let i of a)console.error(` kanonak ${r} add ${e}/${i.name}`)}}async remove(e,t,r){await this.requireHandler(e).undeploy(t,{repository:this.repository,options:r})}async list(e,t){let o=await this.requireHandler(e).list({repository:this.repository,options:t}),a=e.managesTypeKey||"managed";if(o.length===0){console.log(`No ${a} instances installed.`);return}console.log(`Installed ${a} instances:
185
+ `).action(async(n,e)=>{try{await Ds(n,e)}catch(t){console.error(`Error: ${t.message}`),process.exit(1)}})}async function Ds(n,e){let t=q(n);if(!t||!t.instanceName)throw new Error(`Invalid resource URI "${n}". Expected publisher/package[@version]/instance.`);let r=new ws,o=new bs,a=await j(process.cwd(),r),i=await o.parseKanonaks(a),s=Es(i,t);if(!s)throw new Error(`Resource ${t.publisher}/${t.packageName}${t.version?`@${t.version}`:""}/${t.instanceName} not found in the workspace or cache.`);console.log(`Resource: ${gr(s)}`);let c=Cs(e.format),l=Rs(e.variant),f=$s(s,c,l,i);if(!f)throw new Error(`No derivation found for resource ${gr(s)} at (format=${e.format}, variant=${e.variant}). The class hierarchy declares no binding and no universal default applies.`);console.log(`Derivation: ${_s(f)} \u2192 ${kr(f.transformation)}`);let m=As(i,f.transformation);if(!m)throw new Error(`Transformation ${kr(f.transformation)} not found in the workspace or cache. The binding pointed at a transformation the resolver cannot locate.`);let p=Ks(e.format),w=await new B().run({transformation:m,instances:[s],allKanonaks:i,repository:a,parser:r,objectParser:o,outputFormat:p}),g=ys(e.out);ks(g,{recursive:!0});let y=Ps[e.format]??"";for(let h of w){let b=Is(h.fileName),$=hs(g,`${b}${y}`);gs($,h.content,"utf-8"),console.log(` wrote ${$}`)}console.log(`Done. ${w.length} artifact(s) written to ${g}`)}function Es(n,e){for(let t of n){if(!(t instanceof hr)||t.name!==e.instanceName)continue;let r=t.namespace||"",o=`${e.publisher}/${e.packageName}@`;if(r.startsWith(o))if(e.version){if(r===`${e.publisher}/${e.packageName}@${e.version}`)return t}else return t}}function As(n,e){let t=`${e.publisher}/${e.package_}@${e.version}`;for(let r of n)if(r instanceof hr&&r.name===e.name&&r.namespace===t)return r}function Cs(n){if(n.includes("/")){let e=q(n);if(!e||!e.instanceName)throw new Error(`Invalid --format URI "${n}".`);return{publisher:e.publisher,package_:e.packageName,name:e.instanceName}}return{...Ss,name:n}}function Rs(n){if(n.includes("/")){let e=q(n);if(!e||!e.instanceName)throw new Error(`Invalid --variant URI "${n}".`);return{publisher:e.publisher,package_:e.packageName,name:e.instanceName}}return{...vs,name:n}}function gr(n){return`${n.namespace}/${n.name}`}function kr(n){return`${n.publisher}/${n.package_}@${n.version}/${n.name}`}function _s(n){return n.source==="instance"?"instance override":`class ${n.source.publisher}/${n.source.package_}/${n.source.name}`}function Is(n){return n.replace(/[^a-zA-Z0-9._@-]+/g,"_")}import{Command as vr}from"commander";import{writeFileSync as In,mkdirSync as He}from"fs";import{join as Tn,resolve as Ts,dirname as jn}from"path";import{KanonakParser as js,KanonakObjectParser as Us,SubjectKanonak as Pr,ReferenceStatement as Os,ReferenceKanonak as Ns,ListStatement as xs,StringStatement as Kr,EmbeddedStatement as Vs,findDerivation as wr}from"@kanonak-protocol/sdk";var W="kanonak.org",G="site",br={publisher:"kanonak.org",package_:"formats",name:"html"},$r={publisher:"kanonak.org",package_:"derivation",name:"default"};function Dr(){let n=new vr("site").description("Materialize a publisher's site \u2014 every StaticPage and AggregateView in the workspace gets rendered to its declared output path under the --out directory.");return n.addCommand(Ls()),n}function Ls(){return new vr("build").description("Walk the workspace, find every StaticPage and AggregateView, and write each materialized artifact to its declared output path under the --out directory.").option("--out <dir>","Output base directory.","./_site").action(async n=>{try{await Fs(n)}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}})}async function Fs(n){let e=new js,t=new Us,r=await j(process.cwd(),e),o=await t.parseKanonaks(r),a=Ts(n.out);He(a,{recursive:!0});let i=await r.getAllDocumentsAsync(),s=new Set;for(let g of i){let y=g.metadata.namespace_?.toString();y&&s.add(y)}let c={publisher:W,package_:G,name:"StaticPage"},l={publisher:W,package_:G,name:"ResourcePage"},f={publisher:W,package_:G,name:"AggregateView"},m=C(o,c).filter(g=>s.has(g.namespace||"")),p=C(o,l).filter(g=>s.has(g.namespace||"")),k=C(o,f).filter(g=>s.has(g.namespace||""));console.log(`Found ${m.length} StaticPage(s), ${p.length} ResourcePage(s), and ${k.length} AggregateView(s) in the workspace.`);let w=new B;for(let g of m){let y=Un(g,W,G,"outputPath")??`${g.name}.html`,h=wr(g,br,$r,o);if(!h){console.warn(` [skip] ${g.name}: no HTML/default derivation found (check class hierarchy or universal-derivations is loaded)`);continue}let b=On(o,h.transformation);if(!b){console.warn(` [skip] ${g.name}: transformation ${Nn(h.transformation)} not found`);continue}let $=await w.run({transformation:b,instances:[g],allKanonaks:o,repository:r,parser:e,objectParser:t,outputFormat:"html"});if($.length===0){console.warn(` [skip] ${g.name}: transformation produced no artifacts`);continue}let P=Tn(a,y);He(jn(P),{recursive:!0}),In(P,$[0].content,"utf-8"),console.log(` wrote ${P} (StaticPage ${g.name})`)}for(let g of p){let y=Un(g,W,G,"outputPath")??`${g.name}.html`,h=Sr(g,W,G,"pageOf");if(!h){console.warn(` [skip] ${g.name}: no pageOf declared`);continue}let b=o.find(F=>F instanceof Pr&&F.name===h.name&&(F.namespace||"").startsWith(`${h.publisher}/${h.package_}@`));if(!b){console.warn(` [skip] ${g.name}: pageOf target ${h.publisher}/${h.package_}/${h.name} not found`);continue}let $=wr(b,br,$r,o);if(!$){console.warn(` [skip] ${g.name}: no derivation for target ${b.name}`);continue}let P=On(o,$.transformation);if(!P){console.warn(` [skip] ${g.name}: transformation ${Nn($.transformation)} not found`);continue}let D=await w.run({transformation:P,instances:[b],allKanonaks:o,repository:r,parser:e,objectParser:t,outputFormat:"html"});if(D.length===0){console.warn(` [skip] ${g.name}: transformation produced no artifacts`);continue}let T=Tn(a,y);He(jn(T),{recursive:!0}),In(T,D[0].content,"utf-8"),console.log(` wrote ${T} (ResourcePage ${g.name} \u2192 ${b.name})`)}for(let g of k){let y=Un(g,W,G,"outputPath");if(!y){console.warn(` [skip] ${g.name}: no outputPath declared`);continue}let h=Sr(g,W,G,"scopeClass");if(!h){console.warn(` [skip] ${g.name}: no scopeClass declared`);continue}let b={publisher:h.publisher,package_:h.package_,name:h.name},$=Ms(g,W,G,"scopeSources"),P=Bs(g);if(!P){console.warn(` [skip] ${g.name}: no transformation declared`);continue}let D=On(o,P);if(!D){console.warn(` [skip] ${g.name}: transformation ${Nn(P)} not found`);continue}let T=await zs($,r),F=[],qn=new Set;for(let so of T){let co=await qs(so,r,e,t),lo=C(co,b);for(let on of lo){let Gn=`${on.namespace}/${on.name}`;qn.has(Gn)||(qn.add(Gn),F.push(on))}}console.log(` ${g.name}: ${F.length} instance(s) of ${b.publisher}/${b.package_}/${b.name} across ${T.length} scope(s)`);let Wn=await w.run({transformation:D,instances:F,allKanonaks:o,repository:r,parser:e,objectParser:t,outputFormat:"html"});if(Wn.length===0){console.warn(` [skip] ${g.name}: transformation produced no artifacts`);continue}let rn=Tn(a,y);He(jn(rn),{recursive:!0}),In(rn,Wn[0].content,"utf-8"),console.log(` wrote ${rn} (AggregateView ${g.name})`)}console.log("Site build complete.")}function Un(n,e,t,r){for(let o of n.statement)if(o instanceof Kr&&ze(o,e,t,r))return o.object}function Ms(n,e,t,r){for(let o of n.statement){if(!(o instanceof xs)||!ze(o,e,t,r))continue;let a=[];for(let i of o.object??[]){let s=i.value;typeof s=="string"&&a.push(s)}return a}return[]}function Sr(n,e,t,r){for(let o of n.statement)if(o instanceof Os&&ze(o,e,t,r)&&o.object instanceof Ns)return{publisher:o.object.subject.publisher,package_:o.object.subject.package_,name:o.object.subject.name}}function Bs(n){for(let e of n.statement)if(e instanceof Vs&&ze(e,W,G,"transformation"))return Hs(e.object)}function Hs(n){let e,t,r,o;for(let a of n.statement){if(!(a instanceof Kr))continue;let i=a.predicate?.subject?.name;i==="publisher"?e=a.object:i==="package"?t=a.object:i==="version"?r=a.object:i==="name"&&(o=a.object)}if(!(!e||!t||!r||!o))return{publisher:e,package_:t,version:r,name:o}}function ze(n,e,t,r){let o=n.predicate?.subject;return o?o.publisher===e&&o.package_===t&&o.name===r:!1}function On(n,e){let t=`${e.publisher}/${e.package_}@${e.version}`;for(let r of n)if(r instanceof Pr&&r.name===e.name&&r.namespace===t)return r}function Nn(n){return`${n.publisher}/${n.package_}@${n.version}/${n.name}`}async function zs(n,e){let t=[];for(let r of n){let o=r.indexOf("@*");if(o===-1){t.push(r);continue}let a=r.substring(0,o),i=a.indexOf("/");if(i===-1){t.push(r);continue}let s=a.substring(0,i),c=a.substring(i+1),l=await e.getDocumentsByNamespaceAsync(s,c);for(let f of l){let m=f.metadata.namespace_;if(!m)continue;let p=m.version;t.push(`${m.publisher}/${m.package_}@${p.major}.${p.minor}.${p.patch}`)}}return t}async function qs(n,e,t,r){let o=n.indexOf("/"),a=n.indexOf("@");if(o===-1||a===-1)return[];let i=n.substring(0,o),s=n.substring(o+1,a),c=n.substring(a+1),l=await e.getDocumentsByNamespaceAsync(i,s);for(let f of l){let m=f.metadata.namespace_?.version;if(m&&`${m.major}.${m.minor}.${m.patch}`===c){let p=new E(f,e);return r.parseKanonaks(p)}}return[]}import{Command as Ws}from"commander";import{KanonakParser as Gs,PublisherIndex as Er,CredentialStore as Ar,createAuthenticatedFetch as Cr,FileSystemKanonakDocumentRepository as Js,Reasoner as Xs,KanonakVocabulary as Ys,getGlobalCachePath as Zs,makeUriKey as Qs}from"@kanonak-protocol/sdk";function ec(n){let e=n.split("/");if(e.length!==3)return null;let[t,r,o]=e;return!t||!r||!o?null:{publisher:t,package_:r,name:o}}function Rr(){return new Ws("search").description("Browse a publisher's catalogue or find instances of a class via the SDK reasoner").argument("<publisher>","Publisher domain (e.g. kanonak.org)").option("--type <uri>","Class URI to search for, in publisher/package/Name form").action(async(n,e)=>{e.type?await tc(n,e.type):await nc(n)})}async function nc(n){let e=new Ar,t=Cr(e),r=new Er({fetchFn:t}),o;try{o=await r.listLatestPackages(n)}catch(i){console.error(`Failed to fetch publisher index for ${n}: ${i.message}`),process.exit(1)}if(o.length===0){console.log(`No packages found at ${n}.`);return}console.log(`Packages published by ${n}:
186
+ `);let a=o.reduce((i,s)=>Math.max(i,s.packageName.length),0);for(let{packageName:i,version:s}of o)console.log(` ${i.padEnd(a)} @${s}`)}async function tc(n,e){let t=ec(e);t||(console.error(`Invalid --type value: ${e}`),console.error("Expected: publisher/package/Name (e.g. kanonak.org/capabilities/Capability)"),process.exit(1));let r=new Gs,o=new Ar,a=Cr(o),i=new Er({fetchFn:a}),s=new M,c=new Set,l=[];try{l=await i.listLatestPackages(n)}catch(y){console.error(`Failed to fetch publisher index for ${n}: ${y.message}`),process.exit(1)}for(let{packageName:y,version:h}of l)c.add(`${n}|${y}|${h}`);await xn(i,s,a,"kanonak.org","core-rdf",c),await xn(i,s,a,"kanonak.org","core-owl",c),await xn(i,s,a,t.publisher,t.package_,c);for(let y of c){let[h,b,$]=y.split("|");if(!s.has(h,b,$))try{let P=await i.getPackageUrl(h,b,$),D=await a(P,h);if(!D.ok){console.error(`Warning: failed to fetch ${h}/${b}@${$}: ${D.status} ${D.statusText}`);continue}let T=await D.text();s.put(h,b,$,T)}catch(P){console.error(`Warning: failed to fetch ${h}/${b}@${$}: ${P.message}`)}}let f=new Js(Zs(),!0,r),p=await new Xs({vocabulary:new Ys}).reason(f),k=Qs(t.publisher,t.package_,t.name),g=p.getInstancesOfClass(k).filter(y=>y!==k);if(g.length===0){console.log(`No instances of ${k} found in ${n}'s catalogue.`);return}console.log(`Instances of ${k} in ${n}'s catalogue:
187
+ `),g.sort();for(let y of g)console.log(` ${y}`)}async function xn(n,e,t,r,o,a){try{let i=await n.getHighestVersion(r,o);if(!i)return;a.add(`${r}|${o}|${i}`)}catch{}}import{Command as _r}from"commander";function ke(n){return`${_}/${I}/${n}`}var Vn={[ke("fetch-and-deploy")]:(n,e,t,r)=>n.add(e,t[0],r),[ke("remove-deployed")]:(n,e,t,r)=>n.remove(e,t[0],r),[ke("list-deployed")]:(n,e,t,r)=>n.list(e,r),[ke("update-deployed")]:(n,e,t,r)=>n.update(e,t[0],r),[ke("search-available")]:(n,e,t,r)=>n.search(e,r),[ke("show-info")]:(n,e,t,r)=>n.info(e,t[0],r)};function Ir(n,e,t){for(let r of e){let o=new _r(r.commandName).description(r.description.trim());for(let a of r.commands){let i=o.command(rc(a));i.description(a.description);for(let s of a.arguments)if(s.isOption){let c=s.defaultValue!=null?`--${s.argumentName} [value]`:`--${s.argumentName} <value>`;i.option(c,"",s.defaultValue)}i.action(async(...s)=>{let c=oc(s);await ac(t,r,a,s,c)})}n.addCommand(o)}}function rc(n){let e=n.arguments.filter(t=>!t.isOption).map(t=>t.required?`<${t.argumentName}>`:`[${t.argumentName}]`);return[n.subcommandName,...e].join(" ")}function oc(n){for(let e=n.length-1;e>=0;e--)if(n[e]&&typeof n[e]=="object"&&!(n[e]instanceof _r))return n[e];return{}}async function ac(n,e,t,r,o){let a=[];for(let s of r)if(typeof s=="string")a.push(s);else break;t.actionKey||(console.error(`Capability subcommand '${t.subcommandName}' has no resolved \`performs:\` Action. Every CapabilityCommand must declare a performs value pointing at a named Action instance from the capabilities ontology. Known actions: ${Object.keys(Vn).join(", ")}.`),process.exit(1));let i=Vn[t.actionKey];i||(console.error(`Capability subcommand '${t.subcommandName}' references unknown Action '${t.actionKey}'. Known actions: ${Object.keys(Vn).join(", ")}.`),process.exit(1)),await i(n,e,a,o)}import{existsSync as Tr,readFileSync as ic,statSync as jr}from"fs";import{resolve as sc}from"path";import{KanonakObjectParser as cc,PublisherIndex as Ln,PublisherConfigResolver as lc,formatVersion as Ur,pickHighestDocument as uc}from"@kanonak-protocol/sdk";var qe=class{constructor(e,t,r,o,a,i){this.fileCache=e;this.parser=t;this.publisherIndex=r;this.fetchFn=o;this.handlerRegistry=a;this.repository=i}fileCache;parser;publisherIndex;fetchFn;handlerRegistry;repository;objectParser=new cc;async add(e,t,r){let o=this.tryLoadFromLocalFile(t);if(o){this.fileCache.put(o.publisher,o.packageName,o.version,o.content),await this.deployFromDoc(e,o.doc,o.publisher,o.packageName,o.version,void 0,`local file ${t}`,r);return}let a=q(t);a||(console.error(`Invalid package reference: "${t}"`),console.error(""),console.error("Accepted forms:"),console.error(" publisher/package (install all instances, latest version)"),console.error(" publisher/package@version (install all instances, pinned)"),console.error(" publisher/package/instance (install one instance, latest version)"),console.error(" publisher/package@version/instance (install one instance, pinned)"),console.error(" ./path/to/file.kan.yml (install all instances from a local document)"),console.error(""),console.error("Tip: copy a URI directly from `kanonak "+e.commandName+" search`."),process.exit(1));let{publisher:i,packageName:s,version:c,instanceName:l}=a,f=await this.repository.getDocumentsByNamespaceAsync(i,s);if(f.length>0){let k=uc(f,{requestedVersion:c??void 0});if(k.chosen){let w=k.chosen.metadata.namespace_;(!w||!w.version)&&(console.error(`Document for ${i}/${s} is missing namespace metadata.`),process.exit(1));let g=Ur(w.version);this.fileCache.put(i,s,g,this.parser.save(k.chosen)),await this.deployFromDoc(e,k.chosen,i,s,g,l??void 0,`${i}/${s}@${g}`,r);return}}let m=c??await this.publisherIndex.getHighestVersion(i,s);m||(console.error(`Could not resolve version for "${i}/${s}".`),await this.printPackageSuggestions(i,s,e.commandName),process.exit(1));let p=this.fileCache.get(i,s,m);if(!p){let k=await this.publisherIndex.getPackageUrl(i,s,m),w=await this.fetchFn(k,i);w.ok||(w.status===404?(console.error(`Package ${i}/${s}@${m} not found at ${k}.`),console.error(`The publisher index lists this version but the file is missing \u2014 it may have been unpublished. Try \`kanonak ${e.commandName} search\` to see the current catalogue.`)):console.error(`Failed to fetch ${k} (${w.status} ${w.statusText}).`),process.exit(1)),p=await w.text(),this.fileCache.put(i,s,m,p)}await this.deployFromDoc(e,this.parser.parse(p),i,s,m,l??void 0,`${i}/${s}@${m}`,r)}tryLoadFromLocalFile(e){if(!(/^[.\/\\]/.test(e)||/^[A-Za-z]:[\\/]/.test(e)||e.endsWith(".kan.yml")||Tr(e)&&jr(e).isFile()))return;let r=sc(e);(!Tr(r)||!jr(r).isFile())&&(console.error(`Local file not found: ${e}`),process.exit(1));let o=ic(r,"utf-8"),a=this.parser.parse(o),i=a.metadata.namespace_;return(!i||!i.version)&&(console.error(`${e} has no namespace metadata; cannot determine publisher/package/version. A Kanonak document must declare \`type: Package\` with publisher and version.`),process.exit(1)),{doc:a,content:o,publisher:i.publisher,packageName:i.package_,version:Ur(i.version)}}async deployFromDoc(e,t,r,o,a,i,s,c){let l=new E(t,this.repository),f=await this.objectParser.parseKanonaks(l),m=Or(e.managesTypeKey);m||(console.error(`Capability "${e.commandName}" has no resolved managesType.`),process.exit(1));let p=C(f,m);p.length===0&&(console.error(`${s} does not contain any ${H(m)} instances.`),process.exit(1));let k=p;if(i&&(k=p.filter(y=>y.name===i),k.length===0)){console.error(`Instance "${i}" not found in ${s}.`),console.error(""),console.error(`Available ${H(m)} instance(s):`);for(let y of p)console.error(` - ${y.name}`);console.error(""),console.error("To install all of them, drop the instance suffix:"),console.error(` kanonak ${e.commandName} add ${r}/${o}`),process.exit(1)}let w=i?`${i} from ${s}`:`${k.length} ${H(m)} instance(s) from ${s}`;console.log(`Installing ${w}...`);let g=this.handlerRegistry.get(e.deploymentTargetKey);g?await g.deploy({instances:k,allKanonaks:f,repository:this.repository,options:c}):console.log(`Cached ${r}/${o}@${a} (no deployment handler for "${e.deploymentTargetKey}")`)}async printPackageSuggestions(e,t,r){let o;try{o=await this.publisherIndex.listLatestPackages(e)}catch{return}let a=o.map(i=>({name:i.packageName,version:i.version,score:dc(t,i.packageName)})).filter(i=>i.score>0).sort((i,s)=>s.score-i.score).slice(0,5);if(a.length!==0){console.error(""),console.error("Did you mean one of:");for(let i of a)console.error(` kanonak ${r} add ${e}/${i.name}`)}}async remove(e,t,r){await this.requireHandler(e).undeploy(t,{repository:this.repository,options:r})}async list(e,t){let o=await this.requireHandler(e).list({repository:this.repository,options:t}),a=e.managesTypeKey||"managed";if(o.length===0){console.log(`No ${a} instances installed.`);return}console.log(`Installed ${a} instances:
188
188
  `);for(let i of o){let s=i.publisher?`${i.publisher}/${i.package_}@${i.version}`:"unmanaged";console.log(` ${i.name} (${s}) ${i.path}`)}}async update(e,t,r){let a=await this.requireHandler(e).list({repository:this.repository,options:r}),i=t?a.filter(c=>c.name===t):a.filter(c=>c.publisher);if(i.length===0){console.log(t?`"${t}" not found.`:"No managed instances to update.");return}let s=0;for(let c of i){let l=await this.publisherIndex.getHighestVersion(c.publisher,c.package_);!l||l===c.version||(console.log(`Updating ${c.name}: ${c.version} \u2192 ${l}`),await this.add(e,`${c.publisher}/${c.package_}@${l}`,r),s++)}console.log(s===0?"All instances are up to date.":`
189
- Updated ${s} instance(s).`)}async search(e,t){let r=t.publisher??"kanonak.org",o=Ur(e.managesTypeKey);if(!o){console.error("Capability has no resolved managesType; nothing to search for.");return}console.log(`Searching ${r} for ${B(o)} instances...
190
- `);let a=new lc,i=await a.getConfig(r),s=a.resolveIndexUrl(r,i),c=await this.fetchFn(s,r);if(!c.ok){console.error(`Failed to fetch package index from ${r}.`);return}let l=await c.text(),d=Fn.parseIndex(l);if(d.size===0){console.error(`No packages found for publisher "${r}".`);return}let f=new Map;for(let[g,y]of d){let h=[...y].sort((w,$)=>{let S=Fn.parseVersion(w),D=Fn.parseVersion($);return!S||!D?0:S.major!==D.major?D.major-S.major:S.minor!==D.minor?D.minor-S.minor:D.patch-S.patch});f.set(g,h[0])}let p=[],k=0;for(let[g,y]of f){let h=this.fileCache.get(r,g,y);if(!h)try{let w=await this.publisherIndex.getPackageUrl(r,g,y),$=await this.fetchFn(w,r);if(!$.ok)continue;h=await $.text(),this.fileCache.put(r,g,y,h)}catch{continue}try{let w=this.parser.parse(h),$=new E(w,this.repository),S=await this.objectParser.parseKanonaks($),D=C(S,o);for(let T of D)p.push({publisher:r,package_:g,version:y,subject:T});k++}catch{continue}}if(p.length===0){console.log(`No ${B(o)} instances found across ${k} package(s).`);return}console.log(`Found ${p.length} ${B(o)} instance(s) in ${k} package(s):
191
- `);let b=new Map;for(let g of p){let y=`${g.publisher}/${g.package_}@${g.version}`,h=b.get(y);h?h.push(g):b.set(y,[g])}for(let[g,y]of b){let h=y[0],w=`${h.publisher}/${h.package_}`,$=y.length===1;console.log(` ${g}`),console.log(` ${y.length} skill${$?"":"s"}:`);for(let S of y)console.log(` - ${S.subject.name}`);if(console.log(""),$)console.log(" install:"),console.log(` kanonak ${e.commandName} add ${w}/${h.subject.name}`);else{console.log(" install one of them:");for(let S of y)console.log(` kanonak ${e.commandName} add ${w}/${S.subject.name}`);console.log(" install all of them:"),console.log(` kanonak ${e.commandName} add ${w}`)}console.log("")}}async info(e,t,r){let i=(await this.requireHandler(e).list({repository:this.repository,options:r})).find(s=>s.name===t);i||(console.error(`"${t}" is not installed.`),process.exit(1)),console.log(`Name: ${i.name}`),console.log(`Type: ${e.managesTypeKey||"n/a"}`),console.log(`Publisher: ${i.publisher||"unmanaged"}`),console.log(`Package: ${i.package_||"n/a"}`),console.log(`Version: ${i.version||"n/a"}`),console.log(`Path: ${i.path}`)}requireHandler(e){let t=this.handlerRegistry.get(e.deploymentTargetKey);return t||(console.error(`No deployment handler registered for "${e.deploymentTargetKey}". Ensure the capability's deploymentTarget resolves to a DeploymentTarget instance whose URI is registered in the CLI at startup.`),process.exit(1)),t}};function Ur(n){if(!n)return;let e=n.split("/");if(e.length===3)return{publisher:e[0],package_:e[1],name:e[2]}}function dc(n,e){let t=n.toLowerCase(),r=e.toLowerCase();if(t===r)return 100;if(r.includes(t)||t.includes(r))return 50;let o=new Set(t.split("-").filter(Boolean)),a=new Set(r.split("-").filter(Boolean)),i=0;for(let c of o)a.has(c)&&i++;if(i>0)return i*10;let s=fc(t,r);return s===0?100:s<=2?Math.max(1,20-s*5):0}function fc(n,e){if(n===e)return 0;if(n.length===0)return e.length;if(e.length===0)return n.length;let t=new Array(e.length+1),r=new Array(e.length+1);for(let o=0;o<=e.length;o++)t[o]=o;for(let o=0;o<n.length;o++){r[0]=o+1;for(let a=0;a<e.length;a++){let i=n[o]===e[a]?0:1;r[a+1]=Math.min(r[a]+1,t[a+1]+1,t[a]+i)}for(let a=0;a<=e.length;a++)t[a]=r[a]}return t[e.length]}var We=class{handlers=new Map;register(e,t){this.handlers.set(e,t)}get(e){return this.handlers.get(e)??null}};import{mkdirSync as vc,rmSync as Pc,existsSync as Xe,readdirSync as Kc,writeFileSync as Dc}from"fs";import{join as Ye}from"path";import{KanonakObjectParser as Ec,KanonakParser as Cc,computeIntegrity as Ac}from"@kanonak-protocol/sdk";import{join as Vn}from"path";import{homedir as Or}from"os";import{KanonakObjectParser as mc}from"@kanonak-protocol/sdk";var te="kanonak.org",re="agent-skills",Nr={publisher:te,package_:re,name:"Client"},Lr={publisher:te,package_:re,name:"clientId"},pc={publisher:te,package_:re,name:"projectSkillDir"},gc={publisher:te,package_:re,name:"userSkillDir"},kc={publisher:te,package_:re,name:"skillFileName"},Fr="agents";async function Ee(n,e){let t=(n.client??Vr()??Fr).toLowerCase(),r=n.scope??"project",o=await Br(t,e);if(!o){let s=await hc(e);throw new Error(`Unknown client "${t}". Known clients: ${s.join(", ")||"(none)"}. Add a Client instance to a package that imports kanonak.org/agent-skills and install that package to make it available.`)}let i=R(o,r==="user"?gc:pc);if(!i)throw new Error(`Client "${t}" has no ${r==="user"?"userSkillDir":"projectSkillDir"} declared.`);return yc(i)}async function Ge(n,e,t){let r=await Ee(e,t);return Vn(r,n)}async function Mn(n,e){let t=(n.client??Vr()??Fr).toLowerCase(),r=await Br(t,e);return r?R(r,kc)??"SKILL.md":"SKILL.md"}function Vr(){if(process.env.CLAUDE_CODE||process.env.CLAUDE_PROJECT_DIR)return"claude-code"}var xr=new WeakMap;async function Mr(n){let e=xr.get(n);if(e)return e;let t=await n.getDocumentsByNamespaceAsync(te,re);if(t.length===0)throw new Error(`Could not find ${te}/${re} in the repository. Install a skill capability (which transitively imports agent-skills) or fetch agent-skills directly to populate the cache.`);let o=[...t].sort((c,l)=>{let d=c.metadata.namespace_?.version,f=l.metadata.namespace_?.version;return!d||!f?0:d.major!==f.major?f.major-d.major:d.minor!==f.minor?f.minor-d.minor:f.patch-d.patch})[0],a=new mc,i=new E(o,n),s=await a.parseKanonaks(i);return xr.set(n,s),s}async function Br(n,e){let t=await Mr(e),r=C(t,Nr);for(let o of r)if(R(o,Lr)===n)return o}async function hc(n){let e=await Mr(n),t=C(e,Nr),r=[];for(let o of t){let a=R(o,Lr);a&&r.push(a)}return r}function yc(n){return n.startsWith("~/")?Vn(Or(),n.slice(2)):n==="~"?Or():n.startsWith("/")||/^[A-Za-z]:[\\/]/.test(n)?n:Vn(process.cwd(),n)}import{readFileSync as bc,writeFileSync as wc,existsSync as $c}from"fs";import{join as Hr}from"path";import zr from"js-yaml";var qr="skills.lock",Sc=`# This file is generated by Kanonak CLI. Do not edit manually.
192
- `;function Je(n){let e=Hr(n,qr);if(!$c(e))return{version:"1",lastUpdated:new Date().toISOString(),skills:{}};let t=bc(e,"utf-8"),r=zr.load(t);return!r||typeof r!="object"||r.version!=="1"?{version:"1",lastUpdated:new Date().toISOString(),skills:{}}:{version:"1",lastUpdated:r.lastUpdated??new Date().toISOString(),skills:r.skills??{}}}function Bn(n,e){e.lastUpdated=new Date().toISOString();let t={};for(let a of Object.keys(e.skills).sort())t[a]=e.skills[a];e.skills=t;let r=Hr(n,qr),o=zr.dump(e,{lineWidth:-1,sortKeys:!1,quotingType:'"'});wc(r,Sc+o,"utf-8")}var Wr="kanonak.org",Gr="skill-to-skill-md",Ze=class{parser=new Cc;objectParser=new Ec;runner=new M;async deploy(e){let{instances:t,allKanonaks:r,repository:o,options:a}=e;if(t.length===0){console.error("No Skill instances to deploy.");return}let i=await Rc(o,this.objectParser);if(!i){console.error(`Cannot deploy: ${Wr}/${Gr}@3.0.0 is not installed in the workspace or cache.`);return}let s=await this.runner.run({transformation:i,instances:t,allKanonaks:r,repository:o,parser:this.parser,objectParser:this.objectParser,outputFormat:"markdown-with-frontmatter"});if(s.length===0){console.error("No skills could be transformed from the package.");return}let c=await Ee(a,o),l=await Mn(a,o),d=Je(c),f=t[0].namespace,{publisher:p,package_:k,version:b}=_c(f);for(let g of s){let y=await Ge(g.fileName,a,o),h=Xe(Ye(y,l));vc(y,{recursive:!0}),Dc(Ye(y,l),g.content,"utf-8"),d.skills[g.fileName]={publisher:p,package_:k,version:b,resolved:p?`kanonak://${p}/${k}@${b}`:"",integrity:Ac(g.content)},console.log(` ${h?"Updated":"Installed"} skill "${g.fileName}" \u2192 ${y}`)}Bn(c,d)}async undeploy(e,t){let{repository:r,options:o}=t,a=await Ge(e,o,r);Xe(a)||(console.error(`Skill "${e}" is not installed at ${a}`),process.exit(1)),Pc(a,{recursive:!0,force:!0});let i=await Ee(o,r),s=Je(i);delete s.skills[e],Bn(i,s),console.log(`Removed skill "${e}" from ${a}`)}async list(e){let{repository:t,options:r}=e,o=await Ee(r,t),a=Je(o),i=[];for(let[c,l]of Object.entries(a.skills))i.push({name:c,publisher:l.publisher,package_:l.package_,version:l.version,path:await Ge(c,r,t)});let s=await Mn(r,t);if(Xe(o))try{let c=Kc(o,{withFileTypes:!0});for(let l of c){if(!l.isDirectory()||a.skills[l.name])continue;let d=Ye(o,l.name,s);Xe(d)&&i.push({name:l.name,publisher:"",package_:"",version:"",path:Ye(o,l.name)})}}catch{}return i}};async function Rc(n,e){let t=await n.getDocumentsByNamespaceAsync(Wr,Gr);if(t.length===0)return;let r=new E(t[0],n),o=await e.parseKanonaks(r);return C(o,u.InstanceTransformation)[0]}function _c(n){if(!n)return{publisher:"",package_:"",version:""};let e=n.indexOf("@");if(e===-1)return{publisher:"",package_:"",version:""};let t=n.substring(0,e),r=n.substring(e+1),o=t.indexOf("/");return o===-1?{publisher:"",package_:"",version:""}:{publisher:t.substring(0,o),package_:t.substring(o+1),version:r}}import{mkdirSync as zc,rmSync as qc,existsSync as zn,readdirSync as Wc,writeFileSync as Gc,statSync as Jc}from"fs";import{join as nn}from"path";import{KanonakObjectParser as Xc,KanonakParser as Yc,computeIntegrity as Zc}from"@kanonak-protocol/sdk";import{join as Jr}from"path";import{homedir as Xr}from"os";import{KanonakObjectParser as Ic}from"@kanonak-protocol/sdk";var oe="kanonak.org",ae="agent-skills",Zr={publisher:oe,package_:ae,name:"Client"},Qr={publisher:oe,package_:ae,name:"clientId"},Tc={publisher:oe,package_:ae,name:"projectAgentDir"},jc={publisher:oe,package_:ae,name:"userAgentDir"},Uc={publisher:oe,package_:ae,name:"agentFileFormat"},Oc="agents";function xc(){if(process.env.CLAUDE_CODE||process.env.CLAUDE_PROJECT_DIR)return"claude-code"}async function Qe(n,e){let t=(n.client??xc()??Oc).toLowerCase(),r=n.scope??"project",o=await Nc(t,e);if(!o){let d=await Lc(e);throw new Error(`Unknown client "${t}". Known clients: ${d.join(", ")||"(none)"}. Add a Client instance to a package that imports kanonak.org/agent-skills and install that package to make it available.`)}let i=R(o,r==="user"?jc:Tc);if(!i)throw new Error(`Client "${t}" has no ${r==="user"?"userAgentDir":"projectAgentDir"} declared.`);let c=ue(o,Uc)?.name==="toml"?"toml":"markdown-frontmatter",l=c==="toml"?".toml":".md";return{agentsDir:Fc(i),format:c,fileExtension:l}}var Yr=new WeakMap;async function eo(n){let e=Yr.get(n);if(e)return e;let t=await n.getDocumentsByNamespaceAsync(oe,ae);if(t.length===0)throw new Error(`Could not find ${oe}/${ae} in the repository. Install a capability that imports agent-skills to populate the cache.`);let o=[...t].sort((c,l)=>{let d=c.metadata.namespace_?.version,f=l.metadata.namespace_?.version;return!d||!f?0:d.major!==f.major?f.major-d.major:d.minor!==f.minor?f.minor-d.minor:f.patch-d.patch})[0],a=new Ic,i=new E(o,n),s=await a.parseKanonaks(i);return Yr.set(n,s),s}async function Nc(n,e){let t=await eo(e),r=C(t,Zr);for(let o of r)if(R(o,Qr)===n)return o}async function Lc(n){let e=await eo(n),t=C(e,Zr),r=[];for(let o of t){let a=R(o,Qr);a&&r.push(a)}return r}function Fc(n){return n.startsWith("~/")?Jr(Xr(),n.slice(2)):n==="~"?Xr():n.startsWith("/")||/^[A-Za-z]:[\\/]/.test(n)?n:Jr(process.cwd(),n)}import{readFileSync as Vc,writeFileSync as Mc,existsSync as Bc}from"fs";import{join as no}from"path";import to from"js-yaml";var ro="agents.lock",Hc=`# This file is generated by Kanonak CLI. Do not edit manually.
193
- `;function en(n){let e=no(n,ro);if(!Bc(e))return{version:"1",lastUpdated:new Date().toISOString(),agents:{}};let t=Vc(e,"utf-8"),r=to.load(t);return!r||typeof r!="object"||r.version!=="1"?{version:"1",lastUpdated:new Date().toISOString(),agents:{}}:{version:"1",lastUpdated:r.lastUpdated??new Date().toISOString(),agents:r.agents??{}}}function Hn(n,e){e.lastUpdated=new Date().toISOString();let t={};for(let a of Object.keys(e.agents).sort())t[a]=e.agents[a];e.agents=t;let r=no(n,ro),o=to.dump(e,{lineWidth:-1,sortKeys:!1,quotingType:'"'});Mc(r,Hc+o,"utf-8")}var oo="kanonak.org",ao="agent-to-agent-file",tn=class{parser=new Yc;objectParser=new Xc;runner=new M;async deploy(e){let{instances:t,allKanonaks:r,repository:o,options:a}=e;if(t.length===0){console.error("No Agent instances to deploy.");return}let{agentsDir:i,format:s,fileExtension:c}=await Qe(a,o),l=await Qc(o,this.objectParser);if(!l){console.error(`Cannot deploy: ${oo}/${ao}@3.0.0 is not installed in the workspace or cache.`);return}let d=s==="toml"?"toml":"markdown-with-frontmatter",f=await this.runner.run({transformation:l,instances:t,allKanonaks:r,repository:o,parser:this.parser,objectParser:this.objectParser,outputFormat:d});if(f.length===0){console.error("No agents could be transformed from the package.");return}zc(i,{recursive:!0});let p=en(i),k=t[0].namespace,{publisher:b,package_:g,version:y}=nl(k);for(let h of f){let w=`${h.fileName}${c}`,$=nn(i,w),S=zn($);Gc($,h.content,"utf-8"),p.agents[h.fileName]={publisher:b,package_:g,version:y,resolved:b?`kanonak://${b}/${g}@${y}`:"",integrity:Zc(h.content),fileName:w},console.log(` ${S?"Updated":"Installed"} agent "${h.fileName}" \u2192 ${$}`)}Hn(i,p)}async undeploy(e,t){let{repository:r,options:o}=t,{agentsDir:a}=await Qe(o,r),i=en(a),s=i.agents[e];s||(console.error(`Agent "${e}" is not installed at ${a}`),process.exit(1));let c=nn(a,s.fileName);zn(c)&&qc(c,{force:!0}),delete i.agents[e],Hn(a,i),console.log(`Removed agent "${e}" from ${c}`)}async list(e){let{repository:t,options:r}=e,{agentsDir:o}=await Qe(r,t),a=en(o),i=[];for(let[s,c]of Object.entries(a.agents))i.push({name:s,publisher:c.publisher,package_:c.package_,version:c.version,path:nn(o,c.fileName)});if(zn(o))try{let s=Wc(o,{withFileTypes:!0});for(let c of s){if(!c.isFile()||c.name==="agents.lock")continue;let l=nn(o,c.name),d=el(c.name);if(!a.agents[d]){try{if(!Jc(l).isFile())continue}catch{continue}i.push({name:d,publisher:"",package_:"",version:"",path:l})}}}catch{}return i}};async function Qc(n,e){let t=await n.getDocumentsByNamespaceAsync(oo,ao);if(t.length===0)return;let r=new E(t[0],n),o=await e.parseKanonaks(r);return C(o,u.InstanceTransformation)[0]}function el(n){let e=n.lastIndexOf(".");return e===-1?n:n.substring(0,e)}function nl(n){if(!n)return{publisher:"",package_:"",version:""};let e=n.indexOf("@");if(e===-1)return{publisher:"",package_:"",version:""};let t=n.substring(0,e),r=n.substring(e+1),o=t.indexOf("/");return o===-1?{publisher:"",package_:"",version:""}:{publisher:t.substring(0,o),package_:t.substring(o+1),version:r}}var dl=al(ol(import.meta.url)),fl=JSON.parse(rl(il(dl,"..","package.json"),"utf-8")),L=new tl;L.name("kanonak").description("Kanonak Protocol CLI - Validate and resolve Kanonak ontology packages").version(fl.version);L.command("validate <path>").description("Validate .kan.yml file(s). Resolves imports via HTTP from publisher domains.").action(async n=>{await Qn(n)});L.command("install [package]").description("Install a package and its dependencies, or install all from kanonak.lock.").action(async n=>{await et(n)});L.command("deps <path>").description("Show resolved dependency tree for a .kan.yml file.").action(async n=>{await tt(n)});L.command("login <publisher>").description("Authenticate with a package publisher using OAuth 2.0.").action(async n=>{await st(n)});L.command("logout <publisher>").description("Revoke tokens and remove stored credentials for a publisher.").action(async n=>{await ct(n)});L.addCommand(vt());L.addCommand(dr());L.addCommand(hr());L.addCommand(Kr());L.addCommand(Ar());async function ml(){try{let n=new V,e=new sl,t=new ll,r=ul(t),o=new cl({fetchFn:r}),a=await j(process.cwd(),e),i=new We;i.register("kanonak.org/capabilities/agent-skill-deployment",new Ze),i.register("kanonak.org/agent-capabilities/agent-instance-deployment",new tn);let s=await wt(n,e,a),c=new qe(n,e,o,r,i,a);_r(L,s,c)}catch{}}await ml();L.parse();
189
+ Updated ${s} instance(s).`)}async search(e,t){let r=t.publisher??"kanonak.org",o=Or(e.managesTypeKey);if(!o){console.error("Capability has no resolved managesType; nothing to search for.");return}console.log(`Searching ${r} for ${H(o)} instances...
190
+ `);let a=new lc,i=await a.getConfig(r),s=a.resolveIndexUrl(r,i),c=await this.fetchFn(s,r);if(!c.ok){console.error(`Failed to fetch package index from ${r}.`);return}let l=await c.text(),f=Ln.parseIndex(l);if(f.size===0){console.error(`No packages found for publisher "${r}".`);return}let m=new Map;for(let[g,y]of f){let h=[...y].sort((b,$)=>{let P=Ln.parseVersion(b),D=Ln.parseVersion($);return!P||!D?0:P.major!==D.major?D.major-P.major:P.minor!==D.minor?D.minor-P.minor:D.patch-P.patch});m.set(g,h[0])}let p=[],k=0;for(let[g,y]of m){let h=this.fileCache.get(r,g,y);if(!h)try{let b=await this.publisherIndex.getPackageUrl(r,g,y),$=await this.fetchFn(b,r);if(!$.ok)continue;h=await $.text(),this.fileCache.put(r,g,y,h)}catch{continue}try{let b=this.parser.parse(h),$=new E(b,this.repository),P=await this.objectParser.parseKanonaks($),D=C(P,o);for(let T of D)p.push({publisher:r,package_:g,version:y,subject:T});k++}catch{continue}}if(p.length===0){console.log(`No ${H(o)} instances found across ${k} package(s).`);return}console.log(`Found ${p.length} ${H(o)} instance(s) in ${k} package(s):
191
+ `);let w=new Map;for(let g of p){let y=`${g.publisher}/${g.package_}@${g.version}`,h=w.get(y);h?h.push(g):w.set(y,[g])}for(let[g,y]of w){let h=y[0],b=`${h.publisher}/${h.package_}`,$=y.length===1;console.log(` ${g}`),console.log(` ${y.length} skill${$?"":"s"}:`);for(let P of y)console.log(` - ${P.subject.name}`);if(console.log(""),$)console.log(" install:"),console.log(` kanonak ${e.commandName} add ${b}/${h.subject.name}`);else{console.log(" install one of them:");for(let P of y)console.log(` kanonak ${e.commandName} add ${b}/${P.subject.name}`);console.log(" install all of them:"),console.log(` kanonak ${e.commandName} add ${b}`)}console.log("")}}async info(e,t,r){let i=(await this.requireHandler(e).list({repository:this.repository,options:r})).find(s=>s.name===t);i||(console.error(`"${t}" is not installed.`),process.exit(1)),console.log(`Name: ${i.name}`),console.log(`Type: ${e.managesTypeKey||"n/a"}`),console.log(`Publisher: ${i.publisher||"unmanaged"}`),console.log(`Package: ${i.package_||"n/a"}`),console.log(`Version: ${i.version||"n/a"}`),console.log(`Path: ${i.path}`)}requireHandler(e){let t=this.handlerRegistry.get(e.deploymentTargetKey);return t||(console.error(`No deployment handler registered for "${e.deploymentTargetKey}". Ensure the capability's deploymentTarget resolves to a DeploymentTarget instance whose URI is registered in the CLI at startup.`),process.exit(1)),t}};function Or(n){if(!n)return;let e=n.split("/");if(e.length===3)return{publisher:e[0],package_:e[1],name:e[2]}}function dc(n,e){let t=n.toLowerCase(),r=e.toLowerCase();if(t===r)return 100;if(r.includes(t)||t.includes(r))return 50;let o=new Set(t.split("-").filter(Boolean)),a=new Set(r.split("-").filter(Boolean)),i=0;for(let c of o)a.has(c)&&i++;if(i>0)return i*10;let s=fc(t,r);return s===0?100:s<=2?Math.max(1,20-s*5):0}function fc(n,e){if(n===e)return 0;if(n.length===0)return e.length;if(e.length===0)return n.length;let t=new Array(e.length+1),r=new Array(e.length+1);for(let o=0;o<=e.length;o++)t[o]=o;for(let o=0;o<n.length;o++){r[0]=o+1;for(let a=0;a<e.length;a++){let i=n[o]===e[a]?0:1;r[a+1]=Math.min(r[a]+1,t[a+1]+1,t[a]+i)}for(let a=0;a<=e.length;a++)t[a]=r[a]}return t[e.length]}var We=class{handlers=new Map;register(e,t){this.handlers.set(e,t)}get(e){return this.handlers.get(e)??null}};import{mkdirSync as vc,rmSync as Pc,existsSync as Xe,readdirSync as Kc,writeFileSync as Dc}from"fs";import{join as Ye}from"path";import{KanonakObjectParser as Ec,KanonakParser as Ac,computeIntegrity as Cc}from"@kanonak-protocol/sdk";import{join as Fn}from"path";import{homedir as Nr}from"os";import{KanonakObjectParser as mc}from"@kanonak-protocol/sdk";var te="kanonak.org",re="agent-skills",Vr={publisher:te,package_:re,name:"Client"},Lr={publisher:te,package_:re,name:"clientId"},pc={publisher:te,package_:re,name:"projectSkillDir"},gc={publisher:te,package_:re,name:"userSkillDir"},kc={publisher:te,package_:re,name:"skillFileName"},Fr="agents";async function Ee(n,e){let t=(n.client??Mr()??Fr).toLowerCase(),r=n.scope??"project",o=await Hr(t,e);if(!o){let s=await hc(e);throw new Error(`Unknown client "${t}". Known clients: ${s.join(", ")||"(none)"}. Add a Client instance to a package that imports kanonak.org/agent-skills and install that package to make it available.`)}let i=R(o,r==="user"?gc:pc);if(!i)throw new Error(`Client "${t}" has no ${r==="user"?"userSkillDir":"projectSkillDir"} declared.`);return yc(i)}async function Ge(n,e,t){let r=await Ee(e,t);return Fn(r,n)}async function Mn(n,e){let t=(n.client??Mr()??Fr).toLowerCase(),r=await Hr(t,e);return r?R(r,kc)??"SKILL.md":"SKILL.md"}function Mr(){if(process.env.CLAUDE_CODE||process.env.CLAUDE_PROJECT_DIR)return"claude-code"}var xr=new WeakMap;async function Br(n){let e=xr.get(n);if(e)return e;let t=await n.getDocumentsByNamespaceAsync(te,re);if(t.length===0)throw new Error(`Could not find ${te}/${re} in the repository. Install a skill capability (which transitively imports agent-skills) or fetch agent-skills directly to populate the cache.`);let o=[...t].sort((c,l)=>{let f=c.metadata.namespace_?.version,m=l.metadata.namespace_?.version;return!f||!m?0:f.major!==m.major?m.major-f.major:f.minor!==m.minor?m.minor-f.minor:m.patch-f.patch})[0],a=new mc,i=new E(o,n),s=await a.parseKanonaks(i);return xr.set(n,s),s}async function Hr(n,e){let t=await Br(e),r=C(t,Vr);for(let o of r)if(R(o,Lr)===n)return o}async function hc(n){let e=await Br(n),t=C(e,Vr),r=[];for(let o of t){let a=R(o,Lr);a&&r.push(a)}return r}function yc(n){return n.startsWith("~/")?Fn(Nr(),n.slice(2)):n==="~"?Nr():n.startsWith("/")||/^[A-Za-z]:[\\/]/.test(n)?n:Fn(process.cwd(),n)}import{readFileSync as wc,writeFileSync as bc,existsSync as $c}from"fs";import{join as zr}from"path";import qr from"js-yaml";var Wr="skills.lock",Sc=`# This file is generated by Kanonak CLI. Do not edit manually.
192
+ `;function Je(n){let e=zr(n,Wr);if(!$c(e))return{version:"1",lastUpdated:new Date().toISOString(),skills:{}};let t=wc(e,"utf-8"),r=qr.load(t);return!r||typeof r!="object"||r.version!=="1"?{version:"1",lastUpdated:new Date().toISOString(),skills:{}}:{version:"1",lastUpdated:r.lastUpdated??new Date().toISOString(),skills:r.skills??{}}}function Bn(n,e){e.lastUpdated=new Date().toISOString();let t={};for(let a of Object.keys(e.skills).sort())t[a]=e.skills[a];e.skills=t;let r=zr(n,Wr),o=qr.dump(e,{lineWidth:-1,sortKeys:!1,quotingType:'"'});bc(r,Sc+o,"utf-8")}var Gr="kanonak.org",Jr="skill-to-skill-md",Ze=class{parser=new Ac;objectParser=new Ec;runner=new B;async deploy(e){let{instances:t,allKanonaks:r,repository:o,options:a}=e;if(t.length===0){console.error("No Skill instances to deploy.");return}let i=await Rc(o,this.objectParser);if(!i){console.error(`Cannot deploy: ${Gr}/${Jr}@3.0.0 is not installed in the workspace or cache.`);return}let s=await this.runner.run({transformation:i,instances:t,allKanonaks:r,repository:o,parser:this.parser,objectParser:this.objectParser,outputFormat:"markdown-with-frontmatter"});if(s.length===0){console.error("No skills could be transformed from the package.");return}let c=await Ee(a,o),l=await Mn(a,o),f=Je(c),m=t[0].namespace,{publisher:p,package_:k,version:w}=_c(m);for(let g of s){let y=await Ge(g.fileName,a,o),h=Xe(Ye(y,l));vc(y,{recursive:!0}),Dc(Ye(y,l),g.content,"utf-8"),f.skills[g.fileName]={publisher:p,package_:k,version:w,resolved:p?`kanonak://${p}/${k}@${w}`:"",integrity:Cc(g.content)},console.log(` ${h?"Updated":"Installed"} skill "${g.fileName}" \u2192 ${y}`)}Bn(c,f)}async undeploy(e,t){let{repository:r,options:o}=t,a=await Ge(e,o,r);Xe(a)||(console.error(`Skill "${e}" is not installed at ${a}`),process.exit(1)),Pc(a,{recursive:!0,force:!0});let i=await Ee(o,r),s=Je(i);delete s.skills[e],Bn(i,s),console.log(`Removed skill "${e}" from ${a}`)}async list(e){let{repository:t,options:r}=e,o=await Ee(r,t),a=Je(o),i=[];for(let[c,l]of Object.entries(a.skills))i.push({name:c,publisher:l.publisher,package_:l.package_,version:l.version,path:await Ge(c,r,t)});let s=await Mn(r,t);if(Xe(o))try{let c=Kc(o,{withFileTypes:!0});for(let l of c){if(!l.isDirectory()||a.skills[l.name])continue;let f=Ye(o,l.name,s);Xe(f)&&i.push({name:l.name,publisher:"",package_:"",version:"",path:Ye(o,l.name)})}}catch{}return i}};async function Rc(n,e){let t=await n.getDocumentsByNamespaceAsync(Gr,Jr);if(t.length===0)return;let r=new E(t[0],n),o=await e.parseKanonaks(r);return C(o,u.InstanceTransformation)[0]}function _c(n){if(!n)return{publisher:"",package_:"",version:""};let e=n.indexOf("@");if(e===-1)return{publisher:"",package_:"",version:""};let t=n.substring(0,e),r=n.substring(e+1),o=t.indexOf("/");return o===-1?{publisher:"",package_:"",version:""}:{publisher:t.substring(0,o),package_:t.substring(o+1),version:r}}import{mkdirSync as zc,rmSync as qc,existsSync as zn,readdirSync as Wc,writeFileSync as Gc,statSync as Jc}from"fs";import{join as nn}from"path";import{KanonakObjectParser as Xc,KanonakParser as Yc,computeIntegrity as Zc}from"@kanonak-protocol/sdk";import{join as Xr}from"path";import{homedir as Yr}from"os";import{KanonakObjectParser as Ic}from"@kanonak-protocol/sdk";var oe="kanonak.org",ae="agent-skills",Qr={publisher:oe,package_:ae,name:"Client"},eo={publisher:oe,package_:ae,name:"clientId"},Tc={publisher:oe,package_:ae,name:"projectAgentDir"},jc={publisher:oe,package_:ae,name:"userAgentDir"},Uc={publisher:oe,package_:ae,name:"agentFileFormat"},Oc="agents";function Nc(){if(process.env.CLAUDE_CODE||process.env.CLAUDE_PROJECT_DIR)return"claude-code"}async function Qe(n,e){let t=(n.client??Nc()??Oc).toLowerCase(),r=n.scope??"project",o=await xc(t,e);if(!o){let f=await Vc(e);throw new Error(`Unknown client "${t}". Known clients: ${f.join(", ")||"(none)"}. Add a Client instance to a package that imports kanonak.org/agent-skills and install that package to make it available.`)}let i=R(o,r==="user"?jc:Tc);if(!i)throw new Error(`Client "${t}" has no ${r==="user"?"userAgentDir":"projectAgentDir"} declared.`);let c=ue(o,Uc)?.name==="toml"?"toml":"markdown-frontmatter",l=c==="toml"?".toml":".md";return{agentsDir:Lc(i),format:c,fileExtension:l}}var Zr=new WeakMap;async function no(n){let e=Zr.get(n);if(e)return e;let t=await n.getDocumentsByNamespaceAsync(oe,ae);if(t.length===0)throw new Error(`Could not find ${oe}/${ae} in the repository. Install a capability that imports agent-skills to populate the cache.`);let o=[...t].sort((c,l)=>{let f=c.metadata.namespace_?.version,m=l.metadata.namespace_?.version;return!f||!m?0:f.major!==m.major?m.major-f.major:f.minor!==m.minor?m.minor-f.minor:m.patch-f.patch})[0],a=new Ic,i=new E(o,n),s=await a.parseKanonaks(i);return Zr.set(n,s),s}async function xc(n,e){let t=await no(e),r=C(t,Qr);for(let o of r)if(R(o,eo)===n)return o}async function Vc(n){let e=await no(n),t=C(e,Qr),r=[];for(let o of t){let a=R(o,eo);a&&r.push(a)}return r}function Lc(n){return n.startsWith("~/")?Xr(Yr(),n.slice(2)):n==="~"?Yr():n.startsWith("/")||/^[A-Za-z]:[\\/]/.test(n)?n:Xr(process.cwd(),n)}import{readFileSync as Fc,writeFileSync as Mc,existsSync as Bc}from"fs";import{join as to}from"path";import ro from"js-yaml";var oo="agents.lock",Hc=`# This file is generated by Kanonak CLI. Do not edit manually.
193
+ `;function en(n){let e=to(n,oo);if(!Bc(e))return{version:"1",lastUpdated:new Date().toISOString(),agents:{}};let t=Fc(e,"utf-8"),r=ro.load(t);return!r||typeof r!="object"||r.version!=="1"?{version:"1",lastUpdated:new Date().toISOString(),agents:{}}:{version:"1",lastUpdated:r.lastUpdated??new Date().toISOString(),agents:r.agents??{}}}function Hn(n,e){e.lastUpdated=new Date().toISOString();let t={};for(let a of Object.keys(e.agents).sort())t[a]=e.agents[a];e.agents=t;let r=to(n,oo),o=ro.dump(e,{lineWidth:-1,sortKeys:!1,quotingType:'"'});Mc(r,Hc+o,"utf-8")}var ao="kanonak.org",io="agent-to-agent-file",tn=class{parser=new Yc;objectParser=new Xc;runner=new B;async deploy(e){let{instances:t,allKanonaks:r,repository:o,options:a}=e;if(t.length===0){console.error("No Agent instances to deploy.");return}let{agentsDir:i,format:s,fileExtension:c}=await Qe(a,o),l=await Qc(o,this.objectParser);if(!l){console.error(`Cannot deploy: ${ao}/${io}@3.0.0 is not installed in the workspace or cache.`);return}let f=s==="toml"?"toml":"markdown-with-frontmatter",m=await this.runner.run({transformation:l,instances:t,allKanonaks:r,repository:o,parser:this.parser,objectParser:this.objectParser,outputFormat:f});if(m.length===0){console.error("No agents could be transformed from the package.");return}zc(i,{recursive:!0});let p=en(i),k=t[0].namespace,{publisher:w,package_:g,version:y}=nl(k);for(let h of m){let b=`${h.fileName}${c}`,$=nn(i,b),P=zn($);Gc($,h.content,"utf-8"),p.agents[h.fileName]={publisher:w,package_:g,version:y,resolved:w?`kanonak://${w}/${g}@${y}`:"",integrity:Zc(h.content),fileName:b},console.log(` ${P?"Updated":"Installed"} agent "${h.fileName}" \u2192 ${$}`)}Hn(i,p)}async undeploy(e,t){let{repository:r,options:o}=t,{agentsDir:a}=await Qe(o,r),i=en(a),s=i.agents[e];s||(console.error(`Agent "${e}" is not installed at ${a}`),process.exit(1));let c=nn(a,s.fileName);zn(c)&&qc(c,{force:!0}),delete i.agents[e],Hn(a,i),console.log(`Removed agent "${e}" from ${c}`)}async list(e){let{repository:t,options:r}=e,{agentsDir:o}=await Qe(r,t),a=en(o),i=[];for(let[s,c]of Object.entries(a.agents))i.push({name:s,publisher:c.publisher,package_:c.package_,version:c.version,path:nn(o,c.fileName)});if(zn(o))try{let s=Wc(o,{withFileTypes:!0});for(let c of s){if(!c.isFile()||c.name==="agents.lock")continue;let l=nn(o,c.name),f=el(c.name);if(!a.agents[f]){try{if(!Jc(l).isFile())continue}catch{continue}i.push({name:f,publisher:"",package_:"",version:"",path:l})}}}catch{}return i}};async function Qc(n,e){let t=await n.getDocumentsByNamespaceAsync(ao,io);if(t.length===0)return;let r=new E(t[0],n),o=await e.parseKanonaks(r);return C(o,u.InstanceTransformation)[0]}function el(n){let e=n.lastIndexOf(".");return e===-1?n:n.substring(0,e)}function nl(n){if(!n)return{publisher:"",package_:"",version:""};let e=n.indexOf("@");if(e===-1)return{publisher:"",package_:"",version:""};let t=n.substring(0,e),r=n.substring(e+1),o=t.indexOf("/");return o===-1?{publisher:"",package_:"",version:""}:{publisher:t.substring(0,o),package_:t.substring(o+1),version:r}}var dl=al(ol(import.meta.url)),fl=JSON.parse(rl(il(dl,"..","package.json"),"utf-8")),L=new tl;L.name("kanonak").description("Kanonak Protocol CLI - Validate and resolve Kanonak ontology packages").version(fl.version);L.command("validate <path>").description("Validate .kan.yml file(s). Resolves imports via HTTP from publisher domains.").action(async n=>{await Qn(n)});L.command("install [package]").description("Install a package and its dependencies, or install all from kanonak.lock.").action(async n=>{await et(n)});L.command("deps <path>").description("Show resolved dependency tree for a .kan.yml file.").action(async n=>{await tt(n)});L.command("login <publisher>").description("Authenticate with a package publisher using OAuth 2.0.").action(async n=>{await st(n)});L.command("logout <publisher>").description("Revoke tokens and remove stored credentials for a publisher.").action(async n=>{await ct(n)});L.addCommand(vt());L.addCommand(fr());L.addCommand(yr());L.addCommand(Dr());L.addCommand(Rr());async function ml(){try{let n=new M,e=new sl,t=new ll,r=ul(t),o=new cl({fetchFn:r}),a=await j(process.cwd(),e),i=new We;i.register("kanonak.org/capabilities/agent-skill-deployment",new Ze),i.register("kanonak.org/agent-capabilities/agent-instance-deployment",new tn);let s=await bt(n,e,a),c=new qe(n,e,o,r,i,a);Ir(L,s,c)}catch{}}await ml();L.parse();
@@ -73,7 +73,7 @@ export interface CompiledFormatOverrideV3 {
73
73
  * doctype + style + metadata <dl>; analogous in other backends). */
74
74
  omitWrapper?: boolean;
75
75
  }
76
- export type CompiledExpressionV3 = CompiledStringLiteralV3 | CompiledIntegerLiteralV3 | CompiledDecimalLiteralV3 | CompiledBooleanLiteralV3 | CompiledVarRefV3 | CompiledPropertyReadV3 | CompiledTraverseV3 | CompiledBuildAstNodeV3 | CompiledWhenV3 | CompiledConcatV3 | CompiledFallbackV3 | CompiledUriNameV3 | CompiledUriPublisherV3 | CompiledUriPackageV3 | CompiledUriVersionV3 | CompiledSubjectUriV3 | CompiledUriLiteralV3 | CompiledDisplayLabelV3 | CompiledResolveRefV3 | CompiledNormalizeV3 | CompiledIsSetV3 | CompiledCallFragmentV3 | CompiledJoinV3 | CompiledCountV3 | CompiledSumV3 | CompiledMinV3 | CompiledMaxV3 | CompiledAverageV3 | CompiledForEachV3 | CompiledListMapV3 | CompiledFilterV3 | CompiledPartitionByV3 | CompiledDistinctByV3 | CompiledAllStatementsV3 | CompiledStatementPredicateV3 | CompiledStatementValueV3 | CompiledDateFormatV3 | CompiledAddV3 | CompiledSubtractV3 | CompiledMultiplyV3 | CompiledDivideV3 | CompiledReverseV3;
76
+ export type CompiledExpressionV3 = CompiledStringLiteralV3 | CompiledIntegerLiteralV3 | CompiledDecimalLiteralV3 | CompiledBooleanLiteralV3 | CompiledVarRefV3 | CompiledPropertyReadV3 | CompiledTraverseV3 | CompiledBuildAstNodeV3 | CompiledWhenV3 | CompiledConcatV3 | CompiledFallbackV3 | CompiledUriNameV3 | CompiledUriPublisherV3 | CompiledUriPackageV3 | CompiledUriVersionV3 | CompiledSubjectUriV3 | CompiledUriLiteralV3 | CompiledDisplayLabelV3 | CompiledResolveRefV3 | CompiledNormalizeV3 | CompiledIsSetV3 | CompiledCallFragmentV3 | CompiledJoinV3 | CompiledCountV3 | CompiledSumV3 | CompiledMinV3 | CompiledMaxV3 | CompiledAverageV3 | CompiledForEachV3 | CompiledListMapV3 | CompiledFilterV3 | CompiledPartitionByV3 | CompiledDistinctByV3 | CompiledAllStatementsV3 | CompiledStatementPredicateV3 | CompiledStatementValueV3 | CompiledDateFormatV3 | CompiledAddV3 | CompiledSubtractV3 | CompiledMultiplyV3 | CompiledDivideV3 | CompiledReverseV3 | CompiledWindowedMapV3 | CompiledPairwiseMapV3 | CompiledScanV3 | CompiledListItemAtV3;
77
77
  export interface CompiledStringLiteralV3 {
78
78
  kind: 'string-literal';
79
79
  value: string;
@@ -205,6 +205,33 @@ export interface CompiledReverseV3 {
205
205
  kind: 'reverse';
206
206
  source: CompiledExpressionV3;
207
207
  }
208
+ export interface CompiledWindowedMapV3 {
209
+ kind: 'windowed-map';
210
+ source: CompiledExpressionV3;
211
+ windowSize: number;
212
+ windowVar: string;
213
+ windowBody: CompiledExpressionV3;
214
+ }
215
+ export interface CompiledPairwiseMapV3 {
216
+ kind: 'pairwise-map';
217
+ source: CompiledExpressionV3;
218
+ firstVar: string;
219
+ secondVar: string;
220
+ pairBody: CompiledExpressionV3;
221
+ }
222
+ export interface CompiledScanV3 {
223
+ kind: 'scan';
224
+ source: CompiledExpressionV3;
225
+ initialState: CompiledExpressionV3;
226
+ stateVar: string;
227
+ elementVar: string;
228
+ accumulate: CompiledExpressionV3;
229
+ }
230
+ export interface CompiledListItemAtV3 {
231
+ kind: 'list-item-at';
232
+ source: CompiledExpressionV3;
233
+ itemIndex: CompiledExpressionV3;
234
+ }
208
235
  export type NormalizeKindV3 = 'trim-end';
209
236
  export interface CompiledNormalizeV3 {
210
237
  kind: 'normalize';
@@ -154,4 +154,19 @@ export declare const TX_V3: {
154
154
  readonly Multiply: EntityUri;
155
155
  readonly Divide: EntityUri;
156
156
  readonly Reverse: EntityUri;
157
+ readonly WindowedMap: EntityUri;
158
+ readonly windowSize: EntityUri;
159
+ readonly windowVar: EntityUri;
160
+ readonly windowBody: EntityUri;
161
+ readonly PairwiseMap: EntityUri;
162
+ readonly firstVar: EntityUri;
163
+ readonly secondVar: EntityUri;
164
+ readonly pairBody: EntityUri;
165
+ readonly Scan: EntityUri;
166
+ readonly initialState: EntityUri;
167
+ readonly stateVar: EntityUri;
168
+ readonly elementVar: EntityUri;
169
+ readonly accumulate: EntityUri;
170
+ readonly ListItemAt: EntityUri;
171
+ readonly itemIndex: EntityUri;
157
172
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kanonak-protocol/cli",
3
- "version": "3.6.0",
3
+ "version": "3.7.0",
4
4
  "description": "Kanonak Protocol CLI - Validate and resolve Kanonak ontology packages",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -34,8 +34,8 @@
34
34
  "semantic-web"
35
35
  ],
36
36
  "dependencies": {
37
- "@kanonak-protocol/sdk": "^3.6.0",
38
- "@kanonak-protocol/types": "^3.6.0",
37
+ "@kanonak-protocol/sdk": "^3.7.0",
38
+ "@kanonak-protocol/types": "^3.7.0",
39
39
  "commander": "^13.0.0",
40
40
  "js-yaml": "^4.1.1"
41
41
  },