@tangle-network/sandbox-cli 0.22.131 → 0.22.133
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/{account-K6n39T9G.mjs → account-BaGFNxyq.mjs} +1 -1
- package/dist/{clone-CqxGeiso.mjs → clone-CWY8dI5d.mjs} +1 -1
- package/dist/{credential-store-BglYxKnr.mjs → credential-store-Bpw_4ZTQ.mjs} +1 -1
- package/dist/{device-CYbYA3Ts.mjs → device-i0PzYisd.mjs} +1 -1
- package/dist/{dist-szenDGSN.mjs → dist-CzrZj_46.mjs} +1 -1
- package/dist/{graph-campaign-state-BLsk-81-.mjs → graph-campaign-state-YA-eORZN.mjs} +1 -1
- package/dist/{graph-dataset-V3HZEEry.mjs → graph-dataset-DL_Fx_EH.mjs} +1 -1
- package/dist/{graph-learning-CZixMhev.mjs → graph-learning-CWalyOHM.mjs} +1 -1
- package/dist/{graph-native-Bv5gSn4b.mjs → graph-native-BOIC8WzU.mjs} +1 -1
- package/dist/{graph-operating-evidence-CUiPxcmh.mjs → graph-operating-evidence-CGGxszAi.mjs} +2 -2
- package/dist/index.mjs +31 -31
- package/dist/{run-CEhYsWAB.mjs → run-BSXC2ytE.mjs} +1 -1
- package/dist/{solve-signer-CcAle-Dv.mjs → solve-signer--UaZcdFY.mjs} +1 -1
- package/dist/{submit--rl0SmXb.mjs → submit-D2jvFJtX.mjs} +1 -1
- package/dist/{workspace-C-JZvGpv.mjs → workspace-BOqrV945.mjs} +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as e,f as t,o as n,r,u as i}from"./output-BqCeTtw4.mjs";import{y as a}from"./index.mjs";import{t as o}from"./solve-signer
|
|
1
|
+
import{a as e,f as t,o as n,r,u as i}from"./output-BqCeTtw4.mjs";import{y as a}from"./index.mjs";import{t as o}from"./solve-signer--UaZcdFY.mjs";import{c as s,f as c,n as l,o as u,s as d,t as f}from"./workspace-BOqrV945.mjs";import{n as p,t as m}from"./solve-checker-gdxdE3g4.mjs";import*as h from"node:path";import{randomBytes as g,randomUUID as _}from"node:crypto";import{toHex as v}from"viem";async function y(y,b){try{let{root:a,manifest:x}=await d(y,b.directory),S=await u(a),C=x.provenance?await s(a,x,S,{allowMissing:!0}):void 0,w=o(),T=i(`Running ${x.title} checker…`);b.json||T.start();let E;try{E=await m(a,x.checker)}finally{T.stop()}let D=l(E,C,x.provenance,void 0,{allowMissingSource:!0,requirePullRequest:!1}),O=v(g(32)),k=p(E.candidateRef,O),A={version:1,competition:x.slug,candidateRef:E.candidateRef,evidence:D.evidence,evidenceJson:E.evidenceJson,evidenceRefs:D.evidenceRefs,salt:O,candidateId:k,...C?{source:C}:{},deviceAddress:w.account.address,clientSubmissionId:_(),createdAt:new Date().toISOString()};await c(h.join(a,`.tangle-solve-run.json`),A),b.json?e({localRun:A}):(t(`Checker output recorded locally for operator evaluation`),n({Competition:x.slug,Candidate:E.candidateRef,"Device address":w.account.address,"Evidence refs":D.evidenceRefs.length}),r("Commit any changes, then run `tangle solve submit` from this directory."),x.provenance&&!C&&r(`Add your GitHub fork as 'origin' before submitting. The task repository is available as '${f}'.`))}catch(e){a(e)}}export{y as runCompetition};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e,n as t,r as n}from"./credential-store-
|
|
1
|
+
import{i as e,n as t,r as n}from"./credential-store-Bpw_4ZTQ.mjs";import{generatePrivateKey as r,privateKeyToAccount as i}from"viem/accounts";const a=`solve:device:secp256k1`,o=/^0x[0-9a-f]{64}$/i;function s(e){return e&&o.test(e)?e:void 0}function c(){let e=n(a),t=s(e.value);if(!(!t||e.source===`none`))return{account:i(t),source:e.source}}function l(){let t=c();if(t)return t;let n=r(),o=e(a,n);return{account:i(n),source:o}}function u(r){let o=s(n(a).value);if(!o||i(o).address!==r.account.address)throw Error(`The local Solve device key changed; it was not retired`);let c=`${a}:retired:${r.account.address.toLowerCase()}`;if(e(c,o),n(c).value!==o)throw Error(`The revoked device key could not be retired safely`);return t(a),c}export{c as n,u as r,l as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as e,f as t,o as n,u as r}from"./output-BqCeTtw4.mjs";import{y as i}from"./index.mjs";import{n as a}from"./solve-signer
|
|
1
|
+
import{a as e,f as t,o as n,u as r}from"./output-BqCeTtw4.mjs";import{y as i}from"./index.mjs";import{n as a}from"./solve-signer--UaZcdFY.mjs";import{a as o,c as s,d as c,f as l,h as u,l as d,m as f,n as p,o as m,s as h,u as g}from"./workspace-BOqrV945.mjs";import{a as _,i as v,t as y}from"./api-COxVvwlJ.mjs";import{n as b,r as x,t as S}from"./solve-checker-gdxdE3g4.mjs";import*as C from"node:path";const w=/^0x[0-9a-f]{64}$/i;async function T(e){let t=await y({deviceAddress:e.deviceAddress,apiUrl:e.apiUrl,profile:e.profile}),n=await e.signer.signMessage({message:t.message});return{walletChallengeId:t.challengeId,walletSignature:n}}async function E(y,E){try{let{root:i,manifest:D}=await h(y,E.directory);v({profile:E.profile});let O=await m(i),k=await o(i);if(k.competition!==D.slug)throw Error(`.tangle-solve-run.json does not match this competition`);if(!w.test(k.salt)||!w.test(k.candidateId))throw Error("This run predates durable candidate identity. Run `tangle solve run` again");let A=D.provenance?await s(i,D,O):void 0;if(D.provenance&&k.source&&!d(k.source,A))throw Error("The saved run points to a different repository or revision. Keep your fork as 'origin' and run `tangle solve run` again before submitting");let j=a();if(!j)throw Error("No Solve device signer found. Run `tangle solve run` first");if(j.account.address.toLowerCase()!==k.deviceAddress.toLowerCase())throw Error("The local Solve device account changed after `tangle solve run`; run the checker again");let M=r(`Checking the committed candidate…`);E.json||M.start();let N;try{N=await S(i,D.checker)}finally{M.stop()}if(N.candidateRef!==k.candidateRef||N.evidenceJson!==k.evidenceJson)throw Error("The committed checker output changed after `tangle solve run`; run the checker again");if(b(N.candidateRef,k.salt).toLowerCase()!==k.candidateId.toLowerCase())throw Error(`The saved candidate identity does not match the checker output; run the checker again`);let P=u(E.prUrl);if(!D.provenance&&P)throw Error(`This competition does not accept GitHub pull request provenance`);if(P){if(!A)throw Error(`A provenance policy is required for a pull request`);await c({pullRequest:P,taskRepository:A.taskRepository,submissionRepository:A.submissionRepository,submissionRevision:O})}let F=p(N,A,D.provenance,P,{requirePullRequest:!0}),I={...k,...A?{source:A}:{},chainState:{status:`submitting`,transactions:{...k.chainState?.transactions??{}}}},L=C.join(i,`.tangle-solve-run.json`);await l(L,I);let R=r(`Submitting candidate to Tempo…`);E.json||R.start();let z;try{z=await x(f(D),j.account,{artifactRef:N.candidateRef,salt:k.salt,evidenceJson:N.evidenceJson,evidenceRefs:F.evidenceRefs},{resumeTransactions:I.chainState?.transactions,onTransaction:async(e,t)=>{I={...I,chainState:{status:`submitting`,transactions:{...I.chainState?.transactions??{},[e]:t}}},await l(L,I)}})}finally{R.stop()}I={...I,chainReceipt:z,chainState:{status:`accepted`,transactions:{...I.chainState?.transactions??{},...g(z)}}},await l(L,I);let B=await T({deviceAddress:z.address,signer:j.account,apiUrl:E.apiUrl,profile:E.profile}),V=await _({path:`/v1/submissions`,method:`POST`,apiUrl:E.apiUrl,profile:E.profile,body:{competition:D.slug,candidateRef:N.candidateRef,candidateId:z.candidateId,evidenceJson:N.evidenceJson,evidenceRefs:F.evidenceRefs,deviceAddress:z.address,reportTxHash:z.report,evaluationTxHash:z.evaluation,transactions:g(z),...D.provenance&&A?{source:{...A,...P?{pullRequest:P}:{}}}:{},clientSubmissionId:k.clientSubmissionId,...B,...E.model?{model:E.model}:{},...E.note?{note:E.note}:{}}});E.json?e({...V,transactions:g(z),candidateId:z.candidateId}):(t(`Submission accepted on Tempo`),n({Competition:D.slug,Candidate:z.candidateId,"Device address":z.address,"Report transaction":z.report,"Evaluation transaction":z.evaluation,"Submission ID":typeof V.id==`string`?V.id:V.submission?.id}))}catch(e){i(e)}}export{E as submitCompetition};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./deployment-t_Jhgj4Q.mjs";import{createHash as t}from"node:crypto";import*as n from"node:path";import{execFile as r}from"node:child_process";import*as i from"node:fs/promises";import{promisify as a}from"node:util";import{getAddress as o,isAddress as s}from"viem";const c=/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/i;function l(e){return[...e].some(e=>{let t=e.charCodeAt(0);return t<32||t===127})}function u(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`${t} must be an object`);return e}function d(e,t,n=2048){if(typeof e!=`string`||!e.trim()||e.length>n)throw Error(`${t} is missing or invalid`);if(l(e))throw Error(`${t} contains control characters`);return e.trim()}function f(e,t){let n=d(e,t,64).toLowerCase();if(!c.test(n))throw Error(`${t} must be a 40 or 64 character Git revision`);return n}function p(e,t,n=!1){let r=typeof e==`number`&&Number.isSafeInteger(e)?String(e):d(e,t,80);if(!/^\d+$/.test(r)||!n&&r===`0`)throw Error(`${t} must be an unsigned integer`);return BigInt(r).toString()}function m(e,t){let n=d(e,t,2048),r=new URL(n);if(r.protocol!==`https:`&&!(r.protocol===`http:`&&(r.hostname===`localhost`||r.hostname===`127.0.0.1`)))throw Error(`${t} must use HTTPS outside local development`);return n.replace(/\/$/,``)}function h(e,t){let n=m(e,t).replace(/\.git$/,``),r=new URL(n),i=r.pathname.split(`/`).filter(Boolean);if(r.hostname!==`github.com`||r.username||r.password||r.search||r.hash||i.length!==2)throw Error(`${t} must be an HTTPS GitHub repository URL`);return`https://github.com/${i.join(`/`)}`}function g(e,t){let n=d(e,t,42);if(!s(n,{strict:!1}))throw Error(`${t} must be an EVM address`);return o(n)}function _(e,t){let n=p(e,t),r=Number(n);if(!Number.isSafeInteger(r)||r<=0)throw Error(`${t} is out of range`);return r}function v(...e){for(let t of e)if(typeof t==`string`&&t.trim())return t.trim()}function y(e){let t=e.trim().replace(/\.git$/,``);return t.startsWith(`git@github.com:`)?`https://github.com/${t.slice(15)}`:t.startsWith(`ssh://git@github.com/`)?`https://github.com/${t.slice(21)}`:t}function b(e){if(e===void 0)return;let t=d(e,`pull request URL`,2048);if(!/^https:\/\/github\.com\/[^/]+\/[^/]+\/pull\/\d+(?:\/[^\s]*)?$/i.test(t))throw Error(`pull request URL must point to a GitHub pull request`);return t}function x(e,t){if(!/^https:\/\/[^\s]+$/i.test(e)&&!/^\/(?!\/).*$/.test(e)&&!/^[a-z][a-z0-9+.-]*:[^\s]+$/i.test(e))throw Error(`${t} must be an HTTPS URL or an absolute repository path`);if(e.split(/[?#]/,1)[0].split(`/`).includes(`..`))throw Error(`${t} cannot contain parent-directory segments`);return e}function S(e,t){let n=u(t.check??e.check,`competition.participation.check`),r=d(n.command,`competition.participation.check.command`,512);if(!Array.isArray(n.args)||n.args.some(e=>typeof e!=`string`))throw Error(`competition.participation.check.args must be an array of strings`);let i=n.args.map(e=>d(e,`competition checker argument`,2048)),a=v(n.result_file,n.resultFile),o=n.timeout_ms??n.timeoutMs,s=o===void 0?void 0:_(o,`competition checker timeout`);return{command:r,args:i,...a?{result_file:a}:{},...s?{timeout_ms:s}:{}}}function C(e){if(e.provenance===void 0)return;let t=u(e.provenance,`competition.participation.provenance`);if(t.mode!==`github_pull_request`)throw Error(`competition.participation.provenance.mode is unsupported`);if(t.required!==void 0&&typeof t.required!=`boolean`)throw Error(`competition.participation.provenance.required must be a boolean`);return{mode:`github_pull_request`,required:t.required===!0}}function w(t){let n=u(t.chain??t.network??{},`competition.chain`),r=t.rewards&&typeof t.rewards==`object`&&!Array.isArray(t.rewards)?u(t.rewards,`competition.rewards`):{},i=r.minStake&&typeof r.minStake==`object`&&!Array.isArray(r.minStake)?u(r.minStake,`competition.rewards.minStake`).raw:void 0,a=v(n.minStakeWei,n.min_stake_wei,t.minStakeWei,t.min_stake_wei,i),o=n.chainId??n.chain_id??t.chainId??t.chain_id,s=v(n.chainName,n.chain_name,t.chainName,t.chain_name)??`Tempo`,c=v(n.nativeSymbol,n.native_symbol,t.nativeSymbol,t.native_symbol)??`TNT`,l=v(n.rpcUrl,n.rpc_url,t.rpcUrl,t.rpc_url,process.env.TANGLE_SOLVE_RPC_URL),d=v(n.sponsorUrl,n.sponsor_url,t.sponsorUrl,t.sponsor_url,process.env.TANGLE_SOLVE_SPONSOR_URL),f=v(n.tangleAddress,n.tangle_address,n.coreAddress,n.core_address,t.tangleAddress,t.tangle_address,t.coreAddress,t.core_address),h=v(n.managerAddress,n.manager_address,t.managerAddress,t.manager_address),y=v(n.paymentAsset,n.payment_asset,n.servicePaymentAsset,n.service_payment_asset,t.paymentAsset,t.payment_asset,t.servicePaymentAsset,t.service_payment_asset),b=v(n.blueprintId,n.blueprint_id,t.blueprintId,t.blueprint_id),x=v(n.serviceId,n.service_id,t.serviceId,t.service_id),S=v(n.competitionId,n.competition_id,t.competitionId,t.competition_id,t.id);if(!l||!d||!f||!h||!b||!x||!S||!a||o===void 0)throw Error(`Solve competition metadata must include complete Tempo chain configuration`);return{chainId:_(o,`chain.chainId`),chainName:s,nativeSymbol:c,rpcUrl:m(l,`chain.rpcUrl`),sponsorUrl:m(d,`chain.sponsorUrl`),tangleAddress:g(f,`chain.tangleAddress`),managerAddress:g(h,`chain.managerAddress`),paymentAsset:g(y??e.paymentAsset,`chain.paymentAsset`),blueprintId:p(b,`chain.blueprintId`),serviceId:p(x,`chain.serviceId`),competitionId:p(S,`chain.competitionId`,!0),minStakeWei:p(a,`chain.minStakeWei`,!0)}}function T(e){let t=u(e,`competition`),n=u(t.participation??t.task,`competition.task`),r={...t,participation:{...n,...n.repositoryRevision===void 0&&n.revision!==void 0?{repositoryRevision:n.revision}:{}}},i=r.participation,a=h(v(r.repository,r.repo_url,i.repository)??``,`competition.repository`),o=f(v(r.repositoryRevision,r.repository_revision,i.revision,i.repositoryRevision,i.repository_revision),`competition.repositoryRevision`),s=d(r.slug??r.id,`competition.slug`,128),c=d(r.name??r.title??s,`competition.name`,256),l=S(r,i),p=C(i);return{version:1,slug:s,title:c,repository:a,taskRevision:o,checker:l,chain:w(r),...p?{provenance:p}:{}}}function E(e){return{chainId:e.chain.chainId,chainName:e.chain.chainName,nativeSymbol:e.chain.nativeSymbol,rpcUrl:e.chain.rpcUrl,sponsorUrl:e.chain.sponsorUrl,tangleAddress:e.chain.tangleAddress,managerAddress:e.chain.managerAddress,paymentAsset:e.chain.paymentAsset,blueprintId:BigInt(e.chain.blueprintId),serviceId:BigInt(e.chain.serviceId),competitionId:BigInt(e.chain.competitionId),minStakeWei:BigInt(e.chain.minStakeWei)}}async function D(e){let t=u(JSON.parse(await i.readFile(n.join(e,`.tangle-solve.json`),`utf8`)),`.tangle-solve.json`);if(t.version!==1)throw Error(`.tangle-solve.json has an unsupported version`);let r=u(t.checker,`.tangle-solve.json.checker`),a=u(t.chain,`.tangle-solve.json.chain`);return T({slug:t.slug,name:t.title,repository:t.repository,repositoryRevision:t.taskRevision,participation:{check:r,provenance:t.provenance},chain:a,competitionId:a.competitionId})}const O=a(r),k=`.tangle-solve-run.json`,A=`.tangle-solve.json`,j=`tangle.solve.manifestSha256`,M=new Set([A,k]),N=`upstream`;async function P(e,t){let n=await O(`git`,[`-C`,e,...t],{encoding:`utf8`,maxBuffer:1e6});return String(n.stdout).trim()}async function F(e,t){let r=n.resolve(t??process.cwd()),i=await D(r);if(e&&e!==i.slug&&e!==i.chain.competitionId)throw Error(`This directory contains '${i.slug}', not '${e}'`);return{root:r,manifest:i}}async function I(e){let r=n.join(e,A),a;try{a=await i.lstat(r)}catch{throw Error(`${A} is missing`)}if(a.isSymbolicLink()||!a.isFile())throw Error(`${A} must be a regular file`);return t(`sha256`).update(await i.readFile(r)).digest(`hex`)}async function L(e){let t=await I(e);return await P(e,[`config`,`--local`,`--replace-all`,j,t]),t}async function R(e){let t;try{t=await P(e,[`config`,`--local`,`--get`,j])}catch{throw Error(`The local Git metadata has no ${j} pin; run tangle solve clone again`)}if(!/^[0-9a-f]{64}$/i.test(t))throw Error(`The local ${j} pin is invalid`);if(await I(e)!==t.toLowerCase())throw Error(`${A} changed after clone; run tangle solve clone again`)}async function z(e,t){try{return await P(e,[`ls-files`,`--error-unmatch`,`--`,t]),!0}catch{return!1}}async function B(e){await R(e);for(let t of M)if(await z(e,t))throw Error(`${t} must remain untracked and local to this Solve workspace`);let t=await O(`git`,[`-C`,e,`status`,`--porcelain=v1`,`--untracked-files=all`,`--ignored=matching`],{encoding:`utf8`,maxBuffer:1e6});if(String(t.stdout).split(/\r?\n/).filter(Boolean).filter(e=>{let t=e.slice(0,2),n=e.slice(3);return!((t===`??`||t===`!!`)&&M.has(n))}).length>0)throw Error(`Commit the candidate before running Solve. Only the local manifest and run record may remain uncommitted.`);return f(await P(e,[`rev-parse`,`HEAD`]),`submission revision`)}async function V(e,t,n,r={}){let i=await H(e,t,r);if(i)return{taskRepository:t.repository,taskRevision:t.taskRevision,submissionRepository:i,submissionRevision:n}}async function H(e,t,n={}){let r;try{r=y(await P(e,[`config`,`--get`,`remote.origin.pushurl`]))}catch{try{r=y(await P(e,[`config`,`--get`,`remote.origin.url`]))}catch{if(n.allowMissing)return;throw Error(`Add your GitHub fork as the 'origin' remote before submitting. The task repository is available as '${N}'.`)}}let i=h(r,`git remote.origin.url`);if(i.toLowerCase()===t.repository.toLowerCase()){if(n.allowMissing)return;throw Error(`The 'origin' remote is the task repository. Add your GitHub fork as 'origin'; keep the task repository as '${N}' before submitting.`)}return i}function U(e,t){return!e||!t?!1:e.taskRepository.toLowerCase()===t.taskRepository.toLowerCase()&&e.taskRevision.toLowerCase()===t.taskRevision.toLowerCase()&&e.submissionRepository.toLowerCase()===t.submissionRepository.toLowerCase()&&e.submissionRevision.toLowerCase()===t.submissionRevision.toLowerCase()}function W(e,t){return`${e}/commit/${t}`}function G(e,t,n,r,i={}){let a=e.evidenceRefs.map(e=>x(e.trim(),`checker evidence reference`));if(n){if(!t){if(i.allowMissingSource)return{evidence:e.evidence,evidenceRefs:a};throw Error(`Provenance policy requires a submission source`)}let o=b(r);if(n.required&&(i.requirePullRequest??!0)&&!o)throw Error(`This competition requires a GitHub pull request`);a.push(W(t.taskRepository,t.taskRevision),W(t.submissionRepository,t.submissionRevision),...o?[o]:[])}return{evidence:e.evidence,evidenceRefs:[...new Set(a)]}}async function K(e,t){let n=`${e}.${process.pid}.tmp`;await i.writeFile(n,`${JSON.stringify(t,null,2)}\n`,{mode:384}),await i.rename(n,e)}async function q(e){let t=JSON.parse(await i.readFile(n.join(e,k),`utf8`));if(t.version!==1||typeof t.competition!=`string`)throw Error(`${k} has an unsupported format`);return t}async function J(e){let t=b(e.pullRequest);if(!t)throw Error(`A pull request URL is required`);let n=new URL(t).pathname.split(`/`).filter(Boolean),r=await fetch(`https://api.github.com/repos/${n[0]}/${n[1]}/pulls/${n[3]}`,{headers:{Accept:`application/vnd.github+json`,"User-Agent":`tangle-solve-cli`},signal:AbortSignal.timeout(15e3)}),i=await r.json().catch(()=>null),a=e=>e.replace(/\/$/,``).toLowerCase();if(!r.ok||a(i?.base?.repo?.html_url??``)!==a(e.taskRepository)||i?.head?.sha?.toLowerCase()!==e.submissionRevision.toLowerCase()||a(i?.head?.repo?.html_url??``)!==a(e.submissionRepository))throw Error(`GitHub pull request must target the pinned task repository and contain the current committed submission`)}function Y(e){return{...e.authorization?{authorization:e.authorization}:{},...e.stake?{stake:e.stake}:{},join:e.join,commit:e.commit,reveal:e.reveal,report:e.report,evaluation:e.evaluation}}export{q as a,V as c,J as d,K as f,u as g,b as h,L as i,U as l,E as m,G as n,B as o,T as p,P as r,F as s,N as t,Y as u};
|
|
1
|
+
import{t as e}from"./deployment-t_Jhgj4Q.mjs";import*as t from"node:path";import{createHash as n}from"node:crypto";import{execFile as r}from"node:child_process";import*as i from"node:fs/promises";import{promisify as a}from"node:util";import{getAddress as o,isAddress as s}from"viem";const c=/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/i;function l(e){return[...e].some(e=>{let t=e.charCodeAt(0);return t<32||t===127})}function u(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`${t} must be an object`);return e}function d(e,t,n=2048){if(typeof e!=`string`||!e.trim()||e.length>n)throw Error(`${t} is missing or invalid`);if(l(e))throw Error(`${t} contains control characters`);return e.trim()}function f(e,t){let n=d(e,t,64).toLowerCase();if(!c.test(n))throw Error(`${t} must be a 40 or 64 character Git revision`);return n}function p(e,t,n=!1){let r=typeof e==`number`&&Number.isSafeInteger(e)?String(e):d(e,t,80);if(!/^\d+$/.test(r)||!n&&r===`0`)throw Error(`${t} must be an unsigned integer`);return BigInt(r).toString()}function m(e,t){let n=d(e,t,2048),r=new URL(n);if(r.protocol!==`https:`&&!(r.protocol===`http:`&&(r.hostname===`localhost`||r.hostname===`127.0.0.1`)))throw Error(`${t} must use HTTPS outside local development`);return n.replace(/\/$/,``)}function h(e,t){let n=m(e,t).replace(/\.git$/,``),r=new URL(n),i=r.pathname.split(`/`).filter(Boolean);if(r.hostname!==`github.com`||r.username||r.password||r.search||r.hash||i.length!==2)throw Error(`${t} must be an HTTPS GitHub repository URL`);return`https://github.com/${i.join(`/`)}`}function g(e,t){let n=d(e,t,42);if(!s(n,{strict:!1}))throw Error(`${t} must be an EVM address`);return o(n)}function _(e,t){let n=p(e,t),r=Number(n);if(!Number.isSafeInteger(r)||r<=0)throw Error(`${t} is out of range`);return r}function v(...e){for(let t of e)if(typeof t==`string`&&t.trim())return t.trim()}function y(e){let t=e.trim().replace(/\.git$/,``);return t.startsWith(`git@github.com:`)?`https://github.com/${t.slice(15)}`:t.startsWith(`ssh://git@github.com/`)?`https://github.com/${t.slice(21)}`:t}function b(e){if(e===void 0)return;let t=d(e,`pull request URL`,2048);if(!/^https:\/\/github\.com\/[^/]+\/[^/]+\/pull\/\d+(?:\/[^\s]*)?$/i.test(t))throw Error(`pull request URL must point to a GitHub pull request`);return t}function x(e,t){if(!/^https:\/\/[^\s]+$/i.test(e)&&!/^\/(?!\/).*$/.test(e)&&!/^[a-z][a-z0-9+.-]*:[^\s]+$/i.test(e))throw Error(`${t} must be an HTTPS URL or an absolute repository path`);if(e.split(/[?#]/,1)[0].split(`/`).includes(`..`))throw Error(`${t} cannot contain parent-directory segments`);return e}function S(e,t){let n=u(t.check??e.check,`competition.participation.check`),r=d(n.command,`competition.participation.check.command`,512);if(!Array.isArray(n.args)||n.args.some(e=>typeof e!=`string`))throw Error(`competition.participation.check.args must be an array of strings`);let i=n.args.map(e=>d(e,`competition checker argument`,2048)),a=v(n.result_file,n.resultFile),o=n.timeout_ms??n.timeoutMs,s=o===void 0?void 0:_(o,`competition checker timeout`);return{command:r,args:i,...a?{result_file:a}:{},...s?{timeout_ms:s}:{}}}function C(e){if(e.provenance===void 0)return;let t=u(e.provenance,`competition.participation.provenance`);if(t.mode!==`github_pull_request`)throw Error(`competition.participation.provenance.mode is unsupported`);if(t.required!==void 0&&typeof t.required!=`boolean`)throw Error(`competition.participation.provenance.required must be a boolean`);return{mode:`github_pull_request`,required:t.required===!0}}function w(t){let n=u(t.chain??t.network??{},`competition.chain`),r=t.rewards&&typeof t.rewards==`object`&&!Array.isArray(t.rewards)?u(t.rewards,`competition.rewards`):{},i=r.minStake&&typeof r.minStake==`object`&&!Array.isArray(r.minStake)?u(r.minStake,`competition.rewards.minStake`).raw:void 0,a=v(n.minStakeWei,n.min_stake_wei,t.minStakeWei,t.min_stake_wei,i),o=n.chainId??n.chain_id??t.chainId??t.chain_id,s=v(n.chainName,n.chain_name,t.chainName,t.chain_name)??`Tempo`,c=v(n.nativeSymbol,n.native_symbol,t.nativeSymbol,t.native_symbol)??`TNT`,l=v(n.rpcUrl,n.rpc_url,t.rpcUrl,t.rpc_url,process.env.TANGLE_SOLVE_RPC_URL),d=v(n.sponsorUrl,n.sponsor_url,t.sponsorUrl,t.sponsor_url,process.env.TANGLE_SOLVE_SPONSOR_URL),f=v(n.tangleAddress,n.tangle_address,n.coreAddress,n.core_address,t.tangleAddress,t.tangle_address,t.coreAddress,t.core_address),h=v(n.managerAddress,n.manager_address,t.managerAddress,t.manager_address),y=v(n.paymentAsset,n.payment_asset,n.servicePaymentAsset,n.service_payment_asset,t.paymentAsset,t.payment_asset,t.servicePaymentAsset,t.service_payment_asset),b=v(n.blueprintId,n.blueprint_id,t.blueprintId,t.blueprint_id),x=v(n.serviceId,n.service_id,t.serviceId,t.service_id),S=v(n.competitionId,n.competition_id,t.competitionId,t.competition_id,t.id);if(!l||!d||!f||!h||!b||!x||!S||!a||o===void 0)throw Error(`Solve competition metadata must include complete Tempo chain configuration`);return{chainId:_(o,`chain.chainId`),chainName:s,nativeSymbol:c,rpcUrl:m(l,`chain.rpcUrl`),sponsorUrl:m(d,`chain.sponsorUrl`),tangleAddress:g(f,`chain.tangleAddress`),managerAddress:g(h,`chain.managerAddress`),paymentAsset:g(y??e.paymentAsset,`chain.paymentAsset`),blueprintId:p(b,`chain.blueprintId`),serviceId:p(x,`chain.serviceId`),competitionId:p(S,`chain.competitionId`,!0),minStakeWei:p(a,`chain.minStakeWei`,!0)}}function T(e){let t=u(e,`competition`),n=u(t.participation??t.task,`competition.task`),r={...t,participation:{...n,...n.repositoryRevision===void 0&&n.revision!==void 0?{repositoryRevision:n.revision}:{}}},i=r.participation,a=h(v(r.repository,r.repo_url,i.repository)??``,`competition.repository`),o=f(v(r.repositoryRevision,r.repository_revision,i.revision,i.repositoryRevision,i.repository_revision),`competition.repositoryRevision`),s=d(r.slug??r.id,`competition.slug`,128),c=d(r.name??r.title??s,`competition.name`,256),l=S(r,i),p=C(i);return{version:1,slug:s,title:c,repository:a,taskRevision:o,checker:l,chain:w(r),...p?{provenance:p}:{}}}function E(e){return{chainId:e.chain.chainId,chainName:e.chain.chainName,nativeSymbol:e.chain.nativeSymbol,rpcUrl:e.chain.rpcUrl,sponsorUrl:e.chain.sponsorUrl,tangleAddress:e.chain.tangleAddress,managerAddress:e.chain.managerAddress,paymentAsset:e.chain.paymentAsset,blueprintId:BigInt(e.chain.blueprintId),serviceId:BigInt(e.chain.serviceId),competitionId:BigInt(e.chain.competitionId),minStakeWei:BigInt(e.chain.minStakeWei)}}async function D(e){let n=u(JSON.parse(await i.readFile(t.join(e,`.tangle-solve.json`),`utf8`)),`.tangle-solve.json`);if(n.version!==1)throw Error(`.tangle-solve.json has an unsupported version`);let r=u(n.checker,`.tangle-solve.json.checker`),a=u(n.chain,`.tangle-solve.json.chain`);return T({slug:n.slug,name:n.title,repository:n.repository,repositoryRevision:n.taskRevision,participation:{check:r,provenance:n.provenance},chain:a,competitionId:a.competitionId})}const O=a(r),k=`.tangle-solve-run.json`,A=`.tangle-solve.json`,j=`tangle.solve.manifestSha256`,M=new Set([A,k]),N=`upstream`;async function P(e,t){let n=await O(`git`,[`-C`,e,...t],{encoding:`utf8`,maxBuffer:1e6});return String(n.stdout).trim()}async function F(e,n){let r=t.resolve(n??process.cwd()),i=await D(r);if(e&&e!==i.slug&&e!==i.chain.competitionId)throw Error(`This directory contains '${i.slug}', not '${e}'`);return{root:r,manifest:i}}async function I(e){let r=t.join(e,A),a;try{a=await i.lstat(r)}catch{throw Error(`${A} is missing`)}if(a.isSymbolicLink()||!a.isFile())throw Error(`${A} must be a regular file`);return n(`sha256`).update(await i.readFile(r)).digest(`hex`)}async function L(e){let t=await I(e);return await P(e,[`config`,`--local`,`--replace-all`,j,t]),t}async function R(e){let t;try{t=await P(e,[`config`,`--local`,`--get`,j])}catch{throw Error(`The local Git metadata has no ${j} pin; run tangle solve clone again`)}if(!/^[0-9a-f]{64}$/i.test(t))throw Error(`The local ${j} pin is invalid`);if(await I(e)!==t.toLowerCase())throw Error(`${A} changed after clone; run tangle solve clone again`)}async function z(e,t){try{return await P(e,[`ls-files`,`--error-unmatch`,`--`,t]),!0}catch{return!1}}async function B(e){await R(e);for(let t of M)if(await z(e,t))throw Error(`${t} must remain untracked and local to this Solve workspace`);let t=await O(`git`,[`-C`,e,`status`,`--porcelain=v1`,`--untracked-files=all`,`--ignored=matching`],{encoding:`utf8`,maxBuffer:1e6});if(String(t.stdout).split(/\r?\n/).filter(Boolean).filter(e=>{let t=e.slice(0,2),n=e.slice(3);return!((t===`??`||t===`!!`)&&M.has(n))}).length>0)throw Error(`Commit the candidate before running Solve. Only the local manifest and run record may remain uncommitted.`);return f(await P(e,[`rev-parse`,`HEAD`]),`submission revision`)}async function V(e,t,n,r={}){let i=await H(e,t,r);if(i)return{taskRepository:t.repository,taskRevision:t.taskRevision,submissionRepository:i,submissionRevision:n}}async function H(e,t,n={}){let r;try{r=y(await P(e,[`config`,`--get`,`remote.origin.pushurl`]))}catch{try{r=y(await P(e,[`config`,`--get`,`remote.origin.url`]))}catch{if(n.allowMissing)return;throw Error(`Add your GitHub fork as the 'origin' remote before submitting. The task repository is available as '${N}'.`)}}let i=h(r,`git remote.origin.url`);if(i.toLowerCase()===t.repository.toLowerCase()){if(n.allowMissing)return;throw Error(`The 'origin' remote is the task repository. Add your GitHub fork as 'origin'; keep the task repository as '${N}' before submitting.`)}return i}function U(e,t){return!e||!t?!1:e.taskRepository.toLowerCase()===t.taskRepository.toLowerCase()&&e.taskRevision.toLowerCase()===t.taskRevision.toLowerCase()&&e.submissionRepository.toLowerCase()===t.submissionRepository.toLowerCase()&&e.submissionRevision.toLowerCase()===t.submissionRevision.toLowerCase()}function W(e,t){return`${e}/commit/${t}`}function G(e,t,n,r,i={}){let a=e.evidenceRefs.map(e=>x(e.trim(),`checker evidence reference`));if(n){if(!t){if(i.allowMissingSource)return{evidence:e.evidence,evidenceRefs:a};throw Error(`Provenance policy requires a submission source`)}let o=b(r);if(n.required&&(i.requirePullRequest??!0)&&!o)throw Error(`This competition requires a GitHub pull request`);a.push(W(t.taskRepository,t.taskRevision),W(t.submissionRepository,t.submissionRevision),...o?[o]:[])}return{evidence:e.evidence,evidenceRefs:[...new Set(a)]}}async function K(e,t){let n=`${e}.${process.pid}.tmp`;await i.writeFile(n,`${JSON.stringify(t,null,2)}\n`,{mode:384}),await i.rename(n,e)}async function q(e){let n=JSON.parse(await i.readFile(t.join(e,k),`utf8`));if(n.version!==1||typeof n.competition!=`string`)throw Error(`${k} has an unsupported format`);return n}async function J(e){let t=b(e.pullRequest);if(!t)throw Error(`A pull request URL is required`);let n=new URL(t).pathname.split(`/`).filter(Boolean),r=await fetch(`https://api.github.com/repos/${n[0]}/${n[1]}/pulls/${n[3]}`,{headers:{Accept:`application/vnd.github+json`,"User-Agent":`tangle-solve-cli`},signal:AbortSignal.timeout(15e3)}),i=await r.json().catch(()=>null),a=e=>e.replace(/\/$/,``).toLowerCase();if(!r.ok||a(i?.base?.repo?.html_url??``)!==a(e.taskRepository)||i?.head?.sha?.toLowerCase()!==e.submissionRevision.toLowerCase()||a(i?.head?.repo?.html_url??``)!==a(e.submissionRepository))throw Error(`GitHub pull request must target the pinned task repository and contain the current committed submission`)}function Y(e){return{...e.authorization?{authorization:e.authorization}:{},...e.stake?{stake:e.stake}:{},join:e.join,commit:e.commit,reveal:e.reveal,report:e.report,evaluation:e.evaluation}}export{q as a,V as c,J as d,K as f,u as g,b as h,L as i,U as l,E as m,G as n,B as o,T as p,P as r,F as s,N as t,Y as u};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tangle-network/sandbox-cli",
|
|
3
|
-
"version": "0.22.
|
|
3
|
+
"version": "0.22.133",
|
|
4
4
|
"description": "CLI for Tangle Sandbox operations",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"@tangle-network/agent-runtime": "^9.0.12",
|
|
27
27
|
"@tangle-network/harness-sessions": "^1.0.2",
|
|
28
28
|
"@tangle-network/hub-sdk": "1.0.30",
|
|
29
|
-
"@tangle-network/sandbox": "^1.0.
|
|
29
|
+
"@tangle-network/sandbox": "^1.0.404",
|
|
30
30
|
"@tangle-network/sdk-cli-runner": "^0.3.12",
|
|
31
31
|
"chalk": "^5.6.2",
|
|
32
32
|
"cli-bridge": "https://codeload.github.com/drewstone/cli-bridge/tar.gz/e36c675aafde9e51aca828cb28a2dfb3f885867b",
|
|
@@ -87,8 +87,8 @@
|
|
|
87
87
|
"author": "Tangle Network",
|
|
88
88
|
"license": "MIT",
|
|
89
89
|
"tangleRelease": {
|
|
90
|
-
"sourceSha": "
|
|
91
|
-
"mergedAt": "2026-11-14T22:
|
|
90
|
+
"sourceSha": "ee85a06ec8887b7f311fa7a2a41be4afc7ee4e4f",
|
|
91
|
+
"mergedAt": "2026-11-14T22:59:09-08:00"
|
|
92
92
|
},
|
|
93
93
|
"scripts": {
|
|
94
94
|
"build": "tsdown",
|