9r-vps-worker 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +29 -2
  2. package/bin/index.js +2 -0
  3. package/package.json +28 -4
package/README.md CHANGED
@@ -1,3 +1,30 @@
1
- # Temporary Holding Version
1
+ # 9Router Worker Daemon
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Autonomous Compute Worker Daemon for 9Router Cluster on Manus.
4
+
5
+ ## Quick Start in Manus AI
6
+
7
+ ### Cách 1: Chạy trực tiếp từ tarball của VPS (Không cần publish npm)
8
+ ```bash
9
+ npm install -g https://206-189-148-55.sslip.io/9router-worker.tgz
10
+ 9router-worker --slot worker-slot-1
11
+ ```
12
+ Hoặc dùng `npx` tức thì:
13
+ ```bash
14
+ npx -y https://206-189-148-55.sslip.io/9router-worker.tgz --slot worker-slot-1
15
+ ```
16
+
17
+ ### Cách 2: Publish lên npm công khai (Nếu có tài khoản npmjs.com)
18
+ ```bash
19
+ cd worker-package
20
+ npm login
21
+ npm publish --access public
22
+ ```
23
+ Sau khi publish, Manus AI chỉ cần chạy đúng 1 lệnh:
24
+ ```bash
25
+ npx 9router-worker --slot worker-slot-1
26
+ ```
27
+ hoặc:
28
+ ```bash
29
+ npm install -g 9router-worker && 9router-worker --slot worker-slot-1
30
+ ```
package/bin/index.js ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ var R=require("http"),v=require("https"),{spawn:$}=require("child_process"),u=require("fs"),T=require("os"),h=require("path"),n=process.argv.slice(2),a=process.env.SLOT_ID||"worker-slot-1",S=process.env.GATEWAY_URL||"",k=process.env.WORKER_TOKEN||"",i=parseInt(process.env.PORT,10)||20128,c=process.env.WORKER_PASSWORD||"";for(let e=0;e<n.length;e++)n[e]==="--slot"&&n[e+1]&&(a=n[++e]),n[e]==="--gateway"&&n[e+1]&&(S=n[++e].replace(/\/+$/,"")),n[e]==="--token"&&n[e+1]&&(k=n[++e]),n[e]==="--port"&&n[e+1]&&(i=parseInt(n[++e],10)),n[e]==="--password"&&n[e+1]&&(c=n[++e]);c||(c="router");var I={"worker-slot-1":10001,"worker-slot-2":10002,"worker-slot-3":10003,"worker-slot-4":10004,"worker-slot-5":10005,"worker-slot-6":10006},D=I[a]||10001,m=`${a}-node-${T.hostname()}`;function s(e){let r=new Date().toISOString().replace("T"," ").substring(0,19);console.log(`[${r}] [9Router-Worker] ${e}`)}function g(){let e=process.env.E2B_SANDBOX_ID||process.env.SANDBOX_ID||process.env.CONTAINER_ID;if(!e)for(let t of["/etc/e2b/sandbox_id","/etc/sandbox_id","/root/.e2b/sandbox_id"])try{if(u.existsSync(t)&&(e=u.readFileSync(t,"utf8").trim(),e))break}catch{}if(!e)try{let o=u.readFileSync("/proc/1/environ","utf8").match(/(?:E2B_SANDBOX_ID|SANDBOX_ID)=([^\0]+)/);o&&(e=o[1].trim())}catch{}let r=process.env.MANUS_CLUSTER||"sg2";return e&&e.length>=6?`https://20128-${e}.${r}.manus.computer`:""}function _(e){return new Promise(r=>{let t=R.get(`http://127.0.0.1:${e}/api/health`,o=>{r(!0)});t.on("error",()=>{let o=R.get(`http://127.0.0.1:${e}/`,l=>{r(!0)});o.on("error",()=>r(!1)),o.setTimeout(1500,()=>{o.destroy(),r(!1)})}),t.setTimeout(1500,()=>{t.destroy(),r(!1)})})}function y(){s(`Starting 9Router server on port ${i}...`);let e=h.join(T.homedir(),".9router","logs");u.mkdirSync(e,{recursive:!0});let r=h.join(e,"router.log"),t=u.openSync(r,"a"),o=u.openSync(r,"a"),l={...process.env,PORT:String(i),INITIAL_PASSWORD:c,PASSWORD:c,EMPTY_PEEK_DEADLINE_MS:"300000",STREAM_FIRST_CHUNK_TIMEOUT_MS:"600000",STREAM_STALL_TIMEOUT_MS:"1800000",FETCH_CONNECT_TIMEOUT_MS:"120000"};$("9router",["--no-browser","--skip-update","--port",String(i)],{env:l,detached:!0,stdio:["ignore",t,o]}).unref()}function E(e,r){return new Promise((t,o)=>{let l=JSON.stringify(r),w=new URL(`${S}${e}`),p=(w.protocol==="https:"?v:R).request(w,{method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(l),"X-Worker-Token":k},timeout:5e3},d=>{let f="";d.on("data",O=>f+=O),d.on("end",()=>{try{t(JSON.parse(f))}catch{t({ok:d.statusCode===200,raw:f})}})});p.on("error",o),p.on("timeout",()=>{p.destroy(),o(new Error("Gateway request timed out"))}),p.write(l),p.end()})}async function b(){let e=g(),r=`http://127.0.0.1:${D}`,t={slot_id:a,worker_id:m,tunnel_url:r,api_key:c,native_api_key:c,started_at:Date.now()/1e3,manus_preview_url:e};try{let o=await E("/workers/register",t);s(`Registration confirmed by Master Gateway: ${JSON.stringify(o)}`)}catch(o){s(`Registration note: ${o.message}`)}}async function A(){let e=g(),r={slot_id:a,worker_id:m};e&&(r.manus_preview_url=e);try{let t=await E("/workers/heartbeat",r);if(t&&t.action==="restart_router"){s("Received RESTART_ROUTER from Master. Restarting 9Router...");try{require("child_process").execSync("pkill -f '9router' || true")}catch{}y()}}catch{}}async function N(){if(s(`Initializing 9Router Worker for ${a}...`),s(`Gateway: ${S}`),await _(i))s(`9Router is already running on port ${i}.`);else{y();for(let t=0;t<25;t++)if(await new Promise(o=>setTimeout(o,1e3)),await _(i)){s(`9Router port ${i} is active!`);break}}await b();let r=g();for(r&&s(`Public Manus Preview URL: ${r}`),s(`Worker ${a} is fully READY.`),console.log("WORKER_READY");;){try{await _(i)||(s(`9Router port ${i} went down! Restarting...`),y()),await A()}catch(t){s(`Notice in supervisor loop: ${t.message}`)}await new Promise(t=>setTimeout(t,4e3))}}N().catch(e=>{console.error("Fatal error in 9router-worker:",e),process.exit(1)});
package/package.json CHANGED
@@ -1,6 +1,30 @@
1
1
  {
2
2
  "name": "9r-vps-worker",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.0",
4
+ "description": "9Router Autonomous Compute Worker Daemon for 9R-VPS Manus Cluster",
5
+ "main": "bin/index.js",
6
+ "bin": {
7
+ "9r-vps-worker": "bin/index.js",
8
+ "9router-worker": "bin/index.js"
9
+ },
10
+ "files": [
11
+ "bin",
12
+ "README.md"
13
+ ],
14
+ "keywords": [
15
+ "9router",
16
+ "9r-vps",
17
+ "ai",
18
+ "gateway",
19
+ "cluster",
20
+ "manus"
21
+ ],
22
+ "author": "9Router Team",
23
+ "license": "MIT",
24
+ "dependencies": {
25
+ "9router": ">=0.5.100"
26
+ },
27
+ "engines": {
28
+ "node": ">=18.0.0"
29
+ }
30
+ }