@oracle-agent/oracle 0.35.49 → 0.35.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/artifacts/specialist-packs/oracle-full-crypto.json +11 -0
- package/dist/agent-sessions.mjs +19 -19
- package/dist/artifacts/token-dashboard.mjs +1 -1
- package/dist/assets/profiles/near-agent/SOUL.md +46 -0
- package/dist/assets/profiles/near-agent/profile.json +30 -0
- package/dist/assets/profiles/oracle/SOUL.md +1 -0
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/assets/skills/oracle-near/SKILL.md +66 -0
- package/dist/automation-plan.mjs +1 -1
- package/dist/bin/desk-server.mjs +33 -33
- package/dist/bin/oracle-data-mcp.mjs +16 -16
- package/dist/bin/oracle-gateway.mjs +3 -3
- package/dist/bin/oracle-launch-radar-shadow.mjs +3 -3
- package/dist/bin/oracle-mev-arb-shadow.mjs +4 -4
- package/dist/bin/oracle-mev-shadow.mjs +4 -4
- package/dist/bin/oracle-public-server.mjs +5 -5
- package/dist/bin/oracle-route.mjs +27 -27
- package/dist/bin/oracle-scan.mjs +3 -3
- package/dist/bin/oracle-telegram-mcp.mjs +1 -1
- package/dist/chains.mjs +1 -1
- package/dist/cli/commands/account.mjs +22 -22
- package/dist/cli/commands/agent-session.mjs +23 -23
- package/dist/cli/commands/auth.mjs +16 -15
- package/dist/cli/commands/chain.mjs +5 -5
- package/dist/cli/commands/chat.mjs +310 -228
- package/dist/cli/commands/data.mjs +37 -37
- package/dist/cli/commands/doctor.mjs +5 -5
- package/dist/cli/commands/eval.mjs +249 -167
- package/dist/cli/commands/farm.mjs +1 -1
- package/dist/cli/commands/follow.mjs +4 -4
- package/dist/cli/commands/harness.mjs +5 -5
- package/dist/cli/commands/mint.mjs +11 -11
- package/dist/cli/commands/model.mjs +313 -231
- package/dist/cli/commands/project.mjs +8 -7
- package/dist/cli/commands/quickstart.mjs +2 -2
- package/dist/cli/commands/receipt.mjs +2 -2
- package/dist/cli/commands/resolve.mjs +4 -4
- package/dist/cli/commands/session-vault.mjs +4 -4
- package/dist/cli/commands/setup.mjs +53 -52
- package/dist/cli/commands/snipe.mjs +13 -13
- package/dist/cli/commands/strategy.mjs +5 -5
- package/dist/cli/commands/swap.mjs +11 -11
- package/dist/cli/commands/telegram.mjs +7 -7
- package/dist/cli/commands/venues.mjs +1 -1
- package/dist/cli/project-access.mjs +4 -3
- package/dist/data/desk-data.mjs +31 -31
- package/dist/data/holder-table.mjs +2 -2
- package/dist/data/market-tape.mjs +1 -1
- package/dist/data/names.mjs +3 -3
- package/dist/data/providers/farming.mjs +2 -2
- package/dist/data/providers/lp-destination-discovery.mjs +4 -4
- package/dist/index.mjs +49 -49
- package/dist/launch-radar/index.mjs +5 -5
- package/dist/lp/index.mjs +4 -4
- package/dist/nft/universal-mint-router.mjs +4 -4
- package/dist/notifications/index.mjs +1 -1
- package/dist/router/index.mjs +3 -3
- package/dist/router/prepare-bridge.mjs +2 -2
- package/dist/router/prepare-route.mjs +3 -3
- package/dist/scanner/index.mjs +3 -3
- package/dist/strategy/index.mjs +4 -4
- package/dist/task.mjs +1 -1
- package/dist/teams/index.mjs +6 -6
- package/dist/telegram/chart-card.mjs +5 -5
- package/dist/telegram/market-commands.mjs +1 -1
- package/dist/tui/standalone-client.mjs +179 -97
- package/package.json +2 -2
- package/public/oracle-splash/assets/desktop-app.jpg +0 -0
- package/public/oracle-splash/docs/browser-and-web/index.html +2 -2
- package/public/oracle-splash/docs/connectors/index.html +2 -2
- package/public/oracle-splash/docs/getting-started/index.html +2 -2
- package/public/oracle-splash/docs/index.html +3 -3
- package/public/oracle-splash/docs/reference/index.html +2 -2
- package/public/oracle-splash/docs/security/index.html +2 -2
- package/public/oracle-splash/docs/using-oracle/index.html +2 -2
- package/public/oracle-splash/download/index.html +219 -5
- package/public/oracle-splash/downloads/index.html +1 -1
- package/public/oracle-splash/eval/index.html +19 -19
- package/public/oracle-splash/eval/releases/oracle-0.35.49.json +852 -0
- package/public/oracle-splash/index.html +262 -37
- package/public/oracle-splash/pricing/index.html +215 -1
- package/public/oracle-splash/security/index.html +215 -1
- package/public/oracle-splash/what-it-does/index.html +215 -1
- package/public/oracle-splash/where-it-works/index.html +215 -1
- package/server.json +2 -2
package/dist/task.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{randomUUID as ct}from"node:crypto";import{validateMnemonic as ut}from"@scure/bip39";import{wordlist as ft}from"@scure/bip39/wordlists/english";var Bt=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),Vt=Object.freeze(["read","simulate"]);var Ft=1440*60;var b=class extends Error{constructor(t,r){super(`secret material must never appear in a public API object (at ${t}, rule: ${r})`),this.name="SecretLeakError",this.path=t,this.rule=r}},Pe=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,De=Object.freeze(["privkey","wif","xprv","seed"]);function oe(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return Pe.test(t)||De.includes(r)}var he=Object.freeze([{rule:"raw-32-byte-hex-key",re:/^0x[0-9a-fA-F]{64}$/},{rule:"raw-32-byte-hex-bare",re:/^[0-9a-fA-F]{64}$/},{rule:"extended-private-key",re:/\b(?:xprv|tprv|yprv|zprv)[1-9A-HJ-NP-Za-km-z]{107}\b/},{rule:"bitcoin-wif",re:/\b[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{rule:"bip39-mnemonic",re:/\b(?:[a-z]{3,8}\s+){11,23}[a-z]{3,8}\b/},{rule:"bearer-token",re:/bearer\s+[A-Za-z0-9._~+/=-]+/i},{rule:"pem-private-key",re:/-----BEGIN[A-Z ]*PRIVATE KEY-----/},{rule:"keystore-path",re:/keystore/i},{rule:"signer-url",re:/https?:\/\/\S*sign/i},{rule:"authorization-header",re:/authorization\s*:/i}]),ge=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"]);function Me(e){return e.replace(/"([A-Za-z0-9_-]+)"\s*:\s*"(?:0x)?([0-9a-fA-F]{64})"/g,(t,r)=>ge.includes(String(r).toLowerCase().replace(/[_-]/g,""))?`"${r}":"<hex64>"`:t)}function ae(e){let t;try{t=JSON.stringify(e)}catch(o){throw new b("$",`unserializable-payload: ${String(o?.message||o)}`)}if(t===void 0)return"null";let r=Me(t);for(let{rule:o,re:a}of he)if(a.test(r))throw new b("$<serialized>",o);if(/(?:^|[^0-9a-fA-Fx])0x[0-9a-fA-F]{64}(?![0-9a-fA-F])/.test(r))throw new b("$<serialized>","raw-32-byte-hex-embedded");return JSON.parse(t,(o,a)=>{if(o&&oe(o))throw new b(`$<serialized>.${o}`,"forbidden-key-name");return a}),t}function m(e,t="$",r=new Set,n=""){if(e==null)return e;if(typeof e=="string"){let o=ge.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:a,re:s}of he)if(!(o&&a.startsWith("raw-32-byte-hex"))&&s.test(e))throw new b(t,a);return e}if(typeof e!="object"||r.has(e)||(r.add(e),ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e;if(e instanceof Map){for(let[o,a]of e.entries()){if(typeof o=="string"&&oe(o))throw new b(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");m(o,`${t}[key]`,r),m(a,`${t}[${String(o)}]`,r)}return e}if(e instanceof Set){let o=0;for(let a of e.values())m(a,`${t}[${o++}]`,r);return e}if(Array.isArray(e))return e.forEach((o,a)=>m(o,`${t}[${a}]`,r)),e;for(let[o,a]of Object.entries(e)){if(oe(o))throw new b(`${t}.${o}`,"forbidden-key-name");m(a,`${t}.${o}`,r,o)}return e}import{createHash as He}from"node:crypto";var se=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),ye=Object.freeze(Object.fromEntries(se.map((e,t)=>[e,Object.freeze(t+1<se.length?[se[t+1]]:[])]))),we=new Set(["signed","broadcast"]);function ie(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ie).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ie(e[t])}`).join(",")}}`}function Be(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function W(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))W(t)}return e}function ce(e,t="fact"){try{m(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function Ee(e){return He("sha256").update(ie(e)).digest("hex")}function xe({tradeId:e,state:t,fact:r,asOf:n,previousHash:o,external:a}){let s={tradeId:e,state:t,asOf:n,previousHash:o??null,external:a===!0,fact:Be(r)};return W({...s,hash:Ee(s)})}function Ae({tradeId:e,intent:t,asOf:r=0}={}){if(!e||typeof e!="string")throw new Error("tradeId is required");if(!t||typeof t!="object"||Array.isArray(t))throw new Error("intent fact is required");ce(t,"intent");let n=xe({tradeId:e,state:"intent",fact:t,asOf:r,previousHash:null,external:!1});return W({tradeId:e,state:"intent",events:[n],headHash:n.hash,custody:"none",execution:"prepare-only"})}function Se(e,t,r,n={}){if(J(e),!(ye[e.state]||[]).includes(t))throw new Error(`invalid trade transition ${e.state} -> ${t}`);if(!r||typeof r!="object"||Array.isArray(r))throw new Error(`${t} fact is required`);ce(r,t);let a=n.external===!0||n.externallySupplied===!0;if(we.has(t)&&!a)throw new Error(`${t} must be an externally supplied fact; this module never signs or broadcasts`);let s=e.events.at(-1),i=n.asOf??s.asOf;if(!Number.isFinite(Number(i))||Number(i)<Number(s.asOf))throw new Error("asOf must be finite and monotonic");let l=xe({tradeId:e.tradeId,state:t,fact:r,asOf:i,previousHash:s.hash,external:a});return W({...e,state:t,events:[...e.events,l],headHash:l.hash})}function J(e){if(!e||!Array.isArray(e.events)||e.events.length===0)throw new Error("invalid trade lifecycle");if(e.custody!=="none")throw new Error("trade lifecycle custody must be none");if(e.execution!=="prepare-only")throw new Error("trade lifecycle execution must be prepare-only");let t=null;for(let r=0;r<e.events.length;r+=1){let n=e.events[r],{hash:o,...a}=n;if(Ee(a)!==o)throw new Error(`trade event ${r} hash mismatch`);if(ce(n.fact,`trade event ${r} fact`),!Number.isFinite(Number(n.asOf))||t&&Number(n.asOf)<Number(t.asOf))throw new Error(`trade event ${r} asOf must be finite and monotonic`);if(n.tradeId!==e.tradeId||n.previousHash!==t?.hash&&r>0)throw new Error(`trade event ${r} chain mismatch`);if(r===0&&(n.state!=="intent"||n.previousHash!==null))throw new Error("trade lifecycle must start with intent");if(t&&!ye[t.state]?.includes(n.state))throw new Error(`invalid recorded transition ${t.state} -> ${n.state}`);if(we.has(n.state)&&n.external!==!0)throw new Error(`${n.state} is not externally supplied`);t=n}if(e.state!==t.state||e.headHash!==t.hash)throw new Error("trade lifecycle head mismatch");return!0}var Ve=["0x000000000022d473030f116ddee9f6b43ac78ba3"],Fe={4663:["0xcaf681a66d020601342297493863e78c959e5cb2","0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7","0x1f7d7550b1b028f7571e69a784071f0205fd2efa","0x0bd7d308f8e1639fab988df18a8011f41eacad73","0x5fc5360d0400a0fd4f2af552add042d716f1d168","0xb477751b76cf82d00a686a1232f5fcd772414af3","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1"],8453:["0x2626664c2603336e57b271c5c0b26f421741e481","0x6ff5693b99212da76ad316178a184ab56d299b43","0x3d4e44eb1374240ce5f1b871ab261cd16335b76a","0x33128a8fc17869897dce68ed026d694621f6fdfd","0x4200000000000000000000000000000000000006","0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","0xbe6d8f0d05cc4be24d5167a3ef062215be6d18a5","0x254cf9e1e6e233aa1ac962cb9b05b2cfeaae15b0","0x5e7bb104d84c7cb9b682aac2f3d509f5f406809a","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x888888888889758f76e7103c6cbf23abbf58f946","0x3f170631ed9821ca51a59d996ab095162438dc10","0x4f37a9d177470499a2dd084621020b023fcffc1f","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],42161:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x61ffe014ba17989e743c5f6cb21bf9697530b21e","0x82af49447d8a07e3bd95bd0d56f35241523fbab1","0xaf88d065e77c8cc2239327c5edb3a432268e5831","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9","0x888888888889758f76e7103c6cbf23abbf58f946","0xeaedc32a51c510d35ebc11088fd5ff2b47aacf2e","0x2191718cd32d02b8e60badffea33e4b5dd9a0a0d","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110","0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41","0x7452c558d45f8afc8c83dae62c3f8a5be19c71f6"],1:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x4cd00e387622c35bddb9b4c962c136462338bc31","0x6a000f20005980200259b80c5102003040001068","0xae563e3f8219521950555f5962419c8919758ea2","0x45312ea0eff7e09c83cbe249fa1d7598c4c8cd4e","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],137:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x0dcded3545d565ba3b19e683431381007245d983"],10:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xe2fa4e1d17725e72dcdafe943ecf45df4b9e285b","0x0dcded3545d565ba3b19e683431381007245d983"],56:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xa72c85c258a81761433b4e8da60505fe3dd551cc"],43114:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xf39ca6ede9bf7820a952b52f3c94af526bab9015","0x0dcded3545d565ba3b19e683431381007245d983","0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2","0x820f5ffc5b525cd4d88cd91acf2c28f16530cc68"],999:["0x0a0758d937d1059c356d4714e57f5df0239bce1a","0xd2002373543ce3527023c75e7518c274a51ce712"],2741:["0x4f8c9056bb8a3616693a76922fa35d53c056e5b3"],988:["0x026f252016a7c47cdef1f05a3fc9e20c92a49c37","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1","0x817997ca8394e26cce3de3a076a4889b27dbf9de","0x3dea4be5615974f31624404ef288ba3b36dfeb83","0xeaf7ac0fdf150cdd89340fb762d83848de6a7b83","0x779ded0c9e1022225f8e0630b35a9b54be713736","0xbc6f7725f08232c151b528bdfcaaf89993ca86ee"]};function _e(e){let t=Fe[Number(e)]||[];return new Set([...t,...Ve].map(r=>String(r).trim().toLowerCase()).filter(Boolean))}var C=100;var lr=300*1e3,dr=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();var wr=Object.freeze({NONE:"none",PREPARE_CHECKSUM:"prepare-checksum",PREPARE_HMAC:"prepare-hmac"});var Er=Object.freeze(["signature","signedTx","signedTransaction","rawTransaction","signedPayload","signedRaw"]),xr=Object.freeze(["txid","txHash","transactionHash","broadcastHash"]),Ar=Object.freeze(["tee-attestation","remote-attestation","hardware-enclave","trusted-execution-environment","execution-authorization","signature","broadcast"]);var qe=Object.freeze(["signature","signedTx","signedTransaction","rawTransaction","signedPayload","signedRaw"]),Ke=Object.freeze(["txid","txHash","transactionHash","broadcastHash"]),Ge=/^0x[a-fA-F0-9]{40}$/;function Ue(e,t=process.env){let r=t&&typeof t=="object"?t:process.env,n=String(r.ORACLE_DEST_ALLOWLIST||r.MAD_DEST_ALLOWLIST||"").split(",").map(s=>s.trim().toLowerCase()).filter(Boolean),o=Number(e),a=Number.isInteger(o)&&o>0?[..._e(o)]:[];return new Set([...n,...a])}function We(e){return!e||typeof e!="object"?!1:!!(e.slippageGuard||e.slippageBps!=null||e.slippage!=null||e.tokenIn||e.tokenOut||e.amountIn!=null||e.amountOut!=null)}function Je(e){return!e||typeof e!="object"?!1:!!(e.transaction||e.tx||e.to||e.destination||e.settlement||e.data||e.value!=null)}function Ze(e={}){let t=e.transaction&&typeof e.transaction=="object"?e.transaction:e.tx&&typeof e.tx=="object"?e.tx:e;return{to:t.to||e.to||e.destination||e.settlement||null,chainId:t.chainId??e.chainId??e.chain??null,data:t.data||e.data||null,value:t.value??e.value??null}}function Ye(e){let t=e.slippageGuard||e.madSlippage;return t&&t.selectedBps!=null?Number(t.selectedBps):t&&t.capBps!=null&&e.slippageBps==null?Number(t.capBps):e.slippageBps!=null?Number(e.slippageBps):e.slippage&&typeof e.slippage=="object"&&e.slippage.bps!=null?Number(e.slippage.bps):null}function ue(e,t={}){let r=[],n={unsigned:!1,destination:"n/a",slippage:"n/a"};if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,checks:n,errors:["prepared fact must be an object"]};e.signed===!0&&r.push("prepared fact is signed"),e.broadcast===!0&&r.push("prepared fact claims broadcast");for(let o of qe)e[o]&&r.push(`prepared fact carries ${o}`);for(let o of Ke)e[o]&&r.push(`prepared fact claims executed ${o}`);if(n.unsigned=r.length===0,Je(e)){let o=Ze(e),a=o.to==null?"":String(o.to).trim();if(!a)r.push("prepared transaction is missing destination"),n.destination="missing";else{let s=Ge.test(a);if(a.startsWith("0x")&&!s)r.push("prepared destination is not a 20-byte address"),n.destination="malformed";else{let i=Ue(o.chainId,t.env),l=a.toLowerCase(),x=!!(e.routeAttestation||e.madRoute||e.vaultGuard||e.madVault);i.size>0&&s&&!i.has(l)&&!x?(r.push(`destination ${l} not allowlisted`),n.destination="blocked"):n.destination=i.size===0?"unset":"allowlisted"}}}if(We(e)){let o=Ye(e),a=e.slippageGuard?.capBps!=null?Number(e.slippageGuard.capBps):C;!Number.isInteger(o)||o<0?(r.push("swap prepare is missing integer slippage bps"),n.slippage="missing"):o>C||Number.isInteger(a)&&o>a||Number.isInteger(a)&&a>C?(r.push(`slippage ${o} exceeds cap ${Math.min(a,C)}`),n.slippage="blocked"):n.slippage="ok"}return{ok:r.length===0,checks:n,errors:r}}var Xe=(process.env.ORACLE_REDACT_SECRETS??"true").toLowerCase(),ke=["1","true","yes","on"].includes(Xe),Qe=[/sk-[A-Za-z0-9_-]{10,}/g,/sk_live_[A-Za-z0-9]{10,}/g,/sk_test_[A-Za-z0-9]{10,}/g,/ghp_[A-Za-z0-9]{10,}/g,/github_pat_[A-Za-z0-9_]{10,}/g,/gho_[A-Za-z0-9]{10,}/g,/ghs_[A-Za-z0-9]{10,}/g,/xox[baprs]-[A-Za-z0-9-]{10,}/g,/AIza[A-Za-z0-9_-]{30,}/g,/AKIA[A-Z0-9]{16}/g,/pplx-[A-Za-z0-9]{10,}/g,/hf_[A-Za-z0-9]{10,}/g,/xai-[A-Za-z0-9]{30,}/g,/gsk_[A-Za-z0-9]{10,}/g,/npm_[A-Za-z0-9]{10,}/g,/tvly-[A-Za-z0-9]{10,}/g,/Bearer\s+[A-Za-z0-9\-._~+/]+=*/gi],et=/\b0x[a-fA-F0-9]{64}\b/g,tt=/-----BEGIN (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----/g,rt=/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,nt=/\b([A-Z][A-Z0-9_]{0,40}(?:API_?KEY|TOKEN|SECRET|PASSWORD|PASSWD|PRIVATE_?KEY|MNEMONIC|SEED|AUTH)[A-Z0-9_]{0,20})\s*=\s*(['"]?)(\S+)\2/g,ot=/^(?:export\s+)?((?:api[_-]?key|token|secret|password|private[_-]?key|mnemonic|seed[_-]?phrase|authorization))\s*[:=]\s*(['"]?)([^\s&]+)\2/gim,at=/("(?:api[_-]?key|apiKey|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key|privateKey|secret|password|authorization|bearer|mnemonic|seedPhrase)"\s*:\s*")([^"]{6,})(")/gi,st=new Set(["access_token","refresh_token","id_token","token","api_key","apikey","client_secret","password","auth","jwt","session","secret","key","code","signature","x-amz-signature","private_key","authorization"]),Tr=new Set([...st].map(e=>e.replace(/[^a-z0-9]/gi,"").toLowerCase()));function it(e){let t=String(e??"");return t.length<18?"[REDACTED]":`${t.slice(0,6)}\u2026${t.slice(-4)}`}function $e(e){return`\xABredacted:${String(e??"").slice(0,4)}\u2026\xBB`}function O(e,t={}){if(e==null)return e;let r=typeof e=="string"?e:String(e);if(!r||!(t.force||ke))return r;let n=t.fileRead?$e:it;r=r.replace(tt,"[REDACTED_PRIVATE_KEY]"),r=r.replace(et,"[REDACTED_EVM_KEY]"),r=r.replace(rt,o=>n(o));for(let o of Qe)o.lastIndex=0,r=r.replace(o,a=>n(a));return r=r.replace(nt,(o,a,s,i)=>/^(?:os\.(?:getenv|environ)|process\.env|\$ENV\{)/.test(i)?`${a}=${s||""}${i}${s||""}`:`${a}=${s||""}${n(i)}${s||""}`),r=r.replace(ot,(o,a,s,i)=>o.replace(i,n(i))),r=r.replace(at,(o,a,s,i)=>`${a}${n(s)}${i}`),r}function j(e,t={}){if(!(t.force||ke)||e==null)return e;if(typeof e=="string")return O(e,t);if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(r=>j(r,t));if(typeof e=="object"){let r={};for(let[n,o]of Object.entries(e)){let a=/private|secret|password|mnemonic|seed|api[_-]?key|token|authorization|bearer/i.test(n);typeof o=="string"&&a?r[n]=t.fileRead?$e(o):"[REDACTED]":r[n]=j(o,t)}return r}try{return O(String(e),t)}catch{return"[REDACTED]"}}var E=1,Dr=Object.freeze(["answered","prepared","refused","unavailable"]),lt=Object.freeze({mode:"prepare-only",requiresWalletSignature:!0,backendSigner:!1,signed:!1,broadcast:!1}),dt=Object.freeze({type:"object",properties:Object.freeze({schemaVersion:Object.freeze({const:E}),prompt:Object.freeze({type:"string",minLength:1,maxLength:8e3})}),required:Object.freeze(["schemaVersion","prompt"]),additionalProperties:!1}),pt=32*1024,X=64*1024,te=64*1024,Te=32*1024,mt=8,bt=12,ht=new Set(["sign","signed","signature","signer","signhash","action","actions","watch","receipt","broadcast","submit","execute","sendrawtransaction"]),gt=new Set(["list","show"]),yt=new Set(["call","catalog","health"]),wt=new Set(["swap","bridge","prepare","prepare-bridge"]),Re=new Set(["quote_comparison","simulation","prepared","approval","settlement","balance_delta","position"]),Ie=new Set(["signed","broadcast"]),Et=Object.freeze({type:"string",minLength:1,maxLength:256}),fe=Object.freeze({type:"object",additionalProperties:!0});function Oe(e,t,r){return Object.freeze({type:"function",function:Object.freeze({name:e,description:t,strict:!0,parameters:Object.freeze(r)})})}var Ne=Object.freeze([Oe("oracle_cli","Run one structurally allowlisted Oracle read or unsigned preparation command. It cannot sign, broadcast, watch, manage actions, or retrieve receipts.",{type:"object",properties:Object.freeze({argv:Object.freeze({type:"array",minItems:1,maxItems:24,items:Object.freeze({type:"string",maxLength:1e3}),description:"Allowed: chain list/show; data call/catalog/health; scan; route swap/bridge/prepare/prepare-bridge; prepare."})}),required:Object.freeze(["argv"]),additionalProperties:!1}),Oe("trade_lifecycle","Create, verify, or advance an ephemeral prepare-only trade lifecycle. Signed and broadcast states are refused. Only returned, hash-valid explicit events count as lifecycle evidence.",{type:"object",properties:Object.freeze({action:Object.freeze({type:"string",enum:Object.freeze(["create","verify","advance"])}),tradeId:Et,intent:fe,lifecycle:fe,state:Object.freeze({type:"string",enum:Object.freeze([...Re])}),fact:fe,asOf:Object.freeze({type:"number"})}),required:Object.freeze(["action"]),additionalProperties:!1})]),xt=["You are Oracle's prepare-only task adapter.","You have exactly two tools: oracle_cli and trade_lifecycle.","Never claim that you signed or broadcast. Never request or expose a key, token, mnemonic, signer, signature, watch, action, or receipt.","A request and your prose are not lifecycle evidence. Use tools for facts. PREPARED is established only by a verified unsigned artifact returned by oracle_cli.","The caller's wallet must review and sign every prepared artifact."].join(" ");function S(e){return Buffer.byteLength(String(e??""),"utf8")}function L(e,t,r=[]){if(!e||typeof e!="object"||Array.isArray(e))return"tool arguments must be an object";for(let o of t)if(!(o in e))return`${o} is required`;let n=new Set([...t,...r]);for(let o of Object.keys(e))if(!n.has(o))return`unexpected argument: ${o}`;return null}function de(e,t){try{return m(e,t),ae(e),null}catch{return`${t} contains forbidden secret or custody material`}}function At(e){let t=String(e||"").toLowerCase().match(/[a-z]+/g)||[];for(let r of[12,15,18,21,24])for(let n=0;n+r<=t.length;n+=1)try{if(ut(t.slice(n,n+r).join(" "),ft))return!0}catch{}return!1}function St(e){let t=String(e||"");return O(t,{force:!0})!==t||/\b(?:xprv|tprv|yprv|zprv)[1-9A-HJ-NP-Za-km-z]{100,}\b/.test(t)||/\b[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}\b/.test(t)||At(t)?"prompt contains forbidden secret material":null}function Q(e){return JSON.parse(JSON.stringify(e))}function P(e,t,r){let n;try{n=JSON.stringify(e)}catch{throw new TypeError(`${r} must be JSON-serializable`)}if(n===void 0&&(n="null"),Buffer.byteLength(n,"utf8")>t)throw new TypeError(`${r} exceeds size limit`);return n}function _t(e,t){let r=String(e??"");if(S(r)<=t)return r;let n=Math.min(r.length,t);for(;n>0&&S(r.slice(0,n))>t;)n-=Math.max(1,Math.ceil((S(r.slice(0,n))-t)/2));return`${r.slice(0,n)}
|
|
1
|
+
import{randomUUID as ct}from"node:crypto";import{validateMnemonic as ut}from"@scure/bip39";import{wordlist as ft}from"@scure/bip39/wordlists/english.js";var Bt=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),Vt=Object.freeze(["read","simulate"]);var Ft=1440*60;var b=class extends Error{constructor(t,r){super(`secret material must never appear in a public API object (at ${t}, rule: ${r})`),this.name="SecretLeakError",this.path=t,this.rule=r}},Pe=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,De=Object.freeze(["privkey","wif","xprv","seed"]);function oe(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return Pe.test(t)||De.includes(r)}var he=Object.freeze([{rule:"raw-32-byte-hex-key",re:/^0x[0-9a-fA-F]{64}$/},{rule:"raw-32-byte-hex-bare",re:/^[0-9a-fA-F]{64}$/},{rule:"extended-private-key",re:/\b(?:xprv|tprv|yprv|zprv)[1-9A-HJ-NP-Za-km-z]{107}\b/},{rule:"bitcoin-wif",re:/\b[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{rule:"bip39-mnemonic",re:/\b(?:[a-z]{3,8}\s+){11,23}[a-z]{3,8}\b/},{rule:"bearer-token",re:/bearer\s+[A-Za-z0-9._~+/=-]+/i},{rule:"pem-private-key",re:/-----BEGIN[A-Z ]*PRIVATE KEY-----/},{rule:"keystore-path",re:/keystore/i},{rule:"signer-url",re:/https?:\/\/\S*sign/i},{rule:"authorization-header",re:/authorization\s*:/i}]),ge=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"]);function Me(e){return e.replace(/"([A-Za-z0-9_-]+)"\s*:\s*"(?:0x)?([0-9a-fA-F]{64})"/g,(t,r)=>ge.includes(String(r).toLowerCase().replace(/[_-]/g,""))?`"${r}":"<hex64>"`:t)}function ae(e){let t;try{t=JSON.stringify(e)}catch(o){throw new b("$",`unserializable-payload: ${String(o?.message||o)}`)}if(t===void 0)return"null";let r=Me(t);for(let{rule:o,re:a}of he)if(a.test(r))throw new b("$<serialized>",o);if(/(?:^|[^0-9a-fA-Fx])0x[0-9a-fA-F]{64}(?![0-9a-fA-F])/.test(r))throw new b("$<serialized>","raw-32-byte-hex-embedded");return JSON.parse(t,(o,a)=>{if(o&&oe(o))throw new b(`$<serialized>.${o}`,"forbidden-key-name");return a}),t}function m(e,t="$",r=new Set,n=""){if(e==null)return e;if(typeof e=="string"){let o=ge.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:a,re:s}of he)if(!(o&&a.startsWith("raw-32-byte-hex"))&&s.test(e))throw new b(t,a);return e}if(typeof e!="object"||r.has(e)||(r.add(e),ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e;if(e instanceof Map){for(let[o,a]of e.entries()){if(typeof o=="string"&&oe(o))throw new b(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");m(o,`${t}[key]`,r),m(a,`${t}[${String(o)}]`,r)}return e}if(e instanceof Set){let o=0;for(let a of e.values())m(a,`${t}[${o++}]`,r);return e}if(Array.isArray(e))return e.forEach((o,a)=>m(o,`${t}[${a}]`,r)),e;for(let[o,a]of Object.entries(e)){if(oe(o))throw new b(`${t}.${o}`,"forbidden-key-name");m(a,`${t}.${o}`,r,o)}return e}import{createHash as He}from"node:crypto";var se=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),ye=Object.freeze(Object.fromEntries(se.map((e,t)=>[e,Object.freeze(t+1<se.length?[se[t+1]]:[])]))),we=new Set(["signed","broadcast"]);function ie(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ie).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ie(e[t])}`).join(",")}}`}function Be(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function W(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))W(t)}return e}function ce(e,t="fact"){try{m(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function Ee(e){return He("sha256").update(ie(e)).digest("hex")}function xe({tradeId:e,state:t,fact:r,asOf:n,previousHash:o,external:a}){let s={tradeId:e,state:t,asOf:n,previousHash:o??null,external:a===!0,fact:Be(r)};return W({...s,hash:Ee(s)})}function Ae({tradeId:e,intent:t,asOf:r=0}={}){if(!e||typeof e!="string")throw new Error("tradeId is required");if(!t||typeof t!="object"||Array.isArray(t))throw new Error("intent fact is required");ce(t,"intent");let n=xe({tradeId:e,state:"intent",fact:t,asOf:r,previousHash:null,external:!1});return W({tradeId:e,state:"intent",events:[n],headHash:n.hash,custody:"none",execution:"prepare-only"})}function Se(e,t,r,n={}){if(J(e),!(ye[e.state]||[]).includes(t))throw new Error(`invalid trade transition ${e.state} -> ${t}`);if(!r||typeof r!="object"||Array.isArray(r))throw new Error(`${t} fact is required`);ce(r,t);let a=n.external===!0||n.externallySupplied===!0;if(we.has(t)&&!a)throw new Error(`${t} must be an externally supplied fact; this module never signs or broadcasts`);let s=e.events.at(-1),i=n.asOf??s.asOf;if(!Number.isFinite(Number(i))||Number(i)<Number(s.asOf))throw new Error("asOf must be finite and monotonic");let l=xe({tradeId:e.tradeId,state:t,fact:r,asOf:i,previousHash:s.hash,external:a});return W({...e,state:t,events:[...e.events,l],headHash:l.hash})}function J(e){if(!e||!Array.isArray(e.events)||e.events.length===0)throw new Error("invalid trade lifecycle");if(e.custody!=="none")throw new Error("trade lifecycle custody must be none");if(e.execution!=="prepare-only")throw new Error("trade lifecycle execution must be prepare-only");let t=null;for(let r=0;r<e.events.length;r+=1){let n=e.events[r],{hash:o,...a}=n;if(Ee(a)!==o)throw new Error(`trade event ${r} hash mismatch`);if(ce(n.fact,`trade event ${r} fact`),!Number.isFinite(Number(n.asOf))||t&&Number(n.asOf)<Number(t.asOf))throw new Error(`trade event ${r} asOf must be finite and monotonic`);if(n.tradeId!==e.tradeId||n.previousHash!==t?.hash&&r>0)throw new Error(`trade event ${r} chain mismatch`);if(r===0&&(n.state!=="intent"||n.previousHash!==null))throw new Error("trade lifecycle must start with intent");if(t&&!ye[t.state]?.includes(n.state))throw new Error(`invalid recorded transition ${t.state} -> ${n.state}`);if(we.has(n.state)&&n.external!==!0)throw new Error(`${n.state} is not externally supplied`);t=n}if(e.state!==t.state||e.headHash!==t.hash)throw new Error("trade lifecycle head mismatch");return!0}var Ve=["0x000000000022d473030f116ddee9f6b43ac78ba3"],Fe={4663:["0xcaf681a66d020601342297493863e78c959e5cb2","0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7","0x1f7d7550b1b028f7571e69a784071f0205fd2efa","0x0bd7d308f8e1639fab988df18a8011f41eacad73","0x5fc5360d0400a0fd4f2af552add042d716f1d168","0xb477751b76cf82d00a686a1232f5fcd772414af3","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1"],8453:["0x2626664c2603336e57b271c5c0b26f421741e481","0x6ff5693b99212da76ad316178a184ab56d299b43","0x3d4e44eb1374240ce5f1b871ab261cd16335b76a","0x33128a8fc17869897dce68ed026d694621f6fdfd","0x4200000000000000000000000000000000000006","0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","0xbe6d8f0d05cc4be24d5167a3ef062215be6d18a5","0x254cf9e1e6e233aa1ac962cb9b05b2cfeaae15b0","0x5e7bb104d84c7cb9b682aac2f3d509f5f406809a","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x888888888889758f76e7103c6cbf23abbf58f946","0x3f170631ed9821ca51a59d996ab095162438dc10","0x4f37a9d177470499a2dd084621020b023fcffc1f","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],42161:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x61ffe014ba17989e743c5f6cb21bf9697530b21e","0x82af49447d8a07e3bd95bd0d56f35241523fbab1","0xaf88d065e77c8cc2239327c5edb3a432268e5831","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9","0x888888888889758f76e7103c6cbf23abbf58f946","0xeaedc32a51c510d35ebc11088fd5ff2b47aacf2e","0x2191718cd32d02b8e60badffea33e4b5dd9a0a0d","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110","0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41","0x7452c558d45f8afc8c83dae62c3f8a5be19c71f6"],1:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x4cd00e387622c35bddb9b4c962c136462338bc31","0x6a000f20005980200259b80c5102003040001068","0xae563e3f8219521950555f5962419c8919758ea2","0x45312ea0eff7e09c83cbe249fa1d7598c4c8cd4e","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],137:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x0dcded3545d565ba3b19e683431381007245d983"],10:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xe2fa4e1d17725e72dcdafe943ecf45df4b9e285b","0x0dcded3545d565ba3b19e683431381007245d983"],56:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xa72c85c258a81761433b4e8da60505fe3dd551cc"],43114:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xf39ca6ede9bf7820a952b52f3c94af526bab9015","0x0dcded3545d565ba3b19e683431381007245d983","0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2","0x820f5ffc5b525cd4d88cd91acf2c28f16530cc68"],999:["0x0a0758d937d1059c356d4714e57f5df0239bce1a","0xd2002373543ce3527023c75e7518c274a51ce712"],2741:["0x4f8c9056bb8a3616693a76922fa35d53c056e5b3"],988:["0x026f252016a7c47cdef1f05a3fc9e20c92a49c37","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1","0x817997ca8394e26cce3de3a076a4889b27dbf9de","0x3dea4be5615974f31624404ef288ba3b36dfeb83","0xeaf7ac0fdf150cdd89340fb762d83848de6a7b83","0x779ded0c9e1022225f8e0630b35a9b54be713736","0xbc6f7725f08232c151b528bdfcaaf89993ca86ee"]};function _e(e){let t=Fe[Number(e)]||[];return new Set([...t,...Ve].map(r=>String(r).trim().toLowerCase()).filter(Boolean))}var C=100;var lr=300*1e3,dr=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();var wr=Object.freeze({NONE:"none",PREPARE_CHECKSUM:"prepare-checksum",PREPARE_HMAC:"prepare-hmac"});var Er=Object.freeze(["signature","signedTx","signedTransaction","rawTransaction","signedPayload","signedRaw"]),xr=Object.freeze(["txid","txHash","transactionHash","broadcastHash"]),Ar=Object.freeze(["tee-attestation","remote-attestation","hardware-enclave","trusted-execution-environment","execution-authorization","signature","broadcast"]);var qe=Object.freeze(["signature","signedTx","signedTransaction","rawTransaction","signedPayload","signedRaw"]),Ke=Object.freeze(["txid","txHash","transactionHash","broadcastHash"]),Ge=/^0x[a-fA-F0-9]{40}$/;function Ue(e,t=process.env){let r=t&&typeof t=="object"?t:process.env,n=String(r.ORACLE_DEST_ALLOWLIST||r.MAD_DEST_ALLOWLIST||"").split(",").map(s=>s.trim().toLowerCase()).filter(Boolean),o=Number(e),a=Number.isInteger(o)&&o>0?[..._e(o)]:[];return new Set([...n,...a])}function We(e){return!e||typeof e!="object"?!1:!!(e.slippageGuard||e.slippageBps!=null||e.slippage!=null||e.tokenIn||e.tokenOut||e.amountIn!=null||e.amountOut!=null)}function Je(e){return!e||typeof e!="object"?!1:!!(e.transaction||e.tx||e.to||e.destination||e.settlement||e.data||e.value!=null)}function Ze(e={}){let t=e.transaction&&typeof e.transaction=="object"?e.transaction:e.tx&&typeof e.tx=="object"?e.tx:e;return{to:t.to||e.to||e.destination||e.settlement||null,chainId:t.chainId??e.chainId??e.chain??null,data:t.data||e.data||null,value:t.value??e.value??null}}function Ye(e){let t=e.slippageGuard||e.madSlippage;return t&&t.selectedBps!=null?Number(t.selectedBps):t&&t.capBps!=null&&e.slippageBps==null?Number(t.capBps):e.slippageBps!=null?Number(e.slippageBps):e.slippage&&typeof e.slippage=="object"&&e.slippage.bps!=null?Number(e.slippage.bps):null}function ue(e,t={}){let r=[],n={unsigned:!1,destination:"n/a",slippage:"n/a"};if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,checks:n,errors:["prepared fact must be an object"]};e.signed===!0&&r.push("prepared fact is signed"),e.broadcast===!0&&r.push("prepared fact claims broadcast");for(let o of qe)e[o]&&r.push(`prepared fact carries ${o}`);for(let o of Ke)e[o]&&r.push(`prepared fact claims executed ${o}`);if(n.unsigned=r.length===0,Je(e)){let o=Ze(e),a=o.to==null?"":String(o.to).trim();if(!a)r.push("prepared transaction is missing destination"),n.destination="missing";else{let s=Ge.test(a);if(a.startsWith("0x")&&!s)r.push("prepared destination is not a 20-byte address"),n.destination="malformed";else{let i=Ue(o.chainId,t.env),l=a.toLowerCase(),x=!!(e.routeAttestation||e.madRoute||e.vaultGuard||e.madVault);i.size>0&&s&&!i.has(l)&&!x?(r.push(`destination ${l} not allowlisted`),n.destination="blocked"):n.destination=i.size===0?"unset":"allowlisted"}}}if(We(e)){let o=Ye(e),a=e.slippageGuard?.capBps!=null?Number(e.slippageGuard.capBps):C;!Number.isInteger(o)||o<0?(r.push("swap prepare is missing integer slippage bps"),n.slippage="missing"):o>C||Number.isInteger(a)&&o>a||Number.isInteger(a)&&a>C?(r.push(`slippage ${o} exceeds cap ${Math.min(a,C)}`),n.slippage="blocked"):n.slippage="ok"}return{ok:r.length===0,checks:n,errors:r}}var Xe=(process.env.ORACLE_REDACT_SECRETS??"true").toLowerCase(),ke=["1","true","yes","on"].includes(Xe),Qe=[/sk-[A-Za-z0-9_-]{10,}/g,/sk_live_[A-Za-z0-9]{10,}/g,/sk_test_[A-Za-z0-9]{10,}/g,/ghp_[A-Za-z0-9]{10,}/g,/github_pat_[A-Za-z0-9_]{10,}/g,/gho_[A-Za-z0-9]{10,}/g,/ghs_[A-Za-z0-9]{10,}/g,/xox[baprs]-[A-Za-z0-9-]{10,}/g,/AIza[A-Za-z0-9_-]{30,}/g,/AKIA[A-Z0-9]{16}/g,/pplx-[A-Za-z0-9]{10,}/g,/hf_[A-Za-z0-9]{10,}/g,/xai-[A-Za-z0-9]{30,}/g,/gsk_[A-Za-z0-9]{10,}/g,/npm_[A-Za-z0-9]{10,}/g,/tvly-[A-Za-z0-9]{10,}/g,/Bearer\s+[A-Za-z0-9\-._~+/]+=*/gi],et=/\b0x[a-fA-F0-9]{64}\b/g,tt=/-----BEGIN (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----/g,rt=/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,nt=/\b([A-Z][A-Z0-9_]{0,40}(?:API_?KEY|TOKEN|SECRET|PASSWORD|PASSWD|PRIVATE_?KEY|MNEMONIC|SEED|AUTH)[A-Z0-9_]{0,20})\s*=\s*(['"]?)(\S+)\2/g,ot=/^(?:export\s+)?((?:api[_-]?key|token|secret|password|private[_-]?key|mnemonic|seed[_-]?phrase|authorization))\s*[:=]\s*(['"]?)([^\s&]+)\2/gim,at=/("(?:api[_-]?key|apiKey|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key|privateKey|secret|password|authorization|bearer|mnemonic|seedPhrase)"\s*:\s*")([^"]{6,})(")/gi,st=new Set(["access_token","refresh_token","id_token","token","api_key","apikey","client_secret","password","auth","jwt","session","secret","key","code","signature","x-amz-signature","private_key","authorization"]),Tr=new Set([...st].map(e=>e.replace(/[^a-z0-9]/gi,"").toLowerCase()));function it(e){let t=String(e??"");return t.length<18?"[REDACTED]":`${t.slice(0,6)}\u2026${t.slice(-4)}`}function $e(e){return`\xABredacted:${String(e??"").slice(0,4)}\u2026\xBB`}function O(e,t={}){if(e==null)return e;let r=typeof e=="string"?e:String(e);if(!r||!(t.force||ke))return r;let n=t.fileRead?$e:it;r=r.replace(tt,"[REDACTED_PRIVATE_KEY]"),r=r.replace(et,"[REDACTED_EVM_KEY]"),r=r.replace(rt,o=>n(o));for(let o of Qe)o.lastIndex=0,r=r.replace(o,a=>n(a));return r=r.replace(nt,(o,a,s,i)=>/^(?:os\.(?:getenv|environ)|process\.env|\$ENV\{)/.test(i)?`${a}=${s||""}${i}${s||""}`:`${a}=${s||""}${n(i)}${s||""}`),r=r.replace(ot,(o,a,s,i)=>o.replace(i,n(i))),r=r.replace(at,(o,a,s,i)=>`${a}${n(s)}${i}`),r}function j(e,t={}){if(!(t.force||ke)||e==null)return e;if(typeof e=="string")return O(e,t);if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(r=>j(r,t));if(typeof e=="object"){let r={};for(let[n,o]of Object.entries(e)){let a=/private|secret|password|mnemonic|seed|api[_-]?key|token|authorization|bearer/i.test(n);typeof o=="string"&&a?r[n]=t.fileRead?$e(o):"[REDACTED]":r[n]=j(o,t)}return r}try{return O(String(e),t)}catch{return"[REDACTED]"}}var E=1,Dr=Object.freeze(["answered","prepared","refused","unavailable"]),lt=Object.freeze({mode:"prepare-only",requiresWalletSignature:!0,backendSigner:!1,signed:!1,broadcast:!1}),dt=Object.freeze({type:"object",properties:Object.freeze({schemaVersion:Object.freeze({const:E}),prompt:Object.freeze({type:"string",minLength:1,maxLength:8e3})}),required:Object.freeze(["schemaVersion","prompt"]),additionalProperties:!1}),pt=32*1024,X=64*1024,te=64*1024,Te=32*1024,mt=8,bt=12,ht=new Set(["sign","signed","signature","signer","signhash","action","actions","watch","receipt","broadcast","submit","execute","sendrawtransaction"]),gt=new Set(["list","show"]),yt=new Set(["call","catalog","health"]),wt=new Set(["swap","bridge","prepare","prepare-bridge"]),Re=new Set(["quote_comparison","simulation","prepared","approval","settlement","balance_delta","position"]),Ie=new Set(["signed","broadcast"]),Et=Object.freeze({type:"string",minLength:1,maxLength:256}),fe=Object.freeze({type:"object",additionalProperties:!0});function Oe(e,t,r){return Object.freeze({type:"function",function:Object.freeze({name:e,description:t,strict:!0,parameters:Object.freeze(r)})})}var Ne=Object.freeze([Oe("oracle_cli","Run one structurally allowlisted Oracle read or unsigned preparation command. It cannot sign, broadcast, watch, manage actions, or retrieve receipts.",{type:"object",properties:Object.freeze({argv:Object.freeze({type:"array",minItems:1,maxItems:24,items:Object.freeze({type:"string",maxLength:1e3}),description:"Allowed: chain list/show; data call/catalog/health; scan; route swap/bridge/prepare/prepare-bridge; prepare."})}),required:Object.freeze(["argv"]),additionalProperties:!1}),Oe("trade_lifecycle","Create, verify, or advance an ephemeral prepare-only trade lifecycle. Signed and broadcast states are refused. Only returned, hash-valid explicit events count as lifecycle evidence.",{type:"object",properties:Object.freeze({action:Object.freeze({type:"string",enum:Object.freeze(["create","verify","advance"])}),tradeId:Et,intent:fe,lifecycle:fe,state:Object.freeze({type:"string",enum:Object.freeze([...Re])}),fact:fe,asOf:Object.freeze({type:"number"})}),required:Object.freeze(["action"]),additionalProperties:!1})]),xt=["You are Oracle's prepare-only task adapter.","You have exactly two tools: oracle_cli and trade_lifecycle.","Never claim that you signed or broadcast. Never request or expose a key, token, mnemonic, signer, signature, watch, action, or receipt.","A request and your prose are not lifecycle evidence. Use tools for facts. PREPARED is established only by a verified unsigned artifact returned by oracle_cli.","The caller's wallet must review and sign every prepared artifact."].join(" ");function S(e){return Buffer.byteLength(String(e??""),"utf8")}function L(e,t,r=[]){if(!e||typeof e!="object"||Array.isArray(e))return"tool arguments must be an object";for(let o of t)if(!(o in e))return`${o} is required`;let n=new Set([...t,...r]);for(let o of Object.keys(e))if(!n.has(o))return`unexpected argument: ${o}`;return null}function de(e,t){try{return m(e,t),ae(e),null}catch{return`${t} contains forbidden secret or custody material`}}function At(e){let t=String(e||"").toLowerCase().match(/[a-z]+/g)||[];for(let r of[12,15,18,21,24])for(let n=0;n+r<=t.length;n+=1)try{if(ut(t.slice(n,n+r).join(" "),ft))return!0}catch{}return!1}function St(e){let t=String(e||"");return O(t,{force:!0})!==t||/\b(?:xprv|tprv|yprv|zprv)[1-9A-HJ-NP-Za-km-z]{100,}\b/.test(t)||/\b[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}\b/.test(t)||At(t)?"prompt contains forbidden secret material":null}function Q(e){return JSON.parse(JSON.stringify(e))}function P(e,t,r){let n;try{n=JSON.stringify(e)}catch{throw new TypeError(`${r} must be JSON-serializable`)}if(n===void 0&&(n="null"),Buffer.byteLength(n,"utf8")>t)throw new TypeError(`${r} exceeds size limit`);return n}function _t(e,t){let r=String(e??"");if(S(r)<=t)return r;let n=Math.min(r.length,t);for(;n>0&&S(r.slice(0,n))>t;)n-=Math.max(1,Math.ceil((S(r.slice(0,n))-t)/2));return`${r.slice(0,n)}
|
|
2
2
|
[truncated]`}function g(e,t=Te){let r=O(String(e??""),{force:!0});return r=r.replace(/("(?:signature|signedTransaction|rawTransaction|wif|xprv)"\s*:\s*")[^"]*(")/gi,"$1[REDACTED]$2"),_t(r,t)}function Ce(e){let t=P(e,te,"task egress"),r=t.replace(/"requiresWalletSignature"\s*:/g,'"walletReviewRequired":').replace(/"lifecycleHeadHash"\s*:/g,'"hash":'),n=JSON.parse(r);return ae(n),t}function z(e){let t=e instanceof Error?e.message:String(e||"task adapter error");return g(t,1e3)}function je(e,t,r){let n=[t,r].filter(o=>typeof o=="function");return(o,a={})=>{let s=Object.freeze({schemaVersion:E,taskId:e,type:o,...a});try{Ce(s)}catch{return o==="error"?void 0:je(e,t,r)("error",{code:"unsafe_event",message:"task event was suppressed"})}for(let i of n)try{i(s)}catch{}}}function ve(e){if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,error:"request must be an object"};let t=Object.keys(e);if(t.length!==2||!t.includes("schemaVersion")||!t.includes("prompt"))return{ok:!1,error:"request must contain exactly schemaVersion and prompt"};if(e.schemaVersion!==E)return{ok:!1,error:`schemaVersion must be ${E}`};if(typeof e.prompt!="string"||e.prompt.trim()==="")return{ok:!1,error:"prompt must be a non-empty string"};if(e.prompt.length>dt.properties.prompt.maxLength||S(e.prompt)>pt)return{ok:!1,error:"prompt exceeds size limit"};let r=St(e.prompt);return r?{ok:!1,error:r}:{ok:!0,value:{schemaVersion:E,prompt:e.prompt}}}function Mr(e){let t=ve(e);if(!t.ok)throw new TypeError(t.error);return t.value}function v(e){return String(e||"").trim().toLowerCase().replace(/^--?/,"").split("=",1)[0]}function kt(e){if(!Array.isArray(e)||e.length<1||e.length>24)return{ok:!1,error:"argv must contain 1 to 24 arguments"};if(e.some(n=>typeof n!="string"||n.length===0||n.length>1e3))return{ok:!1,error:"every argv item must be a non-empty string no longer than 1000 characters"};let t=de(e,"oracle_cli arguments");if(t)return{ok:!1,error:t};for(let n of e){let o=v(n);if(ht.has(o))return{ok:!1,error:`command not allowed: ${o}`}}let r=v(e[0]);if(r==="chain"){let n=v(e[1]);return gt.has(n)?{ok:!0}:{ok:!1,error:`command not allowed: chain${n?` ${n}`:""}`}}if(r==="data"){let n=v(e[1]);return yt.has(n)?n==="call"&&(e.length<4||!e[2].trim()||!e[3].trim())?{ok:!1,error:"data call requires provider and operation"}:{ok:!0}:{ok:!1,error:`command not allowed: data${n?` ${n}`:""}`}}if(r==="route"){let n=v(e[1]);return wt.has(n)?{ok:!0}:{ok:!1,error:`command not allowed: route${n?` ${n}`:""}`}}return r==="scan"||r==="prepare"?{ok:!0}:{ok:!1,error:`command not allowed: ${g(r||"(empty)",100)}`}}function $t(e){return e[0]==="prepare"||e[0]==="route"&&(e[1]==="prepare"||e[1]==="prepare-bridge")}function Ot(e){let t=e?.arguments??e?.args??e?.input??e?.function?.arguments??{};if(t&&typeof t=="object"&&!Array.isArray(t))return P(t,X,"tool arguments"),Q(t);if(typeof t!="string"||S(t)>X)throw new TypeError("tool arguments must be bounded JSON");let r=JSON.parse(t||"{}");if(!r||typeof r!="object"||Array.isArray(r))throw new TypeError("tool arguments must be an object");return r}function Nt(e){let t=e?.toolCalls??e?.tool_calls??e?.message?.tool_calls??[];return Array.isArray(t)?t.map((r,n)=>({id:String(r?.id||`task-tool-${n+1}`),name:String(r?.name??r?.function?.name??""),source:r})):[]}function Tt(e,t){let r=e?.text??e?.content??e?.message?.content;return typeof r=="string"?r:t.join("")}async function Rt(e,t){let r=typeof e=="function"?e:typeof e?.complete=="function"?e.complete.bind(e):typeof e?.run=="function"?e.run.bind(e):null;if(!r)throw new TypeError("task provider is unavailable");return r(t)}function It(e){return e?.aborted===!0}function Ct(){let e=new Error("task was stopped");return e.name="AbortError",e}function h(e){if(It(e))throw Ct()}function ee(e){if(Array.isArray(e))return e.map(ee);if(!e||typeof e!="object")return e;let t={};for(let[r,n]of Object.entries(e))/(?:private[_-]?key|signature|signed(?:tx|transaction|payload|raw)|rawtransaction|mnemonic|seed|wif|xprv|password|bearer|api[_-]?key|access[_-]?token|auth[_-]?token|keystore)/i.test(r)?t[r]="[REDACTED]":t[r]=ee(n);return t}function jt(e){let t=ee(j(e,{force:!0})),r=P(t,te,"tool output");return{value:JSON.parse(r),json:r}}function vt(e,t){if(e&&typeof e=="object"&&e.ok===!1)return null;let r=null;if(typeof e=="string"?r=e:typeof e?.stdout=="string"?r=e.stdout:typeof e?.output=="string"&&(r=e.output),r==null)return null;let n=O(r,{force:!0});if(S(n)>te)return null;let o;try{o=JSON.parse(n.trim())}catch{return null}if(!o||typeof o!="object"||Array.isArray(o))return null;let a=o.prepared&&typeof o.prepared=="object"?o.prepared:o.artifact&&typeof o.artifact=="object"?o.artifact:o;if(!a||typeof a!="object"||Array.isArray(a))return null;let{requiresWalletSignature:s,...i}=a;if(de(i,"prepared artifact")||a.execution!=null&&a.execution!=="prepare-only"||a.requiresWalletSignature!=null&&a.requiresWalletSignature!==!0||a.backendSigner!=null&&a.backendSigner!==!1)return null;let l=ue(a);return l.ok?Object.freeze({command:Object.freeze([...t]),artifact:Object.freeze(Q(a)),checks:Object.freeze(Q(l.checks))}):null}function pe(e){return e?.events?.some(t=>Ie.has(t?.state))}function Lt(e,t){if(J(e),pe(e))throw new TypeError("signed and broadcast lifecycle states are not accepted");let r=e.events.at(-1);if(!r||r.hash!==e.headHash||r.state!==e.state)throw new TypeError("trade lifecycle has no explicit head event");let n={lifecycleState:String(r.state).toUpperCase(),lifecycleHeadHash:r.hash,prepareVerified:t===!0};return Object.freeze(n)}function Y(e=!1){return Object.freeze({lifecycleState:"NONE",lifecycleHeadHash:null,prepareVerified:e===!0})}function zt(e){let t=L(e,["action"],["tradeId","intent","lifecycle","state","fact","asOf"]);if(t)return t;let r=de(e,"trade_lifecycle arguments");if(r)return r;if(!new Set(["create","verify","advance"]).has(e.action))return"unknown trade lifecycle action";if(e.lifecycle&&pe(e.lifecycle))return"signed and broadcast lifecycle states are not accepted";if(e.state&&Ie.has(e.state))return`${e.state} lifecycle state is not accepted`;if(e.action==="create")return L(e,["action","tradeId","intent"],["asOf"]);if(e.action==="verify")return L(e,["action","lifecycle"]);if(e.action==="advance"){let n=L(e,["action","lifecycle","state","fact"],["asOf"]);if(n)return n;if(!Re.has(e.state))return`lifecycle state is not accepted: ${String(e.state)}`}return null}function Pt(e,t={}){let r=zt(e);if(r)return{ok:!1,refused:!0,error:r};let n=t.createTradeLifecycle||Ae,o=t.advanceTradeLifecycle||Se,a=t.assertTradeLifecycle||J;try{if(e.action==="create"){let i=n({tradeId:e.tradeId,intent:e.intent,asOf:e.asOf});return a(i),{ok:!0,lifecycle:i}}if(e.action==="verify"){if(a(e.lifecycle),pe(e.lifecycle))throw new TypeError("signed and broadcast lifecycle states are not accepted");return{ok:!0,valid:!0,lifecycle:e.lifecycle}}if(a(e.lifecycle),e.state==="prepared"){let i=ue(e.fact);if(!i.ok)return{ok:!1,refused:!0,error:`prepare verifier failed: ${i.errors[0]}`}}let s=o(e.lifecycle,e.state,e.fact,{asOf:e.asOf});return a(s),{ok:!0,lifecycle:s}}catch(s){return{ok:!1,refused:!0,error:z(s)}}}function Z(e,t,r,n,o){let a={schemaVersion:E,taskId:e,status:t,text:g(r||""),custody:lt,prepared:n||null,evidence:o||Y(!!n)};return Ce(a),Object.freeze(a)}function Dt(e,t){return{role:"assistant",content:g(e||""),tool_calls:t.map(r=>({id:r.id,type:"function",function:{name:r.name,arguments:typeof(r.source?.arguments??r.source?.function?.arguments)=="string"?g(r.source.arguments??r.source.function.arguments,X):P(ee(j(r.source?.arguments??r.source?.args??r.source?.input??{},{force:!0})),X,"tool arguments")}}))}}function Mt(e,t){let r=t.taskId??(typeof e.taskIdFactory=="function"?e.taskIdFactory():null),n=r==null?`task-${ct()}`:String(r);if(!/^[A-Za-z0-9._:-]{1,128}$/.test(n))throw new TypeError("taskId must be a bounded opaque identifier");return n}function le(e,t){return Object.freeze({lifecycleState:e?.lifecycleState||"NONE",lifecycleHeadHash:e?.lifecycleHeadHash||null,prepareVerified:t===!0})}function Le(e={}){let t=e.provider,r=e.onEvent,n=Number.isInteger(e.maxSteps)&&e.maxSteps>0?Math.min(e.maxSteps,bt):mt,o=new Set,a=!1;async function s(l,x={}){let _=Mt(e,x),f=je(_,r,x.onEvent),D=ve(l);if(!D.ok){let d=Z(_,"refused",D.error,null,Y());return f("error",{code:"invalid_request",message:D.error}),f("complete",{result:d}),d}if(a){let d=Z(_,"unavailable","task adapter is stopped",null,Y());return f("error",{code:"stopped",message:"task adapter is stopped"}),f("complete",{result:d}),d}let c=new AbortController;o.add(c);let A=x.signal||e.signal,me=()=>c.abort(A?.reason);A&&(A.aborted?c.abort(A.reason):A.addEventListener("abort",me,{once:!0}));let M="",H=null,N=Y(),y=!1,k=!1,be=!1,T=[{role:"system",content:xt},{role:"user",content:D.value.prompt}];f("accepted",{request:{schemaVersion:E}});try{h(c.signal);for(let re=0;re<n;re+=1){h(c.signal);let ne=[];f("stage",{stage:"provider",step:re+1});let V;try{V=await Rt(t,{schemaVersion:E,taskId:_,messages:Q(T),tools:Ne,signal:c.signal,onDelta:u=>{S(ne.join(""))<=Te*2&&ne.push(String(u??""))}})}catch(u){h(c.signal),k=!0,f("error",{code:"provider_unavailable",message:z(u)});break}h(c.signal),P(V,te,"provider response");let ze=Tt(V,ne),F=g(ze);F&&(M+=F,M=g(M),f("delta",{text:F}));let q=Nt(V);if(q.length===0){be=!0;break}if(q.length>4){y=!0,f("stage",{stage:"tool",outcome:"refused",reason:"too_many_calls"});break}T.push(Dt(F,q));for(let u of q){h(c.signal);let w;try{w=Ot(u.source)}catch(K){y=!0;let G={ok:!1,error:`tool refused: ${z(K)}`};T.push({role:"tool",tool_call_id:u.id,name:u.name,content:JSON.stringify(G)}),f("stage",{stage:"tool",tool:g(u.name,100),outcome:"refused"});continue}let p;if(u.name==="oracle_cli"){let K=L(w,["argv"]),G=K?{ok:!1,error:K}:kt(w.argv);if(!G.ok)y=!0,p={ok:!1,error:`tool refused: ${G.error}`};else{h(c.signal);try{typeof e.runOracleCli=="function"?p=await e.runOracleCli(w.argv,{signal:c.signal}):typeof e.toolRunner=="function"?p=await e.toolRunner("oracle_cli",w,{signal:c.signal}):(k=!0,p={ok:!1,error:"oracle_cli runner is unavailable"})}catch(U){h(c.signal),k=!0,p={ok:!1,error:z(U)}}if(h(c.signal),$t(w.argv)){let U=vt(p,w.argv);U&&(H=U,N=le(N,!0))}}}else u.name==="trade_lifecycle"?p=Pt(w,e.lifecycle):(y=!0,p={ok:!1,error:`tool refused: unknown tool ${g(u.name,100)}`});h(c.signal);let $=jt(p);if(($.value?.refused===!0||/^tool refused:/i.test(String($.value?.error||"")))&&(y=!0),$.value?.lifecycle)try{N=Lt($.value.lifecycle,!!H)}catch{}T.push({role:"tool",tool_call_id:u.id,name:u.name,content:$.json}),f("stage",{stage:"tool",tool:u.name==="oracle_cli"||u.name==="trade_lifecycle"?u.name:"unknown",outcome:$.value?.ok===!1?"refused":"complete"})}}!be&&!y&&!k&&T.at(-1)?.role==="tool"&&(k=!0,f("error",{code:"step_limit",message:"task step limit reached"}));let d=y?"refused":H?"prepared":k?"unavailable":"answered",R=y?null:H,B=le(N,!!R),I=Z(_,d,M,R,B);return f("complete",{result:I}),I}catch(d){let R=d?.name==="AbortError"||c.signal.aborted,B=R?"task was stopped":z(d),I=Z(_,"unavailable",B,null,le(N,!1));return f("error",{code:R?"aborted":"adapter_error",message:B}),f("complete",{result:I}),I}finally{A&&A.removeEventListener("abort",me),o.delete(c)}}function i(l="task adapter stopped"){a=!0;for(let x of o)x.abort(l)}return Object.freeze({prepare:s,stop:i,tools:Ne})}async function Ht(e,t={}){return Le(t).prepare(e,{signal:t.signal,onEvent:t.turnEvent})}var Hr=Le,Br=Ht;export{lt as TASK_CUSTODY_MARKERS,dt as TASK_PREPARE_REQUEST_SCHEMA,Dr as TASK_RESULT_STATUSES,E as TASK_SCHEMA_VERSION,Ne as TASK_TOOLS,Mr as assertTaskPrepareRequest,Hr as createOracleTaskAdapter,Le as createTaskAdapter,Ht as prepareOracleTask,Br as prepareTask,kt as validateTaskOracleCommand,ve as validateTaskPrepareRequest};
|
package/dist/teams/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
var
|
|
2
|
-
[Message content truncated for durable storage.]`,pn=200,mn=512*1024,hn=64*1024,gn=48*1024;function O(e){return String(e??"").trim()}function yn(e){return O(e).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")}function je(e){return Buffer.byteLength(JSON.stringify(e),"utf8")}function wn(e,t){let n=String(e??"");if(Buffer.byteLength(n,"utf8")<=t)return n;let r=0,o=n.length;for(;r<o;){let c=Math.ceil((r+o)/2);Buffer.byteLength(n.slice(0,c),"utf8")<=t?r=c:o=c-1}let i=n.slice(0,r);return new RegExp("\\p{Surrogate}$","u").test(i)&&(i=i.slice(0,-1)),i}function bn(e){let t=O(e?.text),n=Math.max(0,gn-Buffer.byteLength(ot,"utf8")),r=Buffer.byteLength(t,"utf8")>n,o=Array.isArray(e?.artifacts)?e.artifacts:[],i=e?.generator&&typeof e.generator=="object"&&!Array.isArray(e.generator)?{kind:O(e.generator.kind).slice(0,80),provider:O(e.generator.provider).slice(0,120),model:O(e.generator.model).slice(0,160)}:void 0;return{id:O(e?.id).slice(0,200)||"message-compacted",sender:O(e?.sender).slice(0,200)||"system",name:O(e?.name).slice(0,200)||"Oracle",text:`${wn(t,n)}${ot}`,state:O(e?.state).slice(0,80)||"complete",createdAt:O(e?.createdAt).slice(0,80),artifacts:[],...e?.fallback===!0?{fallback:!0}:{},...e?.offline===!0?{offline:!0}:{},...i?{generator:i}:{},contentTruncated:!0,...o.length?{omittedArtifacts:o.length}:{},...!r&&o.length?{artifactPayloadTruncated:!0}:{}}}function kn(e){let t=structuredClone(e);return je(t)<=hn?t:bn(t)}function An(e){let t=0,n="";for(let r of e){if(r?.historyTruncated!==!0)continue;let o=Number(r.omittedMessages);Number.isSafeInteger(o)&&o>0&&(t+=o),n||(n=O(r.createdAt))}return{omittedMessages:t,createdAt:n}}function xn(e,t){return{id:fn,sender:"system",name:"Oracle",text:`[Earlier team history omitted: ${e} ${e===1?"message":"messages"} pruned for durable storage.]`,state:"complete",createdAt:O(t),artifacts:[],historyTruncated:!0,omittedMessages:e}}function we(e,t={}){if(!e||typeof e!="object"||!Array.isArray(e.messages))throw new TypeError("Invalid team thread state");let n=Number.isSafeInteger(t.maxMessages)&&t.maxMessages>0?t.maxMessages:pn,r=Number.isSafeInteger(t.maxBytes)&&t.maxBytes>0?t.maxBytes:mn,o=An(e.messages),i=o.omittedMessages,c=e.messages.filter(y=>y?.historyTruncated!==!0).map(kn),u=Number.isSafeInteger(t.dropOldest)&&t.dropOldest>0?Math.min(t.dropOldest,c.length):0;if(u>0&&(c=c.slice(u),i+=u),c.length>n){let y=c.length-n;c=c.slice(y),i+=y}let g=()=>({...e,messages:[...i>0?[xn(i,o.createdAt||c[0]?.createdAt)]:[],...c]});for(;c.length>0&&je(g())>r;)c=c.slice(1),i+=1;let m=g();if(je(m)>r)throw new Error("team thread metadata exceeds durable size budget");return m}function it(e,t){let n=Number.isSafeInteger(t)&&t>0?t:0;return we(e,{dropOldest:n})}function st(e,t){return e.slice(t.length).trim()}function ze(e=cn(16)){let t=Buffer.from(e).toString("hex");if(!/^[0-9a-f]{32}$/.test(t))throw new TypeError("Team session entropy must be exactly 16 bytes");return`ses-${t}`}function be(e){return dn.test(String(e??""))}function Sn({text:e,agents:t,leadAgentId:n}){let r=O(e);if(!r)throw new TypeError("Message is required");if(!Array.isArray(t)||t.length===0)throw new TypeError("Group needs at least one agent");let o=r.match(/^@(team|all)(?:\s+|$)/i);if(o)return{kind:"broadcast",targetAgentIds:t.map(c=>c.id),text:st(r,o[0])};if(r.startsWith("@")){let u=t.flatMap(m=>[{agent:m,mention:`@${O(m.id)}`},{agent:m,mention:`@${O(m.name)}`},{agent:m,mention:`@${yn(m.name)}`}]).sort((m,y)=>y.mention.length-m.mention.length).find(({mention:m})=>{let y=r.slice(0,m.length),I=r.at(m.length);return y.toLowerCase()===m.toLowerCase()&&(!I||/\s|[:,]/.test(I))});if(!u)throw new TypeError("Unknown agent mention");let g=st(r,u.mention).replace(/^[:,]\s*/,"");return{kind:"mention",targetAgentIds:[u.agent.id],text:g}}return{kind:"lead",targetAgentIds:[(t.find(c=>c.id===n)??t[0]).id],text:r}}function En(e,t=[]){let n=O(e?.provider);return n?new Set(t.map(o=>O(o))).has(n)?{status:"online"}:{status:"offline",reason:`${n} is not connected`}:{status:"online"}}function Tn(e){ye(e);let t=O(e?.type),n=Array.isArray(e?.actions)?e.actions:[];if(ln.test(t)||n.some(r=>un.test(O(r?.type))))throw new TypeError("Chat cannot sign, broadcast, or execute")}function ue(e,t,n,r="complete"){return{id:O(e.id)||`message-${Date.now()}`,sender:t,name:n,text:O(e.text),state:r,createdAt:O(e.createdAt)||new Date().toISOString(),artifacts:[]}}function Ne(e,t){if(Tn(t),!e||!be(e.sessionId)||!Array.isArray(e.messages))throw new TypeError("Invalid team thread state");let n=[...e.messages];if(t.type==="message.user")n.push(ue(t,"user","You"));else if(t.type==="message.system")n.push(ue(t,"system","Oracle"));else if(t.type==="agent.offline"){let r=ue(t,O(t.agentId),O(t.name)||O(t.agentId),"offline");r.offline=!0;let o=n.findIndex(i=>i.id===t.id&&i.sender===t.agentId);o>=0?n.splice(o,1,r):n.push(r)}else if(t.type==="agent.started")n.push(ue(t,O(t.agentId),O(t.name)||O(t.agentId),"thinking"));else if(t.type==="agent.output"){let r=n.findIndex(i=>i.id===t.id&&i.sender===t.agentId),o=ue(t,O(t.agentId),O(t.name)||O(t.agentId));o.fallback=t.generator?.kind==="rules",o.generator=t.generator?{...t.generator}:void 0,o.artifacts=t.artifact?[{...t.artifact}]:[],r>=0?n.splice(r,1,o):n.push(o)}else if(t.type==="artifact.prepared"){let r=n.findIndex(o=>o.id===t.messageId);if(r<0)throw new TypeError("Artifact target message was not found");n[r]={...n[r],artifacts:[...n[r].artifacts,{...t.artifact}]}}else throw new TypeError(`Unsupported team thread event: ${t.type}`);return we({...e,messages:n})}var Me=2e3,On=/^[a-z0-9][a-z0-9._-]{0,63}$/,In=/^#[0-9a-fA-F]{6}$/,$n=new Set(["deterministic","model","policy","operator"]),_n=new Set(ce.map(({id:e})=>e)),Rn=new Set(de.map(({id:e})=>e)),Ln=new Set(ae.map(({id:e})=>e)),Cn=/^p-[a-z0-9][a-z0-9_-]{0,62}$/,Hn=["secret","privatekey","seed","seedphrase","mnemonic","password","passphrase","credential","apikey","apitoken","accesstoken","authtoken","authorization","signingmaterial","walletexport","keymaterial"],ke=/(?:\bshell\b|terminal|raw[ _.-]?http|\bmcp\b|private[ _.-]?key|seed[ _.-]?phrase|mnemonic|key[ _.-]?(?:import|export)|wallet[ _.-]?(?:key|custody)|\bcustod(?:y|ial)\b|\bsign(?:ing|er)?\b|\bbroadcast(?:ing)?\b|(?:execute|place)[ _.-]?(?:transaction|trade|order|swap)s?|submit[ _.-]?transactions?|transfer[ _.-]?(?:funds|assets|tokens|coins)|hold[ _.-]?(?:keys|funds|assets)|ignore (?:the )?policy|bypass|widen (?:the )?(?:cap|policy)|reveal (?:credential|secret))/i,jn=Object.freeze(["market-evidence","breadth-evidence","technical-evidence","basket-evidence","wallet-flow","contract-evidence","mint-evidence","scored-thesis","strategy-analysis","risk-decision","approved-intent","prepared-intent","prepared-basket","receipt"]),zn=new Set(jn);function b(e){throw new TypeError(e)}function fe(e,t){(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&b(`${t} must be a plain object`)}function Nn(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function at(e){let t=Nn(e);return t==="auth"||Hn.some(n=>t.includes(n))}function De(e,t="team",n=new Set){if(e&&typeof e=="object"){n.has(e)&&b(`unsafe cyclic field at ${t}`),n.add(e);for(let[r,o]of Object.entries(e))at(r)&&b(`forbidden secret-like field ${t}.${r}`),De(o,`${t}.${r}`,n);n.delete(e)}}function A(e){return e===null||typeof e=="string"||typeof e=="boolean"?e:typeof e=="number"?(Number.isFinite(e)||b("value must be finite"),e):Array.isArray(e)?e.map(A):(fe(e,"value"),Object.fromEntries(Object.keys(e).sort().map(t=>(at(t)&&b(`forbidden secret-like field ${t}`),[t,A(e[t])]))))}function X(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))X(t);Object.freeze(e)}return e}function ie(e){return vn("sha256").update(JSON.stringify(A(e))).digest("hex")}function Z(e,t,n=500){return(typeof e!="string"||!e.trim()||e.length>n)&&b(`${t} is invalid`),e}function U(e,t){return Z(e,t,64),On.test(e)||b(`${t} is invalid`),e}function Mn(e){return(typeof e!="string"||!In.test(e))&&b("agent color is invalid"),e}function Dn(e){let t=String.raw`(?:sign(?:ing)?|broadcast(?:ing)?|(?:execute|place|submit|transfer|hold|assume)\b[^.!?\n]*?\b(?:transactions?|trades?|orders?|swaps?|funds|assets|tokens|coins|keys|custody))`,n=e.replace(new RegExp(String.raw`\b(?:never|do not|don't|cannot|can't|must not|may not)\s+(?:directly\s+)?${t}(?:\s+or\s+${t})?`,"gi"),"");return ke.test(n)||new RegExp(String.raw`\b${t}\b`,"i").test(n)}function xe(e){return typeof e=="string"&&Cn.test(e)&&!ke.test(e)}function Pe(e){return U(e,"artifact kind"),zn.has(e)||b(`artifact kind ${e} is not allowed`),e}function Ae(e,{nowMs:t=Date.now(),mode:n="shadow"}={}){fe(e,"policy"),De(e,"policy");let r=["autonomousOptIn","requiresWalletConfirmation","killSwitchRequired"];for(let i of r)typeof e[i]!="boolean"&&b(`policy.${i} must be boolean`);(!e.requiresWalletConfirmation||!e.killSwitchRequired)&&b("unsafe policy: wallet confirmation and kill switch are required");for(let i of["maxNotionalUsd","maxDailyLossUsd"])(!Number.isFinite(e[i])||e[i]<=0)&&b(`policy.${i} must be a positive finite cap`);(!Array.isArray(e.chainAllowlist)||!e.chainAllowlist.length)&&b("policy.chainAllowlist must be bounded");let o=e.chainAllowlist.map(i=>U(i,"chain id"));return new Set(o).size!==o.length&&b("duplicate chain id"),(!Number.isSafeInteger(e.expiresAt)||e.expiresAt<=t)&&b("policy expiry must be in the future"),n==="autonomous"&&!e.autonomousOptIn&&b("autonomous mode requires explicit opt-in"),{autonomousOptIn:e.autonomousOptIn,requiresWalletConfirmation:!0,killSwitchRequired:!0,maxNotionalUsd:e.maxNotionalUsd,maxDailyLossUsd:e.maxDailyLossUsd,chainAllowlist:o,expiresAt:e.expiresAt}}function Se(e,{nowMs:t=Date.now()}={}){fe(e,"team"),De(e);let n=e.kind===void 0?"pipeline":e.kind;n!=="pipeline"&&n!=="group"&&b("unsupported team kind");let r=n==="group";U(e.id,"team id"),Z(e.name,"team name",120),Ce.includes(e.mode)||b("unsupported team mode"),(!Array.isArray(e.agents)||!e.agents.length)&&b("agents must be non-empty");let o=new Set,i=e.agents.map((f,R)=>{fe(f,`agent ${R}`);let v=U(f.id,"agent id");o.has(v)&&b(`duplicate agent id ${v}`),o.add(v),Z(f.name,"agent name",120);let E=r?Z(f.role,"agent role",120):U(f.role,"agent role"),T=r&&f.color!==void 0?Mn(f.color):void 0;$n.has(f.runtime)||b("invalid agent runtime");let D=Z(f.soul,"agent Soul",Me);Dn(D)&&b("unsafe Soul authority"),(!Array.isArray(f.toolIds)||!Array.isArray(f.skillIds))&&b("tool and skill IDs must be arrays");let s=f.toolIds.map(d=>(U(d,"tool id"),(!_n.has(d)||ke.test(d))&&b(`forbidden tool ${d}`),d)),a=f.skillIds.map(d=>(U(d,"skill id"),(!Rn.has(d)&&!xe(d)||ke.test(d))&&b(`forbidden skill ${d}`),d));(new Set(s).size!==s.length||new Set(a).size!==a.length)&&b("duplicate tool or skill ID");let w=f.runtime==="model";return w?(Z(f.provider,"model provider",100),Ln.has(f.provider)||b("unsupported model provider"),Z(f.model,"model",160)):(f.provider!==void 0||f.model!==void 0)&&b("provider/model only allowed for model runtime"),!r&&f.role==="executor"&&f.runtime!=="operator"&&b("executor must use operator runtime"),!r&&f.runtime==="operator"&&f.role!=="executor"&&b("operator runtime is reserved for the executor"),r&&f.runtime==="operator"&&b("group chat agents cannot use operator runtime"),f.role!=="executor"&&s.some(d=>d==="intent.prepare"||d==="operator.handoff")&&b("executor tools require operator authority"),r&&(s.includes("intent.prepare")||s.includes("operator.handoff"))&&b("group chat agents cannot prepare operator actions"),{id:v,name:f.name,role:E,runtime:f.runtime,...w?{provider:f.provider,model:f.model}:{},soul:D,toolIds:s,skillIds:a,...T?{color:T}:{},...r&&f.packId!==void 0?{packId:U(f.packId,"pack id")}:{},...r?{autoTools:f.autoTools!==!1}:{}}});if(r){(!Array.isArray(e.edges)||e.edges.length!==0)&&b("group chat edges must be empty");let f=Z(e.summary||"A focused agent group.","team summary",500),R=e.sessionId===void 0?ze():e.sessionId;be(R)||b("group session id must use ses-hex format");let v=e.leadAgentId===void 0?i[0].id:U(e.leadAgentId,"lead agent id");o.has(v)||b("lead agent is not a group member");let E=Ae(e.policy,{nowMs:t,mode:e.mode}),T=A({kind:"group",id:e.id,sessionId:R,name:e.name,summary:f,mode:e.mode,leadAgentId:v,agents:i,edges:[],policy:E});return X({team:T,teamHash:ie(T),execution:{executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}})}let c=i.filter(f=>f.role==="executor");c.length!==1&&b("exactly one executor operator is required");let u=c[0];(!u.toolIds.includes("intent.prepare")||!u.toolIds.includes("operator.handoff"))&&b("executor requires prepare-only handoff tools"),Array.isArray(e.edges)||b("edges must be an array");let g=new Set,m=new Map([...o].map(f=>[f,[]])),y=e.edges.map(f=>{fe(f,"edge"),U(f.from,"edge source"),U(f.to,"edge target");let R=Pe(f.artifactKind);(!o.has(f.from)||!o.has(f.to))&&b("broken edge references unknown agent"),f.from===f.to&&b("cycle in team DAG");let v=`${f.from}\0${f.to}\0${R}`;return g.has(v)&&b("duplicate edge"),g.add(v),m.get(f.from).push(f.to),{from:f.from,to:f.to,artifactKind:R}}),I=new Set,N=new Set;function S(f){if(I.has(f)&&b("cycle in team DAG"),!N.has(f)){I.add(f);for(let R of m.get(f))S(R);I.delete(f),N.add(f)}}for(let f of o)S(f);m.get(u.id).length&&b("executor must be the terminal team agent");let z=f=>{let R=[f],v=new Set;for(;R.length;){let E=R.shift();if(E===u.id)return!0;v.has(E)||(v.add(E),R.push(...m.get(E)))}return!1};for(let f of o)z(f)||b(`agent ${f} is disconnected from executor`);let B=i.filter(f=>!y.some(R=>R.to===f.id));B.length!==1&&b("team pipeline requires exactly one root agent");for(let f of i){let R=y.filter(E=>E.to===f.id).length,v=y.filter(E=>E.from===f.id).length;(f.id===B[0].id?R!==0:R!==1)&&b("team pipeline requires exactly one incoming handoff per non-root agent"),(f.id===u.id?v!==0:v!==1)&&b("team pipeline requires exactly one outgoing handoff per non-executor agent")}let M=y.filter(f=>f.to===u.id);(M.length!==1||M[0].artifactKind!=="approved-intent")&&b("executor requires exactly one approved-intent input"),i.find(f=>f.id===M[0].from)?.runtime!=="policy"&&b("executor input must come from a policy agent");let _=Ae(e.policy,{nowMs:t,mode:e.mode}),Y=A({id:e.id,name:e.name,mode:e.mode,agents:i,edges:y,policy:_});return X({team:Y,teamHash:ie(Y),execution:{executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}})}var dt=new Set(ce.filter(e=>!e.signs&&!e.broadcasts).map(e=>e.id).filter(e=>!/intent\.prepare|operator\.handoff|sign|broadcast|execute/i.test(e))),lt=new Set(de.filter(e=>!e.signs&&!e.broadcasts).map(e=>e.id).filter(e=>!/armed|execution|sign|broadcast/i.test(e))),Pn=Object.freeze([Object.freeze({pattern:/sentiment|social|narrative|realtime|news/i,toolIds:["sentiment.read"],skillIds:["social-sentiment"]}),Object.freeze({pattern:/risk|review|policy|cap|exposure/i,toolIds:["risk.evaluate"],skillIds:["bounded-risk"]}),Object.freeze({pattern:/wallet|flow|holder/i,toolIds:["wallet.watch"],skillIds:["wallet-monitoring"]}),Object.freeze({pattern:/contract|token|evm|bytecode/i,toolIds:["contract.read"],skillIds:["contract-research"]}),Object.freeze({pattern:/nft|mint|collection/i,toolIds:["nft.inspect"],skillIds:["mint-research"]}),Object.freeze({pattern:/basket|relative.?value|spread/i,toolIds:["basket.construct","basket.backtest"],skillIds:["basket-trading","relative-value-risk"]}),Object.freeze({pattern:/perp|technical|funding|open interest|\boi\b|rsi|macd/i,toolIds:["perp.indicators"],skillIds:["perp-technical-analysis","perp-strategy-planning"]}),Object.freeze({pattern:/breadth|dominance|total2|total3/i,toolIds:["market.breadth"],skillIds:["crypto-market-breadth"]}),Object.freeze({pattern:/backtest|simulation/i,toolIds:["strategy.backtest"],skillIds:["bounded-backtesting"]}),Object.freeze({pattern:/plan|planner|strategy|thesis|analyst/i,toolIds:["strategy.analyze"],skillIds:["bounded-strategy-analysis"]}),Object.freeze({pattern:/research|reader|market|scan/i,toolIds:["market.scan"],skillIds:["hyperliquid-markets"]})]),Ee=Object.freeze({toolIds:Object.freeze(["market.scan"]),skillIds:Object.freeze(["hyperliquid-markets"])});function ct(e,t){return[...new Set(e)].filter(n=>t.has(n))}function qe({role:e="",soul:t=""}={}){let n=`${String(e)} ${String(t)}`.trim(),r=Pn.filter(c=>c.pattern.test(n));if(r.length===0)return{toolIds:[...Ee.toolIds],skillIds:[...Ee.skillIds]};let o=ct(r.flatMap(c=>c.toolIds),dt),i=ct(r.flatMap(c=>c.skillIds),lt);return{toolIds:o.length>0?o:[...Ee.toolIds],skillIds:i.length>0?i:[...Ee.skillIds]}}function qn(e){return dt.has(e)||lt.has(e)}import H from"node:fs";import K from"node:path";import{createHash as gt}from"node:crypto";import W from"node:fs";import re from"node:path";var Ke="https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",Kn=/^[a-z0-9]+(?:[._-][a-z0-9]+)*(?:\.[a-z0-9]+(?:[._-][a-z0-9]+)*)*$/;function Te(e){try{let t=W.lstatSync(e);return t.isDirectory()&&!t.isSymbolicLink()}catch{return!1}}function Bn(){return W.constants.O_NOFOLLOW||0}function Be(e){try{let t=W.lstatSync(e);return t.isFile()&&!t.isSymbolicLink()}catch{return!1}}function ut(e){if(!Be(e))return null;let t=W.openSync(e,W.constants.O_RDONLY|Bn());try{return W.readFileSync(t,"utf8")}finally{W.closeSync(t)}}function Fn(e){let t=[],n=[];if(!e||typeof e!="object"||Array.isArray(e))return t.push("plugin.json must be a JSON object"),{valid:!1,errors:t,warnings:n};e.$schema!==Ke&&(e.$schema?t.push(`unsupported $schema: ${e.$schema} (expected ${Ke})`):t.push("$schema is required \u2014 must be "+Ke)),!e.name||typeof e.name!="string"?t.push("name is required (string)"):Kn.test(e.name)||t.push(`name "${e.name}" must be kebab-case dot-separated (e.g. deployment.tools)`),(e.version===void 0||e.version===null||e.version==="")&&n.push("version is missing \u2014 semantic versioning recommended"),e.description!==void 0&&typeof e.description!="string"&&n.push("description must be a string"),e.author!==void 0&&(typeof e.author!="object"||Array.isArray(e.author))&&n.push("author must be an object with optional name, email, url"),e.keywords!==void 0&&(Array.isArray(e.keywords)||n.push("keywords must be an array")),e.license!==void 0&&typeof e.license!="string"&&n.push("license must be a string");let r=new Set(["$schema","name","version","description","author","homepage","repository","license","keywords","extensions"]);for(let o of Object.keys(e))r.has(o)||n.push(`unknown field "${o}" \u2014 will be ignored (use extensions.<namespace> for client data)`);return{valid:t.length===0,errors:t,warnings:n}}function Un(e){let t=re.join(e,"skills"),n=[];if(!Te(t))return n;function r(o,i=""){for(let c of W.readdirSync(o,{withFileTypes:!0})){let u=re.join(o,c.name);if(c.isDirectory()){if(!Te(u))continue;r(u,i?`${i}/${c.name}`:c.name)}else if(c.name.endsWith(".md")){if(!Be(u))continue;let g=i?`${i}/${c.name.replace(/\.md$/,"")}`:c.name.replace(/\.md$/,"");n.push({name:g,path:u,relativePath:re.relative(t,u)})}}}return r(t),n}function Gn(e){let t=re.join(e,"mcp"),n=[];if(!Te(t))return n;for(let r of W.readdirSync(t,{withFileTypes:!0})){if(!r.isFile()||!r.name.endsWith(".json"))continue;let o=re.join(t,r.name);if(Be(o))try{let i=ut(o);if(i===null)continue;let c=JSON.parse(i);n.push({name:r.name.replace(/\.json$/,""),path:o,config:c})}catch(i){n.push({name:r.name.replace(/\.json$/,""),path:o,error:`invalid JSON: ${i.message}`})}}return n}function Fe(e){let t=re.resolve(e);if(!Te(t))return{ok:!1,error:`plugin directory not found: ${t}`};let n=re.join(t,"plugin.json");if(!W.existsSync(n))return{ok:!1,error:`missing plugin.json in ${t}`};let r;try{let u=ut(n);if(u===null)return{ok:!1,error:`plugin.json must be a regular file in ${t}`};r=JSON.parse(u)}catch(u){return{ok:!1,error:`invalid plugin.json: ${u.message}`}}let o=Fn(r);if(!o.valid)return{ok:!1,error:"manifest validation failed",errors:o.errors};let i=Un(t),c=Gn(t);return{ok:!0,plugin:{name:r.name,version:r.version||"0.0.0",description:r.description||"",author:r.author||{},license:r.license||"UNLICENSED",root:t,manifest:r,skills:i,mcpServers:c,warnings:[...o.warnings]}}}var Yn=Object.freeze([{name:"private key (hex 64)",re:/\b(?:0x)?[0-9a-fA-F]{64}\b/},{name:"BTC WIF",re:/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{name:"BIP39 seed phrase",re:/\b(?:[a-z]{3,8} ){11}(?:[a-z]{3,8})\b|\b(?:[a-z]{3,8} ){23}(?:[a-z]{3,8})\b/i},{name:"AWS access key",re:/\bAKIA[0-9A-Z]{16}\b/},{name:"OpenAI key",re:/\bsk-[A-Za-z0-9_-]{20,}\b/},{name:"Anthropic key",re:/\bsk-ant-[A-Za-z0-9_-]{20,}\b/},{name:"GitHub token",re:/\bgh[pousr]_[A-Za-z0-9]{36,}\b/},{name:"Slack token",re:/\bxox[baprs]-[A-Za-z0-9-]{10,}\b/},{name:"Telegram bot token",re:/\b\d{8,10}:[A-Za-z0-9_-]{35}\b/},{name:"PEM private key",re:/-----BEGIN (?:RSA |EC |OPENSSH |PGP )?PRIVATE KEY-----/},{name:"Solana keypair array",re:/\[\s*(?:\d{1,3}\s*,\s*){63}\d{1,3}\s*\]/},{name:"credential assignment",re:/\b(?:API_?KEY|SECRET|PASSWORD|PASSWD|PRIVATE_?KEY|MNEMONIC|SEED_?PHRASE|AUTH_?TOKEN|ACCESS_?TOKEN)\s*[:=]\s*['"]?[A-Za-z0-9+/=_.-]{12,}/i},{name:"JWT",re:/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/}]),Wn=/\b(?:seed|mnemonic|recovery|phrase|backup)\b/i;function ft(e){let t=String(e??"");if(!t)return null;for(let n of Yn){let r=t.match(n.re);if(r&&!(n.name==="BIP39 seed phrase"&&!Wn.test(t))){if(n.name==="private key (hex 64)"){let o=r.index||0,i=t.slice(Math.max(0,o-80),o);if(!/priv|secret|wif|seed|mnemonic|signer|wallet|key/i.test(i)||/hash|digest|sha256|txid|commit|blob|sha1/i.test(i))continue}return{name:n.name,index:r.index??0}}}return null}import pt from"node:path";import{homedir as Jn}from"node:os";var Vn=/^[a-z0-9][a-z0-9_-]{0,63}$/;var Oo=64*1024;function Xn(e=process.env){return e&&e.ORACLE_CONFIG_DIR||pt.join(Jn(),".config","oracle")}function mt(e=process.env){return pt.join(Xn(e),"plugins")}function ht(e,t){let n=String(e||"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,32),r=String(t||"").toLowerCase().replace(/\.md$/i,"").replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,24);if(!n||!r)return null;let o=`p-${n}-${r}`.slice(0,64);return Vn.test(o)?o:null}var Zn=new Set(ae.map(({id:e})=>e)),Qn=16,er=200,tr=64*1024,nr=new Set(["bash","sh","zsh","fish","cmd","cmd.exe","powershell","pwsh"]),rr=/(?:^|\/)\.(?:env|ssh|gnupg)(?:$|\/)|(?:^|\/)(?:id_rsa|id_ed25519|wallet\.json|keys\.json)(?:$|\.)/i;function $(e){let t=new TypeError(e);throw t.code="ORACLE_TEAM_PACK_REFUSED",t}function J(e){return typeof e=="string"?e.trim():""}function bt(e){let t=J(e);return t?!!(/^(https?:|git@|ssh:|file:|\\\\)/i.test(t)||/\.git(?:$|[?#])/i.test(t)):!1}function or(e,t){let n=new Set((t||[]).map(c=>String(c))),r=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,48)||"pack",o=r,i=2;for(;n.has(o);)o=`${r}-${i}`,i+=1;return o}function kt(e){let t=[],n=[e];for(;n.length;){let r=n.pop(),o;try{o=H.readdirSync(r,{withFileTypes:!0})}catch{$("pack directory is unreadable")}for(let i of o){let c=K.join(r,i.name);if((i.isSymbolicLink()||H.lstatSync(c).isSymbolicLink())&&$("pack cannot contain symbolic links"),i.isDirectory()){n.push(c);continue}i.isFile()&&(t.push(c),t.length>er&&$("pack has too many files"))}}return t}function yt(e){let t=H.lstatSync(e);if((t.isSymbolicLink()||!t.isFile())&&$("pack files must be regular files"),t.size>tr)return null;let n=H.openSync(e,H.constants.O_RDONLY|(H.constants.O_NOFOLLOW||0));try{return H.readFileSync(n)}finally{H.closeSync(n)}}function Ue(e){let t=kt(e).map(o=>({file:o,relative:K.relative(e,o).split(K.sep).join("/")})).sort((o,i)=>o.relative<i.relative?-1:o.relative>i.relative?1:0),n=gt("sha256"),r=Buffer.alloc(64*1024);for(let{file:o,relative:i}of t){let c=H.openSync(o,H.constants.O_RDONLY|(H.constants.O_NOFOLLOW||0));try{H.fstatSync(c).isFile()||$("pack files must be regular files");let u=gt("sha256"),g;for(;(g=H.readSync(c,r,0,r.length,null))>0;)u.update(r.subarray(0,g));n.update(JSON.stringify([i,u.digest("hex")]))}finally{H.closeSync(c)}}return n.digest("hex")}function wt(e,t){let n=Buffer.isBuffer(e)?e.toString("utf8"):String(e||""),r=ft(n);r&&$(`pack ${t} contains ${r.name}`)}function sr(e){let t=J(e).replace(/\\/g,"/");return K.basename(t).toLowerCase()}function ir(e){e?.error&&$(`pack connector ${e.name||"unknown"} is invalid JSON`);let t=e?.config;(!t||typeof t!="object"||Array.isArray(t))&&$("pack connector config is invalid"),(t.url||t.headers||t.oauth||t.token)&&$("pack connectors cannot ship URLs, headers, or tokens"),t.env&&typeof t.env=="object"&&Object.keys(t.env).length&&$("pack connectors cannot ship env secrets; Oracle spawns them empty");let n=J(t.command);n||$("pack connector is missing a command"),nr.has(sr(n))&&$("pack connectors cannot spawn a shell")}function ar(e,t){let n=String(t||"").match(/^description:\s*(.+)$/m);return n?n[1].trim().slice(0,160):(String(t||"").split(`
|
|
3
|
-
`)[0].replace(/^#+\s*/,"").trim()||e).slice(0,160)}function cr({description:e,name:t,playbooks:n}){let r=[J(e)||`Imported pack ${t}.`,n.length?`Playbooks: ${n.map(o=>o.summary).join("; ")}.`:"","Cite sources and state when required data is unavailable. Never sign or broadcast."].filter(Boolean).join(" ");return r.length>Me&&$("pack copy is too long"),r}function dr(e){let t=J(e);t||$("pack path is required"),bt(t)&&$("private packs are local folders, not git clones");let n=K.resolve(t),r;try{r=H.lstatSync(n)}catch{$("pack directory not found")}return r.isSymbolicLink()&&$("pack cannot be a symbolic link"),r.isDirectory()||$("pack path must be a directory"),n}function At(e){return String(e||"").replace(/\//g,"-")}function Ge(e={}){let t=dr(e.root||e.path),n=kt(t);for(let g of n){let m=K.relative(t,g);rr.test(m)&&$(`pack cannot include ${m}`)}let r=Ue(t);for(let g of n){let m=K.relative(t,g),y=yt(g);y&&/\.(md|json|txt|mjs|js|ts|yml|yaml)$/i.test(g)&&wt(y,m)}let o=Fe(t);o.ok||$(o.error||"invalid plugin.json");let i=o.plugin;for(let g of i.mcpServers||[])ir(g);let c=[];for(let g of i.skills||[]){if(c.length>=Qn)break;let m=ht(i.name,g?.name||g?.relativePath);if(!m||!xe(m))continue;let y=g?.path?yt(g.path):null,I=y?y.toString("utf8"):"",N=ar(m,I);wt(N,m),c.push({id:m,summary:N})}let u=cr({description:i.description,name:i.name,playbooks:c});return Ue(t)!==r&&$("pack content changed during scanning; retry the import"),{name:i.name,version:i.version||"0.0.0",description:i.description||"",contentHash:r,root:t,playbooks:c,connectorCount:(i.mcpServers||[]).length,soul:u}}function lr(e,t={}){let n=t.pluginsDir||mt(t.env||process.env);H.mkdirSync(n,{recursive:!0});let r=At(e.name),o=K.join(n,r),i=K.resolve(o),c=K.resolve(e.root);if(H.existsSync(i)){let m;try{m=H.lstatSync(i)}catch{$(`plugin "${r}" already installed and unreadable`)}(m.isSymbolicLink()||!m.isDirectory())&&$(`plugin "${r}" already installed at an unsafe path`);let y=Fe(i);return y.ok||$(`plugin "${r}" already installed but invalid; remove it first`),(y.plugin.name!==e.name||y.plugin.version!==e.version)&&$(`plugin "${r}" already installed at v${y.plugin.version}; remove it first to import v${e.version}`),Ue(i)!==e.contentHash&&$(`plugin "${r}" already installed with different content; remove it first to import this pack`),i}let u=H.mkdtempSync(K.join(n,".team-pack-")),g=K.join(u,"pack");try{H.cpSync(c,g,{recursive:!0,dereference:!1}),Ge({path:g}).contentHash!==e.contentHash&&$("pack content changed during installation; retry the import"),H.renameSync(g,i)}finally{H.rmSync(u,{recursive:!0,force:!0})}return i}function ur(e={}){let t=Ge(e),n=J(e.provider),r=J(e.model);Zn.has(n)||$("unsupported model provider"),(!r||r.length>160)&&$("model is invalid"),e.install!==!1&&lr(t,e);let o=qe({role:J(e.role)||t.description||t.name,soul:t.soul}),i=[...new Set([...t.playbooks.map(g=>g.id),...o.skillIds])],c=J(e.name)||t.name,u=J(e.role)||t.description||"Imported pack";return{preview:t,agent:{id:or(c,e.existingAgentIds||[]),name:c.slice(0,120),role:u.slice(0,120),runtime:"model",provider:n,model:r,soul:t.soul,toolIds:o.toolIds,skillIds:i,trigger:"Mention",cadence:"On message",autoTools:!0,packId:At(t.name).slice(0,64)}}}var fr=/^[a-z0-9][a-z0-9._:-]{0,127}$/i,pr=/^[0-9a-f]{64}$/,mr=/^evidence:sha256:[0-9a-f]{64}$/,hr=new Set(["approved-intent","prepared-intent","prepared-basket"]),gr=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),yr=/^[A-Za-z0-9@:_./-]{1,64}$/;function ve(e,t){if(typeof e!="string"||!fr.test(e))throw new TypeError(`${t} is invalid`);return e}function wr(e,t){if(typeof e!="string"||!pr.test(e))throw new TypeError(`${t} is invalid`);return e}function Oe(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`${t} must be a plain object`)}function xt(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new TypeError(`${n}.${r} is not allowed`)}function oe(e,t,{allowZero:n=!1}={}){if(!Number.isFinite(e)||(n?e<0:e<=0))throw new TypeError(`${t} must be ${n?"non-negative":"positive"}`);let r=e*100;if(!Number.isSafeInteger(Math.round(r))||Math.abs(r-Math.round(r))>1e-8)throw new TypeError(`${t} must use exact USD cents`);return Math.round(r)}function br(e,t,{nowMs:n,expiresAt:r}){if(Oe(e,"basket leg artifact"),e.version!==1)throw new TypeError("basket leg artifact must be version 1");if(e.surface!=="hl")throw new TypeError("basket leg artifact surface must be hl");if(e.action!=="order"||e.destination!=="hyperliquid")throw new TypeError("basket leg artifact must be a Hyperliquid order");if(!Number.isSafeInteger(e.expiresAtMs)||e.expiresAtMs<=n||e.expiresAtMs>r)throw new TypeError("basket leg artifact expiry must fit the handoff TTL");if(Oe(e.artifact,"basket leg artifact payload"),!gr.has(e.artifact.kind))throw new TypeError("basket leg artifact kind is not an order");if(e.artifact.coin!==t.market)throw new TypeError("basket leg artifact market mismatch");if(e.artifact.side!==t.side)throw new TypeError("basket leg artifact side mismatch");if(oe(e.artifact.notionalUsd,"basket leg artifact notional")!==oe(t.notionalUsd,"basket leg notional"))throw new TypeError("basket leg artifact notional mismatch")}function kr(e,t,n){let r=e.executionPlan;if(r===void 0){if(n.mode==="armed")throw new TypeError("armed intent requires an exact execution plan");return}if(e.chainId!=="hyperliquid")throw new TypeError("armed execution plans require the Hyperliquid chain");if(e.intentType!=="perp"&&e.intentType!=="basket")throw new TypeError("intentType must be perp or basket");if(Oe(r,"executionPlan"),xt(r,new Set(["atomic","partialFillRiskAcknowledged","legs"]),"executionPlan"),r.atomic!==!1)throw new TypeError("basket and perp plans must be explicitly non-atomic");if(!Array.isArray(r.legs))throw new TypeError("executionPlan.legs must be an array");let o=e.intentType==="basket"?2:1,i=e.intentType==="basket"?12:1;if(r.legs.length<o||r.legs.length>i)throw new TypeError(`${e.intentType} execution plan requires ${o}-${i} legs`);if(e.intentType==="basket"&&r.partialFillRiskAcknowledged!==!0)throw new TypeError("basket partial-fill risk must be acknowledged");if(e.intentType==="perp"&&typeof r.partialFillRiskAcknowledged!="boolean")throw new TypeError("perp partial-fill risk acknowledgement must be boolean");let c=new Set,u=0,g=0;for(let[m,y]of r.legs.entries()){if(Oe(y,`executionPlan.legs[${m}]`),xt(y,new Set(["market","side","notionalUsd","weightBps","artifact"]),`executionPlan.legs[${m}]`),typeof y.market!="string"||!yr.test(y.market))throw new TypeError("basket leg market is invalid");if(c.has(y.market))throw new TypeError(`duplicate basket market ${y.market}`);if(c.add(y.market),y.side!=="buy"&&y.side!=="sell")throw new TypeError("basket leg side must be buy or sell");if(u+=oe(y.notionalUsd,"basket leg notional"),!Number.isSafeInteger(y.weightBps)||y.weightBps<=0||y.weightBps>1e4)throw new TypeError("basket leg weight must be positive basis points");g+=y.weightBps,br(y.artifact,y,n)}if(g!==1e4)throw new TypeError("basket leg weights must sum to 10000 bps");if(u!==oe(e.notionalUsd,"intent notional"))throw new TypeError("basket aggregate notional must equal the exact leg sum");if(u>oe(t.maxNotionalUsd,"policy maxNotionalUsd"))throw new TypeError("basket aggregate notional exceeds policy cap")}function Ar(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("intent payload must be an object");if(typeof e.chainId!="string"||!t.chainAllowlist.includes(e.chainId))throw new TypeError("intent chain is outside policy allowlist");if(!Number.isFinite(e.notionalUsd)||e.notionalUsd<=0||e.notionalUsd>t.maxNotionalUsd)throw new TypeError("intent notional exceeds policy cap");if(!Number.isFinite(e.maxLossUsd)||e.maxLossUsd<0||e.maxLossUsd>t.maxDailyLossUsd)throw new TypeError("intent loss exceeds policy cap");oe(e.notionalUsd,"intent notional"),oe(e.maxLossUsd,"intent max loss",{allowZero:!0}),kr(e,t,n)}function Ye(e,{compiled:t}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("handoff must be an object");if(!t?.team||typeof t.teamHash!="string")throw new TypeError("compiled team snapshot is required");let n=e.nowMs??Date.now();if(!Number.isSafeInteger(n))throw new TypeError("nowMs is invalid");if(!Number.isSafeInteger(e.ttlMs)||e.ttlMs<=0||e.ttlMs>6e4)throw new TypeError("TTL must be bounded to 60 seconds");let r=ve(e.teamId,"teamId"),o=wr(e.teamHash,"teamHash");if(t.team.id!==r||t.teamHash!==o)throw new TypeError("handoff team snapshot mismatch");let i=ve(e.sourceAgentId,"sourceAgentId"),c=ve(e.targetAgentId,"targetAgentId"),u=Pe(e.artifactKind);if(!t.team.edges.some(S=>S.from===i&&S.to===c&&S.artifactKind===u))throw new TypeError("handoff does not match compiled team edge");if(!Array.isArray(e.evidenceRefs)||!e.evidenceRefs.length)throw new TypeError("evidenceRefs must be non-empty");let g=e.evidenceRefs.map(S=>{if(typeof S!="string"||!mr.test(S))throw new TypeError("evidence reference must be a SHA-256 content hash");return S});if(new Set(g).size!==g.length)throw new TypeError("duplicate evidence reference");let m=A(e.payload),y=Ae(t.team.policy,{nowMs:n,mode:t.team.mode}),I=n+e.ttlMs;if(I>y.expiresAt)throw new TypeError("handoff TTL exceeds policy expiry");hr.has(u)&&Ar(m,y,{mode:t.team.mode,nowMs:n,expiresAt:I});let N={teamId:r,teamHash:o,runId:ve(e.runId,"runId"),sourceAgentId:i,targetAgentId:c,artifactKind:u,payload:m,payloadHash:ie(m),evidenceRefs:g,ttlMs:e.ttlMs,issuedAt:n,expiresAt:I,policy:y,policyHash:ie(y)};return X(A({...N,handoffHash:ie(N),executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}))}import{createHash as St,randomUUID as xr}from"node:crypto";function Et(e,t,n){let r=St("sha256").update(JSON.stringify(t)).digest("hex");return`sha256:${St("sha256").update(`${e}\0${r}\0${n}`).digest("hex")}`}function Sr(e){return{...A({compiled:e.compiled,currentAgentId:e.currentAgentId,previousHandoffHash:e.previousHandoffHash,executionConsumed:e.executionConsumed,confirmationPending:!1}),consumedHandoffHashes:[...e.consumedHandoffHashes]}}function Er(e){return{...A(e),consumedHandoffHashes:new Set(e?.consumedHandoffHashes||[]),confirmationPending:!1}}function We(e){return{...A({compiled:e.compiled,currentAgentId:e.currentAgentId,previousHandoffHash:e.previousHandoffHash,executionConsumed:e.executionConsumed,confirmationPending:e.confirmationPending}),consumedHandoffHashes:new Set(e.consumedHandoffHashes)}}var Tr=new Set(["approved-intent","prepared-intent","prepared-basket"]),vr=Object.freeze(["executionAllowed","verified","trusted","status","riskChecks","observedAt","liveData","policy","policyHash","evidenceRefs","handoffHash","signed","broadcast","backendSigner","signingReady","broadcastReady","requiresOperatorConfirmation"]);function Q(e,t,n){if(n>=t.compiled.team.policy.expiresAt)throw e.status="expired",e.updatedAt=n,new Error("team policy expired")}function Tt(e,t){if(Tr.has(e)&&!(!t||typeof t!="object"||Array.isArray(t))){if(Object.hasOwn(t,"kind")||"kind"in t)throw new TypeError("intent payload kind is not an intent artifact");for(let n of vr)if(Object.hasOwn(t,n)||n in t)throw new TypeError("intent payload cannot carry authority or provenance claims")}}function vt(e,t){if(!e)throw new TypeError("step must consume the exact prior handoff");if(t<e.issuedAt)throw new Error("prior handoff is not yet valid");if(t>=e.expiresAt)throw new Error("prior handoff expired")}function Ie(e,t){e.clear();for(let[n,r]of t)e.set(n,r)}function Ot(e){let t=e?.receipt;if(typeof t?.transactionHash=="string"&&/^0x[0-9a-f]{64}$/i.test(t.transactionHash)){if(t.status===1||t.status==="0x1")return"confirmed";if(t.status===0||t.status==="0x0")return"failed"}let n=e?.order;if(typeof n?.orderId=="string"&&/^[a-z0-9][a-z0-9._:-]{0,127}$/i.test(n.orderId)){if(n.status==="filled")return"confirmed";if(n.status==="rejected")return"failed"}return"unknown"}function Or({now:e=Date.now,storage:t,stateStore:n,tenantId:r="local-owner",executionAdapter:o,reconciliationAdapter:i}={}){let c=String(r||"").trim();if(!c)throw new TypeError("tenantId is required");let u=t??new Map,g=new Map,m=new Map,y=new Map,I=!n,N=null,S=0,z=Promise.resolve(),B=async(s,a)=>u.set(s,A(a)),M=async s=>u.get(s),se=async()=>u instanceof Map?[...u.values()]:u.list(),_=s=>X(A(s));function Y(s){let a=z.then(s,s);return z=a.catch(()=>{}),a}function f(){if(!(u instanceof Map)){if(n)throw new Error("durable team state requires map-backed definitions");return{definitions:null,runs:new Map([...g].map(([s,a])=>[s,A(a)])),contexts:new Map([...m].map(([s,a])=>[s,We(a)])),threads:new Map([...y].map(([s,a])=>[s,A(a)]))}}return{definitions:new Map([...u].map(([s,a])=>[s,A(a)])),runs:new Map([...g].map(([s,a])=>[s,A(a)])),contexts:new Map([...m].map(([s,a])=>[s,We(a)])),threads:new Map([...y].map(([s,a])=>[s,A(a)]))}}function R(s,a){return{version:1,revision:a,tenantId:c,definitions:[...s.definitions.values()].map(A),runs:[...s.runs.values()].map(A),contexts:[...s.contexts.entries()].map(([w,d])=>({runId:w,context:Sr(d)})),threads:[...s.threads.values()].map(A)}}function v(s){s.definitions&&Ie(u,s.definitions),Ie(g,s.runs),Ie(m,s.contexts),Ie(y,s.threads)}function E(s,{persist:a=!0}={}){return Y(async()=>{let w=f(),d=s(w),l=S;if(a&&n){let h=S,p=await n.save(R(w,h),{expectedRevision:h});l=p.revision,w.threads=new Map((p.threads||[]).map(k=>[k.teamId,A(k)]))}return v(w),S=l,d})}async function T(){I||(N||(N=(async()=>{let s=await n.load();if(s.tenantId!==c)throw new Error("team state tenant mismatch");if(!Number.isSafeInteger(s.revision)||s.revision<0)throw new Error("team state revision is invalid");if(!(u instanceof Map))throw new Error("durable team state requires map-backed definitions");let a={definitions:new Map,runs:new Map,contexts:new Map,threads:new Map};for(let l of s.definitions)a.definitions.set(l.team.id,A(l));for(let l of s.runs)a.runs.set(l.id,A(l));for(let l of s.contexts)a.contexts.set(l.runId,Er(l.context));for(let l of s.threads||[])a.threads.set(l.teamId,A(l));let w=!1;for(let l of a.runs.values()){if(!(l.status==="executing"||l.attempts?.some(k=>k.status==="submission-unknown")))continue;l.status="reconciliation-required",l.executionAllowed=!1,l.requiresOperatorConfirmation=!1,l.uncertainExecution=!0,l.updatedAt=e();let p=a.contexts.get(l.id);p&&(p.executionConsumed=!0,p.confirmationPending=!1),w=!0}let d=s.revision;if(w){let l=await n.save(R(a,d),{expectedRevision:d});d=l.revision,a.threads=new Map((l.threads||[]).map(h=>[h.teamId,A(h)]))}v(a),S=d,I=!0})()),await N)}async function D(){if(typeof o?.status!="function")throw new Error("armed mode requires a local execution adapter");let s=await o.status();if(!s?.configured||!s?.reachable||s?.armed!==!0)throw new Error("local signer is not armed and reachable");if(typeof o?.executeConfirmedArtifact!="function")throw new Error("armed mode requires a local execution adapter");return s}return Object.freeze({async save(s){if(await T(),!(u instanceof Map)){let w=await Y(async()=>{let d=typeof s?.id=="string"?await M(s.id):null,l=s?.kind==="group"&&s.sessionId===void 0?d:null,h=l?.team?.kind==="group"?{...s,sessionId:l.team.sessionId}:s,p=Se(h,{nowMs:e()});if(d&&d.team?.kind!==p.team.kind)throw new Error("team kind cannot change");return await B(p.team.id,p),p});return _(w)}let a=await E(w=>{let d=typeof s?.id=="string"?w.definitions.get(s.id):null,l=s?.kind==="group"&&s.sessionId===void 0?d:null,h=l?.team?.kind==="group"?{...s,sessionId:l.team.sessionId}:s,p=Se(h,{nowMs:e()}),k=w.definitions.get(p.team.id);if(k&&k.team?.kind!==p.team.kind)throw new Error("team kind cannot change");return w.definitions.set(p.team.id,A(p)),p.team.kind==="group"&&!w.threads.has(p.team.id)&&w.threads.set(p.team.id,{teamId:p.team.id,sessionId:p.team.sessionId,messages:[]}),w.definitions.get(p.team.id)});return _(a)},async list(){return await T(),_(await se())},async get(s){await T();let a=await M(s);return a===void 0?null:_(a)},async remove(s){await T();let a=String(s||"").trim();if(!(u instanceof Map)){if(typeof u.delete!="function")throw new Error("team storage does not support deletion");return _(await Y(async()=>{let d=await M(a);if(!d||d.team?.kind!=="group")throw new Error(`unknown group ${a}`);if(await u.delete(a)===!1||await M(a)!==void 0)throw new Error(`team deletion failed ${a}`);y.delete(a);for(let[h,p]of g)p.teamId===a&&(g.delete(h),m.delete(h));return{deleted:!0,teamId:a}}))}let w=await E(d=>{let l=d.definitions.get(a);if(!l||l.team?.kind!=="group")throw new Error(`unknown group ${a}`);d.definitions.delete(a),d.threads.delete(a);for(let[h,p]of d.runs)p.teamId===a&&(d.runs.delete(h),d.contexts.delete(h));return{deleted:!0,teamId:a}});return _(w)},async listThreads(){return await T(),_([...y.values()])},async getThread(s){await T();let a=y.get(s);return a===void 0?null:_(a)},async appendThreadEvent(s,a){return await T(),await E(w=>{let d=w.definitions?.get(s);if(!d||d.team.kind!=="group")throw new Error(`unknown group ${s}`);let l=w.threads.get(s)||{teamId:s,sessionId:d.team.sessionId,messages:[]},h=Ne(l,a);w.threads.set(s,{...h,teamId:s})}),_(y.get(s))},async getRun(s){await T();let a=g.get(s);return a===void 0?null:_(a)},async getTurnState(s,a){return await T(),Y(()=>{let w=g.get(s),d=m.get(s);if(!w||!d)throw new Error(`unknown run ${s}`);if(w.teamId!==a)throw new Error("run team mismatch");if(w.status!=="running"&&w.status!=="shadowing")throw new Error(`run is not active: ${w.status}`);let l=e();if(Q(A(w),d,l),d.previousHandoffHash!==null){let h=w.steps.at(-1);if(!h||h.handoffHash!==d.previousHandoffHash)throw new TypeError("step must consume the exact prior handoff");vt(h,l)}return _({run:w,compiled:d.compiled,currentAgentId:d.currentAgentId,previousHandoffHash:d.previousHandoffHash,inbound:w.steps.at(-1)?.payload??null})})},async start(s){await T();let a=await M(s);if(!a)throw new Error(`unknown team ${s}`);if(a.team.kind==="group")throw new Error("group chats do not start pipeline runs");let w=X(A(a));w.team.mode==="armed"&&await D();let d=await E(l=>{let h=l.definitions?l.definitions.get(s):w;if(!h)throw new Error(`unknown team ${s}`);if(h.team.mode==="draft")throw new Error("draft team must be promoted before running");if(h.team.mode==="halted")throw new Error("team kill switch is active");let p=e();if(p>=h.team.policy.expiresAt)throw new Error("team policy expired");let k=h.team.mode==="armed",x=h.team.agents.find(q=>!h.team.edges.some(L=>L.to===q.id));if(!x)throw new Error("team pipeline has no root agent");let C={id:xr(),tenantId:c,teamId:s,teamHash:h.teamHash,status:h.team.mode==="shadow"?"shadowing":"running",mode:h.team.mode,armed:k,startedAt:p,updatedAt:p,expiresAt:h.team.policy.expiresAt,maxSteps:h.team.edges.length,steps:[],receipts:[],attempts:[],executionAllowed:!1,backendSigner:k,signingReady:k,broadcastReady:k,requiresOperatorConfirmation:!0,signed:!1,broadcast:!1};return l.runs.set(C.id,C),l.contexts.set(C.id,{compiled:X(A(h)),currentAgentId:x.id,previousHandoffHash:null,consumedHandoffHashes:new Set,executionConsumed:!1,confirmationPending:!1}),C});return _(d)},async step(s,a){await T();let w=await E(d=>{let l=d.runs.get(s),h=d.contexts.get(s);if(!l||!h)throw new Error(`unknown run ${s}`);if(l.status==="halted")throw new Error("run is halted");if(l.status==="paused")throw new Error("run is paused");if(l.status!=="running"&&l.status!=="shadowing")throw new Error("run cannot step from its current state");let p=e();if(Q(l,h,p),l.steps.length>=l.maxSteps)throw new Error("run step budget exhausted");if(a?.agentId!==h.currentAgentId)throw new TypeError("step agent is out of order");let k=h.compiled.team.edges.find(L=>L.from===a.agentId);if(!k||k.to!==a?.targetAgentId||k.artifactKind!==a?.artifactKind)throw new TypeError("artifact does not match the exact next team edge");let x,C=null;if(h.previousHandoffHash===null){if(a.inputHandoffHash!==void 0)throw new TypeError("root step cannot consume a prior handoff");x=a.evidenceRefs}else{if(a.inputHandoffHash!==h.previousHandoffHash)throw new TypeError("step must consume the exact prior handoff");if(h.consumedHandoffHashes.has(a.inputHandoffHash))throw new TypeError("handoff was already consumed");let L=l.steps.at(-1);if(!L||L.handoffHash!==a.inputHandoffHash)throw new TypeError("step must consume the exact prior handoff");vt(L,p),C=a.inputHandoffHash,x=[`evidence:sha256:${a.inputHandoffHash}`]}if(a.payload?.kind==="risk-decision"&&a.payload.status==="measured")throw new TypeError("measured risk evidence requires trusted runtime provenance");if(a.payload?.kind==="risk-decision"){if(a.payload.status!=="unknown")throw new TypeError("risk evidence status must be unknown");let L=h.compiled.team.agents.find(j=>j.id===k.from);if(L?.role!=="risk"||L.runtime!=="policy")throw new TypeError("only the policy risk agent can block for unknown evidence");if(a.payload.executionAllowed!==!1||a.payload.executionPlan!==void 0||!Array.isArray(a.payload.riskChecks)||a.payload.riskChecks.length!==3)throw new TypeError("unknown risk evidence cannot assert approval or measured amounts");if(a.payload.notionalUsd!==null||a.payload.maxLossUsd!==null||a.payload.chainId!==null||a.payload.observedAt!==null||a.payload.liveData!=="unavailable"||a.payload.riskChecks.some(j=>j.pass!==!1||j.status!=="unknown"))throw new TypeError("unknown risk evidence cannot assert approval or measured amounts");return l.riskEvidence=A(a.payload),l.status="risk-blocked",l.executionAllowed=!1,l.requiresOperatorConfirmation=!1,l.updatedAt=p,l}Tt(k.artifactKind,a.payload);let q=Ye({teamId:l.teamId,teamHash:l.teamHash,runId:s,sourceAgentId:k.from,targetAgentId:k.to,artifactKind:k.artifactKind,payload:a.payload,evidenceRefs:x,ttlMs:a.ttlMs,nowMs:p},{compiled:h.compiled});return C!==null&&h.consumedHandoffHashes.add(C),l.steps.push(q),l.updatedAt=p,h.currentAgentId=k.to,h.previousHandoffHash=q.handoffHash,k.to===h.compiled.team.agents.find(L=>L.role==="executor").id&&(l.status=l.mode==="armed"?"awaiting-confirmation":"prepared",l.preparedAt=p,l.mode!=="armed"&&(l.completedAt=p)),l});return _(w)},async confirm(s,a){await T();let w=await E(d=>{let l=d.runs.get(s),h=d.contexts.get(s);if(!l||!h)throw new Error(`unknown run ${s}`);if(l.status==="halted")throw new Error("run is halted");if(l.status!=="awaiting-confirmation")throw new Error("run cannot confirm from its current state or was already executed");let p=e();Q(l,h,p);let k=l.steps.at(-1);if(!k||k.artifactKind!=="approved-intent")throw new Error("approved intent handoff is required");if(p>=k.expiresAt)throw new Error("approved intent handoff expired");if(Tt(k.artifactKind,k.payload),a?.handoffHash!==k.handoffHash)throw new TypeError("confirmation must bind the exact handoff hash");if(a?.operatorConfirmed!==!0||a?.sign!==!0||a?.broadcast!==!0)throw new TypeError("explicit confirm, sign, and broadcast instruction is required");if(h.executionConsumed||h.confirmationPending)throw new Error("approved intent is already executing or was already executed");return h.confirmationPending=!0,A(k)},{persist:!1});try{await D();let d=w.payload?.executionPlan?.legs;if(!Array.isArray(d)||!d.length)throw new Error("approved intent has no executable legs");await E(h=>{let p=h.runs.get(s),k=h.contexts.get(s);if(!p||!k)throw new Error(`unknown run ${s}`);let x=e();if(Q(p,k,x),p.status==="halted")throw new Error("run was halted before execution");if(p.status!=="awaiting-confirmation")throw new Error("run cannot confirm from its current state");if(!k.confirmationPending||k.executionConsumed)throw new Error("approved intent is already executing or was already executed");if(x>=w.expiresAt)throw new Error("approved intent handoff expired");k.executionConsumed=!0,p.status="executing",p.updatedAt=x});for(let[h,p]of d.entries()){let k=Et(c,p.artifact,h);await E(L=>{let j=L.runs.get(s),P=L.contexts.get(s);if(!j||!P)throw new Error(`unknown run ${s}`);if(j.status==="halted")throw new Error("run was halted during sequential basket execution");if(j.status!=="executing")throw new Error("run cannot execute from its current state");let te=e();if(Q(j,P,te),te>=w.expiresAt)throw new Error("approved intent handoff expired during execution");j.attempts[h]={legIndex:h,idempotencyKey:k,status:"submission-unknown",submittedAt:te},j.updatedAt=te});let x=await o.executeConfirmedArtifact(A(p.artifact),{tenantId:c,runId:s,handoffHash:w.handoffHash,idempotencyKey:k,legIndex:h,legCount:d.length});await E(L=>{let j=L.runs.get(s);if(!j)throw new Error(`unknown run ${s}`);let P=j.attempts[h];if(!P||P.idempotencyKey!==k)throw new Error("execution attempt state changed before receipt persistence");P.status="receipt-recorded",P.receipt=A(x),P.receivedAt=e(),j.receipts.push(A(x)),j.updatedAt=P.receivedAt});let C=g.get(s),q=m.get(s);if(C?.status==="halted")throw new Error("run was halted during sequential basket execution");if(!C||!q)throw new Error(`unknown run ${s}`);if(Q(A(C),We(q),C.updatedAt),C.updatedAt>=w.expiresAt)throw new Error("approved intent handoff expired during execution")}let l=await E(h=>{let p=h.runs.get(s),k=h.contexts.get(s);if(!p||!k)throw new Error(`unknown run ${s}`);if(p.status==="halted")throw new Error("run was halted during sequential basket execution");if(p.status!=="executing")throw new Error("run cannot complete from its current state");if(Q(p,k,p.updatedAt),p.updatedAt>=w.expiresAt)throw new Error("approved intent handoff expired during execution");return p.status="completed",p.executionAllowed=!1,p.requiresOperatorConfirmation=!1,p.signed=!0,p.broadcast=!0,p.completedAt=e(),p.updatedAt=p.completedAt,p});return _(l)}catch(d){if(m.get(s)?.executionConsumed)try{await E(h=>{let p=h.runs.get(s),k=h.contexts.get(s);if(!p||!k)return;let x=p.attempts.some(C=>C.status==="submission-unknown");p.status!=="halted"&&p.status!=="expired"&&(p.status=x?"reconciliation-required":"failed"),p.executionAllowed=!1,p.uncertainExecution=x,p.partialExecution=p.receipts.length>0,p.error=d instanceof Error?d.message:"local execution failed",p.updatedAt=e()})}catch{}throw d}finally{await E(d=>{let l=d.contexts.get(s);l&&(l.confirmationPending=!1)},{persist:!1})}},async reconcile(s){if(typeof s!="string"||!/^[a-z0-9][a-z0-9._:-]{0,127}$/i.test(s))throw new TypeError("runId is invalid");let a=await Y(async()=>{if(n){let x=await n.load();if(x.tenantId!==c)throw new Error("team state tenant mismatch");return A({run:x.runs.find(C=>C.id===s)??null,revision:x.revision})}return A({run:g.get(s)??null,revision:S})}),w=a.run;if(!w||w.tenantId!==c)throw new Error(`unknown run ${s}`);let d=w.steps.at(-1),l=d?.payload?.executionPlan?.legs??[],h=[];for(let x of w.attempts||[]){let C=l[x.legIndex],q={tenantId:c,runId:s,handoffHash:d?.handoffHash??null,idempotencyKey:x.idempotencyKey,legIndex:x.legIndex,tradeId:C?.artifact?.tradeId??null},L="unknown",j="unavailable",P=null,te="lookup-unavailable",tt=C&&Number.isSafeInteger(x.legIndex)&&x.legIndex>=0&&x.idempotencyKey===Et(c,C.artifact,x.legIndex);if(tt&&x.status==="receipt-recorded"&&Number.isSafeInteger(x.receivedAt)&&x.receivedAt>=x.submittedAt&&x.receivedAt<=e()&&(L=Ot(x.receipt),L!=="unknown"&&(j="stored-receipt",P=x.receivedAt)),tt&&L==="unknown"){for(let ge of["lookupReceipt","lookupOrder"])if(typeof i?.[ge]=="function")try{let F=await i[ge](_(q));if(F?.available===!1){["disabled","hosted","unconfigured","lookup-unavailable","identity-mismatch","invalid-evidence"].includes(F.reason)&&(te=F.reason);break}if(!F||Object.keys(q).some(nt=>F[nt]!==q[nt])||!Number.isSafeInteger(F.observedAt)||F.observedAt<x.submittedAt||F.observedAt>e())continue;if(L=Ot(ge==="lookupReceipt"?{receipt:F.receipt}:{order:F.order}),L!=="unknown"){j=ge,P=F.observedAt;break}}catch{}}h.push({...q,status:L,source:j,observedAt:P,reason:L==="unknown"?te:null})}let p=Math.max(0,l.length-h.length),k=!h.length||p>0||h.some(x=>x.status==="unknown");return _({runId:s,tenantId:c,runStatus:w.status,revision:a.revision,readOnly:!0,executionAllowed:!1,recoveryRequired:k,status:k?"reconciliation-required":"reconciled",attempts:h,unattemptedLegs:p})},async pause(s){await T();let a=await E(w=>{let d=w.runs.get(s);if(!d)throw new Error(`unknown run ${s}`);if(d.status!=="running"&&d.status!=="shadowing")throw new Error("only an active run can be paused");return d.resumeStatus=d.status,d.status="paused",d.updatedAt=e(),d});return _(a)},async resume(s){await T();let a=await E(w=>{let d=w.runs.get(s),l=w.contexts.get(s);if(!d||!l)throw new Error(`unknown run ${s}`);if(d.status!=="paused")throw new Error("only a paused run can be resumed");let h=e();return Q(d,l,h),d.status=d.resumeStatus==="shadowing"?"shadowing":"running",delete d.resumeStatus,d.updatedAt=h,d});return _(a)},async halt(s){await T();let a=await E(w=>{let d=w.runs.get(s);if(!d)throw new Error(`unknown run ${s}`);return d.status="halted",delete d.resumeStatus,d.updatedAt=e(),d});return _(a)}})}import{createHash as $r}from"node:crypto";var Ir=["chain-allowlist","notional-cap","loss-cap"];function Je({evidence:e,intent:t}={}){return{kind:"risk-decision",status:"unknown",liveData:"unavailable",observedAt:null,chainId:null,notionalUsd:null,maxLossUsd:null,executionAllowed:!1,reason:"Trusted runtime observation provenance is unavailable",prompt:typeof e?.prompt=="string"?e.prompt:typeof t?.prompt=="string"?t.prompt:"",riskChecks:Ir.map(r=>({check:r,pass:!1,status:"unknown"}))}}var _r=/\b[A-Z][A-Z0-9]{1,5}\b/g,Rr=3e4;function Lr(e){return $r("sha256").update(e).digest("hex")}function Cr(e){return String(e).replace(/\$\s*\d[\d,.]*/g,"[amount]").slice(0,500)}function Hr(e){let t=new Set(e.edges.map(c=>c.to)),n=e.agents.find(c=>!t.has(c.id));if(!n)throw new Error("team pipeline has no root agent");let r=new Map(e.edges.map(c=>[c.from,c])),o=[],i=n.id;for(;r.has(i);){let c=r.get(i);o.push(c),i=c.to}if(o.length!==e.edges.length)throw new Error("team pipeline edges are not a single ordered chain");return o}function jr({prompt:e,nowMs:t}){let n=[...new Set(e.match(_r)||[])];return{kind:"evidence",prompt:e,observations:n,generatedAt:t,source:"operator-prompt",liveData:"unavailable"}}function It({agent:e,prompt:t,inbound:n}){let r=n?.kind==="evidence"?`evidence observations [${(n.observations||[]).join(", ")}]`:n?.kind==="analysis"?`prior ${n.role||"analysis"} thesis`:"operator prompt only",o=Cr(`Rule-based bounded summary: ${e.role} review of ${r} for prompt "${t}". No live market data was read and no prices or market numbers are asserted.`);return{kind:"analysis",role:e.role,thesis:o,generator:{kind:"rules"},degradedReason:"model runtime unavailable"}}function zr(e){return Array.isArray(e)?e.slice(0,16).flatMap(t=>{let n=typeof t?.name=="string"?t.name.trim():"",r=typeof t?.argsHash=="string"?t.argsHash:"";return!/^[a-z0-9][a-z0-9._:-]{0,63}$/.test(n)||!/^[0-9a-f]{64}$/.test(r)?[]:[{name:n,argsHash:r,ok:t?.ok===!0}]}):[]}async function Nr({agent:e,prompt:t,inbound:n,modelInvoker:r}){if(typeof r!="function")return It({agent:e,prompt:t,inbound:n});try{let o=await r({agent:e,prompt:t,inbound:n});if(typeof o?.text!="string"||!o.text.trim())throw new Error("model invoker returned no text");let i=zr(o.toolCalls),c=n?.intent&&typeof n.intent=="object"?n.intent:n?.evidence?.intent,u=n?.kind==="evidence"?n:n?.evidence?.kind==="evidence"?n.evidence:void 0;return{kind:"analysis",role:e.role,thesis:o.text,generator:{kind:"model",provider:e.provider,model:e.model},...i.length?{toolCalls:i}:{},...c?{intent:c}:{},...u?{evidence:u}:{}}}catch{return It({agent:e,prompt:t,inbound:n})}}function Mr({prompt:e,inbound:t,compiled:n,nowMs:r}){let o=t?.kind==="evidence"?t:t?.evidence?.kind==="evidence"?t.evidence:void 0,i=t?.intent&&typeof t.intent=="object"?t.intent:o?.intent;return{...Je({policy:n?.policy,evidence:o,intent:i,nowMs:r}),prompt:e}}function Dr(e,t){if(t.kind==="evidence"){let n=t.observations.length?t.observations.join(", "):"no symbols";return`${e.name}: parsed operator prompt (${n}); live market data unavailable.`}if(t.kind==="analysis"){let n=t.generator.kind==="model"?`${t.generator.provider}/${t.generator.model}`:"bounded rules";return`${e.name}: ${t.thesis.slice(0,160)} (via ${n})`}if(t.status==="measured"){let n=t.riskChecks.every(r=>r.pass===!0)?"bounds satisfied":"a measured bound failed";return`${e.name}: measured risk ${n}; execution blocked pending operator confirmation.`}return`${e.name}: risk unknown; live timestamped observations unavailable. No intent approved; execution blocked.`}async function Pr({service:e,team:t,teamId:n,runId:r,prompt:o,nowMs:i,modelInvoker:c,onEvent:u}={}){let g=typeof u=="function"?m=>{u(m)}:()=>{};try{if(!e)throw new TypeError("service is required");if(typeof o!="string"||!o.trim())throw new TypeError("prompt is required");if(o.length>4e3)throw new TypeError("prompt exceeds 4000 characters");let m=String(n||t?.team?.id||t?.id||"");if(!m)throw new TypeError("teamId is required");let y=await e.get(m);if(!y)throw new Error(`unknown team ${m}`);if(y.team.kind==="group")throw new Error("group chats do not run pipeline turns");let I=Number.isSafeInteger(i)?i:Date.now();if(r!==void 0&&(typeof r!="string"||!/^[a-z0-9][a-z0-9._:-]{0,127}$/i.test(r)))throw new TypeError("runId is invalid");let N=r??(await e.start(m)).id,S=await e.getTurnState(N,m),z=S.run,B=S.compiled.team,M=Hr(B),se=M.findIndex(v=>v.from===S.currentAgentId),_=z.steps.at(-1);if(se<0||se!==z.steps.length||S.previousHandoffHash!==(_?.handoffHash??null)||_&&_.targetAgentId!==S.currentAgentId)throw new Error("persisted run cursor mismatch");if(z.steps.length>0){let v=z.steps[0]?.payload?.prompt;if(typeof v!="string")throw new Error("committed prompt unavailable");o=v}g({type:"run.started",run:z});let Y=new Map(B.agents.map(v=>[v.id,v])),f=S.previousHandoffHash,R=S.inbound;for(let v=se;v<M.length;v+=1){let E=M[v],T=Y.get(E.from);g({type:"agent.started",agentId:T.id,name:T.name,role:T.role,runtime:T.runtime});let D;if(T.runtime==="deterministic")D=jr({prompt:o,nowMs:I});else if(T.runtime==="model")D=await Nr({agent:T,prompt:o,inbound:R,modelInvoker:c});else if(T.runtime==="policy")D=Mr({prompt:o,inbound:R,compiled:B,nowMs:I});else throw new Error(`agent runtime ${T.runtime} cannot produce a handoff artifact`);g({type:"agent.output",agentId:T.id,text:Dr(T,D),payload:D});let s={agentId:E.from,targetAgentId:E.to,artifactKind:E.artifactKind,payload:D,ttlMs:Rr};if(v===0?s.evidenceRefs=[`evidence:sha256:${Lr(`${m}\0${o}`)}`]:s.inputHandoffHash=f,z=await e.step(z.id,s),z.status==="risk-blocked")break;let a=z.steps.at(-1);f=a.handoffHash,R=D,g({type:"handoff.verified",handoff:{sourceAgentId:a.sourceAgentId,targetAgentId:a.targetAgentId,artifactKind:a.artifactKind,handoffHash:a.handoffHash}})}return g({type:"run.status",run:z}),z}catch(m){throw g({type:"error",message:m instanceof Error?m.message:"team turn failed"}),m}}import{closeSync as pe,constants as V,fchmodSync as $t,fstatSync as Mt,fsyncSync as Ve,linkSync as qr,lstatSync as ee,mkdirSync as Kr,openSync as me,readFileSync as he,readlinkSync as _t,realpathSync as Br,renameSync as Fr,rmSync as Xe,writeFileSync as Rt}from"node:fs";import{createHash as Ur,randomBytes as Lt}from"node:crypto";import{homedir as Gr}from"node:os";import{basename as Yr,dirname as _e,join as Re,resolve as Wr}from"node:path";var Dt=1,et=V.O_NOFOLLOW??0,Jr=16*1024*1024,Ze=15*1024*1024;function Vr(e){let t=String(e||"").trim();if(!t||t.length>200||/[\u0000-\u001f\u007f]/.test(t))throw new TypeError("tenantId is required");return t}function Pt(e){return e==null?e:structuredClone(e)}function Le(e,t,n=!1,r=process.platform){let o=n?!e.isDirectory():!e.isFile(),i=r!=="win32",c=i&&typeof process.getuid=="function"&&Number(e.uid)!==process.getuid(),u=i&&(Number(e.mode)&18)!==0;if(e.isSymbolicLink()||o||c||u)throw new Error(`${t} must be an owner-controlled ${n?"directory":"regular file"}`)}function Ct(e,t){Kr(e,{recursive:!0,mode:448});let n=ee(e);Le(n,"team state directory",!0,t)}function Xr(e,t){let n=Ur("sha256").update(t).digest("hex");return Re(e,`${n}.json`)}function Ht(e){return Buffer.byteLength(`${JSON.stringify(e)}
|
|
4
|
-
`,"utf8")}function
|
|
5
|
-
`,"utf8"),Ve(
|
|
6
|
-
`;if(Buffer.byteLength(
|
|
1
|
+
var He=Object.freeze(["draft","shadow","confirm","armed","autonomous","halted"]),Ft=Object.freeze([["TOTAL","Total crypto market cap, also called TOTAL1"],["TOTAL2","Crypto market cap excluding BTC"],["TOTAL3","Crypto market cap excluding BTC and ETH"],["OTHERS","Crypto market cap outside the largest tracked assets"],["BTC.D","Bitcoin market-cap dominance"],["ETH.D","Ether market-cap dominance"],["USDT.D","Tether market-cap dominance"]].map(([e,t])=>Object.freeze({id:e,description:t}))),Ut=Object.freeze([["sma","Simple moving average"],["ema","Exponential moving average"],["rsi","Relative strength index"],["macd","Moving-average convergence divergence"],["bollinger","Bollinger bands"],["atr","Average true range"],["vwap","Volume-weighted average price"],["volume","Traded volume"],["cvd","Cumulative volume delta"],["funding","Perpetual funding rate"],["open-interest","Open interest and change"],["liquidations","Liquidation flow"],["basis","Perpetual-to-spot basis"]].map(([e,t])=>Object.freeze({id:e,description:t}))),Gt=Object.freeze([["relative-value","Long-short relative value basket"],["beta-neutral","Beta-balanced directional basket"],["spread-mean-reversion","Bounded spread mean reversion"],["funding-carry","Cross-market funding carry"]].map(([e,t])=>Object.freeze({id:e,description:t}))),ae=Object.freeze([["anthropic-oauth","oauth"],["openai-codex","oauth"],["xai-oauth","oauth"],["openrouter","api-key"],["openai","api-key"],["anthropic","api-key"],["xai","api-key"],["deepseek","api-key"],["gemini","api-key"],["kimi","api-key"],["mistral","api-key"],["nous","api-key"],["qwen","api-key"],["glm","api-key"],["local","local"],["ollama","local"]].map(([e,t])=>Object.freeze({id:e,auth:t}))),Yt=[["market.scan","Read bounded market observations"],["market.breadth","Read TOTAL, TOTAL2, TOTAL3, OTHERS, and dominance evidence"],["perp.indicators","Calculate bounded price, volume, positioning, and derivatives signals"],["basket.construct","Construct an exact bounded multi-leg basket plan"],["basket.backtest","Backtest a bounded basket against supplied history"],["sentiment.read","Read cited public sentiment"],["wallet.watch","Observe public wallet activity"],["contract.read","Inspect public contract state"],["nft.inspect","Inspect public mint state"],["strategy.analyze","Analyze a strategy without executing it"],["strategy.backtest","Backtest against supplied history"],["risk.evaluate","Summarize a caller-supplied portfolio snapshot; does not fetch accounts or approve intents"],["intent.prepare","Prepare a non-executable intent"],["operator.handoff","Create an operator confirmation handoff"]],ce=Object.freeze(Yt.map(([e,t])=>Object.freeze({id:e,description:t,signs:!1,broadcasts:!1}))),Wt=[["hyperliquid-markets","Research Hyperliquid market evidence"],["crypto-market-breadth","Analyze crypto market breadth and dominance evidence"],["perp-technical-analysis","Analyze bounded perpetual technical and positioning signals"],["perp-strategy-planning","Plan bounded perpetual strategies"],["basket-trading","Construct exact non-atomic multi-leg basket plans"],["relative-value-risk","Evaluate per-leg and aggregate relative-value risk"],["armed-local-routing","Route an approved exact plan to the local operator boundary"],["social-sentiment","Score cited public sentiment"],["wallet-monitoring","Analyze public wallet activity"],["contract-research","Research public contract state"],["mint-research","Research public mint state"],["bounded-strategy-analysis","Analyze bounded strategy evidence"],["bounded-backtesting","Backtest against supplied history"],["bounded-risk","Evaluate evidence against fixed policy"],["prepare-only-execution","Prepare an operator confirmation handoff"]],de=Object.freeze(Wt.map(([e,t])=>Object.freeze({id:e,description:t,signs:!1,broadcasts:!1}))),Jt=Object.freeze({autonomousOptIn:!1,requiresWalletConfirmation:!0,killSwitchRequired:!0,maxNotionalUsd:100,maxDailyLossUsd:10,chainAllowlist:Object.freeze(["ethereum"]),expiresAt:41024448e5});function ne({id:e,name:t,scannerName:n,scannerTool:r,scannerSkill:o,scannerArtifact:i,chainAllowlist:c}){return Object.freeze({id:e,name:t,mode:"draft",agents:Object.freeze([Object.freeze({id:"scanner",name:n,role:"scanner",runtime:"deterministic",soul:"Collect bounded public evidence with source times.",toolIds:Object.freeze([r]),skillIds:Object.freeze([o])}),Object.freeze({id:"sentiment",name:"Grok Sentiment",role:"sentiment",runtime:"model",provider:"xai",model:"grok-4.6",soul:"Score narrative direction and cite every claim.",toolIds:Object.freeze(["sentiment.read"]),skillIds:Object.freeze(["social-sentiment"])}),Object.freeze({id:"strategy",name:"Strategy Analyst",role:"strategy",runtime:"model",provider:"openai",model:"gpt-5.6-sol",soul:"Produce a falsifiable thesis from typed evidence.",toolIds:Object.freeze(["strategy.analyze"]),skillIds:Object.freeze(["bounded-strategy-analysis"])}),Object.freeze({id:"risk",name:"Risk Gate",role:"risk",runtime:"policy",soul:"Enforce every cap exactly and reject unsupported intent.",toolIds:Object.freeze(["risk.evaluate"]),skillIds:Object.freeze(["bounded-risk"])}),Object.freeze({id:"executor",name:"Executor",role:"executor",runtime:"operator",soul:"Prepare an exact operator handoff. Never sign or broadcast.",toolIds:Object.freeze(["intent.prepare","operator.handoff"]),skillIds:Object.freeze(["prepare-only-execution"])})]),edges:Object.freeze([Object.freeze({from:"scanner",to:"sentiment",artifactKind:i}),Object.freeze({from:"sentiment",to:"strategy",artifactKind:"scored-thesis"}),Object.freeze({from:"strategy",to:"risk",artifactKind:"strategy-analysis"}),Object.freeze({from:"risk",to:"executor",artifactKind:"approved-intent"})]),policy:Object.freeze({...Jt,chainAllowlist:Object.freeze(c)})})}var Vt=Object.freeze([ne({id:"hyperliquid-alpha",name:"Hyperliquid Alpha",scannerName:"Market Scanner",scannerTool:"market.scan",scannerSkill:"hyperliquid-markets",scannerArtifact:"market-evidence",chainAllowlist:["hyperliquid"]}),ne({id:"perp-market-breadth",name:"Perp Market Breadth",scannerName:"Breadth Scanner",scannerTool:"market.breadth",scannerSkill:"crypto-market-breadth",scannerArtifact:"breadth-evidence",chainAllowlist:["hyperliquid"]}),ne({id:"perp-technical-strategy",name:"Perp Technical Strategy",scannerName:"Perp Technical Scanner",scannerTool:"perp.indicators",scannerSkill:"perp-technical-analysis",scannerArtifact:"technical-evidence",chainAllowlist:["hyperliquid"]}),ne({id:"basket-relative-value",name:"Basket Relative Value",scannerName:"Basket Constructor",scannerTool:"basket.construct",scannerSkill:"basket-trading",scannerArtifact:"basket-evidence",chainAllowlist:["hyperliquid"]}),ne({id:"wallet-watch",name:"Wallet Watch",scannerName:"Wallet Monitor",scannerTool:"wallet.watch",scannerSkill:"wallet-monitoring",scannerArtifact:"wallet-flow",chainAllowlist:["ethereum","base"]}),ne({id:"evm-launch-radar",name:"EVM Launch Radar",scannerName:"Launch Scanner",scannerTool:"contract.read",scannerSkill:"contract-research",scannerArtifact:"contract-evidence",chainAllowlist:["ethereum","base","arbitrum"]}),ne({id:"nft-mint-guard",name:"NFT Mint Guard",scannerName:"Mint Scanner",scannerTool:"nft.inspect",scannerSkill:"mint-research",scannerArtifact:"mint-evidence",chainAllowlist:["ethereum","base"]})]);import{createHash as In}from"node:crypto";import{randomBytes as dn}from"node:crypto";import{wordlists as Xt}from"ethers";var Zt=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),Qt=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],en=new Set([12,15,18,21,24]);function tn(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return en.has(t.length)&&t.every(n=>Xt.en.getWordIndex(n)>=0)}var nn=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,rn=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,on=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function sn(e){let t=rt(e);return on.has(t)||rn.test(t)}var le=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function rt(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function an(e){let t=rt(e);return[...Zt].some(n=>t.includes(n))}function cn(e,t,n){if(typeof t=="string"){if(Qt.some(r=>r.test(t))||tn(t))throw new le(n);if(nn.test(t)&&!sn(e))throw new le(n)}}function Le(e,t="$",n=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return cn(n,e,t),e;if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError(`action receipt: non-finite number at ${t}`);return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map((o,i)=>Le(o,`${t}[${i}]`,n));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let r={};for(let o of Object.keys(e).sort()){let i=`${t}.${o}`;if(an(o))throw new le(i);e[o]!==void 0&&(r[o]=Le(e[o],i,o))}return r}function ye(e){return Le(e)}var ln=/^ses-[0-9a-f]{32}$/,un=/^(?:sign|broadcast|execute|transaction\.execute|wallet\.sign)$/i,fn=/sign|broadcast|execute/i,pn="team-history-truncated",ot=`
|
|
2
|
+
[Message content truncated for durable storage.]`,mn=200,hn=512*1024,gn=64*1024,yn=48*1024;function I(e){return String(e??"").trim()}function wn(e){return I(e).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")}function je(e){return Buffer.byteLength(JSON.stringify(e),"utf8")}function bn(e,t){let n=String(e??"");if(Buffer.byteLength(n,"utf8")<=t)return n;let r=0,o=n.length;for(;r<o;){let c=Math.ceil((r+o)/2);Buffer.byteLength(n.slice(0,c),"utf8")<=t?r=c:o=c-1}let i=n.slice(0,r);return new RegExp("\\p{Surrogate}$","u").test(i)&&(i=i.slice(0,-1)),i}function kn(e){let t=I(e?.text),n=Math.max(0,yn-Buffer.byteLength(ot,"utf8")),r=Buffer.byteLength(t,"utf8")>n,o=Array.isArray(e?.artifacts)?e.artifacts:[],i=e?.generator&&typeof e.generator=="object"&&!Array.isArray(e.generator)?{kind:I(e.generator.kind).slice(0,80),provider:I(e.generator.provider).slice(0,120),model:I(e.generator.model).slice(0,160)}:void 0;return{id:I(e?.id).slice(0,200)||"message-compacted",sender:I(e?.sender).slice(0,200)||"system",name:I(e?.name).slice(0,200)||"Oracle",text:`${bn(t,n)}${ot}`,state:I(e?.state).slice(0,80)||"complete",createdAt:I(e?.createdAt).slice(0,80),artifacts:[],...e?.fallback===!0?{fallback:!0}:{},...e?.offline===!0?{offline:!0}:{},...i?{generator:i}:{},contentTruncated:!0,...o.length?{omittedArtifacts:o.length}:{},...!r&&o.length?{artifactPayloadTruncated:!0}:{}}}function An(e){let t=structuredClone(e);return je(t)<=gn?t:kn(t)}function xn(e){let t=0,n="";for(let r of e){if(r?.historyTruncated!==!0)continue;let o=Number(r.omittedMessages);Number.isSafeInteger(o)&&o>0&&(t+=o),n||(n=I(r.createdAt))}return{omittedMessages:t,createdAt:n}}function Sn(e,t){return{id:pn,sender:"system",name:"Oracle",text:`[Earlier team history omitted: ${e} ${e===1?"message":"messages"} pruned for durable storage.]`,state:"complete",createdAt:I(t),artifacts:[],historyTruncated:!0,omittedMessages:e}}function we(e,t={}){if(!e||typeof e!="object"||!Array.isArray(e.messages))throw new TypeError("Invalid team thread state");let n=Number.isSafeInteger(t.maxMessages)&&t.maxMessages>0?t.maxMessages:mn,r=Number.isSafeInteger(t.maxBytes)&&t.maxBytes>0?t.maxBytes:hn,o=xn(e.messages),i=o.omittedMessages,c=e.messages.filter(y=>y?.historyTruncated!==!0).map(An),u=Number.isSafeInteger(t.dropOldest)&&t.dropOldest>0?Math.min(t.dropOldest,c.length):0;if(u>0&&(c=c.slice(u),i+=u),c.length>n){let y=c.length-n;c=c.slice(y),i+=y}let g=()=>({...e,messages:[...i>0?[Sn(i,o.createdAt||c[0]?.createdAt)]:[],...c]});for(;c.length>0&&je(g())>r;)c=c.slice(1),i+=1;let m=g();if(je(m)>r)throw new Error("team thread metadata exceeds durable size budget");return m}function it(e,t){let n=Number.isSafeInteger(t)&&t>0?t:0;return we(e,{dropOldest:n})}function st(e,t){return e.slice(t.length).trim()}function ze(e=dn(16)){let t=Buffer.from(e).toString("hex");if(!/^[0-9a-f]{32}$/.test(t))throw new TypeError("Team session entropy must be exactly 16 bytes");return`ses-${t}`}function be(e){return ln.test(String(e??""))}function En({text:e,agents:t,leadAgentId:n}){let r=I(e);if(!r)throw new TypeError("Message is required");if(!Array.isArray(t)||t.length===0)throw new TypeError("Group needs at least one agent");let o=r.match(/^@(team|all)(?:\s+|$)/i);if(o)return{kind:"broadcast",targetAgentIds:t.map(c=>c.id),text:st(r,o[0])};if(r.startsWith("@")){let u=t.flatMap(m=>[{agent:m,mention:`@${I(m.id)}`},{agent:m,mention:`@${I(m.name)}`},{agent:m,mention:`@${wn(m.name)}`}]).sort((m,y)=>y.mention.length-m.mention.length).find(({mention:m})=>{let y=r.slice(0,m.length),O=r.at(m.length);return y.toLowerCase()===m.toLowerCase()&&(!O||/\s|[:,]/.test(O))});if(!u)throw new TypeError("Unknown agent mention");let g=st(r,u.mention).replace(/^[:,]\s*/,"");return{kind:"mention",targetAgentIds:[u.agent.id],text:g}}return{kind:"lead",targetAgentIds:[(t.find(c=>c.id===n)??t[0]).id],text:r}}function Tn(e,t=[]){let n=I(e?.provider);return n?new Set(t.map(o=>I(o))).has(n)?{status:"online"}:{status:"offline",reason:`${n} is not connected`}:{status:"online"}}function vn(e){ye(e);let t=I(e?.type),n=Array.isArray(e?.actions)?e.actions:[];if(un.test(t)||n.some(r=>fn.test(I(r?.type))))throw new TypeError("Chat cannot sign, broadcast, or execute")}function ue(e,t,n,r="complete"){return{id:I(e.id)||`message-${Date.now()}`,sender:t,name:n,text:I(e.text),state:r,createdAt:I(e.createdAt)||new Date().toISOString(),artifacts:[]}}function Me(e,t){if(vn(t),!e||!be(e.sessionId)||!Array.isArray(e.messages))throw new TypeError("Invalid team thread state");let n=[...e.messages];if(t.type==="message.user")n.push(ue(t,"user","You"));else if(t.type==="message.system")n.push(ue(t,"system","Oracle"));else if(t.type==="agent.offline"){let r=ue(t,I(t.agentId),I(t.name)||I(t.agentId),"offline");r.offline=!0;let o=n.findIndex(i=>i.id===t.id&&i.sender===t.agentId);o>=0?n.splice(o,1,r):n.push(r)}else if(t.type==="agent.started")n.push(ue(t,I(t.agentId),I(t.name)||I(t.agentId),"thinking"));else if(t.type==="agent.output"){let r=n.findIndex(i=>i.id===t.id&&i.sender===t.agentId),o=ue(t,I(t.agentId),I(t.name)||I(t.agentId));o.fallback=t.generator?.kind==="rules",o.generator=t.generator?{...t.generator}:void 0,o.artifacts=t.artifact?[{...t.artifact}]:[],r>=0?n.splice(r,1,o):n.push(o)}else if(t.type==="artifact.prepared"){let r=n.findIndex(o=>o.id===t.messageId);if(r<0)throw new TypeError("Artifact target message was not found");n[r]={...n[r],artifacts:[...n[r].artifacts,{...t.artifact}]}}else throw new TypeError(`Unsupported team thread event: ${t.type}`);return we({...e,messages:n})}var Ne=2e3,On=/^[a-z0-9][a-z0-9._-]{0,63}$/,$n=/^#[0-9a-fA-F]{6}$/,_n=new Set(["deterministic","model","policy","operator"]),Rn=new Set(ce.map(({id:e})=>e)),Cn=new Set(de.map(({id:e})=>e)),Hn=new Set(ae.map(({id:e})=>e)),Ln=/^p-[a-z0-9][a-z0-9_-]{0,62}$/,jn=["secret","privatekey","seed","seedphrase","mnemonic","password","passphrase","credential","apikey","apitoken","accesstoken","authtoken","authorization","signingmaterial","walletexport","keymaterial"],ke=/(?:\bshell\b|terminal|raw[ _.-]?http|\bmcp\b|private[ _.-]?key|seed[ _.-]?phrase|mnemonic|key[ _.-]?(?:import|export)|wallet[ _.-]?(?:key|custody)|\bcustod(?:y|ial)\b|\bsign(?:ing|er)?\b|\bbroadcast(?:ing)?\b|(?:execute|place)[ _.-]?(?:transaction|trade|order|swap)s?|submit[ _.-]?transactions?|transfer[ _.-]?(?:funds|assets|tokens|coins)|hold[ _.-]?(?:keys|funds|assets)|ignore (?:the )?policy|bypass|widen (?:the )?(?:cap|policy)|reveal (?:credential|secret))/i,zn=Object.freeze(["market-evidence","breadth-evidence","technical-evidence","basket-evidence","wallet-flow","contract-evidence","mint-evidence","scored-thesis","strategy-analysis","risk-decision","approved-intent","prepared-intent","prepared-basket","receipt"]),Mn=new Set(zn);function b(e){throw new TypeError(e)}function fe(e,t){(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&b(`${t} must be a plain object`)}function Nn(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function at(e){let t=Nn(e);return t==="auth"||jn.some(n=>t.includes(n))}function Pe(e,t="team",n=new Set){if(e&&typeof e=="object"){n.has(e)&&b(`unsafe cyclic field at ${t}`),n.add(e);for(let[r,o]of Object.entries(e))at(r)&&b(`forbidden secret-like field ${t}.${r}`),Pe(o,`${t}.${r}`,n);n.delete(e)}}function A(e){return e===null||typeof e=="string"||typeof e=="boolean"?e:typeof e=="number"?(Number.isFinite(e)||b("value must be finite"),e):Array.isArray(e)?e.map(A):(fe(e,"value"),Object.fromEntries(Object.keys(e).sort().map(t=>(at(t)&&b(`forbidden secret-like field ${t}`),[t,A(e[t])]))))}function X(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))X(t);Object.freeze(e)}return e}function ie(e){return In("sha256").update(JSON.stringify(A(e))).digest("hex")}function Z(e,t,n=500){return(typeof e!="string"||!e.trim()||e.length>n)&&b(`${t} is invalid`),e}function U(e,t){return Z(e,t,64),On.test(e)||b(`${t} is invalid`),e}function Pn(e){return(typeof e!="string"||!$n.test(e))&&b("agent color is invalid"),e}function Dn(e){let t=String.raw`(?:sign(?:ing)?|broadcast(?:ing)?|(?:execute|place|submit|transfer|hold|assume)\b[^.!?\n]*?\b(?:transactions?|trades?|orders?|swaps?|funds|assets|tokens|coins|keys|custody))`,n=e.replace(new RegExp(String.raw`\b(?:never|do not|don't|cannot|can't|must not|may not)\s+(?:directly\s+)?${t}(?:\s+or\s+${t})?`,"gi"),"");return ke.test(n)||new RegExp(String.raw`\b${t}\b`,"i").test(n)}function xe(e){return typeof e=="string"&&Ln.test(e)&&!ke.test(e)}function De(e){return U(e,"artifact kind"),Mn.has(e)||b(`artifact kind ${e} is not allowed`),e}function Ae(e,{nowMs:t=Date.now(),mode:n="shadow"}={}){fe(e,"policy"),Pe(e,"policy");let r=["autonomousOptIn","requiresWalletConfirmation","killSwitchRequired"];for(let i of r)typeof e[i]!="boolean"&&b(`policy.${i} must be boolean`);(!e.requiresWalletConfirmation||!e.killSwitchRequired)&&b("unsafe policy: wallet confirmation and kill switch are required");for(let i of["maxNotionalUsd","maxDailyLossUsd"])(!Number.isFinite(e[i])||e[i]<=0)&&b(`policy.${i} must be a positive finite cap`);(!Array.isArray(e.chainAllowlist)||!e.chainAllowlist.length)&&b("policy.chainAllowlist must be bounded");let o=e.chainAllowlist.map(i=>U(i,"chain id"));return new Set(o).size!==o.length&&b("duplicate chain id"),(!Number.isSafeInteger(e.expiresAt)||e.expiresAt<=t)&&b("policy expiry must be in the future"),n==="autonomous"&&!e.autonomousOptIn&&b("autonomous mode requires explicit opt-in"),{autonomousOptIn:e.autonomousOptIn,requiresWalletConfirmation:!0,killSwitchRequired:!0,maxNotionalUsd:e.maxNotionalUsd,maxDailyLossUsd:e.maxDailyLossUsd,chainAllowlist:o,expiresAt:e.expiresAt}}function Se(e,{nowMs:t=Date.now()}={}){fe(e,"team"),Pe(e);let n=e.kind===void 0?"pipeline":e.kind;n!=="pipeline"&&n!=="group"&&b("unsupported team kind");let r=n==="group";U(e.id,"team id"),Z(e.name,"team name",120),He.includes(e.mode)||b("unsupported team mode"),(!Array.isArray(e.agents)||!e.agents.length)&&b("agents must be non-empty");let o=new Set,i=e.agents.map((f,R)=>{fe(f,`agent ${R}`);let v=U(f.id,"agent id");o.has(v)&&b(`duplicate agent id ${v}`),o.add(v),Z(f.name,"agent name",120);let E=r?Z(f.role,"agent role",120):U(f.role,"agent role"),T=r&&f.color!==void 0?Pn(f.color):void 0;_n.has(f.runtime)||b("invalid agent runtime");let P=Z(f.soul,"agent Soul",Ne);Dn(P)&&b("unsafe Soul authority"),(!Array.isArray(f.toolIds)||!Array.isArray(f.skillIds))&&b("tool and skill IDs must be arrays");let s=f.toolIds.map(d=>(U(d,"tool id"),(!Rn.has(d)||ke.test(d))&&b(`forbidden tool ${d}`),d)),a=f.skillIds.map(d=>(U(d,"skill id"),(!Cn.has(d)&&!xe(d)||ke.test(d))&&b(`forbidden skill ${d}`),d));(new Set(s).size!==s.length||new Set(a).size!==a.length)&&b("duplicate tool or skill ID");let w=f.runtime==="model";return w?(Z(f.provider,"model provider",100),Hn.has(f.provider)||b("unsupported model provider"),Z(f.model,"model",160)):(f.provider!==void 0||f.model!==void 0)&&b("provider/model only allowed for model runtime"),!r&&f.role==="executor"&&f.runtime!=="operator"&&b("executor must use operator runtime"),!r&&f.runtime==="operator"&&f.role!=="executor"&&b("operator runtime is reserved for the executor"),r&&f.runtime==="operator"&&b("group chat agents cannot use operator runtime"),f.role!=="executor"&&s.some(d=>d==="intent.prepare"||d==="operator.handoff")&&b("executor tools require operator authority"),r&&(s.includes("intent.prepare")||s.includes("operator.handoff"))&&b("group chat agents cannot prepare operator actions"),{id:v,name:f.name,role:E,runtime:f.runtime,...w?{provider:f.provider,model:f.model}:{},soul:P,toolIds:s,skillIds:a,...T?{color:T}:{},...r&&f.packId!==void 0?{packId:U(f.packId,"pack id")}:{},...r?{autoTools:f.autoTools!==!1}:{}}});if(r){(!Array.isArray(e.edges)||e.edges.length!==0)&&b("group chat edges must be empty");let f=Z(e.summary||"A focused agent group.","team summary",500),R=e.sessionId===void 0?ze():e.sessionId;be(R)||b("group session id must use ses-hex format");let v=e.leadAgentId===void 0?i[0].id:U(e.leadAgentId,"lead agent id");o.has(v)||b("lead agent is not a group member");let E=Ae(e.policy,{nowMs:t,mode:e.mode}),T=A({kind:"group",id:e.id,sessionId:R,name:e.name,summary:f,mode:e.mode,leadAgentId:v,agents:i,edges:[],policy:E});return X({team:T,teamHash:ie(T),execution:{executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}})}let c=i.filter(f=>f.role==="executor");c.length!==1&&b("exactly one executor operator is required");let u=c[0];(!u.toolIds.includes("intent.prepare")||!u.toolIds.includes("operator.handoff"))&&b("executor requires prepare-only handoff tools"),Array.isArray(e.edges)||b("edges must be an array");let g=new Set,m=new Map([...o].map(f=>[f,[]])),y=e.edges.map(f=>{fe(f,"edge"),U(f.from,"edge source"),U(f.to,"edge target");let R=De(f.artifactKind);(!o.has(f.from)||!o.has(f.to))&&b("broken edge references unknown agent"),f.from===f.to&&b("cycle in team DAG");let v=`${f.from}\0${f.to}\0${R}`;return g.has(v)&&b("duplicate edge"),g.add(v),m.get(f.from).push(f.to),{from:f.from,to:f.to,artifactKind:R}}),O=new Set,M=new Set;function S(f){if(O.has(f)&&b("cycle in team DAG"),!M.has(f)){O.add(f);for(let R of m.get(f))S(R);O.delete(f),M.add(f)}}for(let f of o)S(f);m.get(u.id).length&&b("executor must be the terminal team agent");let z=f=>{let R=[f],v=new Set;for(;R.length;){let E=R.shift();if(E===u.id)return!0;v.has(E)||(v.add(E),R.push(...m.get(E)))}return!1};for(let f of o)z(f)||b(`agent ${f} is disconnected from executor`);let K=i.filter(f=>!y.some(R=>R.to===f.id));K.length!==1&&b("team pipeline requires exactly one root agent");for(let f of i){let R=y.filter(E=>E.to===f.id).length,v=y.filter(E=>E.from===f.id).length;(f.id===K[0].id?R!==0:R!==1)&&b("team pipeline requires exactly one incoming handoff per non-root agent"),(f.id===u.id?v!==0:v!==1)&&b("team pipeline requires exactly one outgoing handoff per non-executor agent")}let N=y.filter(f=>f.to===u.id);(N.length!==1||N[0].artifactKind!=="approved-intent")&&b("executor requires exactly one approved-intent input"),i.find(f=>f.id===N[0].from)?.runtime!=="policy"&&b("executor input must come from a policy agent");let _=Ae(e.policy,{nowMs:t,mode:e.mode}),Y=A({id:e.id,name:e.name,mode:e.mode,agents:i,edges:y,policy:_});return X({team:Y,teamHash:ie(Y),execution:{executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}})}var dt=new Set(ce.filter(e=>!e.signs&&!e.broadcasts).map(e=>e.id).filter(e=>!/intent\.prepare|operator\.handoff|sign|broadcast|execute/i.test(e))),lt=new Set(de.filter(e=>!e.signs&&!e.broadcasts).map(e=>e.id).filter(e=>!/armed|execution|sign|broadcast/i.test(e))),qn=Object.freeze([Object.freeze({pattern:/sentiment|social|narrative|realtime|news/i,toolIds:["sentiment.read"],skillIds:["social-sentiment"]}),Object.freeze({pattern:/risk|review|policy|cap|exposure/i,toolIds:["risk.evaluate"],skillIds:["bounded-risk"]}),Object.freeze({pattern:/wallet|flow|holder/i,toolIds:["wallet.watch"],skillIds:["wallet-monitoring"]}),Object.freeze({pattern:/contract|token|evm|bytecode/i,toolIds:["contract.read"],skillIds:["contract-research"]}),Object.freeze({pattern:/nft|mint|collection/i,toolIds:["nft.inspect"],skillIds:["mint-research"]}),Object.freeze({pattern:/basket|relative.?value|spread/i,toolIds:["basket.construct","basket.backtest"],skillIds:["basket-trading","relative-value-risk"]}),Object.freeze({pattern:/perp|technical|funding|open interest|\boi\b|rsi|macd/i,toolIds:["perp.indicators"],skillIds:["perp-technical-analysis","perp-strategy-planning"]}),Object.freeze({pattern:/breadth|dominance|total2|total3/i,toolIds:["market.breadth"],skillIds:["crypto-market-breadth"]}),Object.freeze({pattern:/backtest|simulation/i,toolIds:["strategy.backtest"],skillIds:["bounded-backtesting"]}),Object.freeze({pattern:/plan|planner|strategy|thesis|analyst/i,toolIds:["strategy.analyze"],skillIds:["bounded-strategy-analysis"]}),Object.freeze({pattern:/research|reader|market|scan/i,toolIds:["market.scan"],skillIds:["hyperliquid-markets"]})]),Ee=Object.freeze({toolIds:Object.freeze(["market.scan"]),skillIds:Object.freeze(["hyperliquid-markets"])});function ct(e,t){return[...new Set(e)].filter(n=>t.has(n))}function qe({role:e="",soul:t=""}={}){let n=`${String(e)} ${String(t)}`.trim(),r=qn.filter(c=>c.pattern.test(n));if(r.length===0)return{toolIds:[...Ee.toolIds],skillIds:[...Ee.skillIds]};let o=ct(r.flatMap(c=>c.toolIds),dt),i=ct(r.flatMap(c=>c.skillIds),lt);return{toolIds:o.length>0?o:[...Ee.toolIds],skillIds:i.length>0?i:[...Ee.skillIds]}}function Bn(e){return dt.has(e)||lt.has(e)}import j from"node:fs";import B from"node:path";import{createHash as gt}from"node:crypto";import W from"node:fs";import re from"node:path";var Be="https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",Kn=/^[a-z0-9]+(?:[._-][a-z0-9]+)*(?:\.[a-z0-9]+(?:[._-][a-z0-9]+)*)*$/;function Te(e){try{let t=W.lstatSync(e);return t.isDirectory()&&!t.isSymbolicLink()}catch{return!1}}function Fn(){return W.constants.O_NOFOLLOW||0}function Ke(e){try{let t=W.lstatSync(e);return t.isFile()&&!t.isSymbolicLink()}catch{return!1}}function ut(e){if(!Ke(e))return null;let t=W.openSync(e,W.constants.O_RDONLY|Fn());try{return W.readFileSync(t,"utf8")}finally{W.closeSync(t)}}function Un(e){let t=[],n=[];if(!e||typeof e!="object"||Array.isArray(e))return t.push("plugin.json must be a JSON object"),{valid:!1,errors:t,warnings:n};e.$schema!==Be&&(e.$schema?t.push(`unsupported $schema: ${e.$schema} (expected ${Be})`):t.push("$schema is required \u2014 must be "+Be)),!e.name||typeof e.name!="string"?t.push("name is required (string)"):Kn.test(e.name)||t.push(`name "${e.name}" must be kebab-case dot-separated (e.g. deployment.tools)`),(e.version===void 0||e.version===null||e.version==="")&&n.push("version is missing \u2014 semantic versioning recommended"),e.description!==void 0&&typeof e.description!="string"&&n.push("description must be a string"),e.author!==void 0&&(typeof e.author!="object"||Array.isArray(e.author))&&n.push("author must be an object with optional name, email, url"),e.keywords!==void 0&&(Array.isArray(e.keywords)||n.push("keywords must be an array")),e.license!==void 0&&typeof e.license!="string"&&n.push("license must be a string");let r=new Set(["$schema","name","version","description","author","homepage","repository","license","keywords","extensions"]);for(let o of Object.keys(e))r.has(o)||n.push(`unknown field "${o}" \u2014 will be ignored (use extensions.<namespace> for client data)`);return{valid:t.length===0,errors:t,warnings:n}}function Gn(e){let t=re.join(e,"skills"),n=[];if(!Te(t))return n;function r(o,i=""){for(let c of W.readdirSync(o,{withFileTypes:!0})){let u=re.join(o,c.name);if(c.isDirectory()){if(!Te(u))continue;r(u,i?`${i}/${c.name}`:c.name)}else if(c.name.endsWith(".md")){if(!Ke(u))continue;let g=i?`${i}/${c.name.replace(/\.md$/,"")}`:c.name.replace(/\.md$/,"");n.push({name:g,path:u,relativePath:re.relative(t,u)})}}}return r(t),n}function Yn(e){let t=re.join(e,"mcp"),n=[];if(!Te(t))return n;for(let r of W.readdirSync(t,{withFileTypes:!0})){if(!r.isFile()||!r.name.endsWith(".json"))continue;let o=re.join(t,r.name);if(Ke(o))try{let i=ut(o);if(i===null)continue;let c=JSON.parse(i);n.push({name:r.name.replace(/\.json$/,""),path:o,config:c})}catch(i){n.push({name:r.name.replace(/\.json$/,""),path:o,error:`invalid JSON: ${i.message}`})}}return n}function Fe(e){let t=re.resolve(e);if(!Te(t))return{ok:!1,error:`plugin directory not found: ${t}`};let n=re.join(t,"plugin.json");if(!W.existsSync(n))return{ok:!1,error:`missing plugin.json in ${t}`};let r;try{let u=ut(n);if(u===null)return{ok:!1,error:`plugin.json must be a regular file in ${t}`};r=JSON.parse(u)}catch(u){return{ok:!1,error:`invalid plugin.json: ${u.message}`}}let o=Un(r);if(!o.valid)return{ok:!1,error:"manifest validation failed",errors:o.errors};let i=Gn(t),c=Yn(t);return{ok:!0,plugin:{name:r.name,version:r.version||"0.0.0",description:r.description||"",author:r.author||{},license:r.license||"UNLICENSED",root:t,manifest:r,skills:i,mcpServers:c,warnings:[...o.warnings]}}}var Wn=Object.freeze([{name:"private key (hex 64)",re:/\b(?:0x)?[0-9a-fA-F]{64}\b/},{name:"BTC WIF",re:/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{name:"BIP39 seed phrase",re:/\b(?:[a-z]{3,8} ){11}(?:[a-z]{3,8})\b|\b(?:[a-z]{3,8} ){23}(?:[a-z]{3,8})\b/i},{name:"AWS access key",re:/\bAKIA[0-9A-Z]{16}\b/},{name:"OpenAI key",re:/\bsk-[A-Za-z0-9_-]{20,}\b/},{name:"Anthropic key",re:/\bsk-ant-[A-Za-z0-9_-]{20,}\b/},{name:"GitHub token",re:/\bgh[pousr]_[A-Za-z0-9]{36,}\b/},{name:"Slack token",re:/\bxox[baprs]-[A-Za-z0-9-]{10,}\b/},{name:"Telegram bot token",re:/\b\d{8,10}:[A-Za-z0-9_-]{35}\b/},{name:"PEM private key",re:/-----BEGIN (?:RSA |EC |OPENSSH |PGP )?PRIVATE KEY-----/},{name:"Solana keypair array",re:/\[\s*(?:\d{1,3}\s*,\s*){63}\d{1,3}\s*\]/},{name:"credential assignment",re:/\b(?:API_?KEY|SECRET|PASSWORD|PASSWD|PRIVATE_?KEY|MNEMONIC|SEED_?PHRASE|AUTH_?TOKEN|ACCESS_?TOKEN)\s*[:=]\s*['"]?[A-Za-z0-9+/=_.-]{12,}/i},{name:"JWT",re:/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/}]),Jn=/\b(?:seed|mnemonic|recovery|phrase|backup)\b/i;function ft(e){let t=String(e??"");if(!t)return null;for(let n of Wn){let r=t.match(n.re);if(r&&!(n.name==="BIP39 seed phrase"&&!Jn.test(t))){if(n.name==="private key (hex 64)"){let o=r.index||0,i=t.slice(Math.max(0,o-80),o);if(!/priv|secret|wif|seed|mnemonic|signer|wallet|key/i.test(i)||/hash|digest|sha256|txid|commit|blob|sha1/i.test(i))continue}return{name:n.name,index:r.index??0}}}return null}import pt from"node:path";import{homedir as Vn}from"node:os";var Xn=/^[a-z0-9][a-z0-9_-]{0,63}$/;var Oo=64*1024;function Zn(e=process.env){return e&&e.ORACLE_CONFIG_DIR||pt.join(Vn(),".config","oracle")}function mt(e=process.env){return pt.join(Zn(e),"plugins")}function ht(e,t){let n=String(e||"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,32),r=String(t||"").toLowerCase().replace(/\.md$/i,"").replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,24);if(!n||!r)return null;let o=`p-${n}-${r}`.slice(0,64);return Xn.test(o)?o:null}var Qn=new Set(ae.map(({id:e})=>e)),er=16,tr=200,nr=64*1024,rr=new Set(["bash","sh","zsh","fish","cmd","cmd.exe","powershell","pwsh"]),or=/(?:^|\/)\.(?:env|ssh|gnupg)(?:$|\/)|(?:^|\/)(?:id_rsa|id_ed25519|wallet\.json|keys\.json)(?:$|\.)/i;function $(e){let t=new TypeError(e);throw t.code="ORACLE_TEAM_PACK_REFUSED",t}function J(e){return typeof e=="string"?e.trim():""}function bt(e){let t=J(e);return t?!!(/^(https?:|git@|ssh:|file:|[\\/]{2})/i.test(t)||/\.git(?:$|[?#])/i.test(t)):!1}function sr(e,t){let n=new Set((t||[]).map(c=>String(c))),r=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,48)||"pack",o=r,i=2;for(;n.has(o);)o=`${r}-${i}`,i+=1;return o}function kt(e){let t=[],n=[e];for(;n.length;){let r=n.pop(),o;try{o=j.readdirSync(r,{withFileTypes:!0})}catch{$("pack directory is unreadable")}for(let i of o){let c=B.join(r,i.name);if((i.isSymbolicLink()||j.lstatSync(c).isSymbolicLink())&&$("pack cannot contain symbolic links"),i.isDirectory()){n.push(c);continue}i.isFile()&&(t.push(c),t.length>tr&&$("pack has too many files"))}}return t}function At(e){let t=j.lstatSync(e,{bigint:!0});(t.isSymbolicLink()||!t.isFile())&&$("pack files must be regular files");let n=j.openSync(e,j.constants.O_RDONLY|(j.constants.O_NOFOLLOW||0));try{let r=j.fstatSync(n,{bigint:!0});return(r.dev!==t.dev||r.ino!==t.ino)&&$("pack file changed while opening; retry the import"),(!r.isFile()||r.nlink!==1n)&&$("pack files must be regular files"),{fd:n,size:r.size}}catch(r){throw j.closeSync(n),r}}function yt(e){let{fd:t,size:n}=At(e);try{return n>BigInt(nr)?null:j.readFileSync(t)}finally{j.closeSync(t)}}function Ue(e){let t=kt(e).map(o=>({file:o,relative:B.relative(e,o).split(B.sep).join("/")})).sort((o,i)=>o.relative<i.relative?-1:o.relative>i.relative?1:0),n=gt("sha256"),r=Buffer.alloc(64*1024);for(let{file:o,relative:i}of t){let{fd:c}=At(o);try{let u=gt("sha256"),g;for(;(g=j.readSync(c,r,0,r.length,null))>0;)u.update(r.subarray(0,g));n.update(JSON.stringify([i,u.digest("hex")]))}finally{j.closeSync(c)}}return n.digest("hex")}function wt(e,t){let n=Buffer.isBuffer(e)?e.toString("utf8"):String(e||""),r=ft(n);r&&$(`pack ${t} contains ${r.name}`)}function ir(e){let t=J(e).replace(/\\/g,"/");return B.basename(t).toLowerCase()}function ar(e){e?.error&&$(`pack connector ${e.name||"unknown"} is invalid JSON`);let t=e?.config;(!t||typeof t!="object"||Array.isArray(t))&&$("pack connector config is invalid"),(t.url||t.headers||t.oauth||t.token)&&$("pack connectors cannot ship URLs, headers, or tokens"),t.env&&typeof t.env=="object"&&Object.keys(t.env).length&&$("pack connectors cannot ship env secrets; Oracle spawns them empty");let n=J(t.command);n||$("pack connector is missing a command"),rr.has(ir(n))&&$("pack connectors cannot spawn a shell")}function cr(e,t){let n=String(t||"").match(/^description:\s*(.+)$/m);return n?n[1].trim().slice(0,160):(String(t||"").split(`
|
|
3
|
+
`)[0].replace(/^#+\s*/,"").trim()||e).slice(0,160)}function dr({description:e,name:t,playbooks:n}){let r=[J(e)||`Imported pack ${t}.`,n.length?`Playbooks: ${n.map(o=>o.summary).join("; ")}.`:"","Cite sources and state when required data is unavailable. Never sign or broadcast."].filter(Boolean).join(" ");return r.length>Ne&&$("pack copy is too long"),r}function lr(e,t=B){let n=J(e);n||$("pack path is required"),bt(n)&&$("private packs are local folders, not git clones");let r=t.resolve(n),o;try{o=j.lstatSync(r)}catch{$("pack directory not found")}return o.isSymbolicLink()&&$("pack cannot be a symbolic link"),o.isDirectory()||$("pack path must be a directory"),r}function xt(e){return String(e||"").replace(/\//g,"-")}function Ge(e={}){let t=lr(e.root||e.path),n=kt(t);for(let g of n){let m=B.relative(t,g);or.test(m)&&$(`pack cannot include ${m}`)}let r=Ue(t);for(let g of n){let m=B.relative(t,g),y=yt(g);y&&/\.(md|json|txt|mjs|js|ts|yml|yaml)$/i.test(g)&&wt(y,m)}let o=Fe(t);o.ok||$(o.error||"invalid plugin.json");let i=o.plugin;for(let g of i.mcpServers||[])ar(g);let c=[];for(let g of i.skills||[]){if(c.length>=er)break;let m=ht(i.name,g?.name||g?.relativePath);if(!m||!xe(m))continue;let y=g?.path?yt(g.path):null,O=y?y.toString("utf8"):"",M=cr(m,O);wt(M,m),c.push({id:m,summary:M})}let u=dr({description:i.description,name:i.name,playbooks:c});return Ue(t)!==r&&$("pack content changed during scanning; retry the import"),{name:i.name,version:i.version||"0.0.0",description:i.description||"",contentHash:r,root:t,playbooks:c,connectorCount:(i.mcpServers||[]).length,soul:u}}function ur(e,t={}){let n=t.pluginsDir||mt(t.env||process.env);j.mkdirSync(n,{recursive:!0});let r=xt(e.name),o=B.join(n,r),i=B.resolve(o),c=B.resolve(e.root);if(j.existsSync(i)){let m;try{m=j.lstatSync(i)}catch{$(`plugin "${r}" already installed and unreadable`)}(m.isSymbolicLink()||!m.isDirectory())&&$(`plugin "${r}" already installed at an unsafe path`);let y=Fe(i);return y.ok||$(`plugin "${r}" already installed but invalid; remove it first`),(y.plugin.name!==e.name||y.plugin.version!==e.version)&&$(`plugin "${r}" already installed at v${y.plugin.version}; remove it first to import v${e.version}`),Ue(i)!==e.contentHash&&$(`plugin "${r}" already installed with different content; remove it first to import this pack`),i}let u=j.mkdtempSync(B.join(n,".team-pack-")),g=B.join(u,"pack");try{j.cpSync(c,g,{recursive:!0,dereference:!1}),Ge({path:g}).contentHash!==e.contentHash&&$("pack content changed during installation; retry the import"),j.renameSync(g,i)}finally{j.rmSync(u,{recursive:!0,force:!0})}return i}function fr(e={}){let t=Ge(e),n=J(e.provider),r=J(e.model);Qn.has(n)||$("unsupported model provider"),(!r||r.length>160)&&$("model is invalid"),e.install!==!1&&ur(t,e);let o=qe({role:J(e.role)||t.description||t.name,soul:t.soul}),i=[...new Set([...t.playbooks.map(g=>g.id),...o.skillIds])],c=J(e.name)||t.name,u=J(e.role)||t.description||"Imported pack";return{preview:t,agent:{id:sr(c,e.existingAgentIds||[]),name:c.slice(0,120),role:u.slice(0,120),runtime:"model",provider:n,model:r,soul:t.soul,toolIds:o.toolIds,skillIds:i,trigger:"Mention",cadence:"On message",autoTools:!0,packId:xt(t.name).slice(0,64)}}}var pr=/^[a-z0-9][a-z0-9._:-]{0,127}$/i,mr=/^[0-9a-f]{64}$/,hr=/^evidence:sha256:[0-9a-f]{64}$/,gr=new Set(["approved-intent","prepared-intent","prepared-basket"]),yr=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),wr=/^[A-Za-z0-9@:_./-]{1,64}$/;function ve(e,t){if(typeof e!="string"||!pr.test(e))throw new TypeError(`${t} is invalid`);return e}function br(e,t){if(typeof e!="string"||!mr.test(e))throw new TypeError(`${t} is invalid`);return e}function Ie(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`${t} must be a plain object`)}function St(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new TypeError(`${n}.${r} is not allowed`)}function oe(e,t,{allowZero:n=!1}={}){if(!Number.isFinite(e)||(n?e<0:e<=0))throw new TypeError(`${t} must be ${n?"non-negative":"positive"}`);let r=e*100;if(!Number.isSafeInteger(Math.round(r))||Math.abs(r-Math.round(r))>1e-8)throw new TypeError(`${t} must use exact USD cents`);return Math.round(r)}function kr(e,t,{nowMs:n,expiresAt:r}){if(Ie(e,"basket leg artifact"),e.version!==1)throw new TypeError("basket leg artifact must be version 1");if(e.surface!=="hl")throw new TypeError("basket leg artifact surface must be hl");if(e.action!=="order"||e.destination!=="hyperliquid")throw new TypeError("basket leg artifact must be a Hyperliquid order");if(!Number.isSafeInteger(e.expiresAtMs)||e.expiresAtMs<=n||e.expiresAtMs>r)throw new TypeError("basket leg artifact expiry must fit the handoff TTL");if(Ie(e.artifact,"basket leg artifact payload"),!yr.has(e.artifact.kind))throw new TypeError("basket leg artifact kind is not an order");if(e.artifact.coin!==t.market)throw new TypeError("basket leg artifact market mismatch");if(e.artifact.side!==t.side)throw new TypeError("basket leg artifact side mismatch");if(oe(e.artifact.notionalUsd,"basket leg artifact notional")!==oe(t.notionalUsd,"basket leg notional"))throw new TypeError("basket leg artifact notional mismatch")}function Ar(e,t,n){let r=e.executionPlan;if(r===void 0){if(n.mode==="armed")throw new TypeError("armed intent requires an exact execution plan");return}if(e.chainId!=="hyperliquid")throw new TypeError("armed execution plans require the Hyperliquid chain");if(e.intentType!=="perp"&&e.intentType!=="basket")throw new TypeError("intentType must be perp or basket");if(Ie(r,"executionPlan"),St(r,new Set(["atomic","partialFillRiskAcknowledged","legs"]),"executionPlan"),r.atomic!==!1)throw new TypeError("basket and perp plans must be explicitly non-atomic");if(!Array.isArray(r.legs))throw new TypeError("executionPlan.legs must be an array");let o=e.intentType==="basket"?2:1,i=e.intentType==="basket"?12:1;if(r.legs.length<o||r.legs.length>i)throw new TypeError(`${e.intentType} execution plan requires ${o}-${i} legs`);if(e.intentType==="basket"&&r.partialFillRiskAcknowledged!==!0)throw new TypeError("basket partial-fill risk must be acknowledged");if(e.intentType==="perp"&&typeof r.partialFillRiskAcknowledged!="boolean")throw new TypeError("perp partial-fill risk acknowledgement must be boolean");let c=new Set,u=0,g=0;for(let[m,y]of r.legs.entries()){if(Ie(y,`executionPlan.legs[${m}]`),St(y,new Set(["market","side","notionalUsd","weightBps","artifact"]),`executionPlan.legs[${m}]`),typeof y.market!="string"||!wr.test(y.market))throw new TypeError("basket leg market is invalid");if(c.has(y.market))throw new TypeError(`duplicate basket market ${y.market}`);if(c.add(y.market),y.side!=="buy"&&y.side!=="sell")throw new TypeError("basket leg side must be buy or sell");if(u+=oe(y.notionalUsd,"basket leg notional"),!Number.isSafeInteger(y.weightBps)||y.weightBps<=0||y.weightBps>1e4)throw new TypeError("basket leg weight must be positive basis points");g+=y.weightBps,kr(y.artifact,y,n)}if(g!==1e4)throw new TypeError("basket leg weights must sum to 10000 bps");if(u!==oe(e.notionalUsd,"intent notional"))throw new TypeError("basket aggregate notional must equal the exact leg sum");if(u>oe(t.maxNotionalUsd,"policy maxNotionalUsd"))throw new TypeError("basket aggregate notional exceeds policy cap")}function xr(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("intent payload must be an object");if(typeof e.chainId!="string"||!t.chainAllowlist.includes(e.chainId))throw new TypeError("intent chain is outside policy allowlist");if(!Number.isFinite(e.notionalUsd)||e.notionalUsd<=0||e.notionalUsd>t.maxNotionalUsd)throw new TypeError("intent notional exceeds policy cap");if(!Number.isFinite(e.maxLossUsd)||e.maxLossUsd<0||e.maxLossUsd>t.maxDailyLossUsd)throw new TypeError("intent loss exceeds policy cap");oe(e.notionalUsd,"intent notional"),oe(e.maxLossUsd,"intent max loss",{allowZero:!0}),Ar(e,t,n)}function Ye(e,{compiled:t}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("handoff must be an object");if(!t?.team||typeof t.teamHash!="string")throw new TypeError("compiled team snapshot is required");let n=e.nowMs??Date.now();if(!Number.isSafeInteger(n))throw new TypeError("nowMs is invalid");if(!Number.isSafeInteger(e.ttlMs)||e.ttlMs<=0||e.ttlMs>6e4)throw new TypeError("TTL must be bounded to 60 seconds");let r=ve(e.teamId,"teamId"),o=br(e.teamHash,"teamHash");if(t.team.id!==r||t.teamHash!==o)throw new TypeError("handoff team snapshot mismatch");let i=ve(e.sourceAgentId,"sourceAgentId"),c=ve(e.targetAgentId,"targetAgentId"),u=De(e.artifactKind);if(!t.team.edges.some(S=>S.from===i&&S.to===c&&S.artifactKind===u))throw new TypeError("handoff does not match compiled team edge");if(!Array.isArray(e.evidenceRefs)||!e.evidenceRefs.length)throw new TypeError("evidenceRefs must be non-empty");let g=e.evidenceRefs.map(S=>{if(typeof S!="string"||!hr.test(S))throw new TypeError("evidence reference must be a SHA-256 content hash");return S});if(new Set(g).size!==g.length)throw new TypeError("duplicate evidence reference");let m=A(e.payload),y=Ae(t.team.policy,{nowMs:n,mode:t.team.mode}),O=n+e.ttlMs;if(O>y.expiresAt)throw new TypeError("handoff TTL exceeds policy expiry");gr.has(u)&&xr(m,y,{mode:t.team.mode,nowMs:n,expiresAt:O});let M={teamId:r,teamHash:o,runId:ve(e.runId,"runId"),sourceAgentId:i,targetAgentId:c,artifactKind:u,payload:m,payloadHash:ie(m),evidenceRefs:g,ttlMs:e.ttlMs,issuedAt:n,expiresAt:O,policy:y,policyHash:ie(y)};return X(A({...M,handoffHash:ie(M),executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}))}import{createHash as Et,randomUUID as Sr}from"node:crypto";function Tt(e,t,n){let r=Et("sha256").update(JSON.stringify(t)).digest("hex");return`sha256:${Et("sha256").update(`${e}\0${r}\0${n}`).digest("hex")}`}function Er(e){return{...A({compiled:e.compiled,currentAgentId:e.currentAgentId,previousHandoffHash:e.previousHandoffHash,executionConsumed:e.executionConsumed,confirmationPending:!1}),consumedHandoffHashes:[...e.consumedHandoffHashes]}}function Tr(e){return{...A(e),consumedHandoffHashes:new Set(e?.consumedHandoffHashes||[]),confirmationPending:!1}}function We(e){return{...A({compiled:e.compiled,currentAgentId:e.currentAgentId,previousHandoffHash:e.previousHandoffHash,executionConsumed:e.executionConsumed,confirmationPending:e.confirmationPending}),consumedHandoffHashes:new Set(e.consumedHandoffHashes)}}var vr=new Set(["approved-intent","prepared-intent","prepared-basket"]),Ir=Object.freeze(["executionAllowed","verified","trusted","status","riskChecks","observedAt","liveData","policy","policyHash","evidenceRefs","handoffHash","signed","broadcast","backendSigner","signingReady","broadcastReady","requiresOperatorConfirmation"]);function Q(e,t,n){if(n>=t.compiled.team.policy.expiresAt)throw e.status="expired",e.updatedAt=n,new Error("team policy expired")}function vt(e,t){if(vr.has(e)&&!(!t||typeof t!="object"||Array.isArray(t))){if(Object.hasOwn(t,"kind")||"kind"in t)throw new TypeError("intent payload kind is not an intent artifact");for(let n of Ir)if(Object.hasOwn(t,n)||n in t)throw new TypeError("intent payload cannot carry authority or provenance claims")}}function It(e,t){if(!e)throw new TypeError("step must consume the exact prior handoff");if(t<e.issuedAt)throw new Error("prior handoff is not yet valid");if(t>=e.expiresAt)throw new Error("prior handoff expired")}function Oe(e,t){e.clear();for(let[n,r]of t)e.set(n,r)}function Ot(e){let t=e?.receipt;if(typeof t?.transactionHash=="string"&&/^0x[0-9a-f]{64}$/i.test(t.transactionHash)){if(t.status===1||t.status==="0x1")return"confirmed";if(t.status===0||t.status==="0x0")return"failed"}let n=e?.order;if(typeof n?.orderId=="string"&&/^[a-z0-9][a-z0-9._:-]{0,127}$/i.test(n.orderId)){if(n.status==="filled")return"confirmed";if(n.status==="rejected")return"failed"}return"unknown"}function Or({now:e=Date.now,storage:t,stateStore:n,tenantId:r="local-owner",executionAdapter:o,reconciliationAdapter:i}={}){let c=String(r||"").trim();if(!c)throw new TypeError("tenantId is required");let u=t??new Map,g=new Map,m=new Map,y=new Map,O=!n,M=null,S=0,z=Promise.resolve(),K=async(s,a)=>u.set(s,A(a)),N=async s=>u.get(s),se=async()=>u instanceof Map?[...u.values()]:u.list(),_=s=>X(A(s));function Y(s){let a=z.then(s,s);return z=a.catch(()=>{}),a}function f(){if(!(u instanceof Map)){if(n)throw new Error("durable team state requires map-backed definitions");return{definitions:null,runs:new Map([...g].map(([s,a])=>[s,A(a)])),contexts:new Map([...m].map(([s,a])=>[s,We(a)])),threads:new Map([...y].map(([s,a])=>[s,A(a)]))}}return{definitions:new Map([...u].map(([s,a])=>[s,A(a)])),runs:new Map([...g].map(([s,a])=>[s,A(a)])),contexts:new Map([...m].map(([s,a])=>[s,We(a)])),threads:new Map([...y].map(([s,a])=>[s,A(a)]))}}function R(s,a){return{version:1,revision:a,tenantId:c,definitions:[...s.definitions.values()].map(A),runs:[...s.runs.values()].map(A),contexts:[...s.contexts.entries()].map(([w,d])=>({runId:w,context:Er(d)})),threads:[...s.threads.values()].map(A)}}function v(s){s.definitions&&Oe(u,s.definitions),Oe(g,s.runs),Oe(m,s.contexts),Oe(y,s.threads)}function E(s,{persist:a=!0}={}){return Y(async()=>{let w=f(),d=s(w),l=S;if(a&&n){let h=S,p=await n.save(R(w,h),{expectedRevision:h});l=p.revision,w.threads=new Map((p.threads||[]).map(k=>[k.teamId,A(k)]))}return v(w),S=l,d})}async function T(){O||(M||(M=(async()=>{let s=await n.load();if(s.tenantId!==c)throw new Error("team state tenant mismatch");if(!Number.isSafeInteger(s.revision)||s.revision<0)throw new Error("team state revision is invalid");if(!(u instanceof Map))throw new Error("durable team state requires map-backed definitions");let a={definitions:new Map,runs:new Map,contexts:new Map,threads:new Map};for(let l of s.definitions)a.definitions.set(l.team.id,A(l));for(let l of s.runs)a.runs.set(l.id,A(l));for(let l of s.contexts)a.contexts.set(l.runId,Tr(l.context));for(let l of s.threads||[])a.threads.set(l.teamId,A(l));let w=!1;for(let l of a.runs.values()){if(!(l.status==="executing"||l.attempts?.some(k=>k.status==="submission-unknown")))continue;l.status="reconciliation-required",l.executionAllowed=!1,l.requiresOperatorConfirmation=!1,l.uncertainExecution=!0,l.updatedAt=e();let p=a.contexts.get(l.id);p&&(p.executionConsumed=!0,p.confirmationPending=!1),w=!0}let d=s.revision;if(w){let l=await n.save(R(a,d),{expectedRevision:d});d=l.revision,a.threads=new Map((l.threads||[]).map(h=>[h.teamId,A(h)]))}v(a),S=d,O=!0})()),await M)}async function P(){if(typeof o?.status!="function")throw new Error("armed mode requires a local execution adapter");let s=await o.status();if(!s?.configured||!s?.reachable||s?.armed!==!0)throw new Error("local signer is not armed and reachable");if(typeof o?.executeConfirmedArtifact!="function")throw new Error("armed mode requires a local execution adapter");return s}return Object.freeze({async save(s){if(await T(),!(u instanceof Map)){let w=await Y(async()=>{let d=typeof s?.id=="string"?await N(s.id):null,l=s?.kind==="group"&&s.sessionId===void 0?d:null,h=l?.team?.kind==="group"?{...s,sessionId:l.team.sessionId}:s,p=Se(h,{nowMs:e()});if(d&&d.team?.kind!==p.team.kind)throw new Error("team kind cannot change");return await K(p.team.id,p),p});return _(w)}let a=await E(w=>{let d=typeof s?.id=="string"?w.definitions.get(s.id):null,l=s?.kind==="group"&&s.sessionId===void 0?d:null,h=l?.team?.kind==="group"?{...s,sessionId:l.team.sessionId}:s,p=Se(h,{nowMs:e()}),k=w.definitions.get(p.team.id);if(k&&k.team?.kind!==p.team.kind)throw new Error("team kind cannot change");return w.definitions.set(p.team.id,A(p)),p.team.kind==="group"&&!w.threads.has(p.team.id)&&w.threads.set(p.team.id,{teamId:p.team.id,sessionId:p.team.sessionId,messages:[]}),w.definitions.get(p.team.id)});return _(a)},async list(){return await T(),_(await se())},async get(s){await T();let a=await N(s);return a===void 0?null:_(a)},async remove(s){await T();let a=String(s||"").trim();if(!(u instanceof Map)){if(typeof u.delete!="function")throw new Error("team storage does not support deletion");return _(await Y(async()=>{let d=await N(a);if(!d||d.team?.kind!=="group")throw new Error(`unknown group ${a}`);if(await u.delete(a)===!1||await N(a)!==void 0)throw new Error(`team deletion failed ${a}`);y.delete(a);for(let[h,p]of g)p.teamId===a&&(g.delete(h),m.delete(h));return{deleted:!0,teamId:a}}))}let w=await E(d=>{let l=d.definitions.get(a);if(!l||l.team?.kind!=="group")throw new Error(`unknown group ${a}`);d.definitions.delete(a),d.threads.delete(a);for(let[h,p]of d.runs)p.teamId===a&&(d.runs.delete(h),d.contexts.delete(h));return{deleted:!0,teamId:a}});return _(w)},async listThreads(){return await T(),_([...y.values()])},async getThread(s){await T();let a=y.get(s);return a===void 0?null:_(a)},async appendThreadEvent(s,a){return await T(),await E(w=>{let d=w.definitions?.get(s);if(!d||d.team.kind!=="group")throw new Error(`unknown group ${s}`);let l=w.threads.get(s)||{teamId:s,sessionId:d.team.sessionId,messages:[]},h=Me(l,a);w.threads.set(s,{...h,teamId:s})}),_(y.get(s))},async getRun(s){await T();let a=g.get(s);return a===void 0?null:_(a)},async getTurnState(s,a){return await T(),Y(()=>{let w=g.get(s),d=m.get(s);if(!w||!d)throw new Error(`unknown run ${s}`);if(w.teamId!==a)throw new Error("run team mismatch");if(w.status!=="running"&&w.status!=="shadowing")throw new Error(`run is not active: ${w.status}`);let l=e();if(Q(A(w),d,l),d.previousHandoffHash!==null){let h=w.steps.at(-1);if(!h||h.handoffHash!==d.previousHandoffHash)throw new TypeError("step must consume the exact prior handoff");It(h,l)}return _({run:w,compiled:d.compiled,currentAgentId:d.currentAgentId,previousHandoffHash:d.previousHandoffHash,inbound:w.steps.at(-1)?.payload??null})})},async start(s){await T();let a=await N(s);if(!a)throw new Error(`unknown team ${s}`);if(a.team.kind==="group")throw new Error("group chats do not start pipeline runs");let w=X(A(a));w.team.mode==="armed"&&await P();let d=await E(l=>{let h=l.definitions?l.definitions.get(s):w;if(!h)throw new Error(`unknown team ${s}`);if(h.team.mode==="draft")throw new Error("draft team must be promoted before running");if(h.team.mode==="halted")throw new Error("team kill switch is active");let p=e();if(p>=h.team.policy.expiresAt)throw new Error("team policy expired");let k=h.team.mode==="armed",x=h.team.agents.find(q=>!h.team.edges.some(C=>C.to===q.id));if(!x)throw new Error("team pipeline has no root agent");let H={id:Sr(),tenantId:c,teamId:s,teamHash:h.teamHash,status:h.team.mode==="shadow"?"shadowing":"running",mode:h.team.mode,armed:k,startedAt:p,updatedAt:p,expiresAt:h.team.policy.expiresAt,maxSteps:h.team.edges.length,steps:[],receipts:[],attempts:[],executionAllowed:!1,backendSigner:k,signingReady:k,broadcastReady:k,requiresOperatorConfirmation:!0,signed:!1,broadcast:!1};return l.runs.set(H.id,H),l.contexts.set(H.id,{compiled:X(A(h)),currentAgentId:x.id,previousHandoffHash:null,consumedHandoffHashes:new Set,executionConsumed:!1,confirmationPending:!1}),H});return _(d)},async step(s,a){await T();let w=await E(d=>{let l=d.runs.get(s),h=d.contexts.get(s);if(!l||!h)throw new Error(`unknown run ${s}`);if(l.status==="halted")throw new Error("run is halted");if(l.status==="paused")throw new Error("run is paused");if(l.status!=="running"&&l.status!=="shadowing")throw new Error("run cannot step from its current state");let p=e();if(Q(l,h,p),l.steps.length>=l.maxSteps)throw new Error("run step budget exhausted");if(a?.agentId!==h.currentAgentId)throw new TypeError("step agent is out of order");let k=h.compiled.team.edges.find(C=>C.from===a.agentId);if(!k||k.to!==a?.targetAgentId||k.artifactKind!==a?.artifactKind)throw new TypeError("artifact does not match the exact next team edge");let x,H=null;if(h.previousHandoffHash===null){if(a.inputHandoffHash!==void 0)throw new TypeError("root step cannot consume a prior handoff");x=a.evidenceRefs}else{if(a.inputHandoffHash!==h.previousHandoffHash)throw new TypeError("step must consume the exact prior handoff");if(h.consumedHandoffHashes.has(a.inputHandoffHash))throw new TypeError("handoff was already consumed");let C=l.steps.at(-1);if(!C||C.handoffHash!==a.inputHandoffHash)throw new TypeError("step must consume the exact prior handoff");It(C,p),H=a.inputHandoffHash,x=[`evidence:sha256:${a.inputHandoffHash}`]}if(a.payload?.kind==="risk-decision"&&a.payload.status==="measured")throw new TypeError("measured risk evidence requires trusted runtime provenance");if(a.payload?.kind==="risk-decision"){if(a.payload.status!=="unknown")throw new TypeError("risk evidence status must be unknown");let C=h.compiled.team.agents.find(L=>L.id===k.from);if(C?.role!=="risk"||C.runtime!=="policy")throw new TypeError("only the policy risk agent can block for unknown evidence");if(a.payload.executionAllowed!==!1||a.payload.executionPlan!==void 0||!Array.isArray(a.payload.riskChecks)||a.payload.riskChecks.length!==3)throw new TypeError("unknown risk evidence cannot assert approval or measured amounts");if(a.payload.notionalUsd!==null||a.payload.maxLossUsd!==null||a.payload.chainId!==null||a.payload.observedAt!==null||a.payload.liveData!=="unavailable"||a.payload.riskChecks.some(L=>L.pass!==!1||L.status!=="unknown"))throw new TypeError("unknown risk evidence cannot assert approval or measured amounts");return l.riskEvidence=A(a.payload),l.status="risk-blocked",l.executionAllowed=!1,l.requiresOperatorConfirmation=!1,l.updatedAt=p,l}vt(k.artifactKind,a.payload);let q=Ye({teamId:l.teamId,teamHash:l.teamHash,runId:s,sourceAgentId:k.from,targetAgentId:k.to,artifactKind:k.artifactKind,payload:a.payload,evidenceRefs:x,ttlMs:a.ttlMs,nowMs:p},{compiled:h.compiled});return H!==null&&h.consumedHandoffHashes.add(H),l.steps.push(q),l.updatedAt=p,h.currentAgentId=k.to,h.previousHandoffHash=q.handoffHash,k.to===h.compiled.team.agents.find(C=>C.role==="executor").id&&(l.status=l.mode==="armed"?"awaiting-confirmation":"prepared",l.preparedAt=p,l.mode!=="armed"&&(l.completedAt=p)),l});return _(w)},async confirm(s,a){await T();let w=await E(d=>{let l=d.runs.get(s),h=d.contexts.get(s);if(!l||!h)throw new Error(`unknown run ${s}`);if(l.status==="halted")throw new Error("run is halted");if(l.status!=="awaiting-confirmation")throw new Error("run cannot confirm from its current state or was already executed");let p=e();Q(l,h,p);let k=l.steps.at(-1);if(!k||k.artifactKind!=="approved-intent")throw new Error("approved intent handoff is required");if(p>=k.expiresAt)throw new Error("approved intent handoff expired");if(vt(k.artifactKind,k.payload),a?.handoffHash!==k.handoffHash)throw new TypeError("confirmation must bind the exact handoff hash");if(a?.operatorConfirmed!==!0||a?.sign!==!0||a?.broadcast!==!0)throw new TypeError("explicit confirm, sign, and broadcast instruction is required");if(h.executionConsumed||h.confirmationPending)throw new Error("approved intent is already executing or was already executed");return h.confirmationPending=!0,A(k)},{persist:!1});try{await P();let d=w.payload?.executionPlan?.legs;if(!Array.isArray(d)||!d.length)throw new Error("approved intent has no executable legs");await E(h=>{let p=h.runs.get(s),k=h.contexts.get(s);if(!p||!k)throw new Error(`unknown run ${s}`);let x=e();if(Q(p,k,x),p.status==="halted")throw new Error("run was halted before execution");if(p.status!=="awaiting-confirmation")throw new Error("run cannot confirm from its current state");if(!k.confirmationPending||k.executionConsumed)throw new Error("approved intent is already executing or was already executed");if(x>=w.expiresAt)throw new Error("approved intent handoff expired");k.executionConsumed=!0,p.status="executing",p.updatedAt=x});for(let[h,p]of d.entries()){let k=Tt(c,p.artifact,h);await E(C=>{let L=C.runs.get(s),D=C.contexts.get(s);if(!L||!D)throw new Error(`unknown run ${s}`);if(L.status==="halted")throw new Error("run was halted during sequential basket execution");if(L.status!=="executing")throw new Error("run cannot execute from its current state");let te=e();if(Q(L,D,te),te>=w.expiresAt)throw new Error("approved intent handoff expired during execution");L.attempts[h]={legIndex:h,idempotencyKey:k,status:"submission-unknown",submittedAt:te},L.updatedAt=te});let x=await o.executeConfirmedArtifact(A(p.artifact),{tenantId:c,runId:s,handoffHash:w.handoffHash,idempotencyKey:k,legIndex:h,legCount:d.length});await E(C=>{let L=C.runs.get(s);if(!L)throw new Error(`unknown run ${s}`);let D=L.attempts[h];if(!D||D.idempotencyKey!==k)throw new Error("execution attempt state changed before receipt persistence");D.status="receipt-recorded",D.receipt=A(x),D.receivedAt=e(),L.receipts.push(A(x)),L.updatedAt=D.receivedAt});let H=g.get(s),q=m.get(s);if(H?.status==="halted")throw new Error("run was halted during sequential basket execution");if(!H||!q)throw new Error(`unknown run ${s}`);if(Q(A(H),We(q),H.updatedAt),H.updatedAt>=w.expiresAt)throw new Error("approved intent handoff expired during execution")}let l=await E(h=>{let p=h.runs.get(s),k=h.contexts.get(s);if(!p||!k)throw new Error(`unknown run ${s}`);if(p.status==="halted")throw new Error("run was halted during sequential basket execution");if(p.status!=="executing")throw new Error("run cannot complete from its current state");if(Q(p,k,p.updatedAt),p.updatedAt>=w.expiresAt)throw new Error("approved intent handoff expired during execution");return p.status="completed",p.executionAllowed=!1,p.requiresOperatorConfirmation=!1,p.signed=!0,p.broadcast=!0,p.completedAt=e(),p.updatedAt=p.completedAt,p});return _(l)}catch(d){if(m.get(s)?.executionConsumed)try{await E(h=>{let p=h.runs.get(s),k=h.contexts.get(s);if(!p||!k)return;let x=p.attempts.some(H=>H.status==="submission-unknown");p.status!=="halted"&&p.status!=="expired"&&(p.status=x?"reconciliation-required":"failed"),p.executionAllowed=!1,p.uncertainExecution=x,p.partialExecution=p.receipts.length>0,p.error=d instanceof Error?d.message:"local execution failed",p.updatedAt=e()})}catch{}throw d}finally{await E(d=>{let l=d.contexts.get(s);l&&(l.confirmationPending=!1)},{persist:!1})}},async reconcile(s){if(typeof s!="string"||!/^[a-z0-9][a-z0-9._:-]{0,127}$/i.test(s))throw new TypeError("runId is invalid");let a=await Y(async()=>{if(n){let x=await n.load();if(x.tenantId!==c)throw new Error("team state tenant mismatch");return A({run:x.runs.find(H=>H.id===s)??null,revision:x.revision})}return A({run:g.get(s)??null,revision:S})}),w=a.run;if(!w||w.tenantId!==c)throw new Error(`unknown run ${s}`);let d=w.steps.at(-1),l=d?.payload?.executionPlan?.legs??[],h=[];for(let x of w.attempts||[]){let H=l[x.legIndex],q={tenantId:c,runId:s,handoffHash:d?.handoffHash??null,idempotencyKey:x.idempotencyKey,legIndex:x.legIndex,tradeId:H?.artifact?.tradeId??null},C="unknown",L="unavailable",D=null,te="lookup-unavailable",tt=H&&Number.isSafeInteger(x.legIndex)&&x.legIndex>=0&&x.idempotencyKey===Tt(c,H.artifact,x.legIndex);if(tt&&x.status==="receipt-recorded"&&Number.isSafeInteger(x.receivedAt)&&x.receivedAt>=x.submittedAt&&x.receivedAt<=e()&&(C=Ot(x.receipt),C!=="unknown"&&(L="stored-receipt",D=x.receivedAt)),tt&&C==="unknown"){for(let ge of["lookupReceipt","lookupOrder"])if(typeof i?.[ge]=="function")try{let F=await i[ge](_(q));if(F?.available===!1){["disabled","hosted","unconfigured","lookup-unavailable","identity-mismatch","invalid-evidence"].includes(F.reason)&&(te=F.reason);break}if(!F||Object.keys(q).some(nt=>F[nt]!==q[nt])||!Number.isSafeInteger(F.observedAt)||F.observedAt<x.submittedAt||F.observedAt>e())continue;if(C=Ot(ge==="lookupReceipt"?{receipt:F.receipt}:{order:F.order}),C!=="unknown"){L=ge,D=F.observedAt;break}}catch{}}h.push({...q,status:C,source:L,observedAt:D,reason:C==="unknown"?te:null})}let p=Math.max(0,l.length-h.length),k=!h.length||p>0||h.some(x=>x.status==="unknown");return _({runId:s,tenantId:c,runStatus:w.status,revision:a.revision,readOnly:!0,executionAllowed:!1,recoveryRequired:k,status:k?"reconciliation-required":"reconciled",attempts:h,unattemptedLegs:p})},async pause(s){await T();let a=await E(w=>{let d=w.runs.get(s);if(!d)throw new Error(`unknown run ${s}`);if(d.status!=="running"&&d.status!=="shadowing")throw new Error("only an active run can be paused");return d.resumeStatus=d.status,d.status="paused",d.updatedAt=e(),d});return _(a)},async resume(s){await T();let a=await E(w=>{let d=w.runs.get(s),l=w.contexts.get(s);if(!d||!l)throw new Error(`unknown run ${s}`);if(d.status!=="paused")throw new Error("only a paused run can be resumed");let h=e();return Q(d,l,h),d.status=d.resumeStatus==="shadowing"?"shadowing":"running",delete d.resumeStatus,d.updatedAt=h,d});return _(a)},async halt(s){await T();let a=await E(w=>{let d=w.runs.get(s);if(!d)throw new Error(`unknown run ${s}`);return d.status="halted",delete d.resumeStatus,d.updatedAt=e(),d});return _(a)}})}import{createHash as _r}from"node:crypto";var $r=["chain-allowlist","notional-cap","loss-cap"];function Je({evidence:e,intent:t}={}){return{kind:"risk-decision",status:"unknown",liveData:"unavailable",observedAt:null,chainId:null,notionalUsd:null,maxLossUsd:null,executionAllowed:!1,reason:"Trusted runtime observation provenance is unavailable",prompt:typeof e?.prompt=="string"?e.prompt:typeof t?.prompt=="string"?t.prompt:"",riskChecks:$r.map(r=>({check:r,pass:!1,status:"unknown"}))}}var Rr=/\b[A-Z][A-Z0-9]{1,5}\b/g,Cr=3e4;function Hr(e){return _r("sha256").update(e).digest("hex")}function Lr(e){return String(e).replace(/\$\s*\d[\d,.]*/g,"[amount]").slice(0,500)}function jr(e){let t=new Set(e.edges.map(c=>c.to)),n=e.agents.find(c=>!t.has(c.id));if(!n)throw new Error("team pipeline has no root agent");let r=new Map(e.edges.map(c=>[c.from,c])),o=[],i=n.id;for(;r.has(i);){let c=r.get(i);o.push(c),i=c.to}if(o.length!==e.edges.length)throw new Error("team pipeline edges are not a single ordered chain");return o}function zr({prompt:e,nowMs:t}){let n=[...new Set(e.match(Rr)||[])];return{kind:"evidence",prompt:e,observations:n,generatedAt:t,source:"operator-prompt",liveData:"unavailable"}}function $t({agent:e,prompt:t,inbound:n}){let r=n?.kind==="evidence"?`evidence observations [${(n.observations||[]).join(", ")}]`:n?.kind==="analysis"?`prior ${n.role||"analysis"} thesis`:"operator prompt only",o=Lr(`Rule-based bounded summary: ${e.role} review of ${r} for prompt "${t}". No live market data was read and no prices or market numbers are asserted.`);return{kind:"analysis",role:e.role,thesis:o,generator:{kind:"rules"},degradedReason:"model runtime unavailable"}}function Mr(e){return Array.isArray(e)?e.slice(0,16).flatMap(t=>{let n=typeof t?.name=="string"?t.name.trim():"",r=typeof t?.argsHash=="string"?t.argsHash:"";return!/^[a-z0-9][a-z0-9._:-]{0,63}$/.test(n)||!/^[0-9a-f]{64}$/.test(r)?[]:[{name:n,argsHash:r,ok:t?.ok===!0}]}):[]}async function Nr({agent:e,prompt:t,inbound:n,modelInvoker:r}){if(typeof r!="function")return $t({agent:e,prompt:t,inbound:n});try{let o=await r({agent:e,prompt:t,inbound:n});if(typeof o?.text!="string"||!o.text.trim())throw new Error("model invoker returned no text");let i=Mr(o.toolCalls),c=n?.intent&&typeof n.intent=="object"?n.intent:n?.evidence?.intent,u=n?.kind==="evidence"?n:n?.evidence?.kind==="evidence"?n.evidence:void 0;return{kind:"analysis",role:e.role,thesis:o.text,generator:{kind:"model",provider:e.provider,model:e.model},...i.length?{toolCalls:i}:{},...c?{intent:c}:{},...u?{evidence:u}:{}}}catch{return $t({agent:e,prompt:t,inbound:n})}}function Pr({prompt:e,inbound:t,compiled:n,nowMs:r}){let o=t?.kind==="evidence"?t:t?.evidence?.kind==="evidence"?t.evidence:void 0,i=t?.intent&&typeof t.intent=="object"?t.intent:o?.intent;return{...Je({policy:n?.policy,evidence:o,intent:i,nowMs:r}),prompt:e}}function Dr(e,t){if(t.kind==="evidence"){let n=t.observations.length?t.observations.join(", "):"no symbols";return`${e.name}: parsed operator prompt (${n}); live market data unavailable.`}if(t.kind==="analysis"){let n=t.generator.kind==="model"?`${t.generator.provider}/${t.generator.model}`:"bounded rules";return`${e.name}: ${t.thesis.slice(0,160)} (via ${n})`}if(t.status==="measured"){let n=t.riskChecks.every(r=>r.pass===!0)?"bounds satisfied":"a measured bound failed";return`${e.name}: measured risk ${n}; execution blocked pending operator confirmation.`}return`${e.name}: risk unknown; live timestamped observations unavailable. No intent approved; execution blocked.`}async function qr({service:e,team:t,teamId:n,runId:r,prompt:o,nowMs:i,modelInvoker:c,onEvent:u}={}){let g=typeof u=="function"?m=>{u(m)}:()=>{};try{if(!e)throw new TypeError("service is required");if(typeof o!="string"||!o.trim())throw new TypeError("prompt is required");if(o.length>4e3)throw new TypeError("prompt exceeds 4000 characters");let m=String(n||t?.team?.id||t?.id||"");if(!m)throw new TypeError("teamId is required");let y=await e.get(m);if(!y)throw new Error(`unknown team ${m}`);if(y.team.kind==="group")throw new Error("group chats do not run pipeline turns");let O=Number.isSafeInteger(i)?i:Date.now();if(r!==void 0&&(typeof r!="string"||!/^[a-z0-9][a-z0-9._:-]{0,127}$/i.test(r)))throw new TypeError("runId is invalid");let M=r??(await e.start(m)).id,S=await e.getTurnState(M,m),z=S.run,K=S.compiled.team,N=jr(K),se=N.findIndex(v=>v.from===S.currentAgentId),_=z.steps.at(-1);if(se<0||se!==z.steps.length||S.previousHandoffHash!==(_?.handoffHash??null)||_&&_.targetAgentId!==S.currentAgentId)throw new Error("persisted run cursor mismatch");if(z.steps.length>0){let v=z.steps[0]?.payload?.prompt;if(typeof v!="string")throw new Error("committed prompt unavailable");o=v}g({type:"run.started",run:z});let Y=new Map(K.agents.map(v=>[v.id,v])),f=S.previousHandoffHash,R=S.inbound;for(let v=se;v<N.length;v+=1){let E=N[v],T=Y.get(E.from);g({type:"agent.started",agentId:T.id,name:T.name,role:T.role,runtime:T.runtime});let P;if(T.runtime==="deterministic")P=zr({prompt:o,nowMs:O});else if(T.runtime==="model")P=await Nr({agent:T,prompt:o,inbound:R,modelInvoker:c});else if(T.runtime==="policy")P=Pr({prompt:o,inbound:R,compiled:K,nowMs:O});else throw new Error(`agent runtime ${T.runtime} cannot produce a handoff artifact`);g({type:"agent.output",agentId:T.id,text:Dr(T,P),payload:P});let s={agentId:E.from,targetAgentId:E.to,artifactKind:E.artifactKind,payload:P,ttlMs:Cr};if(v===0?s.evidenceRefs=[`evidence:sha256:${Hr(`${m}\0${o}`)}`]:s.inputHandoffHash=f,z=await e.step(z.id,s),z.status==="risk-blocked")break;let a=z.steps.at(-1);f=a.handoffHash,R=P,g({type:"handoff.verified",handoff:{sourceAgentId:a.sourceAgentId,targetAgentId:a.targetAgentId,artifactKind:a.artifactKind,handoffHash:a.handoffHash}})}return g({type:"run.status",run:z}),z}catch(m){throw g({type:"error",message:m instanceof Error?m.message:"team turn failed"}),m}}import{closeSync as pe,constants as V,fchmodSync as _t,fstatSync as Pt,fsyncSync as Ve,linkSync as Br,lstatSync as ee,mkdirSync as Kr,openSync as me,readFileSync as he,readlinkSync as Rt,realpathSync as Fr,renameSync as Ur,rmSync as Xe,writeFileSync as Ct}from"node:fs";import{createHash as Gr,randomBytes as Ht}from"node:crypto";import{homedir as Yr}from"node:os";import{basename as Wr,dirname as _e,join as Re,resolve as Jr}from"node:path";var Dt=1,et=V.O_NOFOLLOW??0,Vr=16*1024*1024,Ze=15*1024*1024;function Xr(e){let t=String(e||"").trim();if(!t||t.length>200||/[\u0000-\u001f\u007f]/.test(t))throw new TypeError("tenantId is required");return t}function qt(e){return e==null?e:structuredClone(e)}function Ce(e,t,n=!1,r=process.platform){let o=n?!e.isDirectory():!e.isFile(),i=r!=="win32",c=i&&typeof process.getuid=="function"&&Number(e.uid)!==process.getuid(),u=i&&(Number(e.mode)&18)!==0;if(e.isSymbolicLink()||o||c||u)throw new Error(`${t} must be an owner-controlled ${n?"directory":"regular file"}`)}function Lt(e,t){Kr(e,{recursive:!0,mode:448});let n=ee(e);Ce(n,"team state directory",!0,t)}function Zr(e,t){let n=Gr("sha256").update(t).digest("hex");return Re(e,`${n}.json`)}function jt(e){return Buffer.byteLength(`${JSON.stringify(e)}
|
|
4
|
+
`,"utf8")}function zt(e){let t=Date.parse(String(e?.createdAt||""));return Number.isFinite(t)?t:Number.MIN_SAFE_INTEGER}function Qr(e){let t={...e,threads:e.threads.map(r=>we(r))},n=jt(t);for(;n>Ze;){let r=t.threads.flatMap((u,g)=>u.messages.map((m,y)=>({message:m,messageIndex:y,thread:u,threadIndex:g})).filter(({message:m})=>m?.historyTruncated!==!0));if(r.length===0)throw new Error("team state non-thread data exceeds durable size budget");r.sort((u,g)=>{let m=zt(u.message)-zt(g.message);if(m!==0)return m;let y=String(u.thread.teamId||""),O=String(g.thread.teamId||"");return y<O?-1:y>O?1:u.messageIndex!==g.messageIndex?u.messageIndex-g.messageIndex:u.threadIndex-g.threadIndex});let o=n-Ze,i=new Map,c=0;for(let u of r)if(i.set(u.threadIndex,(i.get(u.threadIndex)||0)+1),c+=Buffer.byteLength(JSON.stringify(u.message),"utf8")+1,c>=o+i.size*512)break;t={...t,threads:t.threads.map((u,g)=>{let m=i.get(g)||0;return m>0?it(u,m):u})},n=jt(t)}return t}function Bt(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("team state snapshot must be an object");let n={...e,threads:e.threads===void 0?[]:e.threads};if(n.version!==Dt||n.tenantId!==t)throw new TypeError("team state tenant or version mismatch");if(!Number.isSafeInteger(n.revision)||n.revision<0)throw new TypeError("team state revision must be a non-negative safe integer");for(let r of["definitions","runs","contexts","threads"])if(!Array.isArray(n[r]))throw new TypeError(`team state ${r} must be an array`);return ye(n),Qr(qt(n))}function eo(e){return{version:Dt,revision:0,tenantId:e,definitions:[],runs:[],contexts:[],threads:[]}}function Mt(e,t,n){try{let r=ee(e);if(Ce(r,"team state file",!1,n),r.size>Vr)throw new Error("team state file is too large");return Bt(JSON.parse(he(e,"utf8")),t)}catch(r){if(r?.code==="ENOENT")return eo(t);throw r}}function G(e,t){return Object.assign(new Error(`team state lock recovery refused: ${e}`,{cause:t}),{code:"ETEAMLOCKRECOVERY"})}function to(e){if(e!=="linux"||process.platform!=="linux")return null;try{let t=he("/proc/self/stat","utf8"),n=Number(t.slice(0,t.indexOf(" "))),r=t.slice(t.lastIndexOf(")")+2).split(" ")[19],o=he("/proc/sys/kernel/random/boot_id","utf8").trim(),i=Rt("/proc/self/ns/pid");return n!==process.pid||!/^[0-9]+$/.test(r)||!/^[0-9a-f-]{36}$/.test(o)||!/^pid:\[[0-9]+\]$/.test(i)||Rt(`/proc/${n}/ns/pid`)!==i?null:{pid:n,uid:process.getuid(),startedAt:r,bootId:o,pidNamespace:i}}catch{return null}}function no(e){let t=Fr(_e(e)),n=ee(t,{bigint:!0});return{file:Re(t,Wr(e)),device:String(n.dev),inode:String(n.ino)}}function $e(e,t){return e.dev===t.dev&&e.ino===t.ino}function Nt(e,t){try{if($e(Pt(t,{bigint:!0}),ee(e,{bigint:!0})))return}catch(n){throw G("lock ownership could not be verified",n)}throw G("lock ownership changed")}function Qe(e){let t=me(e,V.O_RDONLY);try{Ve(t)}finally{pe(t)}}function ro(e,t){let n=e?.owner,r=t.owner;if(e?.version!==1||typeof e?.nonce!="string"||!/^[0-9a-f]{32}$/.test(e.nonce)||!r||!n||!Number.isSafeInteger(n.pid)||n.pid<=0||typeof n.startedAt!="string"||!/^[0-9]+$/.test(n.startedAt)||n.uid!==r.uid||n.bootId!==r.bootId||n.pidNamespace!==r.pidNamespace||e.store?.file!==t.store.file||e.store?.device!==t.store.device||e.store?.inode!==t.store.inode)throw G("foreign or unverifiable owner/store identity");try{process.kill(n.pid,0)}catch(o){if(o?.code!=="ESRCH")throw G("owner liveness is unknown",o);try{ee(`/proc/${n.pid}`)}catch(i){if(i?.code==="ENOENT")return;throw G("owner proc identity is inaccessible",i)}throw G("owner still has a proc identity")}throw G("owner is live")}function oo(e,t,n){let r;try{let o=ee(e,{bigint:!0});Ce(o,"team state lock",!1,n),r=me(e,V.O_RDONLY|V.O_NONBLOCK|et);let i=Pt(r,{bigint:!0});if(Ce(i,"team state lock",!1,n),!$e(o,i)||i.size>8192)throw G("lock changed or is oversized");let c=he(r,"utf8"),u=JSON.parse(c);ro(u,t);let g=`${e}.recovered-${u.nonce}`;if(Br(e,g),!$e(i,ee(g,{bigint:!0})))throw G("lock replaced during recovery election");if(Qe(_e(e)),!$e(i,ee(e,{bigint:!0}))||he(e,"utf8")!==c)throw G("lock changed during recovery");Xe(e),Qe(_e(e))}catch(o){throw o?.code==="ETEAMLOCKRECOVERY"?o:G("lock is ambiguous, unsafe, or recovery is already fenced",o)}finally{r!==void 0&&pe(r)}}function so(e,t,n){let r=V.O_CREAT|V.O_EXCL|V.O_WRONLY|et;try{return me(e,r,384)}catch(o){if(o?.code!=="EEXIST")throw o;return oo(e,t,n),me(e,r,384)}}function Kt(e=process.env){let t=String(e?.ORACLE_CONFIG_DIR||"").trim()||Re(Yr(),".config","oracle");return Re(t,"teams","state")}function io(e={}){let{rootDir:t=Kt(),tenantId:n,platform:r=process.platform}=e,o=Xr(n),i=Jr(t),c=Zr(i,o),u=`${c}.lock`;return Object.freeze({tenantId:o,file:c,async load(){return Lt(i,r),Mt(c,o,r)},async save(g,{expectedRevision:m}={}){if(Lt(i,r),!Number.isSafeInteger(m)||m<0)throw new TypeError("team state expectedRevision must be a non-negative safe integer");let y={version:1,nonce:Ht(16).toString("hex"),store:no(c),owner:to(r)},O,M=`${c}.${process.pid}.${Ht(8).toString("hex")}.tmp`,S;try{O=so(u,y,r),Ct(O,`${JSON.stringify(y)}
|
|
5
|
+
`,"utf8"),Ve(O),_t(O,384);let z=Mt(c,o,r);if(z.revision!==m)throw new Error(`team state changed: stale revision ${m}; current revision ${z.revision}`);let K=Bt({...g,revision:m+1},o),N=`${JSON.stringify(K)}
|
|
6
|
+
`;if(Buffer.byteLength(N,"utf8")>Ze)throw new Error("team state exceeds durable serialized size budget");return S=me(M,V.O_CREAT|V.O_EXCL|V.O_WRONLY|et,384),Ct(S,N,"utf8"),Ve(S),_t(S,384),pe(S),S=void 0,Nt(u,O),Ur(M,c),r!=="win32"&&Qe(_e(c)),qt(K)}finally{try{S!==void 0&&pe(S),Xe(M,{force:!0})}finally{if(O!==void 0)try{Nt(u,O),Xe(u)}finally{pe(O)}}}}})}export{Gt as BASKET_STRATEGY_CATALOG,de as CRYPTO_SKILL_CATALOG,ce as CRYPTO_TOOL_CATALOG,Ft as MARKET_BREADTH_CATALOG,ae as MODEL_PROVIDER_CATALOG,Ut as PERP_SIGNAL_CATALOG,He as TEAM_MODES,Vt as TEAM_TEMPLATES,qe as autoSelectAgentCapabilities,Se as compileTeamDefinition,io as createDurableTeamStore,Ye as createTeamHandoff,Or as createTeamService,ze as createTeamSessionId,Kt as defaultTeamStateRoot,Je as evaluateRiskEvidence,Tn as getAgentPresence,fr as importTeamAgentFromPack,Bn as isAutoSelectableCapability,xe as isPackSkillId,be as isTeamSessionId,bt as looksRemotePackSource,Me as reduceTeamThread,En as routeTeamMessage,qr as runTeamTurn,Ge as scanTeamAgentPack};
|