@hyperez/regna-code 0.1.2 → 0.1.4

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
@@ -44,7 +44,7 @@ For CI or scripted use, set `REGNA_API_KEY` directly; it takes priority over the
44
44
  |---|---|---|
45
45
  | `REGNA_API_KEY` | (none) | Regna API key. Optional once you have run `regna login`. When set, it overrides the stored credential (use for CI). |
46
46
  | `REGNA_BASE_URL` | `https://regnax.ai/v1` | Regna API base URL (OpenAI-compatible). Point this at a self-hosted endpoint for on-premise use. |
47
- | `REGNA_MODEL` | `regna/default` | Starting model pattern. |
47
+ | `REGNA_MODEL` | `regna/regna-pro` | Starting model. The cloud catalog is `regna-basic`, `regna-pro`, `regna-max`. |
48
48
  | `REGNA_CODER_MODEL` | (none) | Exact model id that `/regna-coder` selects. |
49
49
  | `REGNA_GENERAL_MODEL` | (none) | Exact model id that `/regna-general` selects. |
50
50
  | `REGNA_EXPOSE_ALIASES` | (unset) | `1` also exposes path-style (slash) model ids. Hidden by default. Ids pinned via `REGNA_MODEL`/`REGNA_CODER_MODEL`/`REGNA_GENERAL_MODEL` are always shown. |
@@ -93,7 +93,7 @@ The egress guard is a defense layer, not a hard sandbox. Enforce real boundaries
93
93
  |---|---|
94
94
  | `401 status code` | Re-authenticate: `regna login`. |
95
95
  | Headless run hangs | Close stdin: `regna -p ... < /dev/null`. |
96
- | Only `regna/default` shows | Run `regna login`, or check `REGNA_BASE_URL`, then `/reload`. |
96
+ | No Regna models show | Run `regna login`, or check `REGNA_BASE_URL`, then `/reload`. |
97
97
  | `[regna policy] blocked` | If legitimate, add `REGNA_ALLOW_HOSTS` or set `REGNA_POLICY=warn`/`off`. |
98
98
  | Missing extension/prompt, aborted | Reinstall. Fail-closed behavior is intentional. |
99
99
  | Runtime executable not found | Reinstall (`npm i -g @hyperez/regna-code`) or set `REGNA_ENGINE`. |
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{spawn as w}from"node:child_process";import{fileURLToPath as b}from"node:url";import{dirname as E,join as o}from"node:path";import{existsSync as l,readFileSync as y,writeFileSync as S,mkdirSync as k,unlinkSync as P,chmodSync as L}from"node:fs";import{homedir as G}from"node:os";import{createRequire as U}from"node:module";import{createInterface as $}from"node:readline/promises";var I=E(b(import.meta.url)),u=E(I),f=o(u,"extensions"),v=o(u,"themes","regna.json"),h=o(u,"APPEND_SYSTEM.md"),T="https://regnax.ai/v1",N=o(G(),".regna"),m=o(N,"auth.json"),a=process.argv.slice(2),g=(...e)=>a.some(t=>e.some(n=>!!(t===n||t.startsWith(`${n}=`)||/^-[a-z]$/i.test(n)&&t.startsWith(n)&&t.length>n.length)));function A(){for(let e of[o(u,"package.json"),o(u,"..","package.json")])try{let t=JSON.parse(y(e,"utf8")).version;if(t)return`v${t}`}catch{}return""}var C=`Regna Code ${A()} - a terminal coding agent on Regna
2
+ import{spawn as w}from"node:child_process";import{fileURLToPath as P}from"node:url";import{dirname as E,join as o}from"node:path";import{existsSync as l,readFileSync as A,writeFileSync as k,mkdirSync as N,unlinkSync as I,chmodSync as G}from"node:fs";import{homedir as L}from"node:os";import{createRequire as U}from"node:module";import{createInterface as $}from"node:readline/promises";var D=E(P(import.meta.url)),u=E(D),f=o(u,"extensions"),_=o(u,"themes","regna.json"),h=o(u,"APPEND_SYSTEM.md"),T="https://regnax.ai/v1",C="regna/regna-pro",R=o(L(),".regna"),m=o(R,"auth.json"),x=o(R,"engine"),a=process.argv.slice(2),g=(...e)=>a.some(r=>e.some(n=>!!(r===n||r.startsWith(`${n}=`)||/^-[a-z]$/i.test(n)&&r.startsWith(n)&&r.length>n.length)));function y(){for(let e of[o(u,"package.json"),o(u,"..","package.json")])try{let r=JSON.parse(A(e,"utf8")).version;if(r)return`v${r}`}catch{}return""}var O=`Regna Code ${y()} - a terminal coding agent on Regna
3
3
 
