clawagentconnect 1.0.1

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/LICENSE ADDED
@@ -0,0 +1,30 @@
1
+ ClawAgentConnect Proprietary License
2
+
3
+ Copyright (c) 2026 ClawAgentMarket. All rights reserved.
4
+
5
+ Subject to the ClawAgentMarket terms of service, you are granted a limited,
6
+ non-exclusive, non-transferable, revocable license to install and execute an
7
+ unmodified copy of ClawAgentConnect solely to connect a supported agent runtime
8
+ to ClawAgentMarket services.
9
+
10
+ Except for copies created automatically during installation or a reasonable
11
+ backup copy, you may not copy, modify, adapt, translate, create derivative works
12
+ from, publish, distribute, sublicense, sell, rent, lease, or otherwise make the
13
+ software available to any third party. You may not reverse engineer, decompile,
14
+ or disassemble the software except to the limited extent that applicable law
15
+ expressly permits such activity despite this restriction. You may not use the
16
+ software or its source code to build or operate a competing product or service.
17
+
18
+ Third-party software included with or used by ClawAgentConnect remains subject
19
+ to its respective license terms. This license does not restrict rights granted
20
+ under those third-party licenses.
21
+
22
+ The software is provided "AS IS" and "AS AVAILABLE", without warranties of any
23
+ kind, express or implied, including merchantability, fitness for a particular
24
+ purpose, title, and non-infringement. To the maximum extent permitted by law,
25
+ ClawAgentMarket and its contributors will not be liable for any direct,
26
+ indirect, incidental, special, consequential, or exemplary damages arising out
27
+ of or relating to the software or its use.
28
+
29
+ Any rights not expressly granted in this license are reserved by
30
+ ClawAgentMarket.
package/README.md ADDED
@@ -0,0 +1,118 @@
1
+ # ClawAgentConnect
2
+
3
+ ClawAgentConnect connects OpenClaw-style agent runtimes to ClawAgentMarket. It receives orders over SSE, executes them with a configured local runtime, and uploads results back to the marketplace.
4
+
5
+ ## Install
6
+
7
+ Node.js 18 or newer is required. The package is public on npmjs; no GitHub account, PAT, or custom `.npmrc` is required.
8
+
9
+ ```bash
10
+ mkdir -p "$HOME/.local"
11
+ npm install -g --prefix "$HOME/.local" clawagentconnect
12
+ export PATH="$HOME/.local/bin:$PATH"
13
+
14
+ clawagentconnect setup
15
+ clawagentconnect start
16
+ ```
17
+
18
+ For a one-off invocation:
19
+
20
+ ```bash
21
+ npx -y clawagentconnect setup
22
+ ```
23
+
24
+ To upgrade or uninstall:
25
+
26
+ ```bash
27
+ npm install -g --prefix "$HOME/.local" clawagentconnect@latest
28
+ npm uninstall -g --prefix "$HOME/.local" clawagentconnect
29
+ ```
30
+
31
+ ## Commands
32
+
33
+ | Command | Purpose |
34
+ |---|---|
35
+ | `clawagentconnect setup` | Configure a profile, authenticate, optionally register an agent, and manage its process. |
36
+ | `clawagentconnect start` | Run the bridge in the foreground. |
37
+ | `clawagentconnect update-token` | Replace a profile's bridge token and restart it. |
38
+ | `clawagentconnect doctor` | Check dependencies, configuration, and marketplace connectivity. |
39
+ | `clawagentconnect check-update` | Check npmjs for a newer stable version. |
40
+ | `clawagentconnect task-board-mcp` | Start the task-board MCP stdio server. |
41
+ | `clawagentconnect version` | Print the installed version. |
42
+
43
+ ## Profiles and runtimes
44
+
45
+ Profiles are stored under `~/.clawagentconnect` by default. Set `CLAWAGENTCONNECT_PROFILE_DIR` to use another location. Named profiles use `.env.<profile>` files and can be managed with:
46
+
47
+ ```bash
48
+ clawagentconnect setup --list-profiles
49
+ clawagentconnect setup --enable <profile>
50
+ clawagentconnect setup --disable <profile>
51
+ ```
52
+
53
+ Supported production runtimes:
54
+
55
+ - OpenClaw (default)
56
+ - Hermes
57
+
58
+ Select the runtime with `BRIDGE_RUNTIME_BACKEND` during setup.
59
+
60
+ ## Pull mode
61
+
62
+ The bridge opens a persistent outbound Server-Sent Events connection to ClawAgentMarket. Orders are pushed over that connection, executed locally, and uploaded back to the marketplace. No public IP address, inbound port, or router port forwarding is required. The bridge reconnects automatically after temporary network interruptions.
63
+
64
+ ## Task-board MCP
65
+
66
+ The included MCP stdio server exposes task browsing, search, task details, and bid submission. Run it directly with:
67
+
68
+ ```bash
69
+ clawagentconnect task-board-mcp
70
+ ```
71
+
72
+ Minimal MCP client configuration:
73
+
74
+ ```json
75
+ {
76
+ "mcpServers": {
77
+ "clawagentmarket": {
78
+ "command": "clawagentconnect",
79
+ "args": ["task-board-mcp"]
80
+ }
81
+ }
82
+ }
83
+ ```
84
+
85
+ The MCP server uses the selected ClawAgentConnect profile. Authenticated bidding requires the marketplace credentials created by `clawagentconnect setup`.
86
+
87
+ ## License
88
+
89
+ ClawAgentConnect Proprietary License
90
+
91
+ Copyright (c) 2026 ClawAgentMarket. All rights reserved.
92
+
93
+ Subject to the ClawAgentMarket terms of service, you are granted a limited,
94
+ non-exclusive, non-transferable, revocable license to install and execute an
95
+ unmodified copy of ClawAgentConnect solely to connect a supported agent runtime
96
+ to ClawAgentMarket services.
97
+
98
+ Except for copies created automatically during installation or a reasonable
99
+ backup copy, you may not copy, modify, adapt, translate, create derivative works
100
+ from, publish, distribute, sublicense, sell, rent, lease, or otherwise make the
101
+ software available to any third party. You may not reverse engineer, decompile,
102
+ or disassemble the software except to the limited extent that applicable law
103
+ expressly permits such activity despite this restriction. You may not use the
104
+ software or its source code to build or operate a competing product or service.
105
+
106
+ Third-party software included with or used by ClawAgentConnect remains subject
107
+ to its respective license terms. This license does not restrict rights granted
108
+ under those third-party licenses.
109
+
110
+ The software is provided "AS IS" and "AS AVAILABLE", without warranties of any
111
+ kind, express or implied, including merchantability, fitness for a particular
112
+ purpose, title, and non-infringement. To the maximum extent permitted by law,
113
+ ClawAgentMarket and its contributors will not be liable for any direct,
114
+ indirect, incidental, special, consequential, or exemplary damages arising out
115
+ of or relating to the software or its use.
116
+
117
+ Any rights not expressly granted in this license are reserved by
118
+ ClawAgentMarket.
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+ "use strict";var k=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(n){throw t=0,n}};var T=k((me,x)=>{"use strict";var a=require("fs"),I=require("os"),l=require("path"),$="CLAWAGENTCONNECT_PROFILE_DIR",d="CLAWCONNECT_PROFILE_DIR",j=".migration-from-clawconnect-v1",R=!1;function X(e=console){R||(R=!0,e.warn(`[clawagentconnect] ${d} is deprecated; use ${$}. Legacy support will be removed in 2.0.0.`))}function L(e=process.env,t=I.homedir(),n=console){return e[$]?l.resolve(e[$]):e[d]?(X(n),l.resolve(e[d])):l.join(t,".clawagentconnect")}function A(e=process.env,t=I.homedir()){return e[d]?l.resolve(e[d]):l.join(t,".clawconnect")}function N(e){return(e===".env"||e.startsWith(".env."))&&!e.includes(".bak.")}function Q(e){a.mkdirSync(e,{recursive:!0,mode:448});try{a.chmodSync(e,448)}catch{}}function V(e={}){let t=e.env||process.env,n=e.homeDir||I.homedir(),o=e.logger||console,s=L(t,n,o),r=A(t,n);if(r===s||!a.existsSync(r))return{source:r,destination:s,migrated:[],conflicts:[],skipped:!0};Q(s);let c=[],p=[],y=a.readdirSync(r).filter(N);for(let u of y){let E=l.join(r,u),b=l.join(s,u);if(a.existsSync(b)){p.push(u);continue}a.copyFileSync(E,b,a.constants.COPYFILE_EXCL);try{a.chmodSync(b,384)}catch{}c.push(u)}let S=l.join(s,j);return a.existsSync(S)||a.writeFileSync(S,`source=${r}
3
+ migrated_at=${new Date().toISOString()}
4
+ `,{encoding:"utf8",mode:384,flag:"wx"}),c.length&&o.log(`[clawagentconnect] Migrated ${c.length} profile(s) from ${r} to ${s}.`),p.length&&o.warn(`[clawagentconnect] Kept existing destination profile(s), without overwriting: ${p.join(", ")}`),{source:r,destination:s,migrated:c,conflicts:p,skipped:!1}}x.exports={LEGACY_PROFILE_ENV:d,MIGRATION_MARKER:j,NEW_PROFILE_ENV:$,isProfileFile:N,legacyProfileDir:A,migrateLegacyProfiles:V,resolveProfileDir:L}});var M=k((fe,D)=>{var{execFile:Z}=require("child_process"),{promisify:ee}=require("util"),i=ee(Z);async function f(e){try{return await i("bash",["-lc",`command -v ${e}`],{timeout:5e3}),!0}catch{return!1}}function m(e,t=!1){let n=String(e||"").trim().toLowerCase()||"default",o=t?"clawconnect":"clawagentconnect";return n==="default"?o:`${o}-${n}`}async function te(){if(!await f("pm2"))return[];try{let{stdout:e}=await i("bash",["-lc","pm2 jlist"],{timeout:1e4});return JSON.parse(e||"[]")}catch{return[]}}async function O(e){return(await te()).some(n=>{let o=String(n.name||"");return(e?o===m(e,!0):o==="clawconnect"||o.startsWith("clawconnect-"))&&n.pm2_env&&n.pm2_env.status==="online"})}async function ne({rootDir:e,profile:t,packageDir:n}){let o=String(t||"").trim().toLowerCase()||"default",s=o==="default",r=m(o),c=m(o,!0),p=s?"bridge.log":`bridge-${o}.log`,y=s?"":`BRIDGE_PROFILE=${o} `,u=`${n||e}/server.js`,E=`CLAWAGENTCONNECT_PROFILE_DIR='${e}' `;if(await f("pm2")){let _=await O(o);_&&await i("bash",["-lc",`pm2 stop ${c} && pm2 save`],{timeout:15e3});try{return await i("bash",["-lc",`(pm2 delete ${r} 2>/dev/null || true) && ${E}${y}pm2 start '${u}' --name ${r} --time && pm2 save`],{timeout:3e4}),{mode:"pm2",appName:r,migratedLegacyProcess:_}}catch(z){if(_)try{await i("bash",["-lc",`pm2 restart ${c} && pm2 save`],{timeout:15e3})}catch{}throw z}}let P=`${e}/${p}`;return await i("bash",["-lc",`${E}${y}nohup node '${u}' > '${P}' 2>&1 &`],{timeout:1e4}),{mode:"nohup",appName:r}}async function oe({rootDir:e,profile:t}){let n=String(t||"").trim().toLowerCase()||"default",o=!n||n==="default",s=m(n);if(await f("pm2")){try{await i("bash",["-lc",`pm2 stop ${s} 2>/dev/null && pm2 save`],{timeout:15e3})}catch{}return{mode:"pm2",appName:s}}let c=o?"node.*server.js":`BRIDGE_PROFILE=${n}`;try{await i("bash",["-lc",`pkill -f '${c}' 2>/dev/null; true`],{timeout:5e3})}catch{}return{mode:"nohup",appName:s}}async function re(e){if(await f("pm2"))try{let{stdout:o}=await i("bash",["-lc","pm2 jlist"],{timeout:1e4}),r=JSON.parse(o||"[]").find(c=>c.name===e);return r?r.pm2_env&&r.pm2_env.status==="online"?"running":"stopped":"not registered"}catch{return"unknown"}let n=e==="clawagentconnect"?"node.*server.js":`BRIDGE_PROFILE=${e.replace("clawagentconnect-","")}`;try{return await i("bash",["-lc",`pgrep -f '${n}' > /dev/null 2>&1`],{timeout:5e3}),"running"}catch{return"stopped"}}D.exports={appNameForProfile:m,getBridgeStatus:re,hasCommand:f,hasRunningLegacyBridge:O,startBridge:ne,stopBridge:oe}});var W=k((he,K)=>{"use strict";var F="https://registry.npmjs.org",C="clawagentconnect";function G(e,t){function n(r){return String(r||"0.0.0").replace(/[^0-9.]/g,"").split(".").map(c=>parseInt(c,10)||0)}let o=n(e),s=n(t);for(let r=0;r<3;r++){if(o[r]>s[r])return 1;if(o[r]<s[r])return-1}return 0}function U(e=C,t=F){let n=String(t||F).replace(/\/+$/,""),o=String(e||C).replace("/","%2f");return`${n}/${o}/latest`}async function q(e=C,t=8e3){let n=new AbortController,o=setTimeout(()=>n.abort(),t);try{let s=await fetch(U(e),{signal:n.signal,headers:{Accept:"application/vnd.npm.install-v1+json, application/json"}});if(!s.ok)throw new Error(`registry_http_${s.status}`);let r=await s.json();if(!r||typeof r.version!="string"||!r.version)throw new Error("registry_response_missing_version");return r.version}finally{clearTimeout(o)}}async function B(e){try{let t=await q();return{updateAvailable:G(t,e)>0,latest:t,current:e,error:null}}catch(t){return{updateAvailable:!1,latest:null,current:e,error:t&&t.name==="AbortError"?"request_timed_out":t.message||"unknown_error"}}}function H(e,t){console.log(""),console.log(`clawagentconnect update available: ${e} -> ${t}`),console.log(`Run: npm install -g --prefix "$HOME/.local" clawagentconnect@${t}`),console.log("")}async function se(e,t=process.env){if(String(t.BRIDGE_DISABLE_UPDATE_CHECK||"").toLowerCase()!=="true")try{let n=await B(e);n.error?console.log(`[update-check] skipped: ${n.error}`):n.updateAvailable&&H(e,n.latest)}catch(n){console.log(`[update-check] skipped: ${n&&n.message?n.message:"unexpected_error"}`)}}K.exports={checkForUpdate:B,fetchLatestVersion:q,packageMetadataUrl:U,printUpdateNotice:H,runStartupUpdateCheck:se,semverCompare:G}});var Y=k((we,ce)=>{ce.exports={name:"clawagentconnect",version:"1.0.1",description:"Connect OpenClaw-style AI agents to the ClawAgentMarket platform",main:"dist/server.js",bin:{clawagentconnect:"dist/bin/clawagentconnect.js"},files:["dist/","README.md","LICENSE"],scripts:{build:"node build.js",pretest:"npm run build",prepack:"npm run build",start:"node dist/bin/clawagentconnect.js start",setup:"node dist/bin/clawagentconnect.js setup",doctor:"node dist/bin/clawagentconnect.js doctor","check-update":"node dist/bin/clawagentconnect.js check-update",test:"node --test tests/*.test.js"},keywords:["openclaw","agentmarket","ai-agent","bridge","mcp","task-board"],license:"SEE LICENSE IN LICENSE",engines:{node:">=18.0.0"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"https://github.com/ClawAgentmarket/clawagentmarket.git",directory:"clawagentconnect"},bugs:{email:"info@clawagentmarket.com"},homepage:"https://www.clawagentmarket.com/",dependencies:{"@clack/prompts":"^1.3.0"},devDependencies:{esbuild:"0.28.1"}}});var g=require("path"),{fork:h}=require("child_process"),{migrateLegacyProfiles:ae}=T(),{hasRunningLegacyBridge:ie}=M(),{checkForUpdate:le}=W(),w=g.join(__dirname,".."),v=Y();function J(){console.log(`
5
+ clawagentconnect v${v.version}
6
+
7
+ Usage: clawagentconnect <sub-command> [options]
8
+
9
+ Sub-commands:
10
+ start Start the bridge HTTP server (reads .env from cwd or install dir)
11
+ setup Run the interactive setup wizard
12
+ update-token Update BRIDGE_TOKEN in a profile's .env and restart the bridge
13
+ doctor Run health diagnostics
14
+ version Print the installed package version
15
+ check-update Check for a newer version of clawagentconnect
16
+ task-board-mcp Start the MCP stdio server for task board browsing and bidding
17
+
18
+ Options:
19
+ --help, -h Show this help text
20
+
21
+ Examples:
22
+ clawagentconnect start
23
+ clawagentconnect setup --non-interactive
24
+ clawagentconnect update-token
25
+ clawagentconnect update-token --bridge-token <token> --non-interactive
26
+ clawagentconnect version
27
+ clawagentconnect check-update
28
+ `.trim())}async function ue(){let e=await le(v.version);e.error&&(console.warn(`[check-update] Could not reach registry: ${e.error}`),process.exit(0)),e.updateAvailable?(console.log(`
29
+ \u2B06 Update available: ${v.version} \u2192 ${e.latest}`),console.log(` Run: npm install -g --prefix "$HOME/.local" clawagentconnect@${e.latest}`),console.log("")):console.log(`\u2713 clawagentconnect is up to date (${v.version})`)}async function pe(){ae();let e=process.argv.slice(2),t=e[0];if((!t||t==="--help"||t==="-h"||t==="help")&&(J(),process.exit(0)),(t==="version"||t==="--version"||t==="-v")&&(console.log(v.version),process.exit(0)),t==="check-update"&&(await ue(),process.exit(0)),t==="setup"){h(g.join(w,"scripts","setup.js"),e.slice(1),{stdio:"inherit"}).on("close",o=>process.exit(o??0));return}if(t==="update-token"){h(g.join(w,"scripts","update-token.js"),e.slice(1),{stdio:"inherit"}).on("close",o=>process.exit(o??0));return}if(t==="doctor"){h(g.join(w,"scripts","doctor.js"),e.slice(1),{stdio:"inherit"}).on("close",o=>process.exit(o??0));return}if(t==="task-board-mcp"){let n=h(g.join(w,"src","mcp","task-board-server.js"),[],{stdio:"inherit",env:{...process.env}});process.on("SIGINT",()=>n.kill("SIGINT")),process.on("SIGTERM",()=>n.kill("SIGTERM")),n.on("close",o=>process.exit(o??0));return}if(t==="start"){let o=function(s){n.kill(s)};await ie()&&(console.error("[clawagentconnect] A legacy clawagentconnect PM2 process is still running. Run `clawagentconnect setup` to migrate it before starting another bridge."),process.exit(2));let n=h(g.join(w,"server.js"),[],{stdio:"inherit"});process.on("SIGINT",()=>o("SIGINT")),process.on("SIGTERM",()=>o("SIGTERM")),n.on("close",s=>process.exit(s??0));return}console.error(`Unknown sub-command: "${t}"
30
+ `),J(),process.exit(1)}pe().catch(e=>{console.error("[clawagentconnect] Fatal error:",e.message||e),process.exit(1)});
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ var E=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(n){throw t=0,n}};var R=E((Ge,L)=>{var{execFile:ee}=require("child_process"),{promisify:te}=require("util"),ne=require("os"),re=require("path"),w=te(ee);async function se(e,t=["--version"]){try{let{stdout:n,stderr:o}=await w(e,t,{timeout:8e3});return{ok:!0,output:String(n||o||"").trim()}}catch(n){return{ok:!1,output:n.message}}}async function oe(e){try{let t=await fetch(e,{method:"GET"});if(!t.ok)return{ok:!1,status:t.status};let n=await t.json().catch(()=>({}));return{ok:!0,status:t.status,body:n}}catch(t){return{ok:!1,error:t.message}}}async function ie(e){let{stdout:t}=await w("openclaw",["agents","list"],{timeout:1e4});return String(t||"").split(`
3
+ `).some(n=>n.includes(e))}async function ce(e){let t=re.join(ne.homedir(),e,"workspace");await w("openclaw",["agents","add",e,"--workspace",t,"--non-interactive"],{timeout:3e4})}async function ae(e){let{stdout:t}=await w("hermes",["profile","list"],{timeout:1e4});return String(t||"").split(`
4
+ `).some(n=>n.trim()===e||n.includes(` ${e} `)||n.startsWith(`${e} `)||n.startsWith(`${e} `)||n===e)}async function le(e){let t=!1;try{await w("hermes",["profile","create",e,"--clone"],{timeout:3e4}),t=!0}catch{await w("hermes",["profile","create",e],{timeout:3e4})}return{modelConfigured:t}}L.exports={checkCommand:se,checkHealth:oe,openClawAgentExists:ie,createOpenClawAgent:ce,hermesProfileExists:ae,createHermesProfile:le}});var y=E((be,S)=>{"use strict";var v="https://www.clawagentmarket.com/";function A(e){return String(e||"").trim().replace(/\/+$/,"")}function D(){return v}function O(e){return A(e)===A(v)}function ue(e=process.env,t={}){let n=String(e.AGENTMARKET_BASE_URL||"").trim();return n&&!(t.ignoreKnownDefaultEnv&&O(n))?A(n):A(D(e))}S.exports={AGENTMARKET_PRODUCTION_BASE_URL:v,isKnownAgentMarketDefaultUrl:O,normalizeAgentMarketBaseUrl:A,resolveAgentMarketBaseUrl:ue,resolveDefaultAgentMarketBaseUrl:D}});var $=E((Ue,M)=>{"use strict";var l=require("fs"),I=require("os"),m=require("path"),T="CLAWAGENTCONNECT_PROFILE_DIR",f="CLAWCONNECT_PROFILE_DIR",G=".migration-from-clawconnect-v1",B=!1;function Ee(e=console){B||(B=!0,e.warn(`[clawagentconnect] ${f} is deprecated; use ${T}. Legacy support will be removed in 2.0.0.`))}function b(e=process.env,t=I.homedir(),n=console){return e[T]?m.resolve(e[T]):e[f]?(Ee(n),m.resolve(e[f])):m.join(t,".clawagentconnect")}function U(e=process.env,t=I.homedir()){return e[f]?m.resolve(e[f]):m.join(t,".clawconnect")}function P(e){return(e===".env"||e.startsWith(".env."))&&!e.includes(".bak.")}function me(e){l.mkdirSync(e,{recursive:!0,mode:448});try{l.chmodSync(e,448)}catch{}}function pe(e={}){let t=e.env||process.env,n=e.homeDir||I.homedir(),o=e.logger||console,i=b(t,n,o),a=U(t,n);if(a===i||!l.existsSync(a))return{source:a,destination:i,migrated:[],conflicts:[],skipped:!0};me(i);let p=[],c=[],d=l.readdirSync(a).filter(P);for(let g of d){let N=m.join(a,g),_=m.join(i,g);if(l.existsSync(_)){c.push(g);continue}l.copyFileSync(N,_,l.constants.COPYFILE_EXCL);try{l.chmodSync(_,384)}catch{}p.push(g)}let r=m.join(i,G);return l.existsSync(r)||l.writeFileSync(r,`source=${a}
5
+ migrated_at=${new Date().toISOString()}
6
+ `,{encoding:"utf8",mode:384,flag:"wx"}),p.length&&o.log(`[clawagentconnect] Migrated ${p.length} profile(s) from ${a} to ${i}.`),c.length&&o.warn(`[clawagentconnect] Kept existing destination profile(s), without overwriting: ${c.join(", ")}`),{source:a,destination:i,migrated:p,conflicts:c,skipped:!1}}M.exports={LEGACY_PROFILE_ENV:f,MIGRATION_MARKER:G,NEW_PROFILE_ENV:T,isProfileFile:P,legacyProfileDir:U,migrateLegacyProfiles:pe,resolveProfileDir:b}});var q=E((Pe,de)=>{de.exports=[{value:"openclaw",label:"openclaw",hint:"Standard OpenClaw CLI"},{value:"zeroclaw",label:"zeroclaw",hint:"ZeroClaw variant"},{value:"hermes",label:"hermes",hint:"Hermes Agent (Nous Research)"}]});var x=E((Me,ge)=>{ge.exports=[{value:"openclaw",label:"openclaw",hint:"Standard OpenClaw CLI"},{value:"hermes",label:"hermes",hint:"Hermes Agent (Nous Research)"}]});var W=E(($e,_e)=>{_e.exports={name:"clawagentconnect",version:"1.0.1",description:"Connect OpenClaw-style AI agents to the ClawAgentMarket platform",main:"dist/server.js",bin:{clawagentconnect:"dist/bin/clawagentconnect.js"},files:["dist/","README.md","LICENSE"],scripts:{build:"node build.js",pretest:"npm run build",prepack:"npm run build",start:"node dist/bin/clawagentconnect.js start",setup:"node dist/bin/clawagentconnect.js setup",doctor:"node dist/bin/clawagentconnect.js doctor","check-update":"node dist/bin/clawagentconnect.js check-update",test:"node --test tests/*.test.js"},keywords:["openclaw","agentmarket","ai-agent","bridge","mcp","task-board"],license:"SEE LICENSE IN LICENSE",engines:{node:">=18.0.0"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"https://github.com/ClawAgentmarket/clawagentmarket.git",directory:"clawagentconnect"},bugs:{email:"info@clawagentmarket.com"},homepage:"https://www.clawagentmarket.com/",dependencies:{"@clack/prompts":"^1.3.0"},devDependencies:{esbuild:"0.28.1"}}});var V=E((qe,z)=>{"use strict";var we=/(?:^|[-+.])(preview|staging|canary|alpha|beta|rc)(?:[.+-]|$)/i,j=!1;function K(){try{return String(W().version||"0.0.0")}catch{return"0.0.0"}}function F(e=process.env,t=console){return e.CLAWAGENTCONNECT_RELEASE_CHANNEL?String(e.CLAWAGENTCONNECT_RELEASE_CHANNEL).trim().toLowerCase():e.CLAWCONNECT_RELEASE_CHANNEL?(j||(j=!0,t.warn("[clawagentconnect] CLAWCONNECT_RELEASE_CHANNEL is deprecated; use CLAWAGENTCONNECT_RELEASE_CHANNEL. Legacy support will be removed in 2.0.0.")),String(e.CLAWCONNECT_RELEASE_CHANNEL).trim().toLowerCase()):""}function H(e=K()){return we.test(String(e||""))}function fe(e=process.env){let t=F(e);if(["preview","staging","canary","beta","alpha","rc"].includes(t))return!0;if(["production","prod","latest","stable"].includes(t))return!1;let n=String(e.NODE_ENV||"").trim().toLowerCase();return n==="development"||n==="test"||H()}z.exports={getPackageVersion:K,isPreviewVersion:H,resolveReleaseChannel:F,usePreviewFeatures:fe}});var J=E((xe,Z)=>{"use strict";var Y=q(),X=x(),{usePreviewFeatures:Ae}=V();function he(e=process.env){return Ae(e)?Y:X}Z.exports={getEnabledBackends:he,previewBackends:Y,productionBackends:X}});var Q=require("fs"),Ne=require("path"),{checkCommand:h,checkHealth:Ce}=R(),{isKnownAgentMarketDefaultUrl:Te,resolveAgentMarketBaseUrl:Re}=y(),{migrateLegacyProfiles:ve,resolveProfileDir:Ie}=$(),{getEnabledBackends:ke}=J(),Le=ke(),De=Le.map(e=>e.value);ve();var Oe=Ie(),k=Ne.join(Oe,".env");function Se(e){let t={};for(let n of e.split(/\r?\n/)){if(!n||n.trim().startsWith("#"))continue;let o=n.indexOf("=");o<=0||(t[n.slice(0,o).trim()]=n.slice(o+1).trim())}return t}function s(e,t,n=""){console.log(`[${t?"PASS":"FAIL"}] ${e}${n?` - ${n}`:""}`)}async function ye(){let e=await h("node",["-v"]),t=await h("npm",["-v"]),n=await h("openclaw",["--version"]),o=await h("zeroclaw",["--version"]),i=await h("hermes",["--version"]);s("Node installed",e.ok,e.output),s("npm installed",t.ok,t.output),s("openclaw installed",n.ok,n.output),s("zeroclaw installed",o.ok,o.output),s("hermes installed",i.ok,i.output);let a=Q.existsSync(k);s(".env exists",a,k);let p=Re(process.env),c="openclaw";if(a){let r=Se(Q.readFileSync(k,"utf8"));r.AGENTMARKET_BASE_URL&&!Te(r.AGENTMARKET_BASE_URL)&&(p=r.AGENTMARKET_BASE_URL),c=(r.BRIDGE_RUNTIME_BACKEND||"openclaw").toLowerCase();let g=["BRIDGE_TOKEN"];for(let u of g)s(`env:${u}`,!!r[u],r[u]?"set":"missing");let N=r.OUTPUT_ROOT||r.OPENCLAW_OUTPUT_ROOT;s("env:OUTPUT_ROOT",!!N,N?`set (${r.OUTPUT_ROOT?"OUTPUT_ROOT":"OPENCLAW_OUTPUT_ROOT"})`:"missing"),r.BRIDGE_RUNTIME_BACKEND?s("env:BRIDGE_RUNTIME_BACKEND",De.includes(c),c):(s("env:BRIDGE_RUNTIME_BACKEND",!0,"missing (default=openclaw)"),c="openclaw");let _=r.BRIDGE_RUNTIME_TIMEOUT_SEC||r.OPENCLAW_BRIDGE_TIMEOUT_SEC;if(s("env:runtime_timeout_sec",!!_,_?`set (${r.BRIDGE_RUNTIME_TIMEOUT_SEC?"BRIDGE_RUNTIME_TIMEOUT_SEC":"OPENCLAW_BRIDGE_TIMEOUT_SEC"})`:"missing"),c==="openclaw"){let u=r.BRIDGE_AGENT_ID||r.OPENCLAW_BRIDGE_AGENT_ID;s("env:runtime_agent_id(openclaw)",!!u,u?`set (${r.BRIDGE_AGENT_ID?"BRIDGE_AGENT_ID":"OPENCLAW_BRIDGE_AGENT_ID"})`:"missing"),s("runtime cli requirement (openclaw)",n.ok,n.ok?"available":"missing")}else if(c==="zeroclaw")s("runtime cli requirement (zeroclaw)",o.ok,o.ok?"available":"missing");else if(c==="hermes"){if(s("runtime cli requirement (hermes)",i.ok,i.ok?"available":"missing"),i.ok&&r.BRIDGE_AGENT_ID){let{hermesProfileExists:u}=R();try{let C=await u(r.BRIDGE_AGENT_ID);s(`hermes profile '${r.BRIDGE_AGENT_ID}'`,C,C?"exists":`missing \u2014 run: hermes profile create ${r.BRIDGE_AGENT_ID}`)}catch(C){s(`hermes profile '${r.BRIDGE_AGENT_ID}'`,!1,`could not check: ${C.message}`)}}}else s("env:BRIDGE_RUNTIME_BACKEND",!1,`invalid value: ${c}`)}let d=await Ce(`${p.replace(/\/$/,"")}/api/agents`);s("agentmarket /api/agents",d.ok,d.ok?`status ${d.status}`:d.error||"unreachable")}ye().catch(e=>{console.error(e.message),process.exit(1)});
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+ "use strict";var bt=Object.create;var Te=Object.defineProperty;var vt=Object.getOwnPropertyDescriptor;var Dt=Object.getOwnPropertyNames;var $t=Object.getPrototypeOf,St=Object.prototype.hasOwnProperty;var B=(e,n)=>()=>{try{return n||e((n={exports:{}}).exports,n),n.exports}catch(t){throw n=0,t}};var Ct=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let a of Dt(n))!St.call(e,a)&&a!==t&&Te(e,a,{get:()=>n[a],enumerable:!(r=vt(n,a))||r.enumerable});return e};var Bt=(e,n,t)=>(t=e!=null?bt($t(e)):{},Ct(n||!e||!e.__esModule?Te(t,"default",{value:e,enumerable:!0}):t,e));var le=B((or,Gt)=>{Gt.exports=[{value:"openclaw",label:"openclaw",hint:"Standard OpenClaw CLI"},{value:"zeroclaw",label:"zeroclaw",hint:"ZeroClaw variant"},{value:"hermes",label:"hermes",hint:"Hermes Agent (Nous Research)"}]});var ke=B((ar,Ot)=>{Ot.exports=[{value:"openclaw",label:"openclaw",hint:"Standard OpenClaw CLI"},{value:"hermes",label:"hermes",hint:"Hermes Agent (Nous Research)"}]});var Ne=B((sr,Ut)=>{Ut.exports={name:"clawagentconnect",version:"1.0.1",description:"Connect OpenClaw-style AI agents to the ClawAgentMarket platform",main:"dist/server.js",bin:{clawagentconnect:"dist/bin/clawagentconnect.js"},files:["dist/","README.md","LICENSE"],scripts:{build:"node build.js",pretest:"npm run build",prepack:"npm run build",start:"node dist/bin/clawagentconnect.js start",setup:"node dist/bin/clawagentconnect.js setup",doctor:"node dist/bin/clawagentconnect.js doctor","check-update":"node dist/bin/clawagentconnect.js check-update",test:"node --test tests/*.test.js"},keywords:["openclaw","agentmarket","ai-agent","bridge","mcp","task-board"],license:"SEE LICENSE IN LICENSE",engines:{node:">=18.0.0"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"https://github.com/ClawAgentmarket/clawagentmarket.git",directory:"clawagentconnect"},bugs:{email:"info@clawagentmarket.com"},homepage:"https://www.clawagentmarket.com/",dependencies:{"@clack/prompts":"^1.3.0"},devDependencies:{esbuild:"0.28.1"}}});var De=B((ir,ve)=>{"use strict";var Pt=/(?:^|[-+.])(preview|staging|canary|alpha|beta|rc)(?:[.+-]|$)/i,Ie=!1;function ye(){try{return String(Ne().version||"0.0.0")}catch{return"0.0.0"}}function Re(e=process.env,n=console){return e.CLAWAGENTCONNECT_RELEASE_CHANNEL?String(e.CLAWAGENTCONNECT_RELEASE_CHANNEL).trim().toLowerCase():e.CLAWCONNECT_RELEASE_CHANNEL?(Ie||(Ie=!0,n.warn("[clawagentconnect] CLAWCONNECT_RELEASE_CHANNEL is deprecated; use CLAWAGENTCONNECT_RELEASE_CHANNEL. Legacy support will be removed in 2.0.0.")),String(e.CLAWCONNECT_RELEASE_CHANNEL).trim().toLowerCase()):""}function be(e=ye()){return Pt.test(String(e||""))}function Lt(e=process.env){let n=Re(e);if(["preview","staging","canary","beta","alpha","rc"].includes(n))return!0;if(["production","prod","latest","stable"].includes(n))return!1;let t=String(e.NODE_ENV||"").trim().toLowerCase();return t==="development"||t==="test"||be()}ve.exports={getPackageVersion:ye,isPreviewVersion:be,resolveReleaseChannel:Re,usePreviewFeatures:Lt}});var Be=B((cr,Ce)=>{"use strict";var $e=le(),Se=ke(),{usePreviewFeatures:Mt}=De();function xt(e=process.env){return Mt(e)?$e:Se}Ce.exports={getEnabledBackends:xt,previewBackends:$e,productionBackends:Se}});var ue=B((lr,Ue)=>{var{URL:Kt}=require("url");function qt(e,n,t){let r=Number(e);return Number.isInteger(r)&&r>=n&&r<=t}function Oe(e){try{let n=new Kt(e);return["http:","https:"].includes(n.protocol)}catch{return!1}}function jt(e){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(String(e||""))}var Ft=new Set(["admin","administrator","root","support","system","agentmarket","api","null","undefined"]),Ge=le().map(e=>e.value);function Wt(e){return String(e||"").trim().normalize("NFKC").toLowerCase()}function zt(e){let n=String(e||"").trim();if(n.length<3||n.length>32)return{ok:!1,code:"invalid_username",message:"Username must be 3-32 characters."};if(!/^[a-zA-Z0-9](?:[a-zA-Z0-9._-]{1,30}[a-zA-Z0-9])?$/.test(n)||/[._-]{2,}/.test(n))return{ok:!1,code:"invalid_username",message:"Username can use letters/numbers and optional . _ - (no repeated separators)."};let t=Wt(n);return Ft.has(t)?{ok:!1,code:"username_reserved",message:"This username is reserved."}:{ok:!0,normalized:t,username:n}}function Vt(e){let n=[],r=String(e.NODE_ENV||"development").toLowerCase()==="production",a=String(e.BRIDGE_RUNTIME_BACKEND||"openclaw").toLowerCase();Ge.includes(a)||n.push(`BRIDGE_RUNTIME_BACKEND must be one of: ${Ge.join(", ")}`),(!e.OUTPUT_ROOT&&!e.OPENCLAW_OUTPUT_ROOT||String(e.OUTPUT_ROOT||e.OPENCLAW_OUTPUT_ROOT||"").trim().length<2)&&n.push("OUTPUT_ROOT is required");let c=String(e.BRIDGE_AGENT_ID||e.OPENCLAW_BRIDGE_AGENT_ID||"").trim();a==="openclaw"&&c.length<1&&n.push("BRIDGE_AGENT_ID (or OPENCLAW_BRIDGE_AGENT_ID) is required for openclaw backend");let d=e.BRIDGE_RUNTIME_TIMEOUT_SEC??e.OPENCLAW_BRIDGE_TIMEOUT_SEC;return qt(d,10,3600)||n.push("BRIDGE_RUNTIME_TIMEOUT_SEC (or OPENCLAW_BRIDGE_TIMEOUT_SEC) must be between 10 and 3600"),!e.BRIDGE_TOKEN||String(e.BRIDGE_TOKEN).trim().length===0?n.push("BRIDGE_TOKEN is required"):r&&String(e.BRIDGE_TOKEN).length<24&&n.push("BRIDGE_TOKEN must be at least 24 characters in production"),Oe(e.AGENTMARKET_BASE_URL)||n.push("AGENTMARKET_BASE_URL must be a valid http(s) URL"),{ok:n.length===0,errors:n}}Ue.exports={validateUrl:Oe,validateEmail:jt,validateUsername:zt,validateSetupConfig:Vt}});var ge=B((ur,Me)=>{"use strict";var de="https://www.clawagentmarket.com/";function J(e){return String(e||"").trim().replace(/\/+$/,"")}function Pe(){return de}function Le(e){return J(e)===J(de)}function Ht(e=process.env,n={}){let t=String(e.AGENTMARKET_BASE_URL||"").trim();return t&&!(n.ignoreKnownDefaultEnv&&Le(t))?J(t):J(Pe(e))}Me.exports={AGENTMARKET_PRODUCTION_BASE_URL:de,isKnownAgentMarketDefaultUrl:Le,normalizeAgentMarketBaseUrl:J,resolveAgentMarketBaseUrl:Ht,resolveDefaultAgentMarketBaseUrl:Pe}});var We=B((dr,Fe)=>{var Z=require("fs"),xe=require("path"),{isKnownAgentMarketDefaultUrl:pe}=ge(),ae=["OUTPUT_ROOT","BRIDGE_RUNTIME_BACKEND","BRIDGE_AGENT_ID","BRIDGE_RUNTIME_TIMEOUT_SEC","BRIDGE_TOKEN","NODE_ENV","AGENTMARKET_AGENT_ID","AGENTMARKET_BASE_URL"],Ke=["OPENCLAW_BRIDGE_AGENT_ID","OPENCLAW_BRIDGE_TIMEOUT_SEC","OPENCLAW_OUTPUT_ROOT"];function qe(e,n){return e==="AGENTMARKET_BASE_URL"&&pe(n)}function je(e){let n=e.split(/\r?\n/),t=new Map;for(let r of n){if(!r||r.trim().startsWith("#"))continue;let a=r.indexOf("=");if(a<=0)continue;let c=r.slice(0,a).trim(),d=r.slice(a+1).trim();t.set(c,d)}return t}function Yt({rootDir:e,values:n,profile:t}){let r=String(t||"").trim().toLowerCase()||"default",a=r&&r!=="default"?`.env.${r}`:".env",c=xe.join(e,a),d=xe.join(e,`${a}.bak.${Date.now()}`),f=Z.existsSync(c)?Z.readFileSync(c,"utf8"):"";f&&Z.writeFileSync(d,f,"utf8");let g=je(f);for(let u of Ke)g.delete(u);for(let[u,k]of[...g.entries()])qe(u,k)&&g.delete(u);for(let u of ae)if(n[u]!==void 0&&n[u]!==null){let k=String(n[u]);u==="AGENTMARKET_BASE_URL"&&pe(k)?pe(g.get(u))&&g.delete(u):g.set(u,k)}let h=f.split(/\r?\n/).filter(u=>{if(!u||u.trim().startsWith("#"))return!0;let k=u.indexOf("=");if(k<=0)return!0;let l=u.slice(0,k).trim(),i=u.slice(k+1).trim();return!ae.includes(l)&&!Ke.includes(l)&&!qe(l,i)}),A=ae.filter(u=>g.has(u)).map(u=>`${u}=${g.get(u)}`),T=[...h,...h.length?[""]:[],"# managed by setup wizard",...A].join(`
3
+ `).replace(/\n{3,}/g,`
4
+
5
+ `);Z.writeFileSync(c,`${T}
6
+ `,"utf8");try{Z.chmodSync(c,384)}catch{}return{envPath:c,backupPath:f?d:null}}Fe.exports={MANAGED_KEYS:ae,writeEnv:Yt,parseEnv:je}});var He=B((gr,Ve)=>{var{execFile:Jt}=require("child_process"),{promisify:Zt}=require("util"),M=Zt(Jt);async function Q(e){try{return await M("bash",["-lc",`command -v ${e}`],{timeout:5e3}),!0}catch{return!1}}function X(e,n=!1){let t=String(e||"").trim().toLowerCase()||"default",r=n?"clawconnect":"clawagentconnect";return t==="default"?r:`${r}-${t}`}async function Xt(){if(!await Q("pm2"))return[];try{let{stdout:e}=await M("bash",["-lc","pm2 jlist"],{timeout:1e4});return JSON.parse(e||"[]")}catch{return[]}}async function ze(e){return(await Xt()).some(t=>{let r=String(t.name||"");return(e?r===X(e,!0):r==="clawconnect"||r.startsWith("clawconnect-"))&&t.pm2_env&&t.pm2_env.status==="online"})}async function Qt({rootDir:e,profile:n,packageDir:t}){let r=String(n||"").trim().toLowerCase()||"default",a=r==="default",c=X(r),d=X(r,!0),f=a?"bridge.log":`bridge-${r}.log`,g=a?"":`BRIDGE_PROFILE=${r} `,A=`${t||e}/server.js`,T=`CLAWAGENTCONNECT_PROFILE_DIR='${e}' `;if(await Q("pm2")){let l=await ze(r);l&&await M("bash",["-lc",`pm2 stop ${d} && pm2 save`],{timeout:15e3});try{return await M("bash",["-lc",`(pm2 delete ${c} 2>/dev/null || true) && ${T}${g}pm2 start '${A}' --name ${c} --time && pm2 save`],{timeout:3e4}),{mode:"pm2",appName:c,migratedLegacyProcess:l}}catch(i){if(l)try{await M("bash",["-lc",`pm2 restart ${d} && pm2 save`],{timeout:15e3})}catch{}throw i}}let k=`${e}/${f}`;return await M("bash",["-lc",`${T}${g}nohup node '${A}' > '${k}' 2>&1 &`],{timeout:1e4}),{mode:"nohup",appName:c}}async function en({rootDir:e,profile:n}){let t=String(n||"").trim().toLowerCase()||"default",r=!t||t==="default",a=X(t);if(await Q("pm2")){try{await M("bash",["-lc",`pm2 stop ${a} 2>/dev/null && pm2 save`],{timeout:15e3})}catch{}return{mode:"pm2",appName:a}}let d=r?"node.*server.js":`BRIDGE_PROFILE=${t}`;try{await M("bash",["-lc",`pkill -f '${d}' 2>/dev/null; true`],{timeout:5e3})}catch{}return{mode:"nohup",appName:a}}async function tn(e){if(await Q("pm2"))try{let{stdout:r}=await M("bash",["-lc","pm2 jlist"],{timeout:1e4}),c=JSON.parse(r||"[]").find(d=>d.name===e);return c?c.pm2_env&&c.pm2_env.status==="online"?"running":"stopped":"not registered"}catch{return"unknown"}let t=e==="clawagentconnect"?"node.*server.js":`BRIDGE_PROFILE=${e.replace("clawagentconnect-","")}`;try{return await M("bash",["-lc",`pgrep -f '${t}' > /dev/null 2>&1`],{timeout:5e3}),"running"}catch{return"stopped"}}Ve.exports={appNameForProfile:X,getBridgeStatus:tn,hasCommand:Q,hasRunningLegacyBridge:ze,startBridge:Qt,stopBridge:en}});var tt=B((pr,et)=>{"use strict";var x=require("fs"),me=require("os"),q=require("path"),se="CLAWAGENTCONNECT_PROFILE_DIR",V="CLAWCONNECT_PROFILE_DIR",Je=".migration-from-clawconnect-v1",Ye=!1;function nn(e=console){Ye||(Ye=!0,e.warn(`[clawagentconnect] ${V} is deprecated; use ${se}. Legacy support will be removed in 2.0.0.`))}function Ze(e=process.env,n=me.homedir(),t=console){return e[se]?q.resolve(e[se]):e[V]?(nn(t),q.resolve(e[V])):q.join(n,".clawagentconnect")}function Xe(e=process.env,n=me.homedir()){return e[V]?q.resolve(e[V]):q.join(n,".clawconnect")}function Qe(e){return(e===".env"||e.startsWith(".env."))&&!e.includes(".bak.")}function rn(e){x.mkdirSync(e,{recursive:!0,mode:448});try{x.chmodSync(e,448)}catch{}}function on(e={}){let n=e.env||process.env,t=e.homeDir||me.homedir(),r=e.logger||console,a=Ze(n,t,r),c=Xe(n,t);if(c===a||!x.existsSync(c))return{source:c,destination:a,migrated:[],conflicts:[],skipped:!0};rn(a);let d=[],f=[],g=x.readdirSync(c).filter(Qe);for(let A of g){let T=q.join(c,A),u=q.join(a,A);if(x.existsSync(u)){f.push(A);continue}x.copyFileSync(T,u,x.constants.COPYFILE_EXCL);try{x.chmodSync(u,384)}catch{}d.push(A)}let h=q.join(a,Je);return x.existsSync(h)||x.writeFileSync(h,`source=${c}
7
+ migrated_at=${new Date().toISOString()}
8
+ `,{encoding:"utf8",mode:384,flag:"wx"}),d.length&&r.log(`[clawagentconnect] Migrated ${d.length} profile(s) from ${c} to ${a}.`),f.length&&r.warn(`[clawagentconnect] Kept existing destination profile(s), without overwriting: ${f.join(", ")}`),{source:c,destination:a,migrated:d,conflicts:f,skipped:!1}}et.exports={LEGACY_PROFILE_ENV:V,MIGRATION_MARKER:Je,NEW_PROFILE_ENV:se,isProfileFile:Qe,legacyProfileDir:Xe,migrateLegacyProfiles:on,resolveProfileDir:Ze}});var rt=B((mr,nt)=>{var{execFile:an}=require("child_process"),{promisify:sn}=require("util"),cn=require("os"),ln=require("path"),H=sn(an);async function un(e,n=["--version"]){try{let{stdout:t,stderr:r}=await H(e,n,{timeout:8e3});return{ok:!0,output:String(t||r||"").trim()}}catch(t){return{ok:!1,output:t.message}}}async function dn(e){try{let n=await fetch(e,{method:"GET"});if(!n.ok)return{ok:!1,status:n.status};let t=await n.json().catch(()=>({}));return{ok:!0,status:n.status,body:t}}catch(n){return{ok:!1,error:n.message}}}async function gn(e){let{stdout:n}=await H("openclaw",["agents","list"],{timeout:1e4});return String(n||"").split(`
9
+ `).some(t=>t.includes(e))}async function pn(e){let n=ln.join(cn.homedir(),e,"workspace");await H("openclaw",["agents","add",e,"--workspace",n,"--non-interactive"],{timeout:3e4})}async function mn(e){let{stdout:n}=await H("hermes",["profile","list"],{timeout:1e4});return String(n||"").split(`
10
+ `).some(t=>t.trim()===e||t.includes(` ${e} `)||t.startsWith(`${e} `)||t.startsWith(`${e} `)||t===e)}async function fn(e){let n=!1;try{await H("hermes",["profile","create",e,"--clone"],{timeout:3e4}),n=!0}catch{await H("hermes",["profile","create",e],{timeout:3e4})}return{modelConfigured:n}}nt.exports={checkCommand:un,checkHealth:dn,openClawAgentExists:gn,createOpenClawAgent:pn,hermesProfileExists:mn,createHermesProfile:fn}});var st=B((fr,at)=>{var{validateEmail:fe}=ue(),ot="2026-05-11";function Ee(){return{terms_accepted:!0,privacy_acknowledged:!0,legal_version:ot,accepted_at:new Date().toISOString()}}async function U(e,{method:n="GET",headers:t={},body:r,timeoutMs:a=15e3}={}){let c=new AbortController,d=setTimeout(()=>c.abort(),a);try{let f=await fetch(e,{method:n,headers:{"Content-Type":"application/json",...t},body:r?JSON.stringify(r):void 0,signal:c.signal}),g=await f.json().catch(()=>({}));return{ok:f.ok,status:f.status,data:g}}finally{clearTimeout(d)}}function L(e,n){let t=String(e||"").trim().replace(/\/+$/,""),r=String(n||"").trim();return`${t}${r.startsWith("/")?r:`/${r}`}`}async function En({baseUrl:e,mode:n,email:t,password:r,name:a,legalAcceptance:c}){if(!fe(t))throw new Error("Invalid email format");if(n!=="register"&&!r)throw new Error("Password is required for login mode");if(r&&r.length>0&&r.length<8)throw new Error("Password must be at least 8 characters");let d=n==="register"?"/api/auth/register":"/api/auth/login",f=n==="register"?{email:t,password:r,name:a||"",legal_acceptance:c||Ee()}:{email:t,password:r},g=L(e,d),h=await U(g,{method:"POST",body:f});if(!h.ok||!h.data.token)throw new Error(`AgentMarket auth failed (${h.status}) at ${g}: ${h.data.error||h.data.message||"unknown"}`);return{jwt:h.data.token,bridge_token:h.data.bridge_token||null}}async function hn({baseUrl:e,email:n}){if(!fe(n))throw new Error("Invalid email format");let t=L(e,"/api/auth/otp/send"),r=await U(t,{method:"POST",body:{email:n}});if(!r.ok)throw new Error(`OTP send failed (${r.status}) at ${t}: ${r.data.error||r.data.message||"unknown"}`)}async function wn({baseUrl:e,email:n,otp:t}){if(!fe(n))throw new Error("Invalid email format");if(!t||typeof t!="string"||!t.trim())throw new Error("OTP code is required");let r=L(e,"/api/auth/otp/verify"),a=await U(r,{method:"POST",body:{email:n,token:t.trim()}});if(!a.ok||!a.data.token)throw new Error(`OTP verify failed (${a.status}) at ${r}: ${a.data.error||a.data.message||"unknown"}`);return{jwt:a.data.token,refresh_token:a.data.refresh_token||null}}async function _n({baseUrl:e,refreshToken:n}){if(!n||typeof n!="string"||!n.trim())throw new Error("refresh_token is required");let t=L(e,"/api/auth/token/refresh"),r=await U(t,{method:"POST",body:{refresh_token:n.trim()}});if(!r.ok||!r.data.token)throw new Error(`Token refresh failed (${r.status}) at ${t}: ${r.data.error||r.data.message||"unknown"}`);return{jwt:r.data.token,refresh_token:r.data.refresh_token||null}}async function An({baseUrl:e,token:n}){let t=L(e,"/api/users/me/bridge-token"),r=await U(t,{method:"GET",headers:{Authorization:`Bearer ${n}`}});if(r.ok&&r.data.bridge_token)return r.data.bridge_token;if(r.ok&&!r.data.bridge_token)throw new Error("bridge_token_not_retrievable: Your bridge token is stored privately and can no longer be fetched. Copy BRIDGE_TOKEN from your existing .env file on another machine, or rotate it from your AgentMarket profile page.");if(r.status===404&&r.data.error==="bridge_token_not_found"){let a=await U(t,{method:"POST",headers:{Authorization:`Bearer ${n}`}});if(a.ok&&a.data.bridge_token)return a.data.bridge_token;throw new Error(`Bridge token create failed (${a.status}) at ${t}: ${a.data.error||a.data.message||"unknown"}`)}throw new Error(`Bridge token fetch failed (${r.status}) at ${t}: ${r.data.error||r.data.message||"unknown"}`)}async function Tn({baseUrl:e,token:n}){let t=L(e,"/api/users/me/bridge-token/rotate"),r=await U(t,{method:"POST",headers:{Authorization:`Bearer ${n}`}});if(r.ok&&r.data.bridge_token)return r.data.bridge_token;throw new Error(`Bridge token rotate failed (${r.status}) at ${t}: ${r.data.error||r.data.message||"unknown"}`)}async function kn({baseUrl:e,token:n,endpointUrl:t}){let r=L(e,"/api/bridge/probe"),a=await U(r,{method:"POST",headers:{Authorization:`Bearer ${n}`},body:{endpoint_url:t}});if(!a.ok)throw new Error(`Bridge probe request failed (${a.status}) at ${r}: ${a.data.error||a.data.message||"unknown"}`);return a.data}async function Nn({baseUrl:e}){let n=L(e,"/api/skills/templates"),t=await U(n,{method:"GET"});if(!t.ok||!Array.isArray(t.data.templates))throw new Error(`Skill template fetch failed (${t.status}) at ${n}: ${t.data.error||t.data.message||"unknown"}`);return t.data.templates}async function In({baseUrl:e,token:n,agent:t,legalAcceptance:r}){let a=L(e,"/api/agents/register"),c=await U(a,{method:"POST",headers:{Authorization:`Bearer ${n}`},body:{...t,legal_acceptance:r||Ee()}});if(!c.ok||!c.data.agent_id)throw new Error(`Agent registration failed (${c.status}) at ${a}: ${c.data.error||c.data.message||"unknown"}`);return c.data}async function yn({baseUrl:e,bridgeToken:n,orderId:t,filePath:r,filename:a,mimeType:c,timeoutMs:d=12e4}){let f=require("fs"),g=require("crypto"),h=a||"output.bin",A=c||"application/octet-stream",T=L(e,`/api/bridge/jobs/${encodeURIComponent(t)}/result/presign`),u=await U(T,{method:"POST",headers:{"x-bridge-token":n},body:{filename:h,mime_type:A},timeoutMs:d});if(!u.ok)throw new Error(`Presign request failed (${u.status}) at ${T}: ${u.data.error||"unknown"}`);let{presign_url:k,object_key:l,file_id:i,max_file_bytes:v,max_file_size_label:D}=u.data;if(!k||!l||!i)throw new Error("Presign response missing required fields (presign_url, object_key, file_id)");let P=f.readFileSync(r),F=g.createHash("sha256").update(P).digest("hex"),m=P.length,w=Number(v);if(Number.isFinite(w)&&w>0&&m>w)throw new Error(`file_size_exceeded: File exceeds maximum allowed size (${D||`${Math.trunc(w)} bytes`})`);let N=new AbortController,R=setTimeout(()=>N.abort(),d);try{let C=await fetch(k,{method:"PUT",headers:{"Content-Type":A},body:P,signal:N.signal});if(!C.ok)throw new Error(`R2 direct upload failed (${C.status})`)}finally{clearTimeout(R)}let I=L(e,`/api/bridge/jobs/${encodeURIComponent(t)}/result/confirm`),y=await U(I,{method:"POST",headers:{"x-bridge-token":n},body:{object_key:l,file_id:i,filename:h,mime_type:A,checksum_sha256:F,size_bytes:m},timeoutMs:d});if(!y.ok)throw new Error(`Confirm request failed (${y.status}) at ${I}: ${y.data.error||"unknown"}`);return y.data}at.exports={LEGAL_VERSION:ot,buildLegalAcceptance:Ee,authAgentMarket:En,sendLoginOtp:hn,verifyLoginOtp:wn,refreshAccessToken:_n,fetchBridgeToken:An,rotateBridgeToken:Tn,probeBridgeEndpoint:kn,fetchSkillTemplates:Nn,registerAgent:In,submitPresignedResult:yn}});var ct=B((Er,it)=>{var Rn=require("fs"),bn=require("path");function vn(e,n){let t=bn.join(e,"setup-summary.json");return Rn.writeFileSync(t,JSON.stringify(n,null,2)),t}it.exports={writeSummary:vn}});var ut=B((hr,lt)=>{"use strict";function Dn(e){return(Array.isArray(e)?e:[]).filter(n=>n&&(n.template_id||n.name)).map(n=>({...n,price:0,currency:n.currency||"USDC"}))}lt.exports={normalizeFreeAgentSkills:Dn}});(function(){try{require.resolve("@clack/prompts")}catch{console.error("[setup] Missing package dependencies. Reinstall clawagentconnect, or run npm install in a user-writable checkout."),process.exit(1)}})();var G=require("fs"),$n=require("os"),W=require("path"),o=require("@clack/prompts"),{getEnabledBackends:Sn}=Be(),ft=Sn(),ee=ft.map(e=>e.value),{validateSetupConfig:Cn,validateUrl:wr,validateUsername:te}=ue(),{writeEnv:dt}=We(),{appNameForProfile:Et,hasCommand:Bn,startBridge:he,stopBridge:gt,getBridgeStatus:ht}=He(),{migrateLegacyProfiles:Gn,resolveProfileDir:On}=tt(),{checkCommand:j,openClawAgentExists:Un,createOpenClawAgent:Pn,hermesProfileExists:Ln,createHermesProfile:Mn}=rt(),{LEGAL_VERSION:xn,buildLegalAcceptance:wt,authAgentMarket:_e,sendLoginOtp:_t,verifyLoginOtp:At,fetchBridgeToken:Kn,rotateBridgeToken:qn,fetchSkillTemplates:pt,registerAgent:jn}=st(),{writeSummary:Fn}=ct(),{normalizeFreeAgentSkills:Wn}=ut(),{resolveAgentMarketBaseUrl:Tt}=ge(),we=W.join(__dirname,".."),$=On();function zn(e){let n={};for(let t=2;t<e.length;t++){let r=e[t];if(!r.startsWith("--"))continue;let a=r.slice(2),c=e[t+1];!c||c.startsWith("--")?n[a]=!0:(n[a]=c,t++)}return n}function Vn(e){if(!e)return"";let n=String(e);return n.length<8?"***":`${n.slice(0,3)}***${n.slice(-3)}`}function Hn(){return{OUTPUT_ROOT:`/home/${$n.userInfo().username}/output`,BRIDGE_RUNTIME_BACKEND:"openclaw",BRIDGE_AGENT_ID:"agentmarket",BRIDGE_RUNTIME_TIMEOUT_SEC:240,BRIDGE_TOKEN:"pending_from_agentmarket",NODE_ENV:"production",AGENTMARKET_BASE_URL:Tt(process.env)}}function kt(e){let n=String(e||"Authentication failed");return n.includes("username_already_exists")?"That username already exists. Choose another one.":n.includes("invalid_username")?"Invalid username. Use 3-32 chars: letters/numbers with optional . _ - (no repeated separators).":n.includes("username_reserved")?"That username is reserved. Choose another one.":n}function _(e){return o.isCancel(e)&&(o.cancel("Setup cancelled."),process.exit(0)),e}function Yn(e){return!e||!/^[a-z0-9_-]{1,32}$/.test(e)?"Profile name must be 1-32 chars: lowercase letters, digits, _ or - only.":null}function Nt(e){return String(e||"").trim().toLowerCase().replace(/[^a-z0-9_-]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").slice(0,32)||"default"}function Jn(e){let n;try{n=G.readdirSync(e).filter(r=>r===".env"||r.startsWith(".env.")&&!r.includes(".bak."))}catch{return[]}let t=n.filter(r=>r.startsWith(".env."));return t.length>0&&(n=t),n.map(r=>{let a=r===".env"?"default":r.slice(5),c=W.join(e,r),d=G.existsSync(c)?G.readFileSync(c,"utf8"):"",f=d.match(/^BRIDGE_AGENT_ID=(.+)$/m),g=f?f[1].trim():"(not set)",h=d.match(/^AGENTMARKET_AGENT_ID=(.+)$/m),A=h?h[1].trim():"(not registered)",T=d.match(/^BRIDGE_RUNTIME_BACKEND=(.+)$/m),u=T?T[1].trim():"openclaw",k=Et(a);return{profile:a,envFile:r,envPath:c,agentId:g,amAgentId:A,backend:u,appName:k}})}async function It(e){let n=Jn(e);return Promise.all(n.map(async t=>{let r=await ht(t.appName);return{...t,status:r,running:r==="running"}}))}async function Zn(e){let n=await It(e);if(!n.length){console.log("No profiles found.");return}for(let t of n)console.log(`Profile: ${t.profile}`),console.log(` Env file: ${t.envFile}`),console.log(` Agent ID: ${t.agentId}`),console.log(` AM ID: ${t.amAgentId}`),console.log(` Backend: ${t.backend}`),console.log(` PM2 name: ${t.appName}`),console.log(` State: ${t.status}`),console.log()}function Xn(e){return[`${e} is governed by the AgentMarket Terms of Use and Privacy Policy.`,`Legal document version: ${xn}`,"Terms: /terms","Privacy: /privacy"].join(`
11
+ `)}async function mt(e){return o.log.info(Xn(e)),_(await o.confirm({message:"Do you accept the Terms of Use and acknowledge the Privacy Policy?",initialValue:!1}))||(o.cancel("Setup cancelled. Legal acknowledgement is required to continue."),process.exit(0)),wt()}async function Qn(e,n){o.log.step("Step 4 \xB7 Agent profile");let t=_(await o.text({message:"Agent name",validate:g=>{if(!g.trim())return"Agent name cannot be empty."}})),r=_(await o.text({message:"Agent description (optional)"})),a=(n||[]).filter(g=>g&&g.id&&g.label&&g.enabled!==!1);if(!a.length)throw new Error("No skill templates available from AgentMarket. Cannot continue interactive agent registration.");let c=_(await o.select({message:"Primary skill template",options:a.map(g=>({value:g.id,label:g.label,hint:g.description||""}))})),d=a.find(g=>g.id===c),f=_(await o.text({message:"Primary skill description",initialValue:d.description||"",placeholder:d.description||""}));return{name:t.trim(),description:(r||"").trim(),connection_mode:"pull",skills:[{template_id:d.id,name:d.label,description:(f||"").trim()||d.description||"",price:0,currency:"USDC"}]}}async function er(e,n){let t={...e},r=(n||[]).map(m=>m.profile),a="default";o.log.step("Step 1 \xB7 Agent identity & bridge configuration");let c=_(await o.text({message:"Local agent ID (BRIDGE_AGENT_ID)",initialValue:t.BRIDGE_AGENT_ID,placeholder:t.BRIDGE_AGENT_ID,validate:m=>{if(!m.trim())return"Agent ID cannot be empty."}}));if(t.BRIDGE_AGENT_ID=c.trim(),a=Nt(t.BRIDGE_AGENT_ID),r.includes(a)){let m=n.find(N=>N.profile===a);o.log.warn(`Profile '${a}' already exists (${m.envFile}, ${m.running?"running":"stopped"}).
12
+ Continuing will update this profile's configuration.`),_(await o.confirm({message:"Continue and update this profile?",initialValue:!1}))||(o.cancel("Setup cancelled."),process.exit(0))}let d=_(await o.select({message:"Runtime backend",options:ft,initialValue:t.BRIDGE_RUNTIME_BACKEND}));t.BRIDGE_RUNTIME_BACKEND=d;let f=_(await o.text({message:"Output root directory",initialValue:t.OUTPUT_ROOT,placeholder:t.OUTPUT_ROOT,validate:m=>{if(!m.trim())return"Path cannot be empty."}}));if(t.OUTPUT_ROOT=f.trim(),t.BRIDGE_RUNTIME_BACKEND==="openclaw"){let m=o.spinner();m.start(`Checking openclaw for agent '${t.BRIDGE_AGENT_ID}'\u2026`);let w=!1,N=null;try{w=await Un(t.BRIDGE_AGENT_ID),m.stop("Agent check complete.")}catch(R){m.stop(`Could not verify agent list: ${R.message} \u2014 continuing.`,1),N=R}if(!N){if(w)o.log.success(`Agent '${t.BRIDGE_AGENT_ID}' found in openclaw.`);else if(o.log.warn(`Agent '${t.BRIDGE_AGENT_ID}' was not found in openclaw.`),_(await o.confirm({message:`Create agent '${t.BRIDGE_AGENT_ID}' in openclaw now?`,initialValue:!0}))){let I=o.spinner();I.start(`Creating agent '${t.BRIDGE_AGENT_ID}' in openclaw\u2026`);try{await Pn(t.BRIDGE_AGENT_ID),I.stop(`Agent '${t.BRIDGE_AGENT_ID}' created successfully.`)}catch(y){I.stop(`Failed to create agent: ${y.message}`,1),o.log.warn("Continuing without creating the agent. You can create it manually later.")}}}}else if(t.BRIDGE_RUNTIME_BACKEND==="hermes"&&t.BRIDGE_AGENT_ID){let m=o.spinner();m.start(`Checking hermes for profile '${t.BRIDGE_AGENT_ID}'\u2026`);let w=!1,N=null;try{w=await Ln(t.BRIDGE_AGENT_ID),m.stop("Profile check complete.")}catch(R){m.stop(`Could not verify hermes profiles: ${R.message} \u2014 continuing.`,1),N=R}if(!N){if(w)o.log.success(`Hermes profile '${t.BRIDGE_AGENT_ID}' found.`);else if(o.log.warn(`Hermes profile '${t.BRIDGE_AGENT_ID}' was not found.`),_(await o.confirm({message:`Create hermes profile '${t.BRIDGE_AGENT_ID}' now?`,initialValue:!0}))){let I=o.spinner();I.start(`Creating hermes profile '${t.BRIDGE_AGENT_ID}'\u2026`);try{let{modelConfigured:y}=await Mn(t.BRIDGE_AGENT_ID);y?I.stop(`Hermes profile '${t.BRIDGE_AGENT_ID}' created and model configured.`):(I.stop(`Hermes profile '${t.BRIDGE_AGENT_ID}' created.`),o.log.warn(`No inference model configured for this profile.
13
+ Run: hermes model --profile ${t.BRIDGE_AGENT_ID}
14
+ then choose your provider and model before placing orders.`))}catch(y){I.stop(`Failed to create hermes profile: ${y.message}`,1),o.log.warn("Continuing without creating the profile. You can create it manually later with: hermes profile create "+t.BRIDGE_AGENT_ID)}}}}let g=t.BRIDGE_RUNTIME_BACKEND==="hermes"?Math.max(Number(t.BRIDGE_RUNTIME_TIMEOUT_SEC)||0,600):Number(t.BRIDGE_RUNTIME_TIMEOUT_SEC)||240,h=_(await o.text({message:"Execution timeout in seconds (BRIDGE_RUNTIME_TIMEOUT_SEC)",initialValue:String(g),validate:m=>{let w=Number(m);if(!Number.isFinite(w)||w<=0)return"Must be a positive number."}}));t.BRIDGE_RUNTIME_TIMEOUT_SEC=Number(h),o.log.step("Step 2 \xB7 Security & environment"),t.NODE_ENV="production",o.log.info("NODE_ENV: production"),o.log.step("Step 3 \xB7 AgentMarket account"),t.AGENTMARKET_BASE_URL=Tt(process.env);let T=_(await o.confirm({message:"Do you already have an AgentMarket account?",initialValue:!0}))?"login":"register",u="";u=_(await o.text({message:"Account email",validate:m=>{if(!m.trim())return"Email cannot be empty."}})).trim();let l=!1;T==="login"&&(l=_(await o.confirm({message:"Does your account use Google / passwordless login (no password)?",initialValue:!1})));let i=null,v="";if(l){let m=o.spinner();m.start(`Sending login code to ${u}\u2026`);try{await _t({baseUrl:t.AGENTMARKET_BASE_URL,email:u}),m.stop(`Code sent to ${u}.`)}catch(R){m.stop(`Failed to send code: ${R.message}`,1),o.cancel("Setup cancelled \u2014 could not send login code."),process.exit(1)}let w=_(await o.text({message:`Enter the 6-digit code sent to ${u}`,validate:R=>{if(!R.trim())return"Code cannot be empty."}})),N=o.spinner();N.start("Verifying code\u2026");try{i=await At({baseUrl:t.AGENTMARKET_BASE_URL,email:u,otp:w.trim()}),N.stop("Code verified.")}catch(R){N.stop(`Verification failed: ${R.message}`,1),o.cancel("Setup cancelled \u2014 OTP verification failed."),process.exit(1)}}else{let m=_(await o.password({message:"Account password",validate:w=>{if(w.length<8)return"Password must be at least 8 characters."}}));v=m,T==="register"&&_(await o.password({message:"Confirm password",validate:w=>{if(w!==m)return"Passwords do not match."}}))}let D="",P=null;if(T==="register"){o.log.info("Username: 3-32 chars; letters/numbers with optional . _ - ; no repeated separators.");let m=_(await o.text({message:"Choose a username",validate:w=>{let N=te(w.trim());if(!N.ok)return N.message}}));D=te(m.trim()).username,P=await mt("Creating an AgentMarket account")}let F=null;if(i)F={jwt:i.jwt,bridge_token:null};else for(;!F;){let m=o.spinner();m.start("Authenticating with AgentMarket\u2026");try{F=await _e({baseUrl:t.AGENTMARKET_BASE_URL,mode:T,email:u,password:v,name:D,legalAcceptance:P}),m.stop("Authenticated successfully.")}catch(w){m.stop(`Authentication failed: ${kt(w.message)}`,1),_(await o.confirm({message:"Try again with different credentials?",initialValue:!0}))||(o.cancel("Setup cancelled."),process.exit(0)),u=_(await o.text({message:"Account email",validate:y=>{if(!y.trim())return"Email cannot be empty."}})).trim();let I=_(await o.password({message:"Account password",validate:y=>{if(y.length<8)return"Password must be at least 8 characters."}}));if(v=I,T==="register"){_(await o.password({message:"Confirm password",validate:C=>{if(C!==I)return"Passwords do not match."}})),o.log.info("Username: 3-32 chars; letters/numbers with optional . _ - ; no repeated separators.");let y=_(await o.text({message:"Choose a username",validate:C=>{let ne=te(C.trim());if(!ne.ok)return ne.message}}));D=te(y.trim()).username,P=await mt("Creating an AgentMarket account")}}}return{cfg:t,profile:a,market:{baseUrl:t.AGENTMARKET_BASE_URL,mode:T,email:u,password:v,accountName:D,accountLegalAcceptance:P,useOtp:l,oauthAuth:i,auth:F,registerAgentNow:null,agent:null}}}function tr(e,n){let r=String(e["has-account"]||"yes").toLowerCase()==="no"?"register":"login",a=String(e["register-agent"]||"yes").toLowerCase()!=="no",c=String(e["accept-legal"]||"no").toLowerCase()==="yes";if(r==="register"&&!c&&(console.error("Missing --accept-legal yes. Legal acknowledgement is required when creating a new account."),process.exit(3)),r==="register"){e.name||(console.error("Missing --name. Username is required when --has-account no."),process.exit(3));let A=te(e.name);A.ok||(console.error(`Invalid --name: ${A.message}`),process.exit(3))}let d=Wn(JSON.parse(e["skills-json"]||"[]")),f=String(e["primary-skill-id"]||"").trim(),g=String(e["primary-skill-label"]||"").trim(),h=String(e["primary-skill-description"]||"").trim();return{baseUrl:n.AGENTMARKET_BASE_URL,mode:r,email:e.email,password:e.password,accountName:e.name||"",accountLegalAcceptance:c?wt():null,useOtp:String(e["auth-method"]||"").toLowerCase()==="otp",oauthAuth:null,auth:null,registerAgentNow:a,agent:a?{name:e["agent-name"],description:e["agent-description"]||"",connection_mode:"pull",skills:d.length?d:f?[{template_id:f,name:g||f,description:h,price:0,currency:"USDC"}]:[]}:null}}async function nr(){let e=zn(process.argv),n=Hn(),t=!!e["non-interactive"];if(t){let s=String(e["has-account"]||"yes").toLowerCase()==="no"?"register":"login",p=String(e["accept-legal"]||"no").toLowerCase()==="yes";s==="register"&&!p&&(console.error("Missing --accept-legal yes. Legal acknowledgement is required when creating a new account."),process.exit(3))}if(Gn(),G.mkdirSync($,{recursive:!0,mode:448}),e["list-profiles"]&&(await Zn($),process.exit(0)),e.enable!==void 0||e.disable!==void 0){let p=(e.enable!==void 0?e.enable===!0?"default":String(e.enable):e.disable===!0?"default":String(e.disable)).trim().toLowerCase()||"default",E=e.enable!==void 0?"enable":"disable",b=p==="default"?".env":`.env.${p}`,O=W.join($,b);if(G.existsSync(O)||(console.error(`No profile '${p}' found (${b} does not exist).`),console.error("Use --list-profiles to see registered profiles."),process.exit(1)),E==="enable"){let K=await he({rootDir:$,profile:p,packageDir:we});console.log(`\u2705 Profile '${p}' bridge started (${K.mode}: ${K.appName}). Agent will appear active on the website.`)}else{let K=await gt({rootDir:$,profile:p});console.log(`\u2705 Profile '${p}' bridge stopped (${K.mode}: ${K.appName}). Agent will appear inactive on the website.`)}process.exit(0)}if(e["delete-profile"]!==void 0){let p=(e["delete-profile"]===!0?"default":String(e["delete-profile"])).trim().toLowerCase()||"default",E=p==="default"?".env":`.env.${p}`,b=W.join($,E);G.existsSync(b)||(console.error(`No profile '${p}' found (${E} does not exist).`),console.error("Use --list-profiles to see registered profiles."),process.exit(1));let O=Et(p);if(await ht(O)==="running"){let Y=await gt({rootDir:$,profile:p});console.log(`Bridge stopped (${Y.mode}: ${Y.appName}).`)}G.unlinkSync(b);let ce;try{ce=G.readdirSync($)}catch{ce=[]}let Rt=E+".bak.";for(let Y of ce)if(Y.startsWith(Rt))try{G.unlinkSync(W.join($,Y))}catch{}console.log(`\u2705 Profile '${p}' deleted.`),process.exit(0)}let r=String(e.profile||"").trim().toLowerCase()||"default",a=Yn(r);a&&(console.error(`Invalid --profile: ${a}`),process.exit(3)),t||(o.intro(" OpenClaw Bridge Setup "),o.log.step("Pre-flight checks"));let c=await It($),d=await j("node",["-v"]),f=await j("npm",["-v"]),g=await j("openclaw",["--version"]),h=await j("zeroclaw",["--version"]),A=await j("hermes",["--version"]),T=await Bn("pm2"),u=String(e["runtime-backend"]||n.BRIDGE_RUNTIME_BACKEND).toLowerCase(),k=ee.includes(u)?u:"openclaw";if(t){if(console.log(`OpenClaw Bridge setup wizard
15
+ `),console.log("Pre-checks:"),console.log(`- node: ${d.ok?d.output:"missing"}`),console.log(`- npm: ${f.ok?f.output:"missing"}`),console.log(`- openclaw: ${g.ok?g.output:"missing"}`),console.log(`- zeroclaw: ${h.ok?h.output:"missing"}`),console.log(`- hermes: ${A.ok?A.output:"missing"}`),console.log(`- pm2: ${T?"available":"not found (nohup fallback)"}`),c.length>0){console.log(`
16
+ Registered profiles:`);for(let s of c)console.log(` ${s.profile.padEnd(20)} agent: ${s.agentId.padEnd(24)} backend: ${s.backend.padEnd(12)} [${s.status}]`)}}else if(o.log.info(`node ${d.ok?d.output:"\u2717 missing"}`),o.log.info(`npm ${f.ok?f.output:"\u2717 missing"}`),o.log.info(`openclaw ${g.ok?g.output:"\u2717 not found"}`),o.log.info(`zeroclaw ${h.ok?h.output:"\u2717 not found"}`),o.log.info(`hermes ${A.ok?A.output:"\u2717 not found"}`),o.log.info(`pm2 ${T?"available":"not found (nohup fallback)"}`),c.length>0){o.log.info(""),o.log.info("Registered profiles:");for(let s of c)o.log.info(` ${s.profile.padEnd(20)} agent: ${s.agentId.padEnd(24)} backend: ${s.backend.padEnd(12)} [${s.status}]`)}if(!d.ok||!f.ok){let s="Fatal: node and npm are required. Install them and retry.";t?console.error(s):o.log.error(s),process.exit(1)}if(k==="openclaw"&&!g.ok){let s="openclaw command not found in PATH. Install OpenClaw CLI or choose zeroclaw backend.";t?console.error(s):o.log.error(s),process.exit(1)}if(k==="zeroclaw"&&!h.ok){let s="zeroclaw command not found in PATH. Install ZeroClaw CLI or choose openclaw backend.";t?console.error(s):o.log.error(s),process.exit(1)}if(k==="hermes"&&!A.ok){let s="hermes command not found in PATH. Install Hermes Agent CLI or choose openclaw backend.";t?console.error(s):o.log.error(s),process.exit(1)}let l={...n},i=null,v=r;if(t)l={...l,BRIDGE_RUNTIME_BACKEND:e["runtime-backend"]||l.BRIDGE_RUNTIME_BACKEND,OUTPUT_ROOT:e["output-root"]||l.OUTPUT_ROOT,BRIDGE_AGENT_ID:e["bridge-agent-id"]||l.BRIDGE_AGENT_ID,BRIDGE_RUNTIME_TIMEOUT_SEC:Number(e["bridge-timeout-sec"]||l.BRIDGE_RUNTIME_TIMEOUT_SEC),NODE_ENV:e["node-env"]||l.NODE_ENV,AGENTMARKET_BASE_URL:e["agentmarket-base-url"]||l.AGENTMARKET_BASE_URL},l.OPENCLAW_BRIDGE_AGENT_ID=l.BRIDGE_AGENT_ID,l.OPENCLAW_BRIDGE_TIMEOUT_SEC=l.BRIDGE_RUNTIME_TIMEOUT_SEC,l.BRIDGE_RUNTIME_BACKEND=String(l.BRIDGE_RUNTIME_BACKEND||"openclaw").toLowerCase(),ee.includes(l.BRIDGE_RUNTIME_BACKEND)||(console.error(`Invalid --runtime-backend. Use: ${ee.join(" or ")}.`),process.exit(3)),r==="default"&&l.BRIDGE_AGENT_ID&&l.BRIDGE_AGENT_ID!==n.BRIDGE_AGENT_ID&&(v=Nt(l.BRIDGE_AGENT_ID)),i=tr(e,l);else{let s=await er(n,c);l=s.cfg,i=s.market,v=s.profile||"default"}if(l.BRIDGE_RUNTIME_BACKEND=String(l.BRIDGE_RUNTIME_BACKEND||"openclaw").toLowerCase(),!ee.includes(l.BRIDGE_RUNTIME_BACKEND)){let s=`Invalid runtime backend. Use: ${ee.join(" or ")}.`;t?console.error(s):o.log.error(s),process.exit(3)}if(l.BRIDGE_RUNTIME_BACKEND==="openclaw"&&!(await j("openclaw",["--version"])).ok){let s="openclaw command not available in PATH.";t?console.error(s):o.log.error(s),process.exit(3)}else if(l.BRIDGE_RUNTIME_BACKEND==="zeroclaw"&&!(await j("zeroclaw",["--version"])).ok){let s="zeroclaw command not available in PATH.";t?console.error(s):o.log.error(s),process.exit(3)}else if(l.BRIDGE_RUNTIME_BACKEND==="hermes"&&!(await j("hermes",["--version"])).ok){let s="hermes command not available in PATH.";t?console.error(s):o.log.error(s),process.exit(3)}if(!i||!i.email){let s="AgentMarket email is required for bridge-token handshake.";t?console.error(s):o.log.error(s),process.exit(3)}if(!i.useOtp&&!i.oauthAuth&&!i.password){let s="AgentMarket password is required when not using OTP/Google auth.";t?console.error(s):o.log.error(s),process.exit(3)}if(i.useOtp&&!i.oauthAuth){console.log(`Sending login code to ${i.email}...`),await _t({baseUrl:i.baseUrl,email:i.email});let p=require("readline").createInterface({input:process.stdin,output:process.stdout,terminal:!0}),E=await new Promise(b=>p.question(`Enter the 6-digit code sent to ${i.email}: `,b));p.close(),i.oauthAuth=await At({baseUrl:i.baseUrl,email:i.email,otp:E.trim()}),console.log("OTP verification successful.")}let D=i.auth||null;if(!D)if(i.oauthAuth)D={jwt:i.oauthAuth.jwt,bridge_token:null};else if(t)console.log("Authenticating with AgentMarket..."),D=await _e({baseUrl:i.baseUrl,mode:i.mode,email:i.email,password:i.password,name:i.accountName,legalAcceptance:i.accountLegalAcceptance});else{let s=o.spinner();s.start("Authenticating with AgentMarket\u2026");try{D=await _e({baseUrl:i.baseUrl,mode:i.mode,email:i.email,password:i.password,name:i.accountName,legalAcceptance:i.accountLegalAcceptance}),s.stop("Authenticated successfully.")}catch(p){s.stop(`Authentication failed: ${kt(p.message)}`,1),o.cancel("Setup cancelled \u2014 authentication failed."),process.exit(1)}}if(t&&i.registerAgentNow){let p=(await pt({baseUrl:i.baseUrl})).filter(E=>E&&E.id&&E.label&&E.enabled!==!1);if(!p.length)throw new Error("No skill templates available from AgentMarket.");if(!i.agent?.skills||i.agent.skills.length===0){let E=p[0];i.agent.skills=[{template_id:E.id,name:E.label,description:E.description||"",price:0,currency:"USDC"}]}else i.agent.skills=i.agent.skills.map(E=>{let b=String(E.template_id||"").trim();if(!b)return E;let O=p.find(K=>K.id===b);if(!O)throw new Error(`Invalid primary skill template id: ${b}`);return{template_id:O.id,name:E.name||O.label,description:E.description||O.description||"",price:Number.isFinite(Number(E.price))?Number(E.price):0,currency:E.currency||"USDC"}})}if(!t&&i.registerAgentNow===null){let s=_(await o.confirm({message:"Register an agent profile on AgentMarket now?",initialValue:!0}));if(i.registerAgentNow=s,s){let p=o.spinner();p.start("Fetching skill templates\u2026");let E;try{E=await pt({baseUrl:i.baseUrl}),p.stop("Skill templates loaded.")}catch(b){p.stop(`Failed to fetch templates: ${b.message}`,1),o.cancel("Setup cancelled \u2014 could not load skill templates."),process.exit(1)}i.agent=await Qn(l,E)}else i.agent=null}let P=v==="default"?W.join($,".env"):W.join($,`.env.${v}`),m=(G.existsSync(P)?G.readFileSync(P,"utf8"):"").match(/^BRIDGE_TOKEN=(.+)$/m),w=m?m[1].trim():"",N=w&&w!=="pending_from_agentmarket",R=String(e["bridge-token"]||"").trim(),I=!1;if(R)l.BRIDGE_TOKEN=R;else if(D.bridge_token)l.BRIDGE_TOKEN=D.bridge_token,I=!0;else if(N)l.BRIDGE_TOKEN=w;else{let s=t?null:o.spinner();s?s.start("Fetching connection key\u2026"):console.log("Fetching connection key from AgentMarket...");try{l.BRIDGE_TOKEN=await Kn({baseUrl:i.baseUrl,token:D.jwt}),s?s.stop("Connection key obtained."):console.log("Connection key obtained."),I=!0}catch(p){if(s&&s.stop(""),!p.message.startsWith("bridge_token_not_retrievable:"))throw p;if(t&&(console.error(`Connection key exists but cannot be retrieved (stored as a privacy-preserving hash).
17
+ Pass it explicitly with --bridge-token <value>, or run setup interactively to rotate it.`),process.exit(3)),o.log.warn("Your connection key is stored as a hash and the plaintext is no longer available."),_(await o.select({message:"How would you like to proceed?",options:[{value:"manual",label:"Enter my existing key manually",hint:"Copy BRIDGE_TOKEN from another machine's .env"},{value:"rotate",label:"Generate a new key",hint:"\u26A0 Agents on other machines will disconnect until reconfigured"}]}))==="manual"){let b=_(await o.text({message:"Paste your BRIDGE_TOKEN:",validate:O=>{if(!String(O).trim())return"Token cannot be empty."}}));l.BRIDGE_TOKEN=String(b).trim()}else{let b=o.spinner();b.start("Generating new connection key\u2026");try{l.BRIDGE_TOKEN=await qn({baseUrl:i.baseUrl,token:D.jwt}),b.stop("New connection key generated."),I=!0}catch(O){b.stop(`Failed: ${O.message}`,1),o.cancel("Setup cancelled."),process.exit(1)}}}}let y=Cn(l);if(!y.ok){if(t){console.error(`
18
+ Config validation failed:`);for(let s of y.errors)console.error(`- ${s}`)}else{o.log.error("Config validation failed:");for(let s of y.errors)o.log.error(` \xB7 ${s}`)}process.exit(3)}t?console.log(`
19
+ Step: Applying setup...`):o.log.step("Applying configuration"),G.mkdirSync(l.OUTPUT_ROOT,{recursive:!0});let C=dt({rootDir:$,values:l,profile:v}),ne=C.envPath,re=[`
20
+ AGENTMARKET_EMAIL=${i.email}`];i.oauthAuth?re.push(`AGENTMARKET_REFRESH_TOKEN=${i.oauthAuth.refresh_token||""}`):i.password&&re.push(`AGENTMARKET_PASSWORD=${i.password}`),re.push(`AGENTMARKET_JWT=${D.jwt||""}`),G.appendFileSync(ne,re.join(`
21
+ `)+`
22
+ `,"utf8");let oe=t?null:o.spinner();oe?oe.start("Starting bridge process\u2026"):console.log("Starting bridge...");let z=await he({rootDir:$,profile:v,packageDir:we});oe&&oe.stop(`Bridge started (${z.mode}).`);let S=null,ie=!1;if(i?.agent){let s=t?null:o.spinner();s?s.start("Registering agent profile on AgentMarket\u2026"):console.log("Registering agent...");try{let p=await jn({baseUrl:i.baseUrl,token:D.jwt,agent:i.agent,legalAcceptance:null});if(S={ok:!0,agent_id:p.agent_id},s?s.stop(`Agent registered (id: ${p.agent_id}).`):console.log(`Agent registered: ${p.agent_id}`),p.agent_id){l.AGENTMARKET_AGENT_ID=p.agent_id,dt({rootDir:$,values:l,profile:v});let E=t?null:o.spinner();E&&E.start("Restarting bridge with new agent ID\u2026"),await he({rootDir:$,profile:v,packageDir:we}),E&&E.stop("Bridge restarted.")}}catch(p){s?s.stop(`Agent registration failed: ${p.message}`,1):console.error(`Agent registration failed: ${p.message}`),S={ok:!1,error:p.message},ie=!0}}let yt={timestamp:new Date().toISOString(),config:{...l,BRIDGE_TOKEN:Vn(l.BRIDGE_TOKEN)},env:C,process:z,registration:S},Ae=Fn($,yt);if(t)I&&l.BRIDGE_TOKEN&&l.BRIDGE_TOKEN!=="pending_from_agentmarket"&&(console.log(`
23
+ AGENT CONNECTION KEY (shown only once \u2014 save this now):`),console.log(` ${l.BRIDGE_TOKEN}`),console.log(" The server stores only a hash; if lost you must regenerate.")),console.log(`
24
+ \u2705 Setup complete`),console.log(`- profile: ${v}`),console.log(`- env file: ${C.envPath}`),C.backupPath&&console.log(`- backup: ${C.backupPath}`),console.log(`- marketplace URL: ${i.baseUrl||l.AGENTMARKET_BASE_URL}`),console.log("- connection mode: pull"),console.log(`- process mode: ${z.mode} (${z.appName})`),S?.ok&&(console.log(`- AgentMarket agent_id: ${S.agent_id}`),console.log("- Agent status: inactive (default)"),console.log('- Next steps: 1) Test your agent via "My Agents" \u2192 "Place Test Order"'),console.log(' 2) Once satisfied, click "Activate Agent" to go live')),S&&!S.ok&&console.log(`- registration failed: ${S.error}`),console.log(`- summary: ${Ae}`);else{I&&l.BRIDGE_TOKEN&&l.BRIDGE_TOKEN!=="pending_from_agentmarket"&&o.note(`${l.BRIDGE_TOKEN}
25
+
26
+ \u26A0 This key is shown only once \u2014 the server stores only a hash.
27
+ Save it somewhere safe (password manager, secure backup).
28
+ If you lose it, you must regenerate it \u2014 which disconnects
29
+ any agents on other machines using the old key.`,"Agent connection key \u2014 save this now");let s=[`Profile: ${v}`,`Env file: ${C.envPath}`,C.backupPath?`Backup: ${C.backupPath}`:null,`Marketplace URL: ${i.baseUrl||l.AGENTMARKET_BASE_URL}`,"Connection mode: pull",`Process mode: ${z.mode} (${z.appName})`,S?.ok?`AgentMarket ID: ${S.agent_id}`:null,S?.ok?"Agent status: inactive (default)":null,S?.ok?'Next steps: 1) Test your agent via "My Agents" \u2192 "Place Test Order"':null,S?.ok?' 2) Once satisfied, click "Activate Agent" to go live':null,S&&!S.ok?`Registration: failed \u2014 ${S.error}`:null,`Summary file: ${Ae}`].filter(Boolean).join(`
30
+ `);o.note(s,"Setup summary"),o.outro(ie?"Setup complete with warnings \u26A0":"Setup complete \u2713")}ie&&process.exit(2),process.exit(0)}nr().catch(e=>{o.isCancel&&o.isCancel(e)&&(o.cancel("Setup cancelled."),process.exit(0));try{o.log.error(`Setup failed: ${e.message}`)}catch{console.error(`Setup failed: ${e.message}`)}process.exit(1)});
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ "use strict";var Z=Object.create;var k=Object.defineProperty;var ee=Object.getOwnPropertyDescriptor;var te=Object.getOwnPropertyNames;var ne=Object.getPrototypeOf,re=Object.prototype.hasOwnProperty;var P=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(n){throw t=0,n}};var oe=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of te(t))!re.call(e,o)&&o!==n&&k(e,o,{get:()=>t[o],enumerable:!(r=ee(t,o))||r.enumerable});return e};var se=(e,t,n)=>(n=e!=null?Z(ne(e)):{},oe(t||!e||!e.__esModule?k(n,"default",{value:e,enumerable:!0}):n,e));var C=P((Ie,B)=>{"use strict";var N="https://www.clawagentmarket.com/";function _(e){return String(e||"").trim().replace(/\/+$/,"")}function L(){return N}function b(e){return _(e)===_(N)}function ie(e=process.env,t={}){let n=String(e.AGENTMARKET_BASE_URL||"").trim();return n&&!(t.ignoreKnownDefaultEnv&&b(n))?_(n):_(L(e))}B.exports={AGENTMARKET_PRODUCTION_BASE_URL:N,isKnownAgentMarketDefaultUrl:b,normalizeAgentMarketBaseUrl:_,resolveAgentMarketBaseUrl:ie,resolveDefaultAgentMarketBaseUrl:L}});var K=P((ke,U)=>{var y=require("fs"),G=require("path"),{isKnownAgentMarketDefaultUrl:O}=C(),$=["OUTPUT_ROOT","BRIDGE_RUNTIME_BACKEND","BRIDGE_AGENT_ID","BRIDGE_RUNTIME_TIMEOUT_SEC","BRIDGE_TOKEN","NODE_ENV","AGENTMARKET_AGENT_ID","AGENTMARKET_BASE_URL"],x=["OPENCLAW_BRIDGE_AGENT_ID","OPENCLAW_BRIDGE_TIMEOUT_SEC","OPENCLAW_OUTPUT_ROOT"];function F(e,t){return e==="AGENTMARKET_BASE_URL"&&O(t)}function M(e){let t=e.split(/\r?\n/),n=new Map;for(let r of t){if(!r||r.trim().startsWith("#"))continue;let o=r.indexOf("=");if(o<=0)continue;let s=r.slice(0,o).trim(),c=r.slice(o+1).trim();n.set(s,c)}return n}function ce({rootDir:e,values:t,profile:n}){let r=String(n||"").trim().toLowerCase()||"default",o=r&&r!=="default"?`.env.${r}`:".env",s=G.join(e,o),c=G.join(e,`${o}.bak.${Date.now()}`),a=y.existsSync(s)?y.readFileSync(s,"utf8"):"";a&&y.writeFileSync(c,a,"utf8");let l=M(a);for(let i of x)l.delete(i);for(let[i,u]of[...l.entries()])F(i,u)&&l.delete(i);for(let i of $)if(t[i]!==void 0&&t[i]!==null){let u=String(t[i]);i==="AGENTMARKET_BASE_URL"&&O(u)?O(l.get(i))&&l.delete(i):l.set(i,u)}let h=a.split(/\r?\n/).filter(i=>{if(!i||i.trim().startsWith("#"))return!0;let u=i.indexOf("=");if(u<=0)return!0;let E=i.slice(0,u).trim(),S=i.slice(u+1).trim();return!$.includes(E)&&!x.includes(E)&&!F(E,S)}),m=$.filter(i=>l.has(i)).map(i=>`${i}=${l.get(i)}`),w=[...h,...h.length?[""]:[],"# managed by setup wizard",...m].join(`
3
+ `).replace(/\n{3,}/g,`
4
+
5
+ `);y.writeFileSync(s,`${w}
6
+ `,"utf8");try{y.chmodSync(s,384)}catch{}return{envPath:s,backupPath:a?c:null}}U.exports={MANAGED_KEYS:$,writeEnv:ce,parseEnv:M}});var W=P((Le,j)=>{var{execFile:ae}=require("child_process"),{promisify:le}=require("util"),f=le(ae);async function A(e){try{return await f("bash",["-lc",`command -v ${e}`],{timeout:5e3}),!0}catch{return!1}}function R(e,t=!1){let n=String(e||"").trim().toLowerCase()||"default",r=t?"clawconnect":"clawagentconnect";return n==="default"?r:`${r}-${n}`}async function ue(){if(!await A("pm2"))return[];try{let{stdout:e}=await f("bash",["-lc","pm2 jlist"],{timeout:1e4});return JSON.parse(e||"[]")}catch{return[]}}async function q(e){return(await ue()).some(n=>{let r=String(n.name||"");return(e?r===R(e,!0):r==="clawconnect"||r.startsWith("clawconnect-"))&&n.pm2_env&&n.pm2_env.status==="online"})}async function fe({rootDir:e,profile:t,packageDir:n}){let r=String(t||"").trim().toLowerCase()||"default",o=r==="default",s=R(r),c=R(r,!0),a=o?"bridge.log":`bridge-${r}.log`,l=o?"":`BRIDGE_PROFILE=${r} `,m=`${n||e}/server.js`,w=`CLAWAGENTCONNECT_PROFILE_DIR='${e}' `;if(await A("pm2")){let E=await q(r);E&&await f("bash",["-lc",`pm2 stop ${c} && pm2 save`],{timeout:15e3});try{return await f("bash",["-lc",`(pm2 delete ${s} 2>/dev/null || true) && ${w}${l}pm2 start '${m}' --name ${s} --time && pm2 save`],{timeout:3e4}),{mode:"pm2",appName:s,migratedLegacyProcess:E}}catch(S){if(E)try{await f("bash",["-lc",`pm2 restart ${c} && pm2 save`],{timeout:15e3})}catch{}throw S}}let u=`${e}/${a}`;return await f("bash",["-lc",`${w}${l}nohup node '${m}' > '${u}' 2>&1 &`],{timeout:1e4}),{mode:"nohup",appName:s}}async function ge({rootDir:e,profile:t}){let n=String(t||"").trim().toLowerCase()||"default",r=!n||n==="default",o=R(n);if(await A("pm2")){try{await f("bash",["-lc",`pm2 stop ${o} 2>/dev/null && pm2 save`],{timeout:15e3})}catch{}return{mode:"pm2",appName:o}}let c=r?"node.*server.js":`BRIDGE_PROFILE=${n}`;try{await f("bash",["-lc",`pkill -f '${c}' 2>/dev/null; true`],{timeout:5e3})}catch{}return{mode:"nohup",appName:o}}async function de(e){if(await A("pm2"))try{let{stdout:r}=await f("bash",["-lc","pm2 jlist"],{timeout:1e4}),s=JSON.parse(r||"[]").find(c=>c.name===e);return s?s.pm2_env&&s.pm2_env.status==="online"?"running":"stopped":"not registered"}catch{return"unknown"}let n=e==="clawagentconnect"?"node.*server.js":`BRIDGE_PROFILE=${e.replace("clawagentconnect-","")}`;try{return await f("bash",["-lc",`pgrep -f '${n}' > /dev/null 2>&1`],{timeout:5e3}),"running"}catch{return"stopped"}}j.exports={appNameForProfile:R,getBridgeStatus:de,hasCommand:A,hasRunningLegacyBridge:q,startBridge:fe,stopBridge:ge}});var Q=P((be,H)=>{"use strict";var g=require("fs"),I=require("os"),p=require("path"),T="CLAWAGENTCONNECT_PROFILE_DIR",v="CLAWCONNECT_PROFILE_DIR",V=".migration-from-clawconnect-v1",z=!1;function me(e=console){z||(z=!0,e.warn(`[clawagentconnect] ${v} is deprecated; use ${T}. Legacy support will be removed in 2.0.0.`))}function Y(e=process.env,t=I.homedir(),n=console){return e[T]?p.resolve(e[T]):e[v]?(me(n),p.resolve(e[v])):p.join(t,".clawagentconnect")}function J(e=process.env,t=I.homedir()){return e[v]?p.resolve(e[v]):p.join(t,".clawconnect")}function X(e){return(e===".env"||e.startsWith(".env."))&&!e.includes(".bak.")}function pe(e){g.mkdirSync(e,{recursive:!0,mode:448});try{g.chmodSync(e,448)}catch{}}function Ee(e={}){let t=e.env||process.env,n=e.homeDir||I.homedir(),r=e.logger||console,o=Y(t,n,r),s=J(t,n);if(s===o||!g.existsSync(s))return{source:s,destination:o,migrated:[],conflicts:[],skipped:!0};pe(o);let c=[],a=[],l=g.readdirSync(s).filter(X);for(let m of l){let w=p.join(s,m),i=p.join(o,m);if(g.existsSync(i)){a.push(m);continue}g.copyFileSync(w,i,g.constants.COPYFILE_EXCL);try{g.chmodSync(i,384)}catch{}c.push(m)}let h=p.join(o,V);return g.existsSync(h)||g.writeFileSync(h,`source=${s}
7
+ migrated_at=${new Date().toISOString()}
8
+ `,{encoding:"utf8",mode:384,flag:"wx"}),c.length&&r.log(`[clawagentconnect] Migrated ${c.length} profile(s) from ${s} to ${o}.`),a.length&&r.warn(`[clawagentconnect] Kept existing destination profile(s), without overwriting: ${a.join(", ")}`),{source:s,destination:o,migrated:c,conflicts:a,skipped:!1}}H.exports={LEGACY_PROFILE_ENV:v,MIGRATION_MARKER:V,NEW_PROFILE_ENV:T,isProfileFile:X,legacyProfileDir:J,migrateLegacyProfiles:Ee,resolveProfileDir:Y}});(function(){try{require.resolve("@clack/prompts")}catch{console.error("[update-token] Missing package dependencies. Reinstall clawagentconnect, or run npm install in a user-writable checkout."),process.exit(1)}})();var he=require("fs"),we=require("path"),d=require("@clack/prompts"),{writeEnv:ve}=K(),{appNameForProfile:_e,stopBridge:ye,startBridge:Re}=W(),{migrateLegacyProfiles:Ae,resolveProfileDir:Pe}=Q(),$e=we.join(__dirname,"..");Ae();var D=Pe();function Te(e){let t={};for(let n=0;n<e.length;n++){let r=e[n];if(r==="--non-interactive"){t["non-interactive"]=!0;continue}if(r==="--no-restart"){t["no-restart"]=!0;continue}if((r==="--profile"||r==="--bridge-token")&&e[n+1]){t[r.slice(2)]=e[++n];continue}}return t}function De(e){return d.isCancel(e)&&(d.cancel("Cancelled."),process.exit(0)),e}async function Se(){let e=Te(process.argv.slice(2)),t=!!e["non-interactive"],n=!!e["no-restart"],r=String(e.profile||"").trim().toLowerCase()||"default";t||d.intro("clawagentconnect update-token");let o=String(e["bridge-token"]||"").trim();if(o||(t&&(console.error("Error: --bridge-token <value> is required in non-interactive mode."),process.exit(1)),o=De(await d.password({message:"Paste your new BRIDGE_TOKEN:",validate:c=>{let a=String(c).trim();if(!a||a.length<24)return"Token must be at least 24 characters."}}))),o=String(o).trim(),o.length<24){let c="Token must be at least 24 characters.";t&&(console.error(`Error: ${c}`),process.exit(1)),d.cancel(c),process.exit(1)}he.mkdirSync(D,{recursive:!0});let s=ve({rootDir:D,values:{BRIDGE_TOKEN:o},profile:r});if(t?console.log(`Updated: ${s.envPath}`):d.log.success(`Saved to ${s.envPath}`),n){let c=`Bridge not restarted (--no-restart). Run:
9
+ clawagentconnect start`;t?console.log(c):d.log.info(c.replace(`
10
+ `," "))}else{let c=_e(r),a=t?null:d.spinner();a?a.start("Restarting bridge\u2026"):console.log("Restarting bridge...");try{await ye({rootDir:D,profile:r}),await Re({rootDir:D,profile:r,packageDir:$e}),a?a.stop(`Bridge restarted (${c}).`):console.log(`Bridge restarted (${c}).`)}catch(l){a?a.stop(`Restart failed: ${l.message}`,1):console.warn(`Warning: could not restart bridge: ${l.message}`),t||d.log.warn("The .env has been updated. Restart the bridge manually with: clawagentconnect start")}}t||d.outro("Done \u2713"),process.exit(0)}Se().catch(e=>{console.error("[update-token] Fatal error:",e.message||e),process.exit(1)});
package/dist/server.js ADDED
@@ -0,0 +1,8 @@
1
+ "use strict";var p=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(r){throw e=0,r}};var se=p((pn,ie)=>{"use strict";var T=require("fs"),P=require("os"),v=require("path"),x="CLAWAGENTCONNECT_PROFILE_DIR",R="CLAWCONNECT_PROFILE_DIR",te=".migration-from-clawconnect-v1",ee=!1;function vt(t=console){ee||(ee=!0,t.warn(`[clawagentconnect] ${R} is deprecated; use ${x}. Legacy support will be removed in 2.0.0.`))}function re(t=process.env,e=P.homedir(),r=console){return t[x]?v.resolve(t[x]):t[R]?(vt(r),v.resolve(t[R])):v.join(e,".clawagentconnect")}function ne(t=process.env,e=P.homedir()){return t[R]?v.resolve(t[R]):v.join(e,".clawconnect")}function oe(t){return(t===".env"||t.startsWith(".env."))&&!t.includes(".bak.")}function yt(t){T.mkdirSync(t,{recursive:!0,mode:448});try{T.chmodSync(t,448)}catch{}}function bt(t={}){let e=t.env||process.env,r=t.homeDir||P.homedir(),n=t.logger||console,o=re(e,r,n),i=ne(e,r);if(i===o||!T.existsSync(i))return{source:i,destination:o,migrated:[],conflicts:[],skipped:!0};yt(o);let s=[],c=[],a=T.readdirSync(i).filter(oe);for(let u of a){let _=v.join(i,u),m=v.join(o,u);if(T.existsSync(m)){c.push(u);continue}T.copyFileSync(_,m,T.constants.COPYFILE_EXCL);try{T.chmodSync(m,384)}catch{}s.push(u)}let l=v.join(o,te);return T.existsSync(l)||T.writeFileSync(l,`source=${i}
2
+ migrated_at=${new Date().toISOString()}
3
+ `,{encoding:"utf8",mode:384,flag:"wx"}),s.length&&n.log(`[clawagentconnect] Migrated ${s.length} profile(s) from ${i} to ${o}.`),c.length&&n.warn(`[clawagentconnect] Kept existing destination profile(s), without overwriting: ${c.join(", ")}`),{source:i,destination:o,migrated:s,conflicts:c,skipped:!1}}ie.exports={LEGACY_PROFILE_ENV:R,MIGRATION_MARKER:te,NEW_PROFILE_ENV:x,isProfileFile:oe,legacyProfileDir:ne,migrateLegacyProfiles:bt,resolveProfileDir:re}});var A=p((fn,le)=>{var Rt=require("path");function Ot(t,e){let r=`order-${String(e||"").slice(0,12)||"unknown"}-v1`;return(String(t||r).trim()||r).replace(/[^a-zA-Z0-9_-]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").slice(0,64)||r}function kt(t){let e=Number(t);if(!Number.isFinite(e)||e<=0)return"";let r=[{label:"GB",size:1024*1024*1024},{label:"MB",size:1024*1024},{label:"KB",size:1024}];for(let n of r)if(e>=n.size){let o=e/n.size;return`${Number.isInteger(o)?o:o.toFixed(1)} ${n.label}`}return`${e} bytes`}function Nt({order_id:t,skill_name:e,title:r,description:n,output_format:o="txt",outputRoot:i,revision_count:s,latest_revision_reason:c,max_file_bytes:a,max_file_size_label:l}){let u={txt:"txt",pdf:"pdf",ppt:"ppt",png:"png",mp4:"mp4"},_={txt:"text/plain",pdf:"application/pdf",ppt:"application/vnd.ms-powerpoint",png:"image/png",mp4:"video/mp4"},m=u[o]||"txt",g=Number(s)||0,d=g>=1?`_r${g}`:"",f=Rt.join(i,`${e}_${String(t||"").slice(0,8)}${d}.${m}`),h=typeof c=="string"?c.trim():"",w=Number(a),b=String(l||kt(w)).trim(),N=Number.isFinite(w)&&w>0&&b?`Maximum result file size: ${b} (${Math.trunc(w)} bytes)`:"",L=g>=1&&h?[`\u26A0 REVISION REQUEST (Revision #${g})`,"The buyer was not satisfied with the previous delivery and has requested the following changes:",h,"---","Original order description:"]:[];return{prompt:["You are fulfilling a marketplace order.",`Order ID: ${t}`,`Skill: ${e}`,`Title: ${r||"(none)"}`,"",...L,`${n||"(none)"}`,`Output format required: ${o}`,...N?[N]:[],`You MUST create the output file locally at this exact path: ${f}`,...N?[`The file at that path MUST NOT exceed ${b}; keep media/compression choices within this limit.`]:[],"","IMPORTANT: Return ONLY valid JSON text (no markdown) with exactly this shape:",'{"status":"completed","result_type":"file","filename":"...","mime_type":"...","file_path":"..."}',`mime_type must be ${_[m]||"text/plain"}.`,"file_path must be absolute and point to the created file."].join(`
4
+ `),targetPath:f}}function Ct(t){return String(t||"").replace(/^```(?:json)?\s*/i,"").replace(/\s*```$/i,"").trim()}function ce(t){let e=String(t||""),r=[],n=0,o=!1,i=!1,s=-1;for(let c=0;c<e.length;c+=1){let a=e[c];if(o){i?i=!1:a==="\\"?i=!0:a==='"'&&(o=!1);continue}if(a==='"'){o=!0;continue}if(a==="{"){n===0&&(s=c),n+=1;continue}a==="}"&&(n>0&&(n-=1),n===0&&s>=0&&(r.push(e.slice(s,c+1)),s=-1))}return r}function ae(t){if(!t||typeof t!="object")return-1;let e=t.result&&typeof t.result=="object"?t.result:t,r=e.file&&typeof e.file=="object"?e.file:e,n=0,o=String(e.status||t.status||"").toLowerCase();["completed","success","ok"].includes(o)&&(n+=4);let i=String(e.result_type||e.type||t.result_type||"").toLowerCase();return["file","document","artifact"].includes(i)&&(n+=4),(r.file_path||r.path||e.file_path||e.path)&&(n+=4),(r.content_base64||e.content_base64||r.content||e.content)&&(n+=3),(r.filename||r.file_name||e.filename||e.file_name)&&(n+=2),(r.mime_type||r.mimeType||e.mime_type||e.mimeType)&&(n+=1),(t.name==="shell"||t.name==="tool_call")&&(n-=6),n}function At(t){let e=Ct(t);if(!e)throw new Error("backend_empty_text_result");try{return{parsed:JSON.parse(e),mode:"json_stdout"}}catch{}let r=ce(e);if(r.length){let n=[];for(let o of r)try{n.push(JSON.parse(o))}catch{}if(n.length){let o=n[0],i=ae(o);for(let s of n.slice(1)){let c=ae(s);c>=i&&(o=s,i=c)}return{parsed:o,mode:"embedded_json_block"}}}throw new Error("backend_invalid_json")}function $t(t){if(!t||typeof t!="object")throw new Error("openclaw_agent_invalid_response");let e=t.result&&typeof t.result=="object"?t.result:t,r=e.file&&typeof e.file=="object"?e.file:e,n=String(e.status||t.status||"").toLowerCase(),o=["completed","success","ok"].includes(n)||!n,i=String(e.result_type||e.type||t.result_type||"").toLowerCase(),s=["file","document","artifact"].includes(i)||!!(r.file_path||r.path||r.content_base64||r.content);if(!o||!s){let m=JSON.stringify(t).slice(0,500);throw new Error(`openclaw_agent_invalid_response:${m}`)}let c=r.filename||r.file_name||e.filename||e.file_name,a=r.mime_type||r.mimeType||e.mime_type||e.mimeType||"application/octet-stream";if(!c||typeof c!="string")throw new Error("missing_filename");let l=r.file_path||r.path||e.file_path||e.path;if(l&&typeof l=="string")return{status:"completed",result_type:"file",filename:c,mime_type:a,file_path:l,parse_mode:t.parse_mode||"json_stdout"};let u=r.content_base64||e.content_base64;if(typeof u=="string"&&u.length>0)return{status:"completed",result_type:"file",filename:c,mime_type:a,content_base64:u,parse_mode:t.parse_mode||"json_stdout"};let _=r.content||e.content;if(typeof _=="string"&&_.length>0)return{status:"completed",result_type:"file",filename:c,mime_type:a,content:_,parse_mode:t.parse_mode||"json_stdout"};throw new Error("missing_file_handoff_payload")}le.exports={toSafeSessionId:Ot,buildBridgePrompt:Nt,parseBackendJson:At,normalizeRuntimeResult:$t,extractJsonObjects:ce}});var _e=p((hn,me)=>{var{promisify:It}=require("util"),{execFile:Lt}=require("child_process"),{toSafeSessionId:Dt,buildBridgePrompt:xt,parseBackendJson:Pt,normalizeRuntimeResult:Bt}=A(),ue=It(Lt);function de(t){let e=String(t||"").trim();if(!e)return"";try{let r=JSON.parse(e),o=(r?.result?.payloads||[]).map(i=>i&&typeof i.text=="string"?i.text:"").filter(Boolean).join(`
5
+ `).trim();return o||String(r?.result?.text||r?.message||r?.output||"").trim()}catch{return e}}async function Mt({input:t,config:e}){let{prompt:r}=xt({...t,outputRoot:e.outputRoot}),n=Dt(t.session_key||`order:${t.order_id}:v1`,t.order_id),o=e.timeoutSec,i=String(e.agentId||"").trim();if(!i)throw new Error("missing_bridge_agent_id_for_openclaw");let s=["agent","--agent",i,"--session-id",n,"--message",r,"--json","--timeout",String(o)],c=Date.now(),{stdout:a}=await ue("openclaw",s,{timeout:Number(o)*1e3+5e3,maxBuffer:20*1024*1024}),l=de(a),{parsed:u,mode:_}=Pt(l);return{...Bt({...u,parse_mode:_}),_meta:{runtime_backend:"openclaw",parser_mode:_,session_id:n,timeout_sec:o,duration_ms:Date.now()-c,command:["openclaw",...s.slice(0,6),"..."]}}}async function Ut({prompt:t,config:e}){let r=String(e.agentId||"").trim();if(!r)throw new Error("missing_bridge_agent_id_for_openclaw_review");let n=Number(e.reviewTimeoutSec||180),o=`review-${Date.now()}`,i=["agent","--agent",r,"--session-id",o,"--message",t,"--json","--timeout",String(n)],{stdout:s}=await ue("openclaw",i,{timeout:n*1e3+5e3,maxBuffer:5*1024*1024});return de(String(s||""))}me.exports={executeViaOpenClaw:Mt,reviewViaOpenClaw:Ut}});var he=p((gn,fe)=>{var{promisify:jt}=require("util"),{execFile:qt}=require("child_process"),{buildBridgePrompt:Gt,parseBackendJson:zt,normalizeRuntimeResult:Ft}=A(),pe=jt(qt);async function Wt({input:t,config:e}){let{prompt:r}=Gt({...t,outputRoot:e.outputRoot}),n=e.timeoutSec,o=["agent","-m",r],i=Date.now(),{stdout:s}=await pe("zeroclaw",o,{timeout:Number(n)*1e3+5e3,maxBuffer:20*1024*1024}),{parsed:c,mode:a}=zt(String(s||""));return{...Ft({...c,parse_mode:a}),_meta:{runtime_backend:"zeroclaw",parser_mode:a,timeout_sec:n,duration_ms:Date.now()-i,command:["zeroclaw","agent","-m","<prompt>"]}}}async function Kt({prompt:t,config:e}){let r=Number(e.reviewTimeoutSec||180),{stdout:n}=await pe("zeroclaw",["agent","-m",t],{timeout:r*1e3+5e3,maxBuffer:5*1024*1024});return String(n||"")}fe.exports={executeViaZeroClaw:Wt,reviewViaZeroClaw:Kt}});var Te=p((wn,Se)=>{var{promisify:Ht}=require("util"),{execFile:Vt}=require("child_process"),{buildBridgePrompt:Jt,parseBackendJson:Yt,normalizeRuntimeResult:Zt}=A(),ge=Ht(Vt);function B(t){return String(t||process.env.BRIDGE_HERMES_INVOCATION_MODE||"session").trim().toLowerCase()==="oneshot"?"oneshot":"session"}function we(t){let r=String(t||"").match(/\bSession:\s*([A-Za-z0-9_-]+)/);return r?r[1]:null}function Ee({prompt:t,agentId:e,mode:r}){if(r==="oneshot"){let o=["-z",t,"--yolo"];return e&&o.push("--profile",e),o}let n=["chat","-q",t,"--yolo"];return e&&n.push("-p",e),n}function Xt({agentId:t,mode:e}){return e==="oneshot"?t?["hermes","-z","<prompt>","--yolo","--profile",t]:["hermes","-z","<prompt>","--yolo"]:t?["hermes","chat","-q","<prompt>","--yolo","-p",t]:["hermes","chat","-q","<prompt>","--yolo"]}async function Qt({input:t,config:e}){let{prompt:r}=Jt({...t,outputRoot:e.outputRoot}),n=e.timeoutSec,o=String(e.agentId||"").trim(),i=B(e.hermesInvocationMode),s=Ee({prompt:r,agentId:o,mode:i}),a=Math.max(n,600),l=Date.now(),u;try{({stdout:u}=await ge("hermes",s,{timeout:a*1e3+5e3,maxBuffer:20*1024*1024}))}catch(h){let w=((Date.now()-l)/1e3).toFixed(1);throw console.error(`[hermes] execution failed after ${w}s: ${h.message}`),h}let _=String(u||""),m=i==="session"?we(_):null,g,d;try{({parsed:g,mode:d}=Yt(_))}catch(h){let w=_.length>600?`...${_.slice(-600)}`:_;throw console.error(`[hermes] stdout parse failed (${h.message}). Full tail:
6
+ ${w}`),h}return console.log(`[hermes] stdout parsed (${_.length} bytes, invocation_mode=${i}, session_id=${m||"none"}, parser_mode=${d})`),{...Zt({...g,parse_mode:d}),_meta:{runtime_backend:"hermes",invocation_mode:i,hermes_session_id:m,parser_mode:d,timeout_sec:a,duration_ms:Date.now()-l,command:Xt({agentId:o,mode:i})}}}async function er({prompt:t,config:e}){let r=String(e.agentId||"").trim(),n=Number(e.reviewTimeoutSec||180),o=B(e.hermesInvocationMode),i=Ee({prompt:t,agentId:r,mode:o}),{stdout:s}=await ge("hermes",i,{timeout:n*1e3+5e3,maxBuffer:5*1024*1024});return String(s||"")}Se.exports={executeViaHermes:Qt,reviewViaHermes:er,normalizeHermesInvocationMode:B,extractHermesSessionId:we}});var M=p((En,tr)=>{tr.exports=[{value:"openclaw",label:"openclaw",hint:"Standard OpenClaw CLI"},{value:"zeroclaw",label:"zeroclaw",hint:"ZeroClaw variant"},{value:"hermes",label:"hermes",hint:"Hermes Agent (Nous Research)"}]});var ve=p((Sn,rr)=>{rr.exports=[{value:"openclaw",label:"openclaw",hint:"Standard OpenClaw CLI"},{value:"hermes",label:"hermes",hint:"Hermes Agent (Nous Research)"}]});var U=p((Tn,nr)=>{nr.exports={name:"clawagentconnect",version:"1.0.1",description:"Connect OpenClaw-style AI agents to the ClawAgentMarket platform",main:"dist/server.js",bin:{clawagentconnect:"dist/bin/clawagentconnect.js"},files:["dist/","README.md","LICENSE"],scripts:{build:"node build.js",pretest:"npm run build",prepack:"npm run build",start:"node dist/bin/clawagentconnect.js start",setup:"node dist/bin/clawagentconnect.js setup",doctor:"node dist/bin/clawagentconnect.js doctor","check-update":"node dist/bin/clawagentconnect.js check-update",test:"node --test tests/*.test.js"},keywords:["openclaw","agentmarket","ai-agent","bridge","mcp","task-board"],license:"SEE LICENSE IN LICENSE",engines:{node:">=18.0.0"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"https://github.com/ClawAgentmarket/clawagentmarket.git",directory:"clawagentconnect"},bugs:{email:"info@clawagentmarket.com"},homepage:"https://www.clawagentmarket.com/",dependencies:{"@clack/prompts":"^1.3.0"},devDependencies:{esbuild:"0.28.1"}}});var Ne=p((vn,ke)=>{"use strict";var or=/(?:^|[-+.])(preview|staging|canary|alpha|beta|rc)(?:[.+-]|$)/i,ye=!1;function be(){try{return String(U().version||"0.0.0")}catch{return"0.0.0"}}function Re(t=process.env,e=console){return t.CLAWAGENTCONNECT_RELEASE_CHANNEL?String(t.CLAWAGENTCONNECT_RELEASE_CHANNEL).trim().toLowerCase():t.CLAWCONNECT_RELEASE_CHANNEL?(ye||(ye=!0,e.warn("[clawagentconnect] CLAWCONNECT_RELEASE_CHANNEL is deprecated; use CLAWAGENTCONNECT_RELEASE_CHANNEL. Legacy support will be removed in 2.0.0.")),String(t.CLAWCONNECT_RELEASE_CHANNEL).trim().toLowerCase()):""}function Oe(t=be()){return or.test(String(t||""))}function ir(t=process.env){let e=Re(t);if(["preview","staging","canary","beta","alpha","rc"].includes(e))return!0;if(["production","prod","latest","stable"].includes(e))return!1;let r=String(t.NODE_ENV||"").trim().toLowerCase();return r==="development"||r==="test"||Oe()}ke.exports={getPackageVersion:be,isPreviewVersion:Oe,resolveReleaseChannel:Re,usePreviewFeatures:ir}});var Ie=p((yn,$e)=>{"use strict";var Ce=M(),Ae=ve(),{usePreviewFeatures:sr}=Ne();function ar(t=process.env){return sr(t)?Ce:Ae}$e.exports={getEnabledBackends:ar,previewBackends:Ce,productionBackends:Ae}});var j=p((bn,Le)=>{var{executeViaOpenClaw:cr,reviewViaOpenClaw:lr}=_e(),{executeViaZeroClaw:ur,reviewViaZeroClaw:dr}=he(),{executeViaHermes:mr,reviewViaHermes:_r}=Te(),{getEnabledBackends:pr}=Ie();function fr(t=process.env){let e=new Set(pr(t).map(o=>o.value)),r=String(t.BRIDGE_RUNTIME_BACKEND||"").trim().toLowerCase(),n=r||"openclaw";if(!e.has(n)){if(String(t.NODE_ENV||"development").toLowerCase()==="production")throw new Error(`invalid_runtime_backend:${r||"(empty)"}`);return"openclaw"}return n}function hr(t=process.env){return String(t.AGENTMARKET_AGENT_ID||t.BRIDGE_AGENT_ID||t.OPENCLAW_BRIDGE_AGENT_ID||"").trim()}function gr(t=process.env){let e=t.BRIDGE_RUNTIME_TIMEOUT_SEC??t.OPENCLAW_BRIDGE_TIMEOUT_SEC??"240",r=Number(e);return!Number.isFinite(r)||r<10||r>3600?240:Math.trunc(r)}async function wr({input:t,config:e}){return e.backend==="zeroclaw"?ur({input:t,config:e}):e.backend==="hermes"?mr({input:t,config:e}):cr({input:t,config:e})}async function Er({prompt:t,config:e}){return e.backend==="zeroclaw"?dr({prompt:t,config:e}):e.backend==="hermes"?_r({prompt:t,config:e}):lr({prompt:t,config:e})}Le.exports={resolveRuntimeBackendFromEnv:fr,resolveRuntimeAgentId:hr,resolveRuntimeTimeoutSec:gr,executeViaConfiguredBackend:wr,executeReviewViaConfiguredBackend:Er}});var qe=p((Rn,je)=>{"use strict";var De="https://registry.npmjs.org",q="clawagentconnect";function xe(t,e){function r(i){return String(i||"0.0.0").replace(/[^0-9.]/g,"").split(".").map(s=>parseInt(s,10)||0)}let n=r(t),o=r(e);for(let i=0;i<3;i++){if(n[i]>o[i])return 1;if(n[i]<o[i])return-1}return 0}function Pe(t=q,e=De){let r=String(e||De).replace(/\/+$/,""),n=String(t||q).replace("/","%2f");return`${r}/${n}/latest`}async function Be(t=q,e=8e3){let r=new AbortController,n=setTimeout(()=>r.abort(),e);try{let o=await fetch(Pe(t),{signal:r.signal,headers:{Accept:"application/vnd.npm.install-v1+json, application/json"}});if(!o.ok)throw new Error(`registry_http_${o.status}`);let i=await o.json();if(!i||typeof i.version!="string"||!i.version)throw new Error("registry_response_missing_version");return i.version}finally{clearTimeout(n)}}async function Me(t){try{let e=await Be();return{updateAvailable:xe(e,t)>0,latest:e,current:t,error:null}}catch(e){return{updateAvailable:!1,latest:null,current:t,error:e&&e.name==="AbortError"?"request_timed_out":e.message||"unknown_error"}}}function Ue(t,e){console.log(""),console.log(`clawagentconnect update available: ${t} -> ${e}`),console.log(`Run: npm install -g --prefix "$HOME/.local" clawagentconnect@${e}`),console.log("")}async function Sr(t,e=process.env){if(String(e.BRIDGE_DISABLE_UPDATE_CHECK||"").toLowerCase()!=="true")try{let r=await Me(t);r.error?console.log(`[update-check] skipped: ${r.error}`):r.updateAvailable&&Ue(t,r.latest)}catch(r){console.log(`[update-check] skipped: ${r&&r.message?r.message:"unexpected_error"}`)}}je.exports={checkForUpdate:Me,fetchLatestVersion:Be,packageMetadataUrl:Pe,printUpdateNotice:Ue,runStartupUpdateCheck:Sr,semverCompare:xe}});var Fe=p((On,ze)=>{"use strict";var Ge="/api/bridge/events",G=class{constructor({baseUrl:e,bridgeToken:r,onOrder:n,onOrderReview:o,agentId:i,onError:s,_reconnectBaseMs:c,keepaliveTimeoutMs:a,orderLeaseTimeoutMs:l}){if(!e)throw new Error("Poller: baseUrl is required");if(!r)throw new Error("Poller: bridgeToken is required");if(typeof n!="function")throw new Error("Poller: onOrder must be a function");this._baseUrl=String(e).replace(/\/+$/,""),this._bridgeToken=r,this._onOrder=n,this._onOrderReview=typeof o=="function"?o:null,this._onError=typeof s=="function"?s:null,this._agentId=i?String(i).trim():null,this._running=!1,this._reconnectBaseDelay=c&&Number(c)>0?Number(c):1e3,this._reconnectDelay=this._reconnectBaseDelay,this._reconnectTimer=null,this._abortController=null,this._activeOrders=new Set,this._activeReviews=new Set,this._keepaliveTimeoutMs=a!=null&&Number(a)>0?Number(a):9e4,this._lastActivityMs=0,this._watchdogTimer=null,this._orderLeaseTimeoutMs=l!=null&&Number(l)>0?Number(l):18e5}start(){this._running||(this._running=!0,console.log("[POLLER] Pull mode started \u2014 connecting via SSE"),this._connect())}stop(){this._running=!1,this._reconnectTimer&&(clearTimeout(this._reconnectTimer),this._reconnectTimer=null),this._stopWatchdog(),this._abortController&&(this._abortController.abort(),this._abortController=null),console.log("[POLLER] Stopped")}async _connect(){if(!this._running)return;let e=this._agentId?`${this._baseUrl}${Ge}?agent_id=${encodeURIComponent(this._agentId)}`:`${this._baseUrl}${Ge}`;this._abortController=new AbortController;let r=Date.now();console.log(`[POLLER] Connecting to SSE stream: ${e}`);try{let n=await fetch(e,{headers:{"x-bridge-token":this._bridgeToken,Accept:"text/event-stream","Cache-Control":"no-cache"},signal:this._abortController.signal});if(n.status===401){console.error("[POLLER] Bridge token rejected (401). Check BRIDGE_TOKEN configuration. Not reconnecting."),this._running=!1;return}if(n.status===400){console.error("[POLLER] SSE connect rejected (400): missing or invalid agent_id. Check AGENTMARKET_AGENT_ID configuration. Not reconnecting."),this._running=!1;return}if(n.status===403){console.error("[POLLER] SSE connect rejected (403): agent_id does not belong to this account. Check AGENTMARKET_AGENT_ID configuration. Not reconnecting."),this._running=!1;return}if(!n.ok){console.warn(`[POLLER] SSE connect failed with HTTP ${n.status}. Will retry.`),this._scheduleReconnect(r);return}console.log("[POLLER] SSE stream connected"),this._reconnectDelay=this._reconnectBaseDelay,this._lastActivityMs=Date.now(),this._startWatchdog(),await this._readStream(n.body)}catch(n){if(!this._running||n.name==="AbortError")return;console.warn(`[POLLER] SSE connection error: ${n.message}. Will retry.`)}this._stopWatchdog(),this._scheduleReconnect(r)}async _readStream(e){let r=new TextDecoder,n="",o="",i=[];for await(let s of e){if(!this._running)break;this._lastActivityMs=Date.now(),n+=r.decode(s,{stream:!0});let c=n.split(/\r?\n/);n=c.pop();for(let a of c)if(a===""){if(i.length){let l=i.join(`
7
+ `);this._dispatchEvent(o||"message",l)}o="",i=[]}else a.startsWith(":")||(a.startsWith("event:")?o=a.slice(6).trim():a.startsWith("data:")&&i.push(a.slice(5).trimStart()))}}_dispatchEvent(e,r){if(e==="order"){let n;try{n=JSON.parse(r)}catch{return}if(!n?.order_id||this._activeOrders.has(n.order_id))return;this._activeOrders.add(n.order_id);let o=setTimeout(()=>{this._activeOrders.has(n.order_id)&&(console.warn(`[POLLER] Order lease expired for ${n.order_id} after ${this._orderLeaseTimeoutMs}ms \u2014 forcing removal`),this._activeOrders.delete(n.order_id))},this._orderLeaseTimeoutMs);this._handleOrder(n).finally(()=>{clearTimeout(o),this._activeOrders.delete(n.order_id)})}if(e==="order_review"){if(!this._onOrderReview)return;let n;try{n=JSON.parse(r)}catch{return}if(!n?.order_id||this._activeReviews.has(n.order_id))return;this._activeReviews.add(n.order_id),this._handleOrderReview(n).finally(()=>{this._activeReviews.delete(n.order_id)})}}async _handleOrder(e){console.log(`[POLLER] Received order ${e.order_id} (skill=${e.skill_name})`);try{await this._onOrder(e)}catch(r){console.error(`[POLLER] onOrder handler failed for ${e.order_id}: ${r.message}`),this._onError&&this._onError(e.order_id,r).catch(()=>{})}}async _handleOrderReview(e){console.log(`[POLLER] Received order review ${e.order_id} (skill=${e.skill_name})`);try{await this._onOrderReview(e)}catch(r){console.error(`[POLLER] onOrderReview handler failed for ${e.order_id}: ${r.message}`)}}_scheduleReconnect(e){if(!this._running)return;Date.now()-e>=3e4&&(this._reconnectDelay=this._reconnectBaseDelay);let r=(Math.random()-.5)*2*.2*this._reconnectDelay,n=Math.min(Math.round(this._reconnectDelay+r),6e4);console.log(`[POLLER] Reconnecting in ${n}ms`),this._reconnectDelay=Math.min(this._reconnectDelay*2,6e4),this._reconnectTimer=setTimeout(()=>{this._reconnectTimer=null,this._connect()},n)}_startWatchdog(){this._stopWatchdog();let e=Math.max(50,Math.floor(this._keepaliveTimeoutMs/3));this._watchdogTimer=setInterval(()=>{if(!this._running){this._stopWatchdog();return}let r=Date.now()-this._lastActivityMs;r>=this._keepaliveTimeoutMs&&(console.warn(`[POLLER] No SSE activity for ${r}ms (threshold ${this._keepaliveTimeoutMs}ms) \u2014 reconnecting`),this._stopWatchdog(),this._abortController&&(this._abortController.abort(),this._abortController=null),this._scheduleReconnect(0))},e)}_stopWatchdog(){this._watchdogTimer&&(clearInterval(this._watchdogTimer),this._watchdogTimer=null)}};ze.exports={Poller:G}});var Ke=p((kn,We)=>{"use strict";var Tr=require("crypto"),z=class{constructor({maxConcurrent:e=1,jobTtlMs:r=36e5,cleanupIntervalMs:n=3e5,worker:o}={}){this.maxConcurrent=Math.max(1,e),this.jobTtlMs=r,this.cleanupIntervalMs=n,this.worker=o,this._jobs=new Map,this._queue=[],this._running=0,this._cleanupTimer=null}start(){this._cleanupTimer||(this._cleanupTimer=setInterval(()=>this._cleanup(),this.cleanupIntervalMs),this._cleanupTimer.unref&&this._cleanupTimer.unref())}stop(){this._cleanupTimer&&(clearInterval(this._cleanupTimer),this._cleanupTimer=null)}enqueue(e){let r=Tr.randomBytes(16).toString("hex"),n=new Date().toISOString(),o={job_id:r,status:"queued",order_id:e.order_id||null,payload:e,created_at:n,started_at:null,completed_at:null,result:null,error:null};return this._jobs.set(r,o),this._queue.push(r),this._drain(),o}get(e){return this._jobs.get(e)}_drain(){for(;this._running<this.maxConcurrent&&this._queue.length>0;){let e=this._queue.shift(),r=this._jobs.get(e);r&&(r.status="running",r.started_at=new Date().toISOString(),this._running++,this._execute(r).then(()=>{this._running--,this._drain()}))}}async _execute(e){if(!this.worker){e.status="failed",e.error="no_worker_configured",e.completed_at=new Date().toISOString();return}try{let r=await this.worker(e.payload);e.status="completed",e.result=r,e.completed_at=new Date().toISOString()}catch(r){e.status="failed",e.error=r&&r.message?r.message:String(r),e.completed_at=new Date().toISOString()}}_cleanup(){let e=Date.now(),r=0;for(let[n,o]of this._jobs.entries())e-new Date(o.created_at).getTime()>this.jobTtlMs&&(this._jobs.delete(n),r++);this._queue=this._queue.filter(n=>this._jobs.has(n)),r>0&&console.log(`[JOB_CLEANUP] Removed ${r} expired job record(s)`)}runCleanupNow(){this._cleanup()}get size(){return this._jobs.size}};We.exports={JobQueue:z}});var Ye=p((Nn,Je)=>{var{URL:vr}=require("url");function yr(t,e,r){let n=Number(t);return Number.isInteger(n)&&n>=e&&n<=r}function Ve(t){try{let e=new vr(t);return["http:","https:"].includes(e.protocol)}catch{return!1}}function br(t){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(String(t||""))}var Rr=new Set(["admin","administrator","root","support","system","agentmarket","api","null","undefined"]),He=M().map(t=>t.value);function Or(t){return String(t||"").trim().normalize("NFKC").toLowerCase()}function kr(t){let e=String(t||"").trim();if(e.length<3||e.length>32)return{ok:!1,code:"invalid_username",message:"Username must be 3-32 characters."};if(!/^[a-zA-Z0-9](?:[a-zA-Z0-9._-]{1,30}[a-zA-Z0-9])?$/.test(e)||/[._-]{2,}/.test(e))return{ok:!1,code:"invalid_username",message:"Username can use letters/numbers and optional . _ - (no repeated separators)."};let r=Or(e);return Rr.has(r)?{ok:!1,code:"username_reserved",message:"This username is reserved."}:{ok:!0,normalized:r,username:e}}function Nr(t){let e=[],n=String(t.NODE_ENV||"development").toLowerCase()==="production",o=String(t.BRIDGE_RUNTIME_BACKEND||"openclaw").toLowerCase();He.includes(o)||e.push(`BRIDGE_RUNTIME_BACKEND must be one of: ${He.join(", ")}`),(!t.OUTPUT_ROOT&&!t.OPENCLAW_OUTPUT_ROOT||String(t.OUTPUT_ROOT||t.OPENCLAW_OUTPUT_ROOT||"").trim().length<2)&&e.push("OUTPUT_ROOT is required");let i=String(t.BRIDGE_AGENT_ID||t.OPENCLAW_BRIDGE_AGENT_ID||"").trim();o==="openclaw"&&i.length<1&&e.push("BRIDGE_AGENT_ID (or OPENCLAW_BRIDGE_AGENT_ID) is required for openclaw backend");let s=t.BRIDGE_RUNTIME_TIMEOUT_SEC??t.OPENCLAW_BRIDGE_TIMEOUT_SEC;return yr(s,10,3600)||e.push("BRIDGE_RUNTIME_TIMEOUT_SEC (or OPENCLAW_BRIDGE_TIMEOUT_SEC) must be between 10 and 3600"),!t.BRIDGE_TOKEN||String(t.BRIDGE_TOKEN).trim().length===0?e.push("BRIDGE_TOKEN is required"):n&&String(t.BRIDGE_TOKEN).length<24&&e.push("BRIDGE_TOKEN must be at least 24 characters in production"),Ve(t.AGENTMARKET_BASE_URL)||e.push("AGENTMARKET_BASE_URL must be a valid http(s) URL"),{ok:e.length===0,errors:e}}Je.exports={validateUrl:Ve,validateEmail:br,validateUsername:kr,validateSetupConfig:Nr}});var Qe=p((Cn,Xe)=>{var{validateEmail:F}=Ye(),Ze="2026-05-11";function W(){return{terms_accepted:!0,privacy_acknowledged:!0,legal_version:Ze,accepted_at:new Date().toISOString()}}async function E(t,{method:e="GET",headers:r={},body:n,timeoutMs:o=15e3}={}){let i=new AbortController,s=setTimeout(()=>i.abort(),o);try{let c=await fetch(t,{method:e,headers:{"Content-Type":"application/json",...r},body:n?JSON.stringify(n):void 0,signal:i.signal}),a=await c.json().catch(()=>({}));return{ok:c.ok,status:c.status,data:a}}finally{clearTimeout(s)}}function S(t,e){let r=String(t||"").trim().replace(/\/+$/,""),n=String(e||"").trim();return`${r}${n.startsWith("/")?n:`/${n}`}`}async function Cr({baseUrl:t,mode:e,email:r,password:n,name:o,legalAcceptance:i}){if(!F(r))throw new Error("Invalid email format");if(e!=="register"&&!n)throw new Error("Password is required for login mode");if(n&&n.length>0&&n.length<8)throw new Error("Password must be at least 8 characters");let s=e==="register"?"/api/auth/register":"/api/auth/login",c=e==="register"?{email:r,password:n,name:o||"",legal_acceptance:i||W()}:{email:r,password:n},a=S(t,s),l=await E(a,{method:"POST",body:c});if(!l.ok||!l.data.token)throw new Error(`AgentMarket auth failed (${l.status}) at ${a}: ${l.data.error||l.data.message||"unknown"}`);return{jwt:l.data.token,bridge_token:l.data.bridge_token||null}}async function Ar({baseUrl:t,email:e}){if(!F(e))throw new Error("Invalid email format");let r=S(t,"/api/auth/otp/send"),n=await E(r,{method:"POST",body:{email:e}});if(!n.ok)throw new Error(`OTP send failed (${n.status}) at ${r}: ${n.data.error||n.data.message||"unknown"}`)}async function $r({baseUrl:t,email:e,otp:r}){if(!F(e))throw new Error("Invalid email format");if(!r||typeof r!="string"||!r.trim())throw new Error("OTP code is required");let n=S(t,"/api/auth/otp/verify"),o=await E(n,{method:"POST",body:{email:e,token:r.trim()}});if(!o.ok||!o.data.token)throw new Error(`OTP verify failed (${o.status}) at ${n}: ${o.data.error||o.data.message||"unknown"}`);return{jwt:o.data.token,refresh_token:o.data.refresh_token||null}}async function Ir({baseUrl:t,refreshToken:e}){if(!e||typeof e!="string"||!e.trim())throw new Error("refresh_token is required");let r=S(t,"/api/auth/token/refresh"),n=await E(r,{method:"POST",body:{refresh_token:e.trim()}});if(!n.ok||!n.data.token)throw new Error(`Token refresh failed (${n.status}) at ${r}: ${n.data.error||n.data.message||"unknown"}`);return{jwt:n.data.token,refresh_token:n.data.refresh_token||null}}async function Lr({baseUrl:t,token:e}){let r=S(t,"/api/users/me/bridge-token"),n=await E(r,{method:"GET",headers:{Authorization:`Bearer ${e}`}});if(n.ok&&n.data.bridge_token)return n.data.bridge_token;if(n.ok&&!n.data.bridge_token)throw new Error("bridge_token_not_retrievable: Your bridge token is stored privately and can no longer be fetched. Copy BRIDGE_TOKEN from your existing .env file on another machine, or rotate it from your AgentMarket profile page.");if(n.status===404&&n.data.error==="bridge_token_not_found"){let o=await E(r,{method:"POST",headers:{Authorization:`Bearer ${e}`}});if(o.ok&&o.data.bridge_token)return o.data.bridge_token;throw new Error(`Bridge token create failed (${o.status}) at ${r}: ${o.data.error||o.data.message||"unknown"}`)}throw new Error(`Bridge token fetch failed (${n.status}) at ${r}: ${n.data.error||n.data.message||"unknown"}`)}async function Dr({baseUrl:t,token:e}){let r=S(t,"/api/users/me/bridge-token/rotate"),n=await E(r,{method:"POST",headers:{Authorization:`Bearer ${e}`}});if(n.ok&&n.data.bridge_token)return n.data.bridge_token;throw new Error(`Bridge token rotate failed (${n.status}) at ${r}: ${n.data.error||n.data.message||"unknown"}`)}async function xr({baseUrl:t,token:e,endpointUrl:r}){let n=S(t,"/api/bridge/probe"),o=await E(n,{method:"POST",headers:{Authorization:`Bearer ${e}`},body:{endpoint_url:r}});if(!o.ok)throw new Error(`Bridge probe request failed (${o.status}) at ${n}: ${o.data.error||o.data.message||"unknown"}`);return o.data}async function Pr({baseUrl:t}){let e=S(t,"/api/skills/templates"),r=await E(e,{method:"GET"});if(!r.ok||!Array.isArray(r.data.templates))throw new Error(`Skill template fetch failed (${r.status}) at ${e}: ${r.data.error||r.data.message||"unknown"}`);return r.data.templates}async function Br({baseUrl:t,token:e,agent:r,legalAcceptance:n}){let o=S(t,"/api/agents/register"),i=await E(o,{method:"POST",headers:{Authorization:`Bearer ${e}`},body:{...r,legal_acceptance:n||W()}});if(!i.ok||!i.data.agent_id)throw new Error(`Agent registration failed (${i.status}) at ${o}: ${i.data.error||i.data.message||"unknown"}`);return i.data}async function Mr({baseUrl:t,bridgeToken:e,orderId:r,filePath:n,filename:o,mimeType:i,timeoutMs:s=12e4}){let c=require("fs"),a=require("crypto"),l=o||"output.bin",u=i||"application/octet-stream",_=S(t,`/api/bridge/jobs/${encodeURIComponent(r)}/result/presign`),m=await E(_,{method:"POST",headers:{"x-bridge-token":e},body:{filename:l,mime_type:u},timeoutMs:s});if(!m.ok)throw new Error(`Presign request failed (${m.status}) at ${_}: ${m.data.error||"unknown"}`);let{presign_url:g,object_key:d,file_id:f,max_file_bytes:h,max_file_size_label:w}=m.data;if(!g||!d||!f)throw new Error("Presign response missing required fields (presign_url, object_key, file_id)");let b=c.readFileSync(n),N=a.createHash("sha256").update(b).digest("hex"),L=b.length,C=Number(h);if(Number.isFinite(C)&&C>0&&L>C)throw new Error(`file_size_exceeded: File exceeds maximum allowed size (${w||`${Math.trunc(C)} bytes`})`);let Z=new AbortController,Tt=setTimeout(()=>Z.abort(),s);try{let Q=await fetch(g,{method:"PUT",headers:{"Content-Type":u},body:b,signal:Z.signal});if(!Q.ok)throw new Error(`R2 direct upload failed (${Q.status})`)}finally{clearTimeout(Tt)}let X=S(t,`/api/bridge/jobs/${encodeURIComponent(r)}/result/confirm`),D=await E(X,{method:"POST",headers:{"x-bridge-token":e},body:{object_key:d,file_id:f,filename:l,mime_type:u,checksum_sha256:N,size_bytes:L},timeoutMs:s});if(!D.ok)throw new Error(`Confirm request failed (${D.status}) at ${X}: ${D.data.error||"unknown"}`);return D.data}Xe.exports={LEGAL_VERSION:Ze,buildLegalAcceptance:W,authAgentMarket:Cr,sendLoginOtp:Ar,verifyLoginOtp:$r,refreshAccessToken:Ir,fetchBridgeToken:Lr,rotateBridgeToken:Dr,probeBridgeEndpoint:xr,fetchSkillTemplates:Pr,registerAgent:Br,submitPresignedResult:Mr}});var ut=p((An,lt)=>{"use strict";var Ur=require("crypto"),{extractJsonObjects:jr}=A(),qr=500;function et(t){return Ur.createHash("sha256").update(String(t||"")).digest("hex").slice(0,16)}function tt(t,e=qr){let r=String(t||"").replace(/\s+/g," ").trim();return r.length<=e?r:r.slice(-e)}function rt(t){let e=String(t||"").match(/\bSession:\s*([A-Za-z0-9_-]+)/);return e?e[1]:null}function nt(t){let e=String(t?.action||"").trim().toLowerCase();if(e==="reject")return{action:"reject",reason:String(t?.reason||"Rejected by automatic bridge review").trim().slice(0,500)};if(e==="accept"||e==="")return{action:"accept",reason:String(t?.reason||"").trim().slice(0,500)||null};throw new Error(`invalid_review_action:${e}`)}function Gr(t){let e=String(t?.skill_name||"").trim(),r=String(t?.title||"").trim(),n=r||e||"the order";return`${e&&r?`${n} matches the ${e} service`:`${n} matches the requested service`}, appears feasible, and passes the automatic safety review.`.slice(0,200)}function zr(t){let e=String(t||"").trim().toLowerCase();return e?["brief acceptance summary","brief explanation","max 200 chars","placeholder","your reason here","reason here"].some(r=>e.includes(r)):!0}function Fr(t,e){return!t||t.action!=="accept"||!zr(t.reason)?t:{...t,reason:Gr(e)}}function Wr(t){return String(t||"manual").trim().toLowerCase()==="automatic"?"automatic":"manual"}function ot(t,e=""){let{skill_name:r,title:n,description:o,skill_snapshot:i,amount:s,currency:c,agent_review_timeout_at:a}=t||{},l=i||{},u=String(l.description||l.system_prompt||"").trim(),_=s!=null?`${s} ${c||"USDC"}`:"(unspecified)",m=["You are deciding whether to ACCEPT or REJECT an incoming order before it proceeds to payment.","Do NOT execute the task \u2014 only evaluate whether to accept it.","","Evaluate based on these criteria:","1. SECURITY \u2014 Reject if the task requests access to credentials, private keys, .env files,"," session tokens, or asks you to perform malicious, harmful, or unauthorised actions.","2. FEASIBILITY - Reject if the task is clearly outside your capabilities.","3. SCOPE - Reject if the request is incomplete, contradictory, or outside the selected service.","4. POLICY - Apply any operator context rules listed below."];return String(e||"").trim()&&m.push("","--- OPERATOR CONTEXT ---",e.trim(),"--- END OPERATOR CONTEXT ---"),m.push("","--- ORDER DETAILS ---",`Skill: ${r||"(unknown)"}`),u&&m.push(`Skill description: ${u}`),m.push(`Title: ${n||"(none)"}`,`Task description: ${o||"(none)"}`,`Amount: ${_}`),a&&m.push(`Review deadline: ${a}`),m.push("--- END OF ORDER ---","","Respond with ONLY a single valid JSON object on one line, nothing else.","The reason must be a concrete one-sentence summary based on the order details, not placeholder/schema text.","Examples:",' {"action":"accept","reason":"The PDF report request matches this service, is feasible, and contains no unsafe instructions."}',' {"action":"reject","reason":"The task asks for credential access, which is not allowed."}'),m.join(`
8
+ `)}function it(t){let e=jr(String(t||""));for(let r of e)try{let n=JSON.parse(r);if(n&&typeof n.action=="string")return nt(n)}catch{}throw new Error("agent_review_no_valid_decision_in_output")}async function st(t,e,r){let{executeReviewViaConfiguredBackend:n}=j(),o=r||n,i={...e,reviewTimeoutSec:Math.max(30,Math.min(300,Number(t?.agent_review_timeout_sec||e?.reviewTimeoutSec||180)||180)),reviewExtraContext:String(t?.agent_review_extra_context||"")},s=ot(t,i.reviewExtraContext),c=Date.now(),a="";try{a=await o({prompt:s,config:i});let l=Fr(it(a),t),u=rt(a);return{...l,review_meta:{decision_source:"agent_runtime",review_backend:String(i.backend||"unknown"),hermes_session_id:u||void 0,review_duration_ms:Date.now()-c,review_timeout_sec:i.reviewTimeoutSec,fail_open_used:!1,prompt_sha256:et(s),response_chars:String(a||"").length,response_tail:tt(JSON.stringify(l)),parsed_action:l.action}}}catch(l){let u=l instanceof Error?l:new Error(String(l));throw u.review_meta={decision_source:"agent_runtime_error",review_backend:String(i.backend||"unknown"),hermes_session_id:rt(a)||void 0,review_duration_ms:Date.now()-c,review_timeout_sec:i.reviewTimeoutSec,fail_open_used:!1,prompt_sha256:et(s),response_chars:String(a||"").length,response_tail:tt(a),review_error:String(u.message||u).slice(0,500)},u}}async function at(t,e=process.env,r=null,n){if(Wr(t?.order_review_mode)!=="automatic")return null;let o=t?.agent_review_fail_open===!0||t?.agent_review_fail_open==="true";try{if(!r)throw new Error("missing_runtime_config_for_agent_review");return await st(t,r,n)}catch(i){let s=i?.review_meta||{decision_source:"agent_runtime_error",review_backend:String(r?.backend||"unknown"),fail_open_used:!1,review_error:String(i?.message||i).slice(0,500)};return o?{action:"accept",reason:`Accepted by fail-open because automatic review failed: ${String(i?.message||i).slice(0,140)}`,review_meta:{...s,decision_source:"fail_open",fail_open_used:!0}}:{action:"reject",reason:`Agent review failed: ${String(i?.message||i).slice(0,450)}`,review_meta:s}}}async function ct({baseUrl:t,bridgeToken:e,orderId:r,decision:n}){let o=await fetch(`${String(t).replace(/\/+$/,"")}/api/bridge/orders/${encodeURIComponent(r)}/review`,{method:"POST",headers:{"Content-Type":"application/json","x-bridge-token":e},body:JSON.stringify(n)}),i=await o.json().catch(()=>({}));if(!o.ok)throw new Error(`order_review_submit_failed:${o.status}:${i.error||i.message||"unknown"}`);return i}function Kr({baseUrl:t,bridgeToken:e,env:r=process.env,logger:n=console,runtimeConfig:o=null}){return async function(s){let c=s?.order_id;if(!c)return;let a;n.log(`[POLLER] Order review started for ${c} (backend=${o?.backend||"none"}, mode=${s?.order_review_mode||"unknown"}, timeout_sec=${s?.agent_review_timeout_sec||"unknown"})`);try{a=await at(s,r,o)}catch(l){a={action:"reject",reason:`Automatic review failed: ${String(l?.message||l).slice(0,450)}`,review_meta:{decision_source:"handler_error",review_backend:String(o?.backend||"unknown"),fail_open_used:!1,review_error:String(l?.message||l).slice(0,500)}}}if(!a){n.log(`[POLLER] Order review deferred for ${c} (manual review mode)`);return}a.review_meta&&n.log(`[POLLER] Order review diagnostics for ${c}: ${JSON.stringify(a.review_meta)}`),await ct({baseUrl:t,bridgeToken:e,orderId:c,decision:a}),n.log(`[POLLER] Order review ${a.action} submitted for ${c}${a.reason?` (${a.reason})`:""}`)}}lt.exports={normalizeDecision:nt,buildReviewPrompt:ot,parseAgentReviewDecision:it,runAgentReview:st,decideOrderReview:at,submitOrderReview:ct,createOrderReviewHandler:Kr}});var pt=p(($n,_t)=>{"use strict";var K="https://www.clawagentmarket.com/";function $(t){return String(t||"").trim().replace(/\/+$/,"")}function dt(){return K}function mt(t){return $(t)===$(K)}function Hr(t=process.env,e={}){let r=String(t.AGENTMARKET_BASE_URL||"").trim();return r&&!(e.ignoreKnownDefaultEnv&&mt(r))?$(r):$(dt(t))}_t.exports={AGENTMARKET_PRODUCTION_BASE_URL:K,isKnownAgentMarketDefaultUrl:mt,normalizeAgentMarketBaseUrl:$,resolveAgentMarketBaseUrl:Hr,resolveDefaultAgentMarketBaseUrl:dt}});var y=require("fs"),H=require("path"),{migrateLegacyProfiles:Vr,resolveProfileDir:Jr}=se(),{resolveRuntimeBackendFromEnv:Yr,resolveRuntimeAgentId:Zr,resolveRuntimeTimeoutSec:Xr,executeViaConfiguredBackend:Qr}=j(),{runStartupUpdateCheck:en}=qe(),{Poller:tn}=Fe(),{JobQueue:rn}=Ke(),{submitPresignedResult:nn}=Qe(),{createOrderReviewHandler:on}=ut(),{resolveAgentMarketBaseUrl:sn}=pt(),ft=new Set;function an(){Vr();let t=String(process.env.BRIDGE_PROFILE||"").trim().toLowerCase(),e=t&&t!=="default"?`.env.${t}`:".env",r=[Jr(),__dirname],n=null;for(let i of r){let s=H.join(i,e);if(y.existsSync(s)){n=s;break}}if(!n)return;let o=y.readFileSync(n,"utf8");for(let i of o.split(/\r?\n/)){let s=i.trim();if(!s||s.startsWith("#"))continue;let c=s.indexOf("=");if(c<=0)continue;let a=s.slice(0,c).trim();if(!a||Object.prototype.hasOwnProperty.call(process.env,a))continue;let l=s.slice(c+1).trim();(l.startsWith('"')&&l.endsWith('"')||l.startsWith("'")&&l.endsWith("'"))&&(l=l.slice(1,-1)),process.env[a]=l,ft.add(a)}}an();var V=process.env.OUTPUT_ROOT||process.env.OPENCLAW_OUTPUT_ROOT||"/home/luis/.openclaw/agents/agentmarket/output",O=String(process.env.BRIDGE_TOKEN||"").trim(),k=sn(process.env,{ignoreKnownDefaultEnv:ft.has("AGENTMARKET_BASE_URL")}),cn=String(process.env.BRIDGE_DISABLE_UPDATE_CHECK||"").toLowerCase()==="true",ht=Math.max(1,parseInt(process.env.BRIDGE_MAX_CONCURRENT_JOBS||"1",10)),Y=Yr(process.env),gt=Zr(process.env),wt=String(process.env.BRIDGE_AGENT_ID||process.env.OPENCLAW_BRIDGE_AGENT_ID||"").trim(),ln=Xr(process.env);if(!O)throw new Error("Missing required BRIDGE_TOKEN");if(!k)throw new Error("AGENTMARKET_BASE_URL is required in pull mode");if(Y==="openclaw"&&!wt)throw new Error("Missing required openclaw agent id (BRIDGE_AGENT_ID or OPENCLAW_BRIDGE_AGENT_ID)");y.existsSync(V)||y.mkdirSync(V,{recursive:!0});var Et={backend:Y,agentId:wt||gt,timeoutSec:ln,outputRoot:V},I=3,un=1e3;async function J(t,e){for(let r=1;r<=I;r++){try{let n=await fetch(`${k}/api/bridge/jobs/${encodeURIComponent(t)}/execution-error`,{method:"POST",headers:{"Content-Type":"application/json","x-bridge-token":O},body:JSON.stringify({error_code:"plugin_execution_failed",error_message:String(e?.message||e)})});if(n.ok||n.status>=400&&n.status<500){n.ok||console.warn(`[POLLER] reportExecutionError: non-retryable HTTP ${n.status} for order ${t}`);return}console.warn(`[POLLER] reportExecutionError: HTTP ${n.status} on attempt ${r}/${I} for order ${t}`)}catch(n){console.warn(`[POLLER] reportExecutionError: network error on attempt ${r}/${I} for order ${t}: ${n.message}`)}r<I&&await new Promise(n=>setTimeout(n,un))}console.error(`[POLLER] reportExecutionError: gave up after ${I} attempts for order ${t}`)}async function dn(t){let{order_id:e,skill_name:r,title:n,description:o,output_format:i="txt",revision_count:s,latest_revision_reason:c,max_file_bytes:a,max_file_size_label:l}=t,u;try{u=await fetch(`${k}/api/bridge/jobs/${encodeURIComponent(e)}/claim`,{method:"POST",headers:{"Content-Type":"application/json","x-bridge-token":O}})}catch(d){throw console.warn(`[POLLER] claim request failed for order ${e}: ${d.message}`),await J(e,d),d}if(!u.ok){console.warn(`[POLLER] order ${e} not claimable (status=${u.status}), skipping`);return}let m=(await u.json().catch(()=>({}))).session_key??t.session_key??null,g;try{let d=await Qr({input:{order_id:e,skill_name:r,title:n,description:o,output_format:i,session_key:m,revision_count:s,latest_revision_reason:c,max_file_bytes:a,max_file_size_label:l},config:Et});d?._meta&&console.log("[bridge-runtime-pull]",{runtime_backend:d._meta.runtime_backend,invocation_mode:d._meta.invocation_mode,hermes_session_id:d._meta.hermes_session_id,parser_mode:d._meta.parser_mode,timeout_sec:d._meta.timeout_sec,duration_ms:d._meta.duration_ms});let f=d.file_path,h=!1;if(!f)if(d.content_base64){let w=Buffer.from(d.content_base64,"base64");f=H.join(os.tmpdir(),`pullresult-${e}-${Date.now()}`),y.writeFileSync(f,w),h=!0}else if(d.content)f=H.join(os.tmpdir(),`pullresult-${e}-${Date.now()}`),y.writeFileSync(f,d.content,"utf8"),h=!0;else throw new Error("bridge_execution_failed: missing_file_handoff_payload");try{await nn({baseUrl:k,bridgeToken:O,orderId:e,filePath:f,filename:d.filename,mimeType:d.mime_type}),console.log(`[POLLER] Order ${e} delivered`)}finally{if(h&&y.existsSync(f))try{y.unlinkSync(f)}catch{}}}catch(d){throw g=d,console.error(`[POLLER] Order ${e} execution failed: ${d.message}`),await J(e,d),d}}var St=new rn({maxConcurrent:ht,worker:dn});St.start();var mn=new tn({baseUrl:k,bridgeToken:O,agentId:gt,onOrder:t=>{St.enqueue(t)},onOrderReview:on({baseUrl:k,bridgeToken:O,env:process.env,logger:console,runtimeConfig:Et}),onError:async(t,e)=>{await J(t,e)}});mn.start();console.log(`\u{1F504} Plugin running in pull mode via SSE (backend=${Y}, maxConcurrentJobs=${ht})`);if(!cn){let t=U();en(t.version).catch(()=>{})}
@@ -0,0 +1,9 @@
1
+ "use strict";var R=(r,e)=>()=>{try{return e||r((e={exports:{}}).exports,e),e.exports}catch(t){throw e=0,t}};var D=R((ce,j)=>{"use strict";function _(r,e){return`${String(r||"").replace(/\/+$/,"")}${e}`}function Y(r){try{let e=r.split(".")[1];if(!e)return null;let t=Buffer.from(e.replace(/-/g,"+").replace(/_/g,"/"),"base64").toString("utf8"),n=JSON.parse(t);return typeof n.exp=="number"?n.exp:null}catch{return null}}function X(r){let e=Y(r);return e===null?!1:Date.now()/1e3>=e-30}async function E(r,{method:e="GET",headers:t={},body:n,timeoutMs:i=15e3}={}){let s=new AbortController,a=setTimeout(()=>s.abort(),i);try{let o=await fetch(r,{method:e,headers:{"Content-Type":"application/json",...t},body:n!==void 0?JSON.stringify(n):void 0,signal:s.signal}),c;try{c=await o.json()}catch{c={}}return{ok:o.ok,status:o.status,data:c}}finally{clearTimeout(a)}}var N=class{constructor({baseUrl:e,jwt:t="",email:n="",password:i="",refreshToken:s="",agentId:a="",onRefreshTokenRotated:o=null}){this.baseUrl=e,this._jwt=t,this.email=n,this.password=i,this.refreshToken=s,this.agentId=a,this.onRefreshTokenRotated=o}async _getJwt(){return this._jwt&&!X(this._jwt)?this._jwt:this.refreshToken?(await this._refreshWithToken(),this._jwt||null):(this.email&&this.password&&await this._login(),this._jwt||null)}async _refreshWithToken(){let e=_(this.baseUrl,"/api/auth/token/refresh"),t=await E(e,{method:"POST",body:{refresh_token:this.refreshToken}});if(!t.ok||!t.data.token)throw new Error(`token_refresh_failed: ${t.status} ${t.data.error||t.data.message||"unknown"}`);this._jwt=t.data.token,t.data.refresh_token&&t.data.refresh_token!==this.refreshToken&&(this.refreshToken=t.data.refresh_token,typeof this.onRefreshTokenRotated=="function"&&this.onRefreshTokenRotated(t.data.refresh_token))}async _login(){let e=_(this.baseUrl,"/api/auth/login"),t=await E(e,{method:"POST",body:{email:this.email,password:this.password}});if(!t.ok||!t.data.token)throw new Error(`auth_failed: ${t.status} ${t.data.error||t.data.message||"unknown"}`);this._jwt=t.data.token}async _authHeaders(){let e=await this._getJwt();return e?{Authorization:`Bearer ${e}`}:{}}async listTasks({state:e,skill:t,page:n,limit:i,sort:s}={}){let a=new URLSearchParams;e&&a.set("state",e),t&&a.set("skill",t),n&&a.set("page",String(n)),i&&a.set("limit",String(i)),s&&a.set("sort",s);let o=a.toString(),c=_(this.baseUrl,`/api/tasks${o?`?${o}`:""}`),d=await E(c);if(!d.ok)throw new Error(`list_tasks_failed: ${d.status} ${d.data.error||""}`);return d.data}async getTask(e){let t=_(this.baseUrl,`/api/tasks/${encodeURIComponent(e)}`),n=await E(t);if(!n.ok)throw new Error(`get_task_failed: ${n.status} ${n.data.error||""}`);return n.data}async searchTasks({query:e,skill:t,page:n,limit:i}={}){let s=new URLSearchParams;e&&s.set("search",e),t&&s.set("skill",t),n&&s.set("page",String(n)),i&&s.set("limit",String(i));let a=_(this.baseUrl,`/api/tasks?${s.toString()}`),o=await E(a);if(!o.ok)throw new Error(`search_tasks_failed: ${o.status} ${o.data.error||""}`);return o.data}async submitBid({task_id:e,proposed_amount:t,currency:n="USDC",eta_hours:i,proposal_text:s,bidder_agent_id:a}){let o=a||this.agentId,c={proposed_amount:t,currency:n,bidder_agent_id:o};i!==void 0&&(c.eta_hours=i),s!==void 0&&(c.proposal_text=s);let d=await this._authHeaders();if(!d.Authorization)throw new Error("credentials_required: set AGENTMARKET_JWT or AGENTMARKET_REFRESH_TOKEN or AGENTMARKET_EMAIL+AGENTMARKET_PASSWORD in .env");let f=_(this.baseUrl,`/api/tasks/${encodeURIComponent(e)}/bids`),l=await E(f,{method:"POST",headers:d,body:c});if(l.status===401)try{await this._login();let u=await this._authHeaders();l=await E(f,{method:"POST",headers:u,body:c})}catch(u){throw new Error(`reauth_failed: ${u.message}`)}if(!l.ok)throw new Error(`submit_bid_failed: ${l.status} ${JSON.stringify(l.data)}`);return l.data}};j.exports={TaskBoardClient:N}});var K=R((le,$)=>{"use strict";var O="https://www.clawagentmarket.com/";function k(r){return String(r||"").trim().replace(/\/+$/,"")}function P(){return O}function I(r){return k(r)===k(O)}function Q(r=process.env,e={}){let t=String(r.AGENTMARKET_BASE_URL||"").trim();return t&&!(e.ignoreKnownDefaultEnv&&I(t))?k(t):k(P(r))}$.exports={AGENTMARKET_PRODUCTION_BASE_URL:O,isKnownAgentMarketDefaultUrl:I,normalizeAgentMarketBaseUrl:k,resolveAgentMarketBaseUrl:Q,resolveDefaultAgentMarketBaseUrl:P}});var L=R((de,Z)=>{Z.exports={name:"clawagentconnect",version:"1.0.1",description:"Connect OpenClaw-style AI agents to the ClawAgentMarket platform",main:"dist/server.js",bin:{clawagentconnect:"dist/bin/clawagentconnect.js"},files:["dist/","README.md","LICENSE"],scripts:{build:"node build.js",pretest:"npm run build",prepack:"npm run build",start:"node dist/bin/clawagentconnect.js start",setup:"node dist/bin/clawagentconnect.js setup",doctor:"node dist/bin/clawagentconnect.js doctor","check-update":"node dist/bin/clawagentconnect.js check-update",test:"node --test tests/*.test.js"},keywords:["openclaw","agentmarket","ai-agent","bridge","mcp","task-board"],license:"SEE LICENSE IN LICENSE",engines:{node:">=18.0.0"},publishConfig:{registry:"https://registry.npmjs.org",access:"public"},repository:{type:"git",url:"https://github.com/ClawAgentmarket/clawagentmarket.git",directory:"clawagentconnect"},bugs:{email:"info@clawagentmarket.com"},homepage:"https://www.clawagentmarket.com/",dependencies:{"@clack/prompts":"^1.3.0"},devDependencies:{esbuild:"0.28.1"}}});var W=R((ue,F)=>{"use strict";var p=require("fs"),v=require("os"),m=require("path"),S="CLAWAGENTCONNECT_PROFILE_DIR",w="CLAWCONNECT_PROFILE_DIR",x=".migration-from-clawconnect-v1",G=!1;function ee(r=console){G||(G=!0,r.warn(`[clawagentconnect] ${w} is deprecated; use ${S}. Legacy support will be removed in 2.0.0.`))}function U(r=process.env,e=v.homedir(),t=console){return r[S]?m.resolve(r[S]):r[w]?(ee(t),m.resolve(r[w])):m.join(e,".clawagentconnect")}function q(r=process.env,e=v.homedir()){return r[w]?m.resolve(r[w]):m.join(e,".clawconnect")}function C(r){return(r===".env"||r.startsWith(".env."))&&!r.includes(".bak.")}function te(r){p.mkdirSync(r,{recursive:!0,mode:448});try{p.chmodSync(r,448)}catch{}}function re(r={}){let e=r.env||process.env,t=r.homeDir||v.homedir(),n=r.logger||console,i=U(e,t,n),s=q(e,t);if(s===i||!p.existsSync(s))return{source:s,destination:i,migrated:[],conflicts:[],skipped:!0};te(i);let a=[],o=[],c=p.readdirSync(s).filter(C);for(let f of c){let l=m.join(s,f),u=m.join(i,f);if(p.existsSync(u)){o.push(f);continue}p.copyFileSync(l,u,p.constants.COPYFILE_EXCL);try{p.chmodSync(u,384)}catch{}a.push(f)}let d=m.join(i,x);return p.existsSync(d)||p.writeFileSync(d,`source=${s}
2
+ migrated_at=${new Date().toISOString()}
3
+ `,{encoding:"utf8",mode:384,flag:"wx"}),a.length&&n.log(`[clawagentconnect] Migrated ${a.length} profile(s) from ${s} to ${i}.`),o.length&&n.warn(`[clawagentconnect] Kept existing destination profile(s), without overwriting: ${o.join(", ")}`),{source:s,destination:i,migrated:a,conflicts:o,skipped:!1}}F.exports={LEGACY_PROFILE_ENV:w,MIGRATION_MARKER:x,NEW_PROFILE_ENV:S,isProfileFile:C,legacyProfileDir:q,migrateLegacyProfiles:re,resolveProfileDir:U}});var se=require("readline"),{TaskBoardClient:ne}=D(),{resolveAgentMarketBaseUrl:ie}=K(),ae="2024-11-05",J="clawagentconnect-task-board",H=(()=>{try{return L().version}catch{return"1.0.0"}})(),M=[{name:"list_tasks",description:"List open tasks from the openclaw-market task board. Returns paginated task listings with optional filters.",inputSchema:{type:"object",properties:{state:{type:"string",description:"Filter by task state. One of: created, bid_done, taken, in_progress, expired, failed. Leave empty for all open states."},skill:{type:"string",description:'Filter tasks by skill tag (e.g. "create_pdf", "translation").'},page:{type:"integer",minimum:1,description:"Page number (1-based). Defaults to 1."},limit:{type:"integer",minimum:1,maximum:50,description:"Results per page (max 50). Defaults to 20."},sort:{type:"string",enum:["newest","deadline","budget_asc","budget_desc"],description:"Sort order. Defaults to newest."}},additionalProperties:!1}},{name:"get_task",description:"Get full detail for a single task by its ID.",inputSchema:{type:"object",required:["task_id"],properties:{task_id:{type:"string",description:"The UUID of the task to retrieve."}},additionalProperties:!1}},{name:"search_tasks",description:"Full-text search across task titles and descriptions on the task board.",inputSchema:{type:"object",required:["query"],properties:{query:{type:"string",minLength:1,maxLength:200,description:"Search query string to match against task title and description."},skill:{type:"string",description:"Narrow results to a specific skill tag."},page:{type:"integer",minimum:1,description:"Page number. Defaults to 1."},limit:{type:"integer",minimum:1,maximum:50,description:"Results per page. Defaults to 20."}},additionalProperties:!1}},{name:"submit_bid",description:"Submit a bid on an open task. Requires AGENTMARKET_JWT (or AGENTMARKET_REFRESH_TOKEN for Google OAuth users, or AGENTMARKET_EMAIL + AGENTMARKET_PASSWORD for password users) and AGENTMARKET_AGENT_ID to be set in the bridge .env file.",inputSchema:{type:"object",required:["task_id","proposed_amount"],properties:{task_id:{type:"string",description:"The UUID of the task to bid on."},proposed_amount:{type:"number",minimum:0,description:"The bid amount in the specified currency."},currency:{type:"string",default:"USDC",description:'Payment currency. Defaults to "USDC".'},eta_hours:{type:"number",minimum:0,description:"Estimated completion time in hours."},proposal_text:{type:"string",maxLength:3e3,description:"Optional proposal or cover letter text (max 3000 chars)."},bidder_agent_id:{type:"string",description:"Marketplace agent ID to bid as. Defaults to AGENTMARKET_AGENT_ID env var."}},additionalProperties:!1}}];function T(r,e,t){let n=JSON.stringify({jsonrpc:"2.0",id:e,result:t});r.write(n+`
4
+ `)}function y(r,e,t,n,i){let s={code:t,message:n};i!==void 0&&(s.data=i);let a=JSON.stringify({jsonrpc:"2.0",id:e,error:s});r.write(a+`
5
+ `)}function A(r){return{content:[{type:"text",text:typeof r=="string"?r:JSON.stringify(r,null,2)}]}}function h(r){return{isError:!0,content:[{type:"text",text:r}]}}async function B(r,e,t){switch(e){case"list_tasks":{let n=await r.listTasks(t||{});return A(n)}case"get_task":{let{task_id:n}=t||{};if(!n)return h("task_id is required");let i=await r.getTask(n);return A(i)}case"search_tasks":{let{query:n}=t||{};if(!n||n.length<1)return h("query is required (min 1 char)");if(n.length>200)return h("query must be <= 200 chars");let i=await r.searchTasks(t);return A(i)}case"submit_bid":{let{task_id:n,proposed_amount:i}=t||{};if(!n)return h("task_id is required");if(typeof i!="number"||i<0)return h("proposed_amount must be a number >= 0");try{let s=await r.submitBid(t);return A(s)}catch(s){let a=s&&s.message?s.message:String(s);return a.includes("credentials_required")?h(`Credentials required to submit a bid.
6
+ Set AGENTMARKET_JWT (valid 24-hour JWT), AGENTMARKET_REFRESH_TOKEN (for Google OAuth / OTP users), or AGENTMARKET_EMAIL + AGENTMARKET_PASSWORD in your clawagentconnect .env file, then restart the MCP server.`):h(a)}}default:return h(`Unknown tool: ${e}`)}}async function z(r,e,t,n){let{jsonrpc:i,id:s,method:a,params:o}=r;if(i!=="2.0"){y(e,s??null,-32600,'Invalid Request \u2014 jsonrpc must be "2.0"');return}switch(a){case"initialize":{T(e,s,{protocolVersion:ae,capabilities:{tools:{}},serverInfo:{name:J,version:H}});break}case"notifications/initialized":case"initialized":break;case"ping":{T(e,s,{});break}case"tools/list":{T(e,s,{tools:M});break}case"tools/call":{let{name:c,arguments:d}=o||{};if(!c){y(e,s,-32602,'Invalid params \u2014 "name" is required');return}if(!M.find(l=>l.name===c)){y(e,s,-32602,`Unknown tool: ${c}`);return}try{let l=await B(t,c,d||{});T(e,s,l)}catch(l){T(e,s,h(l&&l.message?l.message:String(l)))}break}default:{s!=null&&y(e,s,-32601,`Method not found: ${a}`);break}}}function V({input:r=process.stdin,output:e=process.stdout,env:t=process.env}={}){let n=require("path").join(__dirname,"..","..",".env"),i=new ne({baseUrl:ie(t),jwt:t.AGENTMARKET_JWT||"",email:t.AGENTMARKET_EMAIL||"",password:t.AGENTMARKET_PASSWORD||"",refreshToken:t.AGENTMARKET_REFRESH_TOKEN||"",agentId:t.AGENTMARKET_AGENT_ID||"",onRefreshTokenRotated:a=>{try{let o=require("fs"),c=o.existsSync(n)?o.readFileSync(n,"utf8"):"";/^AGENTMARKET_REFRESH_TOKEN=/m.test(c)?c=c.replace(/^AGENTMARKET_REFRESH_TOKEN=.*/m,`AGENTMARKET_REFRESH_TOKEN=${a}`):c+=`
7
+ AGENTMARKET_REFRESH_TOKEN=${a}
8
+ `,o.writeFileSync(n,c,"utf8")}catch(o){process.stderr.write(`[task-board-server] Failed to persist rotated refresh token: ${o.message}
9
+ `)}}}),s=se.createInterface({input:r,terminal:!1});s.on("line",async a=>{let o=a.trim();if(!o)return;let c;try{c=JSON.parse(o)}catch{y(e,null,-32700,"Parse error \u2014 invalid JSON");return}await z(c,e,i,{name:J,version:H})}),s.on("close",()=>{process.exit(0)})}module.exports={startServer:V,TOOLS:M,callTool:B,handleMessage:z,toolResult:A,toolError:h};if(require.main===module){let r=require("path"),e=require("fs"),{migrateLegacyProfiles:t,resolveProfileDir:n}=W();t();let i=String(process.env.BRIDGE_PROFILE||"").trim().toLowerCase(),s=i&&i!=="default"?`.env.${i}`:".env",a=r.join(n(),s),o=r.join(__dirname,"..","..",s),c=e.existsSync(a)?a:o;if(e.existsSync(c)){let d=e.readFileSync(c,"utf8");for(let f of d.split(/\r?\n/)){let l=f.trim();if(!l||l.startsWith("#"))continue;let u=l.indexOf("=");if(u<=0)continue;let b=l.slice(0,u).trim();if(!b||Object.prototype.hasOwnProperty.call(process.env,b))continue;let g=l.slice(u+1).trim();(g.startsWith('"')&&g.endsWith('"')||g.startsWith("'")&&g.endsWith("'"))&&(g=g.slice(1,-1)),process.env[b]=g}}V()}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "clawagentconnect",
3
+ "version": "1.0.1",
4
+ "description": "Connect OpenClaw-style AI agents to the ClawAgentMarket platform",
5
+ "main": "dist/server.js",
6
+ "bin": {
7
+ "clawagentconnect": "dist/bin/clawagentconnect.js"
8
+ },
9
+ "files": [
10
+ "dist/",
11
+ "README.md",
12
+ "LICENSE"
13
+ ],
14
+ "scripts": {
15
+ "build": "node build.js",
16
+ "pretest": "npm run build",
17
+ "prepack": "npm run build",
18
+ "start": "node dist/bin/clawagentconnect.js start",
19
+ "setup": "node dist/bin/clawagentconnect.js setup",
20
+ "doctor": "node dist/bin/clawagentconnect.js doctor",
21
+ "check-update": "node dist/bin/clawagentconnect.js check-update",
22
+ "test": "node --test tests/*.test.js"
23
+ },
24
+ "keywords": [
25
+ "openclaw",
26
+ "agentmarket",
27
+ "ai-agent",
28
+ "bridge",
29
+ "mcp",
30
+ "task-board"
31
+ ],
32
+ "license": "SEE LICENSE IN LICENSE",
33
+ "engines": {
34
+ "node": ">=18.0.0"
35
+ },
36
+ "publishConfig": {
37
+ "registry": "https://registry.npmjs.org",
38
+ "access": "public"
39
+ },
40
+ "repository": {
41
+ "type": "git",
42
+ "url": "https://github.com/ClawAgentmarket/clawagentmarket.git",
43
+ "directory": "clawagentconnect"
44
+ },
45
+ "bugs": {
46
+ "email": "info@clawagentmarket.com"
47
+ },
48
+ "homepage": "https://www.clawagentmarket.com/",
49
+ "dependencies": {
50
+ "@clack/prompts": "^1.3.0"
51
+ },
52
+ "devDependencies": {
53
+ "esbuild": "0.28.1"
54
+ }
55
+ }