@buygent/cli 0.4.1 → 0.4.2
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/dist/cli.js +1 -1
- package/dist/extension/popup.html +156 -92
- package/dist/extension/popup.js +75 -92
- package/dist/native-host.js +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -335,4 +335,4 @@ return JSON.stringify({ restoredNames: ${JSON.stringify($.filter((Y)=>!Y.httpOnl
|
|
|
335
335
|
[y/N] `);let H=await m70();if(!c70(H)){console.log(JSON.stringify({ok:!1,cancelled:!0},null,2));return}}let W=await J9(Q,`/platforms/${encodeURIComponent(String(J))}/orders`,{...K,approved:!0});console.log(JSON.stringify(W,null,2))})};var bT=($,J,Y)=>{if(Y!==void 0&&Y!==null&&String(Y).trim().length>0)$.set(J,String(Y))},yo0=($={})=>{let J=new URLSearchParams;bT(J,"platform",$.platform),bT(J,"status",$.status),bT(J,"adapterId",$.adapterId);let Y=J.toString();return Y?`/platforms?${Y}`:"/platforms"},d70=($)=>{$.command("platforms").description("List connected external commerce platforms").option("--platform <platform>","Filter by platform").option("--status <status>","Filter by connection status").option("--adapter-id <adapterId>","Filter by Buygent adapter id").action(async(J)=>{let Y=n6(),X=await S9(Y,yo0(J));console.log(JSON.stringify(X,null,2))})};import{existsSync as vo0,readFileSync as ho0}from"node:fs";import _H from"node:path";class p70 extends Error{code;status;constructor($,J,Y){super($);this.code=J;this.status=Y;this.name="MarketplaceError"}}class SH extends p70{constructor($,J="invalid_request"){super($,J,400);this.name="MarketplaceValidationError"}}var i70=/^([A-Za-z0-9_-]+):(?:\s*(.*))?$/,vT=($)=>{let J=$.trim();if(!J.length)return"";if(J.startsWith("{")&&J.endsWith("}")||J.startsWith("[")&&J.endsWith("]"))try{return JSON.parse(J)}catch{return J}if(J.startsWith('"')&&J.endsWith('"')||J.startsWith("'")&&J.endsWith("'"))return J.slice(1,-1);if(J==="true")return!0;if(J==="false")return!1;if(J==="null")return null;if(/^-?\d+(?:\.\d+)?$/.test(J))return Number(J);return J},bo0=($)=>$.replace(/\r\n/g,`
|
|
336
336
|
`).split(`
|
|
337
337
|
`).map((J)=>({indent:J.match(/^ */)?.[0].length??0,text:J.trimEnd()})).filter((J)=>{let Y=J.text.trim();return Y.length>0&&!Y.startsWith("#")}),n70=($)=>{let J={},Y=bo0($),X=[{indent:-1,type:"object",value:J}],Q=(G,K)=>{let W=Y[G+1];return W&&W.indent>K&&W.text.trimStart().startsWith("- ")?[]:{}};for(let G=0;G<Y.length;G+=1){let K=Y[G],W=K.text.trimStart();while(X.length>1&&K.indent<=X[X.length-1].indent)X.pop();let H=X[X.length-1];if(W.startsWith("- ")){if(H.type!=="array")throw new SH("Simple YAML parser expected an array item");let q=H.value,B=W.slice(2).trim();if(!B){let E={};q.push(E),X.push({indent:K.indent,type:"object",value:E});continue}let L=B.match(i70);if(!L){q.push(vT(B));continue}let[,D,F]=L,A={};if(q.push(A),X.push({indent:K.indent,type:"object",value:A}),F&&F.trim().length>0){A[D]=vT(F);continue}let M=Q(G,K.indent);A[D]=M,X.push({indent:K.indent+2,type:Array.isArray(M)?"array":"object",value:M});continue}if(H.type!=="object")throw new SH("Simple YAML parser expected an object entry");let V=H.value,Z=W.match(i70);if(!Z)throw new SH(`Unable to parse YAML line: ${W}`);let[,z,O]=Z;if(O&&O.trim().length>0){V[z]=vT(O);continue}let U=Q(G,K.indent);V[z]=U,X.push({indent:K.indent,type:Array.isArray(U)?"array":"object",value:U})}return J};var fo0={cwd:()=>process.cwd(),loadConfig:n6,fetchImplementation:fetch,printJson:($)=>{console.log(JSON.stringify($,null,2))},printLine:($)=>{console.log($)},readTextFile:($)=>ho0($,"utf8"),fileExists:($)=>vo0($)},go0=($={})=>({...fo0,...$}),CO=($)=>typeof $==="string"&&$.trim().length>0?$.trim():void 0,hT=($,J)=>{let Y=CO($);if(!Y)throw Error(`${J} is required`);return Y},o70=($,J)=>{if($===void 0)return;if(!Number.isInteger($)||Number($)<0)throw Error(`${J} must be a non-negative integer`);return Number($)},CH=($)=>Boolean($)&&typeof $==="object"&&!Array.isArray($),uo0=($,J)=>{let Y=J($);if(_H.extname($).toLowerCase()===".json")return JSON.parse(Y);return n70(Y)},mo0=($,J)=>{if(J.startsWith(`${$}/`))return J;if(J.includes("/"))throw Error(`capabilities[].id must not include another handle: ${J}`);return`${$}/${J}`},co0=($,J,Y,X)=>{if(J.config)return _H.resolve(X(),J.config);let Q=_H.resolve(X(),$??".");for(let G of["buygent.yaml","buygent.yml","buygent.json"]){let K=_H.join(Q,G);if(Y(K))return K}throw Error(`No buygent.yaml, buygent.yml, or buygent.json found in ${Q}`)},lo0=($)=>{if(!CH($))throw Error("publish config must be an object");let J=$.agent;if(!CH(J))throw Error("agent must be an object");let Y=hT(J.handle,"agent.handle"),X=Array.isArray($.capabilities)?$.capabilities:[];return{agent:{handle:Y,displayName:CO(J.displayName),bio:CO(J.bio)},capabilities:X.map((Q,G)=>{if(!CH(Q))throw Error(`capabilities[${G}] must be an object`);let K=Q.payloadJsonSchema;if(K!==void 0&&!CH(K))throw Error(`capabilities[${G}].payloadJsonSchema must be an object`);return{id:mo0(Y,hT(Q.id,`capabilities[${G}].id`)),title:hT(Q.title,`capabilities[${G}].title`),description:CO(Q.description),pricePerCallUsdCents:o70(Q.pricePerCallUsdCents,`capabilities[${G}].pricePerCallUsdCents`),payloadJsonSchema:K,defaultHoldMinutes:o70(Q.defaultHoldMinutes,`capabilities[${G}].defaultHoldMinutes`)}})}},do0=($)=>({handle:$.handle,...$.displayName?{displayName:$.displayName}:{},...$.bio?{bio:$.bio}:{}}),po0=($)=>({id:$.id,title:$.title,...$.description?{description:$.description}:{},payloadJsonSchema:$.payloadJsonSchema??{type:"object"},proofKinds:["custom"],...$.pricePerCallUsdCents!==void 0?{pricingHintCents:$.pricePerCallUsdCents}:{},...$.defaultHoldMinutes!==void 0?{defaultHoldMinutes:$.defaultHoldMinutes}:{}}),io0=($)=>({title:$.title,...$.description?{description:$.description}:{},payloadJsonSchema:$.payloadJsonSchema??{type:"object"},...$.pricePerCallUsdCents!==void 0?{pricingModel:"per_call",pricePerCallUsdCents:$.pricePerCallUsdCents,pricingHintCents:$.pricePerCallUsdCents}:{},...$.defaultHoldMinutes!==void 0?{defaultHoldMinutes:$.defaultHoldMinutes}:{}}),r70=async($,J,Y)=>{let X=await $(J,Y),Q=await X.text(),G=Q?JSON.parse(Q):void 0;return{response:X,body:G}},s70=async($,J)=>{let{response:Y}=await r70($,J,{headers:{Accept:"application/json"}});if(Y.status===404)return!1;if(!Y.ok)throw Error(`Request failed with status ${Y.status} for ${J}`);return!0},fT=async($,J,Y)=>{let{response:X,body:Q}=await r70($,J,Y);if(!X.ok)throw Error(typeof Q==="object"&&Q&&"error"in Q?String(Q.error):`Request failed with status ${X.status}`);return Q},no0=async($,J,Y,X)=>{let Q=Y?l8(Y):void 0,G=do0(J.agent),K=J.capabilities.map((V)=>({create:po0(V),update:io0(V)}));if(!Q)return{configPath:$,agent:{action:"create",handle:J.agent.handle,body:G},capabilities:J.capabilities.map((V,Z)=>({action:"create",id:V.id,body:K[Z].create}))};let W=await s70(X,`${Q}/agents/${encodeURIComponent(J.agent.handle)}`),H=await Promise.all(J.capabilities.map(async(V,Z)=>{let z=await s70(X,`${Q}/capabilities/${encodeURIComponent(V.id)}`);return{action:z?"update":"create",id:V.id,body:z?K[Z].update:K[Z].create}}));return{configPath:$,agent:{action:W?"update":"create",handle:J.agent.handle,body:W?{...J.agent.displayName?{displayName:J.agent.displayName}:{},...J.agent.bio?{bio:J.agent.bio}:{}}:G},capabilities:H}},oo0=async($,J,Y={})=>{let X=go0(Y),Q=co0($,J,X.fileExists,X.cwd),G=lo0(uo0(Q,X.readTextFile)),K=J.dryRun?void 0:X.loadConfig(),W=K?l8(K):void 0;if(!J.dryRun&&!W)throw Error("Missing apiUrl. Run: buygent config set --api-url <url> or set BUYGENT_API_URL");let H=await no0(Q,G,K,X.fetchImplementation);if(J.dryRun)return X.printJson(H),X.printLine(`Would publish @${G.agent.handle} with ${G.capabilities.length} capabilities`),H;let Z={"Content-Type":"application/json",Accept:"application/json",...ZJ(K)},z=H.agent.action==="create"?`${W}/agents/register`:`${W}/agents/${encodeURIComponent(G.agent.handle)}`;await fT(X.fetchImplementation,z,{method:H.agent.action==="create"?"POST":"PATCH",headers:Z,body:JSON.stringify(H.agent.body)});for(let O of H.capabilities){let U=O.action==="create"?`${W}/capabilities`:`${W}/capabilities/${encodeURIComponent(O.id)}`;if(await fT(X.fetchImplementation,U,{method:O.action==="create"?"POST":"PATCH",headers:Z,body:JSON.stringify(O.body)}),O.action==="create"&&CH(O.body)&&typeof O.body.pricingHintCents==="number")await fT(X.fetchImplementation,`${W}/capabilities/${encodeURIComponent(O.id)}`,{method:"PATCH",headers:Z,body:JSON.stringify({pricingModel:"per_call",pricePerCallUsdCents:O.body.pricingHintCents,pricingHintCents:O.body.pricingHintCents})})}return X.printLine(`Published @${G.agent.handle} with ${G.capabilities.length} capabilities`),H},a70=($,J={})=>{$.command("publish [dir]").description("Publish seller marketplace agent metadata and capabilities from buygent.yaml or buygent.json").option("--config <path>","Explicit config file path").option("--dry-run","Show what would be published without sending API requests").action(async(Y,X)=>{await oo0(Y,X,J)})};import{existsSync as so0,mkdirSync as ro0,readFileSync as ao0,writeFileSync as to0}from"node:fs";import{homedir as eo0}from"node:os";import{dirname as $s0,join as Js0}from"node:path";var $J0=($)=>Boolean($)&&typeof $==="object"&&!Array.isArray($),JJ0=($=process.env)=>$.BUYGENT_PROFILE_PATH??Js0($.HOME??eo0(),".buygent","profile.json"),VY=($)=>typeof $==="string"&&$.trim().length>0?$.trim():void 0,Ys0=($,J)=>{if($===void 0||$===null||$==="")return;let Y=typeof $==="number"?$:Number.parseInt(String($),10);if(!Number.isInteger(Y)||Y<0)throw Error(`${J} must be a non-negative integer`);return Y},Xs0=($)=>{if($===void 0||$===null||$==="")return;let J=typeof $==="number"?$:Number.parseFloat(String($));if(!Number.isFinite(J)||J<0)throw Error("--budget-per-order-usd must be a non-negative number");return Math.round(J*100)},YJ0=($,J="defaultAddress")=>{if($===void 0||$===null)return;if(!$J0($))throw Error(`${J} must be an object`);let Y=VY($.street)??"",X=VY($.city)??"",Q=VY($.zipCode)??"",G=VY($.note);if(!Y||!X||!Q)throw Error(`${J} requires street, city, and zipCode`);return{street:Y,city:X,zipCode:Q,...G?{note:G}:{}}},XJ0=($,J="profile")=>{if($===void 0||$===null)return{};if(!$J0($))throw Error(`${J} must be an object`);let Y=VY($.defaultPhone),X=VY($.defaultPaymentMethodId),Q=Ys0($.budgetPerOrderUsdCents,`${J}.budgetPerOrderUsdCents`),G=(()=>{if($.preferCredits===void 0)return;if(typeof $.preferCredits!=="boolean")throw Error(`${J}.preferCredits must be a boolean`);return $.preferCredits})();return{...$.defaultAddress!==void 0?{defaultAddress:YJ0($.defaultAddress,`${J}.defaultAddress`)}:{},...Y?{defaultPhone:Y}:{},...X?{defaultPaymentMethodId:X}:{},...Q!==void 0?{budgetPerOrderUsdCents:Q}:{},...G!==void 0?{preferCredits:G}:{}}},t70=($=process.env)=>{let J=JJ0($);if(!so0(J))return{};return XJ0(JSON.parse(ao0(J,"utf8")),"profile")},Qs0=($,J=process.env)=>{let Y=XJ0($,"profile"),X=JJ0(J);return ro0($s0(X),{recursive:!0}),to0(X,`${JSON.stringify(Y,null,2)}
|
|
338
|
-
`,"utf8"),Y},Gs0=($)=>$.defaultAddressStreet!==void 0||$.defaultAddressCity!==void 0||$.defaultAddressZip!==void 0||$.defaultAddressNote!==void 0,Ks0=($,J={})=>{let Y={};if(Gs0($))Y.defaultAddress=YJ0({...J.defaultAddress??{},...$.defaultAddressStreet!==void 0?{street:String($.defaultAddressStreet)}:{},...$.defaultAddressCity!==void 0?{city:String($.defaultAddressCity)}:{},...$.defaultAddressZip!==void 0?{zipCode:String($.defaultAddressZip)}:{},...$.defaultAddressNote!==void 0?{note:String($.defaultAddressNote)}:{}},"defaultAddress");let X=VY($.defaultPhone);if(X)Y.defaultPhone=X;let Q=VY($.defaultPaymentMethodId);if(Q)Y.defaultPaymentMethodId=Q;let G=Xs0($.budgetPerOrderUsd);if(G!==void 0)Y.budgetPerOrderUsdCents=G;if(typeof $.preferCredits==="boolean")Y.preferCredits=$.preferCredits;return Y},e70=($)=>{console.log(JSON.stringify($,null,2))},QJ0=($)=>{let J=$.command("profile").description("Manage the local Buygent buyer profile");J.command("get").description("Print the local buyer profile JSON").action(()=>{e70(t70())}),J.command("set").description("Set local buyer profile defaults used by CLI and MCP").option("--default-address-street <street>").option("--default-address-city <city>").option("--default-address-zip <zipCode>").option("--default-address-note <note>").option("--default-phone <phone>").option("--default-payment-method-id <paymentMethodId>").option("--prefer-credits","Default orders to Buygent credits").option("--budget-per-order-usd <usd>").action((Y)=>{let X=t70(),Q=Qs0({...X,...Ks0(Y,X)});e70(Q)})};var uX=($,J,Y)=>{if(Y!==void 0&&Y!==null&&String(Y).trim().length>0)$.set(J,String(Y))},Ws0=($,J,Y={})=>{let X=new URLSearchParams;return uX(X,"query",J),uX(X,"limit",Y.limit),uX(X,"cursor",Y.cursor),uX(X,"category",Y.category),uX(X,"sort",Y.sort),uX(X,"accountId",Y.accountId),uX(X,"filters",Y.filters),`/platforms/${encodeURIComponent($)}/search?${X.toString()}`},GJ0=($)=>{$.command("search <platform> <query...>").description("Search an external commerce platform").option("--limit <count>","Maximum number of results to return").option("--cursor <cursor>","Pagination cursor from a previous search response").option("--category <category>","Platform category filter").option("--sort <sort>","Platform sort mode").option("--account-id <platformAccountId>","Connected platform account id to search with").option("--filters <json>","Platform-specific filters encoded as JSON").action(async(J,Y,X)=>{let Q=Y.join(" ").trim();if(!Q)throw Error("Search query is required");let G=n6(),K=await S9(G,Ws0(String(J),Q,X));console.log(JSON.stringify(K,null,2))})};var kH=($,J,Y)=>{if(Y!==void 0&&Y!==null&&String(Y).trim().length>0)$.set(J,String(Y))},Hs0=($,J,Y={})=>{if(!J&&Y.orderId&&!Y.carrier&&!Y.accountId&&!Y.platformReference)return`/platforms/${encodeURIComponent($)}/orders/${encodeURIComponent(String(Y.orderId))}`;let X=new URLSearchParams;kH(X,"trackingRef",J),kH(X,"orderId",Y.orderId),kH(X,"carrier",Y.carrier),kH(X,"accountId",Y.accountId),kH(X,"platformReference",Y.platformReference);let Q=X.toString();if(!Q)throw Error("Provide a tracking reference or --order-id");return`/platforms/${encodeURIComponent($)}/track?${Q}`},KJ0=($)=>{$.command("track <platform> [trackingRef]").description("Track shipping or delivery status for a platform order").option("--order-id <orderId>","Buygent order id").option("--carrier <carrier>","Carrier name or code").option("--account-id <platformAccountId>","Connected platform account id").option("--platform-reference <reference>","Platform order/reference id").action(async(J,Y,X)=>{let Q=n6(),G=await S9(Q,Hs0(String(J),Y?String(Y):void 0,X));console.log(JSON.stringify(G,null,2))})};var WJ0=($)=>($/100).toFixed(2);import{existsSync as VJ0,readFileSync as Vs0}from"node:fs";import{dirname as HJ0,join as ZJ0}from"node:path";import{fileURLToPath as Zs0}from"node:url";var zs0="0.0.0-dev",zJ0="0.4.1",Us0=()=>zJ0!=="0.4.1",qs0=($)=>{let J=ZJ0($,"package.json");if(!VJ0(J))return;return JSON.parse(Vs0(J,"utf8"))},Bs0=($=import.meta.url)=>{let J=HJ0(Zs0($));while(!0){if(VJ0(ZJ0(J,"package.json")))return J;let Y=HJ0(J);if(Y===J)return J;J=Y}},UJ0=($=import.meta.url)=>{let J=qs0(Bs0($));if(typeof J?.version==="string"&&J.version.trim().length>0)return J.version;return Us0()?zJ0:zs0};var z6=new Gw,qJ0=($)=>{let[J,Y]=$.split("/");if(!J||!Y)throw Error(`Invalid resource reference: ${$}. Use adapterId/listingId.`);return{adapterId:J,listingId:Y}},Os0=($)=>{if($.length<=8)return"[redacted]";return`${$.startsWith("bg_live_")?"bg_live_":$.slice(0,3)}...${$.slice(-4)}`},Ls0=($)=>({...$,...$.agentKey?{agentKey:Os0($.agentKey)}:{}}),i1=($)=>{console.log(JSON.stringify($,null,2))},Ds0=($)=>{if(!$||typeof $!=="object")return 0;let J=$;if(typeof J.availableCents==="number")return J.availableCents;let Y=J.balance;if(Y&&typeof Y==="object"&&typeof Y.availableCents==="number")return Y.availableCents;return 0},BJ0=($)=>{let J=Ds0($);console.log(`Balance: $${WJ0(J)} (${J}\xA2)`)},Fs0=($)=>{if($==="external")return $;throw Error(`Invalid signer mode: ${$}. Use external.`)},OJ0=($)=>{if(!$.agentKey)throw Error(PZ)};z6.name("buygent").description("Buygent CLI").version(UJ0(import.meta.url));z6.command("health").description("Print CLI scaffold readiness").action(()=>{console.log("buygent cli ready")});B90(z6);v90(z6);F70(z6);GJ0(z6);l70(z6);d70(z6);a70(z6);KJ0(z6);QJ0(z6);P70(z6);y70(z6);z6.command("mcp").description("Run the Buygent MCP stdio server").option("--serve","Start the stdio MCP server").action(async($)=>{if(!$.serve)throw Error("Use: buygent mcp --serve");await Fv()});var Ns0=z6.command("config").description("Manage local CLI configuration"),iG=z6.command("auth").description("Manage buyer and worker sign-in"),As0=z6.command("bounty").description("Create and inspect buyer human bounties"),LJ0=z6.command("credits").description("Manage buyer prepaid credits");b70(iG);v70(LJ0);Ns0.command("set").option("--wallet-address <address>").option("--signer-mode <mode>","external",Fs0).option("--signer-endpoint <url>").option("--session-id <sessionId>").option("--account-email <email>").option("--account-role <role>").option("--api-url <url>").option("--agent-key <key>").option("--soft-limit <usd>").option("--hard-limit <usd>").action(($)=>{let J=xT({walletAddress:$.walletAddress,signerMode:$.signerMode,signerEndpoint:$.signerEndpoint,sessionId:$.sessionId,accountEmail:$.accountEmail,accountRole:$.accountRole==="buyer"||$.accountRole==="worker"?$.accountRole:void 0,apiUrl:$.apiUrl,agentKey:$.agentKey,softLimitUsd:$.softLimit!==void 0?Number.parseFloat(String($.softLimit)):void 0,hardLimitUsd:$.hardLimit!==void 0?Number.parseFloat(String($.hardLimit)):void 0});i1(Ls0(J))});iG.command("request-code").requiredOption("--email <email>").option("--role <role>","buyer or worker","buyer").option("--debug","Expose debug auth code when the server supports it").action(async($)=>{let J=k1(),Y=RZ(J);if(!Y)throw Error("Missing apiUrl. Run: buygent config set --api-url <url> or set BUYGENT_API_URL");let X=String($.role)==="worker"?"worker":"buyer",Q=await fetch(`${Y}/auth/email/request-code`,{method:"POST",headers:{"Content-Type":"application/json",...$.debug?{"x-buygent-debug-auth":"true"}:{},...J.agentKey?{Authorization:`Bearer ${J.agentKey}`}:{},...J.sessionId?{Cookie:`buygent_session=${encodeURIComponent(J.sessionId)}`}:{}},body:JSON.stringify({email:String($.email),role:X})});if(!Q.ok)throw Error(await Q.text());i1(await Q.json())});iG.command("verify").requiredOption("--email <email>").requiredOption("--code <code>").option("--role <role>","buyer or worker","buyer").action(async($)=>{let J=k1(),Y=RZ(J);if(!Y)throw Error("Missing apiUrl. Run: buygent config set --api-url <url> or set BUYGENT_API_URL");let X=String($.role)==="worker"?"worker":"buyer",Q=await fetch(`${Y}/auth/email/verify`,{method:"POST",headers:{"Content-Type":"application/json",...J.agentKey?{Authorization:`Bearer ${J.agentKey}`}:{}},body:JSON.stringify({email:String($.email),role:X,code:String($.code)})});if(!Q.ok)throw Error(await Q.text());let G=await Q.json(),K=xT({sessionId:G.sessionId,accountEmail:G.user.email,accountRole:G.user.role});i1({ok:!0,sessionId:G.sessionId,accountEmail:K.accountEmail,accountRole:K.accountRole,expiresAt:G.expiresAt})});iG.command("device-code").action(async()=>{await Cv(k1())});iG.command("whoami").action(async()=>{let $=k1();i1(await j8($,"/auth/session"))});iG.command("logout").action(async()=>{let $=k1();await P8($,"/auth/logout",{});let J={...$};delete J.agentKey,delete J.sessionId,delete J.accountEmail,delete J.accountRole,kT(J),i1({ok:!0})});var DJ0=z6.command("catalog").description("Browse provider listings");DJ0.command("list").option("--type <type>").action(async($)=>{let J=k1(),Y=$.type?`?type=${encodeURIComponent(String($.type))}`:"";i1(await j8(J,`/catalog${Y}`))});DJ0.command("show <resource>").action(async($)=>{let J=k1(),{adapterId:Y,listingId:X}=qJ0($);i1(await j8(J,`/catalog/${Y}/${X}`))});var gT=($,J)=>[...J,$];As0.command("create").requiredOption("--intent <intent>").requiredOption("--market <market>").requiredOption("--specialty <specialty>").requiredOption("--deliverable <deliverable>").requiredOption("--duration <minutes>").option("--language <language>").option("--execution-mode <executionMode>").option("--credential <credential>","repeat for multiple credentials",gT,[]).option("--jurisdiction <jurisdiction>","repeat for multiple jurisdictions",gT,[]).option("--sla-min <minutes>").option("--wallet-address <address>").option("--output <mode>","summary, json, or url","summary").action(async($)=>{let J=k1();OJ0(J);let Y=Number.parseInt(String($.duration),10),X=Mv({intent:String($.intent),market:String($.market),durationMin:Y,specialty:String($.specialty),deliverable:String($.deliverable),...$.language?{language:String($.language)}:{},...$.executionMode?{executionMode:String($.executionMode)}:{},...Array.isArray($.credential)&&$.credential.length>0?{credential:$.credential.map((H)=>String(H))}:{},...Array.isArray($.jurisdiction)&&$.jurisdiction.length>0?{jurisdiction:$.jurisdiction.map((H)=>String(H))}:{},...$.slaMin?{slaMin:Number.parseInt(String($.slaMin),10)}:{}}),Q=await IZ(J,{adapterId:"",listingId:"",durationMin:Y,...$.walletAddress?{walletAddress:String($.walletAddress)}:{},request:X}),G=Q.body??Q,K=G.credential&&typeof G.credential==="object"&&"fields"in G.credential&&G.credential.fields&&typeof G.credential.fields==="object"&&"taskId"in G.credential.fields&&typeof G.credential.fields.taskId==="string"?G.credential.fields.taskId:void 0,W=G.orderId&&typeof G.orderId==="string"&&J.apiUrl?`${J.apiUrl}/human-tasks/${G.orderId}`:void 0;if($.output==="json"){i1({...Q,taskId:K,taskStatusUrl:W});return}if($.output==="url"&&W){console.log(W);return}console.log(Ev({apiUrl:String(J.apiUrl),responseBody:G}))});LJ0.command("show").action(async()=>{let $=k1();OJ0($);let J=await j8($,"/credits");BJ0(J),i1(J)});z6.command("buy [resource]").option("--duration <minutes>").option("--billing <model>").option("--unit <unit>").option("--auto-renew").option("--interval-count <count>").option("--cancel-at-period-end").option("--type <type>").option("--resource-class <resourceClass>").option("--intent <intent>").option("--market <market>").option("--provider <provider>").option("--channel <channel>").option("--credential-kind <kind>").option("--specialty <specialty>").option("--jurisdiction <jurisdiction>").option("--credential <credential>").option("--execution-mode <executionMode>").option("--deliverable <deliverable>").option("--language <language>").option("--sla-min <minutes>").option("--task <task>").option("--environment <environment>").option("--gpu-type <type>").option("--gpu-count <count>").option("--public-endpoint").option("--output <mode>","json or key","json").action(async($,J)=>{let Y=k1(),X=J.task||J.environment||J.gpuType||J.gpuCount||J.publicEndpoint||J.provider||J.channel||J.credentialKind||J.specialty||J.jurisdiction||J.credential||J.executionMode||J.deliverable||J.language||J.slaMin?{...J.task?{task:String(J.task)}:{},...J.environment?{environment:String(J.environment)}:{},...J.gpuType?{gpuType:String(J.gpuType)}:{},...J.gpuCount?{gpuCount:Number.parseInt(String(J.gpuCount),10)}:{},...J.publicEndpoint?{publicEndpoint:!0}:{},...J.provider?{provider:String(J.provider)}:{},...J.channel?{channel:String(J.channel)}:{},...J.credentialKind?{credentialKind:String(J.credentialKind)}:{},...J.specialty?{specialty:String(J.specialty)}:{},...J.jurisdiction?{jurisdiction:String(J.jurisdiction)}:{},...J.credential?{credential:String(J.credential)}:{},...J.executionMode?{executionMode:String(J.executionMode)}:{},...J.deliverable?{deliverable:String(J.deliverable)}:{},...J.language?{language:String(J.language)}:{},...J.slaMin?{slaMin:Number.parseInt(String(J.slaMin),10)}:{}}:void 0,Q=await($?(()=>{let G=tN(J.duration);if(G===void 0)throw Error("--duration is required when buying a concrete resource listing");return IZ(Y,{...qJ0($),durationMin:G,requirements:X,billing:eN(J)?{model:String(J.billing??"lease"),unit:String(J.unit??"minute"),autoRenew:Boolean(J.autoRenew),...J.intervalCount?{intervalCount:Number.parseInt(String(J.intervalCount),10)}:{},...J.cancelAtPeriodEnd?{cancelAtPeriodEnd:!0}:{}}:void 0})})():(()=>{let G=_v(J);return IZ(Y,{adapterId:"",listingId:"",durationMin:G.durationMin,request:G.request})})());if(J.output==="key"){let G="body"in Q&&Q.body&&typeof Q.body==="object"?Q.body:Q,K=G.credential,W=K?.fields?.apiKeySecret??K?.fields?.secret??K?.fields?.token??JSON.stringify(G);console.log(W);return}i1(Q)});var FJ0=z6.command("orders").description("Inspect purchase orders");FJ0.command("list").action(async()=>{let $=k1();i1(await j8($,"/orders"))});FJ0.command("show <orderId>").action(async($)=>{let J=k1();i1(await j8(J,`/orders/${$}/status`))});var NJ0=z6.command("credentials").description("Inspect issued credentials"),AJ0=z6.command("compute").description("Use compute capabilities"),Ms0=z6.command("email").description("Use email capabilities"),Es0=z6.command("sms").description("Use SMS capabilities"),MJ0=z6.command("human").description("Use human execution primitives");NJ0.command("list").action(async()=>{let $=k1();i1(await j8($,"/credentials"))});NJ0.command("show <orderId>").action(async($)=>{let J=k1();i1(await j8(J,`/credentials/${$}`))});Ms0.command("send").option("--order-id <orderId>").requiredOption("--to <email>").requiredOption("--subject <subject>").option("--text <text>").option("--html <html>").action(async($)=>{let J=k1();i1(await P8(J,"/actions/email/send",{to:String($.to),subject:String($.subject),...$.text?{text:String($.text)}:{},...$.html?{html:String($.html)}:{}}))});Es0.command("send").option("--order-id <orderId>").requiredOption("--to <number>").requiredOption("--text <text>").option("--from <number>").action(async($)=>{let J=k1();i1(await P8(J,"/actions/sms/send",{to:String($.to),text:String($.text),...$.from?{from:String($.from)}:{}}))});var mX=MJ0.command("task").description("Use buyer-side human task primitives"),xH=MJ0.command("work").description("Use worker-side human task primitives");mX.command("show").requiredOption("--order-id <orderId>").action(async($)=>{let J=k1();i1(await j8(J,`/human-tasks/${encodeURIComponent(String($.orderId))}`))});mX.command("events").requiredOption("--task-id <taskId>").action(async($)=>{let J=k1();i1(await j8(J,`/human-tasks/${encodeURIComponent(String($.taskId))}/events`))});mX.command("applicants").requiredOption("--task-id <taskId>").action(async($)=>{let J=k1();i1(await j8(J,`/human-tasks/${encodeURIComponent(String($.taskId))}/applicants`))});mX.command("select").requiredOption("--task-id <taskId>").requiredOption("--human-profile-id <humanProfileId>").option("--selected-by <selectedBy>").action(async($)=>{let J=k1();i1(await P8(J,`/human-tasks/${encodeURIComponent(String($.taskId))}/select`,{humanProfileId:String($.humanProfileId),...$.selectedBy?{selectedBy:String($.selectedBy)}:{}}))});mX.command("message").requiredOption("--task-id <taskId>").requiredOption("--message <message>").option("--actor-id <actorId>").action(async($)=>{let J=k1();i1(await P8(J,`/human-tasks/${encodeURIComponent(String($.taskId))}/messages`,{actorType:"buyer",...$.actorId?{actorId:String($.actorId)}:{},message:String($.message)}))});mX.command("approve").requiredOption("--task-id <taskId>").option("--buyer-id <buyerId>").action(async($)=>{let J=k1();i1(await P8(J,`/human-tasks/${encodeURIComponent(String($.taskId))}/approve`,{...$.buyerId?{buyerId:String($.buyerId)}:{}}))});mX.command("reject").requiredOption("--task-id <taskId>").requiredOption("--reason <reason>").option("--buyer-id <buyerId>").option("--final","Mark as final rejection instead of revision requested").action(async($)=>{let J=k1();i1(await P8(J,`/human-tasks/${encodeURIComponent(String($.taskId))}/reject`,{reason:String($.reason),revisionRequested:!Boolean($.final),...$.buyerId?{buyerId:String($.buyerId)}:{}}))});xH.command("available").option("--human-profile-id <humanProfileId>").action(async($)=>{let J=k1(),Y=$.humanProfileId?`?humanProfileId=${encodeURIComponent(String($.humanProfileId))}`:"";i1(await j8(J,`/human-work/available${Y}`))});xH.command("apply").requiredOption("--task-id <taskId>").requiredOption("--human-profile-id <humanProfileId>").option("--note <note>").action(async($)=>{let J=k1();i1(await P8(J,`/human-work/${encodeURIComponent(String($.taskId))}/apply`,{humanProfileId:String($.humanProfileId),...$.note?{note:String($.note)}:{}}))});xH.command("start").requiredOption("--task-id <taskId>").requiredOption("--human-profile-id <humanProfileId>").action(async($)=>{let J=k1();i1(await P8(J,`/human-work/${encodeURIComponent(String($.taskId))}/start`,{humanProfileId:String($.humanProfileId)}))});xH.command("submit").requiredOption("--task-id <taskId>").requiredOption("--human-profile-id <humanProfileId>").requiredOption("--summary <summary>").option("--time-spent-min <minutes>").option("--artifact <artifact>","repeatable artifact values",gT,[]).action(async($)=>{let J=k1();i1(await P8(J,`/human-work/${encodeURIComponent(String($.taskId))}/submit`,{humanProfileId:String($.humanProfileId),summary:String($.summary),...Array.isArray($.artifact)&&$.artifact.length>0?{artifacts:$.artifact.map((Y)=>({label:"artifact",value:String(Y)}))}:{},...$.timeSpentMin?{timeSpentMin:Number.parseInt(String($.timeSpentMin),10)}:{}}))});xH.command("message").requiredOption("--task-id <taskId>").requiredOption("--human-profile-id <humanProfileId>").requiredOption("--message <message>").action(async($)=>{let J=k1();i1(await P8(J,`/human-work/${encodeURIComponent(String($.taskId))}/messages`,{humanProfileId:String($.humanProfileId),message:String($.message)}))});AJ0.command("exec").option("--order-id <orderId>").requiredOption("--command <command>").action(async($)=>{let J=k1();i1(await P8(J,"/actions/compute/exec",{command:String($.command)}))});var _O=AJ0.command("session").description("Manage mediated compute sessions");_O.command("open").option("--order-id <orderId>").action(async($)=>{let J=k1();i1(await P8(J,"/actions/compute/session",{}))});_O.command("send").requiredOption("--token <token>").requiredOption("--data <data>").action(async($)=>{let J=k1();i1(await fetch(`${J.apiUrl}/actions/compute/session/input`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${String($.token)}`},body:JSON.stringify({data:String($.data)})}).then(async(Y)=>{if(!Y.ok)throw Error(await Y.text());return Y.json()}))});_O.command("read").requiredOption("--token <token>").option("--cursor <cursor>").action(async($)=>{let J=k1(),Y=$.cursor!==void 0?`?cursor=${encodeURIComponent(String($.cursor))}`:"";i1(await fetch(`${J.apiUrl}/actions/compute/session/output${Y}`,{method:"GET",headers:{Authorization:`Bearer ${String($.token)}`}}).then(async(X)=>{if(!X.ok)throw Error(await X.text());return X.json()}))});_O.command("close").requiredOption("--token <token>").action(async($)=>{let J=k1();i1(await fetch(`${J.apiUrl}/actions/compute/session/close`,{method:"POST",headers:{Authorization:`Bearer ${String($.token)}`}}).then(async(Y)=>{if(!Y.ok)throw Error(await Y.text());return Y.json()}))});z6.command("spending").action(async()=>{let $=k1(),J=await j8($,"/credits");BJ0(J),i1(J)});z6.parseAsync().catch(($)=>{console.error($ instanceof Error?$.message:String($)),process.exit(1)});
|
|
338
|
+
`,"utf8"),Y},Gs0=($)=>$.defaultAddressStreet!==void 0||$.defaultAddressCity!==void 0||$.defaultAddressZip!==void 0||$.defaultAddressNote!==void 0,Ks0=($,J={})=>{let Y={};if(Gs0($))Y.defaultAddress=YJ0({...J.defaultAddress??{},...$.defaultAddressStreet!==void 0?{street:String($.defaultAddressStreet)}:{},...$.defaultAddressCity!==void 0?{city:String($.defaultAddressCity)}:{},...$.defaultAddressZip!==void 0?{zipCode:String($.defaultAddressZip)}:{},...$.defaultAddressNote!==void 0?{note:String($.defaultAddressNote)}:{}},"defaultAddress");let X=VY($.defaultPhone);if(X)Y.defaultPhone=X;let Q=VY($.defaultPaymentMethodId);if(Q)Y.defaultPaymentMethodId=Q;let G=Xs0($.budgetPerOrderUsd);if(G!==void 0)Y.budgetPerOrderUsdCents=G;if(typeof $.preferCredits==="boolean")Y.preferCredits=$.preferCredits;return Y},e70=($)=>{console.log(JSON.stringify($,null,2))},QJ0=($)=>{let J=$.command("profile").description("Manage the local Buygent buyer profile");J.command("get").description("Print the local buyer profile JSON").action(()=>{e70(t70())}),J.command("set").description("Set local buyer profile defaults used by CLI and MCP").option("--default-address-street <street>").option("--default-address-city <city>").option("--default-address-zip <zipCode>").option("--default-address-note <note>").option("--default-phone <phone>").option("--default-payment-method-id <paymentMethodId>").option("--prefer-credits","Default orders to Buygent credits").option("--budget-per-order-usd <usd>").action((Y)=>{let X=t70(),Q=Qs0({...X,...Ks0(Y,X)});e70(Q)})};var uX=($,J,Y)=>{if(Y!==void 0&&Y!==null&&String(Y).trim().length>0)$.set(J,String(Y))},Ws0=($,J,Y={})=>{let X=new URLSearchParams;return uX(X,"query",J),uX(X,"limit",Y.limit),uX(X,"cursor",Y.cursor),uX(X,"category",Y.category),uX(X,"sort",Y.sort),uX(X,"accountId",Y.accountId),uX(X,"filters",Y.filters),`/platforms/${encodeURIComponent($)}/search?${X.toString()}`},GJ0=($)=>{$.command("search <platform> <query...>").description("Search an external commerce platform").option("--limit <count>","Maximum number of results to return").option("--cursor <cursor>","Pagination cursor from a previous search response").option("--category <category>","Platform category filter").option("--sort <sort>","Platform sort mode").option("--account-id <platformAccountId>","Connected platform account id to search with").option("--filters <json>","Platform-specific filters encoded as JSON").action(async(J,Y,X)=>{let Q=Y.join(" ").trim();if(!Q)throw Error("Search query is required");let G=n6(),K=await S9(G,Ws0(String(J),Q,X));console.log(JSON.stringify(K,null,2))})};var kH=($,J,Y)=>{if(Y!==void 0&&Y!==null&&String(Y).trim().length>0)$.set(J,String(Y))},Hs0=($,J,Y={})=>{if(!J&&Y.orderId&&!Y.carrier&&!Y.accountId&&!Y.platformReference)return`/platforms/${encodeURIComponent($)}/orders/${encodeURIComponent(String(Y.orderId))}`;let X=new URLSearchParams;kH(X,"trackingRef",J),kH(X,"orderId",Y.orderId),kH(X,"carrier",Y.carrier),kH(X,"accountId",Y.accountId),kH(X,"platformReference",Y.platformReference);let Q=X.toString();if(!Q)throw Error("Provide a tracking reference or --order-id");return`/platforms/${encodeURIComponent($)}/track?${Q}`},KJ0=($)=>{$.command("track <platform> [trackingRef]").description("Track shipping or delivery status for a platform order").option("--order-id <orderId>","Buygent order id").option("--carrier <carrier>","Carrier name or code").option("--account-id <platformAccountId>","Connected platform account id").option("--platform-reference <reference>","Platform order/reference id").action(async(J,Y,X)=>{let Q=n6(),G=await S9(Q,Hs0(String(J),Y?String(Y):void 0,X));console.log(JSON.stringify(G,null,2))})};var WJ0=($)=>($/100).toFixed(2);import{existsSync as VJ0,readFileSync as Vs0}from"node:fs";import{dirname as HJ0,join as ZJ0}from"node:path";import{fileURLToPath as Zs0}from"node:url";var zs0="0.0.0-dev",zJ0="0.4.2",Us0=()=>zJ0!=="0.4.2",qs0=($)=>{let J=ZJ0($,"package.json");if(!VJ0(J))return;return JSON.parse(Vs0(J,"utf8"))},Bs0=($=import.meta.url)=>{let J=HJ0(Zs0($));while(!0){if(VJ0(ZJ0(J,"package.json")))return J;let Y=HJ0(J);if(Y===J)return J;J=Y}},UJ0=($=import.meta.url)=>{let J=qs0(Bs0($));if(typeof J?.version==="string"&&J.version.trim().length>0)return J.version;return Us0()?zJ0:zs0};var z6=new Gw,qJ0=($)=>{let[J,Y]=$.split("/");if(!J||!Y)throw Error(`Invalid resource reference: ${$}. Use adapterId/listingId.`);return{adapterId:J,listingId:Y}},Os0=($)=>{if($.length<=8)return"[redacted]";return`${$.startsWith("bg_live_")?"bg_live_":$.slice(0,3)}...${$.slice(-4)}`},Ls0=($)=>({...$,...$.agentKey?{agentKey:Os0($.agentKey)}:{}}),i1=($)=>{console.log(JSON.stringify($,null,2))},Ds0=($)=>{if(!$||typeof $!=="object")return 0;let J=$;if(typeof J.availableCents==="number")return J.availableCents;let Y=J.balance;if(Y&&typeof Y==="object"&&typeof Y.availableCents==="number")return Y.availableCents;return 0},BJ0=($)=>{let J=Ds0($);console.log(`Balance: $${WJ0(J)} (${J}\xA2)`)},Fs0=($)=>{if($==="external")return $;throw Error(`Invalid signer mode: ${$}. Use external.`)},OJ0=($)=>{if(!$.agentKey)throw Error(PZ)};z6.name("buygent").description("Buygent CLI").version(UJ0(import.meta.url));z6.command("health").description("Print CLI scaffold readiness").action(()=>{console.log("buygent cli ready")});B90(z6);v90(z6);F70(z6);GJ0(z6);l70(z6);d70(z6);a70(z6);KJ0(z6);QJ0(z6);P70(z6);y70(z6);z6.command("mcp").description("Run the Buygent MCP stdio server").option("--serve","Start the stdio MCP server").action(async($)=>{if(!$.serve)throw Error("Use: buygent mcp --serve");await Fv()});var Ns0=z6.command("config").description("Manage local CLI configuration"),iG=z6.command("auth").description("Manage buyer and worker sign-in"),As0=z6.command("bounty").description("Create and inspect buyer human bounties"),LJ0=z6.command("credits").description("Manage buyer prepaid credits");b70(iG);v70(LJ0);Ns0.command("set").option("--wallet-address <address>").option("--signer-mode <mode>","external",Fs0).option("--signer-endpoint <url>").option("--session-id <sessionId>").option("--account-email <email>").option("--account-role <role>").option("--api-url <url>").option("--agent-key <key>").option("--soft-limit <usd>").option("--hard-limit <usd>").action(($)=>{let J=xT({walletAddress:$.walletAddress,signerMode:$.signerMode,signerEndpoint:$.signerEndpoint,sessionId:$.sessionId,accountEmail:$.accountEmail,accountRole:$.accountRole==="buyer"||$.accountRole==="worker"?$.accountRole:void 0,apiUrl:$.apiUrl,agentKey:$.agentKey,softLimitUsd:$.softLimit!==void 0?Number.parseFloat(String($.softLimit)):void 0,hardLimitUsd:$.hardLimit!==void 0?Number.parseFloat(String($.hardLimit)):void 0});i1(Ls0(J))});iG.command("request-code").requiredOption("--email <email>").option("--role <role>","buyer or worker","buyer").option("--debug","Expose debug auth code when the server supports it").action(async($)=>{let J=k1(),Y=RZ(J);if(!Y)throw Error("Missing apiUrl. Run: buygent config set --api-url <url> or set BUYGENT_API_URL");let X=String($.role)==="worker"?"worker":"buyer",Q=await fetch(`${Y}/auth/email/request-code`,{method:"POST",headers:{"Content-Type":"application/json",...$.debug?{"x-buygent-debug-auth":"true"}:{},...J.agentKey?{Authorization:`Bearer ${J.agentKey}`}:{},...J.sessionId?{Cookie:`buygent_session=${encodeURIComponent(J.sessionId)}`}:{}},body:JSON.stringify({email:String($.email),role:X})});if(!Q.ok)throw Error(await Q.text());i1(await Q.json())});iG.command("verify").requiredOption("--email <email>").requiredOption("--code <code>").option("--role <role>","buyer or worker","buyer").action(async($)=>{let J=k1(),Y=RZ(J);if(!Y)throw Error("Missing apiUrl. Run: buygent config set --api-url <url> or set BUYGENT_API_URL");let X=String($.role)==="worker"?"worker":"buyer",Q=await fetch(`${Y}/auth/email/verify`,{method:"POST",headers:{"Content-Type":"application/json",...J.agentKey?{Authorization:`Bearer ${J.agentKey}`}:{}},body:JSON.stringify({email:String($.email),role:X,code:String($.code)})});if(!Q.ok)throw Error(await Q.text());let G=await Q.json(),K=xT({sessionId:G.sessionId,accountEmail:G.user.email,accountRole:G.user.role});i1({ok:!0,sessionId:G.sessionId,accountEmail:K.accountEmail,accountRole:K.accountRole,expiresAt:G.expiresAt})});iG.command("device-code").action(async()=>{await Cv(k1())});iG.command("whoami").action(async()=>{let $=k1();i1(await j8($,"/auth/session"))});iG.command("logout").action(async()=>{let $=k1();await P8($,"/auth/logout",{});let J={...$};delete J.agentKey,delete J.sessionId,delete J.accountEmail,delete J.accountRole,kT(J),i1({ok:!0})});var DJ0=z6.command("catalog").description("Browse provider listings");DJ0.command("list").option("--type <type>").action(async($)=>{let J=k1(),Y=$.type?`?type=${encodeURIComponent(String($.type))}`:"";i1(await j8(J,`/catalog${Y}`))});DJ0.command("show <resource>").action(async($)=>{let J=k1(),{adapterId:Y,listingId:X}=qJ0($);i1(await j8(J,`/catalog/${Y}/${X}`))});var gT=($,J)=>[...J,$];As0.command("create").requiredOption("--intent <intent>").requiredOption("--market <market>").requiredOption("--specialty <specialty>").requiredOption("--deliverable <deliverable>").requiredOption("--duration <minutes>").option("--language <language>").option("--execution-mode <executionMode>").option("--credential <credential>","repeat for multiple credentials",gT,[]).option("--jurisdiction <jurisdiction>","repeat for multiple jurisdictions",gT,[]).option("--sla-min <minutes>").option("--wallet-address <address>").option("--output <mode>","summary, json, or url","summary").action(async($)=>{let J=k1();OJ0(J);let Y=Number.parseInt(String($.duration),10),X=Mv({intent:String($.intent),market:String($.market),durationMin:Y,specialty:String($.specialty),deliverable:String($.deliverable),...$.language?{language:String($.language)}:{},...$.executionMode?{executionMode:String($.executionMode)}:{},...Array.isArray($.credential)&&$.credential.length>0?{credential:$.credential.map((H)=>String(H))}:{},...Array.isArray($.jurisdiction)&&$.jurisdiction.length>0?{jurisdiction:$.jurisdiction.map((H)=>String(H))}:{},...$.slaMin?{slaMin:Number.parseInt(String($.slaMin),10)}:{}}),Q=await IZ(J,{adapterId:"",listingId:"",durationMin:Y,...$.walletAddress?{walletAddress:String($.walletAddress)}:{},request:X}),G=Q.body??Q,K=G.credential&&typeof G.credential==="object"&&"fields"in G.credential&&G.credential.fields&&typeof G.credential.fields==="object"&&"taskId"in G.credential.fields&&typeof G.credential.fields.taskId==="string"?G.credential.fields.taskId:void 0,W=G.orderId&&typeof G.orderId==="string"&&J.apiUrl?`${J.apiUrl}/human-tasks/${G.orderId}`:void 0;if($.output==="json"){i1({...Q,taskId:K,taskStatusUrl:W});return}if($.output==="url"&&W){console.log(W);return}console.log(Ev({apiUrl:String(J.apiUrl),responseBody:G}))});LJ0.command("show").action(async()=>{let $=k1();OJ0($);let J=await j8($,"/credits");BJ0(J),i1(J)});z6.command("buy [resource]").option("--duration <minutes>").option("--billing <model>").option("--unit <unit>").option("--auto-renew").option("--interval-count <count>").option("--cancel-at-period-end").option("--type <type>").option("--resource-class <resourceClass>").option("--intent <intent>").option("--market <market>").option("--provider <provider>").option("--channel <channel>").option("--credential-kind <kind>").option("--specialty <specialty>").option("--jurisdiction <jurisdiction>").option("--credential <credential>").option("--execution-mode <executionMode>").option("--deliverable <deliverable>").option("--language <language>").option("--sla-min <minutes>").option("--task <task>").option("--environment <environment>").option("--gpu-type <type>").option("--gpu-count <count>").option("--public-endpoint").option("--output <mode>","json or key","json").action(async($,J)=>{let Y=k1(),X=J.task||J.environment||J.gpuType||J.gpuCount||J.publicEndpoint||J.provider||J.channel||J.credentialKind||J.specialty||J.jurisdiction||J.credential||J.executionMode||J.deliverable||J.language||J.slaMin?{...J.task?{task:String(J.task)}:{},...J.environment?{environment:String(J.environment)}:{},...J.gpuType?{gpuType:String(J.gpuType)}:{},...J.gpuCount?{gpuCount:Number.parseInt(String(J.gpuCount),10)}:{},...J.publicEndpoint?{publicEndpoint:!0}:{},...J.provider?{provider:String(J.provider)}:{},...J.channel?{channel:String(J.channel)}:{},...J.credentialKind?{credentialKind:String(J.credentialKind)}:{},...J.specialty?{specialty:String(J.specialty)}:{},...J.jurisdiction?{jurisdiction:String(J.jurisdiction)}:{},...J.credential?{credential:String(J.credential)}:{},...J.executionMode?{executionMode:String(J.executionMode)}:{},...J.deliverable?{deliverable:String(J.deliverable)}:{},...J.language?{language:String(J.language)}:{},...J.slaMin?{slaMin:Number.parseInt(String(J.slaMin),10)}:{}}:void 0,Q=await($?(()=>{let G=tN(J.duration);if(G===void 0)throw Error("--duration is required when buying a concrete resource listing");return IZ(Y,{...qJ0($),durationMin:G,requirements:X,billing:eN(J)?{model:String(J.billing??"lease"),unit:String(J.unit??"minute"),autoRenew:Boolean(J.autoRenew),...J.intervalCount?{intervalCount:Number.parseInt(String(J.intervalCount),10)}:{},...J.cancelAtPeriodEnd?{cancelAtPeriodEnd:!0}:{}}:void 0})})():(()=>{let G=_v(J);return IZ(Y,{adapterId:"",listingId:"",durationMin:G.durationMin,request:G.request})})());if(J.output==="key"){let G="body"in Q&&Q.body&&typeof Q.body==="object"?Q.body:Q,K=G.credential,W=K?.fields?.apiKeySecret??K?.fields?.secret??K?.fields?.token??JSON.stringify(G);console.log(W);return}i1(Q)});var FJ0=z6.command("orders").description("Inspect purchase orders");FJ0.command("list").action(async()=>{let $=k1();i1(await j8($,"/orders"))});FJ0.command("show <orderId>").action(async($)=>{let J=k1();i1(await j8(J,`/orders/${$}/status`))});var NJ0=z6.command("credentials").description("Inspect issued credentials"),AJ0=z6.command("compute").description("Use compute capabilities"),Ms0=z6.command("email").description("Use email capabilities"),Es0=z6.command("sms").description("Use SMS capabilities"),MJ0=z6.command("human").description("Use human execution primitives");NJ0.command("list").action(async()=>{let $=k1();i1(await j8($,"/credentials"))});NJ0.command("show <orderId>").action(async($)=>{let J=k1();i1(await j8(J,`/credentials/${$}`))});Ms0.command("send").option("--order-id <orderId>").requiredOption("--to <email>").requiredOption("--subject <subject>").option("--text <text>").option("--html <html>").action(async($)=>{let J=k1();i1(await P8(J,"/actions/email/send",{to:String($.to),subject:String($.subject),...$.text?{text:String($.text)}:{},...$.html?{html:String($.html)}:{}}))});Es0.command("send").option("--order-id <orderId>").requiredOption("--to <number>").requiredOption("--text <text>").option("--from <number>").action(async($)=>{let J=k1();i1(await P8(J,"/actions/sms/send",{to:String($.to),text:String($.text),...$.from?{from:String($.from)}:{}}))});var mX=MJ0.command("task").description("Use buyer-side human task primitives"),xH=MJ0.command("work").description("Use worker-side human task primitives");mX.command("show").requiredOption("--order-id <orderId>").action(async($)=>{let J=k1();i1(await j8(J,`/human-tasks/${encodeURIComponent(String($.orderId))}`))});mX.command("events").requiredOption("--task-id <taskId>").action(async($)=>{let J=k1();i1(await j8(J,`/human-tasks/${encodeURIComponent(String($.taskId))}/events`))});mX.command("applicants").requiredOption("--task-id <taskId>").action(async($)=>{let J=k1();i1(await j8(J,`/human-tasks/${encodeURIComponent(String($.taskId))}/applicants`))});mX.command("select").requiredOption("--task-id <taskId>").requiredOption("--human-profile-id <humanProfileId>").option("--selected-by <selectedBy>").action(async($)=>{let J=k1();i1(await P8(J,`/human-tasks/${encodeURIComponent(String($.taskId))}/select`,{humanProfileId:String($.humanProfileId),...$.selectedBy?{selectedBy:String($.selectedBy)}:{}}))});mX.command("message").requiredOption("--task-id <taskId>").requiredOption("--message <message>").option("--actor-id <actorId>").action(async($)=>{let J=k1();i1(await P8(J,`/human-tasks/${encodeURIComponent(String($.taskId))}/messages`,{actorType:"buyer",...$.actorId?{actorId:String($.actorId)}:{},message:String($.message)}))});mX.command("approve").requiredOption("--task-id <taskId>").option("--buyer-id <buyerId>").action(async($)=>{let J=k1();i1(await P8(J,`/human-tasks/${encodeURIComponent(String($.taskId))}/approve`,{...$.buyerId?{buyerId:String($.buyerId)}:{}}))});mX.command("reject").requiredOption("--task-id <taskId>").requiredOption("--reason <reason>").option("--buyer-id <buyerId>").option("--final","Mark as final rejection instead of revision requested").action(async($)=>{let J=k1();i1(await P8(J,`/human-tasks/${encodeURIComponent(String($.taskId))}/reject`,{reason:String($.reason),revisionRequested:!Boolean($.final),...$.buyerId?{buyerId:String($.buyerId)}:{}}))});xH.command("available").option("--human-profile-id <humanProfileId>").action(async($)=>{let J=k1(),Y=$.humanProfileId?`?humanProfileId=${encodeURIComponent(String($.humanProfileId))}`:"";i1(await j8(J,`/human-work/available${Y}`))});xH.command("apply").requiredOption("--task-id <taskId>").requiredOption("--human-profile-id <humanProfileId>").option("--note <note>").action(async($)=>{let J=k1();i1(await P8(J,`/human-work/${encodeURIComponent(String($.taskId))}/apply`,{humanProfileId:String($.humanProfileId),...$.note?{note:String($.note)}:{}}))});xH.command("start").requiredOption("--task-id <taskId>").requiredOption("--human-profile-id <humanProfileId>").action(async($)=>{let J=k1();i1(await P8(J,`/human-work/${encodeURIComponent(String($.taskId))}/start`,{humanProfileId:String($.humanProfileId)}))});xH.command("submit").requiredOption("--task-id <taskId>").requiredOption("--human-profile-id <humanProfileId>").requiredOption("--summary <summary>").option("--time-spent-min <minutes>").option("--artifact <artifact>","repeatable artifact values",gT,[]).action(async($)=>{let J=k1();i1(await P8(J,`/human-work/${encodeURIComponent(String($.taskId))}/submit`,{humanProfileId:String($.humanProfileId),summary:String($.summary),...Array.isArray($.artifact)&&$.artifact.length>0?{artifacts:$.artifact.map((Y)=>({label:"artifact",value:String(Y)}))}:{},...$.timeSpentMin?{timeSpentMin:Number.parseInt(String($.timeSpentMin),10)}:{}}))});xH.command("message").requiredOption("--task-id <taskId>").requiredOption("--human-profile-id <humanProfileId>").requiredOption("--message <message>").action(async($)=>{let J=k1();i1(await P8(J,`/human-work/${encodeURIComponent(String($.taskId))}/messages`,{humanProfileId:String($.humanProfileId),message:String($.message)}))});AJ0.command("exec").option("--order-id <orderId>").requiredOption("--command <command>").action(async($)=>{let J=k1();i1(await P8(J,"/actions/compute/exec",{command:String($.command)}))});var _O=AJ0.command("session").description("Manage mediated compute sessions");_O.command("open").option("--order-id <orderId>").action(async($)=>{let J=k1();i1(await P8(J,"/actions/compute/session",{}))});_O.command("send").requiredOption("--token <token>").requiredOption("--data <data>").action(async($)=>{let J=k1();i1(await fetch(`${J.apiUrl}/actions/compute/session/input`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${String($.token)}`},body:JSON.stringify({data:String($.data)})}).then(async(Y)=>{if(!Y.ok)throw Error(await Y.text());return Y.json()}))});_O.command("read").requiredOption("--token <token>").option("--cursor <cursor>").action(async($)=>{let J=k1(),Y=$.cursor!==void 0?`?cursor=${encodeURIComponent(String($.cursor))}`:"";i1(await fetch(`${J.apiUrl}/actions/compute/session/output${Y}`,{method:"GET",headers:{Authorization:`Bearer ${String($.token)}`}}).then(async(X)=>{if(!X.ok)throw Error(await X.text());return X.json()}))});_O.command("close").requiredOption("--token <token>").action(async($)=>{let J=k1();i1(await fetch(`${J.apiUrl}/actions/compute/session/close`,{method:"POST",headers:{Authorization:`Bearer ${String($.token)}`}}).then(async(Y)=>{if(!Y.ok)throw Error(await Y.text());return Y.json()}))});z6.command("spending").action(async()=>{let $=k1(),J=await j8($,"/credits");BJ0(J),i1(J)});z6.parseAsync().catch(($)=>{console.error($ instanceof Error?$.message:String($)),process.exit(1)});
|
|
@@ -2,130 +2,194 @@
|
|
|
2
2
|
<html lang="en">
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="utf-8" />
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
5
|
<title>Buygent</title>
|
|
7
6
|
<style>
|
|
8
|
-
:
|
|
9
|
-
color-scheme: light dark;
|
|
10
|
-
font-family: Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
11
|
-
}
|
|
7
|
+
* { box-sizing: border-box; margin: 0; }
|
|
12
8
|
|
|
13
9
|
body {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
background: #
|
|
17
|
-
color: #
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
main {
|
|
21
|
-
padding: 16px;
|
|
22
|
-
display: grid;
|
|
23
|
-
gap: 12px;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
h1 {
|
|
27
|
-
margin: 0;
|
|
28
|
-
font-size: 18px;
|
|
10
|
+
width: 320px;
|
|
11
|
+
font-family: -apple-system, system-ui, "Segoe UI", sans-serif;
|
|
12
|
+
background: #fff;
|
|
13
|
+
color: #1a1a1a;
|
|
29
14
|
}
|
|
30
15
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
16
|
+
/* Header */
|
|
17
|
+
.header {
|
|
18
|
+
display: flex;
|
|
19
|
+
align-items: center;
|
|
20
|
+
justify-content: space-between;
|
|
21
|
+
padding: 14px 16px;
|
|
22
|
+
border-bottom: 1px solid #f0f0f0;
|
|
36
23
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
24
|
+
.brand {
|
|
25
|
+
display: flex;
|
|
26
|
+
align-items: center;
|
|
41
27
|
gap: 8px;
|
|
42
28
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
border-radius:
|
|
47
|
-
|
|
29
|
+
.logo {
|
|
30
|
+
width: 20px; height: 20px;
|
|
31
|
+
background: #111;
|
|
32
|
+
border-radius: 5px;
|
|
33
|
+
display: flex;
|
|
34
|
+
align-items: center;
|
|
35
|
+
justify-content: center;
|
|
48
36
|
color: #fff;
|
|
49
|
-
|
|
50
|
-
font:
|
|
51
|
-
cursor: pointer;
|
|
37
|
+
font-weight: 700;
|
|
38
|
+
font-size: 11px;
|
|
52
39
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
40
|
+
.brand-name {
|
|
41
|
+
font-size: 14px;
|
|
42
|
+
font-weight: 600;
|
|
43
|
+
letter-spacing: -0.01em;
|
|
44
|
+
}
|
|
45
|
+
.status-pill {
|
|
46
|
+
font-size: 11px;
|
|
47
|
+
font-weight: 500;
|
|
48
|
+
padding: 3px 8px;
|
|
49
|
+
border-radius: 99px;
|
|
50
|
+
background: #f0fdf4;
|
|
51
|
+
color: #16a34a;
|
|
52
|
+
}
|
|
53
|
+
.status-pill.off {
|
|
54
|
+
background: #fef2f2;
|
|
55
|
+
color: #dc2626;
|
|
56
|
+
}
|
|
57
|
+
.status-pill.na {
|
|
58
|
+
background: #f5f5f5;
|
|
59
|
+
color: #737373;
|
|
56
60
|
}
|
|
57
61
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
+
/* Content */
|
|
63
|
+
.content { padding: 14px 16px; }
|
|
64
|
+
|
|
65
|
+
/* Site indicator */
|
|
66
|
+
.site-row {
|
|
67
|
+
display: flex;
|
|
68
|
+
align-items: center;
|
|
69
|
+
justify-content: space-between;
|
|
70
|
+
padding-bottom: 12px;
|
|
71
|
+
}
|
|
72
|
+
.site-name {
|
|
73
|
+
font-size: 13px;
|
|
74
|
+
color: #525252;
|
|
75
|
+
}
|
|
76
|
+
.site-name strong {
|
|
77
|
+
color: #1a1a1a;
|
|
78
|
+
font-weight: 600;
|
|
62
79
|
}
|
|
80
|
+
.login-status {
|
|
81
|
+
font-size: 11px;
|
|
82
|
+
color: #a3a3a3;
|
|
83
|
+
}
|
|
84
|
+
.login-status.yes { color: #16a34a; }
|
|
63
85
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
86
|
+
/* Product card */
|
|
87
|
+
.product-card {
|
|
88
|
+
background: #fafafa;
|
|
89
|
+
border: 1px solid #f0f0f0;
|
|
68
90
|
border-radius: 10px;
|
|
69
|
-
|
|
91
|
+
padding: 12px;
|
|
92
|
+
margin-top: 10px;
|
|
70
93
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
font-size:
|
|
74
|
-
letter-spacing: 0.04em;
|
|
94
|
+
.product-card[hidden] { display: none; }
|
|
95
|
+
.product-label {
|
|
96
|
+
font-size: 10px;
|
|
75
97
|
text-transform: uppercase;
|
|
76
|
-
|
|
98
|
+
letter-spacing: 0.05em;
|
|
99
|
+
color: #a3a3a3;
|
|
100
|
+
margin-bottom: 6px;
|
|
101
|
+
}
|
|
102
|
+
.product-title {
|
|
103
|
+
font-size: 13px;
|
|
104
|
+
font-weight: 500;
|
|
105
|
+
color: #1a1a1a;
|
|
106
|
+
line-height: 1.4;
|
|
107
|
+
display: -webkit-box;
|
|
108
|
+
-webkit-line-clamp: 2;
|
|
109
|
+
-webkit-box-orient: vertical;
|
|
110
|
+
overflow: hidden;
|
|
111
|
+
}
|
|
112
|
+
.product-price {
|
|
113
|
+
font-size: 16px;
|
|
114
|
+
font-weight: 700;
|
|
115
|
+
color: #1a1a1a;
|
|
116
|
+
margin-top: 4px;
|
|
77
117
|
}
|
|
78
118
|
|
|
79
|
-
|
|
80
|
-
|
|
119
|
+
/* Empty state */
|
|
120
|
+
.empty {
|
|
121
|
+
text-align: center;
|
|
122
|
+
padding: 20px 0;
|
|
123
|
+
color: #a3a3a3;
|
|
81
124
|
font-size: 13px;
|
|
82
|
-
|
|
125
|
+
line-height: 1.5;
|
|
83
126
|
}
|
|
84
127
|
|
|
85
|
-
|
|
86
|
-
|
|
128
|
+
/* Footer */
|
|
129
|
+
.footer {
|
|
130
|
+
padding: 10px 16px;
|
|
131
|
+
border-top: 1px solid #f0f0f0;
|
|
132
|
+
display: flex;
|
|
133
|
+
justify-content: space-between;
|
|
134
|
+
align-items: center;
|
|
135
|
+
}
|
|
136
|
+
.debug-btn {
|
|
137
|
+
background: none;
|
|
138
|
+
border: none;
|
|
139
|
+
font-size: 11px;
|
|
140
|
+
color: #d4d4d4;
|
|
141
|
+
cursor: pointer;
|
|
142
|
+
padding: 0;
|
|
143
|
+
}
|
|
144
|
+
.debug-btn:hover { color: #a3a3a3; }
|
|
145
|
+
.version {
|
|
146
|
+
font-size: 10px;
|
|
147
|
+
color: #e5e5e5;
|
|
87
148
|
}
|
|
88
149
|
|
|
89
|
-
|
|
90
|
-
|
|
150
|
+
/* Debug panel */
|
|
151
|
+
#debug { display: none; padding: 12px 16px; border-top: 1px solid #f0f0f0; }
|
|
152
|
+
#debug.show { display: block; }
|
|
153
|
+
#debug pre {
|
|
154
|
+
font: 10px/1.5 "SF Mono", Menlo, monospace;
|
|
155
|
+
color: #737373;
|
|
156
|
+
white-space: pre-wrap;
|
|
157
|
+
word-break: break-all;
|
|
91
158
|
}
|
|
92
159
|
</style>
|
|
93
160
|
</head>
|
|
94
161
|
<body>
|
|
95
|
-
<
|
|
96
|
-
<
|
|
97
|
-
<
|
|
98
|
-
<
|
|
99
|
-
</
|
|
162
|
+
<div class="header">
|
|
163
|
+
<div class="brand">
|
|
164
|
+
<div class="logo">B</div>
|
|
165
|
+
<span class="brand-name">Buygent</span>
|
|
166
|
+
</div>
|
|
167
|
+
<span id="status-pill" class="status-pill na">Checking…</span>
|
|
168
|
+
</div>
|
|
100
169
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
<
|
|
170
|
+
<div class="content">
|
|
171
|
+
<div class="site-row">
|
|
172
|
+
<span id="site-name" class="site-name">Detecting site…</span>
|
|
173
|
+
<span id="login-status" class="login-status"></span>
|
|
104
174
|
</div>
|
|
105
175
|
|
|
106
|
-
<
|
|
107
|
-
<
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
<div class="
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
<div class="row">
|
|
124
|
-
<dt>Last updated</dt>
|
|
125
|
-
<dd id="last-updated">Never</dd>
|
|
126
|
-
</div>
|
|
127
|
-
</dl>
|
|
128
|
-
</main>
|
|
176
|
+
<div id="empty" class="empty">
|
|
177
|
+
Navigate to a Coupang or Amazon<br>product page to get started.
|
|
178
|
+
</div>
|
|
179
|
+
|
|
180
|
+
<div id="product-card" class="product-card" hidden>
|
|
181
|
+
<div class="product-label">Detected product</div>
|
|
182
|
+
<div id="product-title" class="product-title"></div>
|
|
183
|
+
<div id="product-price" class="product-price"></div>
|
|
184
|
+
</div>
|
|
185
|
+
</div>
|
|
186
|
+
|
|
187
|
+
<div class="footer">
|
|
188
|
+
<button id="debug-btn" class="debug-btn">Debug</button>
|
|
189
|
+
<span class="version">v0.4.1</span>
|
|
190
|
+
</div>
|
|
191
|
+
|
|
192
|
+
<div id="debug"><pre id="debug-pre"></pre></div>
|
|
129
193
|
|
|
130
194
|
<script type="module" src="./popup.js"></script>
|
|
131
195
|
</body>
|
package/dist/extension/popup.js
CHANGED
|
@@ -14,106 +14,89 @@ var createEnvelope = (type, payload, options) => ({
|
|
|
14
14
|
var TERMINAL_ORDER_STATES = new Set(["aborted", "completed_dry_run"]);
|
|
15
15
|
|
|
16
16
|
// extension/popup.ts
|
|
17
|
-
var
|
|
18
|
-
var
|
|
19
|
-
var
|
|
20
|
-
var
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
statusBanner.textContent = message;
|
|
31
|
-
statusBanner.dataset.state = state;
|
|
32
|
-
};
|
|
33
|
-
var requestBackground = async (type) => await chrome.runtime.sendMessage(createEnvelope(type, {}, {
|
|
34
|
-
source: "popup",
|
|
35
|
-
messageId: createRequestId()
|
|
36
|
-
}));
|
|
37
|
-
var formatProbe = (probe) => {
|
|
38
|
-
if (!probe) {
|
|
39
|
-
return "No probe yet";
|
|
40
|
-
}
|
|
41
|
-
const summary = [`${probe.pageKind}`, probe.loggedIn ? "logged in" : probe.sessionState];
|
|
42
|
-
if (probe.product?.title) {
|
|
43
|
-
summary.push(probe.product.title);
|
|
44
|
-
}
|
|
45
|
-
if (probe.checkout?.totalPriceText) {
|
|
46
|
-
summary.push(`checkout ${probe.checkout.totalPriceText}`);
|
|
47
|
-
} else if (probe.product?.priceText) {
|
|
48
|
-
summary.push(probe.product.priceText);
|
|
49
|
-
}
|
|
50
|
-
return summary.join(" · ");
|
|
51
|
-
};
|
|
52
|
-
var formatNativeHost = (response) => {
|
|
53
|
-
if (!response) {
|
|
54
|
-
return "Not checked";
|
|
55
|
-
}
|
|
56
|
-
if (response.type === "native:pong") {
|
|
57
|
-
return `Connected · ${response.payload.hostVersion} · ${response.payload.receivedAt}`;
|
|
58
|
-
}
|
|
59
|
-
return `Error · ${response.payload.code} · ${response.payload.message}`;
|
|
17
|
+
var $ = (id) => document.getElementById(id);
|
|
18
|
+
var rid = () => globalThis.crypto?.randomUUID?.() ?? `req_${Date.now()}_${Math.random().toString(16).slice(2)}`;
|
|
19
|
+
var send = async (type) => await chrome.runtime.sendMessage(createEnvelope(type, {}, { source: "popup", messageId: rid() }));
|
|
20
|
+
var detectPlatform = (url) => {
|
|
21
|
+
if (!url)
|
|
22
|
+
return null;
|
|
23
|
+
if (url.includes("coupang.com"))
|
|
24
|
+
return "Coupang";
|
|
25
|
+
if (url.includes("amazon.com") || url.includes("amazon.co.jp"))
|
|
26
|
+
return "Amazon";
|
|
27
|
+
return null;
|
|
60
28
|
};
|
|
61
|
-
var
|
|
62
|
-
|
|
63
|
-
|
|
29
|
+
var render = (s) => {
|
|
30
|
+
const pill = $("status-pill");
|
|
31
|
+
const hostOk = s.lastNativeHostResponse?.type === "native:pong";
|
|
32
|
+
if (pill) {
|
|
33
|
+
pill.textContent = hostOk ? "Connected" : s.lastNativeHostResponse ? "Disconnected" : "No host";
|
|
34
|
+
pill.className = `status-pill ${hostOk ? "" : s.lastNativeHostResponse ? "off" : "na"}`;
|
|
64
35
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
36
|
+
const platform = detectPlatform(s.activeTabUrl);
|
|
37
|
+
const siteName = $("site-name");
|
|
38
|
+
if (siteName) {
|
|
39
|
+
siteName.innerHTML = platform ? `Browsing <strong>${platform}</strong>` : "Not on a supported site";
|
|
69
40
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
41
|
+
const probe = s.lastProbe;
|
|
42
|
+
const loginEl = $("login-status");
|
|
43
|
+
if (loginEl) {
|
|
44
|
+
if (probe?.loggedIn === true) {
|
|
45
|
+
loginEl.textContent = "Logged in";
|
|
46
|
+
loginEl.className = "login-status yes";
|
|
47
|
+
} else if (probe?.loggedIn === false) {
|
|
48
|
+
loginEl.textContent = "Not logged in";
|
|
49
|
+
loginEl.className = "login-status";
|
|
50
|
+
} else {
|
|
51
|
+
loginEl.textContent = "";
|
|
52
|
+
}
|
|
75
53
|
}
|
|
76
|
-
|
|
77
|
-
|
|
54
|
+
const emptyEl = $("empty");
|
|
55
|
+
const cardEl = $("product-card");
|
|
56
|
+
const titleEl = $("product-title");
|
|
57
|
+
const priceEl = $("product-price");
|
|
58
|
+
if (probe?.product?.title && cardEl && titleEl) {
|
|
59
|
+
cardEl.hidden = false;
|
|
60
|
+
if (emptyEl)
|
|
61
|
+
emptyEl.style.display = "none";
|
|
62
|
+
titleEl.textContent = probe.product.title;
|
|
63
|
+
if (priceEl)
|
|
64
|
+
priceEl.textContent = probe.product.priceText ?? "";
|
|
65
|
+
} else {
|
|
66
|
+
if (cardEl)
|
|
67
|
+
cardEl.hidden = true;
|
|
68
|
+
if (emptyEl)
|
|
69
|
+
emptyEl.style.display = platform ? "none" : "";
|
|
78
70
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
71
|
+
const pre = $("debug-pre");
|
|
72
|
+
if (pre) {
|
|
73
|
+
pre.textContent = JSON.stringify({
|
|
74
|
+
url: s.activeTabUrl,
|
|
75
|
+
session: probe?.sessionState,
|
|
76
|
+
selectors: probe?.selectorsVersion,
|
|
77
|
+
order: s.lastOrderStatus?.state ?? s.lastOrderCheckpoint?.state,
|
|
78
|
+
host: hostOk ? s.lastNativeHostResponse.payload?.hostVersion : s.lastNativeHostResponse ? s.lastNativeHostResponse.payload?.message : null,
|
|
79
|
+
updated: s.lastUpdatedAt,
|
|
80
|
+
error: s.lastError
|
|
81
|
+
}, null, 2);
|
|
85
82
|
}
|
|
86
|
-
renderState(response.payload.state);
|
|
87
|
-
setBanner(response.payload.state.lastError ?? "Ready.", response.payload.state.lastError ? "error" : "ok");
|
|
88
83
|
};
|
|
89
|
-
var
|
|
90
|
-
if (button) {
|
|
91
|
-
button.disabled = true;
|
|
92
|
-
}
|
|
93
|
-
setBanner("Working…");
|
|
84
|
+
var init = async () => {
|
|
94
85
|
try {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
} finally {
|
|
108
|
-
if (button) {
|
|
109
|
-
button.disabled = false;
|
|
86
|
+
await Promise.allSettled([
|
|
87
|
+
send("popup:probe-active-tab"),
|
|
88
|
+
send("popup:ping-native-host")
|
|
89
|
+
]);
|
|
90
|
+
const res = await send("popup:get-state");
|
|
91
|
+
if (res.type !== "error")
|
|
92
|
+
render(res.payload.state);
|
|
93
|
+
} catch {
|
|
94
|
+
const pill = $("status-pill");
|
|
95
|
+
if (pill) {
|
|
96
|
+
pill.textContent = "Error";
|
|
97
|
+
pill.className = "status-pill off";
|
|
110
98
|
}
|
|
111
99
|
}
|
|
112
100
|
};
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
});
|
|
116
|
-
pingButton?.addEventListener("click", () => {
|
|
117
|
-
runAction(pingButton, "popup:ping-native-host", "Native host responded.");
|
|
118
|
-
});
|
|
119
|
-
syncState();
|
|
101
|
+
$("debug-btn")?.addEventListener("click", () => $("debug")?.classList.toggle("show"));
|
|
102
|
+
init();
|
package/dist/native-host.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// @bun
|
|
3
|
-
import{createServer as q}from"net";import{existsSync as f,mkdirSync as w,readFileSync as b,rmSync as m}from"fs";import{homedir as R}from"os";import{dirname as g,join as h}from"path";import{fileURLToPath as V}from"url";var x="0.0.0-dev",E="0.4.
|
|
3
|
+
import{createServer as q}from"net";import{existsSync as f,mkdirSync as w,readFileSync as b,rmSync as m}from"fs";import{homedir as R}from"os";import{dirname as g,join as h}from"path";import{fileURLToPath as V}from"url";var x="0.0.0-dev",E="0.4.2",A=()=>{let e=g(V(import.meta.url));while(!0){let t=h(e,"package.json");if(f(t)){let o=JSON.parse(b(t,"utf8"));if(typeof o.version==="string"&&o.version.trim().length>0)return o.version}let r=g(e);if(r===e)break;e=r}return E==="0.4.2"?x:E},B=A(),T=1,c=h(R(),".buygent","chrome-extension","com.buygent.host.sock"),n=Buffer.alloc(0),s=new Map,p=new Map,l=new WeakMap,i=()=>globalThis.crypto?.randomUUID?.()??`req_${Date.now()}_${Math.random().toString(16).slice(2)}`,_=(e,t,r)=>({protocolVersion:T,type:e,messageId:r.messageId,...r.requestId?{requestId:r.requestId}:{},sentAt:r.sentAt??new Date().toISOString(),source:r.source,payload:t}),d=(e,t)=>_("error",e,t),O=(e)=>{if(!e||typeof e!=="object"||Array.isArray(e))return{ok:!1,error:d({code:"invalid_envelope",message:"Expected a JSON object envelope."},{source:"native-host",messageId:i()})};let t=e;if(t.protocolVersion!==T)return{ok:!1,error:d({code:"unsupported_protocol_version",message:`Unsupported protocolVersion: ${String(t.protocolVersion??"missing")}`},{source:"native-host",messageId:i()})};if(typeof t.type!=="string"||typeof t.messageId!=="string"||typeof t.sentAt!=="string"||typeof t.source!=="string")return{ok:!1,error:d({code:"invalid_envelope",message:"Envelope must include type, messageId, sentAt, and source fields."},{source:"native-host",messageId:i()})};return{ok:!0,envelope:e}},D=(e)=>JSON.stringify(e),u=(e)=>{let t=Buffer.from(JSON.stringify(e),"utf8"),r=Buffer.alloc(4);r.writeUInt32LE(t.length,0),process.stdout.write(r),process.stdout.write(t)},a=(e,t)=>{e.write(`${D(t)}
|
|
4
4
|
`)},P=(e,t)=>{let r=p.get(e)??new Set;r.add(t),p.set(e,r)},S=(e)=>{for(let[t,r]of p.entries())if(r.delete(e),r.size===0)p.delete(t);for(let[t,r]of s.entries())if(r===e)s.delete(t)},k=(e,t)=>{let r=p.get(e);if(!r)return;for(let o of r)a(o,t)},U=(e)=>{if(e.type==="native:ping"){u(_("native:pong",{hostVersion:B,receivedAt:new Date().toISOString()},{source:"native-host",messageId:i(),requestId:e.messageId}));return}if(e.type==="order:ack"){if(e.requestId){let t=s.get(e.requestId);if(t)P(e.payload.orderId,t),a(t,e)}return}if(e.type==="runtime:state"){if(e.requestId){let t=s.get(e.requestId);if(t)s.delete(e.requestId),a(t,e)}return}if(e.type==="order:status"||e.type==="order:checkpoint"){k(e.payload.orderId,e);return}if(e.type==="error"){let t=typeof e.payload.details==="object"&&e.payload.details&&!Array.isArray(e.payload.details)?e.payload.details.orderId:void 0;if(typeof t==="string"){k(t,e);return}if(e.requestId){let r=s.get(e.requestId);if(r)s.delete(e.requestId),a(r,e)}}},L=(e)=>{let t=O(e);if(!t.ok){u(t.error);return}U(t.envelope)},H=(e,t)=>{let r=O(JSON.parse(t));if(!r.ok){a(e,r.error);return}let o=r.envelope;if(o.type==="order:start"||o.type==="runtime:get-state"){s.set(o.messageId,e),u(o);return}a(e,d({code:"unsupported_message",message:`Unsupported CLI/native-host message: ${o.type}`},{source:"native-host",messageId:i(),requestId:o.messageId}))},J=()=>{if(w(g(c),{recursive:!0,mode:448}),f(c))m(c,{force:!0})};J();var M=q((e)=>{e.setEncoding("utf8"),l.set(e,""),e.on("data",(t)=>{let o=`${l.get(e)??""}${t}`.split(/\r?\n/u);l.set(e,o.pop()??"");for(let N of o){let y=N.trim();if(!y)continue;try{H(e,y)}catch(I){a(e,d({code:"invalid_message",message:I instanceof Error?I.message:"Invalid CLI/native-host payload."},{source:"native-host",messageId:i()}))}}}),e.on("close",()=>{S(e)}),e.on("error",()=>{S(e)})});M.listen(c);process.stdin.on("data",(e)=>{n=Buffer.concat([n,e]);while(n.length>=4){let t=n.readUInt32LE(0);if(n.length<4+t)return;let r=n.subarray(4,4+t);n=n.subarray(4+t);try{L(JSON.parse(r.toString("utf8")))}catch(o){u(d({code:"invalid_message",message:o instanceof Error?o.message:"Invalid JSON payload."},{source:"native-host",messageId:i()}))}}});var v=()=>{if(M.close(),f(c))m(c,{force:!0})};process.stdin.on("end",()=>{v(),process.exit(0)});process.on("SIGTERM",()=>{v(),process.exit(0)});process.on("SIGINT",()=>{v(),process.exit(0)});process.stdin.resume();
|