4
4
  Usage:
5
5
  regna [message...] start interactive, optionally with a first message
@@ -19,31 +19,31 @@ In-session commands:
19
19
  Environment:
20
20
  REGNA_API_KEY Regna API key (optional once logged in)
21
21
  REGNA_BASE_URL Regna API base URL (default https://regnax.ai/v1)
22
- REGNA_MODEL starting model (default regna/default)
22
+ REGNA_MODEL starting model (default regna/regna-pro)
23
23
  REGNA_POLICY network egress guard: off | warn | enforce
24
24
 
25
25
  Docs: https://github.com/HyperEZ/regna-code
26
- `;function R(){try{let e=JSON.parse(y(m,"utf8"));return e&&typeof e.apiKey=="string"?e:null}catch{return null}}function D(e,t){k(N,{recursive:!0}),S(m,`${JSON.stringify({apiKey:e,baseUrl:t},null,2)}
27
- `);try{L(m,384)}catch{}}function B(){try{return P(m),!0}catch{return!1}}function O(e){try{return`${new URL(e).origin}/console`}catch{return"https://regnax.ai/console"}}function j(e){try{let[t,n]=process.platform==="darwin"?["open",[e]]:process.platform==="win32"?["cmd",["/c","start","",e]]:["xdg-open",[e]];w(t,n,{stdio:"ignore",detached:!0}).unref()}catch{}}async function q(e,t){try{let n=new AbortController,s=setTimeout(()=>n.abort(),8e3),r=await fetch(`${e.replace(/\/+$/,"")}/models`,{headers:{Authorization:`Bearer ${t}`},signal:n.signal});return clearTimeout(s),r.status===401||r.status===403?"invalid":r.ok?"ok":"unknown"}catch{return"unknown"}}async function _(){let e=(process.env.REGNA_BASE_URL||"").trim()||R()?.baseUrl||T,t=O(e);process.stdout.write(`
28
- Regna Code ${A()}
26
+ `;function v(){try{let e=JSON.parse(A(m,"utf8"));return e&&typeof e.apiKey=="string"?e:null}catch{return null}}function B(e,r){N(R,{recursive:!0}),k(m,`${JSON.stringify({apiKey:e,baseUrl:r},null,2)}
27
+ `);try{G(m,384)}catch{}}function j(){try{return I(m),!0}catch{return!1}}function q(e){try{return`${new URL(e).origin}/console`}catch{return"https://regnax.ai/console"}}function F(e){try{let[r,n]=process.platform==="darwin"?["open",[e]]:process.platform==="win32"?["cmd",["/c","start","",e]]:["xdg-open",[e]];w(r,n,{stdio:"ignore",detached:!0}).unref()}catch{}}async function K(e,r){try{let n=new AbortController,s=setTimeout(()=>n.abort(),8e3),t=await fetch(`${e.replace(/\/+$/,"")}/models`,{headers:{Authorization:`Bearer ${r}`},signal:n.signal});return clearTimeout(s),t.status===401||t.status===403?"invalid":t.ok?"ok":"unknown"}catch{return"unknown"}}async function b(){let e=(process.env.REGNA_BASE_URL||"").trim()||v()?.baseUrl||T,r=q(e);process.stdout.write(`
28
+ Regna Code ${y()}
29
29
  Log in to continue.
30
30
 
31
- 1) Get an API key at ${t}
31
+ 1) Get an API key at ${r}
32
32
  2) Paste it below.
33
33
 
