@oracle-agent/oracle 0.35.38 → 0.35.39
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 +1 -1
- package/dist/agent-sessions.mjs +13 -13
- package/dist/assets/skills/blocked-page-recovery.md +16 -0
- package/dist/assets/skills/browser-use.md +19 -0
- package/dist/assets/skills/chrome-profile-browser.md +21 -0
- package/dist/assets/skills/oracle-agentic-crypto/SKILL.md +27 -0
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/assets/skills/oracle-x402/SKILL.md +54 -11
- package/dist/assets/skills/web-form-filling.md +19 -0
- package/dist/assets/skills/web-research.md +17 -0
- package/dist/assets/skills/x-read-browser.md +17 -0
- package/dist/assets/skills/xurl.md +1 -1
- package/dist/bin/desk-server.mjs +30 -30
- package/dist/bin/oracle-data-mcp.mjs +17 -13
- package/dist/bin/oracle-public-server.mjs +1 -1
- package/dist/bin/oracle-route.mjs +26 -14
- package/dist/bin/oracle-scan.mjs +4 -4
- package/dist/bin/oracle.mjs +11 -10
- package/dist/cli/commands/agent-session.mjs +18 -18
- package/dist/cli/commands/auth.mjs +20 -17
- package/dist/cli/commands/chat.mjs +231 -228
- package/dist/cli/commands/data.mjs +5 -5
- package/dist/cli/commands/doctor.mjs +1 -1
- package/dist/cli/commands/eval.mjs +154 -152
- package/dist/cli/commands/extension-policy.mjs +1 -1
- package/dist/cli/commands/follow.mjs +57 -19
- package/dist/cli/commands/governance-prepare.mjs +1 -1
- package/dist/cli/commands/init.mjs +2 -2
- package/dist/cli/commands/model.mjs +235 -232
- package/dist/cli/commands/public.mjs +3 -3
- package/dist/cli/commands/route.mjs +1 -1
- package/dist/cli/commands/setup.mjs +62 -59
- package/dist/cli/commands/signer.mjs +4 -4
- package/dist/cli/commands/upgrade.mjs +2 -2
- package/dist/cli/commands/x402.mjs +19 -0
- package/dist/control-plane/index.mjs +1 -1
- package/dist/data/desk-data.mjs +28 -28
- package/dist/index.mjs +46 -46
- package/dist/local-signer/runtime.mjs +6 -6
- package/dist/teams/index.mjs +6 -5
- package/dist/tui/standalone-client.mjs +84 -82
- package/package.json +1 -1
- package/public/eval-report.json +2 -2
- package/public/oracle-splash/docs/browser-and-web/index.html +32 -0
- package/public/oracle-splash/docs/connectors/index.html +18 -0
- package/public/oracle-splash/docs/docs.css +21 -0
- package/public/oracle-splash/docs/docs.js +108 -0
- package/public/oracle-splash/docs/getting-started/index.html +36 -0
- package/public/oracle-splash/docs/index.html +26 -0
- package/public/oracle-splash/docs/reference/index.html +20 -0
- package/public/oracle-splash/docs/security/index.html +19 -0
- package/public/oracle-splash/docs/using-oracle/index.html +32 -0
- package/public/oracle-splash/download/index.html +2584 -0
- package/public/oracle-splash/index.html +313 -942
- package/public/oracle-splash/pricing/index.html +2570 -0
- package/public/oracle-splash/security/index.html +2574 -0
- package/public/oracle-splash/what-it-does/index.html +2608 -0
- package/public/oracle-splash/where-it-works/index.html +2635 -0
- package/server.json +2 -2
- package/dist/assets/equities-fixtures/bridge_routes.json +0 -159
package/dist/teams/index.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
var
|
|
2
|
-
[Message content truncated for durable storage.]`,At=200,kt=512*1024,Tt=64*1024,Et=48*1024;function T(e){return String(e??"").trim()}function St(e){return T(e).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")}function pe(e){return Buffer.byteLength(JSON.stringify(e),"utf8")}function Ot(e,t){let r=String(e??"");if(Buffer.byteLength(r,"utf8")<=t)return r;let n=0,a=r.length;for(;n<a;){let f=Math.ceil((n+a)/2);Buffer.byteLength(r.slice(0,f),"utf8")<=t?n=f:a=f-1}let c=r.slice(0,n);return new RegExp("\\p{Surrogate}$","u").test(c)&&(c=c.slice(0,-1)),c}function It(e){let t=T(e?.text),r=Math.max(0,Et-Buffer.byteLength($e,"utf8")),n=Buffer.byteLength(t,"utf8")>r,a=Array.isArray(e?.artifacts)?e.artifacts:[],c=e?.generator&&typeof e.generator=="object"&&!Array.isArray(e.generator)?{kind:T(e.generator.kind).slice(0,80),provider:T(e.generator.provider).slice(0,120),model:T(e.generator.model).slice(0,160)}:void 0;return{id:T(e?.id).slice(0,200)||"message-compacted",sender:T(e?.sender).slice(0,200)||"system",name:T(e?.name).slice(0,200)||"Oracle",text:`${Ot(t,r)}${$e}`,state:T(e?.state).slice(0,80)||"complete",createdAt:T(e?.createdAt).slice(0,80),artifacts:[],...e?.fallback===!0?{fallback:!0}:{},...e?.offline===!0?{offline:!0}:{},...c?{generator:c}:{},contentTruncated:!0,...a.length?{omittedArtifacts:a.length}:{},...!n&&a.length?{artifactPayloadTruncated:!0}:{}}}function $t(e){let t=structuredClone(e);return pe(t)<=Tt?t:It(t)}function _t(e){let t=0,r="";for(let n of e){if(n?.historyTruncated!==!0)continue;let a=Number(n.omittedMessages);Number.isSafeInteger(a)&&a>0&&(t+=a),r||(r=T(n.createdAt))}return{omittedMessages:t,createdAt:r}}function vt(e,t){return{id:xt,sender:"system",name:"Oracle",text:`[Earlier team history omitted: ${e} ${e===1?"message":"messages"} pruned for durable storage.]`,state:"complete",createdAt:T(t),artifacts:[],historyTruncated:!0,omittedMessages:e}}function ne(e,t={}){if(!e||typeof e!="object"||!Array.isArray(e.messages))throw new TypeError("Invalid team thread state");let r=Number.isSafeInteger(t.maxMessages)&&t.maxMessages>0?t.maxMessages:At,n=Number.isSafeInteger(t.maxBytes)&&t.maxBytes>0?t.maxBytes:kt,a=_t(e.messages),c=a.omittedMessages,f=e.messages.filter(h=>h?.historyTruncated!==!0).map($t),g=Number.isSafeInteger(t.dropOldest)&&t.dropOldest>0?Math.min(t.dropOldest,f.length):0;if(g>0&&(f=f.slice(g),c+=g),f.length>r){let h=f.length-r;f=f.slice(h),c+=h}let y=()=>({...e,messages:[...c>0?[vt(c,a.createdAt||f[0]?.createdAt)]:[],...f]});for(;f.length>0&&pe(y())>n;)f=f.slice(1),c+=1;let m=y();if(pe(m)>n)throw new Error("team thread metadata exceeds durable size budget");return m}function ve(e,t){let r=Number.isSafeInteger(t)&&t>0?t:0;return ne(e,{dropOldest:r})}function _e(e,t){return e.slice(t.length).trim()}function he(e=gt(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 oe(e){return wt.test(String(e??""))}function Ht({text:e,agents:t,leadAgentId:r}){let n=T(e);if(!n)throw new TypeError("Message is required");if(!Array.isArray(t)||t.length===0)throw new TypeError("Group needs at least one agent");let a=n.match(/^@(team|all)(?:\s+|$)/i);if(a)return{kind:"broadcast",targetAgentIds:t.map(f=>f.id),text:_e(n,a[0])};if(n.startsWith("@")){let g=t.flatMap(m=>[{agent:m,mention:`@${T(m.id)}`},{agent:m,mention:`@${T(m.name)}`},{agent:m,mention:`@${St(m.name)}`}]).sort((m,h)=>h.mention.length-m.mention.length).find(({mention:m})=>{let h=n.slice(0,m.length),S=n.at(m.length);return h.toLowerCase()===m.toLowerCase()&&(!S||/\s|[:,]/.test(S))});if(!g)throw new TypeError("Unknown agent mention");let y=_e(n,g.mention).replace(/^[:,]\s*/,"");return{kind:"mention",targetAgentIds:[g.agent.id],text:y}}return{kind:"lead",targetAgentIds:[(t.find(f=>f.id===r)??t[0]).id],text:n}}function Rt(e,t=[]){let r=T(e?.provider);return r?new Set(t.map(a=>T(a))).has(r)?{status:"online"}:{status:"offline",reason:`${r} is not connected`}:{status:"online"}}function Ct(e){re(e);let t=T(e?.type),r=Array.isArray(e?.actions)?e.actions:[];if(yt.test(t)||r.some(n=>bt.test(T(n?.type))))throw new TypeError("Chat cannot sign, broadcast, or execute")}function Q(e,t,r,n="complete"){return{id:T(e.id)||`message-${Date.now()}`,sender:t,name:r,text:T(e.text),state:n,createdAt:T(e.createdAt)||new Date().toISOString(),artifacts:[]}}function ge(e,t){if(Ct(t),!e||!oe(e.sessionId)||!Array.isArray(e.messages))throw new TypeError("Invalid team thread state");let r=[...e.messages];if(t.type==="message.user")r.push(Q(t,"user","You"));else if(t.type==="message.system")r.push(Q(t,"system","Oracle"));else if(t.type==="agent.offline"){let n=Q(t,T(t.agentId),T(t.name)||T(t.agentId),"offline");n.offline=!0;let a=r.findIndex(c=>c.id===t.id&&c.sender===t.agentId);a>=0?r.splice(a,1,n):r.push(n)}else if(t.type==="agent.started")r.push(Q(t,T(t.agentId),T(t.name)||T(t.agentId),"thinking"));else if(t.type==="agent.output"){let n=r.findIndex(c=>c.id===t.id&&c.sender===t.agentId),a=Q(t,T(t.agentId),T(t.name)||T(t.agentId));a.fallback=t.generator?.kind==="rules",a.generator=t.generator?{...t.generator}:void 0,a.artifacts=t.artifact?[{...t.artifact}]:[],n>=0?r.splice(n,1,a):r.push(a)}else if(t.type==="artifact.prepared"){let n=r.findIndex(a=>a.id===t.messageId);if(n<0)throw new TypeError("Artifact target message was not found");r[n]={...r[n],artifacts:[...r[n].artifacts,{...t.artifact}]}}else throw new TypeError(`Unsupported team thread event: ${t.type}`);return ne({...e,messages:r})}var Lt=/^[a-z0-9][a-z0-9._-]{0,63}$/,jt=new Set(["deterministic","model","policy","operator"]),zt=new Set(J.map(({id:e})=>e)),Nt=new Set(X.map(({id:e})=>e)),Dt=new Set(ue.map(({id:e})=>e)),qt=["secret","privatekey","seed","seedphrase","mnemonic","password","passphrase","credential","apikey","apitoken","accesstoken","authtoken","authorization","signingmaterial","walletexport","keymaterial"],we=/(?:\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,Pt=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"]),Bt=new Set(Pt);function w(e){throw new TypeError(e)}function ee(e,t){(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&w(`${t} must be a plain object`)}function Kt(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function He(e){let t=Kt(e);return t==="auth"||qt.some(r=>t.includes(r))}function ye(e,t="team",r=new Set){if(e&&typeof e=="object"){r.has(e)&&w(`unsafe cyclic field at ${t}`),r.add(e);for(let[n,a]of Object.entries(e))He(n)&&w(`forbidden secret-like field ${t}.${n}`),ye(a,`${t}.${n}`,r);r.delete(e)}}function k(e){return e===null||typeof e=="string"||typeof e=="boolean"?e:typeof e=="number"?(Number.isFinite(e)||w("value must be finite"),e):Array.isArray(e)?e.map(k):(ee(e,"value"),Object.fromEntries(Object.keys(e).sort().map(t=>(He(t)&&w(`forbidden secret-like field ${t}`),[t,k(e[t])]))))}function D(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))D(t);Object.freeze(e)}return e}function W(e){return Mt("sha256").update(JSON.stringify(k(e))).digest("hex")}function K(e,t,r=500){return(typeof e!="string"||!e.trim()||e.length>r)&&w(`${t} is invalid`),e}function z(e,t){return K(e,t,64),Lt.test(e)||w(`${t} is invalid`),e}function Ut(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 we.test(r)||new RegExp(String.raw`\b${t}\b`,"i").test(r)}function be(e){return z(e,"artifact kind"),Bt.has(e)||w(`artifact kind ${e} is not allowed`),e}function ae(e,{nowMs:t=Date.now(),mode:r="shadow"}={}){ee(e,"policy"),ye(e,"policy");let n=["autonomousOptIn","requiresWalletConfirmation","killSwitchRequired"];for(let c of n)typeof e[c]!="boolean"&&w(`policy.${c} must be boolean`);(!e.requiresWalletConfirmation||!e.killSwitchRequired)&&w("unsafe policy: wallet confirmation and kill switch are required");for(let c of["maxNotionalUsd","maxDailyLossUsd"])(!Number.isFinite(e[c])||e[c]<=0)&&w(`policy.${c} must be a positive finite cap`);(!Array.isArray(e.chainAllowlist)||!e.chainAllowlist.length)&&w("policy.chainAllowlist must be bounded");let a=e.chainAllowlist.map(c=>z(c,"chain id"));return new Set(a).size!==a.length&&w("duplicate chain id"),(!Number.isSafeInteger(e.expiresAt)||e.expiresAt<=t)&&w("policy expiry must be in the future"),r==="autonomous"&&!e.autonomousOptIn&&w("autonomous mode requires explicit opt-in"),{autonomousOptIn:e.autonomousOptIn,requiresWalletConfirmation:!0,killSwitchRequired:!0,maxNotionalUsd:e.maxNotionalUsd,maxDailyLossUsd:e.maxDailyLossUsd,chainAllowlist:a,expiresAt:e.expiresAt}}function xe(e,{nowMs:t=Date.now()}={}){ee(e,"team"),ye(e);let r=e.kind===void 0?"pipeline":e.kind;r!=="pipeline"&&r!=="group"&&w("unsupported team kind");let n=r==="group";z(e.id,"team id"),K(e.name,"team name",120),fe.includes(e.mode)||w("unsupported team mode"),(!Array.isArray(e.agents)||!e.agents.length)&&w("agents must be non-empty");let a=new Set,c=e.agents.map((s,O)=>{ee(s,`agent ${O}`);let x=z(s.id,"agent id");a.has(x)&&w(`duplicate agent id ${x}`),a.add(x),K(s.name,"agent name",120);let E=n?K(s.role,"agent role",120):z(s.role,"agent role");jt.has(s.runtime)||w("invalid agent runtime");let B=K(s.soul,"agent Soul",2e3);Ut(B)&&w("unsafe Soul authority"),(!Array.isArray(s.toolIds)||!Array.isArray(s.skillIds))&&w("tool and skill IDs must be arrays");let o=s.toolIds.map(i=>(z(i,"tool id"),(!zt.has(i)||we.test(i))&&w(`forbidden tool ${i}`),i)),d=s.skillIds.map(i=>(z(i,"skill id"),(!Nt.has(i)||we.test(i))&&w(`forbidden skill ${i}`),i));(new Set(o).size!==o.length||new Set(d).size!==d.length)&&w("duplicate tool or skill ID");let A=s.runtime==="model";return A?(K(s.provider,"model provider",100),Dt.has(s.provider)||w("unsupported model provider"),K(s.model,"model",160)):(s.provider!==void 0||s.model!==void 0)&&w("provider/model only allowed for model runtime"),!n&&s.role==="executor"&&s.runtime!=="operator"&&w("executor must use operator runtime"),!n&&s.runtime==="operator"&&s.role!=="executor"&&w("operator runtime is reserved for the executor"),n&&s.runtime==="operator"&&w("group chat agents cannot use operator runtime"),s.role!=="executor"&&o.some(i=>i==="intent.prepare"||i==="operator.handoff")&&w("executor tools require operator authority"),n&&(o.includes("intent.prepare")||o.includes("operator.handoff"))&&w("group chat agents cannot prepare operator actions"),{id:x,name:s.name,role:E,runtime:s.runtime,...A?{provider:s.provider,model:s.model}:{},soul:B,toolIds:o,skillIds:d,...n?{autoTools:s.autoTools!==!1}:{}}});if(n){(!Array.isArray(e.edges)||e.edges.length!==0)&&w("group chat edges must be empty");let s=K(e.summary||"A focused agent group.","team summary",500),O=e.sessionId===void 0?he():e.sessionId;oe(O)||w("group session id must use ses-hex format");let x=e.leadAgentId===void 0?c[0].id:z(e.leadAgentId,"lead agent id");a.has(x)||w("lead agent is not a group member");let E=ae(e.policy,{nowMs:t,mode:e.mode}),B=k({kind:"group",id:e.id,sessionId:O,name:e.name,summary:s,mode:e.mode,leadAgentId:x,agents:c,edges:[],policy:E});return D({team:B,teamHash:W(B),execution:{executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}})}let f=c.filter(s=>s.role==="executor");f.length!==1&&w("exactly one executor operator is required");let g=f[0];(!g.toolIds.includes("intent.prepare")||!g.toolIds.includes("operator.handoff"))&&w("executor requires prepare-only handoff tools"),Array.isArray(e.edges)||w("edges must be an array");let y=new Set,m=new Map([...a].map(s=>[s,[]])),h=e.edges.map(s=>{ee(s,"edge"),z(s.from,"edge source"),z(s.to,"edge target");let O=be(s.artifactKind);(!a.has(s.from)||!a.has(s.to))&&w("broken edge references unknown agent"),s.from===s.to&&w("cycle in team DAG");let x=`${s.from}\0${s.to}\0${O}`;return y.has(x)&&w("duplicate edge"),y.add(x),m.get(s.from).push(s.to),{from:s.from,to:s.to,artifactKind:O}}),S=new Set,$=new Set;function I(s){if(S.has(s)&&w("cycle in team DAG"),!$.has(s)){S.add(s);for(let O of m.get(s))I(O);S.delete(s),$.add(s)}}for(let s of a)I(s);m.get(g.id).length&&w("executor must be the terminal team agent");let q=s=>{let O=[s],x=new Set;for(;O.length;){let E=O.shift();if(E===g.id)return!0;x.has(E)||(x.add(E),O.push(...m.get(E)))}return!1};for(let s of a)q(s)||w(`agent ${s} is disconnected from executor`);let C=c.filter(s=>!h.some(O=>O.to===s.id));C.length!==1&&w("team pipeline requires exactly one root agent");for(let s of c){let O=h.filter(E=>E.to===s.id).length,x=h.filter(E=>E.from===s.id).length;(s.id===C[0].id?O!==0:O!==1)&&w("team pipeline requires exactly one incoming handoff per non-root agent"),(s.id===g.id?x!==0:x!==1)&&w("team pipeline requires exactly one outgoing handoff per non-executor agent")}let M=h.filter(s=>s.to===g.id);(M.length!==1||M[0].artifactKind!=="approved-intent")&&w("executor requires exactly one approved-intent input"),c.find(s=>s.id===M[0].from)?.runtime!=="policy"&&w("executor input must come from a policy agent");let P=ae(e.policy,{nowMs:t,mode:e.mode}),v=k({id:e.id,name:e.name,mode:e.mode,agents:c,edges:h,policy:P});return D({team:v,teamHash:W(v),execution:{executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}})}var Ce=new Set(J.filter(e=>!e.signs&&!e.broadcasts).map(e=>e.id).filter(e=>!/intent\.prepare|operator\.handoff|sign|broadcast|execute/i.test(e))),Me=new Set(X.filter(e=>!e.signs&&!e.broadcasts).map(e=>e.id).filter(e=>!/armed|execution|sign|broadcast/i.test(e))),Ft=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"]})]),se=Object.freeze({toolIds:Object.freeze(["market.scan"]),skillIds:Object.freeze(["hyperliquid-markets"])});function Re(e,t){return[...new Set(e)].filter(r=>t.has(r))}function Gt({role:e="",soul:t=""}={}){let r=`${String(e)} ${String(t)}`.trim(),n=Ft.filter(f=>f.pattern.test(r));if(n.length===0)return{toolIds:[...se.toolIds],skillIds:[...se.skillIds]};let a=Re(n.flatMap(f=>f.toolIds),Ce),c=Re(n.flatMap(f=>f.skillIds),Me);return{toolIds:a.length>0?a:[...se.toolIds],skillIds:c.length>0?c:[...se.skillIds]}}function Yt(e){return Ce.has(e)||Me.has(e)}var Vt=/^[a-z0-9][a-z0-9._:-]{0,127}$/i,Wt=/^[0-9a-f]{64}$/,Jt=/^evidence:sha256:[0-9a-f]{64}$/,Xt=new Set(["approved-intent","prepared-intent","prepared-basket"]),Zt=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),Qt=/^[A-Za-z0-9@:_./-]{1,64}$/;function ie(e,t){if(typeof e!="string"||!Vt.test(e))throw new TypeError(`${t} is invalid`);return e}function er(e,t){if(typeof e!="string"||!Wt.test(e))throw new TypeError(`${t} is invalid`);return e}function ce(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 Le(e,t,r){for(let n of Object.keys(e))if(!t.has(n))throw new TypeError(`${r}.${n} is not allowed`)}function Y(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 n=e*100;if(!Number.isSafeInteger(Math.round(n))||Math.abs(n-Math.round(n))>1e-8)throw new TypeError(`${t} must use exact USD cents`);return Math.round(n)}function tr(e,t,{nowMs:r,expiresAt:n}){if(ce(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>n)throw new TypeError("basket leg artifact expiry must fit the handoff TTL");if(ce(e.artifact,"basket leg artifact payload"),!Zt.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(Y(e.artifact.notionalUsd,"basket leg artifact notional")!==Y(t.notionalUsd,"basket leg notional"))throw new TypeError("basket leg artifact notional mismatch")}function rr(e,t,r){let n=e.executionPlan;if(n===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(ce(n,"executionPlan"),Le(n,new Set(["atomic","partialFillRiskAcknowledged","legs"]),"executionPlan"),n.atomic!==!1)throw new TypeError("basket and perp plans must be explicitly non-atomic");if(!Array.isArray(n.legs))throw new TypeError("executionPlan.legs must be an array");let a=e.intentType==="basket"?2:1,c=e.intentType==="basket"?12:1;if(n.legs.length<a||n.legs.length>c)throw new TypeError(`${e.intentType} execution plan requires ${a}-${c} legs`);if(e.intentType==="basket"&&n.partialFillRiskAcknowledged!==!0)throw new TypeError("basket partial-fill risk must be acknowledged");if(e.intentType==="perp"&&typeof n.partialFillRiskAcknowledged!="boolean")throw new TypeError("perp partial-fill risk acknowledgement must be boolean");let f=new Set,g=0,y=0;for(let[m,h]of n.legs.entries()){if(ce(h,`executionPlan.legs[${m}]`),Le(h,new Set(["market","side","notionalUsd","weightBps","artifact"]),`executionPlan.legs[${m}]`),typeof h.market!="string"||!Qt.test(h.market))throw new TypeError("basket leg market is invalid");if(f.has(h.market))throw new TypeError(`duplicate basket market ${h.market}`);if(f.add(h.market),h.side!=="buy"&&h.side!=="sell")throw new TypeError("basket leg side must be buy or sell");if(g+=Y(h.notionalUsd,"basket leg notional"),!Number.isSafeInteger(h.weightBps)||h.weightBps<=0||h.weightBps>1e4)throw new TypeError("basket leg weight must be positive basis points");y+=h.weightBps,tr(h.artifact,h,r)}if(y!==1e4)throw new TypeError("basket leg weights must sum to 10000 bps");if(g!==Y(e.notionalUsd,"intent notional"))throw new TypeError("basket aggregate notional must equal the exact leg sum");if(g>Y(t.maxNotionalUsd,"policy maxNotionalUsd"))throw new TypeError("basket aggregate notional exceeds policy cap")}function nr(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");Y(e.notionalUsd,"intent notional"),Y(e.maxLossUsd,"intent max loss",{allowZero:!0}),rr(e,t,r)}function Ae(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 n=ie(e.teamId,"teamId"),a=er(e.teamHash,"teamHash");if(t.team.id!==n||t.teamHash!==a)throw new TypeError("handoff team snapshot mismatch");let c=ie(e.sourceAgentId,"sourceAgentId"),f=ie(e.targetAgentId,"targetAgentId"),g=be(e.artifactKind);if(!t.team.edges.some(I=>I.from===c&&I.to===f&&I.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 y=e.evidenceRefs.map(I=>{if(typeof I!="string"||!Jt.test(I))throw new TypeError("evidence reference must be a SHA-256 content hash");return I});if(new Set(y).size!==y.length)throw new TypeError("duplicate evidence reference");let m=k(e.payload),h=ae(t.team.policy,{nowMs:r,mode:t.team.mode}),S=r+e.ttlMs;if(S>h.expiresAt)throw new TypeError("handoff TTL exceeds policy expiry");Xt.has(g)&&nr(m,h,{mode:t.team.mode,nowMs:r,expiresAt:S});let $={teamId:n,teamHash:a,runId:ie(e.runId,"runId"),sourceAgentId:c,targetAgentId:f,artifactKind:g,payload:m,payloadHash:W(m),evidenceRefs:y,ttlMs:e.ttlMs,issuedAt:r,expiresAt:S,policy:h,policyHash:W(h)};return D(k({...$,handoffHash:W($),executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}))}import{createHash as je,randomUUID as or}from"node:crypto";function ar(e,t,r){let n=je("sha256").update(JSON.stringify(t)).digest("hex");return`sha256:${je("sha256").update(`${e}\0${n}\0${r}`).digest("hex")}`}function sr(e){return{...k({compiled:e.compiled,currentAgentId:e.currentAgentId,previousHandoffHash:e.previousHandoffHash,executionConsumed:e.executionConsumed,confirmationPending:!1}),consumedHandoffHashes:[...e.consumedHandoffHashes]}}function ir(e){return{...k(e),consumedHandoffHashes:new Set(e?.consumedHandoffHashes||[]),confirmationPending:!1}}function ke(e){return{...k({compiled:e.compiled,currentAgentId:e.currentAgentId,previousHandoffHash:e.previousHandoffHash,executionConsumed:e.executionConsumed,confirmationPending:e.confirmationPending}),consumedHandoffHashes:new Set(e.consumedHandoffHashes)}}function V(e,t,r){if(r>=t.compiled.team.policy.expiresAt)throw e.status="expired",e.updatedAt=r,new Error("team policy expired")}function de(e,t){e.clear();for(let[r,n]of t)e.set(r,n)}function cr({now:e=Date.now,storage:t,stateStore:r,tenantId:n="local-owner",executionAdapter:a}={}){let c=String(n||"").trim();if(!c)throw new TypeError("tenantId is required");let f=t??new Map,g=new Map,y=new Map,m=new Map,h=!r,S=null,$=0,I=Promise.resolve(),q=async(o,d)=>f.set(o,k(d)),C=async o=>f.get(o),M=async()=>f instanceof Map?[...f.values()]:f.list(),_=o=>D(k(o));function P(o){let d=I.then(o,o);return I=d.catch(()=>{}),d}function v(){if(!(f instanceof Map)){if(r)throw new Error("durable team state requires map-backed definitions");return{definitions:null,runs:new Map([...g].map(([o,d])=>[o,k(d)])),contexts:new Map([...y].map(([o,d])=>[o,ke(d)])),threads:new Map([...m].map(([o,d])=>[o,k(d)]))}}return{definitions:new Map([...f].map(([o,d])=>[o,k(d)])),runs:new Map([...g].map(([o,d])=>[o,k(d)])),contexts:new Map([...y].map(([o,d])=>[o,ke(d)])),threads:new Map([...m].map(([o,d])=>[o,k(d)]))}}function s(o,d){return{version:1,revision:d,tenantId:c,definitions:[...o.definitions.values()].map(k),runs:[...o.runs.values()].map(k),contexts:[...o.contexts.entries()].map(([A,i])=>({runId:A,context:sr(i)})),threads:[...o.threads.values()].map(k)}}function O(o){o.definitions&&de(f,o.definitions),de(g,o.runs),de(y,o.contexts),de(m,o.threads)}function x(o,{persist:d=!0}={}){return P(async()=>{let A=v(),i=o(A),l=$;if(d&&r){let u=$,p=await r.save(s(A,u),{expectedRevision:u});l=p.revision,A.threads=new Map((p.threads||[]).map(b=>[b.teamId,k(b)]))}return O(A),$=l,i})}async function E(){h||(S||(S=(async()=>{let o=await r.load();if(o.tenantId!==c)throw new Error("team state tenant mismatch");if(!Number.isSafeInteger(o.revision)||o.revision<0)throw new Error("team state revision is invalid");if(!(f instanceof Map))throw new Error("durable team state requires map-backed definitions");let d={definitions:new Map,runs:new Map,contexts:new Map,threads:new Map};for(let l of o.definitions)d.definitions.set(l.team.id,k(l));for(let l of o.runs)d.runs.set(l.id,k(l));for(let l of o.contexts)d.contexts.set(l.runId,ir(l.context));for(let l of o.threads||[])d.threads.set(l.teamId,k(l));let A=!1;for(let l of d.runs.values()){if(!(l.status==="executing"||l.attempts?.some(b=>b.status==="submission-unknown")))continue;l.status="reconciliation-required",l.executionAllowed=!1,l.requiresOperatorConfirmation=!1,l.uncertainExecution=!0,l.updatedAt=e();let p=d.contexts.get(l.id);p&&(p.executionConsumed=!0,p.confirmationPending=!1),A=!0}let i=o.revision;if(A){let l=await r.save(s(d,i),{expectedRevision:i});i=l.revision,d.threads=new Map((l.threads||[]).map(u=>[u.teamId,k(u)]))}O(d),$=i,h=!0})()),await S)}async function B(){if(typeof a?.status!="function")throw new Error("armed mode requires a local execution adapter");let o=await a.status();if(!o?.configured||!o?.reachable||o?.armed!==!0)throw new Error("local signer is not armed and reachable");if(typeof a?.executeConfirmedArtifact!="function")throw new Error("armed mode requires a local execution adapter");return o}return Object.freeze({async save(o){await E();let d=o?.kind==="group"&&o.sessionId===void 0?await C(o.id):null,A=d?.team?.kind==="group"?{...o,sessionId:d.team.sessionId}:o,i=xe(A,{nowMs:e()});if(!(f instanceof Map))return await q(i.team.id,i),_(i);let l=await x(u=>(u.definitions.set(i.team.id,k(i)),i.team.kind==="group"&&!u.threads.has(i.team.id)&&u.threads.set(i.team.id,{teamId:i.team.id,sessionId:i.team.sessionId,messages:[]}),u.definitions.get(i.team.id)));return _(l)},async list(){return await E(),_(await M())},async get(o){await E();let d=await C(o);return d===void 0?null:_(d)},async listThreads(){return await E(),_([...m.values()])},async getThread(o){await E();let d=m.get(o);return d===void 0?null:_(d)},async appendThreadEvent(o,d){return await E(),await x(A=>{let i=A.definitions?.get(o);if(!i||i.team.kind!=="group")throw new Error(`unknown group ${o}`);let l=A.threads.get(o)||{teamId:o,sessionId:i.team.sessionId,messages:[]},u=ge(l,d);A.threads.set(o,{...u,teamId:o})}),_(m.get(o))},async getRun(o){await E();let d=g.get(o);return d===void 0?null:_(d)},async start(o){await E();let d=await C(o);if(!d)throw new Error(`unknown team ${o}`);if(d.team.kind==="group")throw new Error("group chats do not start pipeline runs");let A=D(k(d));A.team.mode==="armed"&&await B();let i=await x(l=>{let u=l.definitions?l.definitions.get(o):A;if(!u)throw new Error(`unknown team ${o}`);if(u.team.mode==="draft")throw new Error("draft team must be promoted before running");if(u.team.mode==="halted")throw new Error("team kill switch is active");let p=e();if(p>=u.team.policy.expiresAt)throw new Error("team policy expired");let b=u.team.mode==="armed",H=u.team.agents.find(F=>!u.team.edges.some(j=>j.to===F.id));if(!H)throw new Error("team pipeline has no root agent");let R={id:or(),tenantId:c,teamId:o,teamHash:u.teamHash,status:u.team.mode==="shadow"?"shadowing":"running",mode:u.team.mode,armed:b,startedAt:p,updatedAt:p,expiresAt:u.team.policy.expiresAt,maxSteps:u.team.edges.length,steps:[],receipts:[],attempts:[],executionAllowed:!1,backendSigner:b,signingReady:b,broadcastReady:b,requiresOperatorConfirmation:!0,signed:!1,broadcast:!1};return l.runs.set(R.id,R),l.contexts.set(R.id,{compiled:D(k(u)),currentAgentId:H.id,previousHandoffHash:null,consumedHandoffHashes:new Set,executionConsumed:!1,confirmationPending:!1}),R});return _(i)},async step(o,d){await E();let A=await x(i=>{let l=i.runs.get(o),u=i.contexts.get(o);if(!l||!u)throw new Error(`unknown run ${o}`);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(V(l,u,p),l.steps.length>=l.maxSteps)throw new Error("run step budget exhausted");if(d?.agentId!==u.currentAgentId)throw new TypeError("step agent is out of order");let b=u.compiled.team.edges.find(j=>j.from===d.agentId);if(!b||b.to!==d?.targetAgentId||b.artifactKind!==d?.artifactKind)throw new TypeError("artifact does not match the exact next team edge");let H,R=null;if(u.previousHandoffHash===null){if(d.inputHandoffHash!==void 0)throw new TypeError("root step cannot consume a prior handoff");H=d.evidenceRefs}else{if(d.inputHandoffHash!==u.previousHandoffHash)throw new TypeError("step must consume the exact prior handoff");if(u.consumedHandoffHashes.has(d.inputHandoffHash))throw new TypeError("handoff was already consumed");R=d.inputHandoffHash,H=[`evidence:sha256:${d.inputHandoffHash}`]}let F=Ae({teamId:l.teamId,teamHash:l.teamHash,runId:o,sourceAgentId:b.from,targetAgentId:b.to,artifactKind:b.artifactKind,payload:d.payload,evidenceRefs:H,ttlMs:d.ttlMs,nowMs:p},{compiled:u.compiled});return R!==null&&u.consumedHandoffHashes.add(R),l.steps.push(F),l.updatedAt=p,u.currentAgentId=b.to,u.previousHandoffHash=F.handoffHash,b.to===u.compiled.team.agents.find(j=>j.role==="executor").id&&(l.status=l.mode==="armed"?"awaiting-confirmation":"prepared",l.preparedAt=p,l.mode!=="armed"&&(l.completedAt=p)),l});return _(A)},async confirm(o,d){await E();let A=await x(i=>{let l=i.runs.get(o),u=i.contexts.get(o);if(!l||!u)throw new Error(`unknown run ${o}`);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();V(l,u,p);let b=l.steps.at(-1);if(!b||b.artifactKind!=="approved-intent")throw new Error("approved intent handoff is required");if(p>=b.expiresAt)throw new Error("approved intent handoff expired");if(d?.handoffHash!==b.handoffHash)throw new TypeError("confirmation must bind the exact handoff hash");if(d?.operatorConfirmed!==!0||d?.sign!==!0||d?.broadcast!==!0)throw new TypeError("explicit confirm, sign, and broadcast instruction is required");if(u.executionConsumed||u.confirmationPending)throw new Error("approved intent is already executing or was already executed");return u.confirmationPending=!0,k(b)},{persist:!1});try{await B();let i=A.payload?.executionPlan?.legs;if(!Array.isArray(i)||!i.length)throw new Error("approved intent has no executable legs");await x(u=>{let p=u.runs.get(o),b=u.contexts.get(o);if(!p||!b)throw new Error(`unknown run ${o}`);let H=e();if(V(p,b,H),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(!b.confirmationPending||b.executionConsumed)throw new Error("approved intent is already executing or was already executed");if(H>=A.expiresAt)throw new Error("approved intent handoff expired");b.executionConsumed=!0,p.status="executing",p.updatedAt=H});for(let[u,p]of i.entries()){let b=ar(c,p.artifact,u);await x(j=>{let L=j.runs.get(o),N=j.contexts.get(o);if(!L||!N)throw new Error(`unknown run ${o}`);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(V(L,N,te),te>=A.expiresAt)throw new Error("approved intent handoff expired during execution");L.attempts[u]={legIndex:u,idempotencyKey:b,status:"submission-unknown",submittedAt:te},L.updatedAt=te});let H=await a.executeConfirmedArtifact(k(p.artifact),{tenantId:c,runId:o,handoffHash:A.handoffHash,idempotencyKey:b,legIndex:u,legCount:i.length});await x(j=>{let L=j.runs.get(o);if(!L)throw new Error(`unknown run ${o}`);let N=L.attempts[u];if(!N||N.idempotencyKey!==b)throw new Error("execution attempt state changed before receipt persistence");N.status="receipt-recorded",N.receipt=k(H),N.receivedAt=e(),L.receipts.push(k(H)),L.updatedAt=N.receivedAt});let R=g.get(o),F=y.get(o);if(R?.status==="halted")throw new Error("run was halted during sequential basket execution");if(!R||!F)throw new Error(`unknown run ${o}`);if(V(k(R),ke(F),R.updatedAt),R.updatedAt>=A.expiresAt)throw new Error("approved intent handoff expired during execution")}let l=await x(u=>{let p=u.runs.get(o),b=u.contexts.get(o);if(!p||!b)throw new Error(`unknown run ${o}`);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(V(p,b,p.updatedAt),p.updatedAt>=A.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(i){if(y.get(o)?.executionConsumed)try{await x(u=>{let p=u.runs.get(o),b=u.contexts.get(o);if(!p||!b)return;let H=p.attempts.some(R=>R.status==="submission-unknown");p.status!=="halted"&&p.status!=="expired"&&(p.status=H?"reconciliation-required":"failed"),p.executionAllowed=!1,p.uncertainExecution=H,p.partialExecution=p.receipts.length>0,p.error=i instanceof Error?i.message:"local execution failed",p.updatedAt=e()})}catch{}throw i}finally{await x(i=>{let l=i.contexts.get(o);l&&(l.confirmationPending=!1)},{persist:!1})}},async pause(o){await E();let d=await x(A=>{let i=A.runs.get(o);if(!i)throw new Error(`unknown run ${o}`);if(i.status!=="running"&&i.status!=="shadowing")throw new Error("only an active run can be paused");return i.resumeStatus=i.status,i.status="paused",i.updatedAt=e(),i});return _(d)},async resume(o){await E();let d=await x(A=>{let i=A.runs.get(o),l=A.contexts.get(o);if(!i||!l)throw new Error(`unknown run ${o}`);if(i.status!=="paused")throw new Error("only a paused run can be resumed");let u=e();return V(i,l,u),i.status=i.resumeStatus==="shadowing"?"shadowing":"running",delete i.resumeStatus,i.updatedAt=u,i});return _(d)},async halt(o){await E();let d=await x(A=>{let i=A.runs.get(o);if(!i)throw new Error(`unknown run ${o}`);return i.status="halted",delete i.resumeStatus,i.updatedAt=e(),i});return _(d)}})}import{createHash as dr}from"node:crypto";var lr=/\b[A-Z][A-Z0-9]{1,5}\b/g,fr=3e4;function ur(e){return dr("sha256").update(e).digest("hex")}function mr(e){return String(e).replace(/\$\s*\d[\d,.]*/g,"[amount]").slice(0,500)}function pr(e){let t=new Set(e.edges.map(f=>f.to)),r=e.agents.find(f=>!t.has(f.id));if(!r)throw new Error("team pipeline has no root agent");let n=new Map(e.edges.map(f=>[f.from,f])),a=[],c=r.id;for(;n.has(c);){let f=n.get(c);a.push(f),c=f.to}if(a.length!==e.edges.length)throw new Error("team pipeline edges are not a single ordered chain");return a}function hr({prompt:e,nowMs:t}){let r=[...new Set(e.match(lr)||[])];return{kind:"evidence",prompt:e,observations:r,generatedAt:t,source:"operator-prompt",liveData:"unavailable"}}function ze({agent:e,prompt:t,inbound:r}){let n=r?.kind==="evidence"?`evidence observations [${(r.observations||[]).join(", ")}]`:r?.kind==="analysis"?`prior ${r.role||"analysis"} thesis`:"operator prompt only",a=mr(`Rule-based bounded summary: ${e.role} review of ${n} for prompt "${t}". No live market data was read and no prices or market numbers are asserted.`);return{kind:"analysis",role:e.role,thesis:a,generator:{kind:"rules"},degradedReason:"model runtime unavailable"}}async function gr({agent:e,prompt:t,inbound:r,modelInvoker:n}){if(typeof n!="function")return ze({agent:e,prompt:t,inbound:r});try{let a=await n({agent:e,prompt:t,inbound:r});if(typeof a?.text!="string"||!a.text.trim())throw new Error("model invoker returned no text");return{kind:"analysis",role:e.role,thesis:a.text,generator:{kind:"model",provider:e.provider,model:e.model}}}catch{return ze({agent:e,prompt:t,inbound:r})}}function wr({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 yr(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 br({service:e,team:t,teamId:r,runId:n,prompt:a,nowMs:c,modelInvoker:f,onEvent:g}={}){let y=typeof g=="function"?m=>{g(m)}:()=>{};try{if(!e)throw new TypeError("service is required");if(typeof a!="string"||!a.trim())throw new TypeError("prompt is required");if(a.length>4e3)throw new TypeError("prompt exceeds 4000 characters");let m=String(r||t?.team?.id||t?.id||"");if(!m)throw new TypeError("teamId is required");let h=await e.get(m);if(!h)throw new Error(`unknown team ${m}`);let S=h.team,$=Number.isSafeInteger(c)?c:Date.now(),I=n?await e.getRun(n):await e.start(m);if(!I)throw new Error(`unknown run ${n}`);y({type:"run.started",run:I});let q=new Map(S.agents.map(_=>[_.id,_])),C=null,M=null;for(let[_,P]of pr(S).entries()){let v=q.get(P.from);y({type:"agent.started",agentId:v.id,name:v.name,role:v.role,runtime:v.runtime});let s;if(v.runtime==="deterministic")s=hr({prompt:a,nowMs:$});else if(v.runtime==="model")s=await gr({agent:v,prompt:a,inbound:M,modelInvoker:f});else if(v.runtime==="policy")s=wr({prompt:a,policy:S.policy});else throw new Error(`agent runtime ${v.runtime} cannot produce a handoff artifact`);y({type:"agent.output",agentId:v.id,text:yr(v,s),payload:s});let O={agentId:P.from,targetAgentId:P.to,artifactKind:P.artifactKind,payload:s,ttlMs:fr};_===0?O.evidenceRefs=[`evidence:sha256:${ur(`${m}\0${a}`)}`]:O.inputHandoffHash=C,I=await e.step(I.id,O);let x=I.steps.at(-1);C=x.handoffHash,M=s,y({type:"handoff.verified",handoff:{sourceAgentId:x.sourceAgentId,targetAgentId:x.targetAgentId,artifactKind:x.artifactKind,handoffHash:x.handoffHash}})}return y({type:"run.status",run:I}),I}catch(m){throw y({type:"error",message:m instanceof Error?m.message:"team turn failed"}),m}}import{closeSync as le,constants as U,fchmodSync as Ne,fsyncSync as Te,lstatSync as Ge,mkdirSync as xr,openSync as Ee,readFileSync as Ar,renameSync as kr,rmSync as De,writeFileSync as qe}from"node:fs";import{createHash as Tr,randomBytes as Er}from"node:crypto";import{homedir as Sr}from"node:os";import{dirname as Or,join as Se,resolve as Ir}from"node:path";var Ye=1,Pe=U.O_NOFOLLOW??0,$r=16*1024*1024,Oe=15*1024*1024;function _r(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 Ve(e){return e==null?e:structuredClone(e)}function We(e,t,r=!1){let n=r?!e.isDirectory():!e.isFile(),a=typeof process.getuid=="function"&&e.uid!==process.getuid();if(e.isSymbolicLink()||n||a||(e.mode&18)!==0)throw new Error(`${t} must be an owner-controlled ${r?"directory":"regular file"}`)}function Be(e){xr(e,{recursive:!0,mode:448});let t=Ge(e);We(t,"team state directory",!0)}function vr(e,t){let r=Tr("sha256").update(t).digest("hex");return Se(e,`${r}.json`)}function Ke(e){return Buffer.byteLength(`${JSON.stringify(e)}
|
|
3
|
-
`,"utf8")}function Ue(e){let t=Date.parse(String(e?.createdAt||""));return Number.isFinite(t)?t:Number.MIN_SAFE_INTEGER}function Hr(e){let t={...e,threads:e.threads.map(n=>ne(n))},r=Ke(t);for(;r>Oe;){let n=t.threads.flatMap((g,y)=>g.messages.map((m,h)=>({message:m,messageIndex:h,thread:g,threadIndex:y})).filter(({message:m})=>m?.historyTruncated!==!0));if(n.length===0)throw new Error("team state non-thread data exceeds durable size budget");n.sort((g,y)=>{let m=Ue(g.message)-Ue(y.message);if(m!==0)return m;let h=String(g.thread.teamId||""),S=String(y.thread.teamId||"");return h<S?-1:h>S?1:g.messageIndex!==y.messageIndex?g.messageIndex-y.messageIndex:g.threadIndex-y.threadIndex});let a=r-Oe,c=new Map,f=0;for(let g of n)if(c.set(g.threadIndex,(c.get(g.threadIndex)||0)+1),f+=Buffer.byteLength(JSON.stringify(g.message),"utf8")+1,f>=a+c.size*512)break;t={...t,threads:t.threads.map((g,y)=>{let m=c.get(y)||0;return m>0?ve(g,m):g})},r=Ke(t)}return t}function Je(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("team state snapshot must be an object");let r={...e,threads:e.threads===void 0?[]:e.threads};if(r.version!==Ye||r.tenantId!==t)throw new TypeError("team state tenant or version mismatch");if(!Number.isSafeInteger(r.revision)||r.revision<0)throw new TypeError("team state revision must be a non-negative safe integer");for(let n of["definitions","runs","contexts","threads"])if(!Array.isArray(r[n]))throw new TypeError(`team state ${n} must be an array`);return re(r),Hr(Ve(r))}function Rr(e){return{version:Ye,revision:0,tenantId:e,definitions:[],runs:[],contexts:[],threads:[]}}function Fe(e,t){try{let r=Ge(e);if(We(r,"team state file"),r.size>$r)throw new Error("team state file is too large");return Je(JSON.parse(Ar(e,"utf8")),t)}catch(r){if(r?.code==="ENOENT")return Rr(t);throw r}}function Xe(e=process.env){let t=String(e?.ORACLE_CONFIG_DIR||"").trim()||Se(Sr(),".config","oracle");return Se(t,"teams","state")}function Cr(e={}){let{rootDir:t=Xe(),tenantId:r}=e,n=_r(r),a=Ir(t),c=vr(a,n),f=`${c}.lock`;return Object.freeze({tenantId:n,file:c,async load(){return Be(a),Fe(c,n)},async save(g,{expectedRevision:y}={}){if(Be(a),!Number.isSafeInteger(y)||y<0)throw new TypeError("team state expectedRevision must be a non-negative safe integer");let m,h=!1,S=`${c}.${process.pid}.${Er(8).toString("hex")}.tmp`,$;try{m=Ee(f,U.O_CREAT|U.O_EXCL|U.O_WRONLY|Pe,384),h=!0,qe(m,`${process.pid}
|
|
4
|
-
`,"utf8"),
|
|
5
|
-
|
|
1
|
+
var Ae=Object.freeze(["draft","shadow","confirm","armed","autonomous","halted"]),kt=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}))),xt=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}))),At=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}))),ne=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}))),St=[["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(St.map(([e,t])=>Object.freeze({id:e,description:t,signs:!1,broadcasts:!1}))),Et=[["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"]],oe=Object.freeze(Et.map(([e,t])=>Object.freeze({id:e,description:t,signs:!1,broadcasts:!1}))),Tt=Object.freeze({autonomousOptIn:!1,requiresWalletConfirmation:!0,killSwitchRequired:!0,maxNotionalUsd:100,maxDailyLossUsd:10,chainAllowlist:Object.freeze(["ethereum"]),expiresAt:41024448e5});function X({id:e,name:t,scannerName:n,scannerTool:r,scannerSkill:o,scannerArtifact:i,chainAllowlist:a}){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({...Tt,chainAllowlist:Object.freeze(a)})})}var It=Object.freeze([X({id:"hyperliquid-alpha",name:"Hyperliquid Alpha",scannerName:"Market Scanner",scannerTool:"market.scan",scannerSkill:"hyperliquid-markets",scannerArtifact:"market-evidence",chainAllowlist:["hyperliquid"]}),X({id:"perp-market-breadth",name:"Perp Market Breadth",scannerName:"Breadth Scanner",scannerTool:"market.breadth",scannerSkill:"crypto-market-breadth",scannerArtifact:"breadth-evidence",chainAllowlist:["hyperliquid"]}),X({id:"perp-technical-strategy",name:"Perp Technical Strategy",scannerName:"Perp Technical Scanner",scannerTool:"perp.indicators",scannerSkill:"perp-technical-analysis",scannerArtifact:"technical-evidence",chainAllowlist:["hyperliquid"]}),X({id:"basket-relative-value",name:"Basket Relative Value",scannerName:"Basket Constructor",scannerTool:"basket.construct",scannerSkill:"basket-trading",scannerArtifact:"basket-evidence",chainAllowlist:["hyperliquid"]}),X({id:"wallet-watch",name:"Wallet Watch",scannerName:"Wallet Monitor",scannerTool:"wallet.watch",scannerSkill:"wallet-monitoring",scannerArtifact:"wallet-flow",chainAllowlist:["ethereum","base"]}),X({id:"evm-launch-radar",name:"EVM Launch Radar",scannerName:"Launch Scanner",scannerTool:"contract.read",scannerSkill:"contract-research",scannerArtifact:"contract-evidence",chainAllowlist:["ethereum","base","arbitrum"]}),X({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 nn}from"node:crypto";import{randomBytes as Nt}from"node:crypto";import{wordlists as Ot}from"ethers";var vt=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),$t=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],_t=new Set([12,15,18,21,24]);function Lt(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return _t.has(t.length)&&t.every(n=>Ot.en.getWordIndex(n)>=0)}var Rt=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,jt=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,Ct=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function zt(e){let t=De(e);return Ct.has(t)||jt.test(t)}var se=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function De(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function Mt(e){let t=De(e);return[...vt].some(n=>t.includes(n))}function Ht(e,t,n){if(typeof t=="string"){if($t.some(r=>r.test(t))||Lt(t))throw new se(n);if(Rt.test(t)&&!zt(e))throw new se(n)}}function Se(e,t="$",n=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return Ht(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)=>Se(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(Mt(o))throw new se(i);e[o]!==void 0&&(r[o]=Se(e[o],i,o))}return r}function de(e){return Se(e)}var Dt=/^ses-[0-9a-f]{32}$/,Pt=/^(?:sign|broadcast|execute|transaction\.execute|wallet\.sign)$/i,qt=/sign|broadcast|execute/i,Bt="team-history-truncated",Pe=`
|
|
2
|
+
[Message content truncated for durable storage.]`,Ft=200,Kt=512*1024,Ut=64*1024,Gt=48*1024;function S(e){return String(e??"").trim()}function Yt(e){return S(e).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")}function Ee(e){return Buffer.byteLength(JSON.stringify(e),"utf8")}function Wt(e,t){let n=String(e??"");if(Buffer.byteLength(n,"utf8")<=t)return n;let r=0,o=n.length;for(;r<o;){let a=Math.ceil((r+o)/2);Buffer.byteLength(n.slice(0,a),"utf8")<=t?r=a:o=a-1}let i=n.slice(0,r);return new RegExp("\\p{Surrogate}$","u").test(i)&&(i=i.slice(0,-1)),i}function Vt(e){let t=S(e?.text),n=Math.max(0,Gt-Buffer.byteLength(Pe,"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:S(e.generator.kind).slice(0,80),provider:S(e.generator.provider).slice(0,120),model:S(e.generator.model).slice(0,160)}:void 0;return{id:S(e?.id).slice(0,200)||"message-compacted",sender:S(e?.sender).slice(0,200)||"system",name:S(e?.name).slice(0,200)||"Oracle",text:`${Wt(t,n)}${Pe}`,state:S(e?.state).slice(0,80)||"complete",createdAt:S(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 Jt(e){let t=structuredClone(e);return Ee(t)<=Ut?t:Vt(t)}function Xt(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=S(r.createdAt))}return{omittedMessages:t,createdAt:n}}function Zt(e,t){return{id:Bt,sender:"system",name:"Oracle",text:`[Earlier team history omitted: ${e} ${e===1?"message":"messages"} pruned for durable storage.]`,state:"complete",createdAt:S(t),artifacts:[],historyTruncated:!0,omittedMessages:e}}function le(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:Ft,r=Number.isSafeInteger(t.maxBytes)&&t.maxBytes>0?t.maxBytes:Kt,o=Xt(e.messages),i=o.omittedMessages,a=e.messages.filter(y=>y?.historyTruncated!==!0).map(Jt),u=Number.isSafeInteger(t.dropOldest)&&t.dropOldest>0?Math.min(t.dropOldest,a.length):0;if(u>0&&(a=a.slice(u),i+=u),a.length>n){let y=a.length-n;a=a.slice(y),i+=y}let g=()=>({...e,messages:[...i>0?[Zt(i,o.createdAt||a[0]?.createdAt)]:[],...a]});for(;a.length>0&&Ee(g())>r;)a=a.slice(1),i+=1;let h=g();if(Ee(h)>r)throw new Error("team thread metadata exceeds durable size budget");return h}function Be(e,t){let n=Number.isSafeInteger(t)&&t>0?t:0;return le(e,{dropOldest:n})}function qe(e,t){return e.slice(t.length).trim()}function Te(e=Nt(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 ue(e){return Dt.test(String(e??""))}function Qt({text:e,agents:t,leadAgentId:n}){let r=S(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(a=>a.id),text:qe(r,o[0])};if(r.startsWith("@")){let u=t.flatMap(h=>[{agent:h,mention:`@${S(h.id)}`},{agent:h,mention:`@${S(h.name)}`},{agent:h,mention:`@${Yt(h.name)}`}]).sort((h,y)=>y.mention.length-h.mention.length).find(({mention:h})=>{let y=r.slice(0,h.length),T=r.at(h.length);return y.toLowerCase()===h.toLowerCase()&&(!T||/\s|[:,]/.test(T))});if(!u)throw new TypeError("Unknown agent mention");let g=qe(r,u.mention).replace(/^[:,]\s*/,"");return{kind:"mention",targetAgentIds:[u.agent.id],text:g}}return{kind:"lead",targetAgentIds:[(t.find(a=>a.id===n)??t[0]).id],text:r}}function en(e,t=[]){let n=S(e?.provider);return n?new Set(t.map(o=>S(o))).has(n)?{status:"online"}:{status:"offline",reason:`${n} is not connected`}:{status:"online"}}function tn(e){de(e);let t=S(e?.type),n=Array.isArray(e?.actions)?e.actions:[];if(Pt.test(t)||n.some(r=>qt.test(S(r?.type))))throw new TypeError("Chat cannot sign, broadcast, or execute")}function ie(e,t,n,r="complete"){return{id:S(e.id)||`message-${Date.now()}`,sender:t,name:n,text:S(e.text),state:r,createdAt:S(e.createdAt)||new Date().toISOString(),artifacts:[]}}function Ie(e,t){if(tn(t),!e||!ue(e.sessionId)||!Array.isArray(e.messages))throw new TypeError("Invalid team thread state");let n=[...e.messages];if(t.type==="message.user")n.push(ie(t,"user","You"));else if(t.type==="message.system")n.push(ie(t,"system","Oracle"));else if(t.type==="agent.offline"){let r=ie(t,S(t.agentId),S(t.name)||S(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(ie(t,S(t.agentId),S(t.name)||S(t.agentId),"thinking"));else if(t.type==="agent.output"){let r=n.findIndex(i=>i.id===t.id&&i.sender===t.agentId),o=ie(t,S(t.agentId),S(t.name)||S(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 le({...e,messages:n})}var rn=/^[a-z0-9][a-z0-9._-]{0,63}$/,on=/^#[0-9a-fA-F]{6}$/,sn=new Set(["deterministic","model","policy","operator"]),an=new Set(re.map(({id:e})=>e)),cn=new Set(oe.map(({id:e})=>e)),dn=new Set(ne.map(({id:e})=>e)),ln=/^p-[a-z0-9][a-z0-9_-]{0,62}$/,un=["secret","privatekey","seed","seedphrase","mnemonic","password","passphrase","credential","apikey","apitoken","accesstoken","authtoken","authorization","signingmaterial","walletexport","keymaterial"],fe=/(?:\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,fn=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"]),pn=new Set(fn);function w(e){throw new TypeError(e)}function ae(e,t){(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&w(`${t} must be a plain object`)}function mn(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function Fe(e){let t=mn(e);return t==="auth"||un.some(n=>t.includes(n))}function Oe(e,t="team",n=new Set){if(e&&typeof e=="object"){n.has(e)&&w(`unsafe cyclic field at ${t}`),n.add(e);for(let[r,o]of Object.entries(e))Fe(r)&&w(`forbidden secret-like field ${t}.${r}`),Oe(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)||w("value must be finite"),e):Array.isArray(e)?e.map(A):(ae(e,"value"),Object.fromEntries(Object.keys(e).sort().map(t=>(Fe(t)&&w(`forbidden secret-like field ${t}`),[t,A(e[t])]))))}function K(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))K(t);Object.freeze(e)}return e}function te(e){return nn("sha256").update(JSON.stringify(A(e))).digest("hex")}function Y(e,t,n=500){return(typeof e!="string"||!e.trim()||e.length>n)&&w(`${t} is invalid`),e}function N(e,t){return Y(e,t,64),rn.test(e)||w(`${t} is invalid`),e}function hn(e){return(typeof e!="string"||!on.test(e))&&w("agent color is invalid"),e}function gn(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 fe.test(n)||new RegExp(String.raw`\b${t}\b`,"i").test(n)}function me(e){return typeof e=="string"&&ln.test(e)&&!fe.test(e)}function ve(e){return N(e,"artifact kind"),pn.has(e)||w(`artifact kind ${e} is not allowed`),e}function pe(e,{nowMs:t=Date.now(),mode:n="shadow"}={}){ae(e,"policy"),Oe(e,"policy");let r=["autonomousOptIn","requiresWalletConfirmation","killSwitchRequired"];for(let i of r)typeof e[i]!="boolean"&&w(`policy.${i} must be boolean`);(!e.requiresWalletConfirmation||!e.killSwitchRequired)&&w("unsafe policy: wallet confirmation and kill switch are required");for(let i of["maxNotionalUsd","maxDailyLossUsd"])(!Number.isFinite(e[i])||e[i]<=0)&&w(`policy.${i} must be a positive finite cap`);(!Array.isArray(e.chainAllowlist)||!e.chainAllowlist.length)&&w("policy.chainAllowlist must be bounded");let o=e.chainAllowlist.map(i=>N(i,"chain id"));return new Set(o).size!==o.length&&w("duplicate chain id"),(!Number.isSafeInteger(e.expiresAt)||e.expiresAt<=t)&&w("policy expiry must be in the future"),n==="autonomous"&&!e.autonomousOptIn&&w("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 he(e,{nowMs:t=Date.now()}={}){ae(e,"team"),Oe(e);let n=e.kind===void 0?"pipeline":e.kind;n!=="pipeline"&&n!=="group"&&w("unsupported team kind");let r=n==="group";N(e.id,"team id"),Y(e.name,"team name",120),Ae.includes(e.mode)||w("unsupported team mode"),(!Array.isArray(e.agents)||!e.agents.length)&&w("agents must be non-empty");let o=new Set,i=e.agents.map((l,I)=>{ae(l,`agent ${I}`);let x=N(l.id,"agent id");o.has(x)&&w(`duplicate agent id ${x}`),o.add(x),Y(l.name,"agent name",120);let E=r?Y(l.role,"agent role",120):N(l.role,"agent role"),G=r&&l.color!==void 0?hn(l.color):void 0;sn.has(l.runtime)||w("invalid agent runtime");let s=Y(l.soul,"agent Soul",2e3);gn(s)&&w("unsafe Soul authority"),(!Array.isArray(l.toolIds)||!Array.isArray(l.skillIds))&&w("tool and skill IDs must be arrays");let c=l.toolIds.map(d=>(N(d,"tool id"),(!an.has(d)||fe.test(d))&&w(`forbidden tool ${d}`),d)),b=l.skillIds.map(d=>(N(d,"skill id"),(!cn.has(d)&&!me(d)||fe.test(d))&&w(`forbidden skill ${d}`),d));(new Set(c).size!==c.length||new Set(b).size!==b.length)&&w("duplicate tool or skill ID");let p=l.runtime==="model";return p?(Y(l.provider,"model provider",100),dn.has(l.provider)||w("unsupported model provider"),Y(l.model,"model",160)):(l.provider!==void 0||l.model!==void 0)&&w("provider/model only allowed for model runtime"),!r&&l.role==="executor"&&l.runtime!=="operator"&&w("executor must use operator runtime"),!r&&l.runtime==="operator"&&l.role!=="executor"&&w("operator runtime is reserved for the executor"),r&&l.runtime==="operator"&&w("group chat agents cannot use operator runtime"),l.role!=="executor"&&c.some(d=>d==="intent.prepare"||d==="operator.handoff")&&w("executor tools require operator authority"),r&&(c.includes("intent.prepare")||c.includes("operator.handoff"))&&w("group chat agents cannot prepare operator actions"),{id:x,name:l.name,role:E,runtime:l.runtime,...p?{provider:l.provider,model:l.model}:{},soul:s,toolIds:c,skillIds:b,...G?{color:G}:{},...r&&l.packId!==void 0?{packId:N(l.packId,"pack id")}:{},...r?{autoTools:l.autoTools!==!1}:{}}});if(r){(!Array.isArray(e.edges)||e.edges.length!==0)&&w("group chat edges must be empty");let l=Y(e.summary||"A focused agent group.","team summary",500),I=e.sessionId===void 0?Te():e.sessionId;ue(I)||w("group session id must use ses-hex format");let x=e.leadAgentId===void 0?i[0].id:N(e.leadAgentId,"lead agent id");o.has(x)||w("lead agent is not a group member");let E=pe(e.policy,{nowMs:t,mode:e.mode}),G=A({kind:"group",id:e.id,sessionId:I,name:e.name,summary:l,mode:e.mode,leadAgentId:x,agents:i,edges:[],policy:E});return K({team:G,teamHash:te(G),execution:{executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}})}let a=i.filter(l=>l.role==="executor");a.length!==1&&w("exactly one executor operator is required");let u=a[0];(!u.toolIds.includes("intent.prepare")||!u.toolIds.includes("operator.handoff"))&&w("executor requires prepare-only handoff tools"),Array.isArray(e.edges)||w("edges must be an array");let g=new Set,h=new Map([...o].map(l=>[l,[]])),y=e.edges.map(l=>{ae(l,"edge"),N(l.from,"edge source"),N(l.to,"edge target");let I=ve(l.artifactKind);(!o.has(l.from)||!o.has(l.to))&&w("broken edge references unknown agent"),l.from===l.to&&w("cycle in team DAG");let x=`${l.from}\0${l.to}\0${I}`;return g.has(x)&&w("duplicate edge"),g.add(x),h.get(l.from).push(l.to),{from:l.from,to:l.to,artifactKind:I}}),T=new Set,_=new Set;function v(l){if(T.has(l)&&w("cycle in team DAG"),!_.has(l)){T.add(l);for(let I of h.get(l))v(I);T.delete(l),_.add(l)}}for(let l of o)v(l);h.get(u.id).length&&w("executor must be the terminal team agent");let U=l=>{let I=[l],x=new Set;for(;I.length;){let E=I.shift();if(E===u.id)return!0;x.has(E)||(x.add(E),I.push(...h.get(E)))}return!1};for(let l of o)U(l)||w(`agent ${l} is disconnected from executor`);let C=i.filter(l=>!y.some(I=>I.to===l.id));C.length!==1&&w("team pipeline requires exactly one root agent");for(let l of i){let I=y.filter(E=>E.to===l.id).length,x=y.filter(E=>E.from===l.id).length;(l.id===C[0].id?I!==0:I!==1)&&w("team pipeline requires exactly one incoming handoff per non-root agent"),(l.id===u.id?x!==0:x!==1)&&w("team pipeline requires exactly one outgoing handoff per non-executor agent")}let M=y.filter(l=>l.to===u.id);(M.length!==1||M[0].artifactKind!=="approved-intent")&&w("executor requires exactly one approved-intent input"),i.find(l=>l.id===M[0].from)?.runtime!=="policy"&&w("executor input must come from a policy agent");let D=pe(e.policy,{nowMs:t,mode:e.mode}),L=A({id:e.id,name:e.name,mode:e.mode,agents:i,edges:y,policy:D});return K({team:L,teamHash:te(L),execution:{executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}})}var Ue=new Set(re.filter(e=>!e.signs&&!e.broadcasts).map(e=>e.id).filter(e=>!/intent\.prepare|operator\.handoff|sign|broadcast|execute/i.test(e))),Ge=new Set(oe.filter(e=>!e.signs&&!e.broadcasts).map(e=>e.id).filter(e=>!/armed|execution|sign|broadcast/i.test(e))),yn=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"]})]),ge=Object.freeze({toolIds:Object.freeze(["market.scan"]),skillIds:Object.freeze(["hyperliquid-markets"])});function Ke(e,t){return[...new Set(e)].filter(n=>t.has(n))}function $e({role:e="",soul:t=""}={}){let n=`${String(e)} ${String(t)}`.trim(),r=yn.filter(a=>a.pattern.test(n));if(r.length===0)return{toolIds:[...ge.toolIds],skillIds:[...ge.skillIds]};let o=Ke(r.flatMap(a=>a.toolIds),Ue),i=Ke(r.flatMap(a=>a.skillIds),Ge);return{toolIds:o.length>0?o:[...ge.toolIds],skillIds:i.length>0?i:[...ge.skillIds]}}function wn(e){return Ue.has(e)||Ge.has(e)}import z from"node:fs";import W from"node:path";import q from"node:fs";import Z from"node:path";var _e="https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",bn=/^[a-z0-9]+(?:[._-][a-z0-9]+)*(?:\.[a-z0-9]+(?:[._-][a-z0-9]+)*)*$/;function ye(e){try{let t=q.lstatSync(e);return t.isDirectory()&&!t.isSymbolicLink()}catch{return!1}}function kn(){return q.constants.O_NOFOLLOW||0}function Le(e){try{let t=q.lstatSync(e);return t.isFile()&&!t.isSymbolicLink()}catch{return!1}}function Ye(e){if(!Le(e))return null;let t=q.openSync(e,q.constants.O_RDONLY|kn());try{return q.readFileSync(t,"utf8")}finally{q.closeSync(t)}}function xn(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!==_e&&(e.$schema?t.push(`unsupported $schema: ${e.$schema} (expected ${_e})`):t.push("$schema is required \u2014 must be "+_e)),!e.name||typeof e.name!="string"?t.push("name is required (string)"):bn.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 An(e){let t=Z.join(e,"skills"),n=[];if(!ye(t))return n;function r(o,i=""){for(let a of q.readdirSync(o,{withFileTypes:!0})){let u=Z.join(o,a.name);if(a.isDirectory()){if(!ye(u))continue;r(u,i?`${i}/${a.name}`:a.name)}else if(a.name.endsWith(".md")){if(!Le(u))continue;let g=i?`${i}/${a.name.replace(/\.md$/,"")}`:a.name.replace(/\.md$/,"");n.push({name:g,path:u,relativePath:Z.relative(t,u)})}}}return r(t),n}function Sn(e){let t=Z.join(e,"mcp"),n=[];if(!ye(t))return n;for(let r of q.readdirSync(t,{withFileTypes:!0})){if(!r.isFile()||!r.name.endsWith(".json"))continue;let o=Z.join(t,r.name);if(Le(o))try{let i=Ye(o);if(i===null)continue;let a=JSON.parse(i);n.push({name:r.name.replace(/\.json$/,""),path:o,config:a})}catch(i){n.push({name:r.name.replace(/\.json$/,""),path:o,error:`invalid JSON: ${i.message}`})}}return n}function Re(e){let t=Z.resolve(e);if(!ye(t))return{ok:!1,error:`plugin directory not found: ${t}`};let n=Z.join(t,"plugin.json");if(!q.existsSync(n))return{ok:!1,error:`missing plugin.json in ${t}`};let r;try{let u=Ye(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=xn(r);if(!o.valid)return{ok:!1,error:"manifest validation failed",errors:o.errors};let i=An(t),a=Sn(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:a,warnings:[...o.warnings]}}}var En=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/}]),Tn=/\b(?:seed|mnemonic|recovery|phrase|backup)\b/i;function We(e){let t=String(e??"");if(!t)return null;for(let n of En){let r=t.match(n.re);if(r&&!(n.name==="BIP39 seed phrase"&&!Tn.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 Ve from"node:path";import{homedir as In}from"node:os";var On=/^[a-z0-9][a-z0-9_-]{0,63}$/;var Jr=64*1024;function vn(e=process.env){return e&&e.ORACLE_CONFIG_DIR||Ve.join(In(),".config","oracle")}function Je(e=process.env){return Ve.join(vn(e),"plugins")}function Xe(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 On.test(o)?o:null}var $n=new Set(ne.map(({id:e})=>e)),_n=16,Ln=200,Rn=64*1024,jn=new Set(["bash","sh","zsh","fish","cmd","cmd.exe","powershell","pwsh"]),Cn=/(?:^|\/)\.(?:env|ssh|gnupg)(?:$|\/)|(?:^|\/)(?:id_rsa|id_ed25519|wallet\.json|keys\.json)(?:$|\.)/i;function O(e){let t=new TypeError(e);throw t.code="ORACLE_TEAM_PACK_REFUSED",t}function B(e){return typeof e=="string"?e.trim():""}function et(e){let t=B(e);return t?!!(/^(https?:|git@|ssh:|file:|\\\\)/i.test(t)||/\.git(?:$|[?#])/i.test(t)):!1}function zn(e,t){let n=new Set((t||[]).map(a=>String(a))),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 Mn(e){let t=[],n=[e];for(;n.length;){let r=n.pop(),o;try{o=z.readdirSync(r,{withFileTypes:!0})}catch{O("pack directory is unreadable")}for(let i of o){let a=W.join(r,i.name);if((i.isSymbolicLink()||z.lstatSync(a).isSymbolicLink())&&O("pack cannot contain symbolic links"),i.isDirectory()){n.push(a);continue}i.isFile()&&(t.push(a),t.length>Ln&&O("pack has too many files"))}}return t}function Ze(e){let t=z.lstatSync(e);if((t.isSymbolicLink()||!t.isFile())&&O("pack files must be regular files"),t.size>Rn)return null;let n=z.openSync(e,z.constants.O_RDONLY|(z.constants.O_NOFOLLOW||0));try{return z.readFileSync(n)}finally{z.closeSync(n)}}function Qe(e,t){let n=Buffer.isBuffer(e)?e.toString("utf8"):String(e||""),r=We(n);r&&O(`pack ${t} contains ${r.name}`)}function Hn(e){let t=B(e).replace(/\\/g,"/");return W.basename(t).toLowerCase()}function Nn(e){e?.error&&O(`pack connector ${e.name||"unknown"} is invalid JSON`);let t=e?.config;(!t||typeof t!="object"||Array.isArray(t))&&O("pack connector config is invalid"),(t.url||t.headers||t.oauth||t.token)&&O("pack connectors cannot ship URLs, headers, or tokens"),t.env&&typeof t.env=="object"&&Object.keys(t.env).length&&O("pack connectors cannot ship env secrets; Oracle spawns them empty");let n=B(t.command);n||O("pack connector is missing a command"),jn.has(Hn(n))&&O("pack connectors cannot spawn a shell")}function Dn(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 Pn({description:e,name:t,playbooks:n}){let r=[B(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>2e3&&O("pack copy is too long"),r}function qn(e){let t=B(e);t||O("pack path is required"),et(t)&&O("private packs are local folders, not git clones");let n=W.resolve(t),r;try{r=z.lstatSync(n)}catch{O("pack directory not found")}return r.isSymbolicLink()&&O("pack cannot be a symbolic link"),r.isDirectory()||O("pack path must be a directory"),n}function tt(e){return String(e||"").replace(/\//g,"-")}function nt(e={}){let t=qn(e.root||e.path);for(let a of Mn(t)){let u=W.relative(t,a);Cn.test(u)&&O(`pack cannot include ${u}`);let g=Ze(a);g&&/\.(md|json|txt|mjs|js|ts|yml|yaml)$/i.test(a)&&Qe(g,u)}let n=Re(t);n.ok||O(n.error||"invalid plugin.json");let r=n.plugin;for(let a of r.mcpServers||[])Nn(a);let o=[];for(let a of r.skills||[]){if(o.length>=_n)break;let u=Xe(r.name,a?.name||a?.relativePath);if(!u||!me(u))continue;let g=a?.path?Ze(a.path):null,h=g?g.toString("utf8"):"",y=Dn(u,h);Qe(y,u),o.push({id:u,summary:y})}let i=Pn({description:r.description,name:r.name,playbooks:o});return{name:r.name,version:r.version||"0.0.0",description:r.description||"",root:t,playbooks:o,connectorCount:(r.mcpServers||[]).length,soul:i}}function Bn(e,t={}){let n=t.pluginsDir||Je(t.env||process.env);z.mkdirSync(n,{recursive:!0});let r=tt(e.name),o=W.join(n,r),i=W.resolve(o),a=W.resolve(e.root);if(a===i||a.startsWith(`${i}${W.sep}`))return i;if(z.existsSync(i)){let u;try{u=z.lstatSync(i)}catch{O(`plugin "${r}" already installed and unreadable`)}(u.isSymbolicLink()||!u.isDirectory())&&O(`plugin "${r}" already installed at an unsafe path`);let g=Re(i);return g.ok||O(`plugin "${r}" already installed but invalid; remove it first`),(g.plugin.name!==e.name||g.plugin.version!==e.version)&&O(`plugin "${r}" already installed at v${g.plugin.version}; remove it first to import v${e.version}`),i}return z.cpSync(a,i,{recursive:!0,dereference:!1}),i}function Fn(e={}){let t=nt(e),n=B(e.provider),r=B(e.model);$n.has(n)||O("unsupported model provider"),(!r||r.length>160)&&O("model is invalid"),e.install!==!1&&Bn(t,e);let o=$e({role:B(e.role)||t.description||t.name,soul:t.soul}),i=[...new Set([...t.playbooks.map(g=>g.id),...o.skillIds])],a=B(e.name)||t.name,u=B(e.role)||t.description||"Imported pack";return{preview:t,agent:{id:zn(a,e.existingAgentIds||[]),name:a.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:tt(t.name).slice(0,64)}}}var Kn=/^[a-z0-9][a-z0-9._:-]{0,127}$/i,Un=/^[0-9a-f]{64}$/,Gn=/^evidence:sha256:[0-9a-f]{64}$/,Yn=new Set(["approved-intent","prepared-intent","prepared-basket"]),Wn=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),Vn=/^[A-Za-z0-9@:_./-]{1,64}$/;function we(e,t){if(typeof e!="string"||!Kn.test(e))throw new TypeError(`${t} is invalid`);return e}function Jn(e,t){if(typeof e!="string"||!Un.test(e))throw new TypeError(`${t} is invalid`);return e}function be(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 rt(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new TypeError(`${n}.${r} is not allowed`)}function Q(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 Xn(e,t,{nowMs:n,expiresAt:r}){if(be(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(be(e.artifact,"basket leg artifact payload"),!Wn.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(Q(e.artifact.notionalUsd,"basket leg artifact notional")!==Q(t.notionalUsd,"basket leg notional"))throw new TypeError("basket leg artifact notional mismatch")}function Zn(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(be(r,"executionPlan"),rt(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 a=new Set,u=0,g=0;for(let[h,y]of r.legs.entries()){if(be(y,`executionPlan.legs[${h}]`),rt(y,new Set(["market","side","notionalUsd","weightBps","artifact"]),`executionPlan.legs[${h}]`),typeof y.market!="string"||!Vn.test(y.market))throw new TypeError("basket leg market is invalid");if(a.has(y.market))throw new TypeError(`duplicate basket market ${y.market}`);if(a.add(y.market),y.side!=="buy"&&y.side!=="sell")throw new TypeError("basket leg side must be buy or sell");if(u+=Q(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,Xn(y.artifact,y,n)}if(g!==1e4)throw new TypeError("basket leg weights must sum to 10000 bps");if(u!==Q(e.notionalUsd,"intent notional"))throw new TypeError("basket aggregate notional must equal the exact leg sum");if(u>Q(t.maxNotionalUsd,"policy maxNotionalUsd"))throw new TypeError("basket aggregate notional exceeds policy cap")}function Qn(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");Q(e.notionalUsd,"intent notional"),Q(e.maxLossUsd,"intent max loss",{allowZero:!0}),Zn(e,t,n)}function je(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=we(e.teamId,"teamId"),o=Jn(e.teamHash,"teamHash");if(t.team.id!==r||t.teamHash!==o)throw new TypeError("handoff team snapshot mismatch");let i=we(e.sourceAgentId,"sourceAgentId"),a=we(e.targetAgentId,"targetAgentId"),u=ve(e.artifactKind);if(!t.team.edges.some(v=>v.from===i&&v.to===a&&v.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(v=>{if(typeof v!="string"||!Gn.test(v))throw new TypeError("evidence reference must be a SHA-256 content hash");return v});if(new Set(g).size!==g.length)throw new TypeError("duplicate evidence reference");let h=A(e.payload),y=pe(t.team.policy,{nowMs:n,mode:t.team.mode}),T=n+e.ttlMs;if(T>y.expiresAt)throw new TypeError("handoff TTL exceeds policy expiry");Yn.has(u)&&Qn(h,y,{mode:t.team.mode,nowMs:n,expiresAt:T});let _={teamId:r,teamHash:o,runId:we(e.runId,"runId"),sourceAgentId:i,targetAgentId:a,artifactKind:u,payload:h,payloadHash:te(h),evidenceRefs:g,ttlMs:e.ttlMs,issuedAt:n,expiresAt:T,policy:y,policyHash:te(y)};return K(A({..._,handoffHash:te(_),executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}))}import{createHash as ot,randomUUID as er}from"node:crypto";function tr(e,t,n){let r=ot("sha256").update(JSON.stringify(t)).digest("hex");return`sha256:${ot("sha256").update(`${e}\0${r}\0${n}`).digest("hex")}`}function nr(e){return{...A({compiled:e.compiled,currentAgentId:e.currentAgentId,previousHandoffHash:e.previousHandoffHash,executionConsumed:e.executionConsumed,confirmationPending:!1}),consumedHandoffHashes:[...e.consumedHandoffHashes]}}function rr(e){return{...A(e),consumedHandoffHashes:new Set(e?.consumedHandoffHashes||[]),confirmationPending:!1}}function Ce(e){return{...A({compiled:e.compiled,currentAgentId:e.currentAgentId,previousHandoffHash:e.previousHandoffHash,executionConsumed:e.executionConsumed,confirmationPending:e.confirmationPending}),consumedHandoffHashes:new Set(e.consumedHandoffHashes)}}function ee(e,t,n){if(n>=t.compiled.team.policy.expiresAt)throw e.status="expired",e.updatedAt=n,new Error("team policy expired")}function ke(e,t){e.clear();for(let[n,r]of t)e.set(n,r)}function or({now:e=Date.now,storage:t,stateStore:n,tenantId:r="local-owner",executionAdapter:o}={}){let i=String(r||"").trim();if(!i)throw new TypeError("tenantId is required");let a=t??new Map,u=new Map,g=new Map,h=new Map,y=!n,T=null,_=0,v=Promise.resolve(),U=async(s,c)=>a.set(s,A(c)),C=async s=>a.get(s),M=async()=>a instanceof Map?[...a.values()]:a.list(),$=s=>K(A(s));function D(s){let c=v.then(s,s);return v=c.catch(()=>{}),c}function L(){if(!(a instanceof Map)){if(n)throw new Error("durable team state requires map-backed definitions");return{definitions:null,runs:new Map([...u].map(([s,c])=>[s,A(c)])),contexts:new Map([...g].map(([s,c])=>[s,Ce(c)])),threads:new Map([...h].map(([s,c])=>[s,A(c)]))}}return{definitions:new Map([...a].map(([s,c])=>[s,A(c)])),runs:new Map([...u].map(([s,c])=>[s,A(c)])),contexts:new Map([...g].map(([s,c])=>[s,Ce(c)])),threads:new Map([...h].map(([s,c])=>[s,A(c)]))}}function l(s,c){return{version:1,revision:c,tenantId:i,definitions:[...s.definitions.values()].map(A),runs:[...s.runs.values()].map(A),contexts:[...s.contexts.entries()].map(([b,p])=>({runId:b,context:nr(p)})),threads:[...s.threads.values()].map(A)}}function I(s){s.definitions&&ke(a,s.definitions),ke(u,s.runs),ke(g,s.contexts),ke(h,s.threads)}function x(s,{persist:c=!0}={}){return D(async()=>{let b=L(),p=s(b),d=_;if(c&&n){let m=_,f=await n.save(l(b,m),{expectedRevision:m});d=f.revision,b.threads=new Map((f.threads||[]).map(k=>[k.teamId,A(k)]))}return I(b),_=d,p})}async function E(){y||(T||(T=(async()=>{let s=await n.load();if(s.tenantId!==i)throw new Error("team state tenant mismatch");if(!Number.isSafeInteger(s.revision)||s.revision<0)throw new Error("team state revision is invalid");if(!(a instanceof Map))throw new Error("durable team state requires map-backed definitions");let c={definitions:new Map,runs:new Map,contexts:new Map,threads:new Map};for(let d of s.definitions)c.definitions.set(d.team.id,A(d));for(let d of s.runs)c.runs.set(d.id,A(d));for(let d of s.contexts)c.contexts.set(d.runId,rr(d.context));for(let d of s.threads||[])c.threads.set(d.teamId,A(d));let b=!1;for(let d of c.runs.values()){if(!(d.status==="executing"||d.attempts?.some(k=>k.status==="submission-unknown")))continue;d.status="reconciliation-required",d.executionAllowed=!1,d.requiresOperatorConfirmation=!1,d.uncertainExecution=!0,d.updatedAt=e();let f=c.contexts.get(d.id);f&&(f.executionConsumed=!0,f.confirmationPending=!1),b=!0}let p=s.revision;if(b){let d=await n.save(l(c,p),{expectedRevision:p});p=d.revision,c.threads=new Map((d.threads||[]).map(m=>[m.teamId,A(m)]))}I(c),_=p,y=!0})()),await T)}async function G(){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 E(),!(a instanceof Map)){let b=await D(async()=>{let p=typeof s?.id=="string"?await C(s.id):null,d=s?.kind==="group"&&s.sessionId===void 0?p:null,m=d?.team?.kind==="group"?{...s,sessionId:d.team.sessionId}:s,f=he(m,{nowMs:e()});if(p&&p.team?.kind!==f.team.kind)throw new Error("team kind cannot change");return await U(f.team.id,f),f});return $(b)}let c=await x(b=>{let p=typeof s?.id=="string"?b.definitions.get(s.id):null,d=s?.kind==="group"&&s.sessionId===void 0?p:null,m=d?.team?.kind==="group"?{...s,sessionId:d.team.sessionId}:s,f=he(m,{nowMs:e()}),k=b.definitions.get(f.team.id);if(k&&k.team?.kind!==f.team.kind)throw new Error("team kind cannot change");return b.definitions.set(f.team.id,A(f)),f.team.kind==="group"&&!b.threads.has(f.team.id)&&b.threads.set(f.team.id,{teamId:f.team.id,sessionId:f.team.sessionId,messages:[]}),b.definitions.get(f.team.id)});return $(c)},async list(){return await E(),$(await M())},async get(s){await E();let c=await C(s);return c===void 0?null:$(c)},async remove(s){await E();let c=String(s||"").trim();if(!(a instanceof Map)){if(typeof a.delete!="function")throw new Error("team storage does not support deletion");return $(await D(async()=>{let p=await C(c);if(!p||p.team?.kind!=="group")throw new Error(`unknown group ${c}`);if(await a.delete(c)===!1||await C(c)!==void 0)throw new Error(`team deletion failed ${c}`);h.delete(c);for(let[m,f]of u)f.teamId===c&&(u.delete(m),g.delete(m));return{deleted:!0,teamId:c}}))}let b=await x(p=>{let d=p.definitions.get(c);if(!d||d.team?.kind!=="group")throw new Error(`unknown group ${c}`);p.definitions.delete(c),p.threads.delete(c);for(let[m,f]of p.runs)f.teamId===c&&(p.runs.delete(m),p.contexts.delete(m));return{deleted:!0,teamId:c}});return $(b)},async listThreads(){return await E(),$([...h.values()])},async getThread(s){await E();let c=h.get(s);return c===void 0?null:$(c)},async appendThreadEvent(s,c){return await E(),await x(b=>{let p=b.definitions?.get(s);if(!p||p.team.kind!=="group")throw new Error(`unknown group ${s}`);let d=b.threads.get(s)||{teamId:s,sessionId:p.team.sessionId,messages:[]},m=Ie(d,c);b.threads.set(s,{...m,teamId:s})}),$(h.get(s))},async getRun(s){await E();let c=u.get(s);return c===void 0?null:$(c)},async start(s){await E();let c=await C(s);if(!c)throw new Error(`unknown team ${s}`);if(c.team.kind==="group")throw new Error("group chats do not start pipeline runs");let b=K(A(c));b.team.mode==="armed"&&await G();let p=await x(d=>{let m=d.definitions?d.definitions.get(s):b;if(!m)throw new Error(`unknown team ${s}`);if(m.team.mode==="draft")throw new Error("draft team must be promoted before running");if(m.team.mode==="halted")throw new Error("team kill switch is active");let f=e();if(f>=m.team.policy.expiresAt)throw new Error("team policy expired");let k=m.team.mode==="armed",R=m.team.agents.find(J=>!m.team.edges.some(P=>P.to===J.id));if(!R)throw new Error("team pipeline has no root agent");let j={id:er(),tenantId:i,teamId:s,teamHash:m.teamHash,status:m.team.mode==="shadow"?"shadowing":"running",mode:m.team.mode,armed:k,startedAt:f,updatedAt:f,expiresAt:m.team.policy.expiresAt,maxSteps:m.team.edges.length,steps:[],receipts:[],attempts:[],executionAllowed:!1,backendSigner:k,signingReady:k,broadcastReady:k,requiresOperatorConfirmation:!0,signed:!1,broadcast:!1};return d.runs.set(j.id,j),d.contexts.set(j.id,{compiled:K(A(m)),currentAgentId:R.id,previousHandoffHash:null,consumedHandoffHashes:new Set,executionConsumed:!1,confirmationPending:!1}),j});return $(p)},async step(s,c){await E();let b=await x(p=>{let d=p.runs.get(s),m=p.contexts.get(s);if(!d||!m)throw new Error(`unknown run ${s}`);if(d.status==="halted")throw new Error("run is halted");if(d.status==="paused")throw new Error("run is paused");if(d.status!=="running"&&d.status!=="shadowing")throw new Error("run cannot step from its current state");let f=e();if(ee(d,m,f),d.steps.length>=d.maxSteps)throw new Error("run step budget exhausted");if(c?.agentId!==m.currentAgentId)throw new TypeError("step agent is out of order");let k=m.compiled.team.edges.find(P=>P.from===c.agentId);if(!k||k.to!==c?.targetAgentId||k.artifactKind!==c?.artifactKind)throw new TypeError("artifact does not match the exact next team edge");let R,j=null;if(m.previousHandoffHash===null){if(c.inputHandoffHash!==void 0)throw new TypeError("root step cannot consume a prior handoff");R=c.evidenceRefs}else{if(c.inputHandoffHash!==m.previousHandoffHash)throw new TypeError("step must consume the exact prior handoff");if(m.consumedHandoffHashes.has(c.inputHandoffHash))throw new TypeError("handoff was already consumed");j=c.inputHandoffHash,R=[`evidence:sha256:${c.inputHandoffHash}`]}let J=je({teamId:d.teamId,teamHash:d.teamHash,runId:s,sourceAgentId:k.from,targetAgentId:k.to,artifactKind:k.artifactKind,payload:c.payload,evidenceRefs:R,ttlMs:c.ttlMs,nowMs:f},{compiled:m.compiled});return j!==null&&m.consumedHandoffHashes.add(j),d.steps.push(J),d.updatedAt=f,m.currentAgentId=k.to,m.previousHandoffHash=J.handoffHash,k.to===m.compiled.team.agents.find(P=>P.role==="executor").id&&(d.status=d.mode==="armed"?"awaiting-confirmation":"prepared",d.preparedAt=f,d.mode!=="armed"&&(d.completedAt=f)),d});return $(b)},async confirm(s,c){await E();let b=await x(p=>{let d=p.runs.get(s),m=p.contexts.get(s);if(!d||!m)throw new Error(`unknown run ${s}`);if(d.status==="halted")throw new Error("run is halted");if(d.status!=="awaiting-confirmation")throw new Error("run cannot confirm from its current state or was already executed");let f=e();ee(d,m,f);let k=d.steps.at(-1);if(!k||k.artifactKind!=="approved-intent")throw new Error("approved intent handoff is required");if(f>=k.expiresAt)throw new Error("approved intent handoff expired");if(c?.handoffHash!==k.handoffHash)throw new TypeError("confirmation must bind the exact handoff hash");if(c?.operatorConfirmed!==!0||c?.sign!==!0||c?.broadcast!==!0)throw new TypeError("explicit confirm, sign, and broadcast instruction is required");if(m.executionConsumed||m.confirmationPending)throw new Error("approved intent is already executing or was already executed");return m.confirmationPending=!0,A(k)},{persist:!1});try{await G();let p=b.payload?.executionPlan?.legs;if(!Array.isArray(p)||!p.length)throw new Error("approved intent has no executable legs");await x(m=>{let f=m.runs.get(s),k=m.contexts.get(s);if(!f||!k)throw new Error(`unknown run ${s}`);let R=e();if(ee(f,k,R),f.status==="halted")throw new Error("run was halted before execution");if(f.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(R>=b.expiresAt)throw new Error("approved intent handoff expired");k.executionConsumed=!0,f.status="executing",f.updatedAt=R});for(let[m,f]of p.entries()){let k=tr(i,f.artifact,m);await x(P=>{let H=P.runs.get(s),F=P.contexts.get(s);if(!H||!F)throw new Error(`unknown run ${s}`);if(H.status==="halted")throw new Error("run was halted during sequential basket execution");if(H.status!=="executing")throw new Error("run cannot execute from its current state");let ce=e();if(ee(H,F,ce),ce>=b.expiresAt)throw new Error("approved intent handoff expired during execution");H.attempts[m]={legIndex:m,idempotencyKey:k,status:"submission-unknown",submittedAt:ce},H.updatedAt=ce});let R=await o.executeConfirmedArtifact(A(f.artifact),{tenantId:i,runId:s,handoffHash:b.handoffHash,idempotencyKey:k,legIndex:m,legCount:p.length});await x(P=>{let H=P.runs.get(s);if(!H)throw new Error(`unknown run ${s}`);let F=H.attempts[m];if(!F||F.idempotencyKey!==k)throw new Error("execution attempt state changed before receipt persistence");F.status="receipt-recorded",F.receipt=A(R),F.receivedAt=e(),H.receipts.push(A(R)),H.updatedAt=F.receivedAt});let j=u.get(s),J=g.get(s);if(j?.status==="halted")throw new Error("run was halted during sequential basket execution");if(!j||!J)throw new Error(`unknown run ${s}`);if(ee(A(j),Ce(J),j.updatedAt),j.updatedAt>=b.expiresAt)throw new Error("approved intent handoff expired during execution")}let d=await x(m=>{let f=m.runs.get(s),k=m.contexts.get(s);if(!f||!k)throw new Error(`unknown run ${s}`);if(f.status==="halted")throw new Error("run was halted during sequential basket execution");if(f.status!=="executing")throw new Error("run cannot complete from its current state");if(ee(f,k,f.updatedAt),f.updatedAt>=b.expiresAt)throw new Error("approved intent handoff expired during execution");return f.status="completed",f.executionAllowed=!1,f.requiresOperatorConfirmation=!1,f.signed=!0,f.broadcast=!0,f.completedAt=e(),f.updatedAt=f.completedAt,f});return $(d)}catch(p){if(g.get(s)?.executionConsumed)try{await x(m=>{let f=m.runs.get(s),k=m.contexts.get(s);if(!f||!k)return;let R=f.attempts.some(j=>j.status==="submission-unknown");f.status!=="halted"&&f.status!=="expired"&&(f.status=R?"reconciliation-required":"failed"),f.executionAllowed=!1,f.uncertainExecution=R,f.partialExecution=f.receipts.length>0,f.error=p instanceof Error?p.message:"local execution failed",f.updatedAt=e()})}catch{}throw p}finally{await x(p=>{let d=p.contexts.get(s);d&&(d.confirmationPending=!1)},{persist:!1})}},async pause(s){await E();let c=await x(b=>{let p=b.runs.get(s);if(!p)throw new Error(`unknown run ${s}`);if(p.status!=="running"&&p.status!=="shadowing")throw new Error("only an active run can be paused");return p.resumeStatus=p.status,p.status="paused",p.updatedAt=e(),p});return $(c)},async resume(s){await E();let c=await x(b=>{let p=b.runs.get(s),d=b.contexts.get(s);if(!p||!d)throw new Error(`unknown run ${s}`);if(p.status!=="paused")throw new Error("only a paused run can be resumed");let m=e();return ee(p,d,m),p.status=p.resumeStatus==="shadowing"?"shadowing":"running",delete p.resumeStatus,p.updatedAt=m,p});return $(c)},async halt(s){await E();let c=await x(b=>{let p=b.runs.get(s);if(!p)throw new Error(`unknown run ${s}`);return p.status="halted",delete p.resumeStatus,p.updatedAt=e(),p});return $(c)}})}import{createHash as sr}from"node:crypto";var ir=/\b[A-Z][A-Z0-9]{1,5}\b/g,ar=3e4;function cr(e){return sr("sha256").update(e).digest("hex")}function dr(e){return String(e).replace(/\$\s*\d[\d,.]*/g,"[amount]").slice(0,500)}function lr(e){let t=new Set(e.edges.map(a=>a.to)),n=e.agents.find(a=>!t.has(a.id));if(!n)throw new Error("team pipeline has no root agent");let r=new Map(e.edges.map(a=>[a.from,a])),o=[],i=n.id;for(;r.has(i);){let a=r.get(i);o.push(a),i=a.to}if(o.length!==e.edges.length)throw new Error("team pipeline edges are not a single ordered chain");return o}function ur({prompt:e,nowMs:t}){let n=[...new Set(e.match(ir)||[])];return{kind:"evidence",prompt:e,observations:n,generatedAt:t,source:"operator-prompt",liveData:"unavailable"}}function st({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=dr(`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"}}async function fr({agent:e,prompt:t,inbound:n,modelInvoker:r}){if(typeof r!="function")return st({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");return{kind:"analysis",role:e.role,thesis:o.text,generator:{kind:"model",provider:e.provider,model:e.model}}}catch{return st({agent:e,prompt:t,inbound:n})}}function pr({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 mr(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})`}return`${e.name}: approved intent ${t.chainId} notional $${t.notionalUsd} maxLoss $${t.maxLossUsd}, all risk checks passed.`}async function hr({service:e,team:t,teamId:n,runId:r,prompt:o,nowMs:i,modelInvoker:a,onEvent:u}={}){let g=typeof u=="function"?h=>{u(h)}:()=>{};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 h=String(n||t?.team?.id||t?.id||"");if(!h)throw new TypeError("teamId is required");let y=await e.get(h);if(!y)throw new Error(`unknown team ${h}`);let T=y.team,_=Number.isSafeInteger(i)?i:Date.now(),v=r?await e.getRun(r):await e.start(h);if(!v)throw new Error(`unknown run ${r}`);g({type:"run.started",run:v});let U=new Map(T.agents.map($=>[$.id,$])),C=null,M=null;for(let[$,D]of lr(T).entries()){let L=U.get(D.from);g({type:"agent.started",agentId:L.id,name:L.name,role:L.role,runtime:L.runtime});let l;if(L.runtime==="deterministic")l=ur({prompt:o,nowMs:_});else if(L.runtime==="model")l=await fr({agent:L,prompt:o,inbound:M,modelInvoker:a});else if(L.runtime==="policy")l=pr({prompt:o,policy:T.policy});else throw new Error(`agent runtime ${L.runtime} cannot produce a handoff artifact`);g({type:"agent.output",agentId:L.id,text:mr(L,l),payload:l});let I={agentId:D.from,targetAgentId:D.to,artifactKind:D.artifactKind,payload:l,ttlMs:ar};$===0?I.evidenceRefs=[`evidence:sha256:${cr(`${h}\0${o}`)}`]:I.inputHandoffHash=C,v=await e.step(v.id,I);let x=v.steps.at(-1);C=x.handoffHash,M=l,g({type:"handoff.verified",handoff:{sourceAgentId:x.sourceAgentId,targetAgentId:x.targetAgentId,artifactKind:x.artifactKind,handoffHash:x.handoffHash}})}return g({type:"run.status",run:v}),v}catch(h){throw g({type:"error",message:h instanceof Error?h.message:"team turn failed"}),h}}import{closeSync as xe,constants as V,fchmodSync as it,fsyncSync as ze,lstatSync as mt,mkdirSync as gr,openSync as Me,readFileSync as yr,renameSync as wr,rmSync as at,writeFileSync as ct}from"node:fs";import{createHash as br,randomBytes as kr}from"node:crypto";import{homedir as xr}from"node:os";import{dirname as Ar,join as He,resolve as Sr}from"node:path";var ht=1,dt=V.O_NOFOLLOW??0,Er=16*1024*1024,Ne=15*1024*1024;function Tr(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 gt(e){return e==null?e:structuredClone(e)}function yt(e,t,n=!1){let r=n?!e.isDirectory():!e.isFile(),o=typeof process.getuid=="function"&&e.uid!==process.getuid();if(e.isSymbolicLink()||r||o||(e.mode&18)!==0)throw new Error(`${t} must be an owner-controlled ${n?"directory":"regular file"}`)}function lt(e){gr(e,{recursive:!0,mode:448});let t=mt(e);yt(t,"team state directory",!0)}function Ir(e,t){let n=br("sha256").update(t).digest("hex");return He(e,`${n}.json`)}function ut(e){return Buffer.byteLength(`${JSON.stringify(e)}
|
|
4
|
+
`,"utf8")}function ft(e){let t=Date.parse(String(e?.createdAt||""));return Number.isFinite(t)?t:Number.MIN_SAFE_INTEGER}function Or(e){let t={...e,threads:e.threads.map(r=>le(r))},n=ut(t);for(;n>Ne;){let r=t.threads.flatMap((u,g)=>u.messages.map((h,y)=>({message:h,messageIndex:y,thread:u,threadIndex:g})).filter(({message:h})=>h?.historyTruncated!==!0));if(r.length===0)throw new Error("team state non-thread data exceeds durable size budget");r.sort((u,g)=>{let h=ft(u.message)-ft(g.message);if(h!==0)return h;let y=String(u.thread.teamId||""),T=String(g.thread.teamId||"");return y<T?-1:y>T?1:u.messageIndex!==g.messageIndex?u.messageIndex-g.messageIndex:u.threadIndex-g.threadIndex});let o=n-Ne,i=new Map,a=0;for(let u of r)if(i.set(u.threadIndex,(i.get(u.threadIndex)||0)+1),a+=Buffer.byteLength(JSON.stringify(u.message),"utf8")+1,a>=o+i.size*512)break;t={...t,threads:t.threads.map((u,g)=>{let h=i.get(g)||0;return h>0?Be(u,h):u})},n=ut(t)}return t}function wt(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!==ht||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 de(n),Or(gt(n))}function vr(e){return{version:ht,revision:0,tenantId:e,definitions:[],runs:[],contexts:[],threads:[]}}function pt(e,t){try{let n=mt(e);if(yt(n,"team state file"),n.size>Er)throw new Error("team state file is too large");return wt(JSON.parse(yr(e,"utf8")),t)}catch(n){if(n?.code==="ENOENT")return vr(t);throw n}}function bt(e=process.env){let t=String(e?.ORACLE_CONFIG_DIR||"").trim()||He(xr(),".config","oracle");return He(t,"teams","state")}function $r(e={}){let{rootDir:t=bt(),tenantId:n}=e,r=Tr(n),o=Sr(t),i=Ir(o,r),a=`${i}.lock`;return Object.freeze({tenantId:r,file:i,async load(){return lt(o),pt(i,r)},async save(u,{expectedRevision:g}={}){if(lt(o),!Number.isSafeInteger(g)||g<0)throw new TypeError("team state expectedRevision must be a non-negative safe integer");let h,y=!1,T=`${i}.${process.pid}.${kr(8).toString("hex")}.tmp`,_;try{h=Me(a,V.O_CREAT|V.O_EXCL|V.O_WRONLY|dt,384),y=!0,ct(h,`${process.pid}
|
|
5
|
+
`,"utf8"),ze(h),it(h,384);let v=pt(i,r);if(v.revision!==g)throw new Error(`team state changed: stale revision ${g}; current revision ${v.revision}`);let U=wt({...u,revision:g+1},r),C=`${JSON.stringify(U)}
|
|
6
|
+
`;if(Buffer.byteLength(C,"utf8")>Ne)throw new Error("team state exceeds durable serialized size budget");_=Me(T,V.O_CREAT|V.O_EXCL|V.O_WRONLY|dt,384),ct(_,C,"utf8"),ze(_),it(_,384),xe(_),_=void 0,wr(T,i);let M=Me(Ar(i),V.O_RDONLY);try{ze(M)}finally{xe(M)}return gt(U)}finally{_!==void 0&&xe(_),at(T,{force:!0}),h!==void 0&&xe(h),y&&at(a,{force:!0})}}})}export{At as BASKET_STRATEGY_CATALOG,oe as CRYPTO_SKILL_CATALOG,re as CRYPTO_TOOL_CATALOG,kt as MARKET_BREADTH_CATALOG,ne as MODEL_PROVIDER_CATALOG,xt as PERP_SIGNAL_CATALOG,Ae as TEAM_MODES,It as TEAM_TEMPLATES,$e as autoSelectAgentCapabilities,he as compileTeamDefinition,$r as createDurableTeamStore,je as createTeamHandoff,or as createTeamService,Te as createTeamSessionId,bt as defaultTeamStateRoot,en as getAgentPresence,Fn as importTeamAgentFromPack,wn as isAutoSelectableCapability,me as isPackSkillId,ue as isTeamSessionId,et as looksRemotePackSource,Ie as reduceTeamThread,Qt as routeTeamMessage,hr as runTeamTurn,nt as scanTeamAgentPack};
|