ec.fdk 0.9.5 → 0.9.7

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/README.md CHANGED
@@ -222,6 +222,7 @@ ec.fdk <command> [options]
222
222
  | `logout` | Logout and remove stored token | — |
223
223
  | `whoami` | Show current logged-in user | — |
224
224
  | `install-skill` | Install Claude Code skill | — (optional `--dir <path>`) |
225
+ | `update` | Self-update ec.fdk | — |
225
226
  | `resourceList` | List any resource type | `--resource`, `-f` for query params |
226
227
  | `resourceGet` | Get a single resource | `--resource`, `-f` for identifying params |
227
228
  | `resourceEdit` | Edit a single resource | `--resource`, `-f` for identifying params, `--data` |
@@ -311,6 +312,9 @@ ec.fdk install-skill
311
312
  # Install to custom directory
312
313
  ec.fdk install-skill --dir ~/entrecode/.claude
313
314
 
315
+ # Self-update ec.fdk
316
+ ec.fdk update
317
+
314
318
  # List datamanagers
315
319
  ec.fdk dmList -e stage
316
320
 
package/dist/cli.cjs CHANGED
@@ -1,19 +1,20 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var he=Object.create;var H=Object.defineProperty;var pe=Object.getOwnPropertyDescriptor;var ye=Object.getOwnPropertyNames;var ke=Object.getPrototypeOf,we=Object.prototype.hasOwnProperty;var De=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ye(t))!we.call(e,o)&&o!==n&&H(e,o,{get:()=>t[o],enumerable:!(r=pe(t,o))||r.enumerable});return e};var U=(e,t,n)=>(n=e!=null?he(ke(e)):{},De(t||!e||!e.__esModule?H(n,"default",{value:e,enumerable:!0}):n,e));const Te=require("node:util"),be=require("node:module"),E=require("node:fs"),ee=require("node:path"),$e=require("node:os"),Ee=require("node:readline"),B=require("node:crypto"),ve=require("node:http"),Ie=require("node:child_process");async function l(e,t={},n={}){const{token:r,rawRes:o}=t;r&&(n.headers={...n.headers||{},Authorization:`Bearer ${r}`});const a=await fetch(e,n);if(!a.ok){if(a.headers.get("content-type")?.includes("application/json")){const s=await a.json(),c=`${s.title}
3
- ${s.detail}
4
- ${s.verbose}`;throw new Error(c)}throw new Error(`unexpected fetch error: ${a.statusText}`)}if(o)return a;if(a.status===204)return;const i=await a.text();return i?JSON.parse(i):void 0}const q={datamanager:{live:"https://datamanager.entrecode.de/",stage:"https://datamanager.cachena.entrecode.de/"},accounts:{live:"https://accounts.entrecode.de/",stage:"https://accounts.cachena.entrecode.de/"},appserver:{live:"https://appserver.entrecode.de/",stage:"https://appserver.cachena.entrecode.de/"},"dm-history":{live:"https://dm-history.entrecode.de/",stage:"https://dm-history.cachena.entrecode.de/"}};function g(e,t="stage",n="datamanager"){const r=q[n];if(!r)throw new Error(`subdomain "${n}" not found. Try one of ${Object.keys(q).join(", ")}`);const o=r[t];if(!o)throw new Error(`env "${t}" not found. Try one of ${Object.keys(r[t]).join(", ")}`);return o+e}function h(e,t=!0){return Object.entries(e).sort((n,r)=>n[0].localeCompare(r[0])).map(([n,r])=>`${n}=${r}`).join("&")}function d(e){Object.entries(e).forEach(([t,n])=>{if(n===void 0)throw new Error(`expected ${t} to be set!`)})}const te={stage:"https://accounts.cachena.entrecode.de/",live:"https://accounts.entrecode.de/"};async function Ae(e){let{env:t,dmShortID:n,email:r,password:o}=e;d({env:t,dmShortID:n,email:r,password:o});const a=g(`api/${n}/_auth/login?clientID=rest`,t);return await l(a,{},{method:"POST",body:JSON.stringify({email:r,password:o}),headers:{"Content-Type":"application/json"}})}async function Se(e){let{env:t,email:n,password:r}=e;d({env:t,email:n,password:r});const o=`${te[t]}auth/login?clientID=rest`;return await l(o,{},{method:"POST",body:JSON.stringify({email:n,password:r}),headers:{"Content-Type":"application/json"}})}async function _e(e){let{dmShortID:t,env:n,token:r}=e;d({dmShortID:t,env:n,token:r});const o=g(`api/${t}/_auth/logout?clientID=rest&token=${r}`,n);return await l(o,{rawRes:!0},{method:"POST"})}async function qe(e){let{env:t,token:n}=e;d({env:t,token:n});const r=`${te[t]}auth/logout?clientID=rest`;return await l(r,{rawRes:!0,token:n},{method:"POST"})}function Oe({dmShortID:e}){return d({dmShortID:e}),e}function Ce({env:e}){return d({env:e}),e}let Ue=["created","creator","id","modified","private","_created","_creator","_embedded","_entryTitle","_id","_links","_modelTitle","_modelTitleField","_modified"];function ne(e){let t={};for(let n in e)Ue.includes(n)||(t[n]=e[n]);return t}function Le(e){return JSON.parse(JSON.stringify(e))}async function Me(e){let{env:t,dmShortID:n}=e;d({env:t,dmShortID:n});const r=g(`api/${n}`,t);return l(r,e)}async function re(e){let{env:t,dmShortID:n,model:r,options:o={}}=e;d({env:t,dmShortID:n,model:r}),o={size:50,page:1,_list:!0,...o};const a=h(o),i=g(`api/${n}/${r}?${a}`,t),{count:s,total:c,_embedded:u}=await l(i,e);let m=u?u[`${n}:${r}`]:[];return m=Array.isArray(m)?m:[m],{count:s,total:c,items:m}}function Re({env:e,dmShortID:t,model:n,entryID:r,token:o}){d({env:e,dmShortID:t,model:n,entryID:r});const a=h({_id:r}),i=g(`api/${t}/${n}?${a}`,e);return l(i,{token:o})}async function Pe({env:e,dmShortID:t,model:n,value:r,token:o}){d({env:e,dmShortID:t,model:n,value:r});const a=g(`api/${t}/${n}`,e);return await l(a,{token:o},{method:"POST",body:JSON.stringify(r),headers:{"Content-Type":"application/json"}})}async function oe({env:e,dmShortID:t,model:n,entryID:r,value:o,token:a,safePut:i=!1}){d({env:e,dmShortID:t,model:n,entryID:r,value:o});const s={"Content-Type":"application/json"};if(i){if(!("_modified"in o))throw new Error("expected _modified to be set!");s["If-Unmodified-Since"]=new Date(o._modified).toUTCString()}const c=g(`api/${t}/${n}?_id=${r}`,e);return o=Le(o),o=ne(o),await l(c,{token:a},{method:"PUT",headers:s,body:JSON.stringify(o)})}function ae({env:e,dmShortID:t,model:n,entryID:r,token:o}){d({env:e,dmShortID:t,model:n,entryID:r});const a=g(`api/${t}/${n}?_id=${r}`,e);return l(a,{token:o,rawRes:!0},{method:"DELETE",headers:{"Content-Type":"application/json"}})}async function Be(e,t){let{env:n,dmShortID:r,model:o,options:a={}}=e;d({env:n,dmShortID:r,model:o}),e.options={size:50,page:1,_list:!0,...a};let i=0,s,c=[];for(;s===void 0||i<s;){const u=await re(e);for(let m of u.items)c.push(await t(m));i+=u.items.length,s=u.total,e.options.page++}return c}async function Ge({env:e,dmShortID:t,model:n,withMetadata:r}){d({env:e,dmShortID:t,model:n});const o=g(`api/schema/${t}/${n}`,e),a=await l(o),i=a?.allOf?.[1];if(typeof i.properties!="object")throw new Error(`getSchema: ${o} returned unexpected format: ${JSON.stringify(a)}`);const{properties:s}=i,c=ne(s);for(let u in c){let m=c[u];if(m.required=i.required.includes(u),c[u]?.oneOf&&delete c[u]?.oneOf,m.title?.includes("<")&&m.title?.includes(">")){const y=m.title.split("<")[1].slice(0,-1),w=m.title.split("<")[0];m.type=w,y.includes(":")?m.resource=y.split(":")[1]:m.resource=y}else["asset","entry","assets","entries"].includes(m.title)?(m.type=m.title,m.resource=null):m.type=m.title;delete c[u].title}if(r){const u=s._modelTitle.title,m=s._modelTitleField.title;return{properties:c,meta:{modelTitleField:m,modelTitle:u}}}return c}function se(e){return Object.entries(e).map(([t,n])=>typeof n!="object"?{[t]:String(n)}:{...n.sort&&{sort:Array.isArray(n)?n.join(","):n},...n.search&&{[t+"~"]:n.search},...n.notNull&&{[t+"!"]:""},...n.null&&{[t]:""},...n.any&&{[t]:n.any.join(",")},...n.from&&{[t+"From"]:n.from},...n.to&&{[t+"To"]:n.to}}).reduce((t,n)=>({...t,...n}),{})}const Ne=se;function G(e){return e._links.collection.href.split("/").slice(-2)[0]}function ie(e){const t=e._links.collection.href.split("api/")[0];return Object.keys(q.datamanager).find(r=>q.datamanager[r]===t)}const ce=e=>{const t=G(e),n=ie(e),r=e._modelTitle,o=e.id;return{dmShortID:t,env:n,model:r,entryID:o}},xe=e=>ae(ce(e)),je=(e,t)=>oe({...ce(e),value:t});function Je(e,t){const n=G(t);return t._embedded[`${n}:${t._modelTitle}/${e}/asset`]}async function Fe({env:e,dmShortID:t,assetGroup:n,assetID:r,token:o}){d({env:e,dmShortID:t,assetGroup:n,assetID:r});const a=h({assetID:r}),i=g(`a/${t}/${n}?${a}`,e),{_embedded:s}=await l(i,{token:o});return s?s["ec:dm-asset"]:void 0}async function He(e){let{env:t,dmShortID:n,assetGroup:r,token:o,options:a={}}=e;d({env:t,dmShortID:n,assetGroup:r}),a={size:50,page:1,_list:!0,...a};const i=h(a),s=g(`a/${n}/${r}?${i}`,t),{count:c,total:u,_embedded:m}=await l(s,{token:o});let y=m?m["ec:dm-asset"]:[];return y=Array.isArray(y)?y:[y],{count:c,total:u,items:y}}async function ze({env:e,dmShortID:t,assetGroup:n,token:r,file:o,name:a,options:i}){d({env:e,dmShortID:t,assetGroup:n,file:o});const s=g(`a/${t}/${n}`,e),c=new FormData;return c.append("file",o,a),i&&Object.keys(i).forEach(m=>{c.append(m,i[m])}),(await l(s,{token:r},{method:"POST",body:c}))._embedded["ec:dm-asset"]}async function Ke({env:e,dmShortID:t,assetGroup:n,files:r,options:o}){d({env:e,dmShortID:t,assetGroup:n,files:r});const a=g(`a/${t}/${n}`,e),i=new FormData;r.forEach(c=>{i.append("file",c)}),o&&Object.keys(o).forEach(c=>{i.append(c,o[c])});const s=await l(a,{},{method:"POST",body:i});return Array.isArray(s._embedded["ec:dm-asset"])?s._embedded["ec:dm-asset"]:[s._embedded["ec:dm-asset"]]}async function Ve({env:e,dmShortID:t,assetGroup:n,assetID:r,token:o}){d({env:e,dmShortID:t,assetGroup:n,assetID:r});const a=g(`a/${t}/${n}/${r}`,e);await l(a,{token:o,rawRes:!0},{method:"DELETE"})}function Ye(e,t,n=!1){let r,o;return(n?e?.thumbnails:e?.fileVariants)?.forEach(i=>{const{resolution:{width:s,height:c}}=i,u=Math.abs(Math.max(s,c)-t);(!o||u<o)&&(o=u,r=i)}),r?.url??e?.file?.url??null}function We(e="stage",t,n,r,o=!1){const a=Math.max(r.file.resolution.width,r.file.resolution.height),i=n.filter(c=>c<a),s=`https://datamanager${e==="stage"?".cachena":""}.entrecode.de`;return o?i.map(c=>{const u=r.thumbnails.find(w=>c===w.dimension),m=`${s}/t/${t}/${r.assetID}/${c}`,y=u?u.url:m;return{size:c,url:y,generated:u}}):i.map(c=>{const u=r.fileVariants.find(w=>c===Math.max(w.resolution.width,w.resolution.height)),m=`${s}/f/${t}/${r.assetID}/${c}`,y=u?u.url:m;return{size:c,url:y,generated:u}})}const p={"Content-Type":"application/json"};async function Xe(e){let{env:t,dmID:n,token:r}=e;d({env:t,dmID:n});const o=g(`?dataManagerID=${n}`,t);return l(o,{token:r})}async function Qe(e){let{env:t,options:n={}}=e;d({env:t}),n={size:25,page:1,_list:!0,...n};const r=h(n),o=g(`?${r}`,t),{count:a,total:i,_embedded:s}=await l(o,e);let c=s?s["ec:datamanager"]:[];return c=Array.isArray(c)?c:[c],{count:a,total:i,items:c}}async function Ze(e){let{env:t,dmID:n,options:r={}}=e;d({env:t,dmID:n}),r={size:25,dataManagerID:n,page:1,_list:!0,...r};const o=h(r),a=g(`model?${o}`,t),{count:i,total:s,_embedded:c}=await l(a,e);let u=c?c["ec:model"]:[];return u=Array.isArray(u)?u:[u],{count:i,total:s,items:u}}async function et(e){let{env:t,resource:n,options:r={},subdomain:o="datamanager"}=e;d({env:t,subdomain:o,resource:n}),r={size:25,page:1,_list:!0,...r};const a=h(r),i=g(`${n}?${a}`,t,o),{count:s,total:c,_embedded:u}=await l(i,e);let m=u?u[Object.keys(u)[0]]:[];return m=Array.isArray(m)?m:[m],{count:s,total:c,items:m}}async function tt(e){let{env:t,resource:n,options:r={},subdomain:o="datamanager"}=e;d({env:t,subdomain:o,resource:n});const a=h(r),i=g(`${n}?${a}`,t,o);return l(i,e)}async function nt(e){let{env:t,resource:n,options:r={},subdomain:o="datamanager",value:a}=e;d({env:t,subdomain:o,resource:n,value:a});const i=h(r),s=g(`${n}?${i}`,t,o);return l(s,e,{method:"PUT",body:JSON.stringify(a),headers:p})}async function rt(e){let{env:t,resource:n,options:r={},subdomain:o="datamanager"}=e;d({env:t,subdomain:o,resource:n});const a=h(r),i=g(`${n}?${a}`,t,o);return l(i,{...e,rawRes:!0},{method:"DELETE",headers:p})}async function ot(e,t={}){let{env:n,route:r,options:o={},subdomain:a="datamanager"}=e;d({env:n,subdomain:a,route:r}),o={...o};const i=h(o),s=g(`${r}?${i}`,n,a);return l(s,e,t)}async function at(e){let{env:t,token:n,value:r}=e;d({env:t,value:r});const o=g("",t);return l(o,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function st(e){let{env:t,token:n,dmID:r,value:o}=e;d({env:t,dmID:r,value:o});const a=h({dataManagerID:r}),i=g(`?${a}`,t);return l(i,{token:n},{method:"PUT",body:JSON.stringify(o),headers:p})}async function it(e){let{env:t,token:n,dmID:r}=e;d({env:t,dmID:r});const o=h({dataManagerID:r}),a=g(`?${o}`,t);return l(a,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function ct(e){let{env:t,token:n,dmID:r,value:o}=e;d({env:t,dmID:r,value:o});const a=h({dataManagerID:r}),i=g(`model?${a}`,t);return l(i,{token:n},{method:"POST",body:JSON.stringify(o),headers:p})}async function dt(e){let{env:t,token:n,dmID:r,modelID:o,value:a}=e;d({env:t,dmID:r,modelID:o,value:a});const i=h({dataManagerID:r,modelID:o}),s=g(`model?${i}`,t);return l(s,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function ut(e){let{env:t,token:n,dmID:r,modelID:o}=e;d({env:t,dmID:r,modelID:o});const a=h({dataManagerID:r,modelID:o}),i=g(`model?${a}`,t);return l(i,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function lt(e){let{env:t,token:n,value:r}=e;d({env:t,value:r});const o=g("template",t);return l(o,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function ft(e){let{env:t,token:n,dmID:r,value:o}=e;d({env:t,dmID:r,value:o});const a=h({dataManagerID:r}),i=g(`assetgroup?${a}`,t);return l(i,{token:n},{method:"POST",body:JSON.stringify(o),headers:p})}async function gt(e){let{env:t,token:n,dmID:r,assetGroupID:o,value:a}=e;d({env:t,dmID:r,assetGroupID:o,value:a});const i=h({dataManagerID:r,assetGroupID:o}),s=g(`assetgroup?${i}`,t);return l(s,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function mt(e){let{env:t,token:n,dmShortID:r,assetGroup:o,assetID:a,value:i}=e;d({env:t,dmShortID:r,assetGroup:o,assetID:a,value:i});const s=g(`a/${r}/${o}/${a}`,t);return l(s,{token:n},{method:"PUT",body:JSON.stringify(i),headers:p})}async function ht(e){let{env:t,token:n,dmID:r,clientID:o,value:a}=e;d({env:t,dmID:r,clientID:o,value:a});const i=h({dataManagerID:r,clientID:o}),s=g(`client?${i}`,t);return l(s,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function pt(e){let{env:t,token:n,dmID:r,value:o}=e;d({env:t,dmID:r,value:o});const a=h({dataManagerID:r}),i=g(`role?${a}`,t);return l(i,{token:n},{method:"POST",body:JSON.stringify(o),headers:p})}async function yt(e){let{env:t,token:n,dmID:r,roleID:o,value:a}=e;d({env:t,dmID:r,roleID:o,value:a});const i=h({dataManagerID:r,roleID:o}),s=g(`role?${i}`,t);return l(s,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function kt(e){let{env:t,token:n,dmID:r,roleID:o}=e;d({env:t,dmID:r,roleID:o});const a=h({dataManagerID:r,roleID:o}),i=g(`role?${a}`,t);return l(i,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function wt(e){let{env:t,token:n,dmID:r,accountID:o,value:a}=e;d({env:t,dmID:r,accountID:o,value:a});const i=h({dataManagerID:r,accountID:o}),s=g(`account?${i}`,t);return l(s,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function Dt(e){let{env:t,token:n,dmID:r,accountID:o}=e;d({env:t,dmID:r,accountID:o});const a=h({dataManagerID:r,accountID:o}),i=g(`account?${a}`,t);return l(i,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function Tt(e){let{env:t,token:n,options:r={}}=e;d({env:t});const o=h(r),a=g(`stats?${o}`,t);return l(a,{token:n})}async function bt(e){let{env:t,token:n,options:r={}}=e;d({env:t});const o=h(r),a=g(`entries?${o}`,t,"dm-history");return l(a,{token:n})}async function $t(e){let{env:t,token:n,value:r}=e;d({env:t,value:r});const o=g("client",t,"accounts");return l(o,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function Et(e){let{env:t,token:n,clientID:r,value:o}=e;d({env:t,clientID:r,value:o});const a=h({clientID:r}),i=g(`client?${a}`,t,"accounts");return l(i,{token:n},{method:"PUT",body:JSON.stringify(o),headers:p})}async function vt(e){let{env:t,token:n,clientID:r}=e;d({env:t,clientID:r});const o=h({clientID:r}),a=g(`client?${o}`,t,"accounts");return l(a,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function It(e){let{env:t,token:n,value:r}=e;d({env:t,value:r});const o=g("group",t,"accounts");return l(o,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function At(e){let{env:t,token:n,groupID:r,value:o}=e;d({env:t,groupID:r,value:o});const a=h({groupID:r}),i=g(`group?${a}`,t,"accounts");return l(i,{token:n},{method:"PUT",body:JSON.stringify(o),headers:p})}async function St(e){let{env:t,token:n,groupID:r}=e;d({env:t,groupID:r});const o=h({groupID:r}),a=g(`group?${o}`,t,"accounts");return l(a,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function _t(e){let{env:t,token:n,value:r}=e;d({env:t,value:r});const o=g("invite",t,"accounts"),a=await l(o,{token:n},{method:"POST",body:JSON.stringify(r),headers:p});return a?._embedded?.["ec:invite"]??a}async function qt(e){let{env:t,token:n,inviteID:r,value:o}=e;d({env:t,inviteID:r,value:o});const a=h({invite:r}),i=g(`invite?${a}`,t,"accounts");return l(i,{token:n},{method:"PUT",body:JSON.stringify(o),headers:p})}async function Ot(e){let{env:t,token:n,inviteID:r}=e;d({env:t,inviteID:r});const o=h({invite:r}),a=g(`invite?${o}`,t,"accounts");return l(a,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function Ct(e){let{env:t,token:n,accountID:r,value:o}=e;d({env:t,accountID:r,value:o});const a=h({accountID:r}),i=g(`account?${a}`,t,"accounts");return l(i,{token:n},{method:"PUT",body:JSON.stringify(o),headers:p})}async function Ut(e){let{env:t,token:n,accountID:r}=e;d({env:t,accountID:r});const o=h({accountID:r}),a=g(`account/tokens?${o}`,t,"accounts");let s=(await l(a,{token:n}))?._embedded?.["ec:account/token"]??[];return Array.isArray(s)?s:[s]}async function Lt(e){let{env:t,token:n,accountID:r}=e;d({env:t,accountID:r});const o=h({accountID:r}),a=g(`account/tokens?${o}`,t,"accounts");return l(a,{token:n},{method:"POST",headers:p})}async function Mt(e){let{env:t,token:n,accountID:r,accessTokenID:o}=e;d({env:t,accountID:r,accessTokenID:o});const a=h({accessTokenID:o,accountID:r}),i=g(`account/tokens?${a}`,t,"accounts");return l(i,{token:n,rawRes:!0},{method:"DELETE",headers:p})}const Rt=Object.freeze(Object.defineProperty({__proto__:null,assetList:He,createAccountClient:$t,createAsset:ze,createAssetGroup:ft,createAssets:Ke,createDatamanager:at,createEntry:Pe,createGroup:It,createInvite:_t,createModel:ct,createRole:pt,createTemplate:lt,createToken:Lt,deleteAccountClient:vt,deleteAsset:Ve,deleteDatamanager:it,deleteDmAccount:Dt,deleteEntry:ae,deleteEntryObject:xe,deleteGroup:St,deleteInvite:Ot,deleteModel:ut,deleteRole:kt,deleteToken:Mt,dmList:Qe,editAccount:Ct,editAccountClient:Et,editAsset:mt,editAssetGroup:gt,editDatamanager:st,editDmAccount:wt,editDmClient:ht,editEntry:oe,editEntryObject:je,editGroup:At,editInvite:qt,editModel:dt,editRole:yt,entryList:re,fileVariant:Ye,filterOptions:Ne,getAsset:Fe,getDatamanager:Xe,getEcAuthKey:Ce,getEntry:Re,getEntryAsset:Je,getEntryEnv:ie,getEntryShortID:G,getFileVariants:We,getHistory:bt,getPublicAuthKey:Oe,getSchema:Ge,getStats:Tt,listTokens:Ut,loginEc:Se,loginPublic:Ae,logoutEc:qe,logoutPublic:_e,mapEntries:Be,modelList:Ze,publicApi:Me,raw:ot,resourceDelete:rt,resourceEdit:nt,resourceGet:tt,resourceList:et,sdkOptions:se},Symbol.toStringTag,{value:"Module"})),{entryList:z,mapEntries:Pt,getEntry:Bt,getAsset:Gt,assetList:K,createAsset:Nt,createAssets:xt,deleteAsset:jt,createEntry:Jt,editEntry:V,deleteEntry:Ft,getSchema:Ht,loginPublic:zt,loginEc:Kt,logoutEc:Vt,logoutPublic:Yt,getEcAuthKey:b,getPublicAuthKey:I,dmList:Wt,modelList:Xt,publicApi:Qt,getDatamanager:Zt,resourceList:en,resourceGet:tn,resourceEdit:nn,resourceDelete:rn,raw:on,createDatamanager:an,editDatamanager:sn,deleteDatamanager:cn,createModel:dn,editModel:un,deleteModel:ln,createTemplate:fn,createAssetGroup:gn,editAssetGroup:mn,editAsset:hn,editDmClient:pn,createRole:yn,editRole:kn,deleteRole:wn,editDmAccount:Dn,deleteDmAccount:Tn,getStats:bn,getHistory:$n,createAccountClient:En,editAccountClient:vn,deleteAccountClient:In,createGroup:An,editGroup:Sn,deleteGroup:_n,createInvite:qn,editInvite:On,deleteInvite:Cn,editAccount:Un,listTokens:Ln,createToken:Mn,deleteToken:Rn}=Rt;function Y(e){if(!e||typeof e!="object")return e;const{_links:t,_embedded:n,...r}=e;return r}function Pn(e){return!e||typeof e!="object"?e:Array.isArray(e.items)?{...e,items:e.items.map(Y)}:Y(e)}class N{constructor(t={}){if(!t.storageAdapter){let n=new Map;t.storageAdapter={get:r=>n.get(r),set:(r,o)=>n.set(r,o),remove:r=>n.delete(r)}}this.config=t}set(t){return new N({...this.config,...t})}async entries(t={}){const n=await this.getBestToken();return z({...this.config,options:t,token:n})}async entryList(t){const n=await this.getBestToken();return z({...this.config,options:t,token:n}).then(r=>this.maybeClean(r))}async mapEntries(t,n={}){const r=await this.getBestToken();return Pt({...this.config,options:n,token:r},t)}async getEntry(t){const n=await this.getBestToken();return Bt({...this.config,entryID:t,token:n}).then(r=>this.maybeClean(r))}async editEntrySafe(t,n){const r=await this.getBestToken();return V({...this.config,entryID:t,token:r,value:n,safePut:!0}).then(o=>this.maybeClean(o))}async getSchema(){return Ht(this.config)}async assets(t){const n=await this.getBestToken();return K({...this.config,options:t,token:n})}async assetList(t){const n=await this.getBestToken();return K({...this.config,options:t,token:n})}async createAsset(t){const{file:n,name:r,options:o}=t,a=await this.getBestToken();return Nt({...this.config,file:n,name:r,options:o,token:a})}async createAssets(t){const{files:n,options:r}=t,o=await this.getBestToken();return xt({...this.config,files:n,options:r,token:o})}async deleteAsset(t){const n=await this.getBestToken();return jt({...this.config,token:n,assetID:t})}async getAsset(t){const n=await this.getBestToken();return Gt({...this.config,assetID:t,token:n})}async createEntry(t){const n=await this.getBestToken();return Jt({...this.config,token:n,value:t}).then(r=>this.maybeClean(r))}async editEntry(t,n){const r=await this.getBestToken();return V({...this.config,entryID:t,token:r,value:n}).then(o=>this.maybeClean(o))}async deleteEntry(t){const n=await this.getBestToken();return Ft({...this.config,token:n,entryID:t})}async resourceList(t){const n=await this.getBestToken();return en({...this.config,options:t,token:n})}async resourceGet(t){const n=await this.getBestToken();return tn({...this.config,options:t,token:n})}async resourceEdit(t,n){const r=await this.getBestToken();return nn({...this.config,options:t,token:r,value:n})}async resourceDelete(t){const n=await this.getBestToken();return rn({...this.config,options:t,token:n})}async raw(t,n){const r=await this.getBestToken();return on({...this.config,options:t,token:r},n)}async createDatamanager(t){const n=await this.getBestToken();return an({...this.config,token:n,value:t})}async editDatamanager(t,n){const r=await this.getBestToken();return sn({...this.config,token:r,dmID:t,value:n})}async deleteDatamanager(t){const n=await this.getBestToken();return cn({...this.config,token:n,dmID:t})}async createModel(t){const n=await this.getBestToken();return dn({...this.config,token:n,value:t})}async editModel(t,n){const r=await this.getBestToken();return un({...this.config,token:r,modelID:t,value:n})}async deleteModel(t){const n=await this.getBestToken();return ln({...this.config,token:n,modelID:t})}async createTemplate(t){const n=await this.getBestToken();return fn({...this.config,token:n,value:t})}async createAssetGroup(t){const n=await this.getBestToken();return gn({...this.config,token:n,value:t})}async editAssetGroup(t,n){const r=await this.getBestToken();return mn({...this.config,token:r,assetGroupID:t,value:n})}async editAsset(t,n){const r=await this.getBestToken();return hn({...this.config,token:r,assetID:t,value:n})}async editDmClient(t,n){const r=await this.getBestToken();return pn({...this.config,token:r,clientID:t,value:n})}async createRole(t){const n=await this.getBestToken();return yn({...this.config,token:n,value:t})}async editRole(t,n){const r=await this.getBestToken();return kn({...this.config,token:r,roleID:t,value:n})}async deleteRole(t){const n=await this.getBestToken();return wn({...this.config,token:n,roleID:t})}async editDmAccount(t,n){const r=await this.getBestToken();return Dn({...this.config,token:r,accountID:t,value:n})}async deleteDmAccount(t){const n=await this.getBestToken();return Tn({...this.config,token:n,accountID:t})}async getStats(t={}){const n=await this.getBestToken();return bn({...this.config,token:n,options:t})}async getHistory(t={}){const n=await this.getBestToken();return $n({...this.config,token:n,options:t})}async createAccountClient(t){const n=await this.getBestToken();return En({...this.config,token:n,value:t})}async editAccountClient(t,n){const r=await this.getBestToken();return vn({...this.config,token:r,clientID:t,value:n})}async deleteAccountClient(t){const n=await this.getBestToken();return In({...this.config,token:n,clientID:t})}async createGroup(t){const n=await this.getBestToken();return An({...this.config,token:n,value:t})}async editGroup(t,n){const r=await this.getBestToken();return Sn({...this.config,token:r,groupID:t,value:n})}async deleteGroup(t){const n=await this.getBestToken();return _n({...this.config,token:n,groupID:t})}async createInvite(t){const n=await this.getBestToken();return qn({...this.config,token:n,value:t})}async editInvite(t,n){const r=await this.getBestToken();return On({...this.config,token:r,inviteID:t,value:n})}async deleteInvite(t){const n=await this.getBestToken();return Cn({...this.config,token:n,inviteID:t})}async editAccount(t,n){const r=await this.getBestToken();return Un({...this.config,token:r,accountID:t,value:n})}async listTokens(t){const n=await this.getBestToken();return Ln({...this.config,token:n,accountID:t})}async createToken(t){const n=await this.getBestToken();return Mn({...this.config,token:n,accountID:t})}async deleteToken(t,n){const r=await this.getBestToken();return Rn({...this.config,token:r,accountID:t,accessTokenID:n})}storageAdapter(t){return this.set({storageAdapter:t})}removeToken(t){if(!this.config.storageAdapter)throw new Error("cannot removeToken: no storageAdapter defined!");const{remove:n}=this.config.storageAdapter;n(t)}getToken(t){if(!this.config.storageAdapter)throw new Error("cannot getAuth: no storageAdapter defined!");const{get:n}=this.config.storageAdapter;return n(t)}getPublicToken(){return this.config.token||this.getToken(I(this.config))}getEcToken(){return this.config.token||this.getToken(b(this.config))}setToken(t,n){if(!this.config.storageAdapter)throw new Error("cannot setEcToken: no storageAdapter defined!");return this.config.storageAdapter.set(t,n)}setEcToken(t){this.setToken(b(this.config),t)}removeEcToken(){this.removeToken(b(this.config))}setPublicToken(t){this.setToken(I(this.config),t)}loginEc(t){return Kt({...this.config,...t}).then(n=>this.setToken(b(this.config),n.token))}loginPublic(t){return zt({...this.config,...t}).then(n=>this.setToken(I(this.config),n.token))}logoutPublic(){const t=this.getPublicToken();return Yt({...this.config,token:t}).then(()=>this.removeToken(I(this.config)))}logoutEc(){const t=this.getEcToken();return Vt({...this.config,token:t}).then(()=>this.removeToken(b(this.config)))}hasPublicToken(){return!!this.getPublicToken()}hasEcToken(){return!!this.getEcToken()}hasAnyToken(){return!!this.getEcToken()||!!this.getPublicToken()}getBestToken(){try{return this.getEcToken()||this.getPublicToken()}catch{return}}clean(t=!0){return this.set({_clean:t})}maybeClean(t){return this.config._clean?Pn(t):t}model(t){return this.set({model:t})}token(t){return this.set({token:t})}dmShortID(t){return this.set({dmShortID:t})}dm(t){return this.dmShortID(t)}dmID(t){return this.set({dmID:t})}assetGroup(t){return this.set({assetGroup:t})}assetgroup(t){return this.assetGroup(t)}subdomain(t){return this.set({subdomain:t})}resource(t){return this.set({resource:t})}route(t){return this.set({route:t})}publicApi(){return Qt(this.config)}async getDatamanager(t){const n=await this.getBestToken();return Zt({...this.config,dmID:t,token:n})}async dmList(t={}){const n=await this.getBestToken();return Wt({...this.config,options:t,token:n})}async modelList(t={}){const n=await this.getBestToken();return Xt({...this.config,options:t,token:n})}}const M=ee.join($e.homedir(),".ec-fdk"),R=ee.join(M,"auth.json");function L(){try{return E.existsSync(R)?JSON.parse(E.readFileSync(R,"utf-8")):{}}catch{return{}}}function W(e){E.existsSync(M)||E.mkdirSync(M,{recursive:!0,mode:448}),E.writeFileSync(R,JSON.stringify(e,null,2),{mode:384})}const $={get(e){return L()[e]},set(e,t){const n=L();n[e]=t,W(n)},remove(e){const t=L();delete t[e],W(t)}};function Bn(e){const t=Ee.createInterface({input:process.stdin,output:process.stderr});return new Promise(n=>{t.question(e,r=>{t.close(),n(r)})})}function Gn(e){return new Promise(t=>{process.stderr.write(e);const n=process.stdin;n.setRawMode(!0),n.resume(),n.setEncoding("utf-8");let r="";const o=a=>{for(const i of a){if(i===""&&(process.stderr.write(`
2
+ "use strict";var he=Object.create;var z=Object.defineProperty;var pe=Object.getOwnPropertyDescriptor;var ye=Object.getOwnPropertyNames;var ke=Object.getPrototypeOf,we=Object.prototype.hasOwnProperty;var De=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of ye(t))!we.call(e,s)&&s!==n&&z(e,s,{get:()=>t[s],enumerable:!(r=pe(t,s))||r.enumerable});return e};var b=(e,t,n)=>(n=e!=null?he(ke(e)):{},De(t||!e||!e.__esModule?z(n,"default",{value:e,enumerable:!0}):n,e));const Te=require("node:util"),be=require("node:module"),v=require("node:fs"),te=require("node:path"),$e=require("node:os"),Ee=require("node:readline"),G=require("node:crypto"),ve=require("node:http"),Ie=require("node:child_process");async function f(e,t={},n={}){const{token:r,rawRes:s}=t;r&&(n.headers={...n.headers||{},Authorization:`Bearer ${r}`});const a=await fetch(e,n);if(!a.ok){if(a.headers.get("content-type")?.includes("application/json")){const o=await a.json(),c=`${o.title}
3
+ ${o.detail}
4
+ ${o.verbose}`;throw new Error(c)}throw new Error(`unexpected fetch error: ${a.statusText}`)}if(s)return a;if(a.status===204)return;const i=await a.text();return i?JSON.parse(i):void 0}const O={datamanager:{live:"https://datamanager.entrecode.de/",stage:"https://datamanager.cachena.entrecode.de/"},accounts:{live:"https://accounts.entrecode.de/",stage:"https://accounts.cachena.entrecode.de/"},appserver:{live:"https://appserver.entrecode.de/",stage:"https://appserver.cachena.entrecode.de/"},"dm-history":{live:"https://dm-history.entrecode.de/",stage:"https://dm-history.cachena.entrecode.de/"}};function m(e,t="stage",n="datamanager"){const r=O[n];if(!r)throw new Error(`subdomain "${n}" not found. Try one of ${Object.keys(O).join(", ")}`);const s=r[t];if(!s)throw new Error(`env "${t}" not found. Try one of ${Object.keys(r[t]).join(", ")}`);return s+e}function h(e,t=!0){return Object.entries(e).sort((n,r)=>n[0].localeCompare(r[0])).map(([n,r])=>`${n}=${r}`).join("&")}function d(e){Object.entries(e).forEach(([t,n])=>{if(n===void 0)throw new Error(`expected ${t} to be set!`)})}const ne={stage:"https://accounts.cachena.entrecode.de/",live:"https://accounts.entrecode.de/"};async function Ae(e){let{env:t,dmShortID:n,email:r,password:s}=e;d({env:t,dmShortID:n,email:r,password:s});const a=m(`api/${n}/_auth/login?clientID=rest`,t);return await f(a,{},{method:"POST",body:JSON.stringify({email:r,password:s}),headers:{"Content-Type":"application/json"}})}async function Se(e){let{env:t,email:n,password:r}=e;d({env:t,email:n,password:r});const s=`${ne[t]}auth/login?clientID=rest`;return await f(s,{},{method:"POST",body:JSON.stringify({email:n,password:r}),headers:{"Content-Type":"application/json"}})}async function _e(e){let{dmShortID:t,env:n,token:r}=e;d({dmShortID:t,env:n,token:r});const s=m(`api/${t}/_auth/logout?clientID=rest&token=${r}`,n);return await f(s,{rawRes:!0},{method:"POST"})}async function qe(e){let{env:t,token:n}=e;d({env:t,token:n});const r=`${ne[t]}auth/logout?clientID=rest`;return await f(r,{rawRes:!0,token:n},{method:"POST"})}function Oe({dmShortID:e}){return d({dmShortID:e}),e}function Le({env:e}){return d({env:e}),e}let Ce=["created","creator","id","modified","private","_created","_creator","_embedded","_entryTitle","_id","_links","_modelTitle","_modelTitleField","_modified"];function re(e){let t={};for(let n in e)Ce.includes(n)||(t[n]=e[n]);return t}function Ue(e){return JSON.parse(JSON.stringify(e))}async function Me(e){let{env:t,dmShortID:n}=e;d({env:t,dmShortID:n});const r=m(`api/${n}`,t);return f(r,e)}async function se(e){let{env:t,dmShortID:n,model:r,options:s={}}=e;d({env:t,dmShortID:n,model:r}),s={size:50,page:1,_list:!0,...s};const a=h(s),i=m(`api/${n}/${r}?${a}`,t),{count:o,total:c,_embedded:u}=await f(i,e);let g=u?u[`${n}:${r}`]:[];return g=Array.isArray(g)?g:[g],{count:o,total:c,items:g}}function Re({env:e,dmShortID:t,model:n,entryID:r,token:s}){d({env:e,dmShortID:t,model:n,entryID:r});const a=h({_id:r}),i=m(`api/${t}/${n}?${a}`,e);return f(i,{token:s})}async function Pe({env:e,dmShortID:t,model:n,value:r,token:s}){d({env:e,dmShortID:t,model:n,value:r});const a=m(`api/${t}/${n}`,e);return await f(a,{token:s},{method:"POST",body:JSON.stringify(r),headers:{"Content-Type":"application/json"}})}async function ae({env:e,dmShortID:t,model:n,entryID:r,value:s,token:a,safePut:i=!1}){d({env:e,dmShortID:t,model:n,entryID:r,value:s});const o={"Content-Type":"application/json"};if(i){if(!("_modified"in s))throw new Error("expected _modified to be set!");o["If-Unmodified-Since"]=new Date(s._modified).toUTCString()}const c=m(`api/${t}/${n}?_id=${r}`,e);return s=Ue(s),s=re(s),await f(c,{token:a},{method:"PUT",headers:o,body:JSON.stringify(s)})}function oe({env:e,dmShortID:t,model:n,entryID:r,token:s}){d({env:e,dmShortID:t,model:n,entryID:r});const a=m(`api/${t}/${n}?_id=${r}`,e);return f(a,{token:s,rawRes:!0},{method:"DELETE",headers:{"Content-Type":"application/json"}})}async function Be(e,t){let{env:n,dmShortID:r,model:s,options:a={}}=e;d({env:n,dmShortID:r,model:s}),e.options={size:50,page:1,_list:!0,...a};let i=0,o,c=[];for(;o===void 0||i<o;){const u=await se(e);for(let g of u.items)c.push(await t(g));i+=u.items.length,o=u.total,e.options.page++}return c}async function Ge({env:e,dmShortID:t,model:n,withMetadata:r}){d({env:e,dmShortID:t,model:n});const s=m(`api/schema/${t}/${n}`,e),a=await f(s),i=a?.allOf?.[1];if(typeof i.properties!="object")throw new Error(`getSchema: ${s} returned unexpected format: ${JSON.stringify(a)}`);const{properties:o}=i,c=re(o);for(let u in c){let g=c[u];if(g.required=i.required.includes(u),c[u]?.oneOf&&delete c[u]?.oneOf,g.title?.includes("<")&&g.title?.includes(">")){const y=g.title.split("<")[1].slice(0,-1),w=g.title.split("<")[0];g.type=w,y.includes(":")?g.resource=y.split(":")[1]:g.resource=y}else["asset","entry","assets","entries"].includes(g.title)?(g.type=g.title,g.resource=null):g.type=g.title;delete c[u].title}if(r){const u=o._modelTitle.title,g=o._modelTitleField.title;return{properties:c,meta:{modelTitleField:g,modelTitle:u}}}return c}function ie(e){return Object.entries(e).map(([t,n])=>typeof n!="object"?{[t]:String(n)}:{...n.sort&&{sort:Array.isArray(n)?n.join(","):n},...n.search&&{[t+"~"]:n.search},...n.notNull&&{[t+"!"]:""},...n.null&&{[t]:""},...n.any&&{[t]:n.any.join(",")},...n.from&&{[t+"From"]:n.from},...n.to&&{[t+"To"]:n.to}}).reduce((t,n)=>({...t,...n}),{})}const Ne=ie;function N(e){return e._links.collection.href.split("/").slice(-2)[0]}function ce(e){const t=e._links.collection.href.split("api/")[0];return Object.keys(O.datamanager).find(r=>O.datamanager[r]===t)}const de=e=>{const t=N(e),n=ce(e),r=e._modelTitle,s=e.id;return{dmShortID:t,env:n,model:r,entryID:s}},xe=e=>oe(de(e)),je=(e,t)=>ae({...de(e),value:t});function Je(e,t){const n=N(t);return t._embedded[`${n}:${t._modelTitle}/${e}/asset`]}async function Fe({env:e,dmShortID:t,assetGroup:n,assetID:r,token:s}){d({env:e,dmShortID:t,assetGroup:n,assetID:r});const a=h({assetID:r}),i=m(`a/${t}/${n}?${a}`,e),{_embedded:o}=await f(i,{token:s});return o?o["ec:dm-asset"]:void 0}async function He(e){let{env:t,dmShortID:n,assetGroup:r,token:s,options:a={}}=e;d({env:t,dmShortID:n,assetGroup:r}),a={size:50,page:1,_list:!0,...a};const i=h(a),o=m(`a/${n}/${r}?${i}`,t),{count:c,total:u,_embedded:g}=await f(o,{token:s});let y=g?g["ec:dm-asset"]:[];return y=Array.isArray(y)?y:[y],{count:c,total:u,items:y}}async function ze({env:e,dmShortID:t,assetGroup:n,token:r,file:s,name:a,options:i}){d({env:e,dmShortID:t,assetGroup:n,file:s});const o=m(`a/${t}/${n}`,e),c=new FormData;return c.append("file",s,a),i&&Object.keys(i).forEach(g=>{c.append(g,i[g])}),(await f(o,{token:r},{method:"POST",body:c}))._embedded["ec:dm-asset"]}async function Ke({env:e,dmShortID:t,assetGroup:n,files:r,options:s}){d({env:e,dmShortID:t,assetGroup:n,files:r});const a=m(`a/${t}/${n}`,e),i=new FormData;r.forEach(c=>{i.append("file",c)}),s&&Object.keys(s).forEach(c=>{i.append(c,s[c])});const o=await f(a,{},{method:"POST",body:i});return Array.isArray(o._embedded["ec:dm-asset"])?o._embedded["ec:dm-asset"]:[o._embedded["ec:dm-asset"]]}async function Ve({env:e,dmShortID:t,assetGroup:n,assetID:r,token:s}){d({env:e,dmShortID:t,assetGroup:n,assetID:r});const a=m(`a/${t}/${n}/${r}`,e);await f(a,{token:s,rawRes:!0},{method:"DELETE"})}function Ye(e,t,n=!1){let r,s;return(n?e?.thumbnails:e?.fileVariants)?.forEach(i=>{const{resolution:{width:o,height:c}}=i,u=Math.abs(Math.max(o,c)-t);(!s||u<s)&&(s=u,r=i)}),r?.url??e?.file?.url??null}function We(e="stage",t,n,r,s=!1){const a=Math.max(r.file.resolution.width,r.file.resolution.height),i=n.filter(c=>c<a),o=`https://datamanager${e==="stage"?".cachena":""}.entrecode.de`;return s?i.map(c=>{const u=r.thumbnails.find(w=>c===w.dimension),g=`${o}/t/${t}/${r.assetID}/${c}`,y=u?u.url:g;return{size:c,url:y,generated:u}}):i.map(c=>{const u=r.fileVariants.find(w=>c===Math.max(w.resolution.width,w.resolution.height)),g=`${o}/f/${t}/${r.assetID}/${c}`,y=u?u.url:g;return{size:c,url:y,generated:u}})}const p={"Content-Type":"application/json"};async function Xe(e){let{env:t,dmID:n,token:r}=e;d({env:t,dmID:n});const s=m(`?dataManagerID=${n}`,t);return f(s,{token:r})}async function Qe(e){let{env:t,options:n={}}=e;d({env:t}),n={size:25,page:1,_list:!0,...n};const r=h(n),s=m(`?${r}`,t),{count:a,total:i,_embedded:o}=await f(s,e);let c=o?o["ec:datamanager"]:[];return c=Array.isArray(c)?c:[c],{count:a,total:i,items:c}}async function Ze(e){let{env:t,dmID:n,options:r={}}=e;d({env:t,dmID:n}),r={size:25,dataManagerID:n,page:1,_list:!0,...r};const s=h(r),a=m(`model?${s}`,t),{count:i,total:o,_embedded:c}=await f(a,e);let u=c?c["ec:model"]:[];return u=Array.isArray(u)?u:[u],{count:i,total:o,items:u}}async function et(e){let{env:t,resource:n,options:r={},subdomain:s="datamanager"}=e;d({env:t,subdomain:s,resource:n}),r={size:25,page:1,_list:!0,...r};const a=h(r),i=m(`${n}?${a}`,t,s),{count:o,total:c,_embedded:u}=await f(i,e);let g=u?u[Object.keys(u)[0]]:[];return g=Array.isArray(g)?g:[g],{count:o,total:c,items:g}}async function tt(e){let{env:t,resource:n,options:r={},subdomain:s="datamanager"}=e;d({env:t,subdomain:s,resource:n});const a=h(r),i=m(`${n}?${a}`,t,s);return f(i,e)}async function nt(e){let{env:t,resource:n,options:r={},subdomain:s="datamanager",value:a}=e;d({env:t,subdomain:s,resource:n,value:a});const i=h(r),o=m(`${n}?${i}`,t,s);return f(o,e,{method:"PUT",body:JSON.stringify(a),headers:p})}async function rt(e){let{env:t,resource:n,options:r={},subdomain:s="datamanager"}=e;d({env:t,subdomain:s,resource:n});const a=h(r),i=m(`${n}?${a}`,t,s);return f(i,{...e,rawRes:!0},{method:"DELETE",headers:p})}async function st(e,t={}){let{env:n,route:r,options:s={},subdomain:a="datamanager"}=e;d({env:n,subdomain:a,route:r}),s={...s};const i=h(s),o=m(`${r}?${i}`,n,a);return f(o,e,t)}async function at(e){let{env:t,token:n,value:r}=e;d({env:t,value:r});const s=m("",t);return f(s,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function ot(e){let{env:t,token:n,dmID:r,value:s}=e;d({env:t,dmID:r,value:s});const a=h({dataManagerID:r}),i=m(`?${a}`,t);return f(i,{token:n},{method:"PUT",body:JSON.stringify(s),headers:p})}async function it(e){let{env:t,token:n,dmID:r}=e;d({env:t,dmID:r});const s=h({dataManagerID:r}),a=m(`?${s}`,t);return f(a,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function ct(e){let{env:t,token:n,dmID:r,value:s}=e;d({env:t,dmID:r,value:s});const a=h({dataManagerID:r}),i=m(`model?${a}`,t);return f(i,{token:n},{method:"POST",body:JSON.stringify(s),headers:p})}async function dt(e){let{env:t,token:n,dmID:r,modelID:s,value:a}=e;d({env:t,dmID:r,modelID:s,value:a});const i=h({dataManagerID:r,modelID:s}),o=m(`model?${i}`,t);return f(o,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function ut(e){let{env:t,token:n,dmID:r,modelID:s}=e;d({env:t,dmID:r,modelID:s});const a=h({dataManagerID:r,modelID:s}),i=m(`model?${a}`,t);return f(i,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function lt(e){let{env:t,token:n,value:r}=e;d({env:t,value:r});const s=m("template",t);return f(s,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function ft(e){let{env:t,token:n,dmID:r,value:s}=e;d({env:t,dmID:r,value:s});const a=h({dataManagerID:r}),i=m(`assetgroup?${a}`,t);return f(i,{token:n},{method:"POST",body:JSON.stringify(s),headers:p})}async function gt(e){let{env:t,token:n,dmID:r,assetGroupID:s,value:a}=e;d({env:t,dmID:r,assetGroupID:s,value:a});const i=h({dataManagerID:r,assetGroupID:s}),o=m(`assetgroup?${i}`,t);return f(o,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function mt(e){let{env:t,token:n,dmShortID:r,assetGroup:s,assetID:a,value:i}=e;d({env:t,dmShortID:r,assetGroup:s,assetID:a,value:i});const o=m(`a/${r}/${s}/${a}`,t);return f(o,{token:n},{method:"PUT",body:JSON.stringify(i),headers:p})}async function ht(e){let{env:t,token:n,dmID:r,clientID:s,value:a}=e;d({env:t,dmID:r,clientID:s,value:a});const i=h({dataManagerID:r,clientID:s}),o=m(`client?${i}`,t);return f(o,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function pt(e){let{env:t,token:n,dmID:r,value:s}=e;d({env:t,dmID:r,value:s});const a=h({dataManagerID:r}),i=m(`role?${a}`,t);return f(i,{token:n},{method:"POST",body:JSON.stringify(s),headers:p})}async function yt(e){let{env:t,token:n,dmID:r,roleID:s,value:a}=e;d({env:t,dmID:r,roleID:s,value:a});const i=h({dataManagerID:r,roleID:s}),o=m(`role?${i}`,t);return f(o,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function kt(e){let{env:t,token:n,dmID:r,roleID:s}=e;d({env:t,dmID:r,roleID:s});const a=h({dataManagerID:r,roleID:s}),i=m(`role?${a}`,t);return f(i,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function wt(e){let{env:t,token:n,dmID:r,accountID:s,value:a}=e;d({env:t,dmID:r,accountID:s,value:a});const i=h({dataManagerID:r,accountID:s}),o=m(`account?${i}`,t);return f(o,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function Dt(e){let{env:t,token:n,dmID:r,accountID:s}=e;d({env:t,dmID:r,accountID:s});const a=h({dataManagerID:r,accountID:s}),i=m(`account?${a}`,t);return f(i,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function Tt(e){let{env:t,token:n,options:r={}}=e;d({env:t});const s=h(r),a=m(`stats?${s}`,t);return f(a,{token:n})}async function bt(e){let{env:t,token:n,options:r={}}=e;d({env:t});const s=h(r),a=m(`entries?${s}`,t,"dm-history");return f(a,{token:n})}async function $t(e){let{env:t,token:n,value:r}=e;d({env:t,value:r});const s=m("client",t,"accounts");return f(s,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function Et(e){let{env:t,token:n,clientID:r,value:s}=e;d({env:t,clientID:r,value:s});const a=h({clientID:r}),i=m(`client?${a}`,t,"accounts");return f(i,{token:n},{method:"PUT",body:JSON.stringify(s),headers:p})}async function vt(e){let{env:t,token:n,clientID:r}=e;d({env:t,clientID:r});const s=h({clientID:r}),a=m(`client?${s}`,t,"accounts");return f(a,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function It(e){let{env:t,token:n,value:r}=e;d({env:t,value:r});const s=m("group",t,"accounts");return f(s,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function At(e){let{env:t,token:n,groupID:r,value:s}=e;d({env:t,groupID:r,value:s});const a=h({groupID:r}),i=m(`group?${a}`,t,"accounts");return f(i,{token:n},{method:"PUT",body:JSON.stringify(s),headers:p})}async function St(e){let{env:t,token:n,groupID:r}=e;d({env:t,groupID:r});const s=h({groupID:r}),a=m(`group?${s}`,t,"accounts");return f(a,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function _t(e){let{env:t,token:n,value:r}=e;d({env:t,value:r});const s=m("invite",t,"accounts"),a=await f(s,{token:n},{method:"POST",body:JSON.stringify(r),headers:p});return a?._embedded?.["ec:invite"]??a}async function qt(e){let{env:t,token:n,inviteID:r,value:s}=e;d({env:t,inviteID:r,value:s});const a=h({invite:r}),i=m(`invite?${a}`,t,"accounts");return f(i,{token:n},{method:"PUT",body:JSON.stringify(s),headers:p})}async function Ot(e){let{env:t,token:n,inviteID:r}=e;d({env:t,inviteID:r});const s=h({invite:r}),a=m(`invite?${s}`,t,"accounts");return f(a,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function Lt(e){let{env:t,token:n,accountID:r,value:s}=e;d({env:t,accountID:r,value:s});const a=h({accountID:r}),i=m(`account?${a}`,t,"accounts");return f(i,{token:n},{method:"PUT",body:JSON.stringify(s),headers:p})}async function Ct(e){let{env:t,token:n,accountID:r}=e;d({env:t,accountID:r});const s=h({accountID:r}),a=m(`account/tokens?${s}`,t,"accounts");let o=(await f(a,{token:n}))?._embedded?.["ec:account/token"]??[];return Array.isArray(o)?o:[o]}async function Ut(e){let{env:t,token:n,accountID:r}=e;d({env:t,accountID:r});const s=h({accountID:r}),a=m(`account/tokens?${s}`,t,"accounts");return f(a,{token:n},{method:"POST",headers:p})}async function Mt(e){let{env:t,token:n,accountID:r,accessTokenID:s}=e;d({env:t,accountID:r,accessTokenID:s});const a=h({accessTokenID:s,accountID:r}),i=m(`account/tokens?${a}`,t,"accounts");return f(i,{token:n,rawRes:!0},{method:"DELETE",headers:p})}const Rt=Object.freeze(Object.defineProperty({__proto__:null,assetList:He,createAccountClient:$t,createAsset:ze,createAssetGroup:ft,createAssets:Ke,createDatamanager:at,createEntry:Pe,createGroup:It,createInvite:_t,createModel:ct,createRole:pt,createTemplate:lt,createToken:Ut,deleteAccountClient:vt,deleteAsset:Ve,deleteDatamanager:it,deleteDmAccount:Dt,deleteEntry:oe,deleteEntryObject:xe,deleteGroup:St,deleteInvite:Ot,deleteModel:ut,deleteRole:kt,deleteToken:Mt,dmList:Qe,editAccount:Lt,editAccountClient:Et,editAsset:mt,editAssetGroup:gt,editDatamanager:ot,editDmAccount:wt,editDmClient:ht,editEntry:ae,editEntryObject:je,editGroup:At,editInvite:qt,editModel:dt,editRole:yt,entryList:se,fileVariant:Ye,filterOptions:Ne,getAsset:Fe,getDatamanager:Xe,getEcAuthKey:Le,getEntry:Re,getEntryAsset:Je,getEntryEnv:ce,getEntryShortID:N,getFileVariants:We,getHistory:bt,getPublicAuthKey:Oe,getSchema:Ge,getStats:Tt,listTokens:Ct,loginEc:Se,loginPublic:Ae,logoutEc:qe,logoutPublic:_e,mapEntries:Be,modelList:Ze,publicApi:Me,raw:st,resourceDelete:rt,resourceEdit:nt,resourceGet:tt,resourceList:et,sdkOptions:ie},Symbol.toStringTag,{value:"Module"})),{entryList:K,mapEntries:Pt,getEntry:Bt,getAsset:Gt,assetList:V,createAsset:Nt,createAssets:xt,deleteAsset:jt,createEntry:Jt,editEntry:Y,deleteEntry:Ft,getSchema:Ht,loginPublic:zt,loginEc:Kt,logoutEc:Vt,logoutPublic:Yt,getEcAuthKey:E,getPublicAuthKey:A,dmList:Wt,modelList:Xt,publicApi:Qt,getDatamanager:Zt,resourceList:en,resourceGet:tn,resourceEdit:nn,resourceDelete:rn,raw:sn,createDatamanager:an,editDatamanager:on,deleteDatamanager:cn,createModel:dn,editModel:un,deleteModel:ln,createTemplate:fn,createAssetGroup:gn,editAssetGroup:mn,editAsset:hn,editDmClient:pn,createRole:yn,editRole:kn,deleteRole:wn,editDmAccount:Dn,deleteDmAccount:Tn,getStats:bn,getHistory:$n,createAccountClient:En,editAccountClient:vn,deleteAccountClient:In,createGroup:An,editGroup:Sn,deleteGroup:_n,createInvite:qn,editInvite:On,deleteInvite:Ln,editAccount:Cn,listTokens:Un,createToken:Mn,deleteToken:Rn}=Rt;function W(e){if(!e||typeof e!="object")return e;const{_links:t,_embedded:n,...r}=e;return r}function Pn(e){return!e||typeof e!="object"?e:Array.isArray(e.items)?{...e,items:e.items.map(W)}:W(e)}class x{constructor(t={}){if(!t.storageAdapter){let n=new Map;t.storageAdapter={get:r=>n.get(r),set:(r,s)=>n.set(r,s),remove:r=>n.delete(r)}}this.config=t}set(t){return new x({...this.config,...t})}async entries(t={}){const n=await this.getBestToken();return K({...this.config,options:t,token:n})}async entryList(t){const n=await this.getBestToken();return K({...this.config,options:t,token:n}).then(r=>this.maybeClean(r))}async mapEntries(t,n={}){const r=await this.getBestToken();return Pt({...this.config,options:n,token:r},t)}async getEntry(t){const n=await this.getBestToken();return Bt({...this.config,entryID:t,token:n}).then(r=>this.maybeClean(r))}async editEntrySafe(t,n){const r=await this.getBestToken();return Y({...this.config,entryID:t,token:r,value:n,safePut:!0}).then(s=>this.maybeClean(s))}async getSchema(){return Ht(this.config)}async assets(t){const n=await this.getBestToken();return V({...this.config,options:t,token:n})}async assetList(t){const n=await this.getBestToken();return V({...this.config,options:t,token:n})}async createAsset(t){const{file:n,name:r,options:s}=t,a=await this.getBestToken();return Nt({...this.config,file:n,name:r,options:s,token:a})}async createAssets(t){const{files:n,options:r}=t,s=await this.getBestToken();return xt({...this.config,files:n,options:r,token:s})}async deleteAsset(t){const n=await this.getBestToken();return jt({...this.config,token:n,assetID:t})}async getAsset(t){const n=await this.getBestToken();return Gt({...this.config,assetID:t,token:n})}async createEntry(t){const n=await this.getBestToken();return Jt({...this.config,token:n,value:t}).then(r=>this.maybeClean(r))}async editEntry(t,n){const r=await this.getBestToken();return Y({...this.config,entryID:t,token:r,value:n}).then(s=>this.maybeClean(s))}async deleteEntry(t){const n=await this.getBestToken();return Ft({...this.config,token:n,entryID:t})}async resourceList(t){const n=await this.getBestToken();return en({...this.config,options:t,token:n})}async resourceGet(t){const n=await this.getBestToken();return tn({...this.config,options:t,token:n})}async resourceEdit(t,n){const r=await this.getBestToken();return nn({...this.config,options:t,token:r,value:n})}async resourceDelete(t){const n=await this.getBestToken();return rn({...this.config,options:t,token:n})}async raw(t,n){const r=await this.getBestToken();return sn({...this.config,options:t,token:r},n)}async createDatamanager(t){const n=await this.getBestToken();return an({...this.config,token:n,value:t})}async editDatamanager(t,n){const r=await this.getBestToken();return on({...this.config,token:r,dmID:t,value:n})}async deleteDatamanager(t){const n=await this.getBestToken();return cn({...this.config,token:n,dmID:t})}async createModel(t){const n=await this.getBestToken();return dn({...this.config,token:n,value:t})}async editModel(t,n){const r=await this.getBestToken();return un({...this.config,token:r,modelID:t,value:n})}async deleteModel(t){const n=await this.getBestToken();return ln({...this.config,token:n,modelID:t})}async createTemplate(t){const n=await this.getBestToken();return fn({...this.config,token:n,value:t})}async createAssetGroup(t){const n=await this.getBestToken();return gn({...this.config,token:n,value:t})}async editAssetGroup(t,n){const r=await this.getBestToken();return mn({...this.config,token:r,assetGroupID:t,value:n})}async editAsset(t,n){const r=await this.getBestToken();return hn({...this.config,token:r,assetID:t,value:n})}async editDmClient(t,n){const r=await this.getBestToken();return pn({...this.config,token:r,clientID:t,value:n})}async createRole(t){const n=await this.getBestToken();return yn({...this.config,token:n,value:t})}async editRole(t,n){const r=await this.getBestToken();return kn({...this.config,token:r,roleID:t,value:n})}async deleteRole(t){const n=await this.getBestToken();return wn({...this.config,token:n,roleID:t})}async editDmAccount(t,n){const r=await this.getBestToken();return Dn({...this.config,token:r,accountID:t,value:n})}async deleteDmAccount(t){const n=await this.getBestToken();return Tn({...this.config,token:n,accountID:t})}async getStats(t={}){const n=await this.getBestToken();return bn({...this.config,token:n,options:t})}async getHistory(t={}){const n=await this.getBestToken();return $n({...this.config,token:n,options:t})}async createAccountClient(t){const n=await this.getBestToken();return En({...this.config,token:n,value:t})}async editAccountClient(t,n){const r=await this.getBestToken();return vn({...this.config,token:r,clientID:t,value:n})}async deleteAccountClient(t){const n=await this.getBestToken();return In({...this.config,token:n,clientID:t})}async createGroup(t){const n=await this.getBestToken();return An({...this.config,token:n,value:t})}async editGroup(t,n){const r=await this.getBestToken();return Sn({...this.config,token:r,groupID:t,value:n})}async deleteGroup(t){const n=await this.getBestToken();return _n({...this.config,token:n,groupID:t})}async createInvite(t){const n=await this.getBestToken();return qn({...this.config,token:n,value:t})}async editInvite(t,n){const r=await this.getBestToken();return On({...this.config,token:r,inviteID:t,value:n})}async deleteInvite(t){const n=await this.getBestToken();return Ln({...this.config,token:n,inviteID:t})}async editAccount(t,n){const r=await this.getBestToken();return Cn({...this.config,token:r,accountID:t,value:n})}async listTokens(t){const n=await this.getBestToken();return Un({...this.config,token:n,accountID:t})}async createToken(t){const n=await this.getBestToken();return Mn({...this.config,token:n,accountID:t})}async deleteToken(t,n){const r=await this.getBestToken();return Rn({...this.config,token:r,accountID:t,accessTokenID:n})}storageAdapter(t){return this.set({storageAdapter:t})}removeToken(t){if(!this.config.storageAdapter)throw new Error("cannot removeToken: no storageAdapter defined!");const{remove:n}=this.config.storageAdapter;n(t)}getToken(t){if(!this.config.storageAdapter)throw new Error("cannot getAuth: no storageAdapter defined!");const{get:n}=this.config.storageAdapter;return n(t)}getPublicToken(){return this.config.token||this.getToken(A(this.config))}getEcToken(){return this.config.token||this.getToken(E(this.config))}setToken(t,n){if(!this.config.storageAdapter)throw new Error("cannot setEcToken: no storageAdapter defined!");return this.config.storageAdapter.set(t,n)}setEcToken(t){this.setToken(E(this.config),t)}removeEcToken(){this.removeToken(E(this.config))}setPublicToken(t){this.setToken(A(this.config),t)}loginEc(t){return Kt({...this.config,...t}).then(n=>this.setToken(E(this.config),n.token))}loginPublic(t){return zt({...this.config,...t}).then(n=>this.setToken(A(this.config),n.token))}logoutPublic(){const t=this.getPublicToken();return Yt({...this.config,token:t}).then(()=>this.removeToken(A(this.config)))}logoutEc(){const t=this.getEcToken();return Vt({...this.config,token:t}).then(()=>this.removeToken(E(this.config)))}hasPublicToken(){return!!this.getPublicToken()}hasEcToken(){return!!this.getEcToken()}hasAnyToken(){return!!this.getEcToken()||!!this.getPublicToken()}getBestToken(){try{return this.getEcToken()||this.getPublicToken()}catch{return}}clean(t=!0){return this.set({_clean:t})}maybeClean(t){return this.config._clean?Pn(t):t}model(t){return this.set({model:t})}token(t){return this.set({token:t})}dmShortID(t){return this.set({dmShortID:t})}dm(t){return this.dmShortID(t)}dmID(t){return this.set({dmID:t})}assetGroup(t){return this.set({assetGroup:t})}assetgroup(t){return this.assetGroup(t)}subdomain(t){return this.set({subdomain:t})}resource(t){return this.set({resource:t})}route(t){return this.set({route:t})}publicApi(){return Qt(this.config)}async getDatamanager(t){const n=await this.getBestToken();return Zt({...this.config,dmID:t,token:n})}async dmList(t={}){const n=await this.getBestToken();return Wt({...this.config,options:t,token:n})}async modelList(t={}){const n=await this.getBestToken();return Xt({...this.config,options:t,token:n})}}const M=te.join($e.homedir(),".ec-fdk"),R=te.join(M,"auth.json");function U(){try{return v.existsSync(R)?JSON.parse(v.readFileSync(R,"utf-8")):{}}catch{return{}}}function X(e){v.existsSync(M)||v.mkdirSync(M,{recursive:!0,mode:448}),v.writeFileSync(R,JSON.stringify(e,null,2),{mode:384})}const T={get(e){return U()[e]},set(e,t){const n=U();n[e]=t,X(n)},remove(e){const t=U();delete t[e],X(t)}};function Bn(e){const t=Ee.createInterface({input:process.stdin,output:process.stderr});return new Promise(n=>{t.question(e,r=>{t.close(),n(r)})})}function Gn(e){return new Promise(t=>{process.stderr.write(e);const n=process.stdin;n.setRawMode(!0),n.resume(),n.setEncoding("utf-8");let r="";const s=a=>{for(const i of a){if(i===""&&(process.stderr.write(`
5
5
  `),process.exit(130)),i==="\r"||i===`
6
- `){n.setRawMode(!1),n.pause(),n.removeListener("data",o),process.stderr.write(`
7
- `),t(r);return}if(i===""||i==="\b"){r.length>0&&(r=r.slice(0,-1),process.stderr.write("\b \b"));continue}r+=i,process.stderr.write("*")}};n.on("data",o)})}const de={stage:{authEndpoint:"https://login.cachena.entrecode.de/oidc/auth",tokenEndpoint:"https://login.cachena.entrecode.de/oidc/token"},live:{authEndpoint:"https://login.entrecode.de/oidc/auth",tokenEndpoint:"https://login.entrecode.de/oidc/token"}},P="ec-fdk-cli",X="http://localhost:19836/callback",Nn=12e4;function x(e){return e.toString("base64url")}function xn(){return x(B.randomBytes(32))}function jn(e){return x(B.createHash("sha256").update(e).digest())}function Jn(e){const t=process.platform==="darwin"?"open":process.platform==="win32"?"start":"xdg-open";Ie.exec(`${t} ${JSON.stringify(e)}`)}const Fn=`<!DOCTYPE html><html><body style="font-family:system-ui;display:flex;justify-content:center;align-items:center;height:100vh;margin:0">
8
- <div style="text-align:center"><h1>Login successful</h1><p>You can close this tab.</p></div></body></html>`,A=e=>`<!DOCTYPE html><html><body style="font-family:system-ui;display:flex;justify-content:center;align-items:center;height:100vh;margin:0">
9
- <div style="text-align:center"><h1>Login failed</h1><p>${e}</p></div></body></html>`;async function Hn(e,t){const{tokenEndpoint:n}=de[e],r=await fetch(n,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"refresh_token",client_id:P,refresh_token:t})});if(!r.ok){const a=await r.text();throw new Error(`Token refresh failed: ${r.status} ${a}`)}const o=await r.json();if(!o.access_token)throw new Error("No access_token in refresh response");return{access_token:o.access_token,refresh_token:o.refresh_token}}function zn(e){const{authEndpoint:t,tokenEndpoint:n}=de[e],r=xn(),o=jn(r),a=x(B.randomBytes(16));return new Promise((i,s)=>{const c=ve.createServer(async(y,w)=>{if(!y.url?.startsWith("/callback")){w.writeHead(404),w.end();return}const T=new URL(y.url,"http://localhost").searchParams,j=T.get("code"),ge=T.get("state"),C=T.get("error");if(C){w.writeHead(200,{"Content-Type":"text/html"}),w.end(A(T.get("error_description")||C)),m(),s(new Error(T.get("error_description")||C));return}if(ge!==a){w.writeHead(200,{"Content-Type":"text/html"}),w.end(A("State mismatch")),m(),s(new Error("State mismatch — possible CSRF attack"));return}if(!j){w.writeHead(200,{"Content-Type":"text/html"}),w.end(A("No authorization code received")),m(),s(new Error("No authorization code received"));return}try{const D=await fetch(n,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"authorization_code",client_id:P,redirect_uri:X,code:j,code_verifier:r})});if(!D.ok){const me=await D.text();throw new Error(`Token exchange failed: ${D.status} ${me}`)}const J=await D.json(),F=J.access_token;if(!F)throw new Error("No access_token in token response");w.writeHead(200,{"Content-Type":"text/html"}),w.end(Fn),m(),i({access_token:F,refresh_token:J.refresh_token})}catch(D){w.writeHead(200,{"Content-Type":"text/html"}),w.end(A(D.message)),m(),s(D)}}),u=setTimeout(()=>{m(),s(new Error("Login timed out after 2 minutes"))},Nn);function m(){clearTimeout(u),c.close()}c.listen(19836,()=>{const y=`${t}?`+new URLSearchParams({client_id:P,redirect_uri:X,response_type:"code",scope:"openid offline_access",state:a,code_challenge:o,code_challenge_method:"S256"}).toString();process.stderr.write(`Opening browser for login...
10
- `),Jn(y)}),c.on("error",y=>{m(),s(new Error(`Could not start local server: ${y.message}`))})})}const ue=be.createRequire(typeof document>"u"?require("url").pathToFileURL(__filename).href:document.currentScript&&document.currentScript.src||new URL("cli.cjs",document.baseURI).href),{version:Kn}=ue("../package.json"),Vn=`ec.fdk <command> [options]
6
+ `){n.setRawMode(!1),n.pause(),n.removeListener("data",s),process.stderr.write(`
7
+ `),t(r);return}if(i===""||i==="\b"){r.length>0&&(r=r.slice(0,-1),process.stderr.write("\b \b"));continue}r+=i,process.stderr.write("*")}};n.on("data",s)})}const ue={stage:{authEndpoint:"https://login.cachena.entrecode.de/oidc/auth",tokenEndpoint:"https://login.cachena.entrecode.de/oidc/token"},live:{authEndpoint:"https://login.entrecode.de/oidc/auth",tokenEndpoint:"https://login.entrecode.de/oidc/token"}},P="ec-fdk-cli",Q="http://localhost:19836/callback",Nn=12e4;function j(e){return e.toString("base64url")}function xn(){return j(G.randomBytes(32))}function jn(e){return j(G.createHash("sha256").update(e).digest())}function Jn(e){const t=process.platform==="darwin"?"open":process.platform==="win32"?"start":"xdg-open";Ie.exec(`${t} ${JSON.stringify(e)}`)}const Fn=`<!DOCTYPE html><html><body style="font-family:system-ui;display:flex;justify-content:center;align-items:center;height:100vh;margin:0">
8
+ <div style="text-align:center"><h1>Login successful</h1><p>You can close this tab.</p></div></body></html>`,S=e=>`<!DOCTYPE html><html><body style="font-family:system-ui;display:flex;justify-content:center;align-items:center;height:100vh;margin:0">
9
+ <div style="text-align:center"><h1>Login failed</h1><p>${e}</p></div></body></html>`;async function Hn(e,t){const{tokenEndpoint:n}=ue[e],r=await fetch(n,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"refresh_token",client_id:P,refresh_token:t})});if(!r.ok){const a=await r.text();throw new Error(`Token refresh failed: ${r.status} ${a}`)}const s=await r.json();if(!s.access_token)throw new Error("No access_token in refresh response");return{access_token:s.access_token,refresh_token:s.refresh_token}}function zn(e){const{authEndpoint:t,tokenEndpoint:n}=ue[e],r=xn(),s=jn(r),a=j(G.randomBytes(16));return new Promise((i,o)=>{const c=ve.createServer(async(y,w)=>{if(!y.url?.startsWith("/callback")){w.writeHead(404),w.end();return}const $=new URL(y.url,"http://localhost").searchParams,J=$.get("code"),ge=$.get("state"),C=$.get("error");if(C){w.writeHead(200,{"Content-Type":"text/html"}),w.end(S($.get("error_description")||C)),g(),o(new Error($.get("error_description")||C));return}if(ge!==a){w.writeHead(200,{"Content-Type":"text/html"}),w.end(S("State mismatch")),g(),o(new Error("State mismatch — possible CSRF attack"));return}if(!J){w.writeHead(200,{"Content-Type":"text/html"}),w.end(S("No authorization code received")),g(),o(new Error("No authorization code received"));return}try{const D=await fetch(n,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"authorization_code",client_id:P,redirect_uri:Q,code:J,code_verifier:r})});if(!D.ok){const me=await D.text();throw new Error(`Token exchange failed: ${D.status} ${me}`)}const F=await D.json(),H=F.access_token;if(!H)throw new Error("No access_token in token response");w.writeHead(200,{"Content-Type":"text/html"}),w.end(Fn),g(),i({access_token:H,refresh_token:F.refresh_token})}catch(D){w.writeHead(200,{"Content-Type":"text/html"}),w.end(S(D.message)),g(),o(D)}}),u=setTimeout(()=>{g(),o(new Error("Login timed out after 2 minutes"))},Nn);function g(){clearTimeout(u),c.close()}c.listen(19836,()=>{const y=`${t}?`+new URLSearchParams({client_id:P,redirect_uri:Q,response_type:"code",scope:"openid offline_access",state:a,code_challenge:s,code_challenge_method:"S256"}).toString();process.stderr.write(`Opening browser for login...
10
+ `),Jn(y)}),c.on("error",y=>{g(),o(new Error(`Could not start local server: ${y.message}`))})})}const B=be.createRequire(typeof document>"u"?require("url").pathToFileURL(__filename).href:document.currentScript&&document.currentScript.src||new URL("cli.cjs",document.baseURI).href),{version:Kn}=B("../package.json"),Vn=`ec.fdk <command> [options]
11
11
 
12
12
  Commands:
13
13
  login Login via browser (OIDC). Use --password for email/password prompt.
14
14
  logout Logout and remove stored token
15
15
  whoami Show current logged-in user
16
16
  install-skill Install Claude Code skill (default: ~/.claude/skills, or --dir <path>)
17
+ update Self-update ec.fdk and re-install skill
17
18
 
18
19
  Entry commands (require --dm, --model):
19
20
  entryList List entries
@@ -103,39 +104,43 @@ Options:
103
104
  -s, --size <n> Page size for list
104
105
  -p, --page <n> Page number for list
105
106
  --sort <field> Sort field for list
107
+ --fields <f1,f2> Only return specific fields (comma-separated)
106
108
  -f, --filter <k=v> Filter for list (repeatable, e.g. -f title~=hello -f ageFrom=5)
109
+ Use -f "field=" for null, -f "field!=" for not null
107
110
  --raw Include _links and _embedded in output
108
111
  --md Output entries as readable markdown
109
112
  -v, --version Show version
110
113
  --password Use email/password login instead of browser
111
- -h, --help Show help`;function S(e){return Object.fromEntries(e.map(t=>{const n=t.indexOf("=");return n===-1&&f(`Invalid filter: "${t}" (expected key=value)`),[t.slice(0,n),t.slice(n+1)]}))}function f(e){process.stderr.write(`Error: ${e}
112
- `),process.exit(2)}function Yn(){return new Promise(e=>{let t="";process.stdin.setEncoding("utf-8"),process.stdin.on("data",n=>t+=n),process.stdin.on("end",()=>e(t))})}async function k(e){if(e)try{return JSON.parse(e)}catch{f("--data must be valid JSON")}if(!process.stdin.isTTY){const t=await Yn();t.trim()||f("No data provided via stdin");try{return JSON.parse(t)}catch{f("Stdin must be valid JSON")}}f("Provide --data or pipe JSON via stdin")}function v(e){if(!e||typeof e!="object")return e;const{_links:t,_embedded:n,...r}=e;return r}function _(e){return!e||typeof e!="object"?e:Array.isArray(e.items)?{...e,items:e.items.map(v)}:v(e)}const Q=40;function Z(e){return e.length>Q?e.slice(0,Q-2)+"..":e}function le(e){return e==null?"":Z(typeof e=="object"?JSON.stringify(e):String(e))}function fe(e){return Object.keys(e).filter(t=>!t.startsWith("_"))}function O(e,t){return"| "+e.map((n,r)=>n.padEnd(t[r])).join(" | ")+" |"}function Wn(e){const t=fe(e),n=t.map(u=>le(e[u])),r=Math.max(5,...t.map(u=>u.length)),o=Math.max(5,...n.map(u=>u.length)),a=[r,o],i=O(["Field","Value"],a),s="| "+a.map(u=>"-".repeat(u)).join(" | ")+" |",c=t.map((u,m)=>O([u,n[m]],a));return`${i}
113
- ${s}
114
+ -h, --help Show help`;function _(e){return Object.fromEntries(e.map(t=>{const n=t.indexOf("=");return n===-1&&l(`Invalid filter: "${t}" (expected key=value)`),[t.slice(0,n),t.slice(n+1)]}))}function l(e){process.stderr.write(`Error: ${e}
115
+ `),process.exit(2)}function Yn(){return new Promise(e=>{let t="";process.stdin.setEncoding("utf-8"),process.stdin.on("data",n=>t+=n),process.stdin.on("end",()=>e(t))})}async function k(e){if(e)try{return JSON.parse(e)}catch{l("--data must be valid JSON")}if(!process.stdin.isTTY){const t=await Yn();t.trim()||l("No data provided via stdin");try{return JSON.parse(t)}catch{l("Stdin must be valid JSON")}}l("Provide --data or pipe JSON via stdin")}function I(e){if(!e||typeof e!="object")return e;const{_links:t,_embedded:n,...r}=e;return r}function q(e){return!e||typeof e!="object"?e:Array.isArray(e.items)?{...e,items:e.items.map(I)}:I(e)}const Z=40;function ee(e){return e.length>Z?e.slice(0,Z-2)+"..":e}function le(e){return e==null?"":ee(typeof e=="object"?JSON.stringify(e):String(e))}function fe(e){return Object.keys(e).filter(t=>!t.startsWith("_"))}function L(e,t){return"| "+e.map((n,r)=>n.padEnd(t[r])).join(" | ")+" |"}function Wn(e){const t=fe(e),n=t.map(u=>le(e[u])),r=Math.max(5,...t.map(u=>u.length)),s=Math.max(5,...n.map(u=>u.length)),a=[r,s],i=L(["Field","Value"],a),o="| "+a.map(u=>"-".repeat(u)).join(" | ")+" |",c=t.map((u,g)=>L([u,n[g]],a));return`${i}
116
+ ${o}
114
117
  ${c.join(`
115
- `)}`}function Xn(e){if(!e.items.length)return"No entries found.";const t=fe(e.items[0]),n=e.items.map(s=>t.map(c=>le(s[c]))),r=t.map((s,c)=>Math.max(s.length,...n.map(u=>u[c].length))),o=O(t,r),a="| "+r.map(s=>"-".repeat(s)).join(" | ")+" |",i=n.map(s=>O(s,r));return`${o}
118
+ `)}`}function Xn(e){if(!e.items.length)return"No entries found.";const t=fe(e.items[0]),n=e.items.map(o=>t.map(c=>le(o[c]))),r=t.map((o,c)=>Math.max(o.length,...n.map(u=>u[c].length))),s=L(t,r),a="| "+r.map(o=>"-".repeat(o)).join(" | ")+" |",i=n.map(o=>L(o,r));return`${s}
116
119
  ${a}
117
120
  ${i.join(`
118
121
  `)}
119
122
 
120
- ${e.items.length} of ${e.total} entries`}async function Qn(){const{values:e,positionals:t}=Te.parseArgs({allowPositionals:!0,options:{env:{type:"string",short:"e",default:"stage"},dm:{type:"string",short:"d"},model:{type:"string",short:"m"},id:{type:"string",short:"i"},data:{type:"string"},size:{type:"string",short:"s"},page:{type:"string",short:"p"},sort:{type:"string"},filter:{type:"string",short:"f",multiple:!0,default:[]},rid:{type:"string"},"account-id":{type:"string"},assetgroup:{type:"string"},resource:{type:"string"},subdomain:{type:"string"},raw:{type:"boolean",default:!1},md:{type:"boolean",default:!1},password:{type:"boolean",default:!1},dir:{type:"string"},version:{type:"boolean",short:"v"},help:{type:"boolean",short:"h"}}});e.version&&(console.log(Kn),process.exit(0)),(e.help||t.length===0)&&(console.log(Vn),process.exit(0));const n=t[0],r=e.env;r!=="stage"&&r!=="live"&&f('--env must be "stage" or "live"');const o=new N({env:r,storageAdapter:$});if(n!=="login"&&n!=="logout"){const a=o.getEcToken(),i=$.get(`${r}_refresh`);if(a&&i)try{const s=JSON.parse(Buffer.from(a.split(".")[1],"base64url").toString());if(s.exp&&s.exp*1e3<Date.now()){const c=await Hn(r,i);o.setEcToken(c.access_token),c.refresh_token&&$.set(`${r}_refresh`,c.refresh_token)}}catch{}}if(n==="login"){try{if(e.password){const a=await Bn("Email: "),i=await Gn("Password: ");await o.loginEc({email:a,password:i})}else{const a=await zn(r);o.setEcToken(a.access_token),a.refresh_token&&$.set(`${r}_refresh`,a.refresh_token)}process.stderr.write(`Logged in to ${r} successfully.
123
+ ${e.items.length} of ${e.total} entries`}async function Qn(){const{values:e,positionals:t}=Te.parseArgs({allowPositionals:!0,options:{env:{type:"string",short:"e",default:"stage"},dm:{type:"string",short:"d"},model:{type:"string",short:"m"},id:{type:"string",short:"i"},data:{type:"string"},size:{type:"string",short:"s"},page:{type:"string",short:"p"},sort:{type:"string"},filter:{type:"string",short:"f",multiple:!0,default:[]},fields:{type:"string"},rid:{type:"string"},"account-id":{type:"string"},assetgroup:{type:"string"},resource:{type:"string"},subdomain:{type:"string"},raw:{type:"boolean",default:!1},md:{type:"boolean",default:!1},password:{type:"boolean",default:!1},dir:{type:"string"},version:{type:"boolean",short:"v"},help:{type:"boolean",short:"h"}}});e.version&&(console.log(Kn),process.exit(0)),(e.help||t.length===0)&&(console.log(Vn),process.exit(0));const n=t[0],r=e.env;r!=="stage"&&r!=="live"&&l('--env must be "stage" or "live"');const s=new x({env:r,storageAdapter:T});if(n!=="login"&&n!=="logout"){const a=s.getEcToken(),i=T.get(`${r}_refresh`);if(a&&i)try{const o=JSON.parse(Buffer.from(a.split(".")[1],"base64url").toString());if(o.exp&&o.exp*1e3<Date.now()){const c=await Hn(r,i);s.setEcToken(c.access_token),c.refresh_token&&T.set(`${r}_refresh`,c.refresh_token)}}catch{}}if(n==="login"){try{if(e.password){const a=await Bn("Email: "),i=await Gn("Password: ");await s.loginEc({email:a,password:i})}else{const a=await zn(r);s.setEcToken(a.access_token),a.refresh_token&&T.set(`${r}_refresh`,a.refresh_token)}process.stderr.write(`Logged in to ${r} successfully.
121
124
  `)}catch(a){process.stderr.write(`Login failed: ${a.message}
122
- `),process.exit(1)}return}if(n==="whoami"){const a=o.getEcToken();a||(process.stderr.write(`Not logged in to ${r}.
123
- `),process.exit(1));try{const i=JSON.parse(Buffer.from(a.split(".")[1],"base64url").toString()),s={env:r};i.email&&(s.email=i.email),i.sub&&(s.accountID=i.sub),i.iss&&(s.issuer=i.iss),i.exp&&(s.expires=new Date(i.exp*1e3).toISOString()),process.stdout.write(JSON.stringify(s,null,2)+`
124
- `)}catch{f("Could not decode token")}return}if(n==="install-skill"){const{mkdirSync:a,copyFileSync:i}=await import("node:fs"),{join:s,resolve:c}=await import("node:path"),{homedir:u}=await import("node:os"),m=e.dir?c(e.dir):s(u(),".claude"),y=s(m,"skills","ec-fdk"),w=ue.resolve("../skill/SKILL.md");a(y,{recursive:!0}),i(w,s(y,"SKILL.md")),process.stderr.write(`Installed skill to ${y}/SKILL.md
125
- `);return}if(n==="logout"){try{o.hasEcToken()&&await o.logoutEc()}catch{}o.removeEcToken(),$.remove(`${r}_refresh`),process.stderr.write(`Logged out of ${r}.
126
- `);return}try{let a;const i=()=>{const s={...S(e.filter)};return e.size&&(s.size=Number(e.size)),e.page&&(s.page=Number(e.page)),e.sort&&(s.sort=[e.sort]),s};switch(n){case"dmList":{a=await o.dmList(i()),e.raw||(a=_(a));break}case"modelList":{e.id||f("--id (datamanager UUID) is required for modelList"),a=await o.dmID(e.id).modelList(i()),e.raw||(a=_(a));break}case"getDatamanager":{e.id||f("--id (datamanager UUID) is required for getDatamanager"),a=await o.getDatamanager(e.id),e.raw||(a=_(a));break}case"resourceList":{e.resource||f("--resource is required for resourceList");let s=o.resource(e.resource);e.subdomain&&(s=s.subdomain(e.subdomain)),a=await s.resourceList(i()),e.raw||(a=_(a));break}case"resourceGet":{e.resource||f("--resource is required for resourceGet");let s=o.resource(e.resource);e.subdomain&&(s=s.subdomain(e.subdomain)),a=await s.resourceGet(S(e.filter)),e.raw||(a=v(a));break}case"resourceEdit":{e.resource||f("--resource is required for resourceEdit");let s=o.resource(e.resource);e.subdomain&&(s=s.subdomain(e.subdomain));const c=await k(e.data);if(a=await s.resourceEdit(S(e.filter),c),!a){process.stderr.write(`Resource updated.
127
- `);return}e.raw||(a=v(a));break}case"resourceDelete":{e.resource||f("--resource is required for resourceDelete");let s=o.resource(e.resource);e.subdomain&&(s=s.subdomain(e.subdomain)),await s.resourceDelete(S(e.filter)),process.stderr.write(`Resource deleted.
128
- `);return}case"getStats":{a=await o.getStats(i());break}case"getHistory":{a=await o.getHistory(i());break}case"entryList":case"getEntry":case"createEntry":case"editEntry":case"deleteEntry":case"getSchema":{e.dm||f("--dm is required"),e.model||f("--model is required");const s=o.dm(e.dm).model(e.model).clean(!e.raw);switch(n){case"entryList":{a=await s.entryList(i());break}case"getEntry":{e.id||f("--id is required for getEntry"),a=await s.getEntry(e.id);break}case"createEntry":{const c=await k(e.data);a=await s.createEntry(c);break}case"editEntry":{e.id||f("--id is required for editEntry");const c=await k(e.data);a=await s.editEntry(e.id,c);break}case"deleteEntry":{e.id||f("--id is required for deleteEntry"),await s.deleteEntry(e.id),process.stderr.write(`Entry deleted.
129
- `);return}case"getSchema":{a=await s.getSchema();break}}break}case"createDatamanager":{const s=await k(e.data);a=await o.createDatamanager(s);break}case"editDatamanager":{e.id||f("--id (datamanager UUID) is required for editDatamanager");const s=await k(e.data);a=await o.editDatamanager(e.id,s);break}case"deleteDatamanager":{e.id||f("--id (datamanager UUID) is required for deleteDatamanager"),await o.deleteDatamanager(e.id),process.stderr.write(`Datamanager deleted.
130
- `);return}case"createModel":{e.id||f("--id (datamanager UUID) is required for createModel");const s=await k(e.data);a=await o.dmID(e.id).createModel(s);break}case"editModel":{e.id||f("--id (datamanager UUID) is required for editModel"),e.rid||f("--rid (model ID) is required for editModel");const s=await k(e.data);a=await o.dmID(e.id).editModel(e.rid,s);break}case"deleteModel":{e.id||f("--id (datamanager UUID) is required for deleteModel"),e.rid||f("--rid (model ID) is required for deleteModel"),await o.dmID(e.id).deleteModel(e.rid),process.stderr.write(`Model deleted.
131
- `);return}case"createTemplate":{const s=await k(e.data);a=await o.createTemplate(s);break}case"createAssetGroup":{e.id||f("--id (datamanager UUID) is required for createAssetGroup");const s=await k(e.data);a=await o.dmID(e.id).createAssetGroup(s);break}case"editAssetGroup":{e.id||f("--id (datamanager UUID) is required for editAssetGroup"),e.rid||f("--rid (asset group ID) is required for editAssetGroup");const s=await k(e.data);a=await o.dmID(e.id).editAssetGroup(e.rid,s);break}case"editAsset":{e.dm||f("--dm (short ID) is required for editAsset"),e.assetgroup||f("--assetgroup is required for editAsset"),e.rid||f("--rid (asset ID) is required for editAsset");const s=await k(e.data);a=await o.dm(e.dm).assetGroup(e.assetgroup).editAsset(e.rid,s);break}case"editDmClient":{e.id||f("--id (datamanager UUID) is required for editDmClient"),e.rid||f("--rid (client ID) is required for editDmClient");const s=await k(e.data);a=await o.dmID(e.id).editDmClient(e.rid,s);break}case"createRole":{e.id||f("--id (datamanager UUID) is required for createRole");const s=await k(e.data);a=await o.dmID(e.id).createRole(s);break}case"editRole":{e.id||f("--id (datamanager UUID) is required for editRole"),e.rid||f("--rid (role ID) is required for editRole");const s=await k(e.data);a=await o.dmID(e.id).editRole(e.rid,s);break}case"deleteRole":{e.id||f("--id (datamanager UUID) is required for deleteRole"),e.rid||f("--rid (role ID) is required for deleteRole"),await o.dmID(e.id).deleteRole(e.rid),process.stderr.write(`Role deleted.
132
- `);return}case"editDmAccount":{e.id||f("--id (datamanager UUID) is required for editDmAccount"),e["account-id"]||f("--account-id is required for editDmAccount");const s=await k(e.data);a=await o.dmID(e.id).editDmAccount(e["account-id"],s);break}case"deleteDmAccount":{e.id||f("--id (datamanager UUID) is required for deleteDmAccount"),e["account-id"]||f("--account-id is required for deleteDmAccount"),await o.dmID(e.id).deleteDmAccount(e["account-id"]),process.stderr.write(`DM account deleted.
133
- `);return}case"createAccountClient":{const s=await k(e.data);a=await o.createAccountClient(s);break}case"editAccountClient":{e.rid||f("--rid (client ID) is required for editAccountClient");const s=await k(e.data);a=await o.editAccountClient(e.rid,s);break}case"deleteAccountClient":{e.rid||f("--rid (client ID) is required for deleteAccountClient"),await o.deleteAccountClient(e.rid),process.stderr.write(`Account client deleted.
134
- `);return}case"createGroup":{const s=await k(e.data);a=await o.createGroup(s);break}case"editGroup":{e.rid||f("--rid (group ID) is required for editGroup");const s=await k(e.data);a=await o.editGroup(e.rid,s);break}case"deleteGroup":{e.rid||f("--rid (group ID) is required for deleteGroup"),await o.deleteGroup(e.rid),process.stderr.write(`Group deleted.
135
- `);return}case"createInvite":{const s=await k(e.data);a=await o.createInvite(s);break}case"editInvite":{e.rid||f("--rid (invite ID) is required for editInvite");const s=await k(e.data);a=await o.editInvite(e.rid,s);break}case"deleteInvite":{e.rid||f("--rid (invite ID) is required for deleteInvite"),await o.deleteInvite(e.rid),process.stderr.write(`Invite deleted.
136
- `);return}case"editAccount":{e["account-id"]||f("--account-id is required for editAccount");const s=await k(e.data);if(a=await o.editAccount(e["account-id"],s),!a){process.stderr.write(`Account updated.
137
- `);return}break}case"listTokens":{e["account-id"]||f("--account-id is required for listTokens");const s=await o.listTokens(e["account-id"]);a=e.raw?s:s.map(v);break}case"createToken":{e["account-id"]||f("--account-id is required for createToken"),a=await o.createToken(e["account-id"]);break}case"deleteToken":{e["account-id"]||f("--account-id is required for deleteToken"),e.rid||f("--rid (access token ID) is required for deleteToken"),await o.deleteToken(e["account-id"],e.rid),process.stderr.write(`Token deleted.
138
- `);return}default:f(`Unknown command: ${n}`)}e.md&&a&&typeof a=="object"?Array.isArray(a.items)?process.stdout.write(Xn(a)+`
125
+ `),process.exit(1)}return}if(n==="whoami"){const a=s.getEcToken();a||(process.stderr.write(`Not logged in to ${r}.
126
+ `),process.exit(1));try{const i=JSON.parse(Buffer.from(a.split(".")[1],"base64url").toString()),o={env:r};i.email&&(o.email=i.email),i.sub&&(o.accountID=i.sub),i.iss&&(o.issuer=i.iss),i.exp&&(o.expires=new Date(i.exp*1e3).toISOString()),process.stdout.write(JSON.stringify(o,null,2)+`
127
+ `)}catch{l("Could not decode token")}return}if(n==="install-skill"){const{mkdirSync:a,copyFileSync:i}=await import("node:fs"),{join:o,resolve:c}=await import("node:path"),{homedir:u}=await import("node:os"),g=e.dir?c(e.dir):o(u(),".claude"),y=o(g,"skills","ec-fdk"),w=B.resolve("../skill/SKILL.md");a(y,{recursive:!0}),i(w,o(y,"SKILL.md")),T.set("skill_path",y),process.stderr.write(`Installed skill to ${y}/SKILL.md
128
+ `);return}if(n==="update"){const{execSync:a}=await import("node:child_process");process.stderr.write(`Updating ec.fdk...
129
+ `);try{a("npm i -g ec.fdk@latest",{stdio:"inherit"})}catch{l("Failed to update ec.fdk")}const i=T.get("skill_path");if(i){const{mkdirSync:o,copyFileSync:c}=await import("node:fs"),{join:u}=await import("node:path"),g=B.resolve("../skill/SKILL.md");o(i,{recursive:!0}),c(g,u(i,"SKILL.md")),process.stderr.write(`Updated skill at ${i}/SKILL.md
130
+ `)}return}if(n==="logout"){try{s.hasEcToken()&&await s.logoutEc()}catch{}s.removeEcToken(),T.remove(`${r}_refresh`),process.stderr.write(`Logged out of ${r}.
131
+ `);return}try{let a;const i=()=>{const o={..._(e.filter)};return e.size&&(o.size=Number(e.size)),e.page&&(o.page=Number(e.page)),e.sort&&(o.sort=[e.sort]),e.fields&&(o._fields=e.fields),o};switch(n){case"dmList":{a=await s.dmList(i()),e.raw||(a=q(a));break}case"modelList":{e.id||l("--id (datamanager UUID) is required for modelList"),a=await s.dmID(e.id).modelList(i()),e.raw||(a=q(a));break}case"getDatamanager":{e.id||l("--id (datamanager UUID) is required for getDatamanager"),a=await s.getDatamanager(e.id),e.raw||(a=q(a));break}case"resourceList":{e.resource||l("--resource is required for resourceList");let o=s.resource(e.resource);e.subdomain&&(o=o.subdomain(e.subdomain)),a=await o.resourceList(i()),e.raw||(a=q(a));break}case"resourceGet":{e.resource||l("--resource is required for resourceGet");let o=s.resource(e.resource);e.subdomain&&(o=o.subdomain(e.subdomain)),a=await o.resourceGet(_(e.filter)),e.raw||(a=I(a));break}case"resourceEdit":{e.resource||l("--resource is required for resourceEdit");let o=s.resource(e.resource);e.subdomain&&(o=o.subdomain(e.subdomain));const c=await k(e.data);if(a=await o.resourceEdit(_(e.filter),c),!a){process.stderr.write(`Resource updated.
132
+ `);return}e.raw||(a=I(a));break}case"resourceDelete":{e.resource||l("--resource is required for resourceDelete");let o=s.resource(e.resource);e.subdomain&&(o=o.subdomain(e.subdomain)),await o.resourceDelete(_(e.filter)),process.stderr.write(`Resource deleted.
133
+ `);return}case"getStats":{a=await s.getStats(i());break}case"getHistory":{a=await s.getHistory(i());break}case"entryList":case"getEntry":case"createEntry":case"editEntry":case"deleteEntry":case"getSchema":{e.dm||l("--dm is required"),e.model||l("--model is required");const o=s.dm(e.dm).model(e.model).clean(!e.raw);switch(n){case"entryList":{a=await o.entryList(i());break}case"getEntry":{e.id||l("--id is required for getEntry"),a=await o.getEntry(e.id);break}case"createEntry":{const c=await k(e.data);a=await o.createEntry(c);break}case"editEntry":{e.id||l("--id is required for editEntry");const c=await k(e.data);a=await o.editEntry(e.id,c);break}case"deleteEntry":{e.id||l("--id is required for deleteEntry"),await o.deleteEntry(e.id),process.stderr.write(`Entry deleted.
134
+ `);return}case"getSchema":{a=await o.getSchema();break}}break}case"createDatamanager":{const o=await k(e.data);a=await s.createDatamanager(o);break}case"editDatamanager":{e.id||l("--id (datamanager UUID) is required for editDatamanager");const o=await k(e.data);a=await s.editDatamanager(e.id,o);break}case"deleteDatamanager":{e.id||l("--id (datamanager UUID) is required for deleteDatamanager"),await s.deleteDatamanager(e.id),process.stderr.write(`Datamanager deleted.
135
+ `);return}case"createModel":{e.id||l("--id (datamanager UUID) is required for createModel");const o=await k(e.data);a=await s.dmID(e.id).createModel(o);break}case"editModel":{e.id||l("--id (datamanager UUID) is required for editModel"),e.rid||l("--rid (model ID) is required for editModel");const o=await k(e.data);a=await s.dmID(e.id).editModel(e.rid,o);break}case"deleteModel":{e.id||l("--id (datamanager UUID) is required for deleteModel"),e.rid||l("--rid (model ID) is required for deleteModel"),await s.dmID(e.id).deleteModel(e.rid),process.stderr.write(`Model deleted.
136
+ `);return}case"createTemplate":{const o=await k(e.data);a=await s.createTemplate(o);break}case"createAssetGroup":{e.id||l("--id (datamanager UUID) is required for createAssetGroup");const o=await k(e.data);a=await s.dmID(e.id).createAssetGroup(o);break}case"editAssetGroup":{e.id||l("--id (datamanager UUID) is required for editAssetGroup"),e.rid||l("--rid (asset group ID) is required for editAssetGroup");const o=await k(e.data);a=await s.dmID(e.id).editAssetGroup(e.rid,o);break}case"editAsset":{e.dm||l("--dm (short ID) is required for editAsset"),e.assetgroup||l("--assetgroup is required for editAsset"),e.rid||l("--rid (asset ID) is required for editAsset");const o=await k(e.data);a=await s.dm(e.dm).assetGroup(e.assetgroup).editAsset(e.rid,o);break}case"editDmClient":{e.id||l("--id (datamanager UUID) is required for editDmClient"),e.rid||l("--rid (client ID) is required for editDmClient");const o=await k(e.data);a=await s.dmID(e.id).editDmClient(e.rid,o);break}case"createRole":{e.id||l("--id (datamanager UUID) is required for createRole");const o=await k(e.data);a=await s.dmID(e.id).createRole(o);break}case"editRole":{e.id||l("--id (datamanager UUID) is required for editRole"),e.rid||l("--rid (role ID) is required for editRole");const o=await k(e.data);a=await s.dmID(e.id).editRole(e.rid,o);break}case"deleteRole":{e.id||l("--id (datamanager UUID) is required for deleteRole"),e.rid||l("--rid (role ID) is required for deleteRole"),await s.dmID(e.id).deleteRole(e.rid),process.stderr.write(`Role deleted.
137
+ `);return}case"editDmAccount":{e.id||l("--id (datamanager UUID) is required for editDmAccount"),e["account-id"]||l("--account-id is required for editDmAccount");const o=await k(e.data);a=await s.dmID(e.id).editDmAccount(e["account-id"],o);break}case"deleteDmAccount":{e.id||l("--id (datamanager UUID) is required for deleteDmAccount"),e["account-id"]||l("--account-id is required for deleteDmAccount"),await s.dmID(e.id).deleteDmAccount(e["account-id"]),process.stderr.write(`DM account deleted.
138
+ `);return}case"createAccountClient":{const o=await k(e.data);a=await s.createAccountClient(o);break}case"editAccountClient":{e.rid||l("--rid (client ID) is required for editAccountClient");const o=await k(e.data);a=await s.editAccountClient(e.rid,o);break}case"deleteAccountClient":{e.rid||l("--rid (client ID) is required for deleteAccountClient"),await s.deleteAccountClient(e.rid),process.stderr.write(`Account client deleted.
139
+ `);return}case"createGroup":{const o=await k(e.data);a=await s.createGroup(o);break}case"editGroup":{e.rid||l("--rid (group ID) is required for editGroup");const o=await k(e.data);a=await s.editGroup(e.rid,o);break}case"deleteGroup":{e.rid||l("--rid (group ID) is required for deleteGroup"),await s.deleteGroup(e.rid),process.stderr.write(`Group deleted.
140
+ `);return}case"createInvite":{const o=await k(e.data);a=await s.createInvite(o);break}case"editInvite":{e.rid||l("--rid (invite ID) is required for editInvite");const o=await k(e.data);a=await s.editInvite(e.rid,o);break}case"deleteInvite":{e.rid||l("--rid (invite ID) is required for deleteInvite"),await s.deleteInvite(e.rid),process.stderr.write(`Invite deleted.
141
+ `);return}case"editAccount":{e["account-id"]||l("--account-id is required for editAccount");const o=await k(e.data);if(a=await s.editAccount(e["account-id"],o),!a){process.stderr.write(`Account updated.
142
+ `);return}break}case"listTokens":{e["account-id"]||l("--account-id is required for listTokens");const o=await s.listTokens(e["account-id"]);a=e.raw?o:o.map(I);break}case"createToken":{e["account-id"]||l("--account-id is required for createToken"),a=await s.createToken(e["account-id"]);break}case"deleteToken":{e["account-id"]||l("--account-id is required for deleteToken"),e.rid||l("--rid (access token ID) is required for deleteToken"),await s.deleteToken(e["account-id"],e.rid),process.stderr.write(`Token deleted.
143
+ `);return}default:l(`Unknown command: ${n}`)}e.md&&a&&typeof a=="object"?Array.isArray(a.items)?process.stdout.write(Xn(a)+`
139
144
  `):process.stdout.write(Wn(a)+`
140
145
  `):process.stdout.write(JSON.stringify(a,null,2)+`
141
146
  `)}catch(a){process.stderr.write(`${a.message}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ec.fdk",
3
- "version": "0.9.5",
3
+ "version": "0.9.7",
4
4
  "description": "ec frontend sdk",
5
5
  "main": "dist/index.cjs",
6
6
  "bin": {
package/skill/SKILL.md CHANGED
@@ -19,6 +19,13 @@ ec.fdk entryList -d <shortID> -m <model> --sort=-_created -s 1
19
19
  # List entries with filters
20
20
  ec.fdk entryList -d <shortID> -m <model> -f name~=chocolate -f createdFrom=2024-01-01
21
21
 
22
+ # List entries with only specific fields (reduces response size)
23
+ ec.fdk entryList -d <shortID> -m <model> --fields name,created,id
24
+
25
+ # Filter for null / not null
26
+ ec.fdk entryList -d <shortID> -m <model> -f "photo=" # photo is null/empty
27
+ ec.fdk entryList -d <shortID> -m <model> -f "photo!=" # photo is not null/empty
28
+
22
29
  # Get a single entry
23
30
  ec.fdk getEntry -d <shortID> -m <model> -i <entryID>
24
31
 
@@ -213,6 +220,7 @@ ec.fdk deleteToken --account-id <accountID> --rid <tokenID>
213
220
  | `logout` | — |
214
221
  | `whoami` | — |
215
222
  | `install-skill` | — (optional `--dir <path>`) |
223
+ | `update` | — |
216
224
 
217
225
  ## Options
218
226
 
@@ -231,6 +239,7 @@ ec.fdk deleteToken --account-id <accountID> --rid <tokenID>
231
239
  | `-s, --size` | Page size |
232
240
  | `-p, --page` | Page number |
233
241
  | `--sort` | Sort field (system fields: `_created`, `_modified`) |
242
+ | `--fields` | Only return specific fields (comma-separated) |
234
243
  | `-f, --filter` | Repeatable filter (`key=value`) |
235
244
  | `--password` | Use email/password login instead of browser OIDC |
236
245
  | `--dir` | Target directory for `install-skill` (default: `~/.claude`) |
@@ -245,6 +254,8 @@ Filters map to entrecode filter query params:
245
254
  - `From` — greater than / after: `-f createdFrom=2024-01-01`
246
255
  - `To` — less than / before: `-f createdTo=2025-01-01`
247
256
  - (none) — exact match: `-f title=HO`
257
+ - `=` (empty value) — is null/empty: `-f "photo="`
258
+ - `!=` (empty value) — is not null/empty: `-f "photo!="`
248
259
 
249
260
  ## Common Mistakes
250
261
 
@@ -285,6 +296,7 @@ When the user asks to "open" a resource, output the full editor URL. Use `open <
285
296
 
286
297
  ## Notes
287
298
 
299
+ - Prefer `--fields` over filtering fields with `jq` — `--fields` reduces the response on the server side
288
300
  - Status/error messages go to stderr, data goes to stdout — piping always works cleanly
289
301
  - `editDatamanager`, `editAccountClient`, and `editInvite` are full PUT operations — pass the complete resource
290
302
  - `--data` accepts JSON via flag or stdin pipe (e.g. `echo '{}' | ec.fdk createEntry ...`)