34
- `),j(t);let n=$({input:process.stdin,output:process.stdout}),s="";try{s=(await n.question(" API key: ")).trim()}finally{n.close()}s||(process.stderr.write(` No key entered. Aborting.
35
- `),process.exit(1));let r=await q(e,s);return r==="invalid"&&(process.stderr.write(` That key was rejected. Check it and run: regna login
36
- `),process.exit(1)),D(s,e),process.stdout.write(r==="ok"?` Logged in.
34
+ `),F(r);let n=$({input:process.stdin,output:process.stdout}),s="";try{s=(await n.question(" API key: ")).trim()}finally{n.close()}s||(process.stderr.write(` No key entered. Aborting.
35
+ `),process.exit(1));let t=await K(e,s);return t==="invalid"&&(process.stderr.write(` That key was rejected. Check it and run: regna login
36
+ `),process.exit(1)),B(s,e),process.stdout.write(t==="ok"?` Logged in.
37
37
 
38
38
  `:` Saved (could not verify right now).
39
39
 
40
- `),s}(g("--help","-h")||a[0]==="help")&&(process.stdout.write(C),process.exit(0));(g("--version")||a[0]==="version")&&(process.stdout.write(`Regna Code ${A()}
41
- `),process.exit(0));a[0]==="login"&&(await _(),process.exit(0));a[0]==="logout"&&(process.stdout.write(B()?`Logged out.
40
+ `),s}(g("--help","-h")||a[0]==="help")&&(process.stdout.write(O),process.exit(0));(g("--version")||a[0]==="version")&&(process.stdout.write(`Regna Code ${y()}
41
+ `),process.exit(0));a[0]==="login"&&(await b(),process.exit(0));a[0]==="logout"&&(process.stdout.write(j()?`Logged out.
42
42
  `:`Not logged in.
43
- `),process.exit(0));var d=(process.env.REGNA_API_KEY||"").trim();if(!d){let e=R();e?.apiKey&&(d=e.apiKey.trim(),!process.env.REGNA_BASE_URL&&e.baseUrl&&(process.env.REGNA_BASE_URL=e.baseUrl))}if(!d)if(process.stdin.isTTY&&process.stdout.isTTY){if(d=await _(),!process.env.REGNA_BASE_URL){let e=R();e?.baseUrl&&(process.env.REGNA_BASE_URL=e.baseUrl)}}else process.stderr.write(`[regna] Not logged in. Run: regna login
44
- `),process.exit(1);process.env.REGNA_API_KEY=d;var i=[],K=process.env.REGNA_DISCOVER==="1";if(!K){i.push("--no-extensions");let e=["provider","policy","branding","model","docs-search","docs-analysis"],t=r=>{let p=o(f,`${r}.js`);if(l(p))return p;let c=o(f,`${r}.ts`);return l(c)?c:null},n=e.map(r=>[r,t(r)]),s=n.filter(([,r])=>!r).map(([r])=>r);s.length>0&&(process.stderr.write(`[regna] Missing required extensions: ${s.join(", ")} (in ${f}). Install is corrupted. Aborting.
45
- `),process.exit(1));for(let[,r]of n)i.push("-e",r)}!g("--theme")&&l(v)&&i.push("--theme",v);g("--system-prompt")||(l(h)||(process.stderr.write(`[regna] Missing required prompt: APPEND_SYSTEM.md (${h}). Install is corrupted. Aborting.
43
+ `),process.exit(0));var d=(process.env.REGNA_API_KEY||"").trim();if(!d){let e=v();e?.apiKey&&(d=e.apiKey.trim(),!process.env.REGNA_BASE_URL&&e.baseUrl&&(process.env.REGNA_BASE_URL=e.baseUrl))}if(!d)if(process.stdin.isTTY&&process.stdout.isTTY){if(d=await b(),!process.env.REGNA_BASE_URL){let e=v();e?.baseUrl&&(process.env.REGNA_BASE_URL=e.baseUrl)}}else process.stderr.write(`[regna] Not logged in. Run: regna login
44
+ `),process.exit(1);process.env.REGNA_API_KEY=d;var i=[],Y=process.env.REGNA_DISCOVER==="1";if(!Y){i.push("--no-extensions");let e=["provider","policy","branding","model","docs-search","docs-analysis"],r=t=>{let p=o(f,`${t}.js`);if(l(p))return p;let c=o(f,`${t}.ts`);return l(c)?c:null},n=e.map(t=>[t,r(t)]),s=n.filter(([,t])=>!t).map(([t])=>t);s.length>0&&(process.stderr.write(`[regna] Missing required extensions: ${s.join(", ")} (in ${f}). Install is corrupted. Aborting.
45
+ `),process.exit(1));for(let[,t]of n)i.push("-e",t)}!g("--theme")&&l(_)&&i.push("--theme",_);g("--system-prompt")||(l(h)||(process.stderr.write(`[regna] Missing required prompt: APPEND_SYSTEM.md (${h}). Install is corrupted. Aborting.
46
46
  (To set the prompt yourself on purpose, run with --system-prompt.)
