@oracle-agent/oracle 0.35.34 → 0.35.36
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 +43 -8
- package/artifacts/specialist-packs/oracle-full-crypto.json +11 -0
- package/dist/address-book.mjs +2 -2
- package/dist/agent-sessions.mjs +8 -8
- package/dist/assets/profiles/canton-agent/SOUL.md +44 -0
- package/dist/assets/profiles/canton-agent/profile.json +30 -0
- package/dist/assets/profiles/oracle/SOUL.md +1 -0
- package/dist/assets/skills/oracle-canton/SKILL.md +49 -0
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/bin/desk-server.mjs +35 -35
- package/dist/bin/oracle-data-mcp.mjs +17 -17
- package/dist/bin/oracle-gateway.mjs +14 -14
- package/dist/bin/oracle-launch-radar-shadow.mjs +4 -4
- 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 +4 -4
- package/dist/bin/oracle-route.mjs +8 -8
- package/dist/bin/oracle-scan.mjs +10 -10
- package/dist/bin/oracle.mjs +8 -6
- package/dist/cli/commands/agent-session.mjs +10 -10
- package/dist/cli/commands/airdrop.mjs +16 -0
- package/dist/cli/commands/chain.mjs +1 -1
- package/dist/cli/commands/chat.mjs +215 -204
- package/dist/cli/commands/doctor.mjs +5 -5
- package/dist/cli/commands/eval.mjs +151 -141
- package/dist/cli/commands/extension-policy.mjs +3 -3
- package/dist/cli/commands/farm.mjs +22 -22
- package/dist/cli/commands/mint.mjs +22 -0
- package/dist/cli/commands/model.mjs +219 -208
- package/dist/cli/commands/plugins.mjs +42 -39
- package/dist/cli/commands/quickstart.mjs +6 -6
- package/dist/cli/commands/session-vault.mjs +1 -1
- package/dist/cli/commands/sign.mjs +12 -12
- package/dist/cli/commands/signer.mjs +25 -23
- package/dist/cli/commands/snipe.mjs +6 -6
- package/dist/cli/commands/swap.mjs +12 -12
- package/dist/cli/commands/venues.mjs +2 -2
- package/dist/control/receipt-lineage.mjs +1 -0
- package/dist/data/desk-data.mjs +33 -33
- package/dist/data/providers/farming.mjs +2 -2
- package/dist/data/providers/lp-destination-discovery.mjs +4 -4
- package/dist/index.mjs +50 -49
- package/dist/launch-radar/index.mjs +4 -4
- package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
- package/dist/local-signer/index.mjs +3 -3
- package/dist/local-signer/runtime.mjs +22 -20
- package/dist/router/index.mjs +3 -3
- package/dist/router/prepare-bridge.mjs +1 -1
- package/dist/scanner/index.mjs +4 -4
- package/dist/task.mjs +2 -2
- package/dist/teams/index.mjs +3 -1
- package/dist/tui/standalone-client.mjs +85 -75
- package/package.json +3 -2
- package/public/eval-report.json +6 -6
- package/public/oracle-splash/assets/desktop-app.jpg +0 -0
- package/public/oracle-splash/assets/hero/agent-session-poster.jpg +0 -0
- package/public/oracle-splash/assets/hero/agent-session.mp4 +0 -0
- package/public/oracle-splash/assets/hero/agent-session.webm +0 -0
- package/public/oracle-splash/assets/oracle-cli-v03535-poster.jpg +0 -0
- package/public/oracle-splash/assets/oracle-cli-v03535.gif +0 -0
- package/public/oracle-splash/assets/protocol-build-time.jpg +0 -0
- package/public/oracle-splash/downloads/index.html +2 -2
- package/public/oracle-splash/index.html +132 -54
- package/server.json +2 -2
package/dist/teams/index.mjs
CHANGED
|
@@ -1 +1,3 @@
|
|
|
1
|
-
var M=Object.freeze(["draft","shadow","confirm","armed","autonomous","halted"]),J=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,n])=>Object.freeze({id:e,description:n}))),Z=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,n])=>Object.freeze({id:e,description:n}))),Q=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,n])=>Object.freeze({id:e,description:n}))),D=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,n])=>Object.freeze({id:e,auth:n}))),X=[["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","Evaluate an intent against policy"],["intent.prepare","Prepare a non-executable intent"],["operator.handoff","Create an operator confirmation handoff"]],$=Object.freeze(X.map(([e,n])=>Object.freeze({id:e,description:n,signs:!1,broadcasts:!1}))),ee=[["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"]],P=Object.freeze(ee.map(([e,n])=>Object.freeze({id:e,description:n,signs:!1,broadcasts:!1}))),te=Object.freeze({autonomousOptIn:!1,requiresWalletConfirmation:!0,killSwitchRequired:!0,maxNotionalUsd:100,maxDailyLossUsd:10,chainAllowlist:Object.freeze(["ethereum"]),expiresAt:41024448e5});function S({id:e,name:n,scannerName:o,scannerTool:s,scannerSkill:u,scannerArtifact:l,chainAllowlist:E}){return Object.freeze({id:e,name:n,mode:"draft",agents:Object.freeze([Object.freeze({id:"scanner",name:o,role:"scanner",runtime:"deterministic",soul:"Collect bounded public evidence with source times.",toolIds:Object.freeze([s]),skillIds:Object.freeze([u])}),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:l}),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({...te,chainAllowlist:Object.freeze(E)})})}var re=Object.freeze([S({id:"hyperliquid-alpha",name:"Hyperliquid Alpha",scannerName:"Market Scanner",scannerTool:"market.scan",scannerSkill:"hyperliquid-markets",scannerArtifact:"market-evidence",chainAllowlist:["hyperliquid"]}),S({id:"perp-market-breadth",name:"Perp Market Breadth",scannerName:"Breadth Scanner",scannerTool:"market.breadth",scannerSkill:"crypto-market-breadth",scannerArtifact:"breadth-evidence",chainAllowlist:["hyperliquid"]}),S({id:"perp-technical-strategy",name:"Perp Technical Strategy",scannerName:"Perp Technical Scanner",scannerTool:"perp.indicators",scannerSkill:"perp-technical-analysis",scannerArtifact:"technical-evidence",chainAllowlist:["hyperliquid"]}),S({id:"basket-relative-value",name:"Basket Relative Value",scannerName:"Basket Constructor",scannerTool:"basket.construct",scannerSkill:"basket-trading",scannerArtifact:"basket-evidence",chainAllowlist:["hyperliquid"]}),S({id:"wallet-watch",name:"Wallet Watch",scannerName:"Wallet Monitor",scannerTool:"wallet.watch",scannerSkill:"wallet-monitoring",scannerArtifact:"wallet-flow",chainAllowlist:["ethereum","base"]}),S({id:"evm-launch-radar",name:"EVM Launch Radar",scannerName:"Launch Scanner",scannerTool:"contract.read",scannerSkill:"contract-research",scannerArtifact:"contract-evidence",chainAllowlist:["ethereum","base","arbitrum"]}),S({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 ne}from"node:crypto";var ae=/^[a-z0-9][a-z0-9._-]{0,63}$/,oe=new Set(["deterministic","model","policy","operator"]),ie=new Set($.map(({id:e})=>e)),se=new Set(P.map(({id:e})=>e)),ce=new Set(D.map(({id:e})=>e)),de=["secret","privatekey","seed","seedphrase","mnemonic","password","passphrase","credential","apikey","apitoken","accesstoken","authtoken","authorization","signingmaterial","walletexport","keymaterial"],N=/(?:\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,le=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"]),fe=new Set(le);function c(e){throw new TypeError(e)}function R(e,n){(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&c(`${n} must be a plain object`)}function ue(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function V(e){let n=ue(e);return n==="auth"||de.some(o=>n.includes(o))}function K(e,n="team",o=new Set){if(e&&typeof e=="object"){o.has(e)&&c(`unsafe cyclic field at ${n}`),o.add(e);for(let[s,u]of Object.entries(e))V(s)&&c(`forbidden secret-like field ${n}.${s}`),K(u,`${n}.${s}`,o);o.delete(e)}}function T(e){return e===null||typeof e=="string"||typeof e=="boolean"?e:typeof e=="number"?(Number.isFinite(e)||c("value must be finite"),e):Array.isArray(e)?e.map(T):(R(e,"value"),Object.fromEntries(Object.keys(e).sort().map(n=>(V(n)&&c(`forbidden secret-like field ${n}`),[n,T(e[n])]))))}function v(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let n of Object.values(e))v(n);Object.freeze(e)}return e}function _(e){return ne("sha256").update(JSON.stringify(T(e))).digest("hex")}function z(e,n,o=500){return(typeof e!="string"||!e.trim()||e.length>o)&&c(`${n} is invalid`),e}function O(e,n){return z(e,n,64),ae.test(e)||c(`${n} is invalid`),e}function pe(e){let n=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))`,o=e.replace(new RegExp(String.raw`\b(?:never|do not|don't|cannot|can't|must not|may not)\s+(?:directly\s+)?${n}(?:\s+or\s+${n})?`,"gi"),"");return N.test(o)||new RegExp(String.raw`\b${n}\b`,"i").test(o)}function U(e){return O(e,"artifact kind"),fe.has(e)||c(`artifact kind ${e} is not allowed`),e}function B(e,{nowMs:n=Date.now(),mode:o="shadow"}={}){R(e,"policy"),K(e,"policy");let s=["autonomousOptIn","requiresWalletConfirmation","killSwitchRequired"];for(let l of s)typeof e[l]!="boolean"&&c(`policy.${l} must be boolean`);(!e.requiresWalletConfirmation||!e.killSwitchRequired)&&c("unsafe policy: wallet confirmation and kill switch are required");for(let l of["maxNotionalUsd","maxDailyLossUsd"])(!Number.isFinite(e[l])||e[l]<=0)&&c(`policy.${l} must be a positive finite cap`);(!Array.isArray(e.chainAllowlist)||!e.chainAllowlist.length)&&c("policy.chainAllowlist must be bounded");let u=e.chainAllowlist.map(l=>O(l,"chain id"));return new Set(u).size!==u.length&&c("duplicate chain id"),(!Number.isSafeInteger(e.expiresAt)||e.expiresAt<=n)&&c("policy expiry must be in the future"),o==="autonomous"&&!e.autonomousOptIn&&c("autonomous mode requires explicit opt-in"),{autonomousOptIn:e.autonomousOptIn,requiresWalletConfirmation:!0,killSwitchRequired:!0,maxNotionalUsd:e.maxNotionalUsd,maxDailyLossUsd:e.maxDailyLossUsd,chainAllowlist:u,expiresAt:e.expiresAt}}function G(e,{nowMs:n=Date.now()}={}){R(e,"team"),K(e),O(e.id,"team id"),z(e.name,"team name",120),M.includes(e.mode)||c("unsupported team mode"),(!Array.isArray(e.agents)||!e.agents.length)&&c("agents must be non-empty");let o=new Set,s=e.agents.map((r,m)=>{R(r,`agent ${m}`);let y=O(r.id,"agent id");o.has(y)&&c(`duplicate agent id ${y}`),o.add(y),z(r.name,"agent name",120),O(r.role,"agent role"),oe.has(r.runtime)||c("invalid agent runtime");let x=z(r.soul,"agent Soul",2e3);pe(x)&&c("unsafe Soul authority"),(!Array.isArray(r.toolIds)||!Array.isArray(r.skillIds))&&c("tool and skill IDs must be arrays");let j=r.toolIds.map(k=>(O(k,"tool id"),(!ie.has(k)||N.test(k))&&c(`forbidden tool ${k}`),k)),q=r.skillIds.map(k=>(O(k,"skill id"),(!se.has(k)||N.test(k))&&c(`forbidden skill ${k}`),k));(new Set(j).size!==j.length||new Set(q).size!==q.length)&&c("duplicate tool or skill ID");let Y=r.runtime==="model";return Y?(z(r.provider,"model provider",100),ce.has(r.provider)||c("unsupported model provider"),z(r.model,"model",160)):(r.provider!==void 0||r.model!==void 0)&&c("provider/model only allowed for model runtime"),r.role==="executor"&&r.runtime!=="operator"&&c("executor must use operator runtime"),r.runtime==="operator"&&r.role!=="executor"&&c("operator runtime is reserved for the executor"),r.role!=="executor"&&j.some(k=>k==="intent.prepare"||k==="operator.handoff")&&c("executor tools require operator authority"),{id:y,name:r.name,role:r.role,runtime:r.runtime,...Y?{provider:r.provider,model:r.model}:{},soul:x,toolIds:j,skillIds:q}}),u=s.filter(r=>r.role==="executor");u.length!==1&&c("exactly one executor operator is required");let l=u[0];(!l.toolIds.includes("intent.prepare")||!l.toolIds.includes("operator.handoff"))&&c("executor requires prepare-only handoff tools"),Array.isArray(e.edges)||c("edges must be an array");let E=new Set,g=new Map([...o].map(r=>[r,[]])),A=e.edges.map(r=>{R(r,"edge"),O(r.from,"edge source"),O(r.to,"edge target");let m=U(r.artifactKind);(!o.has(r.from)||!o.has(r.to))&&c("broken edge references unknown agent"),r.from===r.to&&c("cycle in team DAG");let y=`${r.from}\0${r.to}\0${m}`;return E.has(y)&&c("duplicate edge"),E.add(y),g.get(r.from).push(r.to),{from:r.from,to:r.to,artifactKind:m}}),h=new Set,f=new Set;function i(r){if(h.has(r)&&c("cycle in team DAG"),!f.has(r)){h.add(r);for(let m of g.get(r))i(m);h.delete(r),f.add(r)}}for(let r of o)i(r);g.get(l.id).length&&c("executor must be the terminal team agent");let a=r=>{let m=[r],y=new Set;for(;m.length;){let x=m.shift();if(x===l.id)return!0;y.has(x)||(y.add(x),m.push(...g.get(x)))}return!1};for(let r of o)a(r)||c(`agent ${r} is disconnected from executor`);let t=s.filter(r=>!A.some(m=>m.to===r.id));t.length!==1&&c("team pipeline requires exactly one root agent");for(let r of s){let m=A.filter(x=>x.to===r.id).length,y=A.filter(x=>x.from===r.id).length;(r.id===t[0].id?m!==0:m!==1)&&c("team pipeline requires exactly one incoming handoff per non-root agent"),(r.id===l.id?y!==0:y!==1)&&c("team pipeline requires exactly one outgoing handoff per non-executor agent")}let d=A.filter(r=>r.to===l.id);(d.length!==1||d[0].artifactKind!=="approved-intent")&&c("executor requires exactly one approved-intent input"),s.find(r=>r.id===d[0].from)?.runtime!=="policy"&&c("executor input must come from a policy agent");let p=B(e.policy,{nowMs:n,mode:e.mode}),w=T({id:e.id,name:e.name,mode:e.mode,agents:s,edges:A,policy:p});return v({team:w,teamHash:_(w),execution:{executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}})}var me=/^[a-z0-9][a-z0-9._:-]{0,127}$/i,he=/^[0-9a-f]{64}$/,we=/^evidence:sha256:[0-9a-f]{64}$/,ye=new Set(["approved-intent","prepared-intent","prepared-basket"]),ge=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),be=/^[A-Za-z0-9@:_./-]{1,64}$/;function L(e,n){if(typeof e!="string"||!me.test(e))throw new TypeError(`${n} is invalid`);return e}function Ae(e,n){if(typeof e!="string"||!he.test(e))throw new TypeError(`${n} is invalid`);return e}function C(e,n){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`${n} must be a plain object`)}function W(e,n,o){for(let s of Object.keys(e))if(!n.has(s))throw new TypeError(`${o}.${s} is not allowed`)}function I(e,n,{allowZero:o=!1}={}){if(!Number.isFinite(e)||(o?e<0:e<=0))throw new TypeError(`${n} must be ${o?"non-negative":"positive"}`);let s=e*100;if(!Number.isSafeInteger(Math.round(s))||Math.abs(s-Math.round(s))>1e-8)throw new TypeError(`${n} must use exact USD cents`);return Math.round(s)}function xe(e,n,{nowMs:o,expiresAt:s}){if(C(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<=o||e.expiresAtMs>s)throw new TypeError("basket leg artifact expiry must fit the handoff TTL");if(C(e.artifact,"basket leg artifact payload"),!ge.has(e.artifact.kind))throw new TypeError("basket leg artifact kind is not an order");if(e.artifact.coin!==n.market)throw new TypeError("basket leg artifact market mismatch");if(e.artifact.side!==n.side)throw new TypeError("basket leg artifact side mismatch");if(I(e.artifact.notionalUsd,"basket leg artifact notional")!==I(n.notionalUsd,"basket leg notional"))throw new TypeError("basket leg artifact notional mismatch")}function ke(e,n,o){let s=e.executionPlan;if(s===void 0){if(o.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(C(s,"executionPlan"),W(s,new Set(["atomic","partialFillRiskAcknowledged","legs"]),"executionPlan"),s.atomic!==!1)throw new TypeError("basket and perp plans must be explicitly non-atomic");if(!Array.isArray(s.legs))throw new TypeError("executionPlan.legs must be an array");let u=e.intentType==="basket"?2:1,l=e.intentType==="basket"?12:1;if(s.legs.length<u||s.legs.length>l)throw new TypeError(`${e.intentType} execution plan requires ${u}-${l} legs`);if(e.intentType==="basket"&&s.partialFillRiskAcknowledged!==!0)throw new TypeError("basket partial-fill risk must be acknowledged");if(e.intentType==="perp"&&typeof s.partialFillRiskAcknowledged!="boolean")throw new TypeError("perp partial-fill risk acknowledgement must be boolean");let E=new Set,g=0,A=0;for(let[h,f]of s.legs.entries()){if(C(f,`executionPlan.legs[${h}]`),W(f,new Set(["market","side","notionalUsd","weightBps","artifact"]),`executionPlan.legs[${h}]`),typeof f.market!="string"||!be.test(f.market))throw new TypeError("basket leg market is invalid");if(E.has(f.market))throw new TypeError(`duplicate basket market ${f.market}`);if(E.add(f.market),f.side!=="buy"&&f.side!=="sell")throw new TypeError("basket leg side must be buy or sell");if(g+=I(f.notionalUsd,"basket leg notional"),!Number.isSafeInteger(f.weightBps)||f.weightBps<=0||f.weightBps>1e4)throw new TypeError("basket leg weight must be positive basis points");A+=f.weightBps,xe(f.artifact,f,o)}if(A!==1e4)throw new TypeError("basket leg weights must sum to 10000 bps");if(g!==I(e.notionalUsd,"intent notional"))throw new TypeError("basket aggregate notional must equal the exact leg sum");if(g>I(n.maxNotionalUsd,"policy maxNotionalUsd"))throw new TypeError("basket aggregate notional exceeds policy cap")}function Te(e,n,o){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("intent payload must be an object");if(typeof e.chainId!="string"||!n.chainAllowlist.includes(e.chainId))throw new TypeError("intent chain is outside policy allowlist");if(!Number.isFinite(e.notionalUsd)||e.notionalUsd<=0||e.notionalUsd>n.maxNotionalUsd)throw new TypeError("intent notional exceeds policy cap");if(!Number.isFinite(e.maxLossUsd)||e.maxLossUsd<0||e.maxLossUsd>n.maxDailyLossUsd)throw new TypeError("intent loss exceeds policy cap");I(e.notionalUsd,"intent notional"),I(e.maxLossUsd,"intent max loss",{allowZero:!0}),ke(e,n,o)}function F(e,{compiled:n}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("handoff must be an object");if(!n?.team||typeof n.teamHash!="string")throw new TypeError("compiled team snapshot is required");let o=e.nowMs??Date.now();if(!Number.isSafeInteger(o))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 s=L(e.teamId,"teamId"),u=Ae(e.teamHash,"teamHash");if(n.team.id!==s||n.teamHash!==u)throw new TypeError("handoff team snapshot mismatch");let l=L(e.sourceAgentId,"sourceAgentId"),E=L(e.targetAgentId,"targetAgentId"),g=U(e.artifactKind);if(!n.team.edges.some(t=>t.from===l&&t.to===E&&t.artifactKind===g))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 A=e.evidenceRefs.map(t=>{if(typeof t!="string"||!we.test(t))throw new TypeError("evidence reference must be a SHA-256 content hash");return t});if(new Set(A).size!==A.length)throw new TypeError("duplicate evidence reference");let h=T(e.payload),f=B(n.team.policy,{nowMs:o,mode:n.team.mode}),i=o+e.ttlMs;if(i>f.expiresAt)throw new TypeError("handoff TTL exceeds policy expiry");ye.has(g)&&Te(h,f,{mode:n.team.mode,nowMs:o,expiresAt:i});let a={teamId:s,teamHash:u,runId:L(e.runId,"runId"),sourceAgentId:l,targetAgentId:E,artifactKind:g,payload:h,payloadHash:_(h),evidenceRefs:A,ttlMs:e.ttlMs,issuedAt:o,expiresAt:i,policy:f,policyHash:_(f)};return v(T({...a,handoffHash:_(a),executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}))}import{randomUUID as Ee}from"node:crypto";function H(e,n,o){if(o>=n.compiled.team.policy.expiresAt)throw e.status="expired",e.updatedAt=o,new Error("team policy expired")}function Oe({now:e=Date.now,storage:n,executionAdapter:o}={}){let s=n??new Map,u=new Map,l=new Map,E=async(i,a)=>s.set(i,T(a)),g=async i=>s.get(i),A=async()=>s instanceof Map?[...s.values()]:s.list(),h=i=>v(T(i));async function f(){if(typeof o?.status!="function")throw new Error("armed mode requires a local execution adapter");let i=await o.status();if(!i?.configured||!i?.reachable||i?.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 i}return Object.freeze({async save(i){let a=G(i,{nowMs:e()});return await E(a.team.id,a),h(a)},async list(){return h(await A())},async get(i){let a=await g(i);return a===void 0?null:h(a)},async getRun(i){let a=u.get(i);return a===void 0?null:h(a)},async start(i){let a=await g(i);if(!a)throw new Error(`unknown team ${i}`);let t=v(T(a));if(t.team.mode==="draft")throw new Error("draft team must be promoted before running");if(t.team.mode==="halted")throw new Error("team kill switch is active");let d=e();if(d>=t.team.policy.expiresAt)throw new Error("team policy expired");let b=t.team.mode==="armed";b&&await f();let p=t.team.agents.find(r=>!t.team.edges.some(m=>m.to===r.id));if(!p)throw new Error("team pipeline has no root agent");let w={id:Ee(),teamId:i,teamHash:t.teamHash,status:t.team.mode==="shadow"?"shadowing":"running",mode:t.team.mode,armed:b,startedAt:d,updatedAt:d,expiresAt:t.team.policy.expiresAt,maxSteps:t.team.edges.length,steps:[],receipts:[],executionAllowed:!1,backendSigner:b,signingReady:b,broadcastReady:b,requiresOperatorConfirmation:!0,signed:!1,broadcast:!1};return u.set(w.id,w),l.set(w.id,{compiled:t,currentAgentId:p.id,previousHandoffHash:null,consumedHandoffHashes:new Set,executionConsumed:!1,confirmationPending:!1}),h(w)},async step(i,a){let t=u.get(i),d=l.get(i);if(!t||!d)throw new Error(`unknown run ${i}`);if(t.status==="halted")throw new Error("run is halted");if(t.status==="paused")throw new Error("run is paused");if(t.status!=="running"&&t.status!=="shadowing")throw new Error("run cannot step from its current state");let b=e();if(H(t,d,b),t.steps.length>=t.maxSteps)throw new Error("run step budget exhausted");if(a?.agentId!==d.currentAgentId)throw new TypeError("step agent is out of order");let p=d.compiled.team.edges.find(y=>y.from===a.agentId);if(!p||p.to!==a?.targetAgentId||p.artifactKind!==a?.artifactKind)throw new TypeError("artifact does not match the exact next team edge");let w,r=null;if(d.previousHandoffHash===null){if(a.inputHandoffHash!==void 0)throw new TypeError("root step cannot consume a prior handoff");w=a.evidenceRefs}else{if(a.inputHandoffHash!==d.previousHandoffHash)throw new TypeError("step must consume the exact prior handoff");if(d.consumedHandoffHashes.has(a.inputHandoffHash))throw new TypeError("handoff was already consumed");r=a.inputHandoffHash,w=[`evidence:sha256:${a.inputHandoffHash}`]}let m=F({teamId:t.teamId,teamHash:t.teamHash,runId:i,sourceAgentId:p.from,targetAgentId:p.to,artifactKind:p.artifactKind,payload:a.payload,evidenceRefs:w,ttlMs:a.ttlMs,nowMs:b},{compiled:d.compiled});return r!==null&&d.consumedHandoffHashes.add(r),t.steps.push(m),t.updatedAt=b,d.currentAgentId=p.to,d.previousHandoffHash=m.handoffHash,p.to===d.compiled.team.agents.find(y=>y.role==="executor").id&&(t.status=t.mode==="armed"?"awaiting-confirmation":"prepared",t.preparedAt=b,t.mode!=="armed"&&(t.completedAt=b)),h(t)},async confirm(i,a){let t=u.get(i),d=l.get(i);if(!t||!d)throw new Error(`unknown run ${i}`);if(t.status==="halted")throw new Error("run is halted");if(t.status!=="awaiting-confirmation")throw new Error("run cannot confirm from its current state or was already executed");let b=e();H(t,d,b);let p=t.steps.at(-1);if(!p||p.artifactKind!=="approved-intent")throw new Error("approved intent handoff is required");if(b>=p.expiresAt)throw new Error("approved intent handoff expired");if(a?.handoffHash!==p.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(d.executionConsumed||d.confirmationPending)throw new Error("approved intent is already executing or was already executed");d.confirmationPending=!0;try{await f();let w=e();if(H(t,d,w),t.status==="halted")throw new Error("run was halted before execution");if(t.status!=="awaiting-confirmation")throw new Error("run cannot confirm from its current state");if(w>=p.expiresAt)throw new Error("approved intent handoff expired");let r=p.payload?.executionPlan?.legs;if(!Array.isArray(r)||!r.length)throw new Error("approved intent has no executable legs");d.executionConsumed=!0,t.status="executing",t.updatedAt=w;for(let[m,y]of r.entries()){if(t.status==="halted")throw new Error("run was halted during sequential basket execution");let x=e();if(H(t,d,x),x>=p.expiresAt)throw new Error("approved intent handoff expired during execution");let j=await o.executeConfirmedArtifact(T(y.artifact),{runId:i,handoffHash:p.handoffHash,legIndex:m,legCount:r.length});if(t.receipts.push(T(j)),t.updatedAt=e(),t.status==="halted")throw new Error("run was halted during sequential basket execution");if(H(t,d,t.updatedAt),t.updatedAt>=p.expiresAt)throw new Error("approved intent handoff expired during execution")}return t.status="completed",t.executionAllowed=!1,t.requiresOperatorConfirmation=!1,t.signed=!0,t.broadcast=!0,t.completedAt=e(),t.updatedAt=t.completedAt,h(t)}catch(w){throw d.executionConsumed&&(t.status!=="halted"&&t.status!=="expired"&&(t.status="failed"),t.executionAllowed=!1,t.partialExecution=t.receipts.length>0,t.error=w instanceof Error?w.message:"local execution failed",t.updatedAt=e()),w}finally{d.confirmationPending=!1}},async pause(i){let a=u.get(i);if(!a)throw new Error(`unknown run ${i}`);if(a.status!=="running"&&a.status!=="shadowing")throw new Error("only an active run can be paused");return a.resumeStatus=a.status,a.status="paused",a.updatedAt=e(),h(a)},async resume(i){let a=u.get(i),t=l.get(i);if(!a||!t)throw new Error(`unknown run ${i}`);if(a.status!=="paused")throw new Error("only a paused run can be resumed");let d=e();return H(a,t,d),a.status=a.resumeStatus==="shadowing"?"shadowing":"running",delete a.resumeStatus,a.updatedAt=d,h(a)},async halt(i){let a=u.get(i);if(!a)throw new Error(`unknown run ${i}`);return a.status="halted",delete a.resumeStatus,a.updatedAt=e(),h(a)}})}export{Q as BASKET_STRATEGY_CATALOG,P as CRYPTO_SKILL_CATALOG,$ as CRYPTO_TOOL_CATALOG,J as MARKET_BREADTH_CATALOG,D as MODEL_PROVIDER_CATALOG,Z as PERP_SIGNAL_CATALOG,M as TEAM_MODES,re as TEAM_TEMPLATES,G as compileTeamDefinition,F as createTeamHandoff,Oe as createTeamService};
|
|
1
|
+
var ee=Object.freeze(["draft","shadow","confirm","armed","autonomous","halted"]),je=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}))),Le=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}))),ze=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}))),te=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}))),qe=[["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","Evaluate an intent against policy"],["intent.prepare","Prepare a non-executable intent"],["operator.handoff","Create an operator confirmation handoff"]],re=Object.freeze(qe.map(([e,t])=>Object.freeze({id:e,description:t,signs:!1,broadcasts:!1}))),Me=[["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"]],ne=Object.freeze(Me.map(([e,t])=>Object.freeze({id:e,description:t,signs:!1,broadcasts:!1}))),Ne=Object.freeze({autonomousOptIn:!1,requiresWalletConfirmation:!0,killSwitchRequired:!0,maxNotionalUsd:100,maxDailyLossUsd:10,chainAllowlist:Object.freeze(["ethereum"]),expiresAt:41024448e5});function K({id:e,name:t,scannerName:r,scannerTool:a,scannerSkill:d,scannerArtifact:u,chainAllowlist:m}){return Object.freeze({id:e,name:t,mode:"draft",agents:Object.freeze([Object.freeze({id:"scanner",name:r,role:"scanner",runtime:"deterministic",soul:"Collect bounded public evidence with source times.",toolIds:Object.freeze([a]),skillIds:Object.freeze([d])}),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:u}),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({...Ne,chainAllowlist:Object.freeze(m)})})}var Pe=Object.freeze([K({id:"hyperliquid-alpha",name:"Hyperliquid Alpha",scannerName:"Market Scanner",scannerTool:"market.scan",scannerSkill:"hyperliquid-markets",scannerArtifact:"market-evidence",chainAllowlist:["hyperliquid"]}),K({id:"perp-market-breadth",name:"Perp Market Breadth",scannerName:"Breadth Scanner",scannerTool:"market.breadth",scannerSkill:"crypto-market-breadth",scannerArtifact:"breadth-evidence",chainAllowlist:["hyperliquid"]}),K({id:"perp-technical-strategy",name:"Perp Technical Strategy",scannerName:"Perp Technical Scanner",scannerTool:"perp.indicators",scannerSkill:"perp-technical-analysis",scannerArtifact:"technical-evidence",chainAllowlist:["hyperliquid"]}),K({id:"basket-relative-value",name:"Basket Relative Value",scannerName:"Basket Constructor",scannerTool:"basket.construct",scannerSkill:"basket-trading",scannerArtifact:"basket-evidence",chainAllowlist:["hyperliquid"]}),K({id:"wallet-watch",name:"Wallet Watch",scannerName:"Wallet Monitor",scannerTool:"wallet.watch",scannerSkill:"wallet-monitoring",scannerArtifact:"wallet-flow",chainAllowlist:["ethereum","base"]}),K({id:"evm-launch-radar",name:"EVM Launch Radar",scannerName:"Launch Scanner",scannerTool:"contract.read",scannerSkill:"contract-research",scannerArtifact:"contract-evidence",chainAllowlist:["ethereum","base","arbitrum"]}),K({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 De}from"node:crypto";var Ke=/^[a-z0-9][a-z0-9._-]{0,63}$/,Ue=new Set(["deterministic","model","policy","operator"]),Be=new Set(re.map(({id:e})=>e)),Fe=new Set(ne.map(({id:e})=>e)),Ge=new Set(te.map(({id:e})=>e)),Ve=["secret","privatekey","seed","seedphrase","mnemonic","password","passphrase","credential","apikey","apitoken","accesstoken","authtoken","authorization","signingmaterial","walletexport","keymaterial"],oe=/(?:\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,Ye=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"]),We=new Set(Ye);function p(e){throw new TypeError(e)}function V(e,t){(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&p(`${t} must be a plain object`)}function Je(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function we(e){let t=Je(e);return t==="auth"||Ve.some(r=>t.includes(r))}function ie(e,t="team",r=new Set){if(e&&typeof e=="object"){r.has(e)&&p(`unsafe cyclic field at ${t}`),r.add(e);for(let[a,d]of Object.entries(e))we(a)&&p(`forbidden secret-like field ${t}.${a}`),ie(d,`${t}.${a}`,r);r.delete(e)}}function k(e){return e===null||typeof e=="string"||typeof e=="boolean"?e:typeof e=="number"?(Number.isFinite(e)||p("value must be finite"),e):Array.isArray(e)?e.map(k):(V(e,"value"),Object.fromEntries(Object.keys(e).sort().map(t=>(we(t)&&p(`forbidden secret-like field ${t}`),[t,k(e[t])]))))}function N(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))N(t);Object.freeze(e)}return e}function Y(e){return De("sha256").update(JSON.stringify(k(e))).digest("hex")}function G(e,t,r=500){return(typeof e!="string"||!e.trim()||e.length>r)&&p(`${t} is invalid`),e}function q(e,t){return G(e,t,64),Ke.test(e)||p(`${t} is invalid`),e}function Ze(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))`,r=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 oe.test(r)||new RegExp(String.raw`\b${t}\b`,"i").test(r)}function ae(e){return q(e,"artifact kind"),We.has(e)||p(`artifact kind ${e} is not allowed`),e}function se(e,{nowMs:t=Date.now(),mode:r="shadow"}={}){V(e,"policy"),ie(e,"policy");let a=["autonomousOptIn","requiresWalletConfirmation","killSwitchRequired"];for(let u of a)typeof e[u]!="boolean"&&p(`policy.${u} must be boolean`);(!e.requiresWalletConfirmation||!e.killSwitchRequired)&&p("unsafe policy: wallet confirmation and kill switch are required");for(let u of["maxNotionalUsd","maxDailyLossUsd"])(!Number.isFinite(e[u])||e[u]<=0)&&p(`policy.${u} must be a positive finite cap`);(!Array.isArray(e.chainAllowlist)||!e.chainAllowlist.length)&&p("policy.chainAllowlist must be bounded");let d=e.chainAllowlist.map(u=>q(u,"chain id"));return new Set(d).size!==d.length&&p("duplicate chain id"),(!Number.isSafeInteger(e.expiresAt)||e.expiresAt<=t)&&p("policy expiry must be in the future"),r==="autonomous"&&!e.autonomousOptIn&&p("autonomous mode requires explicit opt-in"),{autonomousOptIn:e.autonomousOptIn,requiresWalletConfirmation:!0,killSwitchRequired:!0,maxNotionalUsd:e.maxNotionalUsd,maxDailyLossUsd:e.maxDailyLossUsd,chainAllowlist:d,expiresAt:e.expiresAt}}function ce(e,{nowMs:t=Date.now()}={}){V(e,"team"),ie(e),q(e.id,"team id"),G(e.name,"team name",120),ee.includes(e.mode)||p("unsupported team mode"),(!Array.isArray(e.agents)||!e.agents.length)&&p("agents must be non-empty");let r=new Set,a=e.agents.map((i,b)=>{V(i,`agent ${b}`);let E=q(i.id,"agent id");r.has(E)&&p(`duplicate agent id ${E}`),r.add(E),G(i.name,"agent name",120),q(i.role,"agent role"),Ue.has(i.runtime)||p("invalid agent runtime");let x=G(i.soul,"agent Soul",2e3);Ze(x)&&p("unsafe Soul authority"),(!Array.isArray(i.toolIds)||!Array.isArray(i.skillIds))&&p("tool and skill IDs must be arrays");let S=i.toolIds.map(o=>(q(o,"tool id"),(!Be.has(o)||oe.test(o))&&p(`forbidden tool ${o}`),o)),F=i.skillIds.map(o=>(q(o,"skill id"),(!Fe.has(o)||oe.test(o))&&p(`forbidden skill ${o}`),o));(new Set(S).size!==S.length||new Set(F).size!==F.length)&&p("duplicate tool or skill ID");let n=i.runtime==="model";return n?(G(i.provider,"model provider",100),Ge.has(i.provider)||p("unsupported model provider"),G(i.model,"model",160)):(i.provider!==void 0||i.model!==void 0)&&p("provider/model only allowed for model runtime"),i.role==="executor"&&i.runtime!=="operator"&&p("executor must use operator runtime"),i.runtime==="operator"&&i.role!=="executor"&&p("operator runtime is reserved for the executor"),i.role!=="executor"&&S.some(o=>o==="intent.prepare"||o==="operator.handoff")&&p("executor tools require operator authority"),{id:E,name:i.name,role:i.role,runtime:i.runtime,...n?{provider:i.provider,model:i.model}:{},soul:x,toolIds:S,skillIds:F}}),d=a.filter(i=>i.role==="executor");d.length!==1&&p("exactly one executor operator is required");let u=d[0];(!u.toolIds.includes("intent.prepare")||!u.toolIds.includes("operator.handoff"))&&p("executor requires prepare-only handoff tools"),Array.isArray(e.edges)||p("edges must be an array");let m=new Set,T=new Map([...r].map(i=>[i,[]])),g=e.edges.map(i=>{V(i,"edge"),q(i.from,"edge source"),q(i.to,"edge target");let b=ae(i.artifactKind);(!r.has(i.from)||!r.has(i.to))&&p("broken edge references unknown agent"),i.from===i.to&&p("cycle in team DAG");let E=`${i.from}\0${i.to}\0${b}`;return m.has(E)&&p("duplicate edge"),m.add(E),T.get(i.from).push(i.to),{from:i.from,to:i.to,artifactKind:b}}),y=new Set,w=new Set;function v(i){if(y.has(i)&&p("cycle in team DAG"),!w.has(i)){y.add(i);for(let b of T.get(i))v(b);y.delete(i),w.add(i)}}for(let i of r)v(i);T.get(u.id).length&&p("executor must be the terminal team agent");let $=i=>{let b=[i],E=new Set;for(;b.length;){let x=b.shift();if(x===u.id)return!0;E.has(x)||(E.add(x),b.push(...T.get(x)))}return!1};for(let i of r)$(i)||p(`agent ${i} is disconnected from executor`);let O=a.filter(i=>!g.some(b=>b.to===i.id));O.length!==1&&p("team pipeline requires exactly one root agent");for(let i of a){let b=g.filter(x=>x.to===i.id).length,E=g.filter(x=>x.from===i.id).length;(i.id===O[0].id?b!==0:b!==1)&&p("team pipeline requires exactly one incoming handoff per non-root agent"),(i.id===u.id?E!==0:E!==1)&&p("team pipeline requires exactly one outgoing handoff per non-executor agent")}let C=g.filter(i=>i.to===u.id);(C.length!==1||C[0].artifactKind!=="approved-intent")&&p("executor requires exactly one approved-intent input"),a.find(i=>i.id===C[0].from)?.runtime!=="policy"&&p("executor input must come from a policy agent");let H=se(e.policy,{nowMs:t,mode:e.mode}),L=k({id:e.id,name:e.name,mode:e.mode,agents:a,edges:g,policy:H});return N({team:L,teamHash:Y(L),execution:{executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}})}var Xe=/^[a-z0-9][a-z0-9._:-]{0,127}$/i,Qe=/^[0-9a-f]{64}$/,et=/^evidence:sha256:[0-9a-f]{64}$/,tt=new Set(["approved-intent","prepared-intent","prepared-basket"]),rt=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),nt=/^[A-Za-z0-9@:_./-]{1,64}$/;function Z(e,t){if(typeof e!="string"||!Xe.test(e))throw new TypeError(`${t} is invalid`);return e}function ot(e,t){if(typeof e!="string"||!Qe.test(e))throw new TypeError(`${t} is invalid`);return e}function X(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 ye(e,t,r){for(let a of Object.keys(e))if(!t.has(a))throw new TypeError(`${r}.${a} is not allowed`)}function U(e,t,{allowZero:r=!1}={}){if(!Number.isFinite(e)||(r?e<0:e<=0))throw new TypeError(`${t} must be ${r?"non-negative":"positive"}`);let a=e*100;if(!Number.isSafeInteger(Math.round(a))||Math.abs(a-Math.round(a))>1e-8)throw new TypeError(`${t} must use exact USD cents`);return Math.round(a)}function it(e,t,{nowMs:r,expiresAt:a}){if(X(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<=r||e.expiresAtMs>a)throw new TypeError("basket leg artifact expiry must fit the handoff TTL");if(X(e.artifact,"basket leg artifact payload"),!rt.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(U(e.artifact.notionalUsd,"basket leg artifact notional")!==U(t.notionalUsd,"basket leg notional"))throw new TypeError("basket leg artifact notional mismatch")}function at(e,t,r){let a=e.executionPlan;if(a===void 0){if(r.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(X(a,"executionPlan"),ye(a,new Set(["atomic","partialFillRiskAcknowledged","legs"]),"executionPlan"),a.atomic!==!1)throw new TypeError("basket and perp plans must be explicitly non-atomic");if(!Array.isArray(a.legs))throw new TypeError("executionPlan.legs must be an array");let d=e.intentType==="basket"?2:1,u=e.intentType==="basket"?12:1;if(a.legs.length<d||a.legs.length>u)throw new TypeError(`${e.intentType} execution plan requires ${d}-${u} legs`);if(e.intentType==="basket"&&a.partialFillRiskAcknowledged!==!0)throw new TypeError("basket partial-fill risk must be acknowledged");if(e.intentType==="perp"&&typeof a.partialFillRiskAcknowledged!="boolean")throw new TypeError("perp partial-fill risk acknowledgement must be boolean");let m=new Set,T=0,g=0;for(let[y,w]of a.legs.entries()){if(X(w,`executionPlan.legs[${y}]`),ye(w,new Set(["market","side","notionalUsd","weightBps","artifact"]),`executionPlan.legs[${y}]`),typeof w.market!="string"||!nt.test(w.market))throw new TypeError("basket leg market is invalid");if(m.has(w.market))throw new TypeError(`duplicate basket market ${w.market}`);if(m.add(w.market),w.side!=="buy"&&w.side!=="sell")throw new TypeError("basket leg side must be buy or sell");if(T+=U(w.notionalUsd,"basket leg notional"),!Number.isSafeInteger(w.weightBps)||w.weightBps<=0||w.weightBps>1e4)throw new TypeError("basket leg weight must be positive basis points");g+=w.weightBps,it(w.artifact,w,r)}if(g!==1e4)throw new TypeError("basket leg weights must sum to 10000 bps");if(T!==U(e.notionalUsd,"intent notional"))throw new TypeError("basket aggregate notional must equal the exact leg sum");if(T>U(t.maxNotionalUsd,"policy maxNotionalUsd"))throw new TypeError("basket aggregate notional exceeds policy cap")}function st(e,t,r){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");U(e.notionalUsd,"intent notional"),U(e.maxLossUsd,"intent max loss",{allowZero:!0}),at(e,t,r)}function de(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 r=e.nowMs??Date.now();if(!Number.isSafeInteger(r))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 a=Z(e.teamId,"teamId"),d=ot(e.teamHash,"teamHash");if(t.team.id!==a||t.teamHash!==d)throw new TypeError("handoff team snapshot mismatch");let u=Z(e.sourceAgentId,"sourceAgentId"),m=Z(e.targetAgentId,"targetAgentId"),T=ae(e.artifactKind);if(!t.team.edges.some(O=>O.from===u&&O.to===m&&O.artifactKind===T))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(O=>{if(typeof O!="string"||!et.test(O))throw new TypeError("evidence reference must be a SHA-256 content hash");return O});if(new Set(g).size!==g.length)throw new TypeError("duplicate evidence reference");let y=k(e.payload),w=se(t.team.policy,{nowMs:r,mode:t.team.mode}),v=r+e.ttlMs;if(v>w.expiresAt)throw new TypeError("handoff TTL exceeds policy expiry");tt.has(T)&&st(y,w,{mode:t.team.mode,nowMs:r,expiresAt:v});let $={teamId:a,teamHash:d,runId:Z(e.runId,"runId"),sourceAgentId:u,targetAgentId:m,artifactKind:T,payload:y,payloadHash:Y(y),evidenceRefs:g,ttlMs:e.ttlMs,issuedAt:r,expiresAt:v,policy:w,policyHash:Y(w)};return N(k({...$,handoffHash:Y($),executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}))}import{createHash as ge,randomUUID as ct}from"node:crypto";function dt(e,t,r){let a=ge("sha256").update(JSON.stringify(t)).digest("hex");return`sha256:${ge("sha256").update(`${e}\0${a}\0${r}`).digest("hex")}`}function ft(e){return{...k({compiled:e.compiled,currentAgentId:e.currentAgentId,previousHandoffHash:e.previousHandoffHash,executionConsumed:e.executionConsumed,confirmationPending:!1}),consumedHandoffHashes:[...e.consumedHandoffHashes]}}function lt(e){return{...k(e),consumedHandoffHashes:new Set(e?.consumedHandoffHashes||[]),confirmationPending:!1}}function fe(e){return{...k({compiled:e.compiled,currentAgentId:e.currentAgentId,previousHandoffHash:e.previousHandoffHash,executionConsumed:e.executionConsumed,confirmationPending:e.confirmationPending}),consumedHandoffHashes:new Set(e.consumedHandoffHashes)}}function B(e,t,r){if(r>=t.compiled.team.policy.expiresAt)throw e.status="expired",e.updatedAt=r,new Error("team policy expired")}function le(e,t){e.clear();for(let[r,a]of t)e.set(r,a)}function ut({now:e=Date.now,storage:t,stateStore:r,tenantId:a="local-owner",executionAdapter:d}={}){let u=String(a||"").trim();if(!u)throw new TypeError("tenantId is required");let m=t??new Map,T=new Map,g=new Map,y=!r,w=null,v=0,$=Promise.resolve(),O=async(n,o)=>m.set(n,k(o)),C=async n=>m.get(n),M=async()=>m instanceof Map?[...m.values()]:m.list(),H=n=>N(k(n));function L(n){let o=$.then(n,n);return $=o.catch(()=>{}),o}function i(){if(!(m instanceof Map)){if(r)throw new Error("durable team state requires map-backed definitions");return{definitions:null,runs:new Map([...T].map(([n,o])=>[n,k(o)])),contexts:new Map([...g].map(([n,o])=>[n,fe(o)]))}}return{definitions:new Map([...m].map(([n,o])=>[n,k(o)])),runs:new Map([...T].map(([n,o])=>[n,k(o)])),contexts:new Map([...g].map(([n,o])=>[n,fe(o)]))}}function b(n,o){return{version:1,revision:o,tenantId:u,definitions:[...n.definitions.values()].map(k),runs:[...n.runs.values()].map(k),contexts:[...n.contexts.entries()].map(([A,f])=>({runId:A,context:ft(f)}))}}function E(n){n.definitions&&le(m,n.definitions),le(T,n.runs),le(g,n.contexts)}function x(n,{persist:o=!0}={}){return L(async()=>{let A=i(),f=n(A),s=v;if(o&&r){let l=v;s=(await r.save(b(A,l),{expectedRevision:l})).revision}return E(A),v=s,f})}async function S(){y||(w||(w=(async()=>{let n=await r.load();if(n.tenantId!==u)throw new Error("team state tenant mismatch");if(!Number.isSafeInteger(n.revision)||n.revision<0)throw new Error("team state revision is invalid");if(!(m instanceof Map))throw new Error("durable team state requires map-backed definitions");let o={definitions:new Map,runs:new Map,contexts:new Map};for(let s of n.definitions)o.definitions.set(s.team.id,k(s));for(let s of n.runs)o.runs.set(s.id,k(s));for(let s of n.contexts)o.contexts.set(s.runId,lt(s.context));let A=!1;for(let s of o.runs.values()){if(!(s.status==="executing"||s.attempts?.some(h=>h.status==="submission-unknown")))continue;s.status="reconciliation-required",s.executionAllowed=!1,s.requiresOperatorConfirmation=!1,s.uncertainExecution=!0,s.updatedAt=e();let c=o.contexts.get(s.id);c&&(c.executionConsumed=!0,c.confirmationPending=!1),A=!0}let f=n.revision;A&&(f=(await r.save(b(o,f),{expectedRevision:f})).revision),E(o),v=f,y=!0})()),await w)}async function F(){if(typeof d?.status!="function")throw new Error("armed mode requires a local execution adapter");let n=await d.status();if(!n?.configured||!n?.reachable||n?.armed!==!0)throw new Error("local signer is not armed and reachable");if(typeof d?.executeConfirmedArtifact!="function")throw new Error("armed mode requires a local execution adapter");return n}return Object.freeze({async save(n){await S();let o=ce(n,{nowMs:e()});if(!(m instanceof Map))return await O(o.team.id,o),H(o);let A=await x(f=>(f.definitions.set(o.team.id,k(o)),f.definitions.get(o.team.id)));return H(A)},async list(){return await S(),H(await M())},async get(n){await S();let o=await C(n);return o===void 0?null:H(o)},async getRun(n){await S();let o=T.get(n);return o===void 0?null:H(o)},async start(n){await S();let o=await C(n);if(!o)throw new Error(`unknown team ${n}`);let A=N(k(o));A.team.mode==="armed"&&await F();let f=await x(s=>{let l=s.definitions?s.definitions.get(n):A;if(!l)throw new Error(`unknown team ${n}`);if(l.team.mode==="draft")throw new Error("draft team must be promoted before running");if(l.team.mode==="halted")throw new Error("team kill switch is active");let c=e();if(c>=l.team.policy.expiresAt)throw new Error("team policy expired");let h=l.team.mode==="armed",I=l.team.agents.find(D=>!l.team.edges.some(j=>j.to===D.id));if(!I)throw new Error("team pipeline has no root agent");let R={id:ct(),tenantId:u,teamId:n,teamHash:l.teamHash,status:l.team.mode==="shadow"?"shadowing":"running",mode:l.team.mode,armed:h,startedAt:c,updatedAt:c,expiresAt:l.team.policy.expiresAt,maxSteps:l.team.edges.length,steps:[],receipts:[],attempts:[],executionAllowed:!1,backendSigner:h,signingReady:h,broadcastReady:h,requiresOperatorConfirmation:!0,signed:!1,broadcast:!1};return s.runs.set(R.id,R),s.contexts.set(R.id,{compiled:N(k(l)),currentAgentId:I.id,previousHandoffHash:null,consumedHandoffHashes:new Set,executionConsumed:!1,confirmationPending:!1}),R});return H(f)},async step(n,o){await S();let A=await x(f=>{let s=f.runs.get(n),l=f.contexts.get(n);if(!s||!l)throw new Error(`unknown run ${n}`);if(s.status==="halted")throw new Error("run is halted");if(s.status==="paused")throw new Error("run is paused");if(s.status!=="running"&&s.status!=="shadowing")throw new Error("run cannot step from its current state");let c=e();if(B(s,l,c),s.steps.length>=s.maxSteps)throw new Error("run step budget exhausted");if(o?.agentId!==l.currentAgentId)throw new TypeError("step agent is out of order");let h=l.compiled.team.edges.find(j=>j.from===o.agentId);if(!h||h.to!==o?.targetAgentId||h.artifactKind!==o?.artifactKind)throw new TypeError("artifact does not match the exact next team edge");let I,R=null;if(l.previousHandoffHash===null){if(o.inputHandoffHash!==void 0)throw new TypeError("root step cannot consume a prior handoff");I=o.evidenceRefs}else{if(o.inputHandoffHash!==l.previousHandoffHash)throw new TypeError("step must consume the exact prior handoff");if(l.consumedHandoffHashes.has(o.inputHandoffHash))throw new TypeError("handoff was already consumed");R=o.inputHandoffHash,I=[`evidence:sha256:${o.inputHandoffHash}`]}let D=de({teamId:s.teamId,teamHash:s.teamHash,runId:n,sourceAgentId:h.from,targetAgentId:h.to,artifactKind:h.artifactKind,payload:o.payload,evidenceRefs:I,ttlMs:o.ttlMs,nowMs:c},{compiled:l.compiled});return R!==null&&l.consumedHandoffHashes.add(R),s.steps.push(D),s.updatedAt=c,l.currentAgentId=h.to,l.previousHandoffHash=D.handoffHash,h.to===l.compiled.team.agents.find(j=>j.role==="executor").id&&(s.status=s.mode==="armed"?"awaiting-confirmation":"prepared",s.preparedAt=c,s.mode!=="armed"&&(s.completedAt=c)),s});return H(A)},async confirm(n,o){await S();let A=await x(f=>{let s=f.runs.get(n),l=f.contexts.get(n);if(!s||!l)throw new Error(`unknown run ${n}`);if(s.status==="halted")throw new Error("run is halted");if(s.status!=="awaiting-confirmation")throw new Error("run cannot confirm from its current state or was already executed");let c=e();B(s,l,c);let h=s.steps.at(-1);if(!h||h.artifactKind!=="approved-intent")throw new Error("approved intent handoff is required");if(c>=h.expiresAt)throw new Error("approved intent handoff expired");if(o?.handoffHash!==h.handoffHash)throw new TypeError("confirmation must bind the exact handoff hash");if(o?.operatorConfirmed!==!0||o?.sign!==!0||o?.broadcast!==!0)throw new TypeError("explicit confirm, sign, and broadcast instruction is required");if(l.executionConsumed||l.confirmationPending)throw new Error("approved intent is already executing or was already executed");return l.confirmationPending=!0,k(h)},{persist:!1});try{await F();let f=A.payload?.executionPlan?.legs;if(!Array.isArray(f)||!f.length)throw new Error("approved intent has no executable legs");await x(l=>{let c=l.runs.get(n),h=l.contexts.get(n);if(!c||!h)throw new Error(`unknown run ${n}`);let I=e();if(B(c,h,I),c.status==="halted")throw new Error("run was halted before execution");if(c.status!=="awaiting-confirmation")throw new Error("run cannot confirm from its current state");if(!h.confirmationPending||h.executionConsumed)throw new Error("approved intent is already executing or was already executed");if(I>=A.expiresAt)throw new Error("approved intent handoff expired");h.executionConsumed=!0,c.status="executing",c.updatedAt=I});for(let[l,c]of f.entries()){let h=dt(u,c.artifact,l);await x(j=>{let _=j.runs.get(n),z=j.contexts.get(n);if(!_||!z)throw new Error(`unknown run ${n}`);if(_.status==="halted")throw new Error("run was halted during sequential basket execution");if(_.status!=="executing")throw new Error("run cannot execute from its current state");let J=e();if(B(_,z,J),J>=A.expiresAt)throw new Error("approved intent handoff expired during execution");_.attempts[l]={legIndex:l,idempotencyKey:h,status:"submission-unknown",submittedAt:J},_.updatedAt=J});let I=await d.executeConfirmedArtifact(k(c.artifact),{tenantId:u,runId:n,handoffHash:A.handoffHash,idempotencyKey:h,legIndex:l,legCount:f.length});await x(j=>{let _=j.runs.get(n);if(!_)throw new Error(`unknown run ${n}`);let z=_.attempts[l];if(!z||z.idempotencyKey!==h)throw new Error("execution attempt state changed before receipt persistence");z.status="receipt-recorded",z.receipt=k(I),z.receivedAt=e(),_.receipts.push(k(I)),_.updatedAt=z.receivedAt});let R=T.get(n),D=g.get(n);if(R?.status==="halted")throw new Error("run was halted during sequential basket execution");if(!R||!D)throw new Error(`unknown run ${n}`);if(B(k(R),fe(D),R.updatedAt),R.updatedAt>=A.expiresAt)throw new Error("approved intent handoff expired during execution")}let s=await x(l=>{let c=l.runs.get(n),h=l.contexts.get(n);if(!c||!h)throw new Error(`unknown run ${n}`);if(c.status==="halted")throw new Error("run was halted during sequential basket execution");if(c.status!=="executing")throw new Error("run cannot complete from its current state");if(B(c,h,c.updatedAt),c.updatedAt>=A.expiresAt)throw new Error("approved intent handoff expired during execution");return c.status="completed",c.executionAllowed=!1,c.requiresOperatorConfirmation=!1,c.signed=!0,c.broadcast=!0,c.completedAt=e(),c.updatedAt=c.completedAt,c});return H(s)}catch(f){if(g.get(n)?.executionConsumed)try{await x(l=>{let c=l.runs.get(n),h=l.contexts.get(n);if(!c||!h)return;let I=c.attempts.some(R=>R.status==="submission-unknown");c.status!=="halted"&&c.status!=="expired"&&(c.status=I?"reconciliation-required":"failed"),c.executionAllowed=!1,c.uncertainExecution=I,c.partialExecution=c.receipts.length>0,c.error=f instanceof Error?f.message:"local execution failed",c.updatedAt=e()})}catch{}throw f}finally{await x(f=>{let s=f.contexts.get(n);s&&(s.confirmationPending=!1)},{persist:!1})}},async pause(n){await S();let o=await x(A=>{let f=A.runs.get(n);if(!f)throw new Error(`unknown run ${n}`);if(f.status!=="running"&&f.status!=="shadowing")throw new Error("only an active run can be paused");return f.resumeStatus=f.status,f.status="paused",f.updatedAt=e(),f});return H(o)},async resume(n){await S();let o=await x(A=>{let f=A.runs.get(n),s=A.contexts.get(n);if(!f||!s)throw new Error(`unknown run ${n}`);if(f.status!=="paused")throw new Error("only a paused run can be resumed");let l=e();return B(f,s,l),f.status=f.resumeStatus==="shadowing"?"shadowing":"running",delete f.resumeStatus,f.updatedAt=l,f});return H(o)},async halt(n){await S();let o=await x(A=>{let f=A.runs.get(n);if(!f)throw new Error(`unknown run ${n}`);return f.status="halted",delete f.resumeStatus,f.updatedAt=e(),f});return H(o)}})}import{createHash as pt}from"node:crypto";var mt=/\b[A-Z][A-Z0-9]{1,5}\b/g,ht=3e4;function wt(e){return pt("sha256").update(e).digest("hex")}function yt(e){return String(e).replace(/\$\s*\d[\d,.]*/g,"[amount]").slice(0,500)}function gt(e){let t=new Set(e.edges.map(m=>m.to)),r=e.agents.find(m=>!t.has(m.id));if(!r)throw new Error("team pipeline has no root agent");let a=new Map(e.edges.map(m=>[m.from,m])),d=[],u=r.id;for(;a.has(u);){let m=a.get(u);d.push(m),u=m.to}if(d.length!==e.edges.length)throw new Error("team pipeline edges are not a single ordered chain");return d}function bt({prompt:e,nowMs:t}){let r=[...new Set(e.match(mt)||[])];return{kind:"evidence",prompt:e,observations:r,generatedAt:t,source:"operator-prompt",liveData:"unavailable"}}function be({agent:e,prompt:t,inbound:r}){let a=r?.kind==="evidence"?`evidence observations [${(r.observations||[]).join(", ")}]`:r?.kind==="analysis"?`prior ${r.role||"analysis"} thesis`:"operator prompt only",d=yt(`Rule-based bounded summary: ${e.role} review of ${a} for prompt "${t}". No live market data was read and no prices or market numbers are asserted.`);return{kind:"analysis",role:e.role,thesis:d,generator:{kind:"rules"},degradedReason:"model runtime unavailable"}}async function xt({agent:e,prompt:t,inbound:r,modelInvoker:a}){if(typeof a!="function")return be({agent:e,prompt:t,inbound:r});try{let d=await a({agent:e,prompt:t,inbound:r});if(typeof d?.text!="string"||!d.text.trim())throw new Error("model invoker returned no text");return{kind:"analysis",role:e.role,thesis:d.text,generator:{kind:"model",provider:e.provider,model:e.model}}}catch{return be({agent:e,prompt:t,inbound:r})}}function At({prompt:e,policy:t}){return{chainId:t.chainAllowlist[0],notionalUsd:Math.min(t.maxNotionalUsd,100),maxLossUsd:0,prompt:e,riskChecks:[{check:"chain-allowlist",pass:!0},{check:"notional-cap",pass:!0},{check:"loss-cap",pass:!0}]}}function kt(e,t){if(t.kind==="evidence"){let r=t.observations.length?t.observations.join(", "):"no symbols";return`${e.name}: parsed operator prompt (${r}); live market data unavailable.`}if(t.kind==="analysis"){let r=t.generator.kind==="model"?`${t.generator.provider}/${t.generator.model}`:"bounded rules";return`${e.name}: ${t.thesis.slice(0,160)} (via ${r})`}return`${e.name}: approved intent ${t.chainId} notional $${t.notionalUsd} maxLoss $${t.maxLossUsd}, all risk checks passed.`}async function Et({service:e,team:t,teamId:r,runId:a,prompt:d,nowMs:u,modelInvoker:m,onEvent:T}={}){let g=typeof T=="function"?y=>{T(y)}:()=>{};try{if(!e)throw new TypeError("service is required");if(typeof d!="string"||!d.trim())throw new TypeError("prompt is required");if(d.length>4e3)throw new TypeError("prompt exceeds 4000 characters");let y=String(r||t?.team?.id||t?.id||"");if(!y)throw new TypeError("teamId is required");let w=await e.get(y);if(!w)throw new Error(`unknown team ${y}`);let v=w.team,$=Number.isSafeInteger(u)?u:Date.now(),O=a?await e.getRun(a):await e.start(y);if(!O)throw new Error(`unknown run ${a}`);g({type:"run.started",run:O});let C=new Map(v.agents.map(L=>[L.id,L])),M=null,H=null;for(let[L,i]of gt(v).entries()){let b=C.get(i.from);g({type:"agent.started",agentId:b.id,name:b.name,role:b.role,runtime:b.runtime});let E;if(b.runtime==="deterministic")E=bt({prompt:d,nowMs:$});else if(b.runtime==="model")E=await xt({agent:b,prompt:d,inbound:H,modelInvoker:m});else if(b.runtime==="policy")E=At({prompt:d,policy:v.policy});else throw new Error(`agent runtime ${b.runtime} cannot produce a handoff artifact`);g({type:"agent.output",agentId:b.id,text:kt(b,E),payload:E});let x={agentId:i.from,targetAgentId:i.to,artifactKind:i.artifactKind,payload:E,ttlMs:ht};L===0?x.evidenceRefs=[`evidence:sha256:${wt(`${y}\0${d}`)}`]:x.inputHandoffHash=M,O=await e.step(O.id,x);let S=O.steps.at(-1);M=S.handoffHash,H=E,g({type:"handoff.verified",handoff:{sourceAgentId:S.sourceAgentId,targetAgentId:S.targetAgentId,artifactKind:S.artifactKind,handoffHash:S.handoffHash}})}return g({type:"run.status",run:O}),O}catch(y){throw g({type:"error",message:y instanceof Error?y.message:"team turn failed"}),y}}import{closeSync as Q,constants as P,fchmodSync as ke,fsyncSync as pe,lstatSync as $e,mkdirSync as Lt,openSync as me,readFileSync as zt,renameSync as qt,rmSync as Ee,writeFileSync as Te}from"node:fs";import{createHash as Mt,randomBytes as Nt}from"node:crypto";import{homedir as Pt}from"node:os";import{dirname as Dt,join as he,resolve as Kt}from"node:path";import{wordlists as Tt}from"ethers";var Ot=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),St=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],vt=new Set([12,15,18,21,24]);function $t(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return vt.has(t.length)&&t.every(r=>Tt.en.getWordIndex(r)>=0)}var Ht=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,It=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,Rt=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function Ct(e){let t=xe(e);return Rt.has(t)||It.test(t)}var W=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function xe(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function _t(e){let t=xe(e);return[...Ot].some(r=>t.includes(r))}function jt(e,t,r){if(typeof t=="string"){if(St.some(a=>a.test(t))||$t(t))throw new W(r);if(Ht.test(t)&&!Ct(e))throw new W(r)}}function ue(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return jt(r,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((d,u)=>ue(d,`${t}[${u}]`,r));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let a={};for(let d of Object.keys(e).sort()){let u=`${t}.${d}`;if(_t(d))throw new W(u);e[d]!==void 0&&(a[d]=ue(e[d],u,d))}return a}function Ae(e){return ue(e)}var He=1,Oe=P.O_NOFOLLOW??0;function Ut(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 Ie(e){return e==null?e:structuredClone(e)}function Re(e,t,r=!1){let a=r?!e.isDirectory():!e.isFile(),d=typeof process.getuid=="function"&&e.uid!==process.getuid();if(e.isSymbolicLink()||a||d||(e.mode&18)!==0)throw new Error(`${t} must be an owner-controlled ${r?"directory":"regular file"}`)}function Se(e){Lt(e,{recursive:!0,mode:448});let t=$e(e);Re(t,"team state directory",!0)}function Bt(e,t){let r=Mt("sha256").update(t).digest("hex");return he(e,`${r}.json`)}function Ce(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("team state snapshot must be an object");if(e.version!==He||e.tenantId!==t)throw new TypeError("team state tenant or version mismatch");if(!Number.isSafeInteger(e.revision)||e.revision<0)throw new TypeError("team state revision must be a non-negative safe integer");for(let r of["definitions","runs","contexts"])if(!Array.isArray(e[r]))throw new TypeError(`team state ${r} must be an array`);return Ae(e),Ie(e)}function Ft(e){return{version:He,revision:0,tenantId:e,definitions:[],runs:[],contexts:[]}}function ve(e,t){try{let r=$e(e);if(Re(r,"team state file"),r.size>16*1024*1024)throw new Error("team state file is too large");return Ce(JSON.parse(zt(e,"utf8")),t)}catch(r){if(r?.code==="ENOENT")return Ft(t);throw r}}function _e(e=process.env){let t=String(e?.ORACLE_CONFIG_DIR||"").trim()||he(Pt(),".config","oracle");return he(t,"teams","state")}function Gt(e={}){let{rootDir:t=_e(),tenantId:r}=e,a=Ut(r),d=Kt(t),u=Bt(d,a),m=`${u}.lock`;return Object.freeze({tenantId:a,file:u,async load(){return Se(d),ve(u,a)},async save(T,{expectedRevision:g}={}){if(Se(d),!Number.isSafeInteger(g)||g<0)throw new TypeError("team state expectedRevision must be a non-negative safe integer");let y,w=!1,v=`${u}.${process.pid}.${Nt(8).toString("hex")}.tmp`,$;try{y=me(m,P.O_CREAT|P.O_EXCL|P.O_WRONLY|Oe,384),w=!0,Te(y,`${process.pid}
|
|
2
|
+
`,"utf8"),pe(y),ke(y,384);let O=ve(u,a);if(O.revision!==g)throw new Error(`team state changed: stale revision ${g}; current revision ${O.revision}`);let C=Ce({...T,revision:g+1},a);$=me(v,P.O_CREAT|P.O_EXCL|P.O_WRONLY|Oe,384),Te($,`${JSON.stringify(C)}
|
|
3
|
+
`,"utf8"),pe($),ke($,384),Q($),$=void 0,qt(v,u);let M=me(Dt(u),P.O_RDONLY);try{pe(M)}finally{Q(M)}return Ie(C)}finally{$!==void 0&&Q($),Ee(v,{force:!0}),y!==void 0&&Q(y),w&&Ee(m,{force:!0})}}})}export{ze as BASKET_STRATEGY_CATALOG,ne as CRYPTO_SKILL_CATALOG,re as CRYPTO_TOOL_CATALOG,je as MARKET_BREADTH_CATALOG,te as MODEL_PROVIDER_CATALOG,Le as PERP_SIGNAL_CATALOG,ee as TEAM_MODES,Pe as TEAM_TEMPLATES,ce as compileTeamDefinition,Gt as createDurableTeamStore,de as createTeamHandoff,ut as createTeamService,_e as defaultTeamStateRoot,Et as runTeamTurn};
|