@hyperez/regna-code 0.1.2 → 0.1.3
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 +2 -2
- package/dist/bin/regna.mjs +16 -16
- package/dist/extensions/model.js +1 -1
- package/dist/extensions/provider.js +1 -1
- package/package.json +1 -1
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/
|
|
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
|
-
|
|
|
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`. |
|
package/dist/bin/regna.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{spawn as w}from"node:child_process";import{fileURLToPath as
|
|
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/
|
|
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
|
|
27
|
-
`);try{
|
|
28
|
-
Regna Code ${
|
|
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 ${
|
|
31
|
+
1) Get an API key at ${r}
|
|
32
32
|
2) Paste it below.
|
|
33
33
|
|
|
34
|
-
`),
|
|
35
|
-
`),process.exit(1));let
|
|
36
|
-
`),process.exit(1)),
|
|
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(
|
|
41
|
-
`),process.exit(0));a[0]==="login"&&(await
|
|
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=
|
|
44
|
-
`),process.exit(1);process.env.REGNA_API_KEY=d;var i=[],
|
|
45
|
-
`),process.exit(1));for(let[,
|
|
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||
|
|
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)});
|
|
49
|
+
`),process.exit(1)});S.on("exit",(e,r)=>{if(r){process.kill(process.pid,r);return}process.exit(e??0)});
|
package/dist/extensions/model.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var l="regna";function
|
|
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
|
|
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.
|
|
3
|
+
"version": "0.1.3",
|
|
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,
|