47
- `),process.exit(1)),i.push("--append-system-prompt",`@${h}`));g("--model","-m")||i.push("--model",process.env.REGNA_MODEL||"regna/default");i.push(...a);var Y={...process.env,PI_OFFLINE:"1"};function F(){let e=process.env.REGNA_ENGINE;if(e)return{cmd:e,prefix:[],label:e};try{let n=U(import.meta.url).resolve("@earendil-works/pi-coding-agent/package.json"),s=E(n),r=JSON.parse(y(n,"utf8")),p=typeof r.bin=="string"?r.bin:r.bin?.pi;if(p){let c=o(s,p);if(l(c))return{cmd:process.execPath,prefix:[c],label:c}}}catch{}return{cmd:"pi",prefix:[],label:"runtime (PATH)"}}var{cmd:M,prefix:H,label:z}=F(),x=w(M,[...H,...i],{stdio:"inherit",env:Y});x.on("error",e=>{e&&e.code==="ENOENT"&&(process.stderr.write(`[regna] Runtime executable not found (${z}). Reinstall (npm i -g @hyperez/regna-code) or set REGNA_ENGINE.
47
+ `),process.exit(1)),i.push("--append-system-prompt",`@${h}`));g("--model","-m")||i.push("--model",process.env.REGNA_MODEL||C);i.push(...a);try{N(x,{recursive:!0})}catch{}var M={...process.env,PI_OFFLINE:"1",PI_CODING_AGENT_DIR:x};function H(){let e=process.env.REGNA_ENGINE;if(e)return{cmd:e,prefix:[],label:e};try{let n=U(import.meta.url).resolve("@earendil-works/pi-coding-agent/package.json"),s=E(n),t=JSON.parse(A(n,"utf8")),p=typeof t.bin=="string"?t.bin:t.bin?.pi;if(p){let c=o(s,p);if(l(c))return{cmd:process.execPath,prefix:[c],label:c}}}catch{}return{cmd:"pi",prefix:[],label:"runtime (PATH)"}}var{cmd:z,prefix:J,label:V}=H(),S=w(z,[...J,...i],{stdio:"inherit",env:M});S.on("error",e=>{e&&e.code==="ENOENT"&&(process.stderr.write(`[regna] Runtime executable not found (${V}). Reinstall (npm i -g @hyperez/regna-code) or set REGNA_ENGINE.
48
48
  `),process.exit(127)),process.stderr.write(`[regna] Failed to start the runtime: ${e?.message??String(e)}
