@kanonak-protocol/cli 3.9.0 → 3.11.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,27 +1,27 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{Command as ol}from"commander";import{readFileSync as al}from"fs";import{fileURLToPath as il}from"url";import{dirname as sl,join as cl}from"path";import{KanonakParser as ll,PublisherIndex as ul,CredentialStore as dl,createAuthenticatedFetch as fl}from"@kanonak-protocol/sdk";import{readFileSync as Ao,statSync as Co}from"fs";import{resolve as Ro,dirname as _o}from"path";import{KanonakParser as Io,KanonakObjectValidator as To,ValidationSeverity as Qn}from"@kanonak-protocol/sdk";import{readFileSync as bo,readdirSync as $o}from"fs";import{join as vo,dirname as So,basename as Zn}from"path";import{InMemoryKanonakDocumentRepository as Po,FileSystemKanonakDocumentRepository as
|
|
2
|
+
import{Command as ol}from"commander";import{readFileSync as al}from"fs";import{fileURLToPath as il}from"url";import{dirname as sl,join as cl}from"path";import{KanonakParser as ll,PublisherIndex as ul,CredentialStore as dl,createAuthenticatedFetch as fl}from"@kanonak-protocol/sdk";import{readFileSync as Ao,statSync as Co}from"fs";import{resolve as Ro,dirname as _o}from"path";import{KanonakParser as Io,KanonakObjectValidator as To,ValidationSeverity as Qn}from"@kanonak-protocol/sdk";import{readFileSync as bo,readdirSync as $o}from"fs";import{join as vo,dirname as So,basename as Zn}from"path";import{InMemoryKanonakDocumentRepository as Po,FileSystemKanonakDocumentRepository as Eo,HttpKanonakDocumentRepository as Ko,getGlobalCachePath as Do}from"@kanonak-protocol/sdk";import{mkdirSync as po,readFileSync as Xn,writeFileSync as Yn,existsSync as sn,appendFileSync as go}from"fs";import{join as ho,dirname as ko,isAbsolute as yo}from"path";import{getGlobalCachePath as wo}from"@kanonak-protocol/sdk";var M=class{constructor(e=wo()){this.cacheDir=e;this.isProjectLocal=!yo(e)}cacheDir;gitignoreChecked=!1;isProjectLocal;get(e,t,r){let o=this.getPath(e,t,r);return sn(o)?Xn(o,"utf-8"):null}put(e,t,r,o){let a=this.getPath(e,t,r);po(ko(a),{recursive:!0}),Yn(a,o,"utf-8"),this.isProjectLocal&&this.ensureGitignore()}has(e,t,r){return sn(this.getPath(e,t,r))}ensureGitignore(){if(this.gitignoreChecked)return;this.gitignoreChecked=!0;let e=".gitignore",t=this.cacheDir;if(sn(e)){if(Xn(e,"utf-8").split(`
|
|
3
3
|
`).some(o=>o.trim()===t||o.trim()===t+"/"))return;go(e,`
|
|
4
4
|
${t}/
|
|
5
5
|
`)}else Yn(e,`${t}/
|
|
6
|
-
`)}getPath(e,t,r){return ho(this.cacheDir,e,`${t}@${r}.kan.yml`)}};function ye(n){let e=n;for(;;){let t=So(e);if(t===e)break;if(Zn(e).includes(".")||Zn(t).includes(".")){e=t;continue}break}return e}function Ae(n,e){for(let t of $o(n,{withFileTypes:!0})){let r=vo(n,t.name);t.isDirectory()&&t.name!=="node_modules"&&t.name!==".kanonak"?Ae(r,e):t.name.endsWith(".kan.yml")&&e.push(r)}}var cn=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 Po(e);for(let s of t)try{let c=bo(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
|
|
6
|
+
`)}getPath(e,t,r){return ho(this.cacheDir,e,`${t}@${r}.kan.yml`)}};function ye(n){let e=n;for(;;){let t=So(e);if(t===e)break;if(Zn(e).includes(".")||Zn(t).includes(".")){e=t;continue}break}return e}function Ae(n,e){for(let t of $o(n,{withFileTypes:!0})){let r=vo(n,t.name);t.isDirectory()&&t.name!=="node_modules"&&t.name!==".kanonak"?Ae(r,e):t.name.endsWith(".kan.yml")&&e.push(r)}}var cn=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 Po(e);for(let s of t)try{let c=bo(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 Eo(Do(),!0,e),a=new M,i=new Ko({getFromCache:(s,c,l)=>a.get(s,c,l),onFetch:(s,c,l,f)=>a.put(s,c,l,f)});return new cn(r,o,i)}async function et(n){let e=Ro(n),t=Co(e),r=t.isDirectory()?ye(e):ye(_o(e)),o=new Io,a=new To(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=Ao(f,"utf-8"),p=o.parseWithErrors(m);if(p.errors&&p.errors.length>0){console.log(`
|
|
7
7
|
${f}:`);for(let k of p.errors)console.log(` ERROR (parse): ${k.message} [line ${k.line}:${k.column}]`),c++;continue}let h=p.document;if(!h){console.log(`
|
|
8
8
|
${f}:`),console.log(" ERROR: Failed to parse document"),c++;continue}let w=await a.validateAsync(h,i),g=w.errors.filter(k=>k.severity===Qn.Error),y=w.errors.filter(k=>k.severity===Qn.Warning);if(g.length>0||y.length>0){let k=h.metadata.namespace_,$=k?`${k.publisher}/${k.package_}@${k.version}`:f;console.log(`
|
|
9
9
|
${$}:`);for(let S of g)console.log(` ERROR: ${S.message}`),S.suggestion&&console.log(` -> ${S.suggestion}`);for(let S of y)console.log(` WARN: ${S.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 jo,PublisherIndex as Uo,CredentialStore as Oo,createAuthenticatedFetch as Lo}from"@kanonak-protocol/sdk";import{loadLockFile as
|
|
11
|
-
Installed ${Object.keys(i.packages).length} package(s) from lock file.`);return}let s=
|
|
12
|
-
Installed ${h.size} package(s).`)}async function tt(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 h={},w=o.parse(m);if(w.metadata.imports)for(let[g,y]of Object.entries(w.metadata.imports))for(let k of y){let $=await a.resolveVersion(g,k);$?(h[`${g}/${k.packageName}`]=$,await tt(g,k.packageName,$,r,o,a,i,s,c)):console.error(` WARNING: Could not resolve ${g}/${k.packageName} ${k.package_}`)}c.packages[f]={version:t,resolved:p,integrity:Fo(m),dependencies:h}}import{readFileSync as xo}from"fs";import{resolve as Mo,dirname as Bo}from"path";import{KanonakParser as Ho}from"@kanonak-protocol/sdk";async function rt(n){let e=Mo(n),t=xo(e,"utf-8"),r=new Ho,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=ye(Bo(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 ot(f,p,c,l," ")}async function ot(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 ot(c,f,t,r,o+" ")}import{createHash as
|
|
10
|
+
${s.length} file(s) validated. ${c} error(s), ${l} warning(s).`),c>0&&process.exit(1)}import{KanonakParser as jo,PublisherIndex as Uo,CredentialStore as Oo,createAuthenticatedFetch as Lo}from"@kanonak-protocol/sdk";import{loadLockFile as Vo,saveLockFile as No,computeIntegrity as Fo}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 nt(n){let e=new M,t=new jo,r=new Oo,o=Lo(r),a=new Uo({fetchFn:o}),i=Vo()??{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("/"),k=w.substring(0,y),$=w.substring(y+1),S=e.get(k,$,g.version);if(S)console.log(` ${w}@${g.version} (cached)`);else{let P=g.resolved,K=await o(P,k);if(!K.ok)throw new Error(`Failed to fetch ${P} (${K.status} ${K.statusText})`);S=await K.text(),e.put(k,$,g.version,S),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 h=new Set;await tt(c,l,p,e,t,a,o,h,i),No(i),console.log(`
|
|
12
|
+
Installed ${h.size} package(s).`)}async function tt(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 h={},w=o.parse(m);if(w.metadata.imports)for(let[g,y]of Object.entries(w.metadata.imports))for(let k of y){let $=await a.resolveVersion(g,k);$?(h[`${g}/${k.packageName}`]=$,await tt(g,k.packageName,$,r,o,a,i,s,c)):console.error(` WARNING: Could not resolve ${g}/${k.packageName} ${k.package_}`)}c.packages[f]={version:t,resolved:p,integrity:Fo(m),dependencies:h}}import{readFileSync as xo}from"fs";import{resolve as Mo,dirname as Bo}from"path";import{KanonakParser as Ho}from"@kanonak-protocol/sdk";async function rt(n){let e=Mo(n),t=xo(e,"utf-8"),r=new Ho,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=ye(Bo(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 ot(f,p,c,l," ")}async function ot(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 ot(c,f,t,r,o+" ")}import{createHash as qo,randomBytes as st}from"crypto";import{createServer as Wo}from"http";import{execFile as ln}from"child_process";import{CredentialStore as Go,generateDPoPKeyPair as Jo,createDPoPProof as at,serverSupportsDPoP as Xo}from"@kanonak-protocol/sdk";import{normalizeHost as zo}from"@kanonak-protocol/sdk";var Y=class{cache=new Map;async discover(e){let t=zo(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:we(r.issuer),authorizationEndpoint:we(r.authorization_endpoint),tokenEndpoint:we(r.token_endpoint),registrationEndpoint:we(r.registration_endpoint),revocationEndpoint:we(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 we(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 Go}async authorize(e,t=[]){console.log(`Starting OAuth flow for ${e}...`);let r=await this.discovery.discover(e);if(!r)return L(`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 L(`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=Xo(r.dpopSigningAlgValuesSupported),i=null;if(a){console.log(" Server supports DPoP (RFC 9449) \u2014 generating key pair...");try{i=Jo()}catch(
|
|
19
|
-
Ensure your Node.js installation supports EC P-256 curves.`)}}let{redirectUri:s,port:c,waitForCallback:l,close:f}=await ra(),m=await this.credentialStore.getCredential(e),p=m?.clientId??null,h=m?.clientSecret??null;if(!p&&r.registrationEndpoint){console.log(" Registering dynamic OAuth client (RFC 7591)...");let
|
|
18
|
+
Contact the IDP administrator to ensure these are included in the discovery document.`);let a=Xo(r.dpopSigningAlgValuesSupported),i=null;if(a){console.log(" Server supports DPoP (RFC 9449) \u2014 generating key pair...");try{i=Jo()}catch(K){return L(`Failed to generate DPoP key pair: ${se(K)}
|
|
19
|
+
Ensure your Node.js installation supports EC P-256 curves.`)}}let{redirectUri:s,port:c,waitForCallback:l,close:f}=await ra(),m=await this.credentialStore.getCredential(e),p=m?.clientId??null,h=m?.clientSecret??null;if(!p&&r.registrationEndpoint){console.log(" Registering dynamic OAuth client (RFC 7591)...");let K=await this.registerClient(r.registrationEndpoint,s);if(!K.success)return f(),L(K.error);p=K.clientId,h=K.clientSecret??null}if(!p)return f(),L(`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
22
|
or add a registration_endpoint to the OAuth metadata.`);let w=Zo(),g=Qo(w),y=ea(),k=na(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(` ${k}`),aa(k);let $=await l();if(f(),!$)return L(`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(!$.code){let
|
|
24
|
+
Re-run 'kanonak login ${e}' and complete the browser authorization promptly.`);if(!$.code){let K=$.error?`: ${$.error}`:"";return L(`No authorization code received${K}.
|
|
25
25
|
The IDP may have rejected the authorization request.
|
|
26
26
|
Check the IDP admin console for error details.`)}if($.state!==y)return L(`Authorization state mismatch \u2014 possible CSRF attack.
|
|
27
27
|
The response did not match the expected session.
|
|
@@ -44,7 +44,7 @@ Installed ${h.size} package(s).`)}async function tt(n,e,t,r,o,a,i,s,c){let l=`${
|
|
|
44
44
|
Ensure the token endpoint is reachable.`}}if(!f.ok){let m=await un(f),p=Yo(m);return{success:!1,error:`Token exchange failed.
|
|
45
45
|
Endpoint: ${e}
|
|
46
46
|
HTTP ${f.status}: ${m}`+(p?`
|
|
47
|
-
${p}`:"")}}return{success:!0,tokens:it(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=at(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 un(c);return{success:!1,error:`Token refresh failed \u2014 HTTP ${c.status}: ${l}`}}return{success:!0,tokens:it(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 L(n){return{success:!1,error:n}}function it(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 un(n){try{return await n.text()}catch{return"(could not read response body)"}}function Yo(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 Zo(){return st(32).toString("base64url")}function Qo(n){return
|
|
47
|
+
${p}`:"")}}return{success:!0,tokens:it(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=at(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 un(c);return{success:!1,error:`Token refresh failed \u2014 HTTP ${c.status}: ${l}`}}return{success:!0,tokens:it(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 L(n){return{success:!1,error:n}}function it(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 un(n){try{return await n.text()}catch{return"(could not read response body)"}}function Yo(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 Zo(){return st(32).toString("base64url")}function Qo(n){return qo("sha256").update(n).digest("base64url")}function ea(){return st(16).toString("base64url")}function na(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 ta=300*1e3;async function ra(){return new Promise(n=>{let e=Wo((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?oa(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()},ta)});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 oa(n){return n.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function aa(n){try{process.platform==="win32"?ln("cmd",["/c","start","",n]):process.platform==="darwin"?ln("open",[n]):ln("xdg-open",[n])}catch{console.log(" Could not open browser automatically. Please navigate to the URL above manually.")}}import{CredentialStore as ia}from"@kanonak-protocol/sdk";async function ct(n){try{let e=new Y,t=new ia,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(`
|
|
@@ -54,21 +54,21 @@ If this persists, see https://github.com/kanonak-protocol for support channels.`
|
|
|
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 La}from"commander";import{KanonakParser as
|
|
58
|
-
`;function dt(){let n=fa();return da(n,"..","capabilities.lock")}function le(){let n=dt();if(!ua(n))return{version:"1",lastUpdated:new Date().toISOString(),capabilities:{}};let e=ca(n,"utf-8"),t=ut.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=ut.dump(n,{lineWidth:-1,sortKeys:!1,quotingType:'"'});la(dt(),ma+t,"utf-8")}var D=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 ba,readdirSync as $a,readFileSync as va}from"fs";import{join as pt}from"path";import{KanonakObjectParser as Sa,EmbeddedKanonak as yt,ReferenceKanonak as wt,getGlobalCachePath as Pa}from"@kanonak-protocol/sdk";import{SubjectKanonak as ft,DefinedKanonak as pa,StringStatement as ga,NumberStatement as ha,BooleanStatement as ka,ReferenceStatement as mt,EmbeddedStatement as hu,ListStatement as ya}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 pa))return!1;for(let t of n.statement)if(t.predicate?.subject?.name==="type"&&t instanceof mt){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 ft&&v(r,e)&&t.push(r);return t}function $e(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 ft)||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 dn(n,e){for(let t of n.statement){let r=t.predicate;if(r?.subject&&U(r.subject,e))return t}}function wa(n,e){let t=dn(n,e);if(t&&(t instanceof ga||t instanceof ha||t instanceof ka))return t.object}function R(n,e){let t=wa(n,e);return typeof t=="string"?t:void 0}function ue(n,e){let t=dn(n,e);if(t instanceof mt)return t.object.subject}function fn(n,e){let t=dn(n,e);return t instanceof ya?t.object??[]:[]}var _="kanonak.org",I="capabilities",mn={publisher:_,package_:I,name:"Capability"},
|
|
59
|
-
Installed capability "${P}".`),console.log(`Run "kanonak ${P} --help" to get started.`)}async function
|
|
60
|
-
`);for(let[t,r]of e)console.log(` ${t} ${r.publisher}/${r.package_}@${r.version}`)}import{Command as
|
|
57
|
+
${t}`),process.exit(1)}}import{Command as La}from"commander";import{KanonakParser as Va,KanonakObjectParser as Na,PublisherIndex as Fa,CredentialStore as xa,createAuthenticatedFetch as Ma,computeIntegrity as Ba}from"@kanonak-protocol/sdk";import{readFileSync as ca,writeFileSync as la,existsSync as ua}from"fs";import{join as da}from"path";import ut from"js-yaml";import{getGlobalCachePath as fa}from"@kanonak-protocol/sdk";var ma=`# This file is generated by Kanonak CLI. Do not edit manually.
|
|
58
|
+
`;function dt(){let n=fa();return da(n,"..","capabilities.lock")}function le(){let n=dt();if(!ua(n))return{version:"1",lastUpdated:new Date().toISOString(),capabilities:{}};let e=ca(n,"utf-8"),t=ut.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=ut.dump(n,{lineWidth:-1,sortKeys:!1,quotingType:'"'});la(dt(),ma+t,"utf-8")}var D=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 ba,readdirSync as $a,readFileSync as va}from"fs";import{join as pt}from"path";import{KanonakObjectParser as Sa,EmbeddedKanonak as yt,ReferenceKanonak as wt,getGlobalCachePath as Pa}from"@kanonak-protocol/sdk";import{SubjectKanonak as ft,DefinedKanonak as pa,StringStatement as ga,NumberStatement as ha,BooleanStatement as ka,ReferenceStatement as mt,EmbeddedStatement as hu,ListStatement as ya}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 pa))return!1;for(let t of n.statement)if(t.predicate?.subject?.name==="type"&&t instanceof mt){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 ft&&v(r,e)&&t.push(r);return t}function $e(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 ft)||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 dn(n,e){for(let t of n.statement){let r=t.predicate;if(r?.subject&&U(r.subject,e))return t}}function wa(n,e){let t=dn(n,e);if(t&&(t instanceof ga||t instanceof ha||t instanceof ka))return t.object}function R(n,e){let t=wa(n,e);return typeof t=="string"?t:void 0}function ue(n,e){let t=dn(n,e);if(t instanceof mt)return t.object.subject}function fn(n,e){let t=dn(n,e);return t instanceof ya?t.object??[]:[]}var _="kanonak.org",I="capabilities",mn={publisher:_,package_:I,name:"Capability"},Ea={publisher:_,package_:I,name:"commandName"},bt={publisher:_,package_:I,name:"description"},Ka={publisher:_,package_:I,name:"managesType"},Da={publisher:_,package_:I,name:"deploymentTarget"},Aa={publisher:_,package_:I,name:"hasCommand"},Ca={publisher:_,package_:I,name:"subcommandName"},Ra={publisher:_,package_:I,name:"performs"},_a={publisher:_,package_:I,name:"hasArgument"},Ia={publisher:_,package_:I,name:"argumentName"},gt={publisher:_,package_:I,name:"isRequired"},ht={publisher:_,package_:I,name:"isOption"},Ta={publisher:_,package_:I,name:"defaultValue"};async function $t(n,e,t){let r=le(),o=new Sa,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 ja(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 D(m,t),h=await o.parseKanonaks(p),w=vt(h,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&&be(r),a}async function ja(n,e,t,r,o){let a=pt(Pa(),e.publisher);if(!ba(a))return;let i=[];for(let s of $a(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=va(pt(a,s),"utf-8")}catch{continue}let h;try{let w=t.parse(p),g=new D(w,o),y=await r.parseKanonaks(g);h=vt(y,e.publisher,f,m)?.commandName}catch{continue}h===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 vt(n,e,t,r){let o=C(n,mn);if(o.length===0)return;let a=o[0],i=R(a,Ea)??"",s=R(a,bt)??"",c=ue(a,Ka),l=ue(a,Da),f=[];for(let m of fn(a,Aa)){let p=Ua(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 Ua(n,e){let t;if(n instanceof yt)t=n;else if(n instanceof wt){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,bt)??"",a=ue(t,Ra),i=fn(t,_a),s=[];for(let c of i){let l=Oa(c,e);l&&s.push(l)}return{subcommandName:r,description:o,arguments:s,actionKey:a?H(a):""}}function Oa(n,e){let t;if(n instanceof yt)t=n;else if(n instanceof wt){let c=St(e,n.subject.publisher,n.subject.package_,n.subject.name);c&&(t=c)}if(!t)return;let r=R(t,Ia)??"",o=R(t,gt)==="true"||kt(t,gt)===!0,a=R(t,ht)==="true"||kt(t,ht)===!0,i=R(t,Ta),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 Ha={publisher:_,package_:I,name:"commandName"};function Pt(){let n=new La("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 za(e)}),n.command("remove <name>").description("Remove an installed capability").action(async e=>{await qa(e)}),n.command("list").description("List installed capabilities").action(async()=>{await Wa()}),n}async function za(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 Va,c=new Na,l=new xa,f=Ma(l),m=new Fa({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 h=i.get(t,r,p);if(!h){let T=await m.getPackageUrl(t,r,p),x=await f(T,t);if(!x.ok)throw new Error(`Failed to fetch ${T} (${x.status} ${x.statusText})`);h=await x.text(),i.put(t,r,p,h)}let w=s.parse(h),g=await j(process.cwd(),s),y=new D(w,g),k=await c.parseKanonaks(y),$=C(k,mn);$.length===0&&(console.error(`Package ${t}/${r}@${p} does not contain a ${_}/${I}/Capability instance.`),process.exit(1));let S=$[0],P=R(S,Ha);P||(console.error(`Capability instance in ${t}/${r}@${p} has no commandName property.`),process.exit(1));let K=le();K.capabilities[P]={publisher:t,package_:r,version:p,resolved:await m.getPackageUrl(t,r,p),integrity:Ba(h)},be(K),console.log(`
|
|
59
|
+
Installed capability "${P}".`),console.log(`Run "kanonak ${P} --help" to get started.`)}async function qa(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 Wa(){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 Ke}from"commander";import{readFileSync as Wi,writeFileSync as Gi,mkdirSync as Ji,existsSync as dr,statSync as Xi}from"fs";import{join as Yi,resolve as Zi}from"path";import{KanonakParser as Cn,KanonakObjectParser as Rn,SubjectKanonak as Qi,Reasoner as es,KanonakVocabulary as ns,makeUriKey as mr,pickHighestDocument as _n,formatVersion as pr}from"@kanonak-protocol/sdk";var Ga="kanonak.org",Ja="transformations";var d=n=>({publisher:Ga,package_:Ja,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"),BinaryComparison:d("BinaryComparison"),compareLeft:d("compareLeft"),compareRight:d("compareRight"),Equals:d("Equals"),GreaterThan:d("GreaterThan"),LessThan:d("LessThan"),GreaterThanOrEqual:d("GreaterThanOrEqual"),LessThanOrEqual:d("LessThanOrEqual"),Not:d("Not"),operand:d("operand"),BooleanLogic:d("BooleanLogic"),operands:d("operands"),And:d("And"),Or:d("Or"),Contains:d("Contains"),haystack:d("haystack"),needle:d("needle"),UnaryNumericOp:d("UnaryNumericOp"),value:d("value"),Abs:d("Abs"),Negate:d("Negate")};import{DefinedKanonak as rr,ReferenceKanonak as or,StringStatement as ar,NumberStatement as ir,BooleanStatement as sr,ReferenceStatement as cr,ListStatement as lr}from"@kanonak-protocol/sdk";var Xa="kanonak.org",Ya="document-ast",E=n=>({publisher:Xa,package_:Ya,name:n}),z={Document:E("Document"),Block:E("Block"),Inline:E("Inline"),StructuredValue:E("StructuredValue"),Heading:E("Heading"),Paragraph:E("Paragraph"),RawBlock:E("RawBlock"),Text:E("Text"),StructuredMap:E("StructuredMap"),StructuredEntry:E("StructuredEntry"),StructuredList:E("StructuredList"),StringScalar:E("StringScalar"),IntegerScalar:E("IntegerScalar"),EscapeHint:E("EscapeHint"),MediaType:E("MediaType"),metadata:E("metadata"),children:E("children"),level:E("level"),inlines:E("inlines"),text:E("text"),entries:E("entries"),key:E("key"),value:E("value"),escapeHint:E("escapeHint"),items:E("items"),stringValue:E("stringValue"),integerValue:E("integerValue"),rawContent:E("rawContent"),mediaType:E("mediaType"),mimeType:E("mimeType"),ESC_RAW:E("esc-raw"),ESC_YAML_SAFE:E("esc-yaml-safe"),ESC_TOML_STRING:E("esc-toml-string"),ESC_TOML_MULTILINE:E("esc-toml-multiline"),ESC_JSON:E("esc-json"),TEXT_PLAIN:E("text-plain"),TEXT_MARKDOWN:E("text-markdown"),TEXT_HTML:E("text-html"),APPLICATION_JSON:E("application-json"),TEXT_YAML:E("text-yaml"),IMAGE_SVG_XML:E("image-svg-xml")};function Et(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=Za(e.metadata,t),o=ni(e.children),i=["---",...r,"---","",o].join(`
|
|
61
61
|
`);return t?.trailingNewline&&(i.endsWith(`
|
|
62
62
|
`)||(i+=`
|
|
63
|
-
`)),i}};function Za(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 Qa(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 Qa(n,e){return!e||
|
|
63
|
+
`)),i}};function Za(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 Qa(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 Qa(n,e){return!e||Et(e,z.ESC_RAW)?n:Et(e,z.ESC_YAML_SAFE)?ei(n):n}function ei(n){return n.includes(`
|
|
64
64
|
`)?`|-
|
|
65
65
|
${n.replace(/\n/g,`
|
|
66
66
|
`).trimEnd()}`:/[:#\[\]{}&*!|>'"%@`,]/.test(n)?`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`:n}function ni(n){let e=[];for(let t of n){let r=ti(t);r&&e.push(r)}return e.join(`
|
|
67
67
|
|
|
68
|
-
`)}function ti(n){switch(n.kind){case"Heading":return`${"#".repeat(n.level)} ${
|
|
68
|
+
`)}function ti(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 ri(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=oi(e.metadata,t).join(`
|
|
69
69
|
`);return t?.trailingNewline&&(o.endsWith(`
|
|
70
70
|
`)||(o+=`
|
|
71
|
-
`)),o}};function oi(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=At(i.value,i.escapeHint);c!==void 0&&o.push(`${s} = ${c}`)}return o}function At(n,e){switch(n.kind){case"StringScalar":return ai(n.stringValue,e);case"IntegerScalar":return String(n.integerValue);case"StructuredList":{let t=[];for(let r of n.items){let o=At(r,e);o!==void 0&&t.push(o)}return`[${t.join(", ")}]`}case"StructuredMap":return;default:return}}function ai(n,e){return e&&ri(e,
|
|
71
|
+
`)),o}};function oi(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=At(i.value,i.escapeHint);c!==void 0&&o.push(`${s} = ${c}`)}return o}function At(n,e){switch(n.kind){case"StringScalar":return ai(n.stringValue,e);case"IntegerScalar":return String(n.integerValue);case"StructuredList":{let t=[];for(let r of n.items){let o=At(r,e);o!==void 0&&t.push(o)}return`[${t.join(", ")}]`}case"StructuredMap":return;default:return}}function ai(n,e){return e&&ri(e,z.ESC_TOML_MULTILINE)?si(n):ii(n)}function ii(n){return`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n")}"`}function si(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+`
|
|
@@ -127,11 +127,11 @@ ${o.join(`
|
|
|
127
127
|
`)}
|
|
128
128
|
</dl>
|
|
129
129
|
`}function jt(n){switch(n.kind){case"StringScalar":return ve(n.stringValue);case"IntegerScalar":return String(n.integerValue);case"StructuredList":{let e=[];for(let t of n.items){let r=jt(t);r!==void 0&&e.push(`<code>${r}</code>`)}return e.join(", ")}case"StructuredMap":return;default:return}}function fi(n){let e=[];for(let t of n){let r=mi(t);r&&e.push(r)}return e.join(`
|
|
130
|
-
`)}function mi(n){switch(n.kind){case"Heading":{let e=Math.max(1,Math.min(6,n.level));return`<h${e}>${Tt(n.inlines)}</h${e}>`}case"Paragraph":return`<p>${Tt(n.inlines)}</p>`;case"RawBlock":return pi(n);default:return""}}function pi(n){let e=n.mediaType;return e&&gn(e,
|
|
130
|
+
`)}function mi(n){switch(n.kind){case"Heading":{let e=Math.max(1,Math.min(6,n.level));return`<h${e}>${Tt(n.inlines)}</h${e}>`}case"Paragraph":return`<p>${Tt(n.inlines)}</p>`;case"RawBlock":return pi(n);default:return""}}function pi(n){let e=n.mediaType;return e&&gn(e,z.TEXT_MARKDOWN)?Rt(n.rawContent):e&&gn(e,z.TEXT_HTML)?n.rawContent:e&&gn(e,z.IMAGE_SVG_XML)?`<figure class="svg-figure">
|
|
131
131
|
${n.rawContent}
|
|
132
|
-
</figure>`:`<pre${e?` class="media-${gi(e.name)}"`:""}><code>${ve(n.rawContent)}</code></pre>`}function Tt(n){let e=[];for(let t of n)t.kind==="Text"&&e.push(ve(t.text));return e.join("")}function ve(n){return n.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function gi(n){return n.replace(/"/g,""").replace(/&/g,"&")}function hi(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&&hi(r.mediaType,
|
|
132
|
+
</figure>`:`<pre${e?` class="media-${gi(e.name)}"`:""}><code>${ve(n.rawContent)}</code></pre>`}function Tt(n){let e=[];for(let t of n)t.kind==="Text"&&e.push(ve(t.text));return e.join("")}function ve(n){return n.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function gi(n){return n.replace(/"/g,""").replace(/&/g,"&")}function hi(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&&hi(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 ki}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=$e(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 h=p.metadata?.namespace_?.version;return h&&h.major===o.major&&h.minor===o.minor&&h.patch===o.patch})??l[0]:l[0],m=new D(f,this.repository);s=await this.objectParser.parseKanonaks(m),this.cache.set(i,s)}let c=$e(s,e);if(c)return c;for(let l of s)if(l instanceof ki&&l.name===e.name)return l}};import{EmbeddedKanonak as Se,ReferenceKanonak as xt,SubjectKanonak as yi,ListStatement as Z,ReferenceStatement as wn,EmbeddedStatement as pe,StringStatement as Mt,NumberStatement as wi,BooleanStatement as bi}from"@kanonak-protocol/sdk";var A=class extends Error{constructor(t,r){super(`${t} (at ${r})`);this.path=r}path},Ut=16;function ge(n,e){let t=n.name,r={catalog:e,depth:0};if(v(n,u.InstanceTransformation))return $i(n,t,r);if(v(n,u.SetTransformation))return vi(n,t,r);throw new A("Subject is not a recognized v3 transformation type \u2014 expected InstanceTransformation or SetTransformation",t)}function $i(n,e,t){return{kind:"instance",name:n.name,inputPattern:Bt(n,e),rule:Oe(n,u.rule,`${e}.rule`,t),artifactName:Oe(n,u.artifactName,`${e}.artifactName`,t),outputs:Ht(n,`${e}.outputs`),overrides:qt(n,`${e}.formatOverrides`,t)}}function vi(n,e,t){let r=Q(n,u.partitionBy);return{kind:"set",name:n.name,inputPattern:Bt(n,e),rule:Oe(n,u.rule,`${e}.rule`,t),artifactName:Oe(n,u.artifactName,`${e}.artifactName`,t),outputs:Ht(n,`${e}.outputs`),overrides:qt(n,`${e}.formatOverrides`,t),partitionBy:r}}function Bt(n,e){let t=Pe(n,u.inputPattern);if(!t)throw new A("inputPattern is required",e);return Si(t,`${e}.inputPattern`)}function Si(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 wn)r.push(yn(i.object.subject));else if(i instanceof Z)for(let s of i.object)s instanceof xt&&r.push(yn(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(Ot(s,`${e}.sortBy[${a++}]`));else i instanceof pe&&o.push(Ot(i.object,`${e}.sortBy[${a++}]`));return{matchesClass:t,requires:r,sortBy:o}}function Ot(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=Pe(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:N(n,u.stringLiteral,e)};if(v(n,u.IntegerLiteral))return{kind:"integer-literal",value:Ft(n,u.integerLiteral,e)};if(v(n,u.DecimalLiteral))return{kind:"decimal-literal",value:Ft(n,u.decimalLiteral,e)};if(v(n,u.BooleanLiteral))return{kind:"boolean-literal",value:_i(n,u.booleanLiteral,e)};if(v(n,u.VarRef))return{kind:"var-ref",varName:N(n,u.varName,e)};if(v(n,u.PropertyRead))return{kind:"property-read",source:b(n,u.readSource,`${e}.readSource`,t),readProp:ne(n,u.readProp,e,"readProp")};if(v(n,u.Traverse))return{kind:"traverse",source:b(n,u.traverseSource,`${e}.traverseSource`,t),through:ne(n,u.through,e,"through"),step:b(n,u.step,`${e}.step`,t)};if(v(n,u.BuildAstNode))return{kind:"build-ast-node",astClass:ne(n,u.astClass,e,"astClass"),set:Ki(n,`${e}.set`,t)};if(v(n,u.When))return{kind:"when",condition:b(n,u.condition,`${e}.condition`,t),thenBuild:b(n,u.thenBuild,`${e}.thenBuild`,t),elseBuild:Pi(n,u.elseBuild,`${e}.elseBuild`,t)};if(v(n,u.Concat))return{kind:"concat",parts:hn(n,u.parts,`${e}.parts`,t)};if(v(n,u.Fallback))return{kind:"fallback",primary:b(n,u.primary,`${e}.primary`,t),alternate:b(n,u.alternate,`${e}.alternate`,t)};if(v(n,u.UriName))return{kind:"uri-name",source:b(n,u.uriNameOf,`${e}.uriNameOf`,t)};if(v(n,u.UriPublisher))return{kind:"uri-publisher",source:b(n,u.uriPublisherOf,`${e}.uriPublisherOf`,t)};if(v(n,u.UriPackage))return{kind:"uri-package",source:b(n,u.uriPackageOf,`${e}.uriPackageOf`,t)};if(v(n,u.UriVersion))return{kind:"uri-version",source:b(n,u.uriVersionOf,`${e}.uriVersionOf`,t)};if(v(n,u.SubjectUri))return{kind:"subject-uri",source:b(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:b(n,u.resolveSource,`${e}.resolveSource`,t)};if(v(n,u.Normalize))return{kind:"normalize",source:b(n,u.normSource,`${e}.normSource`,t),normKind:Ei(n,e)};if(v(n,u.IsSet))return{kind:"is-set",check:b(n,u.checkExpr,`${e}.checkExpr`,t)};if(v(n,u.CallFragment))return Ai(n,e,t);if(v(n,u.Join))return{kind:"join",source:b(n,u.source,`${e}.source`,t),separator:N(n,u.separator,e)};if(v(n,u.Count))return{kind:"count",source:b(n,u.source,`${e}.source`,t)};if(v(n,u.Sum))return{kind:"sum",source:b(n,u.source,`${e}.source`,t)};if(v(n,u.Min))return{kind:"min",source:b(n,u.source,`${e}.source`,t)};if(v(n,u.Max))return{kind:"max",source:b(n,u.source,`${e}.source`,t)};if(v(n,u.Average))return{kind:"average",source:b(n,u.source,`${e}.source`,t)};if(v(n,u.ForEach))return{kind:"for-each",source:b(n,u.source,`${e}.source`,t),loopVar:N(n,u.loopVar,e),emit:b(n,u.emit,`${e}.emit`,t)};if(v(n,u.ListMap))return{kind:"list-map",source:b(n,u.source,`${e}.source`,t),loopVar:N(n,u.loopVar,e),mapBody:b(n,u.mapBody,`${e}.mapBody`,t)};if(v(n,u.Filter))return{kind:"filter",source:b(n,u.source,`${e}.source`,t),loopVar:N(n,u.loopVar,e),predicate:b(n,u.predicate,`${e}.predicate`,t)};if(v(n,u.PartitionBy))return{kind:"partition-by",source:b(n,u.source,`${e}.source`,t),loopVar:N(n,u.loopVar,e),partitionKey:b(n,u.partitionKey,`${e}.partitionKey`,t)};if(v(n,u.DistinctBy))return{kind:"distinct-by",source:b(n,u.source,`${e}.source`,t),loopVar:N(n,u.loopVar,e),distinctKey:b(n,u.distinctKey,`${e}.distinctKey`,t)};if(v(n,u.AllStatements))return{kind:"all-statements",source:b(n,u.statementsOf,`${e}.statementsOf`,t)};if(v(n,u.StatementPredicate))return{kind:"statement-predicate",source:b(n,u.predicateOf,`${e}.predicateOf`,t)};if(v(n,u.StatementValue))return{kind:"statement-value",source:b(n,u.valueOf,`${e}.valueOf`,t)};if(v(n,u.DateFormat))return{kind:"date-format",source:b(n,u.dateSource,`${e}.dateSource`,t),format:Di(n,e)};if(v(n,u.Add))return{kind:"add",left:b(n,u.arithLeft,`${e}.arithLeft`,t),right:b(n,u.arithRight,`${e}.arithRight`,t)};if(v(n,u.Subtract))return{kind:"subtract",left:b(n,u.arithLeft,`${e}.arithLeft`,t),right:b(n,u.arithRight,`${e}.arithRight`,t)};if(v(n,u.Multiply))return{kind:"multiply",left:b(n,u.arithLeft,`${e}.arithLeft`,t),right:b(n,u.arithRight,`${e}.arithRight`,t)};if(v(n,u.Divide))return{kind:"divide",left:b(n,u.arithLeft,`${e}.arithLeft`,t),right:b(n,u.arithRight,`${e}.arithRight`,t)};if(v(n,u.Reverse))return{kind:"reverse",source:b(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:b(n,u.source,`${e}.source`,t),windowSize:r,windowVar:N(n,u.windowVar,e),windowBody:b(n,u.windowBody,`${e}.windowBody`,t)}}if(v(n,u.PairwiseMap))return{kind:"pairwise-map",source:b(n,u.source,`${e}.source`,t),firstVar:N(n,u.firstVar,e),secondVar:N(n,u.secondVar,e),pairBody:b(n,u.pairBody,`${e}.pairBody`,t)};if(v(n,u.Scan))return{kind:"scan",source:b(n,u.source,`${e}.source`,t),initialState:b(n,u.initialState,`${e}.initialState`,t),stateVar:N(n,u.stateVar,e),elementVar:N(n,u.elementVar,e),accumulate:b(n,u.accumulate,`${e}.accumulate`,t)};if(v(n,u.ListItemAt))return{kind:"list-item-at",source:b(n,u.source,`${e}.source`,t),itemIndex:b(n,u.itemIndex,`${e}.itemIndex`,t)};if(v(n,u.Equals))return{kind:"equals",left:b(n,u.compareLeft,`${e}.compareLeft`,t),right:b(n,u.compareRight,`${e}.compareRight`,t)};if(v(n,u.GreaterThan))return{kind:"greater-than",left:b(n,u.compareLeft,`${e}.compareLeft`,t),right:b(n,u.compareRight,`${e}.compareRight`,t)};if(v(n,u.LessThan))return{kind:"less-than",left:b(n,u.compareLeft,`${e}.compareLeft`,t),right:b(n,u.compareRight,`${e}.compareRight`,t)};if(v(n,u.GreaterThanOrEqual))return{kind:"greater-than-or-equal",left:b(n,u.compareLeft,`${e}.compareLeft`,t),right:b(n,u.compareRight,`${e}.compareRight`,t)};if(v(n,u.LessThanOrEqual))return{kind:"less-than-or-equal",left:b(n,u.compareLeft,`${e}.compareLeft`,t),right:b(n,u.compareRight,`${e}.compareRight`,t)};if(v(n,u.Not))return{kind:"not",operand:b(n,u.operand,`${e}.operand`,t)};if(v(n,u.And))return{kind:"and",operands:hn(n,u.operands,`${e}.operands`,t)};if(v(n,u.Or))return{kind:"or",operands:hn(n,u.operands,`${e}.operands`,t)};if(v(n,u.Contains))return{kind:"contains",haystack:b(n,u.haystack,`${e}.haystack`,t),needle:b(n,u.needle,`${e}.needle`,t)};if(v(n,u.Abs))return{kind:"abs",value:b(n,u.value,`${e}.value`,t)};if(v(n,u.Negate))return{kind:"negate",value:b(n,u.value,`${e}.value`,t)};throw new A("Expression is not of a recognized v3 type \u2014 embedded has no matching subclass of tx.Expression",e)}function b(n,e,t,r){let o=Pe(n,e);if(!o)throw new A("child expression is required",t);return me(o,t,r)}function Pi(n,e,t,r){let o=Pe(n,e);if(o)return me(o,t,r)}function hn(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 Ki(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(Lt(i,`${e}[${o++}]`,t));else a instanceof pe&&r.push(Lt(a.object,`${e}[${o++}]`,t));return r}function Lt(n,e,t){return{field:ne(n,u.field,e,"field"),value:b(n,u.bindValue,`${e}.bindValue`,t)}}function Ei(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 Di(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 Ai(n,e,t){if(t.depth>=Ut)throw new A(`Fragment recursion exceeded MAX_FRAGMENT_DEPTH (${Ut})`,e);let r=Q(n,u.fragmentRef);if(!r)throw new A("fragmentRef is required",e);let o=Ci(t.catalog,r);if(!o)throw new A(`ExpressionFragment not found: ${r.publisher}/${r.package_}/${r.name}`,e);let a=Pe(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 Ci(n,e){for(let t of n)if(!(!(t instanceof yi)||t.name!==e.name||!(t.namespace||"").startsWith(`${e.publisher}/${e.package_}@`))&&v(t,u.ExpressionFragment))return t}function Ht(n,e){let t=new Set;for(let r of V(n,u.outputs))if(r instanceof wn)t.add(r.object.subject.name);else if(r instanceof Z)for(let o of r.object)o instanceof xt&&t.add(o.subject.name);if(t.size===0)throw new A("outputs is required (at least one OutputFormat)",e);return t}function qt(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]=Vt(i,`${e}[${o++}]`);r.set(s,c)}}else if(a instanceof pe){let[i,s]=Vt(a.object,`${e}[${o++}]`);r.set(i,s)}return r}function Vt(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 Mt)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=kn(n,u.trailingNewline),i=kn(n,u.omitWrapper);return[t.name,{metadataKeys:r.length>0?r:void 0,metadataRenames:o,trailingNewline:a,omitWrapper:i}]}function Ri(n){return n.predicate?.subject}function V(n,e){let t=[];for(let r of n.statement){let o=Ri(r);o&&U(o,e)&&t.push(r)}return t}function Pe(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 wn)return yn(t.object.subject)}function fe(n,e){for(let t of V(n,e))if(t instanceof Mt)return t.object}function zt(n,e){for(let t of V(n,e))if(t instanceof wi)return t.object}function kn(n,e){for(let t of V(n,e))if(t instanceof bi)return t.object}function N(n,e,t){let r=fe(n,e);if(r===void 0)throw new A(`${e.name} (string) is required`,t);return r}function Ft(n,e,t){let r=zt(n,e);if(r===void 0)throw new A(`${e.name} (number) is required`,t);return r}function _i(n,e,t){let r=kn(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 yn(n){return{publisher:n.publisher,package_:n.package_,name:n.name}}import{DefinedKanonak as Ke,EmbeddedKanonak as Ii,ReferenceKanonak as W,SubjectKanonak as Ne,StringStatement as $n,NumberStatement as vn,BooleanStatement as Sn,ReferenceStatement as Fe,EmbeddedStatement as Pn,ListStatement as xe}from"@kanonak-protocol/sdk";var X=class extends Error{},Ve=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 X(`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 Gt(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 Gt(r)}case"property-read":{let r=await this.evaluate(e.source,t);return Wt(r,e.readProp)}case"traverse":{let r=await this.evaluate(e.source,t);if(!(r instanceof Ke))return;let o=ji(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(Le(l))}return a.join("")}case"uri-name":{let r=await this.evaluate(e.source,t);return he(r)?r.name:r instanceof W?r.subject.name:r instanceof Ne?r.name:r instanceof Ii?r.name??"":void 0}case"uri-publisher":{let r=await this.evaluate(e.source,t);return bn(r)?.publisher}case"uri-package":{let r=await this.evaluate(e.source,t);return bn(r)?.package_}case"uri-version":{let r=await this.evaluate(e.source,t);return bn(r)?.version}case"subject-uri":{let r=await this.evaluate(e.source,t);if(r instanceof Ne){let o=r.namespace??"",a=r.name??"";return!o||!a?void 0:`${o}/${a}`}if(r instanceof W){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?Wt(r,e.labelSource):void 0}case"resolve-ref":{let r=await this.evaluate(e.source,t);return r instanceof W?await this.resolver.resolveSubject(r.subject,this.catalog):he(r)?await this.resolver.resolveSubject(r,this.catalog):void 0}case"normalize":{let r=await this.evaluate(e.source,t),o=r==null?"":Le(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)&&Oi.has(i)&&a.every(s=>Li(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?"":Le(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+=O(a,"Sum");return o}case"min":{let r=await this.evaluateList(e.source,t);if(r.length===0)throw new X("Min on an empty list is undefined; guard with IsSet");let o=O(r[0],"Min");for(let a=1;a<r.length;a++){let i=O(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 X("Max on an empty list is undefined; guard with IsSet");let o=O(r[0],"Max");for(let a=1;a<r.length;a++){let i=O(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 X("Average on an empty list is undefined; guard with IsSet");let o=0;for(let a of r)o+=O(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=Zt(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=Zt(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 Ke?r.statement:[]}case"statement-predicate":{let r=await this.evaluate(e.source,t);if(Yt(r)){let o=r.predicate;if(o instanceof W)return o}return}case"statement-value":{let r=await this.evaluate(e.source,t);return Yt(r)?Fi(r):void 0}case"date-format":{let r=await this.evaluate(e.source,t),o=r==null?"":Le(r);return o?Vi(o,e.format):""}case"add":{let r=O(await this.evaluate(e.left,t),"Add"),o=O(await this.evaluate(e.right,t),"Add");return r+o}case"subtract":{let r=O(await this.evaluate(e.left,t),"Subtract"),o=O(await this.evaluate(e.right,t),"Subtract");return r-o}case"multiply":{let r=O(await this.evaluate(e.left,t),"Multiply"),o=O(await this.evaluate(e.right,t),"Multiply");return r*o}case"divide":{let r=O(await this.evaluate(e.left,t),"Divide"),o=O(await this.evaluate(e.right,t),"Divide");if(o===0)throw new X("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]}case"equals":{let r=await this.evaluate(e.left,t),o=await this.evaluate(e.right,t);return Jt(r,o)}case"greater-than":{let r=await this.evaluate(e.left,t),o=await this.evaluate(e.right,t);return typeof r!="number"||typeof o!="number"?!1:r>o}case"less-than":{let r=await this.evaluate(e.left,t),o=await this.evaluate(e.right,t);return typeof r!="number"||typeof o!="number"?!1:r<o}case"greater-than-or-equal":{let r=await this.evaluate(e.left,t),o=await this.evaluate(e.right,t);return typeof r!="number"||typeof o!="number"?!1:r>=o}case"less-than-or-equal":{let r=await this.evaluate(e.left,t),o=await this.evaluate(e.right,t);return typeof r!="number"||typeof o!="number"?!1:r<=o}case"not":{let r=await this.evaluate(e.operand,t);return r===!0?!1:r===!1?!0:void 0}case"and":{for(let r of e.operands)if(await this.evaluate(r,t)!==!0)return!1;return!0}case"or":{for(let r of e.operands)if(await this.evaluate(r,t)===!0)return!0;return!1}case"contains":{let r=await this.evaluateList(e.haystack,t),o=await this.evaluate(e.needle,t);for(let a of r)if(Jt(a,o))return!0;return!1}case"abs":{let r=O(await this.evaluate(e.value,t),"Abs");return Math.abs(r)}case"negate":return-O(await this.evaluate(e.value,t),"Negate");default:{let r=e;throw new X("Unknown expression kind")}}}async evaluateList(e,t){let r=await this.evaluate(e,t);return r==null?[]:Array.isArray(r)?r:[r]}};function Wt(n,e){if(n instanceof Ke)return Ti(n,e);if(Ui(n))return U(e,u.key)?n.key:U(e,u.members)?n.members:void 0}function Ti(n,e){for(let t of n.statement){let r=Qt(t);if(!(!r||!U(r,e))&&(t instanceof $n||t instanceof vn||t instanceof Sn||t instanceof Fe||t instanceof Pn||t instanceof xe))return t.object}}function ji(n,e){let t=[];for(let r of n.statement){let o=Qt(r);if(!(!o||!U(o,e))){if(r instanceof Fe)t.push(r.object.subject);else if(r instanceof xe)for(let a of r.object)a instanceof W&&t.push(a.subject)}}return t}function Qt(n){return n.predicate?.subject}function Le(n){if(n==null)return"";if(typeof n=="string")return n;if(typeof n=="number"||typeof n=="boolean")return String(n);if(n instanceof Ke)return n.name??"";if(n instanceof W)return n.subject.name;if(he(n))return n.name;let e=n.value;return typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):""}function Gt(n){return n==null?!1:typeof n=="string"||Array.isArray(n)?n.length>0:typeof n=="boolean"?n===!0:!0}function he(n){return typeof n=="object"&&n!==null&&typeof n.publisher=="string"&&typeof n.package_=="string"&&typeof n.name=="string"}function Ui(n){return typeof n=="object"&&n!==null&&n.kind==="Partition"&&Array.isArray(n.members)}function O(n,e){if(typeof n=="number"&&Number.isFinite(n))return n;throw new X(`${e} requires numeric elements; got ${Ni(n)}`)}function bn(n){if(n instanceof Ne){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 W){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(he(n))return{publisher:n.publisher,package_:n.package_,version:"",name:n.name}}var Oi=new Set(["stringValue","text","rawContent","key"]);function Li(n){return typeof n=="string"||typeof n=="number"||typeof n=="boolean"}function Ni(n){return n===void 0?"undefined":n===null?"null":Array.isArray(n)?`array(${n.length})`:typeof n}function Vi(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 Jt(n,e){if(n==null||e===void 0||e===null)return!1;if(n===e)return!0;let t=typeof n=="object"&&"value"in n?n.value:void 0,r=typeof e=="object"&&"value"in e?e.value:void 0,o=t??n,a=r??e,i=Xt(n),s=Xt(e);return i&&s?i.publisher===s.publisher&&i.package_===s.package_&&i.name===s.name:typeof o=="string"&&typeof a=="string"||typeof o=="number"&&typeof a=="number"||typeof o=="boolean"&&typeof a=="boolean"?o===a:!1}function Xt(n){if(n instanceof W){let e=n.subject;return{publisher:e.publisher,package_:e.package_,name:e.name}}if(n instanceof Ne){let e=n.namespace??"",t=e.indexOf("/"),r=e.indexOf("@",t+1);if(t<0)return;let o=e.substring(0,t),a=r>=0?e.substring(t+1,r):e.substring(t+1);return{publisher:o,package_:a,name:n.name??""}}if(he(n))return{publisher:n.publisher,package_:n.package_,name:n.name}}function Yt(n){return n instanceof $n||n instanceof vn||n instanceof Sn||n instanceof Fe||n instanceof Pn||n instanceof xe}function Fi(n){return n instanceof $n||n instanceof vn||n instanceof Sn?String(n.object??""):n instanceof Fe?n.object?.subject?.name??"":n instanceof Pn?"[embedded]":n instanceof xe?(n.object??[]).map(t=>{if(t instanceof W)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 Zt(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 W){let e=n.subject;return`r:${e.publisher}/${e.package_}/${e.name}`}if(n instanceof Ke){let e=n.name??"";return`k:${n.namespace??""}/${e}`}return he(n)?`u:${n.publisher}/${n.package_}/${n.name}`:`o:${JSON.stringify(n)}`}var Me={"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 Ve(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=er(t.instances,e.inputPattern.requires),i=nr(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);Kn(f,e.name,`input "${c.name}"`);let m=En(await o.evaluate(e.artifactName,l),e.name,`input "${c.name}"`),p=e.overrides.get(t.outputFormat),h=r.render(f,p);s.push({fileName:m,format:t.outputFormat,content:h,source:{kind:"instance",sourceName:c.name}})}return s}async runSet(e,t,r,o){let a=er(t.instances,e.inputPattern.requires),i=nr(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);Kn(s,e.name,"set");let c=En(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=Bi(f,i);if(m==null)continue;let p=Hi(m),h=s.get(p);h||(h={keyValue:m,keyDisplay:qi(m),members:[]},s.set(p,h),c.push(p)),h.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 h=await a.evaluate(e.rule,p);Kn(h,e.name,`partition "${m.keyDisplay}"`);let w=En(await a.evaluate(e.artifactName,p),e.name,`partition "${m.keyDisplay}"`),g=e.overrides.get(r.outputFormat),y=o.render(h,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=Me[e];if(t)return this.backends.get(t.formatUri)}};function er(n,e){return e.length===0?n:n.filter(t=>{for(let r of e)if(!Mi(t,r))return!1;return!0})}function nr(n,e){if(e.length===0)return n;let t=[...n];return t.sort((r,o)=>{for(let a of e){let i=tr(r,a.byProperty),s=tr(o,a.byProperty),c=xi(i,s,a.order);if(c!==0)return c}return 0}),t}function tr(n,e){for(let t of n.statement){let r=Dn(t);if(!(!r||!U(r,e))){if(t instanceof ar||t instanceof ir||t instanceof sr)return t.object;if(t instanceof lr)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 cr)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 xi(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 Mi(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 Bi(n,e){for(let t of n.statement){let r=Dn(t);if(!(!r||!U(r,e))&&(t instanceof ar||t instanceof ir||t instanceof sr||t instanceof cr||t instanceof lr))return t.object}}function Dn(n){return n.predicate?.subject}function Hi(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 or){let e=n.subject;return`r:${e.publisher}/${e.package_}/${e.name}`}if(n instanceof rr){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 qi(n){return n==null?"":typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"?String(n):n instanceof or?n.subject.name:n instanceof rr?n.name??"":typeof n=="object"&&n!==null&&typeof n.name=="string"?n.name:""}function Kn(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: ${ur(n)}`)}function En(n,e,t){if(typeof n=="string")return n;if(Array.isArray(n)&&n.every(zi))return n.map(r=>String(r)).join("");throw new ee(`Transformation "${e}" artifactName did not yield a string for ${t}. Got: ${ur(n)}`)}function zi(n){return typeof n=="string"||typeof n=="number"||typeof n=="boolean"}function ur(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 An(n){return[...C(n,u.InstanceTransformation),...C(n,u.SetTransformation)]}function gr(){let n=new Ee("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 ki}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=$e(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 h=p.metadata?.namespace_?.version;return h&&h.major===o.major&&h.minor===o.minor&&h.patch===o.patch})??l[0]:l[0],m=new D(f,this.repository);s=await this.objectParser.parseKanonaks(m),this.cache.set(i,s)}let c=$e(s,e);if(c)return c;for(let l of s)if(l instanceof ki&&l.name===e.name)return l}};import{EmbeddedKanonak as Se,ReferenceKanonak as xt,SubjectKanonak as yi,ListStatement as Z,ReferenceStatement as wn,EmbeddedStatement as pe,StringStatement as Mt,NumberStatement as wi,BooleanStatement as bi}from"@kanonak-protocol/sdk";var A=class extends Error{constructor(t,r){super(`${t} (at ${r})`);this.path=r}path},Ut=16;function ge(n,e){let t=n.name,r={catalog:e,depth:0};if(v(n,u.InstanceTransformation))return $i(n,t,r);if(v(n,u.SetTransformation))return vi(n,t,r);throw new A("Subject is not a recognized v3 transformation type \u2014 expected InstanceTransformation or SetTransformation",t)}function $i(n,e,t){return{kind:"instance",name:n.name,inputPattern:Bt(n,e),rule:Oe(n,u.rule,`${e}.rule`,t),artifactName:Oe(n,u.artifactName,`${e}.artifactName`,t),outputs:Ht(n,`${e}.outputs`),overrides:zt(n,`${e}.formatOverrides`,t)}}function vi(n,e,t){let r=Q(n,u.partitionBy);return{kind:"set",name:n.name,inputPattern:Bt(n,e),rule:Oe(n,u.rule,`${e}.rule`,t),artifactName:Oe(n,u.artifactName,`${e}.artifactName`,t),outputs:Ht(n,`${e}.outputs`),overrides:zt(n,`${e}.formatOverrides`,t),partitionBy:r}}function Bt(n,e){let t=Pe(n,u.inputPattern);if(!t)throw new A("inputPattern is required",e);return Si(t,`${e}.inputPattern`)}function Si(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 wn)r.push(yn(i.object.subject));else if(i instanceof Z)for(let s of i.object)s instanceof xt&&r.push(yn(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(Ot(s,`${e}.sortBy[${a++}]`));else i instanceof pe&&o.push(Ot(i.object,`${e}.sortBy[${a++}]`));return{matchesClass:t,requires:r,sortBy:o}}function Ot(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=Pe(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:V(n,u.stringLiteral,e)};if(v(n,u.IntegerLiteral))return{kind:"integer-literal",value:Ft(n,u.integerLiteral,e)};if(v(n,u.DecimalLiteral))return{kind:"decimal-literal",value:Ft(n,u.decimalLiteral,e)};if(v(n,u.BooleanLiteral))return{kind:"boolean-literal",value:_i(n,u.booleanLiteral,e)};if(v(n,u.VarRef))return{kind:"var-ref",varName:V(n,u.varName,e)};if(v(n,u.PropertyRead))return{kind:"property-read",source:b(n,u.readSource,`${e}.readSource`,t),readProp:ne(n,u.readProp,e,"readProp")};if(v(n,u.Traverse))return{kind:"traverse",source:b(n,u.traverseSource,`${e}.traverseSource`,t),through:ne(n,u.through,e,"through"),step:b(n,u.step,`${e}.step`,t)};if(v(n,u.BuildAstNode))return{kind:"build-ast-node",astClass:ne(n,u.astClass,e,"astClass"),set:Ei(n,`${e}.set`,t)};if(v(n,u.When))return{kind:"when",condition:b(n,u.condition,`${e}.condition`,t),thenBuild:b(n,u.thenBuild,`${e}.thenBuild`,t),elseBuild:Pi(n,u.elseBuild,`${e}.elseBuild`,t)};if(v(n,u.Concat))return{kind:"concat",parts:hn(n,u.parts,`${e}.parts`,t)};if(v(n,u.Fallback))return{kind:"fallback",primary:b(n,u.primary,`${e}.primary`,t),alternate:b(n,u.alternate,`${e}.alternate`,t)};if(v(n,u.UriName))return{kind:"uri-name",source:b(n,u.uriNameOf,`${e}.uriNameOf`,t)};if(v(n,u.UriPublisher))return{kind:"uri-publisher",source:b(n,u.uriPublisherOf,`${e}.uriPublisherOf`,t)};if(v(n,u.UriPackage))return{kind:"uri-package",source:b(n,u.uriPackageOf,`${e}.uriPackageOf`,t)};if(v(n,u.UriVersion))return{kind:"uri-version",source:b(n,u.uriVersionOf,`${e}.uriVersionOf`,t)};if(v(n,u.SubjectUri))return{kind:"subject-uri",source:b(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:b(n,u.resolveSource,`${e}.resolveSource`,t)};if(v(n,u.Normalize))return{kind:"normalize",source:b(n,u.normSource,`${e}.normSource`,t),normKind:Ki(n,e)};if(v(n,u.IsSet))return{kind:"is-set",check:b(n,u.checkExpr,`${e}.checkExpr`,t)};if(v(n,u.CallFragment))return Ai(n,e,t);if(v(n,u.Join))return{kind:"join",source:b(n,u.source,`${e}.source`,t),separator:V(n,u.separator,e)};if(v(n,u.Count))return{kind:"count",source:b(n,u.source,`${e}.source`,t)};if(v(n,u.Sum))return{kind:"sum",source:b(n,u.source,`${e}.source`,t)};if(v(n,u.Min))return{kind:"min",source:b(n,u.source,`${e}.source`,t)};if(v(n,u.Max))return{kind:"max",source:b(n,u.source,`${e}.source`,t)};if(v(n,u.Average))return{kind:"average",source:b(n,u.source,`${e}.source`,t)};if(v(n,u.ForEach))return{kind:"for-each",source:b(n,u.source,`${e}.source`,t),loopVar:V(n,u.loopVar,e),emit:b(n,u.emit,`${e}.emit`,t)};if(v(n,u.ListMap))return{kind:"list-map",source:b(n,u.source,`${e}.source`,t),loopVar:V(n,u.loopVar,e),mapBody:b(n,u.mapBody,`${e}.mapBody`,t)};if(v(n,u.Filter))return{kind:"filter",source:b(n,u.source,`${e}.source`,t),loopVar:V(n,u.loopVar,e),predicate:b(n,u.predicate,`${e}.predicate`,t)};if(v(n,u.PartitionBy))return{kind:"partition-by",source:b(n,u.source,`${e}.source`,t),loopVar:V(n,u.loopVar,e),partitionKey:b(n,u.partitionKey,`${e}.partitionKey`,t)};if(v(n,u.DistinctBy))return{kind:"distinct-by",source:b(n,u.source,`${e}.source`,t),loopVar:V(n,u.loopVar,e),distinctKey:b(n,u.distinctKey,`${e}.distinctKey`,t)};if(v(n,u.AllStatements))return{kind:"all-statements",source:b(n,u.statementsOf,`${e}.statementsOf`,t)};if(v(n,u.StatementPredicate))return{kind:"statement-predicate",source:b(n,u.predicateOf,`${e}.predicateOf`,t)};if(v(n,u.StatementValue))return{kind:"statement-value",source:b(n,u.valueOf,`${e}.valueOf`,t)};if(v(n,u.DateFormat))return{kind:"date-format",source:b(n,u.dateSource,`${e}.dateSource`,t),format:Di(n,e)};if(v(n,u.Add))return{kind:"add",left:b(n,u.arithLeft,`${e}.arithLeft`,t),right:b(n,u.arithRight,`${e}.arithRight`,t)};if(v(n,u.Subtract))return{kind:"subtract",left:b(n,u.arithLeft,`${e}.arithLeft`,t),right:b(n,u.arithRight,`${e}.arithRight`,t)};if(v(n,u.Multiply))return{kind:"multiply",left:b(n,u.arithLeft,`${e}.arithLeft`,t),right:b(n,u.arithRight,`${e}.arithRight`,t)};if(v(n,u.Divide))return{kind:"divide",left:b(n,u.arithLeft,`${e}.arithLeft`,t),right:b(n,u.arithRight,`${e}.arithRight`,t)};if(v(n,u.Reverse))return{kind:"reverse",source:b(n,u.source,`${e}.source`,t)};if(v(n,u.WindowedMap)){let r=qt(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:b(n,u.source,`${e}.source`,t),windowSize:r,windowVar:V(n,u.windowVar,e),windowBody:b(n,u.windowBody,`${e}.windowBody`,t)}}if(v(n,u.PairwiseMap))return{kind:"pairwise-map",source:b(n,u.source,`${e}.source`,t),firstVar:V(n,u.firstVar,e),secondVar:V(n,u.secondVar,e),pairBody:b(n,u.pairBody,`${e}.pairBody`,t)};if(v(n,u.Scan))return{kind:"scan",source:b(n,u.source,`${e}.source`,t),initialState:b(n,u.initialState,`${e}.initialState`,t),stateVar:V(n,u.stateVar,e),elementVar:V(n,u.elementVar,e),accumulate:b(n,u.accumulate,`${e}.accumulate`,t)};if(v(n,u.ListItemAt))return{kind:"list-item-at",source:b(n,u.source,`${e}.source`,t),itemIndex:b(n,u.itemIndex,`${e}.itemIndex`,t)};if(v(n,u.Equals))return{kind:"equals",left:b(n,u.compareLeft,`${e}.compareLeft`,t),right:b(n,u.compareRight,`${e}.compareRight`,t)};if(v(n,u.GreaterThan))return{kind:"greater-than",left:b(n,u.compareLeft,`${e}.compareLeft`,t),right:b(n,u.compareRight,`${e}.compareRight`,t)};if(v(n,u.LessThan))return{kind:"less-than",left:b(n,u.compareLeft,`${e}.compareLeft`,t),right:b(n,u.compareRight,`${e}.compareRight`,t)};if(v(n,u.GreaterThanOrEqual))return{kind:"greater-than-or-equal",left:b(n,u.compareLeft,`${e}.compareLeft`,t),right:b(n,u.compareRight,`${e}.compareRight`,t)};if(v(n,u.LessThanOrEqual))return{kind:"less-than-or-equal",left:b(n,u.compareLeft,`${e}.compareLeft`,t),right:b(n,u.compareRight,`${e}.compareRight`,t)};if(v(n,u.Not))return{kind:"not",operand:b(n,u.operand,`${e}.operand`,t)};if(v(n,u.And))return{kind:"and",operands:hn(n,u.operands,`${e}.operands`,t)};if(v(n,u.Or))return{kind:"or",operands:hn(n,u.operands,`${e}.operands`,t)};if(v(n,u.Contains))return{kind:"contains",haystack:b(n,u.haystack,`${e}.haystack`,t),needle:b(n,u.needle,`${e}.needle`,t)};if(v(n,u.Abs))return{kind:"abs",value:b(n,u.value,`${e}.value`,t)};if(v(n,u.Negate))return{kind:"negate",value:b(n,u.value,`${e}.value`,t)};throw new A("Expression is not of a recognized v3 type \u2014 embedded has no matching subclass of tx.Expression",e)}function b(n,e,t,r){let o=Pe(n,e);if(!o)throw new A("child expression is required",t);return me(o,t,r)}function Pi(n,e,t,r){let o=Pe(n,e);if(o)return me(o,t,r)}function hn(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 Ei(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(Lt(i,`${e}[${o++}]`,t));else a instanceof pe&&r.push(Lt(a.object,`${e}[${o++}]`,t));return r}function Lt(n,e,t){return{field:ne(n,u.field,e,"field"),value:b(n,u.bindValue,`${e}.bindValue`,t)}}function Ki(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 Vt=new Set(["iso-date","iso-datetime","short-date","long-date","year","month-year"]);function Di(n,e){let t=fe(n,u.dateFormat);if(!t)throw new A("dateFormat is required",e);if(!Vt.has(t))throw new A(`Unknown dateFormat "${t}"; supported: ${[...Vt].join(", ")}`,e);return t}function Ai(n,e,t){if(t.depth>=Ut)throw new A(`Fragment recursion exceeded MAX_FRAGMENT_DEPTH (${Ut})`,e);let r=Q(n,u.fragmentRef);if(!r)throw new A("fragmentRef is required",e);let o=Ci(t.catalog,r);if(!o)throw new A(`ExpressionFragment not found: ${r.publisher}/${r.package_}/${r.name}`,e);let a=Pe(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 Ci(n,e){for(let t of n)if(!(!(t instanceof yi)||t.name!==e.name||!(t.namespace||"").startsWith(`${e.publisher}/${e.package_}@`))&&v(t,u.ExpressionFragment))return t}function Ht(n,e){let t=new Set;for(let r of N(n,u.outputs))if(r instanceof wn)t.add(r.object.subject.name);else if(r instanceof Z)for(let o of r.object)o instanceof xt&&t.add(o.subject.name);if(t.size===0)throw new A("outputs is required (at least one OutputFormat)",e);return t}function zt(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 Mt)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),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=kn(n,u.trailingNewline),i=kn(n,u.omitWrapper);return[t.name,{metadataKeys:r.length>0?r:void 0,metadataRenames:o,trailingNewline:a,omitWrapper:i}]}function Ri(n){return n.predicate?.subject}function N(n,e){let t=[];for(let r of n.statement){let o=Ri(r);o&&U(o,e)&&t.push(r)}return t}function Pe(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 wn)return yn(t.object.subject)}function fe(n,e){for(let t of N(n,e))if(t instanceof Mt)return t.object}function qt(n,e){for(let t of N(n,e))if(t instanceof wi)return t.object}function kn(n,e){for(let t of N(n,e))if(t instanceof bi)return t.object}function V(n,e,t){let r=fe(n,e);if(r===void 0)throw new A(`${e.name} (string) is required`,t);return r}function Ft(n,e,t){let r=qt(n,e);if(r===void 0)throw new A(`${e.name} (number) is required`,t);return r}function _i(n,e,t){let r=kn(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 yn(n){return{publisher:n.publisher,package_:n.package_,name:n.name}}import{DefinedKanonak as Ee,EmbeddedKanonak as Ii,ReferenceKanonak as W,SubjectKanonak as Ve,StringStatement as $n,NumberStatement as vn,BooleanStatement as Sn,ReferenceStatement as Fe,EmbeddedStatement as Pn,ListStatement as xe}from"@kanonak-protocol/sdk";var X=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 X(`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 Gt(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 Gt(r)}case"property-read":{let r=await this.evaluate(e.source,t);return Wt(r,e.readProp)}case"traverse":{let r=await this.evaluate(e.source,t);if(!(r instanceof Ee))return;let o=ji(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(Le(l))}return a.join("")}case"uri-name":{let r=await this.evaluate(e.source,t);return he(r)?r.name:r instanceof W?r.subject.name:r instanceof Ve?r.name:r instanceof Ii?r.name??"":void 0}case"uri-publisher":{let r=await this.evaluate(e.source,t);return bn(r)?.publisher}case"uri-package":{let r=await this.evaluate(e.source,t);return bn(r)?.package_}case"uri-version":{let r=await this.evaluate(e.source,t);return bn(r)?.version}case"subject-uri":{let r=await this.evaluate(e.source,t);if(r instanceof Ve){let o=r.namespace??"",a=r.name??"";return!o||!a?void 0:`${o}/${a}`}if(r instanceof W){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?Wt(r,e.labelSource):void 0}case"resolve-ref":{let r=await this.evaluate(e.source,t);return r instanceof W?await this.resolver.resolveSubject(r.subject,this.catalog):he(r)?await this.resolver.resolveSubject(r,this.catalog):void 0}case"normalize":{let r=await this.evaluate(e.source,t),o=r==null?"":Le(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)&&Oi.has(i)&&a.every(s=>Li(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?"":Le(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+=O(a,"Sum");return o}case"min":{let r=await this.evaluateList(e.source,t);if(r.length===0)throw new X("Min on an empty list is undefined; guard with IsSet");let o=O(r[0],"Min");for(let a=1;a<r.length;a++){let i=O(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 X("Max on an empty list is undefined; guard with IsSet");let o=O(r[0],"Max");for(let a=1;a<r.length;a++){let i=O(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 X("Average on an empty list is undefined; guard with IsSet");let o=0;for(let a of r)o+=O(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=Zt(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=Zt(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 Ee?r.statement:[]}case"statement-predicate":{let r=await this.evaluate(e.source,t);if(Yt(r)){let o=r.predicate;if(o instanceof W)return o}return}case"statement-value":{let r=await this.evaluate(e.source,t);return Yt(r)?Fi(r):void 0}case"date-format":{let r=await this.evaluate(e.source,t),o=r==null?"":Le(r);return o?Ni(o,e.format):""}case"add":{let r=O(await this.evaluate(e.left,t),"Add"),o=O(await this.evaluate(e.right,t),"Add");return r+o}case"subtract":{let r=O(await this.evaluate(e.left,t),"Subtract"),o=O(await this.evaluate(e.right,t),"Subtract");return r-o}case"multiply":{let r=O(await this.evaluate(e.left,t),"Multiply"),o=O(await this.evaluate(e.right,t),"Multiply");return r*o}case"divide":{let r=O(await this.evaluate(e.left,t),"Divide"),o=O(await this.evaluate(e.right,t),"Divide");if(o===0)throw new X("Divide by zero; guard with When");return r/o}case"reverse":{if(e.source.kind==="reverse")return this.evaluate(e.source.source,t);let r=await this.evaluateReverseIterator(e.source,t);return r!==void 0?r:[...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]}case"equals":{let r=await this.evaluate(e.left,t),o=await this.evaluate(e.right,t);return Jt(r,o)}case"greater-than":{let r=await this.evaluate(e.left,t),o=await this.evaluate(e.right,t);return typeof r!="number"||typeof o!="number"?!1:r>o}case"less-than":{let r=await this.evaluate(e.left,t),o=await this.evaluate(e.right,t);return typeof r!="number"||typeof o!="number"?!1:r<o}case"greater-than-or-equal":{let r=await this.evaluate(e.left,t),o=await this.evaluate(e.right,t);return typeof r!="number"||typeof o!="number"?!1:r>=o}case"less-than-or-equal":{let r=await this.evaluate(e.left,t),o=await this.evaluate(e.right,t);return typeof r!="number"||typeof o!="number"?!1:r<=o}case"not":{let r=await this.evaluate(e.operand,t);return r===!0?!1:r===!1?!0:void 0}case"and":{for(let r of e.operands)if(await this.evaluate(r,t)!==!0)return!1;return!0}case"or":{for(let r of e.operands)if(await this.evaluate(r,t)===!0)return!0;return!1}case"contains":{let r=await this.evaluateList(e.haystack,t),o=await this.evaluate(e.needle,t);for(let a of r)if(Jt(a,o))return!0;return!1}case"abs":{let r=O(await this.evaluate(e.value,t),"Abs");return Math.abs(r)}case"negate":return-O(await this.evaluate(e.value,t),"Negate");default:{let r=e;throw new X("Unknown expression kind")}}}async evaluateList(e,t){let r=await this.evaluate(e,t);return r==null?[]:Array.isArray(r)?r:[r]}async evaluateReverseIterator(e,t){if(e.kind==="pairwise-map"){let r=await this.evaluateList(e.source,t);if(r.length<2)return[];let o=[];for(let a=r.length-1;a>=1;a--){let i=new Map(t);i.set(e.firstVar,r[a-1]),i.set(e.secondVar,r[a]);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}if(e.kind==="for-each"){let r=await this.evaluateList(e.source,t),o=[];for(let a=r.length-1;a>=0;a--){let i=new Map(t);i.set(e.loopVar,r[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}if(e.kind==="list-map"){let r=await this.evaluateList(e.source,t),o=[];for(let a=r.length-1;a>=0;a--){let i=new Map(t);i.set(e.loopVar,r[a]),o.push(await this.evaluate(e.mapBody,i))}return o}if(e.kind==="windowed-map"){let r=await this.evaluateList(e.source,t);if(r.length<e.windowSize)return[];let o=[];for(let a=r.length-e.windowSize;a>=0;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}}};function Wt(n,e){if(n instanceof Ee)return Ti(n,e);if(Ui(n))return U(e,u.key)?n.key:U(e,u.members)?n.members:void 0}function Ti(n,e){for(let t of n.statement){let r=Qt(t);if(!(!r||!U(r,e))&&(t instanceof $n||t instanceof vn||t instanceof Sn||t instanceof Fe||t instanceof Pn||t instanceof xe))return t.object}}function ji(n,e){let t=[];for(let r of n.statement){let o=Qt(r);if(!(!o||!U(o,e))){if(r instanceof Fe)t.push(r.object.subject);else if(r instanceof xe)for(let a of r.object)a instanceof W&&t.push(a.subject)}}return t}function Qt(n){return n.predicate?.subject}function Le(n){if(n==null)return"";if(typeof n=="string")return n;if(typeof n=="number"||typeof n=="boolean")return String(n);if(n instanceof Ee)return n.name??"";if(n instanceof W)return n.subject.name;if(he(n))return n.name;let e=n.value;return typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):""}function Gt(n){return n==null?!1:typeof n=="string"||Array.isArray(n)?n.length>0:typeof n=="boolean"?n===!0:!0}function he(n){return typeof n=="object"&&n!==null&&typeof n.publisher=="string"&&typeof n.package_=="string"&&typeof n.name=="string"}function Ui(n){return typeof n=="object"&&n!==null&&n.kind==="Partition"&&Array.isArray(n.members)}function O(n,e){if(typeof n=="number"&&Number.isFinite(n))return n;throw new X(`${e} requires numeric elements; got ${Vi(n)}`)}function bn(n){if(n instanceof Ve){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 W){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(he(n))return{publisher:n.publisher,package_:n.package_,version:"",name:n.name}}var Oi=new Set(["stringValue","text","rawContent","key"]);function Li(n){return typeof n=="string"||typeof n=="number"||typeof n=="boolean"}function Vi(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 Jt(n,e){if(n==null||e===void 0||e===null)return!1;if(n===e)return!0;let t=typeof n=="object"&&"value"in n?n.value:void 0,r=typeof e=="object"&&"value"in e?e.value:void 0,o=t??n,a=r??e,i=Xt(n),s=Xt(e);return i&&s?i.publisher===s.publisher&&i.package_===s.package_&&i.name===s.name:typeof o=="string"&&typeof a=="string"||typeof o=="number"&&typeof a=="number"||typeof o=="boolean"&&typeof a=="boolean"?o===a:!1}function Xt(n){if(n instanceof W){let e=n.subject;return{publisher:e.publisher,package_:e.package_,name:e.name}}if(n instanceof Ve){let e=n.namespace??"",t=e.indexOf("/"),r=e.indexOf("@",t+1);if(t<0)return;let o=e.substring(0,t),a=r>=0?e.substring(t+1,r):e.substring(t+1);return{publisher:o,package_:a,name:n.name??""}}if(he(n))return{publisher:n.publisher,package_:n.package_,name:n.name}}function Yt(n){return n instanceof $n||n instanceof vn||n instanceof Sn||n instanceof Fe||n instanceof Pn||n instanceof xe}function Fi(n){return n instanceof $n||n instanceof vn||n instanceof Sn?String(n.object??""):n instanceof Fe?n.object?.subject?.name??"":n instanceof Pn?"[embedded]":n instanceof xe?(n.object??[]).map(t=>{if(t instanceof W)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 Zt(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 W){let e=n.subject;return`r:${e.publisher}/${e.package_}/${e.name}`}if(n instanceof Ee){let e=n.name??"";return`k:${n.namespace??""}/${e}`}return he(n)?`u:${n.publisher}/${n.package_}/${n.name}`:`o:${JSON.stringify(n)}`}var Me={"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 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=er(t.instances,e.inputPattern.requires),i=nr(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);En(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),h=r.render(f,p);s.push({fileName:m,format:t.outputFormat,content:h,source:{kind:"instance",sourceName:c.name}})}return s}async runSet(e,t,r,o){let a=er(t.instances,e.inputPattern.requires),i=nr(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);En(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=Bi(f,i);if(m==null)continue;let p=Hi(m),h=s.get(p);h||(h={keyValue:m,keyDisplay:zi(m),members:[]},s.set(p,h),c.push(p)),h.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 h=await a.evaluate(e.rule,p);En(h,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(h,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=Me[e];if(t)return this.backends.get(t.formatUri)}};function er(n,e){return e.length===0?n:n.filter(t=>{for(let r of e)if(!Mi(t,r))return!1;return!0})}function nr(n,e){if(e.length===0)return n;let t=[...n];return t.sort((r,o)=>{for(let a of e){let i=tr(r,a.byProperty),s=tr(o,a.byProperty),c=xi(i,s,a.order);if(c!==0)return c}return 0}),t}function tr(n,e){for(let t of n.statement){let r=Dn(t);if(!(!r||!U(r,e))){if(t instanceof ar||t instanceof ir||t instanceof sr)return t.object;if(t instanceof lr)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 cr)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 xi(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 Mi(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 Bi(n,e){for(let t of n.statement){let r=Dn(t);if(!(!r||!U(r,e))&&(t instanceof ar||t instanceof ir||t instanceof sr||t instanceof cr||t instanceof lr))return t.object}}function Dn(n){return n.predicate?.subject}function Hi(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 or){let e=n.subject;return`r:${e.publisher}/${e.package_}/${e.name}`}if(n instanceof rr){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 zi(n){return n==null?"":typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"?String(n):n instanceof or?n.subject.name:n instanceof rr?n.name??"":typeof n=="object"&&n!==null&&typeof n.name=="string"?n.name:""}function En(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: ${ur(n)}`)}function Kn(n,e,t){if(typeof n=="string")return n;if(Array.isArray(n)&&n.every(qi))return n.map(r=>String(r)).join("");throw new ee(`Transformation "${e}" artifactName did not yield a string for ${t}. Got: ${ur(n)}`)}function qi(n){return typeof n=="string"||typeof n=="number"||typeof n=="boolean"}function ur(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 An(n){return[...C(n,u.InstanceTransformation),...C(n,u.SetTransformation)]}function gr(){let n=new Ke("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(ts()),n.addCommand(is()),n.addCommand(cs()),n.addCommand(us()),n}function ts(){return new
|
|
172
|
+
`);return n.addCommand(ts()),n.addCommand(is()),n.addCommand(cs()),n.addCommand(us()),n}function ts(){return new Ke("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.",rs,[]).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 os(n,e)}catch(t){console.error(`Error: ${t.message}`),process.exit(1)}})}function rs(n,e){return[...e,n]}async function os(n,e){let t=new Cn,r=new Rn,o=await j(process.cwd(),t),a=await hr(n,o,r),{transformation:i,transformationKanonaks:s}=a;console.log(`Transformation: ${He(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 $ of e.scope){let S=await ds($,o,t,r);l.push(...S);let P=await ps(S,c.inputPattern.matchesClass,o);for(let K of P){let T=gs(K);T&&!f.has(T)&&f.set(T,K)}console.log(`Scope: ${$} \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 h=as(c.outputs,e.format);console.log(`Output format: ${h}`);let w=Me[h];if(!w)throw new Error(`Unknown format "${h}". 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:h}),k=Zi(e.out);Ji(k,{recursive:!0});for(let $ of y){let S=ms($.fileName),P=Yi(k,`${S}${w.extension}`);Gi(P,$.content,"utf-8"),console.log(` wrote ${P}`)}console.log(`Done. ${y.length} artifact(s) written to ${k}`)}function as(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 is(){return new Ke("list").description("Scan the local workspace + cache for every Transformation instance and print a one-line summary per hit.").action(async()=>{try{await ss()}catch(n){console.error(`Error: ${n.message}`),process.exit(1)}})}async function ss(){let n=new Cn,e=new Rn,t=await j(process.cwd(),n),r=await t.getAllDocumentsAsync(),o=new Map;for(let i of r)try{let s=new D(i,t),c=await e.parseKanonaks(s),l=An(c);for(let f of l){let m=In(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(fr(i[0].tx,i[0].kanonaks));continue}let s=_n(i.map(l=>l.doc));if(!s.chosen)continue;let c=i.find(l=>l.doc===s.chosen);c&&a.push(fr(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 cs(){return new Ke("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 ls(n)}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}})}async function ls(n){let e=new Cn,t=new Rn,r=await j(process.cwd(),e),{transformation:o,transformationKanonaks:a}=await hr(n,r,t),i=ge(o,a);if(console.log(`Transformation: ${He(o)}`),console.log(),console.log("Input pattern:"),console.log(` Matches class: ${Be(i.inputPattern.matchesClass)}`),i.inputPattern.requires.length>0){console.log(" Required properties:");for(let s of i.inputPattern.requires)console.log(` - ${Be(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: ${Be(i.rule.astClass)}`),console.log(`Rule root bindings: ${i.rule.set.length} field(s)`)),console.log(`Artifact name root kind: ${i.artifactName.kind}`)}function us(){return new Ke("formats").description("List the OutputFormat names the runner can serialize to.").action(()=>{console.log("Registered format backends:");let n=Object.entries(Me).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 hr(n,e,t){let r,o,a;if(n.includes("/")){let p=n.indexOf("@"),h=n;if(p!==-1){let g=n.indexOf("/",p);if(g===-1)throw new Error(`Transformation URI "${n}" has @version but no trailing /<name>`);h=n.substring(0,p)+n.substring(g)}let w=h.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 h=fs(n),w=kr(p,h,`${r}/${o}`),g=new D(w,e),y=await t.parseKanonaks(g),k=$e(y,{publisher:r,package_:o,name:a,version:""});if(!k){let $=An(y),S=$.find(P=>P.name===a);if(!S)throw new Error(`Transformation "${a}" not found in package ${r}/${o}. Package contains ${$.length} Transformation(s): ${$.map(P=>P.name).join(", ")||"(none)"}`);return{transformation:S,transformationKanonaks:y}}return{transformation:k,transformationKanonaks:y}}let i=await e.getAllDocumentsAsync(),s=new Map;for(let p of i)try{let h=new D(p,e),w=await t.parseKanonaks(h),g=An(w);for(let y of g){if(y.name!==a)continue;let k=In(y);if(!k)continue;let $=s.get(k)??[];$.push({tx:y,kanonaks:w,doc:p}),s.set(k,$)}}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])),f=_n(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?pr(y):""},h=m.tx.namespace??"",w=h.includes("@")?h.substring(0,h.indexOf("@")):h;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 ds(n,e,t,r){if(/^[.\/\\]/.test(n)||/^[A-Za-z]:/.test(n)||n.endsWith(".kan.yml")||dr(n)&&Xi(n).isFile()){if(!dr(n))throw new Error(`Scope file not found: ${n}`);let w=Wi(n,"utf-8"),g=t.parse(w),y=new D(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=kr(m,s,`${l}/${f}`),h=new D(p,e);return r.parseKanonaks(h)}function fs(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 kr(n,e,t){let r=a=>{let i=a.metadata.namespace_?.version;return i?pr(i):""},o=_n(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 fr(n,e){try{let t=ge(n,e);return{uri:He(n),matchesClass:Be(t.inputPattern.matchesClass),outputs:Array.from(t.outputs).sort()}}catch(t){return{uri:He(n),matchesClass:`(compile error: ${t.message})`,outputs:[]}}}function He(n){let e=n.namespace||"",t=e.indexOf("@");return`${t===-1?e:e.substring(0,t)}/${n.name}`}function Be(n){return`${n.publisher}/${n.package_}/${n.name}`}function ms(n){return n.replace(/[\\/:*?"<>|\s]+/g,"_").replace(/^_+|_+$/g,"")}async function ps(n,e,t){let r=new Map;for(let i of n){if(!(i instanceof Qi))continue;let s=In(i);s&&r.set(s,i)}let o=[];try{o=(await new es({vocabulary:new ns}).reason(t)).getInstancesOfClass(mr(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 In(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:mr(r.substring(0,o),r.substring(o+1),n.name)}function gs(n){let e=n.namespace??"";return!e||!n.name?null:`${e}/${n.name}`}import{Command as hs}from"commander";import{writeFileSync as ks,mkdirSync as ys}from"fs";import{join as ws,resolve as bs}from"path";import{KanonakParser as $s,KanonakObjectParser as vs,SubjectKanonak as br,findDerivation as Ss}from"@kanonak-protocol/sdk";var Ps={publisher:"kanonak.org",package_:"formats",name:"html"},
|
|
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=_n(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?pr(y):""},h=m.tx.namespace??"",w=h.includes("@")?h.substring(0,h.indexOf("@")):h;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 ds(n,e,t,r){if(/^[.\/\\]/.test(n)||/^[A-Za-z]:/.test(n)||n.endsWith(".kan.yml")||dr(n)&&Xi(n).isFile()){if(!dr(n))throw new Error(`Scope file not found: ${n}`);let w=Wi(n,"utf-8"),g=t.parse(w),y=new D(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=kr(m,s,`${l}/${f}`),h=new D(p,e);return r.parseKanonaks(h)}function fs(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 kr(n,e,t){let r=a=>{let i=a.metadata.namespace_?.version;return i?pr(i):""},o=_n(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 fr(n,e){try{let t=ge(n,e);return{uri:He(n),matchesClass:Be(t.inputPattern.matchesClass),outputs:Array.from(t.outputs).sort()}}catch(t){return{uri:He(n),matchesClass:`(compile error: ${t.message})`,outputs:[]}}}function He(n){let e=n.namespace||"",t=e.indexOf("@");return`${t===-1?e:e.substring(0,t)}/${n.name}`}function Be(n){return`${n.publisher}/${n.package_}/${n.name}`}function ms(n){return n.replace(/[\\/:*?"<>|\s]+/g,"_").replace(/^_+|_+$/g,"")}async function ps(n,e,t){let r=new Map;for(let i of n){if(!(i instanceof Qi))continue;let s=In(i);s&&r.set(s,i)}let o=[];try{o=(await new es({vocabulary:new ns}).reason(t)).getInstancesOfClass(mr(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 In(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:mr(r.substring(0,o),r.substring(o+1),n.name)}function gs(n){let e=n.namespace??"";return!e||!n.name?null:`${e}/${n.name}`}import{Command as hs}from"commander";import{writeFileSync as ks,mkdirSync as ys}from"fs";import{join as ws,resolve as bs}from"path";import{KanonakParser as $s,KanonakObjectParser as vs,SubjectKanonak as br,findDerivation as Ss}from"@kanonak-protocol/sdk";var Ps={publisher:"kanonak.org",package_:"formats",name:"html"},Es={publisher:"kanonak.org",package_:"derivation",name:"default"},Ks={html:".html",markdown:".md",json:".json",yaml:".yaml",xml:".xml",svg:".svg",typescript:".ts","c-sharp":".cs",rust:".rs",python:".py"};function Ds(n){return n==="markdown"?"markdown-with-frontmatter":n}function $r(){return new hs("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 As(n,e)}catch(t){console.error(`Error: ${t.message}`),process.exit(1)}})}async function As(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 $s,o=new vs,a=await j(process.cwd(),r),i=await o.parseKanonaks(a),s=Cs(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: ${yr(s)}`);let c=_s(e.format),l=Is(e.variant),f=Ss(s,c,l,i);if(!f)throw new Error(`No derivation found for resource ${yr(s)} at (format=${e.format}, variant=${e.variant}). The class hierarchy declares no binding and no universal default applies.`);console.log(`Derivation: ${Ts(f)} \u2192 ${wr(f.transformation)}`);let m=Rs(i,f.transformation);if(!m)throw new Error(`Transformation ${wr(f.transformation)} not found in the workspace or cache. The binding pointed at a transformation the resolver cannot locate.`);let p=Ds(e.format),w=await new B().run({transformation:m,instances:[s],allKanonaks:i,repository:a,parser:r,objectParser:o,outputFormat:p}),g=bs(e.out);ys(g,{recursive:!0});let y=Es[e.format]??"";for(let k of w){let $=js(k.fileName),S=ws(g,`${$}${y}`);ks(S,k.content,"utf-8"),console.log(` wrote ${S}`)}console.log(`Done. ${w.length} artifact(s) written to ${g}`)}function Cs(n,e){for(let t of n){if(!(t instanceof br)||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 Rs(n,e){let t=`${e.publisher}/${e.package_}@${e.version}`;for(let r of n)if(r instanceof br&&r.name===e.name&&r.namespace===t)return r}function _s(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{...Ps,name:n}}function Is(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{...Ks,name:n}}function yr(n){return`${n.namespace}/${n.name}`}function wr(n){return`${n.publisher}/${n.package_}@${n.version}/${n.name}`}function Ts(n){return n.source==="instance"?"instance override":`class ${n.source.publisher}/${n.source.package_}/${n.source.name}`}function js(n){return n.replace(/[^a-zA-Z0-9._@-]+/g,"_")}import{Command as Er}from"commander";import{writeFileSync as Tn,mkdirSync as qe}from"fs";import{join as jn,resolve as Us,dirname as Un}from"path";import{KanonakParser as Os,KanonakObjectParser as Ls,SubjectKanonak as Dr,ReferenceStatement as Ns,ReferenceKanonak as Vs,ListStatement as Fs,StringStatement as Ar,EmbeddedStatement as xs,findDerivation as vr}from"@kanonak-protocol/sdk";var G="kanonak.org",J="site",Sr={publisher:"kanonak.org",package_:"formats",name:"html"},Pr={publisher:"kanonak.org",package_:"derivation",name:"default"};function Cr(){let n=new Er("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(Ms()),n}function Ms(){return new Er("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 Bs(n)}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}})}async function Bs(n){let e=new Os,t=new Ls,r=await j(process.cwd(),e),o=await t.parseKanonaks(r),a=Us(n.out);qe(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:G,package_:J,name:"StaticPage"},l={publisher:G,package_:J,name:"ResourcePage"},f={publisher:G,package_:J,name:"AggregateView"},m=C(o,c).filter(g=>s.has(g.namespace||"")),p=C(o,l).filter(g=>s.has(g.namespace||"")),h=C(o,f).filter(g=>s.has(g.namespace||""));console.log(`Found ${m.length} StaticPage(s), ${p.length} ResourcePage(s), and ${h.length} AggregateView(s) in the workspace.`);let w=new B;for(let g of m){let y=On(g,G,J,"outputPath")??`${g.name}.html`,k=vr(g,Sr,Pr,o);if(!k){console.warn(` [skip] ${g.name}: no HTML/default derivation found (check class hierarchy or universal-derivations is loaded)`);continue}let $=Ln(o,k.transformation);if(!$){console.warn(` [skip] ${g.name}: transformation ${Nn(k.transformation)} not found`);continue}let S=await w.run({transformation:$,instances:[g],allKanonaks:o,repository:r,parser:e,objectParser:t,outputFormat:"html"});if(S.length===0){console.warn(` [skip] ${g.name}: transformation produced no artifacts`);continue}let P=jn(a,y);qe(Un(P),{recursive:!0}),Tn(P,S[0].content,"utf-8"),console.log(` wrote ${P} (StaticPage ${g.name})`)}for(let g of p){let y=On(g,G,J,"outputPath")??`${g.name}.html`,k=Kr(g,G,J,"pageOf");if(!k){console.warn(` [skip] ${g.name}: no pageOf declared`);continue}let $=o.find(x=>x instanceof Dr&&x.name===k.name&&(x.namespace||"").startsWith(`${k.publisher}/${k.package_}@`));if(!$){console.warn(` [skip] ${g.name}: pageOf target ${k.publisher}/${k.package_}/${k.name} not found`);continue}let S=vr($,Sr,Pr,o);if(!S){console.warn(` [skip] ${g.name}: no derivation for target ${$.name}`);continue}let P=Ln(o,S.transformation);if(!P){console.warn(` [skip] ${g.name}: transformation ${Nn(S.transformation)} not found`);continue}let E=await w.run({transformation:P,instances:[$],allKanonaks:o,repository:r,parser:e,objectParser:t,outputFormat:"html"});if(E.length===0){console.warn(` [skip] ${g.name}: transformation produced no artifacts`);continue}let T=jn(a,y);qe(Un(T),{recursive:!0}),Tn(T,E[0].content,"utf-8"),console.log(` wrote ${T} (ResourcePage ${g.name} \u2192 ${$.name})`)}for(let g of h){let y=On(g,G,J,"outputPath");if(!y){console.warn(` [skip] ${g.name}: no outputPath declared`);continue}let k=Kr(g,G,J,"scopeClass");if(!k){console.warn(` [skip] ${g.name}: no scopeClass declared`);continue}let $={publisher:k.publisher,package_:k.package_,name:k.name},S=Hs(g,G,J,"scopeSources"),P=qs(g);if(!P){console.warn(` [skip] ${g.name}: no transformation declared`);continue}let E=Ln(o,P);if(!E){console.warn(` [skip] ${g.name}: transformation ${Nn(P)} not found`);continue}let T=await Ws(S,r),x=[],Wn=new Set;for(let uo of T){let fo=await Gs(uo,r,e,t),mo=C(fo,$);for(let an of mo){let Jn=`${an.namespace}/${an.name}`;Wn.has(Jn)||(Wn.add(Jn),x.push(an))}}console.log(` ${g.name}: ${x.length} instance(s) of ${$.publisher}/${$.package_}/${$.name} across ${T.length} scope(s)`);let Gn=await w.run({transformation:E,instances:x,allKanonaks:o,repository:r,parser:e,objectParser:t,outputFormat:"html"});if(Gn.length===0){console.warn(` [skip] ${g.name}: transformation produced no artifacts`);continue}let on=jn(a,y);qe(Un(on),{recursive:!0}),Tn(on,Gn[0].content,"utf-8"),console.log(` wrote ${on} (AggregateView ${g.name})`)}console.log("Site build complete.")}function On(n,e,t,r){for(let o of n.statement)if(o instanceof Ar&&ze(o,e,t,r))return o.object}function Hs(n,e,t,r){for(let o of n.statement){if(!(o instanceof Fs)||!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 Kr(n,e,t,r){for(let o of n.statement)if(o instanceof Ns&&ze(o,e,t,r)&&o.object instanceof Vs)return{publisher:o.object.subject.publisher,package_:o.object.subject.package_,name:o.object.subject.name}}function qs(n){for(let e of n.statement)if(e instanceof xs&&ze(e,G,J,"transformation"))return zs(e.object)}function zs(n){let e,t,r,o;for(let a of n.statement){if(!(a instanceof Ar))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 Ln(n,e){let t=`${e.publisher}/${e.package_}@${e.version}`;for(let r of n)if(r instanceof Dr&&r.name===e.name&&r.namespace===t)return r}function Nn(n){return`${n.publisher}/${n.package_}@${n.version}/${n.name}`}async function Ws(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 Gs(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 D(f,e);return r.parseKanonaks(p)}}return[]}import{Command as Js}from"commander";import{KanonakParser as Xs,PublisherIndex as Rr,CredentialStore as _r,createAuthenticatedFetch as Ir,FileSystemKanonakDocumentRepository as Ys,Reasoner as Zs,KanonakVocabulary as Qs,getGlobalCachePath as ec,makeUriKey as nc}from"@kanonak-protocol/sdk";function tc(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 Tr(){return new Js("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 oc(n,e.type):await rc(n)})}async function rc(n){let e=new _r,t=Ir(e),r=new Rr({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 oc(n,e){let t=tc(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 Xs,o=new _r,a=Ir(o),i=new Rr({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:k}of l)c.add(`${n}|${y}|${k}`);await
|
|
187
|
-
`),g.sort();for(let y of g)console.log(` ${y}`)}async function
|
|
185
|
+
`).action(async(n,e)=>{try{await As(n,e)}catch(t){console.error(`Error: ${t.message}`),process.exit(1)}})}async function As(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 $s,o=new vs,a=await j(process.cwd(),r),i=await o.parseKanonaks(a),s=Cs(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: ${yr(s)}`);let c=_s(e.format),l=Is(e.variant),f=Ss(s,c,l,i);if(!f)throw new Error(`No derivation found for resource ${yr(s)} at (format=${e.format}, variant=${e.variant}). The class hierarchy declares no binding and no universal default applies.`);console.log(`Derivation: ${Ts(f)} \u2192 ${wr(f.transformation)}`);let m=Rs(i,f.transformation);if(!m)throw new Error(`Transformation ${wr(f.transformation)} not found in the workspace or cache. The binding pointed at a transformation the resolver cannot locate.`);let p=Ds(e.format),w=await new B().run({transformation:m,instances:[s],allKanonaks:i,repository:a,parser:r,objectParser:o,outputFormat:p}),g=bs(e.out);ys(g,{recursive:!0});let y=Ks[e.format]??"";for(let k of w){let $=js(k.fileName),S=ws(g,`${$}${y}`);ks(S,k.content,"utf-8"),console.log(` wrote ${S}`)}console.log(`Done. ${w.length} artifact(s) written to ${g}`)}function Cs(n,e){for(let t of n){if(!(t instanceof br)||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 Rs(n,e){let t=`${e.publisher}/${e.package_}@${e.version}`;for(let r of n)if(r instanceof br&&r.name===e.name&&r.namespace===t)return r}function _s(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{...Ps,name:n}}function Is(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{...Es,name:n}}function yr(n){return`${n.namespace}/${n.name}`}function wr(n){return`${n.publisher}/${n.package_}@${n.version}/${n.name}`}function Ts(n){return n.source==="instance"?"instance override":`class ${n.source.publisher}/${n.source.package_}/${n.source.name}`}function js(n){return n.replace(/[^a-zA-Z0-9._@-]+/g,"_")}import{Command as Kr}from"commander";import{writeFileSync as Tn,mkdirSync as ze}from"fs";import{join as jn,resolve as Us,dirname as Un}from"path";import{KanonakParser as Os,KanonakObjectParser as Ls,SubjectKanonak as Dr,ReferenceStatement as Vs,ReferenceKanonak as Ns,ListStatement as Fs,StringStatement as Ar,EmbeddedStatement as xs,findDerivation as vr}from"@kanonak-protocol/sdk";var G="kanonak.org",J="site",Sr={publisher:"kanonak.org",package_:"formats",name:"html"},Pr={publisher:"kanonak.org",package_:"derivation",name:"default"};function Cr(){let n=new Kr("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(Ms()),n}function Ms(){return new Kr("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 Bs(n)}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}})}async function Bs(n){let e=new Os,t=new Ls,r=await j(process.cwd(),e),o=await t.parseKanonaks(r),a=Us(n.out);ze(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:G,package_:J,name:"StaticPage"},l={publisher:G,package_:J,name:"ResourcePage"},f={publisher:G,package_:J,name:"AggregateView"},m=C(o,c).filter(g=>s.has(g.namespace||"")),p=C(o,l).filter(g=>s.has(g.namespace||"")),h=C(o,f).filter(g=>s.has(g.namespace||""));console.log(`Found ${m.length} StaticPage(s), ${p.length} ResourcePage(s), and ${h.length} AggregateView(s) in the workspace.`);let w=new B;for(let g of m){let y=On(g,G,J,"outputPath")??`${g.name}.html`,k=vr(g,Sr,Pr,o);if(!k){console.warn(` [skip] ${g.name}: no HTML/default derivation found (check class hierarchy or universal-derivations is loaded)`);continue}let $=Ln(o,k.transformation);if(!$){console.warn(` [skip] ${g.name}: transformation ${Vn(k.transformation)} not found`);continue}let S=await w.run({transformation:$,instances:[g],allKanonaks:o,repository:r,parser:e,objectParser:t,outputFormat:"html"});if(S.length===0){console.warn(` [skip] ${g.name}: transformation produced no artifacts`);continue}let P=jn(a,y);ze(Un(P),{recursive:!0}),Tn(P,S[0].content,"utf-8"),console.log(` wrote ${P} (StaticPage ${g.name})`)}for(let g of p){let y=On(g,G,J,"outputPath")??`${g.name}.html`,k=Er(g,G,J,"pageOf");if(!k){console.warn(` [skip] ${g.name}: no pageOf declared`);continue}let $=o.find(x=>x instanceof Dr&&x.name===k.name&&(x.namespace||"").startsWith(`${k.publisher}/${k.package_}@`));if(!$){console.warn(` [skip] ${g.name}: pageOf target ${k.publisher}/${k.package_}/${k.name} not found`);continue}let S=vr($,Sr,Pr,o);if(!S){console.warn(` [skip] ${g.name}: no derivation for target ${$.name}`);continue}let P=Ln(o,S.transformation);if(!P){console.warn(` [skip] ${g.name}: transformation ${Vn(S.transformation)} not found`);continue}let K=await w.run({transformation:P,instances:[$],allKanonaks:o,repository:r,parser:e,objectParser:t,outputFormat:"html"});if(K.length===0){console.warn(` [skip] ${g.name}: transformation produced no artifacts`);continue}let T=jn(a,y);ze(Un(T),{recursive:!0}),Tn(T,K[0].content,"utf-8"),console.log(` wrote ${T} (ResourcePage ${g.name} \u2192 ${$.name})`)}for(let g of h){let y=On(g,G,J,"outputPath");if(!y){console.warn(` [skip] ${g.name}: no outputPath declared`);continue}let k=Er(g,G,J,"scopeClass");if(!k){console.warn(` [skip] ${g.name}: no scopeClass declared`);continue}let $={publisher:k.publisher,package_:k.package_,name:k.name},S=Hs(g,G,J,"scopeSources"),P=zs(g);if(!P){console.warn(` [skip] ${g.name}: no transformation declared`);continue}let K=Ln(o,P);if(!K){console.warn(` [skip] ${g.name}: transformation ${Vn(P)} not found`);continue}let T=await Ws(S,r),x=[],Wn=new Set;for(let uo of T){let fo=await Gs(uo,r,e,t),mo=C(fo,$);for(let an of mo){let Jn=`${an.namespace}/${an.name}`;Wn.has(Jn)||(Wn.add(Jn),x.push(an))}}console.log(` ${g.name}: ${x.length} instance(s) of ${$.publisher}/${$.package_}/${$.name} across ${T.length} scope(s)`);let Gn=await w.run({transformation:K,instances:x,allKanonaks:o,repository:r,parser:e,objectParser:t,outputFormat:"html"});if(Gn.length===0){console.warn(` [skip] ${g.name}: transformation produced no artifacts`);continue}let on=jn(a,y);ze(Un(on),{recursive:!0}),Tn(on,Gn[0].content,"utf-8"),console.log(` wrote ${on} (AggregateView ${g.name})`)}console.log("Site build complete.")}function On(n,e,t,r){for(let o of n.statement)if(o instanceof Ar&&qe(o,e,t,r))return o.object}function Hs(n,e,t,r){for(let o of n.statement){if(!(o instanceof Fs)||!qe(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 Er(n,e,t,r){for(let o of n.statement)if(o instanceof Vs&&qe(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 zs(n){for(let e of n.statement)if(e instanceof xs&&qe(e,G,J,"transformation"))return qs(e.object)}function qs(n){let e,t,r,o;for(let a of n.statement){if(!(a instanceof Ar))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 qe(n,e,t,r){let o=n.predicate?.subject;return o?o.publisher===e&&o.package_===t&&o.name===r:!1}function Ln(n,e){let t=`${e.publisher}/${e.package_}@${e.version}`;for(let r of n)if(r instanceof Dr&&r.name===e.name&&r.namespace===t)return r}function Vn(n){return`${n.publisher}/${n.package_}@${n.version}/${n.name}`}async function Ws(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 Gs(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 D(f,e);return r.parseKanonaks(p)}}return[]}import{Command as Js}from"commander";import{KanonakParser as Xs,PublisherIndex as Rr,CredentialStore as _r,createAuthenticatedFetch as Ir,FileSystemKanonakDocumentRepository as Ys,Reasoner as Zs,KanonakVocabulary as Qs,getGlobalCachePath as ec,makeUriKey as nc}from"@kanonak-protocol/sdk";function tc(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 Tr(){return new Js("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 oc(n,e.type):await rc(n)})}async function rc(n){let e=new _r,t=Ir(e),r=new Rr({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 oc(n,e){let t=tc(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 Xs,o=new _r,a=Ir(o),i=new Rr({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:k}of l)c.add(`${n}|${y}|${k}`);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[k,$,S]=y.split("|");if(!s.has(k,$,S))try{let P=await i.getPackageUrl(k,$,S),K=await a(P,k);if(!K.ok){console.error(`Warning: failed to fetch ${k}/${$}@${S}: ${K.status} ${K.statusText}`);continue}let T=await K.text();s.put(k,$,S,T)}catch(P){console.error(`Warning: failed to fetch ${k}/${$}@${S}: ${P.message}`)}}let f=new Ys(ec(),!0,r),p=await new Zs({vocabulary:new Qs}).reason(f),h=nc(t.publisher,t.package_,t.name),g=p.getInstancesOfClass(h).filter(y=>y!==h);if(g.length===0){console.log(`No instances of ${h} found in ${n}'s catalogue.`);return}console.log(`Instances of ${h} 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 jr}from"commander";function ke(n){return`${_}/${I}/${n}`}var Fn={[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 Ur(n,e,t){for(let r of e){let o=new jr(r.commandName).description(r.description.trim());for(let a of r.commands){let i=o.command(ac(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=ic(s);await sc(t,r,a,s,c)})}n.addCommand(o)}}function ac(n){let e=n.arguments.filter(t=>!t.isOption).map(t=>t.required?`<${t.argumentName}>`:`[${t.argumentName}]`);return[n.subcommandName,...e].join(" ")}function ic(n){for(let e=n.length-1;e>=0;e--)if(n[e]&&typeof n[e]=="object"&&!(n[e]instanceof jr))return n[e];return{}}async function sc(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(Fn).join(", ")}.`),process.exit(1));let i=Fn[t.actionKey];i||(console.error(`Capability subcommand '${t.subcommandName}' references unknown Action '${t.actionKey}'. Known actions: ${Object.keys(Fn).join(", ")}.`),process.exit(1)),await i(n,e,a,o)}import{existsSync as Or,readFileSync as cc,statSync as Lr}from"fs";import{resolve as lc}from"path";import{KanonakObjectParser as uc,PublisherIndex as xn,PublisherConfigResolver as dc,formatVersion as Vr,pickHighestDocument as fc}from"@kanonak-protocol/sdk";var We=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 uc;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 h=fc(f,{requestedVersion:c??void 0});if(h.chosen){let w=h.chosen.metadata.namespace_;(!w||!w.version)&&(console.error(`Document for ${i}/${s} is missing namespace metadata.`),process.exit(1));let g=Vr(w.version);this.fileCache.put(i,s,g,this.parser.save(h.chosen)),await this.deployFromDoc(e,h.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 h=await this.publisherIndex.getPackageUrl(i,s,m),w=await this.fetchFn(h,i);w.ok||(w.status===404?(console.error(`Package ${i}/${s}@${m} not found at ${h}.`),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 ${h} (${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")||Or(e)&&Lr(e).isFile()))return;let r=lc(e);(!Or(r)||!Lr(r).isFile())&&(console.error(`Local file not found: ${e}`),process.exit(1));let o=cc(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:Vr(i.version)}}async deployFromDoc(e,t,r,o,a,i,s,c){let l=new D(t,this.repository),f=await this.objectParser.parseKanonaks(l),m=Nr(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 h=p;if(i&&(h=p.filter(y=>y.name===i),h.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}`:`${h.length} ${H(m)} instance(s) from ${s}`;console.log(`Installing ${w}...`);let g=this.handlerRegistry.get(e.deploymentTargetKey);g?await g.deploy({instances:h,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:mc(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=
|
|
190
|
-
`);let a=new dc,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=xn.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 k=[...y].sort(($,S)=>{let P=xn.parseVersion($),
|
|
191
|
-
`);let w=new Map;for(let g of p){let y=`${g.publisher}/${g.package_}@${g.version}`,k=w.get(y);k?k.push(g):w.set(y,[g])}for(let[g,y]of w){let k=y[0],$=`${k.publisher}/${k.package_}`,S=y.length===1;console.log(` ${g}`),console.log(` ${y.length} skill${S?"":"s"}:`);for(let P of y)console.log(` - ${P.subject.name}`);if(console.log(""),S)console.log(" install:"),console.log(` kanonak ${e.commandName} add ${$}/${k.subject.name}`);else{console.log(" install one of them:");for(let P of y)console.log(` kanonak ${e.commandName} add ${$}/${P.subject.name}`);console.log(" install all of them:"),console.log(` kanonak ${e.commandName} add ${$}`)}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
|
|
192
|
-
`;function Xe(n){let e=Gr(n,Xr);if(!Sc(e))return{version:"1",lastUpdated:new Date().toISOString(),skills:{}};let t=$c(e,"utf-8"),r=Jr.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 Hn(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=Gr(n,Xr),o=Jr.dump(e,{lineWidth:-1,sortKeys:!1,quotingType:'"'});vc(r,Pc+o,"utf-8")}var Yr="kanonak.org",Zr="skill-to-skill-md",Qe=class{parser=new Rc;objectParser=new Cc;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 Ic(o,this.objectParser);if(!i){console.error(`Cannot deploy: ${Yr}/${Zr}@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 De(a,o),l=await Bn(a,o),f=Xe(c),m=t[0].namespace,{publisher:p,package_:h,version:w}=Tc(m);for(let g of s){let y=await Je(g.fileName,a,o),k=Ye(Ze(y,l));
|
|
193
|
-
`;function nn(n){let e=ao(n,so);if(!
|
|
189
|
+
Updated ${s} instance(s).`)}async search(e,t){let r=t.publisher??"kanonak.org",o=Nr(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 dc,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=xn.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 k=[...y].sort(($,S)=>{let P=xn.parseVersion($),K=xn.parseVersion(S);return!P||!K?0:P.major!==K.major?K.major-P.major:P.minor!==K.minor?K.minor-P.minor:K.patch-P.patch});m.set(g,k[0])}let p=[],h=0;for(let[g,y]of m){let k=this.fileCache.get(r,g,y);if(!k)try{let $=await this.publisherIndex.getPackageUrl(r,g,y),S=await this.fetchFn($,r);if(!S.ok)continue;k=await S.text(),this.fileCache.put(r,g,y,k)}catch{continue}try{let $=this.parser.parse(k),S=new D($,this.repository),P=await this.objectParser.parseKanonaks(S),K=C(P,o);for(let T of K)p.push({publisher:r,package_:g,version:y,subject:T});h++}catch{continue}}if(p.length===0){console.log(`No ${H(o)} instances found across ${h} package(s).`);return}console.log(`Found ${p.length} ${H(o)} instance(s) in ${h} package(s):
|
|
191
|
+
`);let w=new Map;for(let g of p){let y=`${g.publisher}/${g.package_}@${g.version}`,k=w.get(y);k?k.push(g):w.set(y,[g])}for(let[g,y]of w){let k=y[0],$=`${k.publisher}/${k.package_}`,S=y.length===1;console.log(` ${g}`),console.log(` ${y.length} skill${S?"":"s"}:`);for(let P of y)console.log(` - ${P.subject.name}`);if(console.log(""),S)console.log(" install:"),console.log(` kanonak ${e.commandName} add ${$}/${k.subject.name}`);else{console.log(" install one of them:");for(let P of y)console.log(` kanonak ${e.commandName} add ${$}/${P.subject.name}`);console.log(" install all of them:"),console.log(` kanonak ${e.commandName} add ${$}`)}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 Nr(n){if(!n)return;let e=n.split("/");if(e.length===3)return{publisher:e[0],package_:e[1],name:e[2]}}function mc(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=pc(t,r);return s===0?100:s<=2?Math.max(1,20-s*5):0}function pc(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 Ge=class{handlers=new Map;register(e,t){this.handlers.set(e,t)}get(e){return this.handlers.get(e)??null}};import{mkdirSync as Ec,rmSync as Kc,existsSync as Ye,readdirSync as Dc,writeFileSync as Ac}from"fs";import{join as Ze}from"path";import{KanonakObjectParser as Cc,KanonakParser as Rc,computeIntegrity as _c}from"@kanonak-protocol/sdk";import{join as Mn}from"path";import{homedir as Fr}from"os";import{KanonakObjectParser as gc}from"@kanonak-protocol/sdk";var te="kanonak.org",re="agent-skills",Mr={publisher:te,package_:re,name:"Client"},Br={publisher:te,package_:re,name:"clientId"},hc={publisher:te,package_:re,name:"projectSkillDir"},kc={publisher:te,package_:re,name:"userSkillDir"},yc={publisher:te,package_:re,name:"skillFileName"},Hr="agents";async function De(n,e){let t=(n.client??zr()??Hr).toLowerCase(),r=n.scope??"project",o=await Wr(t,e);if(!o){let s=await wc(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"?kc:hc);if(!i)throw new Error(`Client "${t}" has no ${r==="user"?"userSkillDir":"projectSkillDir"} declared.`);return bc(i)}async function Je(n,e,t){let r=await De(e,t);return Mn(r,n)}async function Bn(n,e){let t=(n.client??zr()??Hr).toLowerCase(),r=await Wr(t,e);return r?R(r,yc)??"SKILL.md":"SKILL.md"}function zr(){if(process.env.CLAUDE_CODE||process.env.CLAUDE_PROJECT_DIR)return"claude-code"}var xr=new WeakMap;async function qr(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 gc,i=new D(o,n),s=await a.parseKanonaks(i);return xr.set(n,s),s}async function Wr(n,e){let t=await qr(e),r=C(t,Mr);for(let o of r)if(R(o,Br)===n)return o}async function wc(n){let e=await qr(n),t=C(e,Mr),r=[];for(let o of t){let a=R(o,Br);a&&r.push(a)}return r}function bc(n){return n.startsWith("~/")?Mn(Fr(),n.slice(2)):n==="~"?Fr():n.startsWith("/")||/^[A-Za-z]:[\\/]/.test(n)?n:Mn(process.cwd(),n)}import{readFileSync as $c,writeFileSync as vc,existsSync as Sc}from"fs";import{join as Gr}from"path";import Jr from"js-yaml";var Xr="skills.lock",Pc=`# This file is generated by Kanonak CLI. Do not edit manually.
|
|
192
|
+
`;function Xe(n){let e=Gr(n,Xr);if(!Sc(e))return{version:"1",lastUpdated:new Date().toISOString(),skills:{}};let t=$c(e,"utf-8"),r=Jr.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 Hn(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=Gr(n,Xr),o=Jr.dump(e,{lineWidth:-1,sortKeys:!1,quotingType:'"'});vc(r,Pc+o,"utf-8")}var Yr="kanonak.org",Zr="skill-to-skill-md",Qe=class{parser=new Rc;objectParser=new Cc;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 Ic(o,this.objectParser);if(!i){console.error(`Cannot deploy: ${Yr}/${Zr}@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 De(a,o),l=await Bn(a,o),f=Xe(c),m=t[0].namespace,{publisher:p,package_:h,version:w}=Tc(m);for(let g of s){let y=await Je(g.fileName,a,o),k=Ye(Ze(y,l));Ec(y,{recursive:!0}),Ac(Ze(y,l),g.content,"utf-8"),f.skills[g.fileName]={publisher:p,package_:h,version:w,resolved:p?`kanonak://${p}/${h}@${w}`:"",integrity:_c(g.content)},console.log(` ${k?"Updated":"Installed"} skill "${g.fileName}" \u2192 ${y}`)}Hn(c,f)}async undeploy(e,t){let{repository:r,options:o}=t,a=await Je(e,o,r);Ye(a)||(console.error(`Skill "${e}" is not installed at ${a}`),process.exit(1)),Kc(a,{recursive:!0,force:!0});let i=await De(o,r),s=Xe(i);delete s.skills[e],Hn(i,s),console.log(`Removed skill "${e}" from ${a}`)}async list(e){let{repository:t,options:r}=e,o=await De(r,t),a=Xe(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 Je(c,r,t)});let s=await Bn(r,t);if(Ye(o))try{let c=Dc(o,{withFileTypes:!0});for(let l of c){if(!l.isDirectory()||a.skills[l.name])continue;let f=Ze(o,l.name,s);Ye(f)&&i.push({name:l.name,publisher:"",package_:"",version:"",path:Ze(o,l.name)})}}catch{}return i}};async function Ic(n,e){let t=await n.getDocumentsByNamespaceAsync(Yr,Zr);if(t.length===0)return;let r=new D(t[0],n),o=await e.parseKanonaks(r);return C(o,u.InstanceTransformation)[0]}function Tc(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 Wc,rmSync as Gc,existsSync as qn,readdirSync as Jc,writeFileSync as Xc,statSync as Yc}from"fs";import{join as tn}from"path";import{KanonakObjectParser as Zc,KanonakParser as Qc,computeIntegrity as el}from"@kanonak-protocol/sdk";import{join as Qr}from"path";import{homedir as eo}from"os";import{KanonakObjectParser as jc}from"@kanonak-protocol/sdk";var oe="kanonak.org",ae="agent-skills",to={publisher:oe,package_:ae,name:"Client"},ro={publisher:oe,package_:ae,name:"clientId"},Uc={publisher:oe,package_:ae,name:"projectAgentDir"},Oc={publisher:oe,package_:ae,name:"userAgentDir"},Lc={publisher:oe,package_:ae,name:"agentFileFormat"},Vc="agents";function Nc(){if(process.env.CLAUDE_CODE||process.env.CLAUDE_PROJECT_DIR)return"claude-code"}async function en(n,e){let t=(n.client??Nc()??Vc).toLowerCase(),r=n.scope??"project",o=await Fc(t,e);if(!o){let f=await xc(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"?Oc:Uc);if(!i)throw new Error(`Client "${t}" has no ${r==="user"?"userAgentDir":"projectAgentDir"} declared.`);let c=ue(o,Lc)?.name==="toml"?"toml":"markdown-frontmatter",l=c==="toml"?".toml":".md";return{agentsDir:Mc(i),format:c,fileExtension:l}}var no=new WeakMap;async function oo(n){let e=no.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 jc,i=new D(o,n),s=await a.parseKanonaks(i);return no.set(n,s),s}async function Fc(n,e){let t=await oo(e),r=C(t,to);for(let o of r)if(R(o,ro)===n)return o}async function xc(n){let e=await oo(n),t=C(e,to),r=[];for(let o of t){let a=R(o,ro);a&&r.push(a)}return r}function Mc(n){return n.startsWith("~/")?Qr(eo(),n.slice(2)):n==="~"?eo():n.startsWith("/")||/^[A-Za-z]:[\\/]/.test(n)?n:Qr(process.cwd(),n)}import{readFileSync as Bc,writeFileSync as Hc,existsSync as zc}from"fs";import{join as ao}from"path";import io from"js-yaml";var so="agents.lock",qc=`# This file is generated by Kanonak CLI. Do not edit manually.
|
|
193
|
+
`;function nn(n){let e=ao(n,so);if(!zc(e))return{version:"1",lastUpdated:new Date().toISOString(),agents:{}};let t=Bc(e,"utf-8"),r=io.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 zn(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=ao(n,so),o=io.dump(e,{lineWidth:-1,sortKeys:!1,quotingType:'"'});Hc(r,qc+o,"utf-8")}var co="kanonak.org",lo="agent-to-agent-file",rn=class{parser=new Qc;objectParser=new Zc;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 en(a,o),l=await nl(o,this.objectParser);if(!l){console.error(`Cannot deploy: ${co}/${lo}@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}Wc(i,{recursive:!0});let p=nn(i),h=t[0].namespace,{publisher:w,package_:g,version:y}=rl(h);for(let k of m){let $=`${k.fileName}${c}`,S=tn(i,$),P=qn(S);Xc(S,k.content,"utf-8"),p.agents[k.fileName]={publisher:w,package_:g,version:y,resolved:w?`kanonak://${w}/${g}@${y}`:"",integrity:el(k.content),fileName:$},console.log(` ${P?"Updated":"Installed"} agent "${k.fileName}" \u2192 ${S}`)}zn(i,p)}async undeploy(e,t){let{repository:r,options:o}=t,{agentsDir:a}=await en(o,r),i=nn(a),s=i.agents[e];s||(console.error(`Agent "${e}" is not installed at ${a}`),process.exit(1));let c=tn(a,s.fileName);qn(c)&&Gc(c,{force:!0}),delete i.agents[e],zn(a,i),console.log(`Removed agent "${e}" from ${c}`)}async list(e){let{repository:t,options:r}=e,{agentsDir:o}=await en(r,t),a=nn(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:tn(o,c.fileName)});if(qn(o))try{let s=Jc(o,{withFileTypes:!0});for(let c of s){if(!c.isFile()||c.name==="agents.lock")continue;let l=tn(o,c.name),f=tl(c.name);if(!a.agents[f]){try{if(!Yc(l).isFile())continue}catch{continue}i.push({name:f,publisher:"",package_:"",version:"",path:l})}}}catch{}return i}};async function nl(n,e){let t=await n.getDocumentsByNamespaceAsync(co,lo);if(t.length===0)return;let r=new D(t[0],n),o=await e.parseKanonaks(r);return C(o,u.InstanceTransformation)[0]}function tl(n){let e=n.lastIndexOf(".");return e===-1?n:n.substring(0,e)}function rl(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 ml=sl(il(import.meta.url)),pl=JSON.parse(al(cl(ml,"..","package.json"),"utf-8")),F=new ol;F.name("kanonak").description("Kanonak Protocol CLI - Validate and resolve Kanonak ontology packages").version(pl.version);F.command("validate <path>").description("Validate .kan.yml file(s). Resolves imports via HTTP from publisher domains.").action(async n=>{await et(n)});F.command("install [package]").description("Install a package and its dependencies, or install all from kanonak.lock.").action(async n=>{await nt(n)});F.command("deps <path>").description("Show resolved dependency tree for a .kan.yml file.").action(async n=>{await rt(n)});F.command("login <publisher>").description("Authenticate with a package publisher using OAuth 2.0.").action(async n=>{await ct(n)});F.command("logout <publisher>").description("Revoke tokens and remove stored credentials for a publisher.").action(async n=>{await lt(n)});F.addCommand(Pt());F.addCommand(gr());F.addCommand($r());F.addCommand(Cr());F.addCommand(Tr());async function gl(){try{let n=new M,e=new ll,t=new dl,r=fl(t),o=new ul({fetchFn:r}),a=await j(process.cwd(),e),i=new Ge;i.register("kanonak.org/capabilities/agent-skill-deployment",new Qe),i.register("kanonak.org/agent-capabilities/agent-instance-deployment",new rn);let s=await $t(n,e,a),c=new We(n,e,o,r,i,a);Ur(F,s,c)}catch{}}await gl();F.parse();
|
|
@@ -46,4 +46,30 @@ export declare class ExpressionEngineV3 {
|
|
|
46
46
|
* single-valued for one instance and multi-valued for another).
|
|
47
47
|
*/
|
|
48
48
|
private evaluateList;
|
|
49
|
+
/**
|
|
50
|
+
* Re-run an iterator with reverse iteration order, preserving each
|
|
51
|
+
* iteration's body output as a logical group. Returns `undefined`
|
|
52
|
+
* for non-iterator sources so the caller falls back to flat-list
|
|
53
|
+
* reversal.
|
|
54
|
+
*
|
|
55
|
+
* Why this exists: iterators (PairwiseMap, ForEach, WindowedMap)
|
|
56
|
+
* flatten array body results into a single output list. Wrapping
|
|
57
|
+
* one in `tx.Reverse` then applies a flat-list reverse, which
|
|
58
|
+
* scrambles per-iteration contents (#18). Re-iterating with
|
|
59
|
+
* reversed source preserves per-iteration body output structure
|
|
60
|
+
* while delivering the iteration sequence in newest-first order.
|
|
61
|
+
*
|
|
62
|
+
* For PairwiseMap, `firstVar` and `secondVar` still bind in
|
|
63
|
+
* chronological order (earlier→later) so per-pair body semantics
|
|
64
|
+
* are unchanged — only the visit order of pairs reverses. This
|
|
65
|
+
* matches the canonical "ascending sortBy + Reverse for newest-
|
|
66
|
+
* first changelog" idiom from issue #14's worked example.
|
|
67
|
+
*
|
|
68
|
+
* ListMap is included even though ListMap doesn't flatten —
|
|
69
|
+
* Reverse over ListMap should still surface body output in
|
|
70
|
+
* reverse order, which falling back to flat reversal would do
|
|
71
|
+
* correctly already; including it here keeps the semantics
|
|
72
|
+
* consistent (re-iterate with reversed source).
|
|
73
|
+
*/
|
|
74
|
+
private evaluateReverseIterator;
|
|
49
75
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kanonak-protocol/cli",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.11.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.
|
|
38
|
-
"@kanonak-protocol/types": "^3.
|
|
37
|
+
"@kanonak-protocol/sdk": "^3.11.0",
|
|
38
|
+
"@kanonak-protocol/types": "^3.11.0",
|
|
39
39
|
"commander": "^13.0.0",
|
|
40
40
|
"js-yaml": "^4.1.1"
|
|
41
41
|
},
|