@kanonak-protocol/cli 3.0.0 → 3.1.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,25 +1,25 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{Command as
|
|
3
|
-
`).some(o=>o.trim()===t||o.trim()===t+"/"))return;
|
|
2
|
+
import{Command as Ns}from"commander";import{readFileSync as Fs}from"fs";import{fileURLToPath as Vs}from"url";import{dirname as Bs,join as Ms}from"path";import{KanonakParser as Hs,PublisherIndex as qs,CredentialStore as zs,createAuthenticatedFetch as Ws}from"@kanonak-protocol/sdk";import{readFileSync as Vr,statSync as Br}from"fs";import{resolve as Mr,dirname as Hr}from"path";import{KanonakParser as qr,KanonakObjectValidator as zr,ValidationSeverity as En}from"@kanonak-protocol/sdk";import{readFileSync as Tr,readdirSync as jr}from"fs";import{join as xr,dirname as Ur,basename as Cn}from"path";import{InMemoryKanonakDocumentRepository as Or,FileSystemKanonakDocumentRepository as Lr,HttpKanonakDocumentRepository as Nr,getGlobalCachePath as Fr}from"@kanonak-protocol/sdk";import{mkdirSync as Cr,readFileSync as Kn,writeFileSync as Dn,existsSync as Je,appendFileSync as Er}from"fs";import{join as Ar,dirname as Rr,isAbsolute as Ir}from"path";import{getGlobalCachePath as _r}from"@kanonak-protocol/sdk";var U=class{constructor(e=_r()){this.cacheDir=e;this.isProjectLocal=!Ir(e)}cacheDir;gitignoreChecked=!1;isProjectLocal;get(e,t,r){let o=this.getPath(e,t,r);return Je(o)?Kn(o,"utf-8"):null}put(e,t,r,o){let i=this.getPath(e,t,r);Cr(Rr(i),{recursive:!0}),Dn(i,o,"utf-8"),this.isProjectLocal&&this.ensureGitignore()}has(e,t,r){return Je(this.getPath(e,t,r))}ensureGitignore(){if(this.gitignoreChecked)return;this.gitignoreChecked=!0;let e=".gitignore",t=this.cacheDir;if(Je(e)){if(Kn(e,"utf-8").split(`
|
|
3
|
+
`).some(o=>o.trim()===t||o.trim()===t+"/"))return;Er(e,`
|
|
4
4
|
${t}/
|
|
5
5
|
`)}else Dn(e,`${t}/
|
|
6
|
-
`)}getPath(e,t,r){return
|
|
6
|
+
`)}getPath(e,t,r){return Ar(this.cacheDir,e,`${t}@${r}.kan.yml`)}};function me(n){let e=n;for(;;){let t=Ur(e);if(t===e)break;if(Cn(e).includes(".")||Cn(t).includes(".")){e=t;continue}break}return e}function ve(n,e){for(let t of jr(n,{withFileTypes:!0})){let r=xr(n,t.name);t.isDirectory()&&t.name!=="node_modules"&&t.name!==".kanonak"?ve(r,e):t.name.endsWith(".kan.yml")&&e.push(r)}}var Ye=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 O(n,e){let t=[];ve(n,t);let r=new Or(e);for(let s of t)try{let c=Tr(s,"utf-8"),l=e.parse(c),u=l.metadata.namespace_;if(u){let d=`${u.publisher}/${u.package_}@${u.version}`;await r.saveDocumentAsync(l,d)}}catch{}let o=new Lr(Fr(),!0,e),i=new U,a=new Nr({getFromCache:(s,c,l)=>i.get(s,c,l),onFetch:(s,c,l,u)=>i.put(s,c,l,u)});return new Ye(r,o,a)}async function An(n){let e=Mr(n),t=Br(e),r=t.isDirectory()?me(e):me(Hr(e)),o=new qr,i=new zr(o),a=await O(r,o),s=[];if(t.isDirectory()?ve(e,s):s.push(e),s.length===0){console.log("No .kan.yml files found.");return}let c=0,l=0;for(let u of s){let d=Vr(u,"utf-8"),p=o.parseWithErrors(d);if(p.errors&&p.errors.length>0){console.log(`
|
|
7
7
|
${u}:`);for(let h of p.errors)console.log(` ERROR (parse): ${h.message} [line ${h.line}:${h.column}]`),c++;continue}let k=p.document;if(!k){console.log(`
|
|
8
8
|
${u}:`),console.log(" ERROR: Failed to parse document"),c++;continue}let b=await i.validateAsync(k,a),g=b.errors.filter(h=>h.severity===En.Error),y=b.errors.filter(h=>h.severity===En.Warning);if(g.length>0||y.length>0){let h=k.metadata.namespace_,w=h?`${h.publisher}/${h.package_}@${h.version}`:u;console.log(`
|
|
9
9
|
${w}:`);for(let $ of g)console.log(` ERROR: ${$.message}`),$.suggestion&&console.log(` -> ${$.suggestion}`);for(let $ of y)console.log(` WARN: ${$.message}`)}c+=g.length,l+=y.length}console.log(`
|
|
10
|
-
${s.length} file(s) validated. ${c} error(s), ${l} warning(s).`),c>0&&process.exit(1)}import{KanonakParser as
|
|
11
|
-
Installed ${Object.keys(a.packages).length} package(s) from lock file.`);return}let s=ee(n);s||(console.error(`Invalid package reference: "${n}"`),console.error("Expected format: {publisher}/{package}[@{version}]"),process.exit(1));let{publisher:c,packageName:l,version:u,instanceName:d}=s;d&&(console.error(`\`kanonak install\` works on whole packages \u2014 got an instance suffix "/${d}".`),console.error(`Try: kanonak install ${c}/${l}${u?"@"+u:""}`),console.error("(Use `kanonak <capability> add` if you want to install one named instance.)"),process.exit(1));let p=u??await i.getHighestVersion(c,l);p||(console.error(`Could not resolve version for "${c}/${l}".`),console.error("Check the spelling, or run a search to see what the publisher offers."),process.exit(1)),console.log(`Installing ${c}/${l}@${p}...`);let k=new Set;await In(c,l,p,e,t,i,o,k,a),
|
|
12
|
-
Installed ${k.size} package(s).`)}async function In(n,e,t,r,o,i,a,s,c){let l=`${n}/${e}@${t}`;if(s.has(l))return;s.add(l);let u=`${n}/${e}`,d=r.get(n,e,t),p;if(d)console.log(` ${l} (cached)`),p=await i.getPackageUrl(n,e,t);else{p=await i.getPackageUrl(n,e,t);let g=await a(p,n);if(!g.ok)throw new Error(`Failed to fetch ${p} (${g.status} ${g.statusText})`);d=await g.text(),r.put(n,e,t,d),console.log(` ${l}`)}let k={},b=o.parse(d);if(b.metadata.imports)for(let[g,y]of Object.entries(b.metadata.imports))for(let h of y){let w=await i.resolveVersion(g,h);w?(k[`${g}/${h.packageName}`]=w,await In(g,h.packageName,w,r,o,i,a,s,c)):console.error(` WARNING: Could not resolve ${g}/${h.packageName} ${h.package_}`)}c.packages[u]={version:t,resolved:p,integrity:
|
|
10
|
+
${s.length} file(s) validated. ${c} error(s), ${l} warning(s).`),c>0&&process.exit(1)}import{KanonakParser as Wr,PublisherIndex as Gr,CredentialStore as Xr,createAuthenticatedFetch as Jr}from"@kanonak-protocol/sdk";import{loadLockFile as Yr,saveLockFile as Zr,computeIntegrity as Qr}from"@kanonak-protocol/sdk";function ee(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,i=null,a=null,s=r.indexOf("@");if(s!==-1){o=r.substring(0,s);let c=r.substring(s+1),l=c.indexOf("/");l===-1?i=c||null:(i=c.substring(0,l)||null,a=c.substring(l+1)||null)}else{let c=r.indexOf("/");c===-1?o=r:(o=r.substring(0,c),a=r.substring(c+1)||null)}return!o||a&&a.includes("/")||i&&i.includes("@")?null:{publisher:t,packageName:o,version:i,instanceName:a}}async function Rn(n){let e=new U,t=new Wr,r=new Xr,o=Jr(r),i=new Gr({fetchFn:o}),a=Yr()??{version:"1",lastUpdated:new Date().toISOString(),packages:{}};if(!n){Object.keys(a.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(a.packages).length} package(s) from kanonak.lock...`);for(let[b,g]of Object.entries(a.packages)){let y=b.indexOf("/"),h=b.substring(0,y),w=b.substring(y+1),$=e.get(h,w,g.version);if($)console.log(` ${b}@${g.version} (cached)`);else{let P=g.resolved,K=await o(P,h);if(!K.ok)throw new Error(`Failed to fetch ${P} (${K.status} ${K.statusText})`);$=await K.text(),e.put(h,w,g.version,$),console.log(` ${b}@${g.version}`)}}console.log(`
|
|
11
|
+
Installed ${Object.keys(a.packages).length} package(s) from lock file.`);return}let s=ee(n);s||(console.error(`Invalid package reference: "${n}"`),console.error("Expected format: {publisher}/{package}[@{version}]"),process.exit(1));let{publisher:c,packageName:l,version:u,instanceName:d}=s;d&&(console.error(`\`kanonak install\` works on whole packages \u2014 got an instance suffix "/${d}".`),console.error(`Try: kanonak install ${c}/${l}${u?"@"+u:""}`),console.error("(Use `kanonak <capability> add` if you want to install one named instance.)"),process.exit(1));let p=u??await i.getHighestVersion(c,l);p||(console.error(`Could not resolve version for "${c}/${l}".`),console.error("Check the spelling, or run a search to see what the publisher offers."),process.exit(1)),console.log(`Installing ${c}/${l}@${p}...`);let k=new Set;await In(c,l,p,e,t,i,o,k,a),Zr(a),console.log(`
|
|
12
|
+
Installed ${k.size} package(s).`)}async function In(n,e,t,r,o,i,a,s,c){let l=`${n}/${e}@${t}`;if(s.has(l))return;s.add(l);let u=`${n}/${e}`,d=r.get(n,e,t),p;if(d)console.log(` ${l} (cached)`),p=await i.getPackageUrl(n,e,t);else{p=await i.getPackageUrl(n,e,t);let g=await a(p,n);if(!g.ok)throw new Error(`Failed to fetch ${p} (${g.status} ${g.statusText})`);d=await g.text(),r.put(n,e,t,d),console.log(` ${l}`)}let k={},b=o.parse(d);if(b.metadata.imports)for(let[g,y]of Object.entries(b.metadata.imports))for(let h of y){let w=await i.resolveVersion(g,h);w?(k[`${g}/${h.packageName}`]=w,await In(g,h.packageName,w,r,o,i,a,s,c)):console.error(` WARNING: Could not resolve ${g}/${h.packageName} ${h.package_}`)}c.packages[u]={version:t,resolved:p,integrity:Qr(d),dependencies:k}}import{readFileSync as eo}from"fs";import{resolve as no,dirname as to}from"path";import{KanonakParser as ro}from"@kanonak-protocol/sdk";async function _n(n){let e=no(n),t=eo(e,"utf-8"),r=new ro,o=r.parse(t),i=o.metadata.namespace_,a=i?`${i.publisher}/${i.package_}@${i.version}`:n;if(console.log(a),!o.metadata.imports){console.log(" (no imports)");return}let s=me(to(e)),c=await O(s,r),l=new Set;for(let[u,d]of Object.entries(o.metadata.imports))for(let p of d)await Tn(u,p,c,l," ")}async function Tn(n,e,t,r,o){let i=`${n}/${e.packageName}`;if(r.has(i)){console.log(`${o}${i} (${e.package_}) [circular]`);return}r.add(i);let a;try{a=await t.getHighestCompatibleVersionAsync(n,e)}catch{console.log(`${o}${i} (${e.package_}) [fetch failed]`);return}if(!a){console.log(`${o}${i} (${e.package_}) [not found]`);return}let s=a.metadata.namespace_?.version?.toString()??"?";if(console.log(`${o}${n}/${e.packageName}@${s}`),a.metadata.imports)for(let[c,l]of Object.entries(a.metadata.imports))for(let u of l)await Tn(c,u,t,r,o+" ")}import{createHash as ao,randomBytes as Un}from"crypto";import{createServer as io}from"http";import{execFile as Ze}from"child_process";import{CredentialStore as so,generateDPoPKeyPair as co,createDPoPProof as jn,serverSupportsDPoP as lo}from"@kanonak-protocol/sdk";import{normalizeHost as oo}from"@kanonak-protocol/sdk";var V=class{cache=new Map;async discover(e){let t=oo(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 i=`https://${t}/.well-known/openid-configuration`;o=await this.tryEndpoint(i)}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 i=o instanceof Error?o.message:String(o);return i.includes("ENOTFOUND")||i.includes("ECONNREFUSED")?(console.error(` OAuth discovery: ${e} \u2014 host unreachable (${i})`),console.error(" If the server is behind a VPN, ensure you are connected.")):i.includes("CERT")||i.includes("SSL")||i.includes("TLS")?(console.error(` OAuth discovery: ${e} \u2014 TLS error (${i})`),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: ${i}`),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:pe(r.issuer),authorizationEndpoint:pe(r.authorization_endpoint),tokenEndpoint:pe(r.token_endpoint),registrationEndpoint:pe(r.registration_endpoint),revocationEndpoint:pe(r.revocation_endpoint),scopesSupported:ne(r.scopes_supported),responseTypesSupported:ne(r.response_types_supported),grantTypesSupported:ne(r.grant_types_supported),codeChallengeMethodsSupported:ne(r.code_challenge_methods_supported),tokenEndpointAuthMethodsSupported:ne(r.token_endpoint_auth_methods_supported),dpopSigningAlgValuesSupported:ne(r.dpop_signing_alg_values_supported)}}};function pe(n){return typeof n=="string"?n:null}function ne(n){return Array.isArray(n)?n.filter(e=>typeof e=="string"):null}var re=class{discovery;credentialStore;constructor(e,t){this.discovery=e??new V,this.credentialStore=t??new so}async authorize(e,t=[]){console.log(`Starting OAuth flow for ${e}...`);let r=await this.discovery.discover(e);if(!r)return j(`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 j(`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 i=
|
|
19
|
-
Ensure your Node.js installation supports EC P-256 curves.`)}}let{redirectUri:s,port:c,waitForCallback:l,close:u}=await
|
|
18
|
+
Contact the IDP administrator to ensure these are included in the discovery document.`);let i=lo(r.dpopSigningAlgValuesSupported),a=null;if(i){console.log(" Server supports DPoP (RFC 9449) \u2014 generating key pair...");try{a=co()}catch(K){return j(`Failed to generate DPoP key pair: ${te(K)}
|
|
19
|
+
Ensure your Node.js installation supports EC P-256 curves.`)}}let{redirectUri:s,port:c,waitForCallback:l,close:u}=await yo(),d=await this.credentialStore.getCredential(e),p=d?.clientId??null,k=d?.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 u(),j(K.error);p=K.clientId,k=K.clientSecret??null}if(!p)return u(),j(`No OAuth client credentials for '${e}' and the server does not support dynamic client registration (no registration_endpoint in metadata).
|
|
20
20
|
You must pre-register a client with your IDP and configure the client_id.
|
|
21
21
|
Ask your IDP administrator to enable dynamic client registration (RFC 7591),
|
|
22
|
-
or add a registration_endpoint to the OAuth metadata.`);let b=
|
|
22
|
+
or add a registration_endpoint to the OAuth metadata.`);let b=fo(),g=mo(b),y=po(),h=go(r.authorizationEndpoint,p,s,t,y,g);console.log(` Opening browser for authorization on port ${c}...`),console.log(" If the browser doesn't open, navigate to:"),console.log(` ${h}`),bo(h);let w=await l();if(u(),!w)return j(`Authorization timed out after 5 minutes.
|
|
23
23
|
The browser authorization was not completed in time.
|
|
24
24
|
Re-run 'kanonak login ${e}' and complete the browser authorization promptly.`);if(!w.code){let K=w.error?`: ${w.error}`:"";return j(`No authorization code received${K}.
|
|
25
25
|
The IDP may have rejected the authorization request.
|
|
@@ -41,58 +41,58 @@ Installed ${k.size} package(s).`)}async function In(n,e,t,r,o,i,a,s,c){let l=`${
|
|
|
41
41
|
Ask your IDP administrator to enable RFC 7591 support, or pre-register a client manually.`}}let o=await r.json(),i=o.client_id;return i?{success:!0,clientId:i,clientSecret:o.client_secret}:{success:!1,error:`Dynamic client registration response from ${e} did not contain a client_id.
|
|
42
42
|
The IDP response may be malformed. Contact your IDP administrator.`}}async exchangeCode(e,t,r,o,i,a,s){let c=new URLSearchParams({grant_type:"authorization_code",client_id:t,code:o,redirect_uri:i,code_verifier:a});r&&c.set("client_secret",r);let l={"Content-Type":"application/x-www-form-urlencoded"};if(s)try{l.DPoP=jn(s.privateKey,s.publicKey,"POST",e)}catch(d){return{success:!1,error:`Failed to create DPoP proof for token exchange: ${te(d)}
|
|
43
43
|
The stored key pair may be corrupted. Run 'kanonak login' to re-authenticate.`}}let u;try{u=await fetch(e,{method:"POST",headers:l,body:c.toString()})}catch(d){return{success:!1,error:`Token exchange request to ${e} failed: ${te(d)}
|
|
44
|
-
Ensure the token endpoint is reachable.`}}if(!u.ok){let d=await Qe(u),p=
|
|
44
|
+
Ensure the token endpoint is reachable.`}}if(!u.ok){let d=await Qe(u),p=uo(d);return{success:!1,error:`Token exchange failed.
|
|
45
45
|
Endpoint: ${e}
|
|
46
46
|
HTTP ${u.status}: ${d}`+(p?`
|
|
47
|
-
${p}`:"")}}return{success:!0,tokens:xn(await u.json())}}async refreshTokenRequest(e,t,r,o,i){let a=new URLSearchParams({grant_type:"refresh_token",client_id:t,refresh_token:o});r&&a.set("client_secret",r);let s={"Content-Type":"application/x-www-form-urlencoded"};if(i)try{s.DPoP=jn(i.privateKey,i.publicKey,"POST",e)}catch(l){return{success:!1,error:`Failed to create DPoP proof for token refresh: ${te(l)}`}}let c;try{c=await fetch(e,{method:"POST",headers:s,body:a.toString()})}catch(l){return{success:!1,error:`Token refresh request to ${e} failed: ${te(l)}`}}if(!c.ok){let l=await Qe(c);return{success:!1,error:`Token refresh failed \u2014 HTTP ${c.status}: ${l}`}}return{success:!0,tokens:xn(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 j(n){return{success:!1,error:n}}function xn(n){return{accessToken:n.access_token,refreshToken:n.refresh_token,expiresIn:typeof n.expires_in=="number"?n.expires_in:void 0}}function te(n){return n instanceof Error?n.message:String(n)}async function Qe(n){try{return await n.text()}catch{return"(could not read response body)"}}function
|
|
47
|
+
${p}`:"")}}return{success:!0,tokens:xn(await u.json())}}async refreshTokenRequest(e,t,r,o,i){let a=new URLSearchParams({grant_type:"refresh_token",client_id:t,refresh_token:o});r&&a.set("client_secret",r);let s={"Content-Type":"application/x-www-form-urlencoded"};if(i)try{s.DPoP=jn(i.privateKey,i.publicKey,"POST",e)}catch(l){return{success:!1,error:`Failed to create DPoP proof for token refresh: ${te(l)}`}}let c;try{c=await fetch(e,{method:"POST",headers:s,body:a.toString()})}catch(l){return{success:!1,error:`Token refresh request to ${e} failed: ${te(l)}`}}if(!c.ok){let l=await Qe(c);return{success:!1,error:`Token refresh failed \u2014 HTTP ${c.status}: ${l}`}}return{success:!0,tokens:xn(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 j(n){return{success:!1,error:n}}function xn(n){return{accessToken:n.access_token,refreshToken:n.refresh_token,expiresIn:typeof n.expires_in=="number"?n.expires_in:void 0}}function te(n){return n instanceof Error?n.message:String(n)}async function Qe(n){try{return await n.text()}catch{return"(could not read response body)"}}function uo(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 fo(){return Un(32).toString("base64url")}function mo(n){return ao("sha256").update(n).digest("base64url")}function po(){return Un(16).toString("base64url")}function go(n,e,t,r,o,i){let a=new URLSearchParams({client_id:e,response_type:"code",redirect_uri:t,scope:r.join(" "),state:o,code_challenge:i,code_challenge_method:"S256"});return`${n}?${a}`}var ko=300*1e3;async function yo(){return new Promise(n=>{let e=io((o,i)=>{let a=new URL(o.url,"http://localhost"),s=a.searchParams.get("code")??void 0,c=a.searchParams.get("state")??void 0,l=a.searchParams.get("error")??a.searchParams.get("error_description")??void 0,u=l?ho(l):null,d=u?`<html><body><h1>Authorization failed</h1><p>${u}</p></body></html>`:"<html><body><h1>Authorization successful!</h1><p>You can close this window.</p></body></html>";i.writeHead(200,{"Content-Type":"text/html"}),i.end(d),t({code:s,state:c,error:l})}),t,r=new Promise(o=>{t=o,setTimeout(()=>{o(null),e.close()},ko)});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 ho(n){return n.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function bo(n){try{process.platform==="win32"?Ze("cmd",["/c","start","",n]):process.platform==="darwin"?Ze("open",[n]):Ze("xdg-open",[n])}catch{console.log(" Could not open browser automatically. Please navigate to the URL above manually.")}}import{CredentialStore as wo}from"@kanonak-protocol/sdk";async function On(n){try{let e=new V,t=new wo,o=await new re(e,t).authorize(n);o.success?console.log(`
|
|
48
48
|
Authenticated with ${n}.`):(console.error(`
|
|
49
49
|
Authentication failed:
|
|
50
50
|
${o.error}`),process.exit(1))}catch(e){let t=e instanceof Error?e.message:String(e);console.error(`
|
|
51
51
|
Authentication failed unexpectedly:
|
|
52
52
|
${t}`),console.error(`
|
|
53
|
-
If this persists, see https://github.com/kanonak-protocol for support channels.`),process.exit(1)}}import{CredentialStore as
|
|
53
|
+
If this persists, see https://github.com/kanonak-protocol for support channels.`),process.exit(1)}}import{CredentialStore as $o}from"@kanonak-protocol/sdk";async function Ln(n){try{let e=new V,t=new $o,o=await new re(e,t).logout(n);o.success?console.log(`Logged out from ${n}.`):(console.error(`
|
|
54
54
|
Logout failed:
|
|
55
55
|
${o.error}`),process.exit(1))}catch(e){let t=e instanceof Error?e.message:String(e);console.error(`
|
|
56
56
|
Logout failed unexpectedly:
|
|
57
|
-
${t}`),process.exit(1)}}import{Command as
|
|
58
|
-
`;function Fn(){let n=
|
|
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 we}from"commander";import{readFileSync as
|
|
57
|
+
${t}`),process.exit(1)}}import{Command as Yo}from"commander";import{KanonakParser as Zo,KanonakObjectParser as Qo,PublisherIndex as ea,CredentialStore as na,createAuthenticatedFetch as ta,computeIntegrity as ra}from"@kanonak-protocol/sdk";import{readFileSync as So,writeFileSync as vo,existsSync as Po}from"fs";import{join as Ko}from"path";import Nn from"js-yaml";import{getGlobalCachePath as Do}from"@kanonak-protocol/sdk";var Co=`# This file is generated by Kanonak CLI. Do not edit manually.
|
|
58
|
+
`;function Fn(){let n=Do();return Ko(n,"..","capabilities.lock")}function oe(){let n=Fn();if(!Po(n))return{version:"1",lastUpdated:new Date().toISOString(),capabilities:{}};let e=So(n,"utf-8"),t=Nn.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 ge(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=Nn.dump(n,{lineWidth:-1,sortKeys:!1,quotingType:'"'});vo(Fn(),Co+t,"utf-8")}var C=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 jo,readdirSync as xo,readFileSync as Uo}from"fs";import{join as Mn}from"path";import{KanonakObjectParser as Oo,EmbeddedKanonak as Wn,ReferenceKanonak as Gn,getGlobalCachePath as Lo}from"@kanonak-protocol/sdk";import{SubjectKanonak as Vn,DefinedKanonak as Eo,StringStatement as Ao,NumberStatement as Ro,BooleanStatement as Io,ReferenceStatement as Bn,EmbeddedStatement as Yc,ListStatement as _o}from"@kanonak-protocol/sdk";function L(n){return`${n.publisher}/${n.package_}/${n.name}`}function T(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}function v(n,e){if(!(n instanceof Eo))return!1;for(let t of n.statement)if(t.predicate?.subject?.name==="type"&&t instanceof Bn){let o=t.object;if(T(o.subject,e))return!0}return!1}function A(n,e){let t=[];for(let r of n)r instanceof Vn&&v(r,e)&&t.push(r);return t}function Pe(n,e){for(let t of n){if(!(t instanceof Vn)||t.name!==e.name)continue;if((t.namespace||"").startsWith(`${e.publisher}/${e.package_}@`))return t}}function en(n,e){for(let t of n.statement){let r=t.predicate;if(r?.subject&&T(r.subject,e))return t}}function To(n,e){let t=en(n,e);if(t&&(t instanceof Ao||t instanceof Ro||t instanceof Io))return t.object}function R(n,e){let t=To(n,e);return typeof t=="string"?t:void 0}function ae(n,e){let t=en(n,e);if(t instanceof Bn)return t.object.subject}function nn(n,e){let t=en(n,e);return t instanceof _o?t.object??[]:[]}var I="kanonak.org",_="capabilities",tn={publisher:I,package_:_,name:"Capability"},No={publisher:I,package_:_,name:"commandName"},Xn={publisher:I,package_:_,name:"description"},Fo={publisher:I,package_:_,name:"managesType"},Vo={publisher:I,package_:_,name:"deploymentTarget"},Bo={publisher:I,package_:_,name:"hasCommand"},Mo={publisher:I,package_:_,name:"subcommandName"},Ho={publisher:I,package_:_,name:"performs"},qo={publisher:I,package_:_,name:"hasArgument"},zo={publisher:I,package_:_,name:"argumentName"},Hn={publisher:I,package_:_,name:"isRequired"},qn={publisher:I,package_:_,name:"isOption"},Wo={publisher:I,package_:_,name:"defaultValue"};async function Jn(n,e,t){let r=oe(),o=new Oo,i=[],a=!1;for(let[s,c]of Object.entries(r.capabilities)){let l=c,u=n.get(l.publisher,l.package_,l.version);if(!u){let d=await Go(s,l,e,o,t);if(d)console.error(` Healed capability "${s}": ${l.publisher}/${l.package_}@${l.version} \u2192 ${d.entry.publisher}/${d.entry.package_}@${d.entry.version} (package was renamed)`),r.capabilities[s]=d.entry,l=d.entry,u=d.content,a=!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 d=e.parse(u),p=new C(d,t),k=await o.parseKanonaks(p),b=Yn(k,l.publisher,l.package_,l.version);b?i.push(b):console.error(` WARNING: No Capability instance found in "${s}" (${l.publisher}/${l.package_}@${l.version})`)}catch(d){console.error(` WARNING: Failed to parse capability "${s}": ${d}`)}}return a&&ge(r),i}async function Go(n,e,t,r,o){let i=Mn(Lo(),e.publisher);if(!jo(i))return;let a=[];for(let s of xo(i)){if(!s.endsWith(".kan.yml"))continue;let c=s.slice(0,-8),l=c.lastIndexOf("@");if(l===-1)continue;let u=c.substring(0,l),d=c.substring(l+1);if(u===e.package_&&d===e.version)continue;let p;try{p=Uo(Mn(i,s),"utf-8")}catch{continue}let k;try{let b=t.parse(p),g=new C(b,o),y=await r.parseKanonaks(g);k=Yn(y,e.publisher,u,d)?.commandName}catch{continue}k===n&&a.push({entry:{publisher:e.publisher,package_:u,version:d,resolved:`kanonak://${e.publisher}/${u}@${d}`,integrity:""},content:p})}if(a.length===1)return a[0]}function Yn(n,e,t,r){let o=A(n,tn);if(o.length===0)return;let i=o[0],a=R(i,No)??"",s=R(i,Xn)??"",c=ae(i,Fo),l=ae(i,Vo),u=[];for(let d of nn(i,Bo)){let p=Xo(d,n);p&&u.push(p)}return{commandName:a,description:s,managesTypeKey:c?L(c):"",deploymentTargetKey:l?L(l):"",commands:u,publisher:e,package_:t,version:r}}function Xo(n,e){let t;if(n instanceof Wn)t=n;else if(n instanceof Gn){let c=Zn(e,n.subject.publisher,n.subject.package_,n.subject.name);c&&(t=c)}if(!t)return;let r=R(t,Mo)??"",o=R(t,Xn)??"",i=ae(t,Ho),a=nn(t,qo),s=[];for(let c of a){let l=Jo(c,e);l&&s.push(l)}return{subcommandName:r,description:o,arguments:s,actionKey:i?L(i):""}}function Jo(n,e){let t;if(n instanceof Wn)t=n;else if(n instanceof Gn){let c=Zn(e,n.subject.publisher,n.subject.package_,n.subject.name);c&&(t=c)}if(!t)return;let r=R(t,zo)??"",o=R(t,Hn)==="true"||zn(t,Hn)===!0,i=R(t,qn)==="true"||zn(t,qn)===!0,a=R(t,Wo),s={argumentName:r,required:o,isOption:i};return a!==void 0&&(s.defaultValue=a),s}function zn(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 Zn(n,e,t,r){for(let o of n){if(!("name"in o)||!("namespace"in o))continue;let i=o;if(i.name===r&&!(!i.namespace||typeof i.namespace!="string")&&i.namespace.startsWith(`${e}/${t}@`))return o}}var oa={publisher:I,package_:_,name:"commandName"};function Qn(){let n=new Yo("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 aa(e)}),n.command("remove <name>").description("Remove an installed capability").action(async e=>{await ia(e)}),n.command("list").description("List installed capabilities").action(async()=>{await sa()}),n}async function aa(n){let e=ee(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:i}=e;i&&(console.error(`\`kanonak capability add\` installs whole packages \u2014 got an instance suffix "/${i}".`),console.error(`Try: kanonak capability add ${t}/${r}${o?"@"+o:""}`),process.exit(1));let a=new U,s=new Zo,c=new Qo,l=new na,u=ta(l),d=new ea({fetchFn:u}),p=o??await d.getHighestVersion(t,r);p||(console.error(`Could not resolve version for "${t}/${r}".`),process.exit(1)),console.log(`Installing capability ${t}/${r}@${p}...`);let k=a.get(t,r,p);if(!k){let Q=await d.getPackageUrl(t,r,p),Se=await u(Q,t);if(!Se.ok)throw new Error(`Failed to fetch ${Q} (${Se.status} ${Se.statusText})`);k=await Se.text(),a.put(t,r,p,k)}let b=s.parse(k),g=await O(process.cwd(),s),y=new C(b,g),h=await c.parseKanonaks(y),w=A(h,tn);w.length===0&&(console.error(`Package ${t}/${r}@${p} does not contain a ${I}/${_}/Capability instance.`),process.exit(1));let $=w[0],P=R($,oa);P||(console.error(`Capability instance in ${t}/${r}@${p} has no commandName property.`),process.exit(1));let K=oe();K.capabilities[P]={publisher:t,package_:r,version:p,resolved:await d.getPackageUrl(t,r,p),integrity:ra(k)},ge(K),console.log(`
|
|
59
|
+
Installed capability "${P}".`),console.log(`Run "kanonak ${P} --help" to get started.`)}async function ia(n){let e=oe();e.capabilities[n]||(console.error(`Capability "${n}" is not installed.`),process.exit(1));let t=e.capabilities[n];delete e.capabilities[n],ge(e),console.log(`Removed capability "${n}" (${t.publisher}/${t.package_}@${t.version}).`)}async function sa(){let n=oe(),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 we}from"commander";import{readFileSync as li,writeFileSync as ui,mkdirSync as di,existsSync as Ft,statSync as fi}from"fs";import{join as mi,resolve as pi}from"path";import{KanonakParser as mn,KanonakObjectParser as pn,SubjectKanonak as gi,Reasoner as ki,KanonakVocabulary as yi,makeUriKey as Bt,pickHighestDocument as gn,formatVersion as Mt}from"@kanonak-protocol/sdk";var ca="kanonak.org",la="transformations";var m=n=>({publisher:ca,package_:la,name:n}),f={Transformation:m("Transformation"),InstanceTransformation:m("InstanceTransformation"),SetTransformation:m("SetTransformation"),inputPattern:m("inputPattern"),rule:m("rule"),artifactName:m("artifactName"),outputs:m("outputs"),formatOverrides:m("formatOverrides"),partitionBy:m("partitionBy"),InputPattern:m("InputPattern"),matchesClass:m("matchesClass"),requires:m("requires"),sortBy:m("sortBy"),SortKey:m("SortKey"),byProperty:m("byProperty"),order:m("order"),SortOrder:m("SortOrder"),ascending:m("ascending"),descending:m("descending"),OutputFormat:m("OutputFormat"),backendUri:m("backendUri"),FormatOverride:m("FormatOverride"),formatTarget:m("formatTarget"),metadataKeys:m("metadataKeys"),metadataRenames:m("metadataRenames"),trailingNewline:m("trailingNewline"),RenameEntry:m("RenameEntry"),fromKey:m("fromKey"),toKey:m("toKey"),FMT_MARKDOWN_FRONTMATTER:m("markdown-with-frontmatter"),FMT_PLAIN_MARKDOWN:m("plain-markdown"),FMT_TOML:m("toml"),FMT_JSON:m("json"),FMT_HTML:m("html"),FMT_SVG:m("svg"),Expression:m("Expression"),ListSourcedExpression:m("ListSourcedExpression"),ListAggregate:m("ListAggregate"),IteratingExpression:m("IteratingExpression"),BuildAstNode:m("BuildAstNode"),astClass:m("astClass"),set:m("set"),AstFieldBinding:m("AstFieldBinding"),field:m("field"),bindValue:m("bindValue"),When:m("When"),condition:m("condition"),thenBuild:m("thenBuild"),elseBuild:m("elseBuild"),Concat:m("Concat"),parts:m("parts"),Fallback:m("Fallback"),primary:m("primary"),alternate:m("alternate"),StringLiteral:m("StringLiteral"),stringLiteral:m("stringLiteral"),IntegerLiteral:m("IntegerLiteral"),integerLiteral:m("integerLiteral"),DecimalLiteral:m("DecimalLiteral"),decimalLiteral:m("decimalLiteral"),BooleanLiteral:m("BooleanLiteral"),booleanLiteral:m("booleanLiteral"),VarRef:m("VarRef"),varName:m("varName"),PropertyRead:m("PropertyRead"),readSource:m("readSource"),readProp:m("readProp"),Traverse:m("Traverse"),traverseSource:m("traverseSource"),through:m("through"),step:m("step"),UriName:m("UriName"),uriNameOf:m("uriNameOf"),SubjectUri:m("SubjectUri"),subjectOf:m("subjectOf"),UriLiteral:m("UriLiteral"),refTo:m("refTo"),DisplayLabel:m("DisplayLabel"),labelTarget:m("labelTarget"),labelSource:m("labelSource"),ResolveRef:m("ResolveRef"),resolveSource:m("resolveSource"),Normalize:m("Normalize"),normSource:m("normSource"),normKind:m("normKind"),NormalizeKind:m("NormalizeKind"),NORM_TRIM_END:m("trim-end"),IsSet:m("IsSet"),checkExpr:m("checkExpr"),ExpressionFragment:m("ExpressionFragment"),body:m("body"),CallFragment:m("CallFragment"),fragmentRef:m("fragmentRef"),source:m("source"),Join:m("Join"),separator:m("separator"),Count:m("Count"),Sum:m("Sum"),Min:m("Min"),Max:m("Max"),Average:m("Average"),loopVar:m("loopVar"),ForEach:m("ForEach"),emit:m("emit"),ListMap:m("ListMap"),mapBody:m("mapBody"),Filter:m("Filter"),predicate:m("predicate"),PartitionBy:m("PartitionBy"),partitionKey:m("partitionKey"),DistinctBy:m("DistinctBy"),distinctKey:m("distinctKey"),Partition:m("Partition"),key:m("key"),members:m("members")};import{DefinedKanonak as _t,ReferenceKanonak as Tt,StringStatement as jt,NumberStatement as xt,BooleanStatement as Ut,ReferenceStatement as Ot,ListStatement as Lt}from"@kanonak-protocol/sdk";var ua="kanonak.org",da="document-ast",S=n=>({publisher:ua,package_:da,name:n}),N={Document:S("Document"),Block:S("Block"),Inline:S("Inline"),StructuredValue:S("StructuredValue"),Heading:S("Heading"),Paragraph:S("Paragraph"),RawBlock:S("RawBlock"),Text:S("Text"),StructuredMap:S("StructuredMap"),StructuredEntry:S("StructuredEntry"),StructuredList:S("StructuredList"),StringScalar:S("StringScalar"),IntegerScalar:S("IntegerScalar"),EscapeHint:S("EscapeHint"),MediaType:S("MediaType"),metadata:S("metadata"),children:S("children"),level:S("level"),inlines:S("inlines"),text:S("text"),entries:S("entries"),key:S("key"),value:S("value"),escapeHint:S("escapeHint"),items:S("items"),stringValue:S("stringValue"),integerValue:S("integerValue"),rawContent:S("rawContent"),mediaType:S("mediaType"),mimeType:S("mimeType"),ESC_RAW:S("esc-raw"),ESC_YAML_SAFE:S("esc-yaml-safe"),ESC_TOML_STRING:S("esc-toml-string"),ESC_TOML_MULTILINE:S("esc-toml-multiline"),ESC_JSON:S("esc-json"),TEXT_PLAIN:S("text-plain"),TEXT_MARKDOWN:S("text-markdown"),TEXT_HTML:S("text-html"),APPLICATION_JSON:S("application-json"),TEXT_YAML:S("text-yaml"),IMAGE_SVG_XML:S("image-svg-xml")};function et(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}var De=class{backendUri="kanonak.org/transformations/markdown-with-frontmatter";render(e,t){let r=fa(e.metadata,t),o=ga(e.children),a=["---",...r,"---","",o].join(`
|
|
61
61
|
`);return t?.trailingNewline&&(a.endsWith(`
|
|
62
62
|
`)||(a+=`
|
|
63
|
-
`)),a}};function
|
|
63
|
+
`)),a}};function fa(n,e){if(!n)return[];let t=new Map;for(let s of n.entries)t.set(Ke(s.key),s);let r=new Map;if(e?.metadataRenames)for(let[s,c]of e.metadataRenames)r.set(Ke(s),c);let i=(e?.metadataKeys??n.entries.map(s=>s.key)).map(Ke),a=[];for(let s of i){let c=t.get(s);if(!c)continue;let l=r.get(s),u=Ke(l??s),d=tt(c.value,c.escapeHint);d!==void 0&&a.push(`${u}: ${d}`)}return a}function Ke(n){let e=n.lastIndexOf(".");return e===-1?n:n.substring(e+1)||n}function tt(n,e){switch(n.kind){case"StringScalar":return ma(n.stringValue,e);case"IntegerScalar":return String(n.integerValue);case"StructuredList":{let t=[];for(let r of n.items){let o=tt(r,e);o!==void 0&&t.push(o)}return t.join(", ")}case"StructuredMap":return;default:return}}function ma(n,e){return!e||et(e,N.ESC_RAW)?n:et(e,N.ESC_YAML_SAFE)?pa(n):n}function pa(n){return n.includes(`
|
|
64
64
|
`)?`|-
|
|
65
65
|
${n.replace(/\n/g,`
|
|
66
|
-
`).trimEnd()}`:/[:#\[\]{}&*!|>'"%@`,]/.test(n)?`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`:n}function
|
|
66
|
+
`).trimEnd()}`:/[:#\[\]{}&*!|>'"%@`,]/.test(n)?`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`:n}function ga(n){let e=[];for(let t of n){let r=ka(t);r&&e.push(r)}return e.join(`
|
|
67
67
|
|
|
68
|
-
`)}function
|
|
68
|
+
`)}function ka(n){switch(n.kind){case"Heading":return`${"#".repeat(n.level)} ${nt(n.inlines)}`;case"Paragraph":return nt(n.inlines);case"RawBlock":return n.rawContent;default:return""}}function nt(n){let e=[];for(let t of n)t.kind==="Text"&&e.push(t.text);return e.join("")}function ya(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}var Ce=class{backendUri="kanonak.org/transformations/toml";render(e,t){let o=ha(e.metadata,t).join(`
|
|
69
69
|
`);return t?.trailingNewline&&(o.endsWith(`
|
|
70
70
|
`)||(o+=`
|
|
71
|
-
`)),o}};function
|
|
71
|
+
`)),o}};function ha(n,e){if(!n)return[];let t=new Map;for(let i of n.entries)t.set(i.key,i);let r=e?.metadataKeys??n.entries.map(i=>i.key),o=[];for(let i of r){let a=t.get(i);if(!a)continue;let s=e?.metadataRenames.get(i)??i,c=rt(a.value,a.escapeHint);c!==void 0&&o.push(`${s} = ${c}`)}return o}function rt(n,e){switch(n.kind){case"StringScalar":return ba(n.stringValue,e);case"IntegerScalar":return String(n.integerValue);case"StructuredList":{let t=[];for(let r of n.items){let o=rt(r,e);o!==void 0&&t.push(o)}return`[${t.join(", ")}]`}case"StructuredMap":return;default:return}}function ba(n,e){return e&&ya(e,N.ESC_TOML_MULTILINE)?$a(n):wa(n)}function wa(n){return`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n")}"`}function $a(n){return`"""
|
|
72
72
|
${n.replace(/"""/g,'\\"\\"\\"')}
|
|
73
73
|
"""`}var Ee=class{backendUri="kanonak.org/transformations/json";render(e,t){let r=JSON.stringify(e,null,2);return t?.trailingNewline&&!r.endsWith(`
|
|
74
74
|
`)?r+`
|
|
75
75
|
`:r}};function at(n){let e=n.replace(/\r\n/g,`
|
|
76
76
|
`).split(`
|
|
77
77
|
`),t=[],r=0;for(;r<e.length;){let o=e[r];if(o.trim()===""){r++;continue}let i=/^(\s*)```(\S*)\s*$/.exec(o);if(i){let c=i[2],l=[];for(r++;r<e.length&&!/^(\s*)```\s*$/.test(e[r]);)l.push(e[r]),r++;r++;let u=it(l.join(`
|
|
78
|
-
`)),d=c?` class="language-${st(c)}"`:"";t.push(`<pre><code${d}>${u}</code></pre>`);continue}let a=/^(#{1,6})\s+(.*)$/.exec(o);if(a){let c=a[1].length,l=ie(a[2].trim());t.push(`<h${c}>${l}</h${c}>`),r++;continue}if(o.includes("|")&&r+1<e.length&&ot(e[r+1])){let c=rn(o),l
|
|
78
|
+
`)),d=c?` class="language-${st(c)}"`:"";t.push(`<pre><code${d}>${u}</code></pre>`);continue}let a=/^(#{1,6})\s+(.*)$/.exec(o);if(a){let c=a[1].length,l=ie(a[2].trim());t.push(`<h${c}>${l}</h${c}>`),r++;continue}if(o.includes("|")&&r+1<e.length&&ot(e[r+1])){let c=rn(o),l=Sa(e[r+1]);r+=2;let u=[];for(;r<e.length&&e[r].trim()!==""&&e[r].includes("|");)u.push(rn(e[r])),r++;t.push(va(c,l,u));continue}if(/^\s*[-*]\s+/.test(o)){let c=[];for(;r<e.length&&/^\s*[-*]\s+/.test(e[r]);){let l=[e[r].replace(/^\s*[-*]\s+/,"")];for(r++;r<e.length&&e[r].trim()!==""&&!/^\s*[-*]\s+/.test(e[r])&&!/^\s*\d+\.\s+/.test(e[r]);)l.push(e[r]),r++;r<e.length&&e[r].trim()===""&&r++,c.push(`<li>${ie(l.join(" ").trim())}</li>`)}t.push(`<ul>
|
|
79
79
|
${c.join(`
|
|
80
80
|
`)}
|
|
81
81
|
</ul>`);continue}if(/^\s*\d+\.\s+/.test(o)){let c=[];for(;r<e.length&&/^\s*\d+\.\s+/.test(e[r]);){let l=[e[r].replace(/^\s*\d+\.\s+/,"")];for(r++;r<e.length&&e[r].trim()!==""&&!/^\s*\d+\.\s+/.test(e[r])&&!/^\s*[-*]\s+/.test(e[r]);)l.push(e[r]),r++;r<e.length&&e[r].trim()===""&&r++,c.push(`<li>${ie(l.join(" ").trim())}</li>`)}t.push(`<ol>
|
|
82
82
|
${c.join(`
|
|
83
83
|
`)}
|
|
84
84
|
</ol>`);continue}let s=[o];for(r++;r<e.length&&e[r].trim()!==""&&!/^(#{1,6})\s+/.test(e[r])&&!/^(\s*)```/.test(e[r])&&!/^\s*[-*]\s+/.test(e[r])&&!/^\s*\d+\.\s+/.test(e[r])&&!(e[r].includes("|")&&r+1<e.length&&ot(e[r+1]));)s.push(e[r]),r++;t.push(`<p>${ie(s.join(" "))}</p>`)}return t.join(`
|
|
85
|
-
`)}function ot(n){return n.includes("-")?/^[\s|:-]+$/.test(n):!1}function rn(n){let e=n.trim();return e.startsWith("|")&&(e=e.slice(1)),e.endsWith("|")&&(e=e.slice(0,-1)),e.split("|").map(t=>t.trim())}function
|
|
85
|
+
`)}function ot(n){return n.includes("-")?/^[\s|:-]+$/.test(n):!1}function rn(n){let e=n.trim();return e.startsWith("|")&&(e=e.slice(1)),e.endsWith("|")&&(e=e.slice(0,-1)),e.split("|").map(t=>t.trim())}function Sa(n){return rn(n).map(e=>{let t=e.startsWith(":"),r=e.endsWith(":");return t&&r?"center":r?"right":t?"left":null})}function va(n,e,t){let r=a=>{let s=e[a];return s?` style="text-align:${s}"`:""},o=n.map((a,s)=>`<th${r(s)}>${ie(a)}</th>`).join(""),i=t.map(a=>`<tr>${a.map((c,l)=>`<td${r(l)}>${ie(c)}</td>`).join("")}</tr>`).join(`
|
|
86
86
|
`);return`<table>
|
|
87
87
|
<thead><tr>${o}</tr></thead>
|
|
88
88
|
<tbody>
|
|
89
89
|
${i}
|
|
90
90
|
</tbody>
|
|
91
|
-
</table>`}function ie(n){let e=it(n);return e=e.replace(/`([^`\n]+)`/g,(t,r)=>`<code>${r}</code>`),e=e.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(t,r,o)=>`<a href="${st(o)}">${r}</a>`),e=e.replace(/\*\*([^*\n]+)\*\*/g,(t,r)=>`<strong>${r}</strong>`),e=e.replace(/(^|[^*])\*([^*\n]+)\*(?!\*)/g,(t,r,o)=>`${r}<em>${o}</em>`),e=e.replace(/(^|[\s(])_([^_\n]+)_(?=[\s).,;:!?]|$)/g,(t,r,o)=>`${r}<em>${o}</em>`),e}function it(n){return n.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function st(n){return n.replace(/"/g,""").replace(/&/g,"&")}function on(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}var Ae=class{backendUri="kanonak.org/transformations/html";render(e,t){let r=
|
|
91
|
+
</table>`}function ie(n){let e=it(n);return e=e.replace(/`([^`\n]+)`/g,(t,r)=>`<code>${r}</code>`),e=e.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(t,r,o)=>`<a href="${st(o)}">${r}</a>`),e=e.replace(/\*\*([^*\n]+)\*\*/g,(t,r)=>`<strong>${r}</strong>`),e=e.replace(/(^|[^*])\*([^*\n]+)\*(?!\*)/g,(t,r,o)=>`${r}<em>${o}</em>`),e=e.replace(/(^|[\s(])_([^_\n]+)_(?=[\s).,;:!?]|$)/g,(t,r,o)=>`${r}<em>${o}</em>`),e}function it(n){return n.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function st(n){return n.replace(/"/g,""").replace(/&/g,"&")}function on(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}var Ae=class{backendUri="kanonak.org/transformations/html";render(e,t){let r=Pa(e.metadata)??"Untitled",o=Ka(e.metadata,t),i=Da(e.children),a=`<!DOCTYPE html>
|
|
92
92
|
<html lang="en">
|
|
93
93
|
<head>
|
|
94
94
|
<meta charset="utf-8">
|
|
95
|
-
<title>${
|
|
95
|
+
<title>${ke(r)}</title>
|
|
96
96
|
<style>
|
|
97
97
|
body { font-family: -apple-system, Segoe UI, Helvetica, Arial, sans-serif; max-width: 860px; margin: 2rem auto; padding: 0 1rem; color: #222; line-height: 1.55; }
|
|
98
98
|
h1, h2, h3, h4 { line-height: 1.2; }
|
|
@@ -118,17 +118,17 @@ ${o}${i}
|
|
|
118
118
|
</body>
|
|
119
119
|
</html>
|
|
120
120
|
`;return t?.trailingNewline===!1&&a.endsWith(`
|
|
121
|
-
`)?a.slice(0,-1):a}};function
|
|
121
|
+
`)?a.slice(0,-1):a}};function Pa(n){if(n){for(let e of n.entries)if((e.key==="title"||e.key==="name")&&e.value.kind==="StringScalar")return e.value.stringValue}}function Ka(n,e){if(!n||n.entries.length===0)return"";let t=e?.metadataKeys??n.entries.map(i=>i.key),r=new Map(n.entries.map(i=>[i.key,i])),o=[];for(let i of t){let a=r.get(i);if(!a)continue;let s=e?.metadataRenames.get(i)??i,c=lt(a.value);c!==void 0&&o.push(` <dt>${ke(s)}</dt>
|
|
122
122
|
<dd>${c}</dd>`)}return o.length===0?"":`<dl class="metadata">
|
|
123
123
|
${o.join(`
|
|
124
124
|
`)}
|
|
125
125
|
</dl>
|
|
126
|
-
`}function lt(n){switch(n.kind){case"StringScalar":return
|
|
127
|
-
`)}function
|
|
126
|
+
`}function lt(n){switch(n.kind){case"StringScalar":return ke(n.stringValue);case"IntegerScalar":return String(n.integerValue);case"StructuredList":{let e=[];for(let t of n.items){let r=lt(t);r!==void 0&&e.push(`<code>${r}</code>`)}return e.join(", ")}case"StructuredMap":return;default:return}}function Da(n){let e=[];for(let t of n){let r=Ca(t);r&&e.push(r)}return e.join(`
|
|
127
|
+
`)}function Ca(n){switch(n.kind){case"Heading":{let e=Math.max(1,Math.min(6,n.level));return`<h${e}>${ct(n.inlines)}</h${e}>`}case"Paragraph":return`<p>${ct(n.inlines)}</p>`;case"RawBlock":return Ea(n);default:return""}}function Ea(n){let e=n.mediaType;return e&&on(e,N.TEXT_MARKDOWN)?at(n.rawContent):e&&on(e,N.TEXT_HTML)?n.rawContent:e&&on(e,N.IMAGE_SVG_XML)?`<figure class="svg-figure">
|
|
128
128
|
${n.rawContent}
|
|
129
|
-
</figure>`:`<pre${e?` class="media-${
|
|
129
|
+
</figure>`:`<pre${e?` class="media-${Aa(e.name)}"`:""}><code>${ke(n.rawContent)}</code></pre>`}function ct(n){let e=[];for(let t of n)t.kind==="Text"&&e.push(ke(t.text));return e.join("")}function ke(n){return n.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function Aa(n){return n.replace(/"/g,""").replace(/&/g,"&")}function Ra(n,e){return n.publisher===e.publisher&&n.package_===e.package_&&n.name===e.name}var Re=class{backendUri="kanonak.org/transformations/svg";render(e,t){for(let r of e.children)if(r.kind==="RawBlock"&&r.mediaType&&Ra(r.mediaType,N.IMAGE_SVG_XML)){let o=r.rawContent;return t?.trailingNewline&&!o.endsWith(`
|
|
130
130
|
`)&&(o+=`
|
|
131
|
-
`),o}return'<svg xmlns="http://www.w3.org/2000/svg" width="1" height="1"/>'}};import{SubjectKanonak as ut}from"@kanonak-protocol/sdk";var Ie=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=Pe(t,e);if(r)return r;let o=`${e.publisher}/${e.package_}`,i=this.cache.get(o);if(!i){let a=await this.repository.getDocumentsByNamespaceAsync(e.publisher,e.package_);if(a.length===0)return;let s=a[0],c=new C(s,this.repository);i=await this.objectParser.parseKanonaks(c),this.cache.set(o,i)}for(let a of i)if(a instanceof ut&&a.name===e.name&&a.namespace&&a.namespace.startsWith(`${e.publisher}/${e.package_}@`))return a;for(let a of i)if(a instanceof ut&&a.name===e.name)return a}};import{EmbeddedKanonak as ye,ReferenceKanonak as kt,SubjectKanonak as Ra,ListStatement as M,ReferenceStatement as sn,EmbeddedStatement as ce,StringStatement as yt,NumberStatement as Ia,BooleanStatement as _a}from"@kanonak-protocol/sdk";var E=class extends Error{constructor(t,r){super(`${t} (at ${r})`);this.path=r}path},dt=16;function le(n,e){let t=n.name,r={catalog:e,depth:0};if(v(n,f.InstanceTransformation))return Ta(n,t,r);if(v(n,f.SetTransformation))return ja(n,t,r);throw new E("Subject is not a recognized v3 transformation type \u2014 expected InstanceTransformation or SetTransformation",t)}function Ta(n,e,t){return{kind:"instance",name:n.name,inputPattern:ht(n,e),rule:_e(n,f.rule,`${e}.rule`,t),artifactName:_e(n,f.artifactName,`${e}.artifactName`,t),outputs:bt(n,`${e}.outputs`),overrides:wt(n,`${e}.formatOverrides`,t)}}function ja(n,e,t){let r=H(n,f.partitionBy);return{kind:"set",name:n.name,inputPattern:ht(n,e),rule:_e(n,f.rule,`${e}.rule`,t),artifactName:_e(n,f.artifactName,`${e}.artifactName`,t),outputs:bt(n,`${e}.outputs`),overrides:wt(n,`${e}.formatOverrides`,t),partitionBy:r}}function ht(n,e){let t=he(n,f.inputPattern);if(!t)throw new E("inputPattern is required",e);return xa(t,`${e}.inputPattern`)}function xa(n,e){let t=H(n,f.matchesClass);if(!t)throw new E("matchesClass is required",e);let r=[];for(let a of x(n,f.requires))if(a instanceof sn)r.push(an(a.object.subject));else if(a instanceof M)for(let s of a.object)s instanceof kt&&r.push(an(s.subject));let o=[],i=0;for(let a of x(n,f.sortBy))if(a instanceof M)for(let s of a.object)s instanceof ye&&o.push(ft(s,`${e}.sortBy[${i++}]`));else a instanceof ce&&o.push(ft(a.object,`${e}.sortBy[${i++}]`));return{matchesClass:t,requires:r,sortBy:o}}function ft(n,e){let t=H(n,f.byProperty);if(!t)throw new E("SortKey.byProperty is required",e);let r=H(n,f.order);if(!r)throw new E("SortKey.order is required",e);if(T(r,f.ascending))return{byProperty:t,order:"ascending"};if(T(r,f.descending))return{byProperty:t,order:"descending"};throw new E(`SortKey.order must reference tx.ascending or tx.descending; got ${r.publisher}/${r.package_}/${r.name}`,e)}function _e(n,e,t,r){let o=he(n,e);if(!o)throw new E("expression is required",t);return se(o,t,r)}function se(n,e,t){if(v(n,f.StringLiteral))return{kind:"string-literal",value:B(n,f.stringLiteral,e)};if(v(n,f.IntegerLiteral))return{kind:"integer-literal",value:gt(n,f.integerLiteral,e)};if(v(n,f.DecimalLiteral))return{kind:"decimal-literal",value:gt(n,f.decimalLiteral,e)};if(v(n,f.BooleanLiteral))return{kind:"boolean-literal",value:Ha(n,f.booleanLiteral,e)};if(v(n,f.VarRef))return{kind:"var-ref",varName:B(n,f.varName,e)};if(v(n,f.PropertyRead))return{kind:"property-read",source:D(n,f.readSource,`${e}.readSource`,t),readProp:G(n,f.readProp,e,"readProp")};if(v(n,f.Traverse))return{kind:"traverse",source:D(n,f.traverseSource,`${e}.traverseSource`,t),through:G(n,f.through,e,"through"),step:D(n,f.step,`${e}.step`,t)};if(v(n,f.BuildAstNode))return{kind:"build-ast-node",astClass:G(n,f.astClass,e,"astClass"),set:La(n,`${e}.set`,t)};if(v(n,f.When))return{kind:"when",condition:D(n,f.condition,`${e}.condition`,t),thenBuild:D(n,f.thenBuild,`${e}.thenBuild`,t),elseBuild:Ua(n,f.elseBuild,`${e}.elseBuild`,t)};if(v(n,f.Concat))return{kind:"concat",parts:Oa(n,f.parts,`${e}.parts`,t)};if(v(n,f.Fallback))return{kind:"fallback",primary:D(n,f.primary,`${e}.primary`,t),alternate:D(n,f.alternate,`${e}.alternate`,t)};if(v(n,f.UriName))return{kind:"uri-name",source:D(n,f.uriNameOf,`${e}.uriNameOf`,t)};if(v(n,f.UriLiteral))return{kind:"uri-literal",refTo:G(n,f.refTo,e,"refTo")};if(v(n,f.DisplayLabel))return{kind:"display-label",labelTarget:G(n,f.labelTarget,e,"labelTarget"),labelSource:G(n,f.labelSource,e,"labelSource")};if(v(n,f.ResolveRef))return{kind:"resolve-ref",source:D(n,f.resolveSource,`${e}.resolveSource`,t)};if(v(n,f.Normalize))return{kind:"normalize",source:D(n,f.normSource,`${e}.normSource`,t),normKind:Na(n,e)};if(v(n,f.IsSet))return{kind:"is-set",check:D(n,f.checkExpr,`${e}.checkExpr`,t)};if(v(n,f.CallFragment))return Fa(n,e,t);if(v(n,f.Join))return{kind:"join",source:D(n,f.source,`${e}.source`,t),separator:B(n,f.separator,e)};if(v(n,f.Count))return{kind:"count",source:D(n,f.source,`${e}.source`,t)};if(v(n,f.Sum))return{kind:"sum",source:D(n,f.source,`${e}.source`,t)};if(v(n,f.Min))return{kind:"min",source:D(n,f.source,`${e}.source`,t)};if(v(n,f.Max))return{kind:"max",source:D(n,f.source,`${e}.source`,t)};if(v(n,f.Average))return{kind:"average",source:D(n,f.source,`${e}.source`,t)};if(v(n,f.ForEach))return{kind:"for-each",source:D(n,f.source,`${e}.source`,t),loopVar:B(n,f.loopVar,e),emit:D(n,f.emit,`${e}.emit`,t)};if(v(n,f.ListMap))return{kind:"list-map",source:D(n,f.source,`${e}.source`,t),loopVar:B(n,f.loopVar,e),mapBody:D(n,f.mapBody,`${e}.mapBody`,t)};if(v(n,f.Filter))return{kind:"filter",source:D(n,f.source,`${e}.source`,t),loopVar:B(n,f.loopVar,e),predicate:D(n,f.predicate,`${e}.predicate`,t)};if(v(n,f.PartitionBy))return{kind:"partition-by",source:D(n,f.source,`${e}.source`,t),loopVar:B(n,f.loopVar,e),partitionKey:D(n,f.partitionKey,`${e}.partitionKey`,t)};if(v(n,f.DistinctBy))return{kind:"distinct-by",source:D(n,f.source,`${e}.source`,t),loopVar:B(n,f.loopVar,e),distinctKey:D(n,f.distinctKey,`${e}.distinctKey`,t)};throw new E("Expression is not of a recognized v3 type \u2014 embedded has no matching subclass of tx.Expression",e)}function D(n,e,t,r){let o=he(n,e);if(!o)throw new E("child expression is required",t);return se(o,t,r)}function Ua(n,e,t,r){let o=he(n,e);if(o)return se(o,t,r)}function Oa(n,e,t,r){let o=[],i=0;for(let a of x(n,e))if(a instanceof M)for(let s of a.object)s instanceof ye&&o.push(se(s,`${t}[${i++}]`,r));else a instanceof ce&&o.push(se(a.object,`${t}[${i++}]`,r));return o}function La(n,e,t){let r=[],o=0;for(let i of x(n,f.set))if(i instanceof M)for(let a of i.object)a instanceof ye&&r.push(mt(a,`${e}[${o++}]`,t));else i instanceof ce&&r.push(mt(i.object,`${e}[${o++}]`,t));return r}function mt(n,e,t){return{field:G(n,f.field,e,"field"),value:D(n,f.bindValue,`${e}.bindValue`,t)}}function Na(n,e){let t=H(n,f.normKind);if(!t)throw new E("normKind is required",e);if(T(t,f.NORM_TRIM_END))return"trim-end";throw new E(`Unknown NormalizeKind: ${t.publisher}/${t.package_}/${t.name}`,e)}function Fa(n,e,t){if(t.depth>=dt)throw new E(`Fragment recursion exceeded MAX_FRAGMENT_DEPTH (${dt})`,e);let r=H(n,f.fragmentRef);if(!r)throw new E("fragmentRef is required",e);let o=Va(t.catalog,r);if(!o)throw new E(`ExpressionFragment not found: ${r.publisher}/${r.package_}/${r.name}`,e);let i=he(o,f.body);if(!i)throw new E(`ExpressionFragment ${r.name} has no body`,e);return{kind:"call-fragment",body:se(i,`${e}.fragment(${r.name})`,{catalog:t.catalog,depth:t.depth+1})}}function Va(n,e){for(let t of n)if(!(!(t instanceof Ra)||t.name!==e.name||!(t.namespace||"").startsWith(`${e.publisher}/${e.package_}@`))&&v(t,f.ExpressionFragment))return t}function bt(n,e){let t=new Set;for(let r of x(n,f.outputs))if(r instanceof sn)t.add(r.object.subject.name);else if(r instanceof M)for(let o of r.object)o instanceof kt&&t.add(o.subject.name);if(t.size===0)throw new E("outputs is required (at least one OutputFormat)",e);return t}function wt(n,e,t){let r=new Map,o=0;for(let i of x(n,f.formatOverrides))if(i instanceof M){for(let a of i.object)if(a instanceof ye){let[s,c]=pt(a,`${e}[${o++}]`);r.set(s,c)}}else if(i instanceof ce){let[a,s]=pt(i.object,`${e}[${o++}]`);r.set(a,s)}return r}function pt(n,e){let t=H(n,f.formatTarget);if(!t)throw new E("formatTarget is required",e);let r=[];for(let a of x(n,f.metadataKeys))if(a instanceof yt)r.push(a.object);else if(a instanceof M)for(let s of a.object){let c=s.value;typeof c=="string"&&r.push(c)}let o=new Map;for(let a of x(n,f.metadataRenames))if(a instanceof M){for(let s of a.object)if(s instanceof ye){let c=ke(s,f.fromKey),l=ke(s,f.toKey);c&&l&&o.set(c,l)}}else if(a instanceof ce){let s=a.object,c=ke(s,f.fromKey),l=ke(s,f.toKey);c&&l&&o.set(c,l)}let i=$t(n,f.trailingNewline);return[t.name,{metadataKeys:r.length>0?r:void 0,metadataRenames:o,trailingNewline:i}]}function Ba(n){return n.predicate?.subject}function x(n,e){let t=[];for(let r of n.statement){let o=Ba(r);o&&T(o,e)&&t.push(r)}return t}function he(n,e){for(let t of x(n,e))if(t instanceof ce)return t.object}function H(n,e){for(let t of x(n,e))if(t instanceof sn)return an(t.object.subject)}function ke(n,e){for(let t of x(n,e))if(t instanceof yt)return t.object}function Ma(n,e){for(let t of x(n,e))if(t instanceof Ia)return t.object}function $t(n,e){for(let t of x(n,e))if(t instanceof _a)return t.object}function B(n,e,t){let r=ke(n,e);if(r===void 0)throw new E(`${e.name} (string) is required`,t);return r}function gt(n,e,t){let r=Ma(n,e);if(r===void 0)throw new E(`${e.name} (number) is required`,t);return r}function Ha(n,e,t){let r=$t(n,e);if(r===void 0)throw new E(`${e.name} (boolean) is required`,t);return r}function G(n,e,t,r){let o=H(n,e);if(!o)throw new E(`${r} (URI reference) is required`,t);return o}function an(n){return{publisher:n.publisher,package_:n.package_,name:n.name}}import{DefinedKanonak as xe,ReferenceKanonak as be,StringStatement as qa,NumberStatement as za,BooleanStatement as Wa,ReferenceStatement as Kt,ListStatement as Dt}from"@kanonak-protocol/sdk";var q=class extends Error{},Te=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 q(`Unbound variable "${e.varName}"`);return t.get(e.varName)}case"concat":{let r=[];for(let o of e.parts){let i=await this.evaluate(o,t);if(i!=null)if(Array.isArray(i))for(let a of i)r.push(a);else r.push(i)}return r}case"fallback":{let r=await this.evaluate(e.primary,t);return vt(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 vt(r)}case"property-read":{let r=await this.evaluate(e.source,t);return St(r,e.readProp)}case"traverse":{let r=await this.evaluate(e.source,t);if(!(r instanceof xe))return;let o=Xa(r,e.through),i=[];for(let a of o){let s=await this.resolver.resolveSubject(a,this.catalog);if(!s)continue;let c=new Map(t);c.set("input",s);let l=await this.evaluate(e.step,c);l!=null&&i.push(cn(l))}return i.join("")}case"uri-name":{let r=await this.evaluate(e.source,t);return je(r)?r.name:r instanceof be?r.subject.name:void 0}case"display-label":{let r=await this.resolver.resolveSubject({...e.labelTarget},this.catalog);return r?St(r,e.labelSource):void 0}case"resolve-ref":{let r=await this.evaluate(e.source,t);return r instanceof be?await this.resolver.resolveSubject(r.subject,this.catalog):je(r)?await this.resolver.resolveSubject(r,this.catalog):void 0}case"normalize":{let r=await this.evaluate(e.source,t),o=r==null?"":cn(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 i=await this.evaluate(o.value,t);if(i==null||Array.isArray(i)&&i.length===0)continue;let a=o.field.name;Array.isArray(i)&&Ya.has(a)&&i.every(s=>Za(s))&&(i=i.map(s=>String(s)).join("")),r[a]=i}return r}case"call-fragment":return this.evaluate(e.body,t);case"join":return(await this.evaluateList(e.source,t)).map(o=>o==null?"":cn(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 i of r)o+=ue(i,"Sum");return o}case"min":{let r=await this.evaluateList(e.source,t);if(r.length===0)throw new q("Min on an empty list is undefined; guard with IsSet");let o=ue(r[0],"Min");for(let i=1;i<r.length;i++){let a=ue(r[i],"Min");a<o&&(o=a)}return o}case"max":{let r=await this.evaluateList(e.source,t);if(r.length===0)throw new q("Max on an empty list is undefined; guard with IsSet");let o=ue(r[0],"Max");for(let i=1;i<r.length;i++){let a=ue(r[i],"Max");a>o&&(o=a)}return o}case"average":{let r=await this.evaluateList(e.source,t);if(r.length===0)throw new q("Average on an empty list is undefined; guard with IsSet");let o=0;for(let i of r)o+=ue(i,"Average");return o/r.length}case"for-each":{let r=await this.evaluateList(e.source,t),o=[];for(let i of r){let a=new Map(t);a.set(e.loopVar,i);let s=await this.evaluate(e.emit,a);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 i of r){let a=new Map(t);a.set(e.loopVar,i),o.push(await this.evaluate(e.mapBody,a))}return o}case"filter":{let r=await this.evaluateList(e.source,t),o=[];for(let i of r){let a=new Map(t);a.set(e.loopVar,i),await this.evaluate(e.predicate,a)===!0&&o.push(i)}return o}case"partition-by":{let r=await this.evaluateList(e.source,t),o=new Map,i=[];for(let a of r){let s=new Map(t);s.set(e.loopVar,a);let c=await this.evaluate(e.partitionKey,s),l=Pt(c),u=o.get(l);u||(u={kind:"Partition",key:c,members:[]},o.set(l,u),i.push(l)),u.members.push(a)}return i.map(a=>o.get(a))}case"distinct-by":{let r=await this.evaluateList(e.source,t),o=new Set,i=[];for(let a of r){let s=new Map(t);s.set(e.loopVar,a);let c=await this.evaluate(e.distinctKey,s),l=Pt(c);o.has(l)||(o.add(l),i.push(a))}return i}default:{let r=e;throw new q("Unknown expression kind")}}}async evaluateList(e,t){let r=await this.evaluate(e,t);return r==null?[]:Array.isArray(r)?r:[r]}};function St(n,e){if(n instanceof xe)return Ga(n,e);if(Ja(n))return T(e,f.key)?n.key:T(e,f.members)?n.members:void 0}function Ga(n,e){for(let t of n.statement){let r=Ct(t);if(!(!r||!T(r,e))&&(t instanceof qa||t instanceof za||t instanceof Wa||t instanceof Kt||t instanceof Dt))return t.object}}function Xa(n,e){let t=[];for(let r of n.statement){let o=Ct(r);if(!(!o||!T(o,e))){if(r instanceof Kt)t.push(r.object.subject);else if(r instanceof Dt)for(let i of r.object)i instanceof be&&t.push(i.subject)}}return t}function Ct(n){return n.predicate?.subject}function cn(n){return n==null?"":typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"?String(n):n instanceof xe?n.name??"":n instanceof be?n.subject.name:je(n)?n.name:""}function vt(n){return n==null?!1:typeof n=="string"||Array.isArray(n)?n.length>0:typeof n=="boolean"?n===!0:!0}function je(n){return typeof n=="object"&&n!==null&&typeof n.publisher=="string"&&typeof n.package_=="string"&&typeof n.name=="string"}function Ja(n){return typeof n=="object"&&n!==null&&n.kind==="Partition"&&Array.isArray(n.members)}function ue(n,e){if(typeof n=="number"&&Number.isFinite(n))return n;throw new q(`${e} requires numeric elements; got ${Qa(n)}`)}var Ya=new Set(["stringValue","text","rawContent","key"]);function Za(n){return typeof n=="string"||typeof n=="number"||typeof n=="boolean"}function Qa(n){return n===void 0?"undefined":n===null?"null":Array.isArray(n)?`array(${n.length})`:typeof n}function Pt(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 be){let e=n.subject;return`r:${e.publisher}/${e.package_}/${e.name}`}if(n instanceof xe){let e=n.name??"";return`k:${n.namespace??""}/${e}`}return je(n)?`u:${n.publisher}/${n.package_}/${n.name}`:`o:${JSON.stringify(n)}`}var Ue={"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"}},z=class extends Error{},W=class{backends=new Map;constructor(){this.register(new De),this.register(new Ce),this.register(new Ee),this.register(new Ae),this.register(new Re)}register(e){this.backends.set(e.backendUri,e)}async run(e){let t=e.transformationKanonaks??e.allKanonaks,r=le(e.transformation,t);if(!r.outputs.has(e.outputFormat))throw new z(`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 z(`No backend registered for OutputFormat "${e.outputFormat}".`);let i=new Ie(e.repository,e.parser,e.objectParser),a=new Te(i,e.allKanonaks);return r.kind==="instance"?this.runInstance(r,e,o,a):this.runSet(r,e,o,a)}async runInstance(e,t,r,o){let i=Et(t.instances,e.inputPattern.requires),a=At(i,e.inputPattern.sortBy),s=[];for(let c of a){let l=new Map;l.set("input",c);let u=await o.evaluate(e.rule,l);ln(u,e.name,`input "${c.name}"`);let d=un(await o.evaluate(e.artifactName,l),e.name,`input "${c.name}"`),p=e.overrides.get(t.outputFormat),k=r.render(u,p);s.push({fileName:d,format:t.outputFormat,content:k,source:{kind:"instance",sourceName:c.name}})}return s}async runSet(e,t,r,o){let i=Et(t.instances,e.inputPattern.requires),a=At(i,e.inputPattern.sortBy);return e.partitionBy?this.runSetWithPartition(e,a,t,r,o):this.runSetSingle(e,a,t,r,o)}async runSetSingle(e,t,r,o,i){let a=new Map;a.set("inputs",t);let s=await i.evaluate(e.rule,a);ln(s,e.name,"set");let c=un(await i.evaluate(e.artifactName,a),e.name,"set"),l=e.overrides.get(r.outputFormat),u=o.render(s,l);return[{fileName:c,format:r.outputFormat,content:u,source:{kind:"set",memberCount:t.length}}]}async runSetWithPartition(e,t,r,o,i){let a=e.partitionBy,s=new Map,c=[];for(let u of t){let d=ti(u,a);if(d==null)continue;let p=ri(d),k=s.get(p);k||(k={keyValue:d,keyDisplay:oi(d),members:[]},s.set(p,k),c.push(p)),k.members.push(u)}let l=[];for(let u of c){let d=s.get(u),p=new Map;p.set("inputs",d.members),p.set("key",d.keyValue);let k=await i.evaluate(e.rule,p);ln(k,e.name,`partition "${d.keyDisplay}"`);let b=un(await i.evaluate(e.artifactName,p),e.name,`partition "${d.keyDisplay}"`),g=e.overrides.get(r.outputFormat),y=o.render(k,g);l.push({fileName:b,format:r.outputFormat,content:y,source:{kind:"set",memberCount:d.members.length,partitionKey:d.keyDisplay}})}return l}findBackend(e){let t=Ue[e];if(t)return this.backends.get(t.formatUri)}};function Et(n,e){return e.length===0?n:n.filter(t=>{for(let r of e)if(!ni(t,r))return!1;return!0})}function At(n,e){if(e.length===0)return n;let t=[...n];return t.sort((r,o)=>{for(let i of e){let a=Rt(r,i.byProperty),s=Rt(o,i.byProperty),c=ei(a,s,i.order);if(c!==0)return c}return 0}),t}function Rt(n,e){for(let t of n.statement){let r=dn(t);if(!(!r||!T(r,e))){if(t instanceof Tt||t instanceof jt||t instanceof xt)return t.object;if(t instanceof Ot)throw new z(`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 Ut)throw new z(`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 ei(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 ni(n,e){for(let t of n.statement){let r=dn(t);if(!r||!T(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 ti(n,e){for(let t of n.statement){let r=dn(t);if(!(!r||!T(r,e))&&(t instanceof Tt||t instanceof jt||t instanceof xt||t instanceof Ut||t instanceof Ot))return t.object}}function dn(n){return n.predicate?.subject}function ri(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 _t){let e=n.subject;return`r:${e.publisher}/${e.package_}/${e.name}`}if(n instanceof It){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 oi(n){return n==null?"":typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"?String(n):n instanceof _t?n.subject.name:n instanceof It?n.name??"":typeof n=="object"&&n!==null&&typeof n.name=="string"?n.name:""}function ln(n,e,t){if(typeof n!="object"||n===null||n.kind!=="Document")throw new z(`Transformation "${e}" rule did not yield a Document for ${t}. Got: ${Lt(n)}`)}function un(n,e,t){if(typeof n=="string")return n;if(Array.isArray(n)&&n.every(ai))return n.map(r=>String(r)).join("");throw new z(`Transformation "${e}" artifactName did not yield a string for ${t}. Got: ${Lt(n)}`)}function ai(n){return typeof n=="string"||typeof n=="number"||typeof n=="boolean"}function Lt(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 fn(n){return[...A(n,f.InstanceTransformation),...A(n,f.SetTransformation)]}function Mt(){let n=new we("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",`
|
|
131
|
+
`),o}return'<svg xmlns="http://www.w3.org/2000/svg" width="1" height="1"/>'}};import{SubjectKanonak as ut}from"@kanonak-protocol/sdk";var Ie=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=Pe(t,e);if(r)return r;let o=`${e.publisher}/${e.package_}`,i=this.cache.get(o);if(!i){let a=await this.repository.getDocumentsByNamespaceAsync(e.publisher,e.package_);if(a.length===0)return;let s=a[0],c=new C(s,this.repository);i=await this.objectParser.parseKanonaks(c),this.cache.set(o,i)}for(let a of i)if(a instanceof ut&&a.name===e.name&&a.namespace&&a.namespace.startsWith(`${e.publisher}/${e.package_}@`))return a;for(let a of i)if(a instanceof ut&&a.name===e.name)return a}};import{EmbeddedKanonak as he,ReferenceKanonak as kt,SubjectKanonak as Ia,ListStatement as M,ReferenceStatement as sn,EmbeddedStatement as ce,StringStatement as yt,NumberStatement as _a,BooleanStatement as Ta}from"@kanonak-protocol/sdk";var E=class extends Error{constructor(t,r){super(`${t} (at ${r})`);this.path=r}path},dt=16;function le(n,e){let t=n.name,r={catalog:e,depth:0};if(v(n,f.InstanceTransformation))return ja(n,t,r);if(v(n,f.SetTransformation))return xa(n,t,r);throw new E("Subject is not a recognized v3 transformation type \u2014 expected InstanceTransformation or SetTransformation",t)}function ja(n,e,t){return{kind:"instance",name:n.name,inputPattern:ht(n,e),rule:_e(n,f.rule,`${e}.rule`,t),artifactName:_e(n,f.artifactName,`${e}.artifactName`,t),outputs:bt(n,`${e}.outputs`),overrides:wt(n,`${e}.formatOverrides`,t)}}function xa(n,e,t){let r=H(n,f.partitionBy);return{kind:"set",name:n.name,inputPattern:ht(n,e),rule:_e(n,f.rule,`${e}.rule`,t),artifactName:_e(n,f.artifactName,`${e}.artifactName`,t),outputs:bt(n,`${e}.outputs`),overrides:wt(n,`${e}.formatOverrides`,t),partitionBy:r}}function ht(n,e){let t=be(n,f.inputPattern);if(!t)throw new E("inputPattern is required",e);return Ua(t,`${e}.inputPattern`)}function Ua(n,e){let t=H(n,f.matchesClass);if(!t)throw new E("matchesClass is required",e);let r=[];for(let a of x(n,f.requires))if(a instanceof sn)r.push(an(a.object.subject));else if(a instanceof M)for(let s of a.object)s instanceof kt&&r.push(an(s.subject));let o=[],i=0;for(let a of x(n,f.sortBy))if(a instanceof M)for(let s of a.object)s instanceof he&&o.push(ft(s,`${e}.sortBy[${i++}]`));else a instanceof ce&&o.push(ft(a.object,`${e}.sortBy[${i++}]`));return{matchesClass:t,requires:r,sortBy:o}}function ft(n,e){let t=H(n,f.byProperty);if(!t)throw new E("SortKey.byProperty is required",e);let r=H(n,f.order);if(!r)throw new E("SortKey.order is required",e);if(T(r,f.ascending))return{byProperty:t,order:"ascending"};if(T(r,f.descending))return{byProperty:t,order:"descending"};throw new E(`SortKey.order must reference tx.ascending or tx.descending; got ${r.publisher}/${r.package_}/${r.name}`,e)}function _e(n,e,t,r){let o=be(n,e);if(!o)throw new E("expression is required",t);return se(o,t,r)}function se(n,e,t){if(v(n,f.StringLiteral))return{kind:"string-literal",value:B(n,f.stringLiteral,e)};if(v(n,f.IntegerLiteral))return{kind:"integer-literal",value:gt(n,f.integerLiteral,e)};if(v(n,f.DecimalLiteral))return{kind:"decimal-literal",value:gt(n,f.decimalLiteral,e)};if(v(n,f.BooleanLiteral))return{kind:"boolean-literal",value:qa(n,f.booleanLiteral,e)};if(v(n,f.VarRef))return{kind:"var-ref",varName:B(n,f.varName,e)};if(v(n,f.PropertyRead))return{kind:"property-read",source:D(n,f.readSource,`${e}.readSource`,t),readProp:G(n,f.readProp,e,"readProp")};if(v(n,f.Traverse))return{kind:"traverse",source:D(n,f.traverseSource,`${e}.traverseSource`,t),through:G(n,f.through,e,"through"),step:D(n,f.step,`${e}.step`,t)};if(v(n,f.BuildAstNode))return{kind:"build-ast-node",astClass:G(n,f.astClass,e,"astClass"),set:Na(n,`${e}.set`,t)};if(v(n,f.When))return{kind:"when",condition:D(n,f.condition,`${e}.condition`,t),thenBuild:D(n,f.thenBuild,`${e}.thenBuild`,t),elseBuild:Oa(n,f.elseBuild,`${e}.elseBuild`,t)};if(v(n,f.Concat))return{kind:"concat",parts:La(n,f.parts,`${e}.parts`,t)};if(v(n,f.Fallback))return{kind:"fallback",primary:D(n,f.primary,`${e}.primary`,t),alternate:D(n,f.alternate,`${e}.alternate`,t)};if(v(n,f.UriName))return{kind:"uri-name",source:D(n,f.uriNameOf,`${e}.uriNameOf`,t)};if(v(n,f.SubjectUri))return{kind:"subject-uri",source:D(n,f.subjectOf,`${e}.subjectOf`,t)};if(v(n,f.UriLiteral))return{kind:"uri-literal",refTo:G(n,f.refTo,e,"refTo")};if(v(n,f.DisplayLabel))return{kind:"display-label",labelTarget:G(n,f.labelTarget,e,"labelTarget"),labelSource:G(n,f.labelSource,e,"labelSource")};if(v(n,f.ResolveRef))return{kind:"resolve-ref",source:D(n,f.resolveSource,`${e}.resolveSource`,t)};if(v(n,f.Normalize))return{kind:"normalize",source:D(n,f.normSource,`${e}.normSource`,t),normKind:Fa(n,e)};if(v(n,f.IsSet))return{kind:"is-set",check:D(n,f.checkExpr,`${e}.checkExpr`,t)};if(v(n,f.CallFragment))return Va(n,e,t);if(v(n,f.Join))return{kind:"join",source:D(n,f.source,`${e}.source`,t),separator:B(n,f.separator,e)};if(v(n,f.Count))return{kind:"count",source:D(n,f.source,`${e}.source`,t)};if(v(n,f.Sum))return{kind:"sum",source:D(n,f.source,`${e}.source`,t)};if(v(n,f.Min))return{kind:"min",source:D(n,f.source,`${e}.source`,t)};if(v(n,f.Max))return{kind:"max",source:D(n,f.source,`${e}.source`,t)};if(v(n,f.Average))return{kind:"average",source:D(n,f.source,`${e}.source`,t)};if(v(n,f.ForEach))return{kind:"for-each",source:D(n,f.source,`${e}.source`,t),loopVar:B(n,f.loopVar,e),emit:D(n,f.emit,`${e}.emit`,t)};if(v(n,f.ListMap))return{kind:"list-map",source:D(n,f.source,`${e}.source`,t),loopVar:B(n,f.loopVar,e),mapBody:D(n,f.mapBody,`${e}.mapBody`,t)};if(v(n,f.Filter))return{kind:"filter",source:D(n,f.source,`${e}.source`,t),loopVar:B(n,f.loopVar,e),predicate:D(n,f.predicate,`${e}.predicate`,t)};if(v(n,f.PartitionBy))return{kind:"partition-by",source:D(n,f.source,`${e}.source`,t),loopVar:B(n,f.loopVar,e),partitionKey:D(n,f.partitionKey,`${e}.partitionKey`,t)};if(v(n,f.DistinctBy))return{kind:"distinct-by",source:D(n,f.source,`${e}.source`,t),loopVar:B(n,f.loopVar,e),distinctKey:D(n,f.distinctKey,`${e}.distinctKey`,t)};throw new E("Expression is not of a recognized v3 type \u2014 embedded has no matching subclass of tx.Expression",e)}function D(n,e,t,r){let o=be(n,e);if(!o)throw new E("child expression is required",t);return se(o,t,r)}function Oa(n,e,t,r){let o=be(n,e);if(o)return se(o,t,r)}function La(n,e,t,r){let o=[],i=0;for(let a of x(n,e))if(a instanceof M)for(let s of a.object)s instanceof he&&o.push(se(s,`${t}[${i++}]`,r));else a instanceof ce&&o.push(se(a.object,`${t}[${i++}]`,r));return o}function Na(n,e,t){let r=[],o=0;for(let i of x(n,f.set))if(i instanceof M)for(let a of i.object)a instanceof he&&r.push(mt(a,`${e}[${o++}]`,t));else i instanceof ce&&r.push(mt(i.object,`${e}[${o++}]`,t));return r}function mt(n,e,t){return{field:G(n,f.field,e,"field"),value:D(n,f.bindValue,`${e}.bindValue`,t)}}function Fa(n,e){let t=H(n,f.normKind);if(!t)throw new E("normKind is required",e);if(T(t,f.NORM_TRIM_END))return"trim-end";throw new E(`Unknown NormalizeKind: ${t.publisher}/${t.package_}/${t.name}`,e)}function Va(n,e,t){if(t.depth>=dt)throw new E(`Fragment recursion exceeded MAX_FRAGMENT_DEPTH (${dt})`,e);let r=H(n,f.fragmentRef);if(!r)throw new E("fragmentRef is required",e);let o=Ba(t.catalog,r);if(!o)throw new E(`ExpressionFragment not found: ${r.publisher}/${r.package_}/${r.name}`,e);let i=be(o,f.body);if(!i)throw new E(`ExpressionFragment ${r.name} has no body`,e);return{kind:"call-fragment",body:se(i,`${e}.fragment(${r.name})`,{catalog:t.catalog,depth:t.depth+1})}}function Ba(n,e){for(let t of n)if(!(!(t instanceof Ia)||t.name!==e.name||!(t.namespace||"").startsWith(`${e.publisher}/${e.package_}@`))&&v(t,f.ExpressionFragment))return t}function bt(n,e){let t=new Set;for(let r of x(n,f.outputs))if(r instanceof sn)t.add(r.object.subject.name);else if(r instanceof M)for(let o of r.object)o instanceof kt&&t.add(o.subject.name);if(t.size===0)throw new E("outputs is required (at least one OutputFormat)",e);return t}function wt(n,e,t){let r=new Map,o=0;for(let i of x(n,f.formatOverrides))if(i instanceof M){for(let a of i.object)if(a instanceof he){let[s,c]=pt(a,`${e}[${o++}]`);r.set(s,c)}}else if(i instanceof ce){let[a,s]=pt(i.object,`${e}[${o++}]`);r.set(a,s)}return r}function pt(n,e){let t=H(n,f.formatTarget);if(!t)throw new E("formatTarget is required",e);let r=[];for(let a of x(n,f.metadataKeys))if(a instanceof yt)r.push(a.object);else if(a instanceof M)for(let s of a.object){let c=s.value;typeof c=="string"&&r.push(c)}let o=new Map;for(let a of x(n,f.metadataRenames))if(a instanceof M){for(let s of a.object)if(s instanceof he){let c=ye(s,f.fromKey),l=ye(s,f.toKey);c&&l&&o.set(c,l)}}else if(a instanceof ce){let s=a.object,c=ye(s,f.fromKey),l=ye(s,f.toKey);c&&l&&o.set(c,l)}let i=$t(n,f.trailingNewline);return[t.name,{metadataKeys:r.length>0?r:void 0,metadataRenames:o,trailingNewline:i}]}function Ma(n){return n.predicate?.subject}function x(n,e){let t=[];for(let r of n.statement){let o=Ma(r);o&&T(o,e)&&t.push(r)}return t}function be(n,e){for(let t of x(n,e))if(t instanceof ce)return t.object}function H(n,e){for(let t of x(n,e))if(t instanceof sn)return an(t.object.subject)}function ye(n,e){for(let t of x(n,e))if(t instanceof yt)return t.object}function Ha(n,e){for(let t of x(n,e))if(t instanceof _a)return t.object}function $t(n,e){for(let t of x(n,e))if(t instanceof Ta)return t.object}function B(n,e,t){let r=ye(n,e);if(r===void 0)throw new E(`${e.name} (string) is required`,t);return r}function gt(n,e,t){let r=Ha(n,e);if(r===void 0)throw new E(`${e.name} (number) is required`,t);return r}function qa(n,e,t){let r=$t(n,e);if(r===void 0)throw new E(`${e.name} (boolean) is required`,t);return r}function G(n,e,t,r){let o=H(n,e);if(!o)throw new E(`${r} (URI reference) is required`,t);return o}function an(n){return{publisher:n.publisher,package_:n.package_,name:n.name}}import{DefinedKanonak as xe,EmbeddedKanonak as za,ReferenceKanonak as de,SubjectKanonak as St,StringStatement as Wa,NumberStatement as Ga,BooleanStatement as Xa,ReferenceStatement as Dt,EmbeddedStatement as Ja,ListStatement as Ct}from"@kanonak-protocol/sdk";var q=class extends Error{},Te=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 q(`Unbound variable "${e.varName}"`);return t.get(e.varName)}case"concat":{let r=[];for(let o of e.parts){let i=await this.evaluate(o,t);if(i!=null)if(Array.isArray(i))for(let a of i)r.push(a);else r.push(i)}return r}case"fallback":{let r=await this.evaluate(e.primary,t);return Pt(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 Pt(r)}case"property-read":{let r=await this.evaluate(e.source,t);return vt(r,e.readProp)}case"traverse":{let r=await this.evaluate(e.source,t);if(!(r instanceof xe))return;let o=Za(r,e.through),i=[];for(let a of o){let s=await this.resolver.resolveSubject(a,this.catalog);if(!s)continue;let c=new Map(t);c.set("input",s);let l=await this.evaluate(e.step,c);l!=null&&i.push(cn(l))}return i.join("")}case"uri-name":{let r=await this.evaluate(e.source,t);return je(r)?r.name:r instanceof de?r.subject.name:r instanceof St?r.name:r instanceof za?r.name??"":void 0}case"subject-uri":{let r=await this.evaluate(e.source,t);if(r instanceof St){let o=r.namespace??"",i=r.name??"";return!o||!i?void 0:`${o}/${i}`}if(r instanceof de){let o=r.subject,i=o.version;return i&&typeof i.major=="number"?`${o.publisher}/${o.package_}@${i.major}.${i.minor}.${i.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?vt(r,e.labelSource):void 0}case"resolve-ref":{let r=await this.evaluate(e.source,t);return r instanceof de?await this.resolver.resolveSubject(r.subject,this.catalog):je(r)?await this.resolver.resolveSubject(r,this.catalog):void 0}case"normalize":{let r=await this.evaluate(e.source,t),o=r==null?"":cn(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 i=await this.evaluate(o.value,t);if(i==null||Array.isArray(i)&&i.length===0)continue;let a=o.field.name;Array.isArray(i)&&ei.has(a)&&i.every(s=>ni(s))&&(i=i.map(s=>String(s)).join("")),r[a]=i}return r}case"call-fragment":return this.evaluate(e.body,t);case"join":return(await this.evaluateList(e.source,t)).map(o=>o==null?"":cn(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 i of r)o+=ue(i,"Sum");return o}case"min":{let r=await this.evaluateList(e.source,t);if(r.length===0)throw new q("Min on an empty list is undefined; guard with IsSet");let o=ue(r[0],"Min");for(let i=1;i<r.length;i++){let a=ue(r[i],"Min");a<o&&(o=a)}return o}case"max":{let r=await this.evaluateList(e.source,t);if(r.length===0)throw new q("Max on an empty list is undefined; guard with IsSet");let o=ue(r[0],"Max");for(let i=1;i<r.length;i++){let a=ue(r[i],"Max");a>o&&(o=a)}return o}case"average":{let r=await this.evaluateList(e.source,t);if(r.length===0)throw new q("Average on an empty list is undefined; guard with IsSet");let o=0;for(let i of r)o+=ue(i,"Average");return o/r.length}case"for-each":{let r=await this.evaluateList(e.source,t),o=[];for(let i of r){let a=new Map(t);a.set(e.loopVar,i);let s=await this.evaluate(e.emit,a);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 i of r){let a=new Map(t);a.set(e.loopVar,i),o.push(await this.evaluate(e.mapBody,a))}return o}case"filter":{let r=await this.evaluateList(e.source,t),o=[];for(let i of r){let a=new Map(t);a.set(e.loopVar,i),await this.evaluate(e.predicate,a)===!0&&o.push(i)}return o}case"partition-by":{let r=await this.evaluateList(e.source,t),o=new Map,i=[];for(let a of r){let s=new Map(t);s.set(e.loopVar,a);let c=await this.evaluate(e.partitionKey,s),l=Kt(c),u=o.get(l);u||(u={kind:"Partition",key:c,members:[]},o.set(l,u),i.push(l)),u.members.push(a)}return i.map(a=>o.get(a))}case"distinct-by":{let r=await this.evaluateList(e.source,t),o=new Set,i=[];for(let a of r){let s=new Map(t);s.set(e.loopVar,a);let c=await this.evaluate(e.distinctKey,s),l=Kt(c);o.has(l)||(o.add(l),i.push(a))}return i}default:{let r=e;throw new q("Unknown expression kind")}}}async evaluateList(e,t){let r=await this.evaluate(e,t);return r==null?[]:Array.isArray(r)?r:[r]}};function vt(n,e){if(n instanceof xe)return Ya(n,e);if(Qa(n))return T(e,f.key)?n.key:T(e,f.members)?n.members:void 0}function Ya(n,e){for(let t of n.statement){let r=Et(t);if(!(!r||!T(r,e))&&(t instanceof Wa||t instanceof Ga||t instanceof Xa||t instanceof Dt||t instanceof Ja||t instanceof Ct))return t.object}}function Za(n,e){let t=[];for(let r of n.statement){let o=Et(r);if(!(!o||!T(o,e))){if(r instanceof Dt)t.push(r.object.subject);else if(r instanceof Ct)for(let i of r.object)i instanceof de&&t.push(i.subject)}}return t}function Et(n){return n.predicate?.subject}function cn(n){return n==null?"":typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"?String(n):n instanceof xe?n.name??"":n instanceof de?n.subject.name:je(n)?n.name:""}function Pt(n){return n==null?!1:typeof n=="string"||Array.isArray(n)?n.length>0:typeof n=="boolean"?n===!0:!0}function je(n){return typeof n=="object"&&n!==null&&typeof n.publisher=="string"&&typeof n.package_=="string"&&typeof n.name=="string"}function Qa(n){return typeof n=="object"&&n!==null&&n.kind==="Partition"&&Array.isArray(n.members)}function ue(n,e){if(typeof n=="number"&&Number.isFinite(n))return n;throw new q(`${e} requires numeric elements; got ${ti(n)}`)}var ei=new Set(["stringValue","text","rawContent","key"]);function ni(n){return typeof n=="string"||typeof n=="number"||typeof n=="boolean"}function ti(n){return n===void 0?"undefined":n===null?"null":Array.isArray(n)?`array(${n.length})`:typeof n}function Kt(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 de){let e=n.subject;return`r:${e.publisher}/${e.package_}/${e.name}`}if(n instanceof xe){let e=n.name??"";return`k:${n.namespace??""}/${e}`}return je(n)?`u:${n.publisher}/${n.package_}/${n.name}`:`o:${JSON.stringify(n)}`}var Ue={"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"}},z=class extends Error{},W=class{backends=new Map;constructor(){this.register(new De),this.register(new Ce),this.register(new Ee),this.register(new Ae),this.register(new Re)}register(e){this.backends.set(e.backendUri,e)}async run(e){let t=e.transformationKanonaks??e.allKanonaks,r=le(e.transformation,t);if(!r.outputs.has(e.outputFormat))throw new z(`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 z(`No backend registered for OutputFormat "${e.outputFormat}".`);let i=new Ie(e.repository,e.parser,e.objectParser),a=new Te(i,e.allKanonaks);return r.kind==="instance"?this.runInstance(r,e,o,a):this.runSet(r,e,o,a)}async runInstance(e,t,r,o){let i=At(t.instances,e.inputPattern.requires),a=Rt(i,e.inputPattern.sortBy),s=[];for(let c of a){let l=new Map;l.set("input",c);let u=await o.evaluate(e.rule,l);ln(u,e.name,`input "${c.name}"`);let d=un(await o.evaluate(e.artifactName,l),e.name,`input "${c.name}"`),p=e.overrides.get(t.outputFormat),k=r.render(u,p);s.push({fileName:d,format:t.outputFormat,content:k,source:{kind:"instance",sourceName:c.name}})}return s}async runSet(e,t,r,o){let i=At(t.instances,e.inputPattern.requires),a=Rt(i,e.inputPattern.sortBy);return e.partitionBy?this.runSetWithPartition(e,a,t,r,o):this.runSetSingle(e,a,t,r,o)}async runSetSingle(e,t,r,o,i){let a=new Map;a.set("inputs",t);let s=await i.evaluate(e.rule,a);ln(s,e.name,"set");let c=un(await i.evaluate(e.artifactName,a),e.name,"set"),l=e.overrides.get(r.outputFormat),u=o.render(s,l);return[{fileName:c,format:r.outputFormat,content:u,source:{kind:"set",memberCount:t.length}}]}async runSetWithPartition(e,t,r,o,i){let a=e.partitionBy,s=new Map,c=[];for(let u of t){let d=ai(u,a);if(d==null)continue;let p=ii(d),k=s.get(p);k||(k={keyValue:d,keyDisplay:si(d),members:[]},s.set(p,k),c.push(p)),k.members.push(u)}let l=[];for(let u of c){let d=s.get(u),p=new Map;p.set("inputs",d.members),p.set("key",d.keyValue);let k=await i.evaluate(e.rule,p);ln(k,e.name,`partition "${d.keyDisplay}"`);let b=un(await i.evaluate(e.artifactName,p),e.name,`partition "${d.keyDisplay}"`),g=e.overrides.get(r.outputFormat),y=o.render(k,g);l.push({fileName:b,format:r.outputFormat,content:y,source:{kind:"set",memberCount:d.members.length,partitionKey:d.keyDisplay}})}return l}findBackend(e){let t=Ue[e];if(t)return this.backends.get(t.formatUri)}};function At(n,e){return e.length===0?n:n.filter(t=>{for(let r of e)if(!oi(t,r))return!1;return!0})}function Rt(n,e){if(e.length===0)return n;let t=[...n];return t.sort((r,o)=>{for(let i of e){let a=It(r,i.byProperty),s=It(o,i.byProperty),c=ri(a,s,i.order);if(c!==0)return c}return 0}),t}function It(n,e){for(let t of n.statement){let r=dn(t);if(!(!r||!T(r,e))){if(t instanceof jt||t instanceof xt||t instanceof Ut)return t.object;if(t instanceof Lt)throw new z(`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 Ot)throw new z(`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 ri(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 oi(n,e){for(let t of n.statement){let r=dn(t);if(!r||!T(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 ai(n,e){for(let t of n.statement){let r=dn(t);if(!(!r||!T(r,e))&&(t instanceof jt||t instanceof xt||t instanceof Ut||t instanceof Ot||t instanceof Lt))return t.object}}function dn(n){return n.predicate?.subject}function ii(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 Tt){let e=n.subject;return`r:${e.publisher}/${e.package_}/${e.name}`}if(n instanceof _t){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 si(n){return n==null?"":typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"?String(n):n instanceof Tt?n.subject.name:n instanceof _t?n.name??"":typeof n=="object"&&n!==null&&typeof n.name=="string"?n.name:""}function ln(n,e,t){if(typeof n!="object"||n===null||n.kind!=="Document")throw new z(`Transformation "${e}" rule did not yield a Document for ${t}. Got: ${Nt(n)}`)}function un(n,e,t){if(typeof n=="string")return n;if(Array.isArray(n)&&n.every(ci))return n.map(r=>String(r)).join("");throw new z(`Transformation "${e}" artifactName did not yield a string for ${t}. Got: ${Nt(n)}`)}function ci(n){return typeof n=="string"||typeof n=="number"||typeof n=="boolean"}function Nt(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 fn(n){return[...A(n,f.InstanceTransformation),...A(n,f.SetTransformation)]}function Ht(){let n=new we("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",`
|
|
132
132
|
Examples:
|
|
133
133
|
|
|
134
134
|
# List every Transformation available in the local workspace
|
|
@@ -157,14 +157,14 @@ Examples:
|
|
|
157
157
|
|
|
158
158
|
# List the registered format backends
|
|
159
159
|
$ kanonak transform formats
|
|
160
|
-
`);return n.addCommand(
|
|
160
|
+
`);return n.addCommand(hi()),n.addCommand($i()),n.addCommand(vi()),n.addCommand(Ki()),n}function hi(){return new we("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.").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 bi(n,e)}catch(t){console.error(`Error: ${t.message}`),process.exit(1)}})}async function bi(n,e){let t=new mn,r=new pn,o=await O(process.cwd(),t),i=await qt(n,o,r),{transformation:a,transformationKanonaks:s}=i;console.log(`Transformation: ${Le(a)}`);let c=le(a,s),l=await Di(e.scope,o,t,r),u=await Ai(l,c.inputPattern.matchesClass,o);console.log(`Scope: ${e.scope} \u2014 found ${u.length} instance(s) of ${c.inputPattern.matchesClass.publisher}/${c.inputPattern.matchesClass.package_}/${c.inputPattern.matchesClass.name}`),u.length===0&&c.kind==="instance"&&(console.error("No matching input instances in scope. Check the transformation's inputPattern.matchesClass vs. the scope package."),process.exit(1));let d=wi(c.outputs,e.format);console.log(`Output format: ${d}`);let p=Ue[d];if(!p)throw new Error(`Unknown format "${d}". Run \`kanonak transform formats\` to see what the runner supports.`);let b=await new W().run({transformation:a,instances:u,allKanonaks:l,transformationKanonaks:s,repository:o,parser:t,objectParser:r,outputFormat:d}),g=pi(e.out);di(g,{recursive:!0});for(let y of b){let h=Ei(y.fileName),w=mi(g,`${h}${p.extension}`);ui(w,y.content,"utf-8"),console.log(` wrote ${w}`)}console.log(`Done. ${b.length} artifact(s) written to ${g}`)}function wi(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 $i(){return new we("list").description("Scan the local workspace + cache for every Transformation instance and print a one-line summary per hit.").action(async()=>{try{await Si()}catch(n){console.error(`Error: ${n.message}`),process.exit(1)}})}async function Si(){let n=new mn,e=new pn,t=await O(process.cwd(),n),r=await t.getAllDocumentsAsync(),o=new Map;for(let a of r)try{let s=new C(a,t),c=await e.parseKanonaks(s),l=fn(c);for(let u of l){let d=kn(u);if(!d)continue;let p=o.get(d)??[];p.push({tx:u,kanonaks:c,doc:a}),o.set(d,p)}}catch{}let i=[];for(let a of o.values()){if(a.length===1){i.push(Vt(a[0].tx,a[0].kanonaks));continue}let s=gn(a.map(l=>l.doc));if(!s.chosen)continue;let c=a.find(l=>l.doc===s.chosen);c&&i.push(Vt(c.tx,c.kanonaks))}if(i.length===0){console.log("No Transformation instances found in the current workspace.");return}i.sort((a,s)=>a.uri.localeCompare(s.uri));for(let a of i)console.log(`${a.uri}`),console.log(` matches: ${a.matchesClass}`),console.log(` outputs: ${a.outputs.join(", ")}`)}function vi(){return new we("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 Pi(n)}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}})}async function Pi(n){let e=new mn,t=new pn,r=await O(process.cwd(),e),{transformation:o,transformationKanonaks:i}=await qt(n,r,t),a=le(o,i);if(console.log(`Transformation: ${Le(o)}`),console.log(),console.log("Input pattern:"),console.log(` Matches class: ${Oe(a.inputPattern.matchesClass)}`),a.inputPattern.requires.length>0){console.log(" Required properties:");for(let s of a.inputPattern.requires)console.log(` - ${Oe(s)}`)}else console.log(" Required properties: (none)");if(console.log(),console.log(`Outputs: ${Array.from(a.outputs).sort().join(", ")}`),console.log(),a.overrides.size>0){console.log("Format overrides:");for(let[s,c]of a.overrides){if(console.log(` ${s}:`),c.metadataKeys&&console.log(` metadata keys: ${c.metadataKeys.join(", ")}`),c.metadataRenames.size>0){let l=[];for(let[u,d]of c.metadataRenames)l.push(`${u} \u2192 ${d}`);console.log(` metadata renames: ${l.join(", ")}`)}c.trailingNewline!==void 0&&console.log(` trailing newline: ${c.trailingNewline}`)}console.log()}console.log(`Rule root kind: ${a.rule.kind}`),a.rule.kind==="build-ast-node"&&(console.log(`Rule root AST class: ${Oe(a.rule.astClass)}`),console.log(`Rule root bindings: ${a.rule.set.length} field(s)`)),console.log(`Artifact name root kind: ${a.artifactName.kind}`)}function Ki(){return new we("formats").description("List the OutputFormat names the runner can serialize to.").action(()=>{console.log("Registered format backends:");let n=Object.entries(Ue).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 qt(n,e,t){let r,o,i;if(n.includes("/")){let p=n.indexOf("@"),k=n;if(p!==-1){let g=n.indexOf("/",p);if(g===-1)throw new Error(`Transformation URI "${n}" has @version but no trailing /<name>`);k=n.substring(0,p)+n.substring(g)}let b=k.split("/");if(b.length<3)throw new Error(`Invalid transformation URI "${n}" \u2014 expected publisher/package/name or publisher/package@version/name`);r=b[0],o=b[1],i=b.slice(2).join("/")}else i=n;if(r&&o){let p=await e.getDocumentsByNamespaceAsync(r,o);if(p.length===0)throw new Error(`Package ${r}/${o} not found in the local workspace or cache.`);let k=Ci(n),b=zt(p,k,`${r}/${o}`),g=new C(b,e),y=await t.parseKanonaks(g),h=Pe(y,{publisher:r,package_:o,name:i,version:""});if(!h){let w=fn(y),$=w.find(P=>P.name===i);if(!$)throw new Error(`Transformation "${i}" not found in package ${r}/${o}. Package contains ${w.length} Transformation(s): ${w.map(P=>P.name).join(", ")||"(none)"}`);return{transformation:$,transformationKanonaks:y}}return{transformation:h,transformationKanonaks:y}}let a=await e.getAllDocumentsAsync(),s=new Map;for(let p of a)try{let k=new C(p,e),b=await t.parseKanonaks(k),g=fn(b);for(let y of g){if(y.name!==i)continue;let h=kn(y);if(!h)continue;let w=s.get(h)??[];w.push({tx:y,kanonaks:b,doc:p}),s.set(h,w)}}catch{}if(s.size===0)throw new Error(`No Transformation named "${i}" found in the workspace. Try \`kanonak transform list\` to see available transformations.`);if(s.size>1){let p=Array.from(s.keys()).sort().join(`
|
|
161
161
|
`);throw new Error(`Multiple Transformations named "${i}" in the workspace \u2014 disambiguate with a full publisher/package/name URI:
|
|
162
|
-
${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])),u=gn(c.map(p=>p.doc));if(!u.chosen)throw new Error(`Could not select a Transformation version for "${i}".`);let d=l.get(u.chosen);if(u.multipleVersionsPresent){let p=g=>{let y=g.metadata.namespace_?.version;return y?
|
|
163
|
-
`);let i=o.reduce((a,s)=>Math.max(a,s.packageName.length),0);for(let{packageName:a,version:s}of o)console.log(` ${a.padEnd(i)} @${s}`)}async function
|
|
164
|
-
`),g.sort();for(let y of g)console.log(` ${y}`)}async function yn(n,e,t,r,o,i){try{let a=await n.getHighestVersion(r,o);if(!a)return;i.add(`${r}|${o}|${a}`)}catch{}}import{Command as
|
|
162
|
+
${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])),u=gn(c.map(p=>p.doc));if(!u.chosen)throw new Error(`Could not select a Transformation version for "${i}".`);let d=l.get(u.chosen);if(u.multipleVersionsPresent){let p=g=>{let y=g.metadata.namespace_?.version;return y?Mt(y):""},k=d.tx.namespace??"",b=k.includes("@")?k.substring(0,k.indexOf("@")):k;console.warn(`Warning: Transformation "${i}" has ${c.length} versions present (${c.map(g=>p(g.doc)).filter(Boolean).join(", ")}); using @${p(u.chosen)}. Pin with ${b}@<version>/${i} to suppress this warning.`)}return{transformation:d.tx,transformationKanonaks:d.kanonaks}}async function Di(n,e,t,r){if(/^[.\/\\]/.test(n)||/^[A-Za-z]:/.test(n)||n.endsWith(".kan.yml")||Ft(n)&&fi(n).isFile()){if(!Ft(n))throw new Error(`Scope file not found: ${n}`);let b=li(n,"utf-8"),g=t.parse(b),y=new C(g,e);return r.parseKanonaks(y)}let i=n.indexOf("@"),a=i===-1?n:n.substring(0,i),s=i===-1?void 0:n.substring(i+1),c=a.indexOf("/");if(c===-1)throw new Error(`Invalid scope "${n}" \u2014 expected a file path or publisher/package[@version] URI`);let l=a.substring(0,c),u=a.substring(c+1),d=await e.getDocumentsByNamespaceAsync(l,u);if(d.length===0)throw new Error(`Scope package ${l}/${u} not found in the local workspace or cache.`);let p=zt(d,s,`${l}/${u}`),k=new C(p,e);return r.parseKanonaks(k)}function Ci(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 zt(n,e,t){let r=i=>{let a=i.metadata.namespace_?.version;return a?Mt(a):""},o=gn(n,{requestedVersion:e});if(o.exactRequestedVersionMissing){let i=n.map(r).filter(Boolean).sort().join(", ");throw new Error(`${t}@${e} not found in the local workspace or cache. Available versions: ${i||"(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 Vt(n,e){try{let t=le(n,e);return{uri:Le(n),matchesClass:Oe(t.inputPattern.matchesClass),outputs:Array.from(t.outputs).sort()}}catch(t){return{uri:Le(n),matchesClass:`(compile error: ${t.message})`,outputs:[]}}}function Le(n){let e=n.namespace||"",t=e.indexOf("@");return`${t===-1?e:e.substring(0,t)}/${n.name}`}function Oe(n){return`${n.publisher}/${n.package_}/${n.name}`}function Ei(n){return n.replace(/[\\/:*?"<>|\s]+/g,"_").replace(/^_+|_+$/g,"")}async function Ai(n,e,t){let r=new Map;for(let a of n){if(!(a instanceof gi))continue;let s=kn(a);s&&r.set(s,a)}let o=[];try{o=(await new ki({vocabulary:new yi}).reason(t)).getInstancesOfClass(Bt(e.publisher,e.package_,e.name))}catch{}let i=[];for(let a of o){let s=r.get(a);s&&i.push(s)}return i.length>0?i:A(n,e)}function kn(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:Bt(r.substring(0,o),r.substring(o+1),n.name)}import{Command as Ri}from"commander";import{KanonakParser as Ii,PublisherIndex as Wt,CredentialStore as Gt,createAuthenticatedFetch as Xt,FileSystemKanonakDocumentRepository as _i,Reasoner as Ti,KanonakVocabulary as ji,getGlobalCachePath as xi,makeUriKey as Ui}from"@kanonak-protocol/sdk";function Oi(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 Jt(){return new Ri("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 Ni(n,e.type):await Li(n)})}async function Li(n){let e=new Gt,t=Xt(e),r=new Wt({fetchFn:t}),o;try{o=await r.listLatestPackages(n)}catch(a){console.error(`Failed to fetch publisher index for ${n}: ${a.message}`),process.exit(1)}if(o.length===0){console.log(`No packages found at ${n}.`);return}console.log(`Packages published by ${n}:
|
|
163
|
+
`);let i=o.reduce((a,s)=>Math.max(a,s.packageName.length),0);for(let{packageName:a,version:s}of o)console.log(` ${a.padEnd(i)} @${s}`)}async function Ni(n,e){let t=Oi(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 Ii,o=new Gt,i=Xt(o),a=new Wt({fetchFn:i}),s=new U,c=new Set,l=[];try{l=await a.listLatestPackages(n)}catch(y){console.error(`Failed to fetch publisher index for ${n}: ${y.message}`),process.exit(1)}for(let{packageName:y,version:h}of l)c.add(`${n}|${y}|${h}`);await yn(a,s,i,"kanonak.org","core-rdf",c),await yn(a,s,i,"kanonak.org","core-owl",c),await yn(a,s,i,t.publisher,t.package_,c);for(let y of c){let[h,w,$]=y.split("|");if(!s.has(h,w,$))try{let P=await a.getPackageUrl(h,w,$),K=await i(P,h);if(!K.ok){console.error(`Warning: failed to fetch ${h}/${w}@${$}: ${K.status} ${K.statusText}`);continue}let Q=await K.text();s.put(h,w,$,Q)}catch(P){console.error(`Warning: failed to fetch ${h}/${w}@${$}: ${P.message}`)}}let u=new _i(xi(),!0,r),p=await new Ti({vocabulary:new ji}).reason(u),k=Ui(t.publisher,t.package_,t.name),g=p.getInstancesOfClass(k).filter(y=>y!==k);if(g.length===0){console.log(`No instances of ${k} found in ${n}'s catalogue.`);return}console.log(`Instances of ${k} in ${n}'s catalogue:
|
|
164
|
+
`),g.sort();for(let y of g)console.log(` ${y}`)}async function yn(n,e,t,r,o,i){try{let a=await n.getHighestVersion(r,o);if(!a)return;i.add(`${r}|${o}|${a}`)}catch{}}import{Command as Yt}from"commander";function fe(n){return`${I}/${_}/${n}`}var hn={[fe("fetch-and-deploy")]:(n,e,t,r)=>n.add(e,t[0],r),[fe("remove-deployed")]:(n,e,t,r)=>n.remove(e,t[0],r),[fe("list-deployed")]:(n,e,t,r)=>n.list(e,r),[fe("update-deployed")]:(n,e,t,r)=>n.update(e,t[0],r),[fe("search-available")]:(n,e,t,r)=>n.search(e,r),[fe("show-info")]:(n,e,t,r)=>n.info(e,t[0],r)};function Zt(n,e,t){for(let r of e){let o=new Yt(r.commandName).description(r.description.trim());for(let i of r.commands){let a=o.command(Fi(i));a.description(i.description);for(let s of i.arguments)if(s.isOption){let c=s.defaultValue!=null?`--${s.argumentName} [value]`:`--${s.argumentName} <value>`;a.option(c,"",s.defaultValue)}a.action(async(...s)=>{let c=Vi(s);await Bi(t,r,i,s,c)})}n.addCommand(o)}}function Fi(n){let e=n.arguments.filter(t=>!t.isOption).map(t=>t.required?`<${t.argumentName}>`:`[${t.argumentName}]`);return[n.subcommandName,...e].join(" ")}function Vi(n){for(let e=n.length-1;e>=0;e--)if(n[e]&&typeof n[e]=="object"&&!(n[e]instanceof Yt))return n[e];return{}}async function Bi(n,e,t,r,o){let i=[];for(let s of r)if(typeof s=="string")i.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(hn).join(", ")}.`),process.exit(1));let a=hn[t.actionKey];a||(console.error(`Capability subcommand '${t.subcommandName}' references unknown Action '${t.actionKey}'. Known actions: ${Object.keys(hn).join(", ")}.`),process.exit(1)),await a(n,e,i,o)}import{existsSync as Qt,readFileSync as Mi,statSync as er}from"fs";import{resolve as Hi}from"path";import{KanonakObjectParser as qi,PublisherIndex as bn,PublisherConfigResolver as zi,formatVersion as nr,pickHighestDocument as Wi}from"@kanonak-protocol/sdk";var Ne=class{constructor(e,t,r,o,i,a){this.fileCache=e;this.parser=t;this.publisherIndex=r;this.fetchFn=o;this.handlerRegistry=i;this.repository=a}fileCache;parser;publisherIndex;fetchFn;handlerRegistry;repository;objectParser=new qi;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 i=ee(t);i||(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:a,packageName:s,version:c,instanceName:l}=i,u=await this.repository.getDocumentsByNamespaceAsync(a,s);if(u.length>0){let k=Wi(u,{requestedVersion:c??void 0});if(k.chosen){let b=k.chosen.metadata.namespace_;(!b||!b.version)&&(console.error(`Document for ${a}/${s} is missing namespace metadata.`),process.exit(1));let g=nr(b.version);this.fileCache.put(a,s,g,this.parser.save(k.chosen)),await this.deployFromDoc(e,k.chosen,a,s,g,l??void 0,`${a}/${s}@${g}`,r);return}}let d=c??await this.publisherIndex.getHighestVersion(a,s);d||(console.error(`Could not resolve version for "${a}/${s}".`),await this.printPackageSuggestions(a,s,e.commandName),process.exit(1));let p=this.fileCache.get(a,s,d);if(!p){let k=await this.publisherIndex.getPackageUrl(a,s,d),b=await this.fetchFn(k,a);b.ok||(b.status===404?(console.error(`Package ${a}/${s}@${d} not found at ${k}.`),console.error(`The publisher index lists this version but the file is missing \u2014 it may have been unpublished. Try \`kanonak ${e.commandName} search\` to see the current catalogue.`)):console.error(`Failed to fetch ${k} (${b.status} ${b.statusText}).`),process.exit(1)),p=await b.text(),this.fileCache.put(a,s,d,p)}await this.deployFromDoc(e,this.parser.parse(p),a,s,d,l??void 0,`${a}/${s}@${d}`,r)}tryLoadFromLocalFile(e){if(!(/^[.\/\\]/.test(e)||/^[A-Za-z]:[\\/]/.test(e)||e.endsWith(".kan.yml")||Qt(e)&&er(e).isFile()))return;let r=Hi(e);(!Qt(r)||!er(r).isFile())&&(console.error(`Local file not found: ${e}`),process.exit(1));let o=Mi(r,"utf-8"),i=this.parser.parse(o),a=i.metadata.namespace_;return(!a||!a.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:i,content:o,publisher:a.publisher,packageName:a.package_,version:nr(a.version)}}async deployFromDoc(e,t,r,o,i,a,s,c){let l=new C(t,this.repository),u=await this.objectParser.parseKanonaks(l),d=tr(e.managesTypeKey);d||(console.error(`Capability "${e.commandName}" has no resolved managesType.`),process.exit(1));let p=A(u,d);p.length===0&&(console.error(`${s} does not contain any ${L(d)} instances.`),process.exit(1));let k=p;if(a&&(k=p.filter(y=>y.name===a),k.length===0)){console.error(`Instance "${a}" not found in ${s}.`),console.error(""),console.error(`Available ${L(d)} instance(s):`);for(let y of p)console.error(` - ${y.name}`);console.error(""),console.error("To install all of them, drop the instance suffix:"),console.error(` kanonak ${e.commandName} add ${r}/${o}`),process.exit(1)}let b=a?`${a} from ${s}`:`${k.length} ${L(d)} instance(s) from ${s}`;console.log(`Installing ${b}...`);let g=this.handlerRegistry.get(e.deploymentTargetKey);g?await g.deploy({instances:k,allKanonaks:u,repository:this.repository,options:c}):console.log(`Cached ${r}/${o}@${i} (no deployment handler for "${e.deploymentTargetKey}")`)}async printPackageSuggestions(e,t,r){let o;try{o=await this.publisherIndex.listLatestPackages(e)}catch{return}let i=o.map(a=>({name:a.packageName,version:a.version,score:Gi(t,a.packageName)})).filter(a=>a.score>0).sort((a,s)=>s.score-a.score).slice(0,5);if(i.length!==0){console.error(""),console.error("Did you mean one of:");for(let a of i)console.error(` kanonak ${r} add ${e}/${a.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}),i=e.managesTypeKey||"managed";if(o.length===0){console.log(`No ${i} instances installed.`);return}console.log(`Installed ${i} instances:
|
|
165
165
|
`);for(let a of o){let s=a.publisher?`${a.publisher}/${a.package_}@${a.version}`:"unmanaged";console.log(` ${a.name} (${s}) ${a.path}`)}}async update(e,t,r){let i=await this.requireHandler(e).list({repository:this.repository,options:r}),a=t?i.filter(c=>c.name===t):i.filter(c=>c.publisher);if(a.length===0){console.log(t?`"${t}" not found.`:"No managed instances to update.");return}let s=0;for(let c of a){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.":`
|
|
166
|
-
Updated ${s} instance(s).`)}async search(e,t){let r=t.publisher??"kanonak.org",o=
|
|
167
|
-
`);let i=new
|
|
168
|
-
`);let b=new Map;for(let g of p){let y=`${g.publisher}/${g.package_}@${g.version}`,h=b.get(y);h?h.push(g):b.set(y,[g])}for(let[g,y]of b){let h=y[0],w=`${h.publisher}/${h.package_}`,$=y.length===1;console.log(` ${g}`),console.log(` ${y.length} skill${$?"":"s"}:`);for(let P of y)console.log(` - ${P.subject.name}`);if(console.log(""),$)console.log(" install:"),console.log(` kanonak ${e.commandName} add ${w}/${h.subject.name}`);else{console.log(" install one of them:");for(let P of y)console.log(` kanonak ${e.commandName} add ${w}/${P.subject.name}`);console.log(" install all of them:"),console.log(` kanonak ${e.commandName} add ${w}`)}console.log("")}}async info(e,t,r){let a=(await this.requireHandler(e).list({repository:this.repository,options:r})).find(s=>s.name===t);a||(console.error(`"${t}" is not installed.`),process.exit(1)),console.log(`Name: ${a.name}`),console.log(`Type: ${e.managesTypeKey||"n/a"}`),console.log(`Publisher: ${a.publisher||"unmanaged"}`),console.log(`Package: ${a.package_||"n/a"}`),console.log(`Version: ${a.version||"n/a"}`),console.log(`Path: ${a.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
|
|
169
|
-
`;function Be(n){let e=
|
|
170
|
-
`;function We(n){let e
|
|
166
|
+
Updated ${s} instance(s).`)}async search(e,t){let r=t.publisher??"kanonak.org",o=tr(e.managesTypeKey);if(!o){console.error("Capability has no resolved managesType; nothing to search for.");return}console.log(`Searching ${r} for ${L(o)} instances...
|
|
167
|
+
`);let i=new zi,a=await i.getConfig(r),s=i.resolveIndexUrl(r,a),c=await this.fetchFn(s,r);if(!c.ok){console.error(`Failed to fetch package index from ${r}.`);return}let l=await c.text(),u=bn.parseIndex(l);if(u.size===0){console.error(`No packages found for publisher "${r}".`);return}let d=new Map;for(let[g,y]of u){let h=[...y].sort((w,$)=>{let P=bn.parseVersion(w),K=bn.parseVersion($);return!P||!K?0:P.major!==K.major?K.major-P.major:P.minor!==K.minor?K.minor-P.minor:K.patch-P.patch});d.set(g,h[0])}let p=[],k=0;for(let[g,y]of d){let h=this.fileCache.get(r,g,y);if(!h)try{let w=await this.publisherIndex.getPackageUrl(r,g,y),$=await this.fetchFn(w,r);if(!$.ok)continue;h=await $.text(),this.fileCache.put(r,g,y,h)}catch{continue}try{let w=this.parser.parse(h),$=new C(w,this.repository),P=await this.objectParser.parseKanonaks($),K=A(P,o);for(let Q of K)p.push({publisher:r,package_:g,version:y,subject:Q});k++}catch{continue}}if(p.length===0){console.log(`No ${L(o)} instances found across ${k} package(s).`);return}console.log(`Found ${p.length} ${L(o)} instance(s) in ${k} package(s):
|
|
168
|
+
`);let b=new Map;for(let g of p){let y=`${g.publisher}/${g.package_}@${g.version}`,h=b.get(y);h?h.push(g):b.set(y,[g])}for(let[g,y]of b){let h=y[0],w=`${h.publisher}/${h.package_}`,$=y.length===1;console.log(` ${g}`),console.log(` ${y.length} skill${$?"":"s"}:`);for(let P of y)console.log(` - ${P.subject.name}`);if(console.log(""),$)console.log(" install:"),console.log(` kanonak ${e.commandName} add ${w}/${h.subject.name}`);else{console.log(" install one of them:");for(let P of y)console.log(` kanonak ${e.commandName} add ${w}/${P.subject.name}`);console.log(" install all of them:"),console.log(` kanonak ${e.commandName} add ${w}`)}console.log("")}}async info(e,t,r){let a=(await this.requireHandler(e).list({repository:this.repository,options:r})).find(s=>s.name===t);a||(console.error(`"${t}" is not installed.`),process.exit(1)),console.log(`Name: ${a.name}`),console.log(`Type: ${e.managesTypeKey||"n/a"}`),console.log(`Publisher: ${a.publisher||"unmanaged"}`),console.log(`Package: ${a.package_||"n/a"}`),console.log(`Version: ${a.version||"n/a"}`),console.log(`Path: ${a.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 tr(n){if(!n)return;let e=n.split("/");if(e.length===3)return{publisher:e[0],package_:e[1],name:e[2]}}function Gi(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)),i=new Set(r.split("-").filter(Boolean)),a=0;for(let c of o)i.has(c)&&a++;if(a>0)return a*10;let s=Xi(t,r);return s===0?100:s<=2?Math.max(1,20-s*5):0}function Xi(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 i=0;i<e.length;i++){let a=n[o]===e[i]?0:1;r[i+1]=Math.min(r[i]+1,t[i+1]+1,t[i]+a)}for(let i=0;i<=e.length;i++)t[i]=r[i]}return t[e.length]}var Fe=class{handlers=new Map;register(e,t){this.handlers.set(e,t)}get(e){return this.handlers.get(e)??null}};import{mkdirSync as is,rmSync as ss,existsSync as Me,readdirSync as cs,writeFileSync as ls}from"fs";import{join as He}from"path";import{KanonakObjectParser as us,KanonakParser as ds,computeIntegrity as fs}from"@kanonak-protocol/sdk";import{join as wn}from"path";import{homedir as rr}from"os";import{KanonakObjectParser as Ji}from"@kanonak-protocol/sdk";var X="kanonak.org",J="agent-skills",ar={publisher:X,package_:J,name:"Client"},ir={publisher:X,package_:J,name:"clientId"},Yi={publisher:X,package_:J,name:"projectSkillDir"},Zi={publisher:X,package_:J,name:"userSkillDir"},Qi={publisher:X,package_:J,name:"skillFileName"},sr="agents";async function $e(n,e){let t=(n.client??cr()??sr).toLowerCase(),r=n.scope??"project",o=await ur(t,e);if(!o){let s=await es(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 a=R(o,r==="user"?Zi:Yi);if(!a)throw new Error(`Client "${t}" has no ${r==="user"?"userSkillDir":"projectSkillDir"} declared.`);return ns(a)}async function Ve(n,e,t){let r=await $e(e,t);return wn(r,n)}async function $n(n,e){let t=(n.client??cr()??sr).toLowerCase(),r=await ur(t,e);return r?R(r,Qi)??"SKILL.md":"SKILL.md"}function cr(){if(process.env.CLAUDE_CODE||process.env.CLAUDE_PROJECT_DIR)return"claude-code"}var or=new WeakMap;async function lr(n){let e=or.get(n);if(e)return e;let t=await n.getDocumentsByNamespaceAsync(X,J);if(t.length===0)throw new Error(`Could not find ${X}/${J} 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 u=c.metadata.namespace_?.version,d=l.metadata.namespace_?.version;return!u||!d?0:u.major!==d.major?d.major-u.major:u.minor!==d.minor?d.minor-u.minor:d.patch-u.patch})[0],i=new Ji,a=new C(o,n),s=await i.parseKanonaks(a);return or.set(n,s),s}async function ur(n,e){let t=await lr(e),r=A(t,ar);for(let o of r)if(R(o,ir)===n)return o}async function es(n){let e=await lr(n),t=A(e,ar),r=[];for(let o of t){let i=R(o,ir);i&&r.push(i)}return r}function ns(n){return n.startsWith("~/")?wn(rr(),n.slice(2)):n==="~"?rr():n.startsWith("/")||/^[A-Za-z]:[\\/]/.test(n)?n:wn(process.cwd(),n)}import{readFileSync as ts,writeFileSync as rs,existsSync as os}from"fs";import{join as dr}from"path";import fr from"js-yaml";var mr="skills.lock",as=`# This file is generated by Kanonak CLI. Do not edit manually.
|
|
169
|
+
`;function Be(n){let e=dr(n,mr);if(!os(e))return{version:"1",lastUpdated:new Date().toISOString(),skills:{}};let t=ts(e,"utf-8"),r=fr.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 Sn(n,e){e.lastUpdated=new Date().toISOString();let t={};for(let i of Object.keys(e.skills).sort())t[i]=e.skills[i];e.skills=t;let r=dr(n,mr),o=fr.dump(e,{lineWidth:-1,sortKeys:!1,quotingType:'"'});rs(r,as+o,"utf-8")}var pr="kanonak.org",gr="skill-to-skill-md",qe=class{parser=new ds;objectParser=new us;runner=new W;async deploy(e){let{instances:t,allKanonaks:r,repository:o,options:i}=e;if(t.length===0){console.error("No Skill instances to deploy.");return}let a=await ms(o,this.objectParser);if(!a){console.error(`Cannot deploy: ${pr}/${gr}@3.0.0 is not installed in the workspace or cache.`);return}let s=await this.runner.run({transformation:a,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 $e(i,o),l=await $n(i,o),u=Be(c),d=t[0].namespace,{publisher:p,package_:k,version:b}=ps(d);for(let g of s){let y=await Ve(g.fileName,i,o),h=Me(He(y,l));is(y,{recursive:!0}),ls(He(y,l),g.content,"utf-8"),u.skills[g.fileName]={publisher:p,package_:k,version:b,resolved:p?`kanonak://${p}/${k}@${b}`:"",integrity:fs(g.content)},console.log(` ${h?"Updated":"Installed"} skill "${g.fileName}" \u2192 ${y}`)}Sn(c,u)}async undeploy(e,t){let{repository:r,options:o}=t,i=await Ve(e,o,r);Me(i)||(console.error(`Skill "${e}" is not installed at ${i}`),process.exit(1)),ss(i,{recursive:!0,force:!0});let a=await $e(o,r),s=Be(a);delete s.skills[e],Sn(a,s),console.log(`Removed skill "${e}" from ${i}`)}async list(e){let{repository:t,options:r}=e,o=await $e(r,t),i=Be(o),a=[];for(let[c,l]of Object.entries(i.skills))a.push({name:c,publisher:l.publisher,package_:l.package_,version:l.version,path:await Ve(c,r,t)});let s=await $n(r,t);if(Me(o))try{let c=cs(o,{withFileTypes:!0});for(let l of c){if(!l.isDirectory()||i.skills[l.name])continue;let u=He(o,l.name,s);Me(u)&&a.push({name:l.name,publisher:"",package_:"",version:"",path:He(o,l.name)})}}catch{}return a}};async function ms(n,e){let t=await n.getDocumentsByNamespaceAsync(pr,gr);if(t.length===0)return;let r=new C(t[0],n),o=await e.parseKanonaks(r);return A(o,f.InstanceTransformation)[0]}function ps(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 Es,rmSync as As,existsSync as Pn,readdirSync as Rs,writeFileSync as Is,statSync as _s}from"fs";import{join as Ge}from"path";import{KanonakObjectParser as Ts,KanonakParser as js,computeIntegrity as xs}from"@kanonak-protocol/sdk";import{join as kr}from"path";import{homedir as yr}from"os";import{KanonakObjectParser as gs}from"@kanonak-protocol/sdk";var Y="kanonak.org",Z="agent-skills",br={publisher:Y,package_:Z,name:"Client"},wr={publisher:Y,package_:Z,name:"clientId"},ks={publisher:Y,package_:Z,name:"projectAgentDir"},ys={publisher:Y,package_:Z,name:"userAgentDir"},hs={publisher:Y,package_:Z,name:"agentFileFormat"},bs="agents";function ws(){if(process.env.CLAUDE_CODE||process.env.CLAUDE_PROJECT_DIR)return"claude-code"}async function ze(n,e){let t=(n.client??ws()??bs).toLowerCase(),r=n.scope??"project",o=await $s(t,e);if(!o){let u=await Ss(e);throw new Error(`Unknown client "${t}". Known clients: ${u.join(", ")||"(none)"}. Add a Client instance to a package that imports kanonak.org/agent-skills and install that package to make it available.`)}let a=R(o,r==="user"?ys:ks);if(!a)throw new Error(`Client "${t}" has no ${r==="user"?"userAgentDir":"projectAgentDir"} declared.`);let c=ae(o,hs)?.name==="toml"?"toml":"markdown-frontmatter",l=c==="toml"?".toml":".md";return{agentsDir:vs(a),format:c,fileExtension:l}}var hr=new WeakMap;async function $r(n){let e=hr.get(n);if(e)return e;let t=await n.getDocumentsByNamespaceAsync(Y,Z);if(t.length===0)throw new Error(`Could not find ${Y}/${Z} in the repository. Install a capability that imports agent-skills to populate the cache.`);let o=[...t].sort((c,l)=>{let u=c.metadata.namespace_?.version,d=l.metadata.namespace_?.version;return!u||!d?0:u.major!==d.major?d.major-u.major:u.minor!==d.minor?d.minor-u.minor:d.patch-u.patch})[0],i=new gs,a=new C(o,n),s=await i.parseKanonaks(a);return hr.set(n,s),s}async function $s(n,e){let t=await $r(e),r=A(t,br);for(let o of r)if(R(o,wr)===n)return o}async function Ss(n){let e=await $r(n),t=A(e,br),r=[];for(let o of t){let i=R(o,wr);i&&r.push(i)}return r}function vs(n){return n.startsWith("~/")?kr(yr(),n.slice(2)):n==="~"?yr():n.startsWith("/")||/^[A-Za-z]:[\\/]/.test(n)?n:kr(process.cwd(),n)}import{readFileSync as Ps,writeFileSync as Ks,existsSync as Ds}from"fs";import{join as Sr}from"path";import vr from"js-yaml";var Pr="agents.lock",Cs=`# This file is generated by Kanonak CLI. Do not edit manually.
|
|
170
|
+
`;function We(n){let e=Sr(n,Pr);if(!Ds(e))return{version:"1",lastUpdated:new Date().toISOString(),agents:{}};let t=Ps(e,"utf-8"),r=vr.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 vn(n,e){e.lastUpdated=new Date().toISOString();let t={};for(let i of Object.keys(e.agents).sort())t[i]=e.agents[i];e.agents=t;let r=Sr(n,Pr),o=vr.dump(e,{lineWidth:-1,sortKeys:!1,quotingType:'"'});Ks(r,Cs+o,"utf-8")}var Kr="kanonak.org",Dr="agent-to-agent-file",Xe=class{parser=new js;objectParser=new Ts;runner=new W;async deploy(e){let{instances:t,allKanonaks:r,repository:o,options:i}=e;if(t.length===0){console.error("No Agent instances to deploy.");return}let{agentsDir:a,format:s,fileExtension:c}=await ze(i,o),l=await Us(o,this.objectParser);if(!l){console.error(`Cannot deploy: ${Kr}/${Dr}@3.0.0 is not installed in the workspace or cache.`);return}let u=s==="toml"?"toml":"markdown-with-frontmatter",d=await this.runner.run({transformation:l,instances:t,allKanonaks:r,repository:o,parser:this.parser,objectParser:this.objectParser,outputFormat:u});if(d.length===0){console.error("No agents could be transformed from the package.");return}Es(a,{recursive:!0});let p=We(a),k=t[0].namespace,{publisher:b,package_:g,version:y}=Ls(k);for(let h of d){let w=`${h.fileName}${c}`,$=Ge(a,w),P=Pn($);Is($,h.content,"utf-8"),p.agents[h.fileName]={publisher:b,package_:g,version:y,resolved:b?`kanonak://${b}/${g}@${y}`:"",integrity:xs(h.content),fileName:w},console.log(` ${P?"Updated":"Installed"} agent "${h.fileName}" \u2192 ${$}`)}vn(a,p)}async undeploy(e,t){let{repository:r,options:o}=t,{agentsDir:i}=await ze(o,r),a=We(i),s=a.agents[e];s||(console.error(`Agent "${e}" is not installed at ${i}`),process.exit(1));let c=Ge(i,s.fileName);Pn(c)&&As(c,{force:!0}),delete a.agents[e],vn(i,a),console.log(`Removed agent "${e}" from ${c}`)}async list(e){let{repository:t,options:r}=e,{agentsDir:o}=await ze(r,t),i=We(o),a=[];for(let[s,c]of Object.entries(i.agents))a.push({name:s,publisher:c.publisher,package_:c.package_,version:c.version,path:Ge(o,c.fileName)});if(Pn(o))try{let s=Rs(o,{withFileTypes:!0});for(let c of s){if(!c.isFile()||c.name==="agents.lock")continue;let l=Ge(o,c.name),u=Os(c.name);if(!i.agents[u]){try{if(!_s(l).isFile())continue}catch{continue}a.push({name:u,publisher:"",package_:"",version:"",path:l})}}}catch{}return a}};async function Us(n,e){let t=await n.getDocumentsByNamespaceAsync(Kr,Dr);if(t.length===0)return;let r=new C(t[0],n),o=await e.parseKanonaks(r);return A(o,f.InstanceTransformation)[0]}function Os(n){let e=n.lastIndexOf(".");return e===-1?n:n.substring(0,e)}function Ls(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 Gs=Bs(Vs(import.meta.url)),Xs=JSON.parse(Fs(Ms(Gs,"..","package.json"),"utf-8")),F=new Ns;F.name("kanonak").description("Kanonak Protocol CLI - Validate and resolve Kanonak ontology packages").version(Xs.version);F.command("validate <path>").description("Validate .kan.yml file(s). Resolves imports via HTTP from publisher domains.").action(async n=>{await An(n)});F.command("install [package]").description("Install a package and its dependencies, or install all from kanonak.lock.").action(async n=>{await Rn(n)});F.command("deps <path>").description("Show resolved dependency tree for a .kan.yml file.").action(async n=>{await _n(n)});F.command("login <publisher>").description("Authenticate with a package publisher using OAuth 2.0.").action(async n=>{await On(n)});F.command("logout <publisher>").description("Revoke tokens and remove stored credentials for a publisher.").action(async n=>{await Ln(n)});F.addCommand(Qn());F.addCommand(Ht());F.addCommand(Jt());async function Js(){try{let n=new U,e=new Hs,t=new zs,r=Ws(t),o=new qs({fetchFn:r}),i=await O(process.cwd(),e),a=new Fe;a.register("kanonak.org/capabilities/agent-skill-deployment",new qe),a.register("kanonak.org/agent-capabilities/agent-instance-deployment",new Xe);let s=await Jn(n,e,i),c=new Ne(n,e,o,r,a,i);Zt(F,s,c)}catch{}}await Js();F.parse();
|
|
@@ -70,7 +70,7 @@ export interface CompiledFormatOverrideV3 {
|
|
|
70
70
|
metadataRenames: Map<string, string>;
|
|
71
71
|
trailingNewline?: boolean;
|
|
72
72
|
}
|
|
73
|
-
export type CompiledExpressionV3 = CompiledStringLiteralV3 | CompiledIntegerLiteralV3 | CompiledDecimalLiteralV3 | CompiledBooleanLiteralV3 | CompiledVarRefV3 | CompiledPropertyReadV3 | CompiledTraverseV3 | CompiledBuildAstNodeV3 | CompiledWhenV3 | CompiledConcatV3 | CompiledFallbackV3 | CompiledUriNameV3 | CompiledUriLiteralV3 | CompiledDisplayLabelV3 | CompiledResolveRefV3 | CompiledNormalizeV3 | CompiledIsSetV3 | CompiledCallFragmentV3 | CompiledJoinV3 | CompiledCountV3 | CompiledSumV3 | CompiledMinV3 | CompiledMaxV3 | CompiledAverageV3 | CompiledForEachV3 | CompiledListMapV3 | CompiledFilterV3 | CompiledPartitionByV3 | CompiledDistinctByV3;
|
|
73
|
+
export type CompiledExpressionV3 = CompiledStringLiteralV3 | CompiledIntegerLiteralV3 | CompiledDecimalLiteralV3 | CompiledBooleanLiteralV3 | CompiledVarRefV3 | CompiledPropertyReadV3 | CompiledTraverseV3 | CompiledBuildAstNodeV3 | CompiledWhenV3 | CompiledConcatV3 | CompiledFallbackV3 | CompiledUriNameV3 | CompiledSubjectUriV3 | CompiledUriLiteralV3 | CompiledDisplayLabelV3 | CompiledResolveRefV3 | CompiledNormalizeV3 | CompiledIsSetV3 | CompiledCallFragmentV3 | CompiledJoinV3 | CompiledCountV3 | CompiledSumV3 | CompiledMinV3 | CompiledMaxV3 | CompiledAverageV3 | CompiledForEachV3 | CompiledListMapV3 | CompiledFilterV3 | CompiledPartitionByV3 | CompiledDistinctByV3;
|
|
74
74
|
export interface CompiledStringLiteralV3 {
|
|
75
75
|
kind: 'string-literal';
|
|
76
76
|
value: string;
|
|
@@ -130,6 +130,10 @@ export interface CompiledUriNameV3 {
|
|
|
130
130
|
kind: 'uri-name';
|
|
131
131
|
source: CompiledExpressionV3;
|
|
132
132
|
}
|
|
133
|
+
export interface CompiledSubjectUriV3 {
|
|
134
|
+
kind: 'subject-uri';
|
|
135
|
+
source: CompiledExpressionV3;
|
|
136
|
+
}
|
|
133
137
|
export interface CompiledUriLiteralV3 {
|
|
134
138
|
kind: 'uri-literal';
|
|
135
139
|
refTo: EntityUri;
|
|
@@ -88,6 +88,8 @@ export declare const TX_V3: {
|
|
|
88
88
|
readonly step: EntityUri;
|
|
89
89
|
readonly UriName: EntityUri;
|
|
90
90
|
readonly uriNameOf: EntityUri;
|
|
91
|
+
readonly SubjectUri: EntityUri;
|
|
92
|
+
readonly subjectOf: EntityUri;
|
|
91
93
|
readonly UriLiteral: EntityUri;
|
|
92
94
|
readonly refTo: EntityUri;
|
|
93
95
|
readonly DisplayLabel: EntityUri;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kanonak-protocol/cli",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1.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.1.0",
|
|
38
|
+
"@kanonak-protocol/types": "^3.1.0",
|
|
39
39
|
"commander": "^13.0.0",
|
|
40
40
|
"js-yaml": "^4.1.1"
|
|
41
41
|
},
|