49
- `),process.exit(1)});x.on("exit",(e,t)=>{if(t){process.kill(process.pid,t);return}process.exit(e??0)});
49
+ `),process.exit(1)});S.on("exit",(e,r)=>{if(r){process.kill(process.pid,r);return}process.exit(e??0)});
@@ -1 +1 @@
1
- import{VERSION as c}from"@earendil-works/pi-coding-agent";import{truncateToWidth as f}from"@earendil-works/pi-tui";var _="Regna Code",d="Terminal coding agent on Regna",g="regna-brand",o=!0,m=[" ____ _____ ____ _ _ _","| _ \\| ____/ ___| \\ | | / \\","| |_) | _|| | _| \\| | / _ \\","| _ <| |__| |_| | |\\ |/ ___ \\","|_| \\_\\_____\\____|_| \\_/_/ \\_\\"],l=m.reduce((n,i)=>Math.max(n,i.length),0);function p(n,i,e,a){let t=s=>i(s,e);if(e<l+4)return["",t(` ${n("accent",_)}`),t(` ${n("muted",d)}`),t(` ${n("dim","/help for commands")}`),""];let r=[""];for(let s of m)r.push(t(` ${n("accent",s)}`));return r.push(""),r.push(t(` ${n("muted",`${_} \xB7 ${d}`)}`)),r.push(t(` ${n("dim","set REGNA_API_KEY, then /help for commands")}`)),r.push(""),r}function u(n){n.setHeader((i,e)=>({render(a){return p((t,r)=>e.fg(t,r),f,a,c)},invalidate(){}})),n.setStatus(g,_),n.setTitle(_)}function h(n){n.setHeader(void 0),n.setStatus(g,void 0)}function E(n){n.on("session_start",async(i,e)=>{e.mode!=="tui"||!o||u(e.ui)}),n.registerCommand("regna-brand",{description:"Toggle Regna Code header/title branding",handler:async(i,e)=>{o=!o,o?(u(e.ui),e.ui.notify("Regna branding on","info")):(h(e.ui),e.ui.notify("Regna branding off (default header)","info"))}})}export{p as buildBrandHeaderLines,E as default};
1
+ import{VERSION as c}from"@earendil-works/pi-coding-agent";import{truncateToWidth as f}from"@earendil-works/pi-tui";var _="Regna Code",d="Terminal coding agent on Regna",g="regna-brand",o=!0,m=[" ____ _____ ____ _ _ _","| _ \\| ____/ ___| \\ | | / \\","| |_) | _|| | _| \\| | / _ \\","| _ <| |__| |_| | |\\ |/ ___ \\","|_| \\_\\_____\\____|_| \\_/_/ \\_\\"],l=m.reduce((n,i)=>Math.max(n,i.length),0);function p(n,i,e,a){let t=s=>i(s,e);if(e<l+4)return["",t(` ${n("accent",_)}`),t(` ${n("muted",d)}`),t(` ${n("dim","/help for commands")}`),""];let r=[""];for(let s of m)r.push(t(` ${n("accent",s)}`));return r.push(""),r.push(t(` ${n("muted",`${_} \xB7 ${d}`)}`)),r.push(t(` ${n("dim","/help for commands")}`)),r.push(""),r}function u(n){n.setHeader((i,e)=>({render(a){return p((t,r)=>e.fg(t,r),f,a,c)},invalidate(){}})),n.setStatus(g,_),n.setTitle(_)}function h(n){n.setHeader(void 0),n.setStatus(g,void 0)}function x(n){n.on("session_start",async(i,e)=>{e.mode!=="tui"||!o||u(e.ui)}),n.registerCommand("regna-brand",{description:"Toggle Regna Code header/title branding",handler:async(i,e)=>{o=!o,o?(u(e.ui),e.ui.notify("Regna branding on","info")):(h(e.ui),e.ui.notify("Regna branding off (default header)","info"))}})}export{p as buildBrandHeaderLines,x as default};
@@ -1 +1 @@
1
- var l="regna";function g(n,c,i){if(n.length===0)return;if(i&&n.includes(i))return i;let d=(r,s)=>r.toLowerCase().includes(s),o=n.find(r=>d(r,"coder"));if(c==="coder")return o??(n.includes("default")?"default":n[0]);let e=n.find(r=>d(r,"instruct")&&!d(r,"coder"));return e||(n.includes("default")?"default":n.find(r=>r!==o)??n[0])}function m(n){let c={coder:process.env.REGNA_CODER_MODEL?.trim()||void 0,general:process.env.REGNA_GENERAL_MODEL?.trim()||void 0},i=!1,d=async(o,e)=>{let r=e.modelRegistry.getAll().filter(t=>t.provider===l).map(t=>t.id);if(r.length===0){e.ui.notify("No regna provider models. Check the provider extension and REGNA_API_KEY.","warning");return}let s=c[o];if(s&&!r.includes(s)){let t=o==="coder"?"REGNA_CODER_MODEL":"REGNA_GENERAL_MODEL";e.ui.notify(`${t}='${s}' is not in the registered list; ignoring. Available: ${r.join(", ")}`,"warning")}let a=g(r,o,s),f=a?e.modelRegistry.find(l,a):void 0;if(!f){e.ui.notify(`Could not find a ${o} model (${l}/${a??"?"}).`,"warning");return}if(i=!0,!await n.setModel(f))i=!1,e.ui.notify(`Switch failed (API key may be missing): ${l}/${a}`,"warning");else{let t=a==="default"?" (active model)":"";e.ui.notify(`Model set: ${l}/${a}${t}`,"info")}};n.registerCommand("regna-coder",{description:"Switch to a Regna coding model (/regna-coder)",handler:async(o,e)=>d("coder",e)}),n.registerCommand("regna-general",{description:"Switch to a Regna general model (/regna-general)",handler:async(o,e)=>d("general",e)}),n.on("model_select",async(o,e)=>{if(i){i=!1;return}o.source!=="restore"&&o.model.provider===l&&e.ui.notify(`Regna model: ${o.model.id}`,"info")})}export{m as default,g as pickRegnaModelId};
1
+ var l="regna",f={coder:["regna-max","regna-pro","regna-basic"],general:["regna-pro","regna-basic","regna-max"]};function u(r,c,i){if(r.length===0)return;if(i&&r.includes(i))return i;for(let n of f[c])if(r.includes(n))return n;let d=(n,s)=>n.toLowerCase().includes(s),o=r.find(n=>d(n,"coder"));if(c==="coder")return o??(r.includes("default")?"default":r[0]);let e=r.find(n=>d(n,"instruct")&&!d(n,"coder"));return e||(r.includes("default")?"default":r.find(n=>n!==o)??r[0])}function E(r){let c={coder:process.env.REGNA_CODER_MODEL?.trim()||void 0,general:process.env.REGNA_GENERAL_MODEL?.trim()||void 0},i=!1,d=async(o,e)=>{let n=e.modelRegistry.getAll().filter(t=>t.provider===l).map(t=>t.id);if(n.length===0){e.ui.notify("No regna provider models. Check the provider extension and REGNA_API_KEY.","warning");return}let s=c[o];if(s&&!n.includes(s)){let t=o==="coder"?"REGNA_CODER_MODEL":"REGNA_GENERAL_MODEL";e.ui.notify(`${t}='${s}' is not in the registered list; ignoring. Available: ${n.join(", ")}`,"warning")}let a=u(n,o,s),g=a?e.modelRegistry.find(l,a):void 0;if(!g){e.ui.notify(`Could not find a ${o} model (${l}/${a??"?"}).`,"warning");return}if(i=!0,!await r.setModel(g))i=!1,e.ui.notify(`Switch failed (API key may be missing): ${l}/${a}`,"warning");else{let t=a==="default"?" (active model)":"";e.ui.notify(`Model set: ${l}/${a}${t}`,"info")}};r.registerCommand("regna-coder",{description:"Switch to a Regna coding model (/regna-coder)",handler:async(o,e)=>d("coder",e)}),r.registerCommand("regna-general",{description:"Switch to a Regna general model (/regna-general)",handler:async(o,e)=>d("general",e)}),r.on("model_select",async(o,e)=>{if(i){i=!1;return}o.source!=="restore"&&o.model.provider===l&&e.ui.notify(`Regna model: ${o.model.id}`,"info")})}export{E as default,u as pickRegnaModelId};
@@ -1 +1 @@
1
- var d="regna",l="https://regnax.ai/v1";function u(){let r=(process.env.REGNA_BASE_URL??"").trim(),t=r===""?l:r,e;try{e=new URL(t)}catch{return l}if(e.protocol!=="http:"&&e.protocol!=="https:")return l;let o=`${e.origin}${e.pathname}`.replace(/\/+$/,"");return/\/v\d+$/.test(o)?o:`${o}/v1`}function A(r){let t=r.toLowerCase(),e=t==="default"||t==="current"||t==="auto",o=/qwq|qwen3|think|reason/.test(t);return{id:r,name:e?"Regna (active model)":`Regna \xB7 ${r}`,reasoning:o,input:["text"],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:32768,maxTokens:8192}}async function _(r,t){let e=new AbortController,o=setTimeout(()=>e.abort(),4e3);try{let s=await fetch(`${r}/models`,{headers:{Authorization:`Bearer ${t}`},signal:e.signal});if(!s.ok)return[];let c=await s.text();if(c.length>524288)return[];let i;try{i=JSON.parse(c)}catch{return[]}let a=(Array.isArray(i.data)?i.data:[]).map(n=>n&&typeof n.id=="string"?n.id:"").filter(n=>n.length>0&&n.length<=200);return Array.from(new Set(a)).slice(0,24)}catch{return[]}finally{clearTimeout(o)}}async function g(r){let t=u(),e=(process.env.REGNA_API_KEY??"").trim(),o=(process.env.REGNA_EXPOSE_ALIASES??"").trim()==="1",s=e?await _(t,e):[],c=new Set,i=a=>{let n=(a??"").trim();n&&c.add(n.startsWith(`${d}/`)?n.slice(d.length+1):n)};i(process.env.REGNA_MODEL),i(process.env.REGNA_CODER_MODEL),i(process.env.REGNA_GENERAL_MODEL),o||(s=s.filter(a=>a==="default"||!a.includes("/")||c.has(a))),s.includes("default")||s.unshift("default"),s.some(a=>a!=="default")||console.warn(`[regna] Model discovery failed or REGNA_API_KEY is unset. Registering 'regna/default' only. Set REGNA_API_KEY and run /reload. (base=${t})`),r.registerProvider(d,{name:"Regna",baseUrl:t,apiKey:"$REGNA_API_KEY",api:"openai-completions",models:s.map(A)})}export{g as default};
1
+ var g="regna",f="https://regnax.ai/v1";var E=["regna-basic","regna-pro","regna-max"],p={"regna-basic":"Regna Basic","regna-pro":"Regna Pro","regna-max":"Regna Max"},A=512*1024,R=24,_=200;function h(){let s=(process.env.REGNA_BASE_URL??"").trim(),e=s===""?f:s,n;try{n=new URL(e)}catch{return f}if(n.protocol!=="http:"&&n.protocol!=="https:")return f;let a=`${n.origin}${n.pathname}`.replace(/\/+$/,"");return/\/v\d+$/.test(a)?a:`${a}/v1`}function m(s){try{return/(^|\.)regnax\.ai$/i.test(new URL(s).hostname)}catch{return!1}}function v(s){let e=s.toLowerCase(),n=e==="default"||e==="current"||e==="auto",a=/qwq|qwen3|think|reason|max/.test(e);return{id:s,name:p[e]??(n?"Regna (active model)":`Regna \xB7 ${s}`),reasoning:a,input:["text"],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:32768,maxTokens:8192}}async function S(s,e){let n=new AbortController,a=setTimeout(()=>n.abort(),4e3);try{let o=await fetch(`${s}/models`,{headers:{Authorization:`Bearer ${e}`},signal:n.signal});if(!o.ok)return[];let c=await o.text();if(c.length>A)return[];let i;try{i=JSON.parse(c)}catch{return[]}let d=(Array.isArray(i.data)?i.data:[]).map(t=>t&&typeof t.id=="string"?t.id:"").filter(t=>t.length>0&&t.length<=_);return Array.from(new Set(d)).slice(0,R)}catch{return[]}finally{clearTimeout(a)}}async function y(s){let e=h(),n=(process.env.REGNA_API_KEY??"").trim(),a=(process.env.REGNA_EXPOSE_ALIASES??"").trim()==="1",o=n?await S(e,n):[],c=new Set,i=r=>{let u=(r??"").trim();u&&c.add(u.startsWith(`${g}/`)?u.slice(g.length+1):u)};i(process.env.REGNA_MODEL),i(process.env.REGNA_CODER_MODEL),i(process.env.REGNA_GENERAL_MODEL),a||(o=o.filter(r=>r==="default"||!r.includes("/")||c.has(r)));let l=m(e),d=E.filter(r=>o.includes(r)),t;if(l||d.length>0){t=l?[...E]:d.slice();for(let r of c)o.includes(r)&&!t.includes(r)&&t.push(r);!l&&t.length===0&&(t=["default"])}else o.includes("default")||o.unshift("default"),t=o;!o.some(r=>r!=="default")&&!l&&console.warn(`[regna] Model discovery failed or REGNA_API_KEY is unset. Set REGNA_API_KEY and run /reload. (base=${e})`),s.registerProvider(g,{name:"Regna",baseUrl:e,apiKey:"$REGNA_API_KEY",api:"openai-completions",models:t.map(v)})}export{y as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyperez/regna-code",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Regna Code. A terminal coding agent on Regna. Install with `npm i -g @hyperez/regna-code` and run `regna`. Works with the Regna cloud API and on-premise deployments.",
5
5
  "license": "PolyForm-Noncommercial-1.0.0",
6
6
  "private": false,