@oracle-agent/oracle 0.28.28 → 0.28.30

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.
Files changed (61) hide show
  1. package/README.md +10 -3
  2. package/SETUP.md +3 -0
  3. package/dist/assets/skills/bankrbot/SKILL.md +24 -0
  4. package/dist/assets/skills/oracle-agentic-crypto/SKILL.md +39 -0
  5. package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
  6. package/dist/assets/skills/oracle-uniswap-v4-hooks/SKILL.md +31 -0
  7. package/dist/assets/skills/oracle-x402/SKILL.md +30 -0
  8. package/dist/bin/desk-server.mjs +28 -26
  9. package/dist/bin/oracle-data-mcp.mjs +26 -12
  10. package/dist/bin/oracle-gateway.mjs +39 -27
  11. package/dist/bin/oracle-mev-arb-shadow.mjs +5 -5
  12. package/dist/bin/oracle-mev-shadow.mjs +5 -5
  13. package/dist/bin/oracle-public-server.mjs +4 -4
  14. package/dist/bin/oracle-route.mjs +15 -15
  15. package/dist/bin/oracle-scan.mjs +11 -11
  16. package/dist/bin/oracle.mjs +4 -3
  17. package/dist/cli/commands/auth.mjs +6 -6
  18. package/dist/cli/commands/chat.mjs +161 -161
  19. package/dist/cli/commands/doctor.mjs +1 -1
  20. package/dist/cli/commands/eval.mjs +138 -139
  21. package/dist/cli/commands/farm.mjs +22 -22
  22. package/dist/cli/commands/follow.mjs +14 -14
  23. package/dist/cli/commands/harness.mjs +4 -4
  24. package/dist/cli/commands/model.mjs +163 -163
  25. package/dist/cli/commands/receipt.mjs +1 -1
  26. package/dist/cli/commands/resolve.mjs +6 -6
  27. package/dist/cli/commands/setup.mjs +23 -23
  28. package/dist/cli/commands/snipe.mjs +24 -0
  29. package/dist/cli/commands/strategy.mjs +3 -3
  30. package/dist/cli/commands/swap.mjs +25 -25
  31. package/dist/cli/commands/venues.mjs +1 -1
  32. package/dist/control/approval-binding.mjs +1 -0
  33. package/dist/control/finality.mjs +1 -0
  34. package/dist/control-plane/index.mjs +6 -0
  35. package/dist/data/desk-data.mjs +27 -25
  36. package/dist/data/names.mjs +2 -2
  37. package/dist/data/providers/farming.mjs +2 -2
  38. package/dist/governance-prepare.mjs +2 -0
  39. package/dist/index.mjs +44 -31
  40. package/dist/local-marketplace.mjs +3 -0
  41. package/dist/local-pack-registry.mjs +3 -0
  42. package/dist/local-signer/runtime.mjs +7 -7
  43. package/dist/local-x402.mjs +3 -0
  44. package/dist/nft/universal-mint-router.mjs +3 -3
  45. package/dist/notifications/index.mjs +3 -0
  46. package/dist/position-health.mjs +2 -0
  47. package/dist/router/index.mjs +2 -2
  48. package/dist/router/prepare-bridge.mjs +2 -2
  49. package/dist/safety-intelligence.mjs +1 -0
  50. package/dist/scanner/index.mjs +3 -3
  51. package/dist/strategy/index.mjs +3 -3
  52. package/dist/task.d.mts +130 -0
  53. package/dist/task.mjs +2 -0
  54. package/dist/tax-lots.mjs +5 -0
  55. package/dist/tenant-rbac.mjs +1 -0
  56. package/dist/workflow-telemetry.mjs +1 -0
  57. package/package.json +17 -2
  58. package/public/agent-connect/index.html +2 -2
  59. package/public/install.sh +2 -2
  60. package/public/oracle-splash/index.html +2 -2
  61. package/public/oracle-splash/install.sh +2 -2
@@ -0,0 +1,130 @@
1
+ export type OracleTaskPrepareStatus = "answered" | "prepared" | "refused" | "unavailable";
2
+ export type OracleTaskLifecycleState =
3
+ | "NONE" | "INTENT" | "QUOTE_COMPARISON" | "SIMULATION" | "PREPARED"
4
+ | "APPROVAL" | "SETTLEMENT" | "BALANCE_DELTA" | "POSITION";
5
+
6
+ /** Exact request body for POST /api/oracle/task/prepare. */
7
+ export interface OracleTaskPrepareRequest {
8
+ schemaVersion: 1;
9
+ prompt: string;
10
+ }
11
+
12
+ export interface OracleTaskCustody {
13
+ mode: "prepare-only";
14
+ requiresWalletSignature: true;
15
+ backendSigner: false;
16
+ signed: false;
17
+ broadcast: false;
18
+ }
19
+
20
+ export interface OracleTaskEvidence {
21
+ lifecycleState: OracleTaskLifecycleState;
22
+ lifecycleHeadHash: string | null;
23
+ prepareVerified: boolean;
24
+ }
25
+
26
+ export interface OracleTaskPreparedArtifact {
27
+ command: string[];
28
+ artifact: Record<string, unknown>;
29
+ checks: {
30
+ unsigned: boolean;
31
+ destination: string;
32
+ slippage: string;
33
+ };
34
+ }
35
+
36
+ /** Exact result body produced for POST /api/oracle/task/prepare. */
37
+ export interface OracleTaskPrepareResult {
38
+ schemaVersion: 1;
39
+ taskId: string;
40
+ status: OracleTaskPrepareStatus;
41
+ text: string;
42
+ custody: OracleTaskCustody;
43
+ prepared: OracleTaskPreparedArtifact | null;
44
+ evidence: OracleTaskEvidence;
45
+ }
46
+
47
+ export type OracleTaskEvent =
48
+ | { schemaVersion: 1; taskId: string; type: "accepted"; request: { schemaVersion: 1 } }
49
+ | { schemaVersion: 1; taskId: string; type: "delta"; text: string }
50
+ | { schemaVersion: 1; taskId: string; type: "stage"; stage: "provider" | "tool"; step?: number; tool?: "oracle_cli" | "trade_lifecycle" | "unknown"; outcome?: "complete" | "refused"; reason?: string }
51
+ | { schemaVersion: 1; taskId: string; type: "complete"; result: OracleTaskPrepareResult }
52
+ | { schemaVersion: 1; taskId: string; type: "error"; code: string; message: string };
53
+
54
+ export interface OracleTaskToolCall {
55
+ id?: string;
56
+ name?: string;
57
+ arguments?: string | Record<string, unknown>;
58
+ args?: Record<string, unknown>;
59
+ input?: Record<string, unknown>;
60
+ function?: { name?: string; arguments?: string };
61
+ }
62
+
63
+ export interface OracleTaskProviderResponse {
64
+ text?: string;
65
+ content?: string;
66
+ message?: { content?: string; tool_calls?: OracleTaskToolCall[] };
67
+ toolCalls?: OracleTaskToolCall[];
68
+ tool_calls?: OracleTaskToolCall[];
69
+ }
70
+
71
+ export interface OracleTaskProviderInput {
72
+ schemaVersion: 1;
73
+ taskId: string;
74
+ messages: Array<Record<string, unknown>>;
75
+ tools: typeof TASK_TOOLS;
76
+ signal: AbortSignal;
77
+ onDelta(delta: string): void;
78
+ }
79
+
80
+ export type OracleTaskProvider =
81
+ | ((input: OracleTaskProviderInput) => Promise<OracleTaskProviderResponse>)
82
+ | { complete(input: OracleTaskProviderInput): Promise<OracleTaskProviderResponse> }
83
+ | { run(input: OracleTaskProviderInput): Promise<OracleTaskProviderResponse> };
84
+
85
+ export interface OracleTaskAdapterOptions {
86
+ provider: OracleTaskProvider;
87
+ runOracleCli?: (argv: string[], context: { signal: AbortSignal }) => Promise<unknown>;
88
+ toolRunner?: (name: "oracle_cli", args: { argv: string[] }, context: { signal: AbortSignal }) => Promise<unknown>;
89
+ onEvent?: (event: OracleTaskEvent) => void;
90
+ signal?: AbortSignal;
91
+ maxSteps?: number;
92
+ taskIdFactory?: () => string;
93
+ lifecycle?: {
94
+ createTradeLifecycle?: (...args: any[]) => unknown;
95
+ advanceTradeLifecycle?: (...args: any[]) => unknown;
96
+ assertTradeLifecycle?: (...args: any[]) => unknown;
97
+ };
98
+ turnEvent?: (event: OracleTaskEvent) => void;
99
+ }
100
+
101
+ export interface OracleTaskTurnOptions {
102
+ signal?: AbortSignal;
103
+ onEvent?: (event: OracleTaskEvent) => void;
104
+ taskId?: string;
105
+ }
106
+
107
+ export interface OracleTaskAdapter {
108
+ prepare(request: OracleTaskPrepareRequest, options?: OracleTaskTurnOptions): Promise<OracleTaskPrepareResult>;
109
+ stop(reason?: string): void;
110
+ tools: typeof TASK_TOOLS;
111
+ }
112
+
113
+ export const TASK_SCHEMA_VERSION: 1;
114
+ export const TASK_RESULT_STATUSES: readonly OracleTaskPrepareStatus[];
115
+ export const TASK_CUSTODY_MARKERS: Readonly<OracleTaskCustody>;
116
+ export const TASK_PREPARE_REQUEST_SCHEMA: Readonly<Record<string, unknown>>;
117
+ export const TASK_TOOLS: readonly [
118
+ Readonly<{ type: "function"; function: Readonly<{ name: "oracle_cli"; description: string; strict: true; parameters: Readonly<Record<string, unknown>> }> }>,
119
+ Readonly<{ type: "function"; function: Readonly<{ name: "trade_lifecycle"; description: string; strict: true; parameters: Readonly<Record<string, unknown>> }> }>,
120
+ ];
121
+
122
+ export function validateTaskPrepareRequest(request: unknown):
123
+ | { ok: true; value: OracleTaskPrepareRequest }
124
+ | { ok: false; error: string };
125
+ export function assertTaskPrepareRequest(request: unknown): OracleTaskPrepareRequest;
126
+ export function validateTaskOracleCommand(argv: unknown): { ok: true } | { ok: false; error: string };
127
+ export function createTaskAdapter(options: OracleTaskAdapterOptions): OracleTaskAdapter;
128
+ export const createOracleTaskAdapter: typeof createTaskAdapter;
129
+ export function prepareOracleTask(request: OracleTaskPrepareRequest, options: OracleTaskAdapterOptions): Promise<OracleTaskPrepareResult>;
130
+ export const prepareTask: typeof prepareOracleTask;
package/dist/task.mjs ADDED
@@ -0,0 +1,2 @@
1
+ import{randomUUID as ct}from"node:crypto";import{validateMnemonic as ft}from"@scure/bip39";import{wordlist as ut}from"@scure/bip39/wordlists/english";var Ft=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),Vt=Object.freeze(["read","simulate"]);var qt=1440*60;var m=class extends Error{constructor(t,r){super(`secret material must never appear in a public API object (at ${t}, rule: ${r})`),this.name="SecretLeakError",this.path=t,this.rule=r}},De=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,Me=Object.freeze(["privkey","wif","xprv","seed"]);function oe(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return De.test(t)||Me.includes(r)}var he=Object.freeze([{rule:"raw-32-byte-hex-key",re:/^0x[0-9a-fA-F]{64}$/},{rule:"raw-32-byte-hex-bare",re:/^[0-9a-fA-F]{64}$/},{rule:"extended-private-key",re:/\b(?:xprv|tprv|yprv|zprv)[1-9A-HJ-NP-Za-km-z]{107}\b/},{rule:"bitcoin-wif",re:/\b[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{rule:"bip39-mnemonic",re:/\b(?:[a-z]{3,8}\s+){11,23}[a-z]{3,8}\b/},{rule:"bearer-token",re:/bearer\s+[A-Za-z0-9._~+/=-]+/i},{rule:"pem-private-key",re:/-----BEGIN[A-Z ]*PRIVATE KEY-----/},{rule:"keystore-path",re:/keystore/i},{rule:"signer-url",re:/https?:\/\/\S*sign/i},{rule:"authorization-header",re:/authorization\s*:/i}]),ge=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"]);function Be(e){return e.replace(/"([A-Za-z0-9_-]+)"\s*:\s*"(?:0x)?([0-9a-fA-F]{64})"/g,(t,r)=>ge.includes(String(r).toLowerCase().replace(/[_-]/g,""))?`"${r}":"<hex64>"`:t)}function ae(e){let t;try{t=JSON.stringify(e)}catch(o){throw new m("$",`unserializable-payload: ${String(o?.message||o)}`)}if(t===void 0)return"null";let r=Be(t);for(let{rule:o,re:a}of he)if(a.test(r))throw new m("$<serialized>",o);if(/(?:^|[^0-9a-fA-Fx])0x[0-9a-fA-F]{64}(?![0-9a-fA-F])/.test(r))throw new m("$<serialized>","raw-32-byte-hex-embedded");return JSON.parse(t,(o,a)=>{if(o&&oe(o))throw new m(`$<serialized>.${o}`,"forbidden-key-name");return a}),t}function b(e,t="$",r=new Set,n=""){if(e==null)return e;if(typeof e=="string"){let o=ge.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:a,re:s}of he)if(!(o&&a.startsWith("raw-32-byte-hex"))&&s.test(e))throw new m(t,a);return e}if(typeof e!="object"||r.has(e)||(r.add(e),ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e;if(e instanceof Map){for(let[o,a]of e.entries()){if(typeof o=="string"&&oe(o))throw new m(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");b(o,`${t}[key]`,r),b(a,`${t}[${String(o)}]`,r)}return e}if(e instanceof Set){let o=0;for(let a of e.values())b(a,`${t}[${o++}]`,r);return e}if(Array.isArray(e))return e.forEach((o,a)=>b(o,`${t}[${a}]`,r)),e;for(let[o,a]of Object.entries(e)){if(oe(o))throw new m(`${t}.${o}`,"forbidden-key-name");b(a,`${t}.${o}`,r,o)}return e}import{createHash as Pe}from"node:crypto";var se=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),ye=Object.freeze(Object.fromEntries(se.map((e,t)=>[e,Object.freeze(t+1<se.length?[se[t+1]]:[])]))),xe=new Set(["signed","broadcast"]);function ie(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ie).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ie(e[t])}`).join(",")}}`}function Fe(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function K(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))K(t)}return e}function ce(e,t="fact"){try{b(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function Ae(e){return Pe("sha256").update(ie(e)).digest("hex")}function Ee({tradeId:e,state:t,fact:r,asOf:n,previousHash:o,external:a}){let s={tradeId:e,state:t,asOf:n,previousHash:o??null,external:a===!0,fact:Fe(r)};return K({...s,hash:Ae(s)})}function we({tradeId:e,intent:t,asOf:r=0}={}){if(!e||typeof e!="string")throw new Error("tradeId is required");if(!t||typeof t!="object"||Array.isArray(t))throw new Error("intent fact is required");ce(t,"intent");let n=Ee({tradeId:e,state:"intent",fact:t,asOf:r,previousHash:null,external:!1});return K({tradeId:e,state:"intent",events:[n],headHash:n.hash,custody:"none",execution:"prepare-only"})}function Se(e,t,r,n={}){if(J(e),!(ye[e.state]||[]).includes(t))throw new Error(`invalid trade transition ${e.state} -> ${t}`);if(!r||typeof r!="object"||Array.isArray(r))throw new Error(`${t} fact is required`);ce(r,t);let a=n.external===!0||n.externallySupplied===!0;if(xe.has(t)&&!a)throw new Error(`${t} must be an externally supplied fact; this module never signs or broadcasts`);let s=e.events.at(-1),i=n.asOf??s.asOf;if(!Number.isFinite(Number(i))||Number(i)<Number(s.asOf))throw new Error("asOf must be finite and monotonic");let l=Ee({tradeId:e.tradeId,state:t,fact:r,asOf:i,previousHash:s.hash,external:a});return K({...e,state:t,events:[...e.events,l],headHash:l.hash})}function J(e){if(!e||!Array.isArray(e.events)||e.events.length===0)throw new Error("invalid trade lifecycle");if(e.custody!=="none")throw new Error("trade lifecycle custody must be none");if(e.execution!=="prepare-only")throw new Error("trade lifecycle execution must be prepare-only");let t=null;for(let r=0;r<e.events.length;r+=1){let n=e.events[r],{hash:o,...a}=n;if(Ae(a)!==o)throw new Error(`trade event ${r} hash mismatch`);if(ce(n.fact,`trade event ${r} fact`),!Number.isFinite(Number(n.asOf))||t&&Number(n.asOf)<Number(t.asOf))throw new Error(`trade event ${r} asOf must be finite and monotonic`);if(n.tradeId!==e.tradeId||n.previousHash!==t?.hash&&r>0)throw new Error(`trade event ${r} chain mismatch`);if(r===0&&(n.state!=="intent"||n.previousHash!==null))throw new Error("trade lifecycle must start with intent");if(t&&!ye[t.state]?.includes(n.state))throw new Error(`invalid recorded transition ${t.state} -> ${n.state}`);if(xe.has(n.state)&&n.external!==!0)throw new Error(`${n.state} is not externally supplied`);t=n}if(e.state!==t.state||e.headHash!==t.hash)throw new Error("trade lifecycle head mismatch");return!0}var Ve=["0x000000000022d473030f116ddee9f6b43ac78ba3"],qe={4663:["0xcaf681a66d020601342297493863e78c959e5cb2","0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7","0x1f7d7550b1b028f7571e69a784071f0205fd2efa","0x0bd7d308f8e1639fab988df18a8011f41eacad73","0x5fc5360d0400a0fd4f2af552add042d716f1d168","0xb477751b76cf82d00a686a1232f5fcd772414af3","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1"],8453:["0x2626664c2603336e57b271c5c0b26f421741e481","0x6ff5693b99212da76ad316178a184ab56d299b43","0x3d4e44eb1374240ce5f1b871ab261cd16335b76a","0x33128a8fc17869897dce68ed026d694621f6fdfd","0x4200000000000000000000000000000000000006","0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","0xbe6d8f0d05cc4be24d5167a3ef062215be6d18a5","0x254cf9e1e6e233aa1ac962cb9b05b2cfeaae15b0","0x5e7bb104d84c7cb9b682aac2f3d509f5f406809a","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x888888888889758f76e7103c6cbf23abbf58f946","0x3f170631ed9821ca51a59d996ab095162438dc10","0x4f37a9d177470499a2dd084621020b023fcffc1f","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],42161:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x61ffe014ba17989e743c5f6cb21bf9697530b21e","0x82af49447d8a07e3bd95bd0d56f35241523fbab1","0xaf88d065e77c8cc2239327c5edb3a432268e5831","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9","0x888888888889758f76e7103c6cbf23abbf58f946","0xeaedc32a51c510d35ebc11088fd5ff2b47aacf2e","0x2191718cd32d02b8e60badffea33e4b5dd9a0a0d","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110","0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41","0x7452c558d45f8afc8c83dae62c3f8a5be19c71f6"],1:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x4cd00e387622c35bddb9b4c962c136462338bc31","0x6a000f20005980200259b80c5102003040001068","0xae563e3f8219521950555f5962419c8919758ea2","0x45312ea0eff7e09c83cbe249fa1d7598c4c8cd4e","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],137:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x0dcded3545d565ba3b19e683431381007245d983"],10:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xe2fa4e1d17725e72dcdafe943ecf45df4b9e285b","0x0dcded3545d565ba3b19e683431381007245d983"],56:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xa72c85c258a81761433b4e8da60505fe3dd551cc"],43114:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xf39ca6ede9bf7820a952b52f3c94af526bab9015","0x0dcded3545d565ba3b19e683431381007245d983","0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2","0x820f5ffc5b525cd4d88cd91acf2c28f16530cc68"],999:["0x0a0758d937d1059c356d4714e57f5df0239bce1a","0xd2002373543ce3527023c75e7518c274a51ce712"],2741:["0x4f8c9056bb8a3616693a76922fa35d53c056e5b3"],988:["0x026f252016a7c47cdef1f05a3fc9e20c92a49c37","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1","0x817997ca8394e26cce3de3a076a4889b27dbf9de","0x3dea4be5615974f31624404ef288ba3b36dfeb83","0xeaf7ac0fdf150cdd89340fb762d83848de6a7b83","0x779ded0c9e1022225f8e0630b35a9b54be713736","0xbc6f7725f08232c151b528bdfcaaf89993ca86ee"]};function _e(e){let t=qe[Number(e)]||[];return new Set([...t,...Ve].map(r=>String(r).trim().toLowerCase()).filter(Boolean))}var j=100;var He=Object.freeze(["signature","signedTx","signedTransaction","rawTransaction","signedPayload","signedRaw"]),Ge=Object.freeze(["txid","txHash","transactionHash","broadcastHash"]),Ue=/^0x[a-fA-F0-9]{40}$/;function We(e,t=process.env){let r=t&&typeof t=="object"?t:process.env,n=String(r.ORACLE_DEST_ALLOWLIST||r.MAD_DEST_ALLOWLIST||"").split(",").map(s=>s.trim().toLowerCase()).filter(Boolean),o=Number(e),a=Number.isInteger(o)&&o>0?[..._e(o)]:[];return new Set([...n,...a])}function Ke(e){return!e||typeof e!="object"?!1:!!(e.slippageGuard||e.slippageBps!=null||e.slippage!=null||e.tokenIn||e.tokenOut||e.amountIn!=null||e.amountOut!=null)}function Je(e){return!e||typeof e!="object"?!1:!!(e.transaction||e.tx||e.to||e.destination||e.settlement||e.data||e.value!=null)}function Ze(e={}){let t=e.transaction&&typeof e.transaction=="object"?e.transaction:e.tx&&typeof e.tx=="object"?e.tx:e;return{to:t.to||e.to||e.destination||e.settlement||null,chainId:t.chainId??e.chainId??e.chain??null,data:t.data||e.data||null,value:t.value??e.value??null}}function Ye(e){let t=e.slippageGuard||e.madSlippage;return t&&t.selectedBps!=null?Number(t.selectedBps):t&&t.capBps!=null&&e.slippageBps==null?Number(t.capBps):e.slippageBps!=null?Number(e.slippageBps):e.slippage&&typeof e.slippage=="object"&&e.slippage.bps!=null?Number(e.slippage.bps):null}function fe(e,t={}){let r=[],n={unsigned:!1,destination:"n/a",slippage:"n/a"};if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,checks:n,errors:["prepared fact must be an object"]};e.signed===!0&&r.push("prepared fact is signed"),e.broadcast===!0&&r.push("prepared fact claims broadcast");for(let o of He)e[o]&&r.push(`prepared fact carries ${o}`);for(let o of Ge)e[o]&&r.push(`prepared fact claims executed ${o}`);if(n.unsigned=r.length===0,Je(e)){let o=Ze(e),a=o.to==null?"":String(o.to).trim();if(!a)r.push("prepared transaction is missing destination"),n.destination="missing";else{let s=Ue.test(a);if(a.startsWith("0x")&&!s)r.push("prepared destination is not a 20-byte address"),n.destination="malformed";else{let i=We(o.chainId,t.env),l=a.toLowerCase(),E=!!(e.routeAttestation||e.madRoute||e.vaultGuard||e.madVault);i.size>0&&s&&!i.has(l)&&!E?(r.push(`destination ${l} not allowlisted`),n.destination="blocked"):n.destination=i.size===0?"unset":"allowlisted"}}}if(Ke(e)){let o=Ye(e),a=e.slippageGuard?.capBps!=null?Number(e.slippageGuard.capBps):j;!Number.isInteger(o)||o<0?(r.push("swap prepare is missing integer slippage bps"),n.slippage="missing"):o>j||Number.isInteger(a)&&o>a||Number.isInteger(a)&&a>j?(r.push(`slippage ${o} exceeds cap ${Math.min(a,j)}`),n.slippage="blocked"):n.slippage="ok"}return{ok:r.length===0,checks:n,errors:r}}var Xe=(process.env.ORACLE_REDACT_SECRETS??"true").toLowerCase(),ke=["1","true","yes","on"].includes(Xe),Qe=[/sk-[A-Za-z0-9_-]{10,}/g,/sk_live_[A-Za-z0-9]{10,}/g,/sk_test_[A-Za-z0-9]{10,}/g,/ghp_[A-Za-z0-9]{10,}/g,/github_pat_[A-Za-z0-9_]{10,}/g,/gho_[A-Za-z0-9]{10,}/g,/ghs_[A-Za-z0-9]{10,}/g,/xox[baprs]-[A-Za-z0-9-]{10,}/g,/AIza[A-Za-z0-9_-]{30,}/g,/AKIA[A-Z0-9]{16}/g,/pplx-[A-Za-z0-9]{10,}/g,/hf_[A-Za-z0-9]{10,}/g,/xai-[A-Za-z0-9]{30,}/g,/gsk_[A-Za-z0-9]{10,}/g,/npm_[A-Za-z0-9]{10,}/g,/tvly-[A-Za-z0-9]{10,}/g,/Bearer\s+[A-Za-z0-9\-._~+/]+=*/gi],et=/\b0x[a-fA-F0-9]{64}\b/g,tt=/-----BEGIN (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH |ENCRYPTED )?PRIVATE KEY-----/g,rt=/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,nt=/\b([A-Z][A-Z0-9_]{0,40}(?:API_?KEY|TOKEN|SECRET|PASSWORD|PASSWD|PRIVATE_?KEY|MNEMONIC|SEED|AUTH)[A-Z0-9_]{0,20})\s*=\s*(['"]?)(\S+)\2/g,ot=/^(?:export\s+)?((?:api[_-]?key|token|secret|password|private[_-]?key|mnemonic|seed[_-]?phrase|authorization))\s*[:=]\s*(['"]?)([^\s&]+)\2/gim,at=/("(?:api[_-]?key|apiKey|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key|privateKey|secret|password|authorization|bearer|mnemonic|seedPhrase)"\s*:\s*")([^"]{6,})(")/gi,st=new Set(["access_token","refresh_token","id_token","token","api_key","apikey","client_secret","password","auth","jwt","session","secret","key","code","signature","x-amz-signature","private_key","authorization"]),pr=new Set([...st].map(e=>e.replace(/[^a-z0-9]/gi,"").toLowerCase()));function it(e){let t=String(e??"");return t.length<18?"[REDACTED]":`${t.slice(0,6)}\u2026${t.slice(-4)}`}function Oe(e){return`\xABredacted:${String(e??"").slice(0,4)}\u2026\xBB`}function N(e,t={}){if(e==null)return e;let r=typeof e=="string"?e:String(e);if(!r||!(t.force||ke))return r;let n=t.fileRead?Oe:it;r=r.replace(tt,"[REDACTED_PRIVATE_KEY]"),r=r.replace(et,"[REDACTED_EVM_KEY]"),r=r.replace(rt,o=>n(o));for(let o of Qe)o.lastIndex=0,r=r.replace(o,a=>n(a));return r=r.replace(nt,(o,a,s,i)=>/^(?:os\.(?:getenv|environ)|process\.env|\$ENV\{)/.test(i)?`${a}=${s||""}${i}${s||""}`:`${a}=${s||""}${n(i)}${s||""}`),r=r.replace(ot,(o,a,s,i)=>o.replace(i,n(i))),r=r.replace(at,(o,a,s,i)=>`${a}${n(s)}${i}`),r}function z(e,t={}){if(!(t.force||ke)||e==null)return e;if(typeof e=="string")return N(e,t);if(typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(r=>z(r,t));if(typeof e=="object"){let r={};for(let[n,o]of Object.entries(e)){let a=/private|secret|password|mnemonic|seed|api[_-]?key|token|authorization|bearer/i.test(n);typeof o=="string"&&a?r[n]=t.fileRead?Oe(o):"[REDACTED]":r[n]=z(o,t)}return r}try{return N(String(e),t)}catch{return"[REDACTED]"}}var A=1,wr=Object.freeze(["answered","prepared","refused","unavailable"]),lt=Object.freeze({mode:"prepare-only",requiresWalletSignature:!0,backendSigner:!1,signed:!1,broadcast:!1}),dt=Object.freeze({type:"object",properties:Object.freeze({schemaVersion:Object.freeze({const:A}),prompt:Object.freeze({type:"string",minLength:1,maxLength:8e3})}),required:Object.freeze(["schemaVersion","prompt"]),additionalProperties:!1}),pt=32*1024,X=64*1024,te=64*1024,$e=32*1024,bt=8,mt=12,ht=new Set(["sign","signed","signature","signer","signhash","action","actions","watch","receipt","broadcast","submit","execute","sendrawtransaction"]),gt=new Set(["list","show"]),yt=new Set(["call","catalog","health"]),xt=new Set(["swap","bridge","prepare","prepare-bridge"]),Ie=new Set(["quote_comparison","simulation","prepared","approval","settlement","balance_delta","position"]),Re=new Set(["signed","broadcast"]),At=Object.freeze({type:"string",minLength:1,maxLength:256}),ue=Object.freeze({type:"object",additionalProperties:!0});function Ne(e,t,r){return Object.freeze({type:"function",function:Object.freeze({name:e,description:t,strict:!0,parameters:Object.freeze(r)})})}var Te=Object.freeze([Ne("oracle_cli","Run one structurally allowlisted Oracle read or unsigned preparation command. It cannot sign, broadcast, watch, manage actions, or retrieve receipts.",{type:"object",properties:Object.freeze({argv:Object.freeze({type:"array",minItems:1,maxItems:24,items:Object.freeze({type:"string",maxLength:1e3}),description:"Allowed: chain list/show; data call/catalog/health; scan; route swap/bridge/prepare/prepare-bridge; prepare."})}),required:Object.freeze(["argv"]),additionalProperties:!1}),Ne("trade_lifecycle","Create, verify, or advance an ephemeral prepare-only trade lifecycle. Signed and broadcast states are refused. Only returned, hash-valid explicit events count as lifecycle evidence.",{type:"object",properties:Object.freeze({action:Object.freeze({type:"string",enum:Object.freeze(["create","verify","advance"])}),tradeId:At,intent:ue,lifecycle:ue,state:Object.freeze({type:"string",enum:Object.freeze([...Ie])}),fact:ue,asOf:Object.freeze({type:"number"})}),required:Object.freeze(["action"]),additionalProperties:!1})]),Et=["You are Oracle's prepare-only task adapter.","You have exactly two tools: oracle_cli and trade_lifecycle.","Never claim that you signed or broadcast. Never request or expose a key, token, mnemonic, signer, signature, watch, action, or receipt.","A request and your prose are not lifecycle evidence. Use tools for facts. PREPARED is established only by a verified unsigned artifact returned by oracle_cli.","The caller's wallet must review and sign every prepared artifact."].join(" ");function S(e){return Buffer.byteLength(String(e??""),"utf8")}function L(e,t,r=[]){if(!e||typeof e!="object"||Array.isArray(e))return"tool arguments must be an object";for(let o of t)if(!(o in e))return`${o} is required`;let n=new Set([...t,...r]);for(let o of Object.keys(e))if(!n.has(o))return`unexpected argument: ${o}`;return null}function de(e,t){try{return b(e,t),ae(e),null}catch{return`${t} contains forbidden secret or custody material`}}function wt(e){let t=String(e||"").toLowerCase().match(/[a-z]+/g)||[];for(let r of[12,15,18,21,24])for(let n=0;n+r<=t.length;n+=1)try{if(ft(t.slice(n,n+r).join(" "),ut))return!0}catch{}return!1}function St(e){let t=String(e||"");return N(t,{force:!0})!==t||/\b(?:xprv|tprv|yprv|zprv)[1-9A-HJ-NP-Za-km-z]{100,}\b/.test(t)||/\b[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}\b/.test(t)||wt(t)?"prompt contains forbidden secret material":null}function Q(e){return JSON.parse(JSON.stringify(e))}function D(e,t,r){let n;try{n=JSON.stringify(e)}catch{throw new TypeError(`${r} must be JSON-serializable`)}if(n===void 0&&(n="null"),Buffer.byteLength(n,"utf8")>t)throw new TypeError(`${r} exceeds size limit`);return n}function _t(e,t){let r=String(e??"");if(S(r)<=t)return r;let n=Math.min(r.length,t);for(;n>0&&S(r.slice(0,n))>t;)n-=Math.max(1,Math.ceil((S(r.slice(0,n))-t)/2));return`${r.slice(0,n)}
2
+ [truncated]`}function g(e,t=$e){let r=N(String(e??""),{force:!0});return r=r.replace(/("(?:signature|signedTransaction|rawTransaction|wif|xprv)"\s*:\s*")[^"]*(")/gi,"$1[REDACTED]$2"),_t(r,t)}function je(e){let t=D(e,te,"task egress"),r=t.replace(/"requiresWalletSignature"\s*:/g,'"walletReviewRequired":').replace(/"lifecycleHeadHash"\s*:/g,'"hash":'),n=JSON.parse(r);return ae(n),t}function v(e){let t=e instanceof Error?e.message:String(e||"task adapter error");return g(t,1e3)}function ze(e,t,r){let n=[t,r].filter(o=>typeof o=="function");return(o,a={})=>{let s=Object.freeze({schemaVersion:A,taskId:e,type:o,...a});try{je(s)}catch{return o==="error"?void 0:ze(e,t,r)("error",{code:"unsafe_event",message:"task event was suppressed"})}for(let i of n)try{i(s)}catch{}}}function Ce(e){if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,error:"request must be an object"};let t=Object.keys(e);if(t.length!==2||!t.includes("schemaVersion")||!t.includes("prompt"))return{ok:!1,error:"request must contain exactly schemaVersion and prompt"};if(e.schemaVersion!==A)return{ok:!1,error:`schemaVersion must be ${A}`};if(typeof e.prompt!="string"||e.prompt.trim()==="")return{ok:!1,error:"prompt must be a non-empty string"};if(e.prompt.length>dt.properties.prompt.maxLength||S(e.prompt)>pt)return{ok:!1,error:"prompt exceeds size limit"};let r=St(e.prompt);return r?{ok:!1,error:r}:{ok:!0,value:{schemaVersion:A,prompt:e.prompt}}}function Sr(e){let t=Ce(e);if(!t.ok)throw new TypeError(t.error);return t.value}function C(e){return String(e||"").trim().toLowerCase().replace(/^--?/,"").split("=",1)[0]}function kt(e){if(!Array.isArray(e)||e.length<1||e.length>24)return{ok:!1,error:"argv must contain 1 to 24 arguments"};if(e.some(n=>typeof n!="string"||n.length===0||n.length>1e3))return{ok:!1,error:"every argv item must be a non-empty string no longer than 1000 characters"};let t=de(e,"oracle_cli arguments");if(t)return{ok:!1,error:t};for(let n of e){let o=C(n);if(ht.has(o))return{ok:!1,error:`command not allowed: ${o}`}}let r=C(e[0]);if(r==="chain"){let n=C(e[1]);return gt.has(n)?{ok:!0}:{ok:!1,error:`command not allowed: chain${n?` ${n}`:""}`}}if(r==="data"){let n=C(e[1]);return yt.has(n)?n==="call"&&(e.length<4||!e[2].trim()||!e[3].trim())?{ok:!1,error:"data call requires provider and operation"}:{ok:!0}:{ok:!1,error:`command not allowed: data${n?` ${n}`:""}`}}if(r==="route"){let n=C(e[1]);return xt.has(n)?{ok:!0}:{ok:!1,error:`command not allowed: route${n?` ${n}`:""}`}}return r==="scan"||r==="prepare"?{ok:!0}:{ok:!1,error:`command not allowed: ${g(r||"(empty)",100)}`}}function Ot(e){return e[0]==="prepare"||e[0]==="route"&&(e[1]==="prepare"||e[1]==="prepare-bridge")}function Nt(e){let t=e?.arguments??e?.args??e?.input??e?.function?.arguments??{};if(t&&typeof t=="object"&&!Array.isArray(t))return D(t,X,"tool arguments"),Q(t);if(typeof t!="string"||S(t)>X)throw new TypeError("tool arguments must be bounded JSON");let r=JSON.parse(t||"{}");if(!r||typeof r!="object"||Array.isArray(r))throw new TypeError("tool arguments must be an object");return r}function Tt(e){let t=e?.toolCalls??e?.tool_calls??e?.message?.tool_calls??[];return Array.isArray(t)?t.map((r,n)=>({id:String(r?.id||`task-tool-${n+1}`),name:String(r?.name??r?.function?.name??""),source:r})):[]}function $t(e,t){let r=e?.text??e?.content??e?.message?.content;return typeof r=="string"?r:t.join("")}async function It(e,t){let r=typeof e=="function"?e:typeof e?.complete=="function"?e.complete.bind(e):typeof e?.run=="function"?e.run.bind(e):null;if(!r)throw new TypeError("task provider is unavailable");return r(t)}function Rt(e){return e?.aborted===!0}function jt(){let e=new Error("task was stopped");return e.name="AbortError",e}function h(e){if(Rt(e))throw jt()}function ee(e){if(Array.isArray(e))return e.map(ee);if(!e||typeof e!="object")return e;let t={};for(let[r,n]of Object.entries(e))/(?:private[_-]?key|signature|signed(?:tx|transaction|payload|raw)|rawtransaction|mnemonic|seed|wif|xprv|password|bearer|api[_-]?key|access[_-]?token|auth[_-]?token|keystore)/i.test(r)?t[r]="[REDACTED]":t[r]=ee(n);return t}function zt(e){let t=ee(z(e,{force:!0})),r=D(t,te,"tool output");return{value:JSON.parse(r),json:r}}function Ct(e,t){if(e&&typeof e=="object"&&e.ok===!1)return null;let r=null;if(typeof e=="string"?r=e:typeof e?.stdout=="string"?r=e.stdout:typeof e?.output=="string"&&(r=e.output),r==null)return null;let n=N(r,{force:!0});if(S(n)>te)return null;let o;try{o=JSON.parse(n.trim())}catch{return null}if(!o||typeof o!="object"||Array.isArray(o))return null;let a=o.prepared&&typeof o.prepared=="object"?o.prepared:o.artifact&&typeof o.artifact=="object"?o.artifact:o;if(!a||typeof a!="object"||Array.isArray(a))return null;let{requiresWalletSignature:s,...i}=a;if(de(i,"prepared artifact")||a.execution!=null&&a.execution!=="prepare-only"||a.requiresWalletSignature!=null&&a.requiresWalletSignature!==!0||a.backendSigner!=null&&a.backendSigner!==!1)return null;let l=fe(a);return l.ok?Object.freeze({command:Object.freeze([...t]),artifact:Object.freeze(Q(a)),checks:Object.freeze(Q(l.checks))}):null}function pe(e){return e?.events?.some(t=>Re.has(t?.state))}function Lt(e,t){if(J(e),pe(e))throw new TypeError("signed and broadcast lifecycle states are not accepted");let r=e.events.at(-1);if(!r||r.hash!==e.headHash||r.state!==e.state)throw new TypeError("trade lifecycle has no explicit head event");let n={lifecycleState:String(r.state).toUpperCase(),lifecycleHeadHash:r.hash,prepareVerified:t===!0};return Object.freeze(n)}function Y(e=!1){return Object.freeze({lifecycleState:"NONE",lifecycleHeadHash:null,prepareVerified:e===!0})}function vt(e){let t=L(e,["action"],["tradeId","intent","lifecycle","state","fact","asOf"]);if(t)return t;let r=de(e,"trade_lifecycle arguments");if(r)return r;if(!new Set(["create","verify","advance"]).has(e.action))return"unknown trade lifecycle action";if(e.lifecycle&&pe(e.lifecycle))return"signed and broadcast lifecycle states are not accepted";if(e.state&&Re.has(e.state))return`${e.state} lifecycle state is not accepted`;if(e.action==="create")return L(e,["action","tradeId","intent"],["asOf"]);if(e.action==="verify")return L(e,["action","lifecycle"]);if(e.action==="advance"){let n=L(e,["action","lifecycle","state","fact"],["asOf"]);if(n)return n;if(!Ie.has(e.state))return`lifecycle state is not accepted: ${String(e.state)}`}return null}function Dt(e,t={}){let r=vt(e);if(r)return{ok:!1,refused:!0,error:r};let n=t.createTradeLifecycle||we,o=t.advanceTradeLifecycle||Se,a=t.assertTradeLifecycle||J;try{if(e.action==="create"){let i=n({tradeId:e.tradeId,intent:e.intent,asOf:e.asOf});return a(i),{ok:!0,lifecycle:i}}if(e.action==="verify"){if(a(e.lifecycle),pe(e.lifecycle))throw new TypeError("signed and broadcast lifecycle states are not accepted");return{ok:!0,valid:!0,lifecycle:e.lifecycle}}if(a(e.lifecycle),e.state==="prepared"){let i=fe(e.fact);if(!i.ok)return{ok:!1,refused:!0,error:`prepare verifier failed: ${i.errors[0]}`}}let s=o(e.lifecycle,e.state,e.fact,{asOf:e.asOf});return a(s),{ok:!0,lifecycle:s}}catch(s){return{ok:!1,refused:!0,error:v(s)}}}function Z(e,t,r,n,o){let a={schemaVersion:A,taskId:e,status:t,text:g(r||""),custody:lt,prepared:n||null,evidence:o||Y(!!n)};return je(a),Object.freeze(a)}function Mt(e,t){return{role:"assistant",content:g(e||""),tool_calls:t.map(r=>({id:r.id,type:"function",function:{name:r.name,arguments:typeof(r.source?.arguments??r.source?.function?.arguments)=="string"?g(r.source.arguments??r.source.function.arguments,X):D(ee(z(r.source?.arguments??r.source?.args??r.source?.input??{},{force:!0})),X,"tool arguments")}}))}}function Bt(e,t){let r=t.taskId??(typeof e.taskIdFactory=="function"?e.taskIdFactory():null),n=r==null?`task-${ct()}`:String(r);if(!/^[A-Za-z0-9._:-]{1,128}$/.test(n))throw new TypeError("taskId must be a bounded opaque identifier");return n}function le(e,t){return Object.freeze({lifecycleState:e?.lifecycleState||"NONE",lifecycleHeadHash:e?.lifecycleHeadHash||null,prepareVerified:t===!0})}function Le(e={}){let t=e.provider,r=e.onEvent,n=Number.isInteger(e.maxSteps)&&e.maxSteps>0?Math.min(e.maxSteps,mt):bt,o=new Set,a=!1;async function s(l,E={}){let _=Bt(e,E),u=ze(_,r,E.onEvent),M=Ce(l);if(!M.ok){let d=Z(_,"refused",M.error,null,Y());return u("error",{code:"invalid_request",message:M.error}),u("complete",{result:d}),d}if(a){let d=Z(_,"unavailable","task adapter is stopped",null,Y());return u("error",{code:"stopped",message:"task adapter is stopped"}),u("complete",{result:d}),d}let c=new AbortController;o.add(c);let w=E.signal||e.signal,be=()=>c.abort(w?.reason);w&&(w.aborted?c.abort(w.reason):w.addEventListener("abort",be,{once:!0}));let B="",P=null,T=Y(),y=!1,k=!1,me=!1,$=[{role:"system",content:Et},{role:"user",content:M.value.prompt}];u("accepted",{request:{schemaVersion:A}});try{h(c.signal);for(let re=0;re<n;re+=1){h(c.signal);let ne=[];u("stage",{stage:"provider",step:re+1});let V;try{V=await It(t,{schemaVersion:A,taskId:_,messages:Q($),tools:Te,signal:c.signal,onDelta:f=>{S(ne.join(""))<=$e*2&&ne.push(String(f??""))}})}catch(f){h(c.signal),k=!0,u("error",{code:"provider_unavailable",message:v(f)});break}h(c.signal),D(V,te,"provider response");let ve=$t(V,ne),q=g(ve);q&&(B+=q,B=g(B),u("delta",{text:q}));let H=Tt(V);if(H.length===0){me=!0;break}if(H.length>4){y=!0,u("stage",{stage:"tool",outcome:"refused",reason:"too_many_calls"});break}$.push(Mt(q,H));for(let f of H){h(c.signal);let x;try{x=Nt(f.source)}catch(G){y=!0;let U={ok:!1,error:`tool refused: ${v(G)}`};$.push({role:"tool",tool_call_id:f.id,name:f.name,content:JSON.stringify(U)}),u("stage",{stage:"tool",tool:g(f.name,100),outcome:"refused"});continue}let p;if(f.name==="oracle_cli"){let G=L(x,["argv"]),U=G?{ok:!1,error:G}:kt(x.argv);if(!U.ok)y=!0,p={ok:!1,error:`tool refused: ${U.error}`};else{h(c.signal);try{typeof e.runOracleCli=="function"?p=await e.runOracleCli(x.argv,{signal:c.signal}):typeof e.toolRunner=="function"?p=await e.toolRunner("oracle_cli",x,{signal:c.signal}):(k=!0,p={ok:!1,error:"oracle_cli runner is unavailable"})}catch(W){h(c.signal),k=!0,p={ok:!1,error:v(W)}}if(h(c.signal),Ot(x.argv)){let W=Ct(p,x.argv);W&&(P=W,T=le(T,!0))}}}else f.name==="trade_lifecycle"?p=Dt(x,e.lifecycle):(y=!0,p={ok:!1,error:`tool refused: unknown tool ${g(f.name,100)}`});h(c.signal);let O=zt(p);if((O.value?.refused===!0||/^tool refused:/i.test(String(O.value?.error||"")))&&(y=!0),O.value?.lifecycle)try{T=Lt(O.value.lifecycle,!!P)}catch{}$.push({role:"tool",tool_call_id:f.id,name:f.name,content:O.json}),u("stage",{stage:"tool",tool:f.name==="oracle_cli"||f.name==="trade_lifecycle"?f.name:"unknown",outcome:O.value?.ok===!1?"refused":"complete"})}}!me&&!y&&!k&&$.at(-1)?.role==="tool"&&(k=!0,u("error",{code:"step_limit",message:"task step limit reached"}));let d=y?"refused":P?"prepared":k?"unavailable":"answered",I=y?null:P,F=le(T,!!I),R=Z(_,d,B,I,F);return u("complete",{result:R}),R}catch(d){let I=d?.name==="AbortError"||c.signal.aborted,F=I?"task was stopped":v(d),R=Z(_,"unavailable",F,null,le(T,!1));return u("error",{code:I?"aborted":"adapter_error",message:F}),u("complete",{result:R}),R}finally{w&&w.removeEventListener("abort",be),o.delete(c)}}function i(l="task adapter stopped"){a=!0;for(let E of o)E.abort(l)}return Object.freeze({prepare:s,stop:i,tools:Te})}async function Pt(e,t={}){return Le(t).prepare(e,{signal:t.signal,onEvent:t.turnEvent})}var _r=Le,kr=Pt;export{lt as TASK_CUSTODY_MARKERS,dt as TASK_PREPARE_REQUEST_SCHEMA,wr as TASK_RESULT_STATUSES,A as TASK_SCHEMA_VERSION,Te as TASK_TOOLS,Sr as assertTaskPrepareRequest,_r as createOracleTaskAdapter,Le as createTaskAdapter,Pt as prepareOracleTask,kr as prepareTask,kt as validateTaskOracleCommand,Ce as validateTaskPrepareRequest};
@@ -0,0 +1,5 @@
1
+ import{createHash as ge}from"node:crypto";import{wordlists as ye}from"ethers";var he=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),be=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],Ie=new Set([12,15,18,21,24]);function _e(t){let e=String(t).trim().toLowerCase().split(/\s+/).filter(Boolean);return Ie.has(e.length)&&e.every(o=>ye.en.getWordIndex(o)>=0)}var we=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,qe=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,Me=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function Se(t){let e=re(t);return Me.has(e)||qe.test(e)}var j=class extends Error{constructor(e){super(`action receipt refused: secret-bearing field at ${e}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function re(t){return String(t).replace(/[^a-z0-9]/gi,"").toLowerCase()}function ke(t){let e=re(t);return[...he].some(o=>e.includes(o))}function Ae(t,e,o){if(typeof e=="string"){if(be.some(i=>i.test(e))||_e(e))throw new j(o);if(we.test(e)&&!Se(t))throw new j(o)}}function H(t,e="$",o=""){if(t==null||typeof t=="boolean")return t;if(typeof t=="string")return Ae(o,t,e),t;if(typeof t=="number"){if(!Number.isFinite(t))throw new TypeError(`action receipt: non-finite number at ${e}`);return t}if(typeof t=="bigint")return t.toString();if(Array.isArray(t))return t.map((n,r)=>H(n,`${e}[${r}]`,o));if(typeof t!="object"||Object.getPrototypeOf(t)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${e}`);let i={};for(let n of Object.keys(t).sort()){let r=`${e}.${n}`;if(ke(n))throw new j(r);t[n]!==void 0&&(i[n]=H(t[n],r,n))}return i}function E(t){return H(t)}function K(t){return t===null||typeof t!="object"?JSON.stringify(t):Array.isArray(t)?`[${t.map(K).join(",")}]`:`{${Object.keys(t).map(e=>`${JSON.stringify(e)}:${K(t[e])}`).join(",")}}`}function V(t){return K(H(t))}function ae(t){if(!t||typeof t!="object"||Array.isArray(t))throw new TypeError("action receipt: object required");let{receiptId:e,summary:o,...i}=t;return ge("sha256").update(V(i)).digest("hex")}var ve=1,$e=Object.freeze(["fifo","lifo","hifo","specific"]),Oe="Accounting records only; not tax advice.",Ee=new Set(["acquisition","disposal","transfer"]),Be=new Set(["complete","incomplete","unknown"]),Re=/[\u0000-\u001f\u007f]/,Q=class extends Error{constructor(e,o="COST_BASIS_INVALID"){super(`cost basis: ${e}`),this.name="CostBasisValidationError",this.code=o}};function d(t,e){throw new Q(t,e)}function v(t,e){return t<e?-1:t>e?1:0}function p(t){if(t&&typeof t=="object"&&!Object.isFrozen(t)){for(let e of Object.values(t))p(e);Object.freeze(t)}return t}function w(t,e){return(!t||typeof t!="object"||Array.isArray(t)||Object.getPrototypeOf(t)!==Object.prototype)&&d(`${e} must be a plain object`),t}function g(t,e,{optional:o=!1,lower:i=!1}={}){if(t==null&&o)return null;typeof t!="string"&&d(`${e} must be a string`);let n=t.trim();return n||d(`${e} is required`),Re.test(n)&&d(`${e} contains control characters`),n.length>512&&d(`${e} is too long`),i?n.toLowerCase():n}function k(t,e,{optional:o=!1,positive:i=!1}={}){if(t==null&&o)return null;typeof t=="number"&&d(`${e} must be an exact decimal string or BigInt; Number coercion is refused`,"COST_BASIS_UNSAFE_NUMBER");let n;typeof t=="bigint"?n=t.toString():typeof t=="string"?n=t:d(`${e} must be an exact decimal string or BigInt`),/^\d+$/.test(n)||d(`${e} must be a non-negative base-10 integer string`);let r=BigInt(n);return i&&r===0n&&d(`${e} must be positive`),r.toString()}function C(t){return t==null?null:t.toString()}function N(t,e){let o=w(t,e);return p({chain:g(o.chain??o.chainId,`${e}.chain`,{lower:!0}),account:g(o.account??o.address??o.owner,`${e}.account`)})}function B(t,e){return`${t.length}:${t}|${e.chain.length}:${e.chain}|${e.account.length}:${e.account}`}function W(t,e="evidence"){if(t==null)return p({status:"unknown",references:[]});let o=w(t,e),i=g(o.status??"unknown",`${e}.status`,{lower:!0});Be.has(i)||d(`${e}.status must be complete, incomplete, or unknown`),o.references!=null&&!Array.isArray(o.references)&&d(`${e}.references must be an array`);let n=(o.references||[]).map((a,l)=>{let u=w(a,`${e}.references[${l}]`);return{kind:g(u.kind??u.type,`${e}.references[${l}].kind`,{lower:!0}),id:g(u.id??u.receiptId??u.txHash,`${e}.references[${l}].id`)}}).sort((a,l)=>v(a.kind,l.kind)||v(a.id,l.id)),r=[];for(let a of n)r.some(l=>l.kind===a.kind&&l.id===a.id)||r.push(a);return p({status:i,references:r})}function ce(t,e){if(t==null)return[];(!Array.isArray(t)||t.length===0)&&d(`${e} must be a non-empty array`);let o=new Set;return t.map((i,n)=>{let r=w(i,`${e}[${n}]`),a=g(r.lotId,`${e}[${n}].lotId`);return o.has(a)&&d(`${e} repeats lotId ${JSON.stringify(a)}`),o.add(a),p({lotId:a,quantity:k(r.quantity,`${e}[${n}].quantity`,{positive:!0})})})}function X(t){E(t);let e=w(t,"event"),o=g(e.type,"event.type",{lower:!0});Ee.has(o)||d("event.type must be acquisition, disposal, or transfer");let i=g(e.id??e.eventId,"event.id"),n=k(e.occurredAt??e.timestamp,"event.occurredAt"),r=g(e.asset??e.symbol??e.coin,"event.asset"),a=k(e.quantity??e.amount??e.size,"event.quantity",{positive:!0}),l=k(e.feeMinor??e.feeUsdMinor??"0","event.feeMinor"),u=W(e.evidence),h=e.source==null?null:g(e.source,"event.source"),f={id:i,type:o,occurredAt:n,asset:r,quantity:a,feeMinor:l,source:h,evidence:u};if(o==="acquisition"){let I={...f,location:N(e.location??{chain:e.chain??e.chainId,account:e.account??e.address??e.owner},"event.location"),grossAmountMinor:k(e.grossAmountMinor??e.costMinor??e.basisBeforeFeesMinor,"event.grossAmountMinor",{optional:!0}),lotId:g(e.lotId??i,"event.lotId"),specificLots:[]};return p(I)}return p(o==="disposal"?{...f,location:N(e.location??{chain:e.chain??e.chainId,account:e.account??e.address??e.owner},"event.location"),grossAmountMinor:k(e.grossAmountMinor??e.proceedsMinor??e.proceedsBeforeFeesMinor,"event.grossAmountMinor",{optional:!0}),specificLots:ce(e.specificLots??e.lotSelections,"event.specificLots")}:{...f,from:N(e.from,"event.from"),to:N(e.to,"event.to"),grossAmountMinor:null,specificLots:ce(e.specificLots??e.lotSelections,"event.specificLots")})}function Le(t,e){let o=BigInt(t.occurredAt)-BigInt(e.occurredAt);return o<0n?-1:o>0n?1:v(t.id,e.id)}function xe(t=[]){Array.isArray(t)||d("events must be an array");let e=new Map,o=0;for(let i of t){let n=X(i),r=V(n),a=e.get(n.id);if(a){a.canonical!==r&&d(`conflicting duplicate event id ${JSON.stringify(n.id)}`,"COST_BASIS_DUPLICATE_CONFLICT"),o+=1;continue}e.set(n.id,{event:n,canonical:r})}return p({events:[...e.values()].map(({event:i})=>i).sort(Le),duplicatesIgnored:o})}function Ze(t){E(t);let e=w(t,"fill"),o=g(e.side,"fill.side",{lower:!0});return o!=="buy"&&o!=="sell"&&d('fill.side must be "buy" or "sell"'),X({id:e.fillId??e.tradeId??e.orderId??e.txHash??e.transactionHash,type:o==="buy"?"acquisition":"disposal",occurredAt:e.filledAt??e.executedAt??e.time??e.timestamp??e.asOf,asset:e.asset??e.symbol??e.coin,location:{chain:e.chain??e.chainId,account:e.address??e.owner??e.account},quantity:e.quantity??e.amount??e.size,grossAmountMinor:e.grossAmountMinor??e.costMinor??e.proceedsMinor,feeMinor:e.feeMinor??e.feeUsdMinor??"0",source:e.source,evidence:e.evidence,specificLots:e.specificLots??e.lotSelections})}function et(t,e){E(e);let o=w(e,"receipt"),i=g(o.receiptId,"receipt.receiptId");ae(o)!==i&&d("receipt.receiptId does not match its public fields","COST_BASIS_RECEIPT_MISMATCH");let n=w(t,"event"),r=W(n.evidence);return X({...n,evidence:{status:r.status,references:[...r.references,{kind:"action-receipt",id:i}]}})}function Te(t){let e=g(t??"fifo","method",{lower:!0});return $e.includes(e)||d("method must be fifo, lifo, hifo, or specific"),e}var ue=Object.freeze({acquisitionFees:new Set(["include-in-basis","exclude","unresolved"]),disposalFees:new Set(["reduce-proceeds","exclude","unresolved"]),transferFees:new Set(["include-in-basis","exclude","unresolved"])});function Ce(t){t!=null&&w(t,"treatment");let e=t||{},o={};for(let i of Object.keys(ue))o[i]=g(e[i]??"unresolved",`treatment.${i}`,{lower:!0}),ue[i].has(o[i])||d(`treatment.${i} has an unsupported value`);return p(o)}function ze(t,e){E(t);let o=w(t,`marketValues[${e}]`);return p({id:g(o.id??o.valuationId,`marketValues[${e}].id`),asset:g(o.asset??o.symbol??o.coin,`marketValues[${e}].asset`),location:N(o.location??{chain:o.chain??o.chainId,account:o.account??o.address??o.owner},`marketValues[${e}].location`),quantity:k(o.quantity,`marketValues[${e}].quantity`),valueMinor:k(o.valueMinor??o.marketValueMinor,`marketValues[${e}].valueMinor`),asOf:k(o.asOf,`marketValues[${e}].asOf`),evidence:W(o.evidence,`marketValues[${e}].evidence`)})}function fe(t,e){return e==null||BigInt(t)<=BigInt(e)}function Fe(t=[],e=null){Array.isArray(t)||d("marketValues must be an array");let o=new Map,i=0;t.forEach((a,l)=>{let u=ze(a,l),h=V(u),f=o.get(u.id);f?(f.canonical!==h&&d(`conflicting duplicate market value id ${JSON.stringify(u.id)}`,"COST_BASIS_DUPLICATE_CONFLICT"),i+=1):o.set(u.id,{row:u,canonical:h})});let n=[...o.values()].map(({row:a})=>a).filter(a=>fe(a.asOf,e)),r=new Map;for(let a of n){let l=B(a.asset,a.location),u=r.get(l);(!u||BigInt(a.asOf)>BigInt(u.asOf)||a.asOf===u.asOf&&v(a.id,u.id)<0)&&r.set(l,a)}return{values:n.sort((a,l)=>v(a.id,l.id)),byHolding:r,duplicatesIgnored:i}}function b(t,e,o,i){t.push(p({code:e,eventId:o??null,detail:i}))}function je(t,e,o){if(t.grossAmountMinor==null)return b(o,"missing-acquisition-basis",t.id,"gross acquisition amount is unknown; lot basis remains unknown"),null;let i=BigInt(t.grossAmountMinor),n=BigInt(t.feeMinor);return n===0n?i:e.acquisitionFees==="include-in-basis"?i+n:e.acquisitionFees==="exclude"?i:(b(o,"unresolved-acquisition-fee-treatment",t.id,"fee treatment was not supplied; lot basis remains unknown"),null)}function Ve(t,e,o){if(t.grossAmountMinor==null)return b(o,"missing-disposal-proceeds",t.id,"gross disposal proceeds are unknown"),null;let i=BigInt(t.grossAmountMinor),n=BigInt(t.feeMinor);return n===0n?i:e.disposalFees==="reduce-proceeds"?i-n:e.disposalFees==="exclude"?i:(b(o,"unresolved-disposal-fee-treatment",t.id,"fee treatment was not supplied; recognized proceeds remain unknown"),null)}function Ne(t,e){let o=(i,n)=>{let r=BigInt(i.acquiredAt)-BigInt(n.acquiredAt);return r<0n?-1:r>0n?1:v(i.lotId,n.lotId)};return t==="fifo"?[...e].sort(o):t==="lifo"?[...e].sort((i,n)=>-o(i,n)):t==="hifo"?[...e].sort((i,n)=>{let r=i.basisRemaining*n.quantityRemaining,a=n.basisRemaining*i.quantityRemaining;return r>a?-1:r<a?1:o(i,n)}):[...e]}function le(t,e){let o=t.quantityRemaining,i=t.basisRemaining,n=null;return i!=null&&(n=e===o?i:i*e/o,t.basisRemaining-=n),t.quantityRemaining-=e,{lot:t,quantity:e,basis:n}}function Pe(t,e,o){let i=B(e,o);return t.filter(n=>n.key===i&&n.quantityRemaining>0n)}function He({event:t,lots:e,method:o,issues:i,tainted:n}){let r=t.type==="transfer"?t.from:t.location,a=B(t.asset,r),l=BigInt(t.quantity);if(n.has(a))return b(i,"inventory-state-incomplete",t.id,"an earlier unmatched record makes this holding indeterminate"),{matches:[],missing:l,key:a,indeterminate:!0};let u=Pe(e,t.asset,r);if(o==="hifo"&&u.some(I=>I.basisRemaining==null))return b(i,"hifo-basis-unknown",t.id,"HIFO cannot rank a lot whose basis is unknown"),n.add(a),{matches:[],missing:l,key:a,indeterminate:!0};let h=[],f=l;if(o==="specific"){if(t.specificLots.length===0)return b(i,"specific-lots-required",t.id,"specific-lot method requires explicit lot selections"),n.add(a),{matches:h,missing:f,key:a,indeterminate:!0};if(t.specificLots.reduce((q,M)=>q+BigInt(M.quantity),0n)!==l)return b(i,"specific-lot-quantity-mismatch",t.id,"specific-lot quantities do not equal the event quantity"),n.add(a),{matches:h,missing:f,key:a,indeterminate:!0};for(let q of t.specificLots){let M=u.find(x=>x.lotId===q.lotId),F=BigInt(q.quantity);if(!M||M.quantityRemaining<F){b(i,"specific-lot-unavailable",t.id,`requested lot ${JSON.stringify(q.lotId)} is absent or too small`);continue}h.push(le(M,F)),f-=F}}else{t.specificLots.length&&d(`event ${JSON.stringify(t.id)} supplies specificLots but method is ${o}`);for(let I of Ne(o,u)){if(f===0n)break;let q=f<I.quantityRemaining?f:I.quantityRemaining;h.push(le(I,q)),f-=q}}return f>0n&&(b(i,"insufficient-inventory",t.id,"recorded lots do not cover the event quantity; no replacement basis was invented"),n.add(a)),{matches:h,missing:f,key:a,indeterminate:f>0n}}function Y(t,e,o){if(t==null)return e.map(()=>null);let i=t,n=o;return e.map(r=>{if(n===0n)return 0n;let a=r===n?i:i*r/n;return i-=a,n-=r,a})}function Je(t,e){let o=[...t.map(i=>i.evidence.status),...e.map(i=>i.evidence.status)];return o.length===0||o.every(i=>i==="complete")?"complete":o.some(i=>i==="incomplete")?"incomplete":"unknown"}function z(t,e){let o=t.map(n=>n[e]),i=o.filter(n=>n!=null).reduce((n,r)=>n+BigInt(r),0n);return{value:o.every(n=>n!=null)?i.toString():null,known:i.toString()}}function De(t,e){return{lotId:t.lotId,originLotId:t.lotId,acquisitionEventId:t.id,asset:t.asset,location:t.location,key:B(t.asset,t.location),acquiredAt:t.occurredAt,quantityRemaining:BigInt(t.quantity),basisRemaining:e,evidenceStatus:t.evidence.status}}function me(t={},e={}){E(t),E(e),w(t,"input"),w(e,"options");let o=k(e.asOf??t.asOf,"asOf",{optional:!0}),i=xe(t.events||[]),n=o==null?i.events:i.events.filter(s=>fe(s.occurredAt,o)),r=Te(e.method??t.method),a=Ce(e.treatment??t.treatment),l=Fe(t.marketValues||[],o),u=[],h=[],f=new Set,I=[],q=[],M=new Set;for(let s of n){if(s.type==="acquisition"){if(f.has(s.lotId)){b(u,"duplicate-lot-id",s.id,`lotId ${JSON.stringify(s.lotId)} is already in use`),M.add(B(s.asset,s.location));continue}f.add(s.lotId),h.push(De(s,je(s,a,u)));continue}let m=He({event:s,lots:h,method:r,issues:u,tainted:M});if(s.type==="disposal"){let c=Ve(s,a,u),O=Y(c,m.matches.map(y=>y.quantity),BigInt(s.quantity)),_=m.matches.map((y,U)=>{let G=O[U];return p({lotId:y.lot.lotId,originLotId:y.lot.originLotId,quantity:y.quantity.toString(),basisMinor:C(y.basis),proceedsMinor:C(G),gainMinor:y.basis==null||G==null?null:(G-y.basis).toString(),acquiredAt:y.lot.acquiredAt,evidenceStatus:y.lot.evidenceStatus})}),S=_.filter(y=>y.basisMinor!=null).reduce((y,U)=>y+BigInt(U.basisMinor),0n),J=m.missing===0n&&_.every(y=>y.basisMinor!=null),D=m.missing===0n&&c!=null;I.push(p({eventId:s.id,asset:s.asset,location:s.location,occurredAt:s.occurredAt,quantity:s.quantity,grossProceedsMinor:s.grossAmountMinor,feeMinor:s.feeMinor,recognizedProceedsMinor:D?c.toString():null,basisMinor:J?S.toString():null,gainMinor:J&&D?(c-S).toString():null,unknownQuantity:m.missing.toString(),status:J&&D?"complete":"incomplete",evidenceStatus:s.evidence.status,matches:_}));continue}let $=BigInt(s.feeMinor),A=$>0n&&a.transferFees==="include-in-basis",R=$>0n&&a.transferFees==="unresolved";R&&b(u,"unresolved-transfer-fee-treatment",s.id,"fee treatment was not supplied; transferred lot basis remains unknown");let L=Y(A?$:0n,m.matches.map(c=>c.quantity),BigInt(s.quantity)),P=m.matches.map((c,O)=>{let _=c.basis;R?_=null:_!=null&&A&&(_+=L[O]);let S=`${s.id}:${O+1}`;return f.has(S)?(b(u,"duplicate-lot-id",s.id,`derived transfer lotId ${JSON.stringify(S)} is already in use`),M.add(B(s.asset,s.to)),null):(f.add(S),h.push({lotId:S,originLotId:c.lot.originLotId,acquisitionEventId:c.lot.acquisitionEventId,asset:s.asset,location:s.to,key:B(s.asset,s.to),acquiredAt:c.lot.acquiredAt,quantityRemaining:c.quantity,basisRemaining:_,evidenceStatus:s.evidence.status==="complete"&&c.lot.evidenceStatus==="complete"?"complete":"unknown"}),p({fromLotId:c.lot.lotId,toLotId:S,originLotId:c.lot.originLotId,quantity:c.quantity.toString(),basisMinor:C(_)}))}).filter(Boolean);m.indeterminate&&M.add(B(s.asset,s.to)),q.push(p({eventId:s.id,asset:s.asset,from:s.from,to:s.to,occurredAt:s.occurredAt,quantity:s.quantity,feeMinor:s.feeMinor,unknownQuantity:m.missing.toString(),status:m.indeterminate||P.some(c=>c.basisMinor==null)?"incomplete":"complete",moved:P}))}let F=h.filter(s=>s.quantityRemaining>0n).sort((s,m)=>v(s.key,m.key)||v(s.lotId,m.lotId)),x=new Map;for(let s of F)x.has(s.key)||x.set(s.key,[]),x.get(s.key).push(s);let T=[];for(let[s,m]of[...x].sort(([$],[A])=>v($,A))){let $=m.reduce((c,O)=>c+O.quantityRemaining,0n),A=l.byHolding.get(s)||null,R=M.has(s),L=A;A?BigInt(A.quantity)!==$&&(b(u,"market-value-quantity-mismatch",null,`market value ${JSON.stringify(A.id)} does not cover the recorded holding quantity`),L=null):b(u,"missing-market-value",null,`no market value was supplied for holding ${s}`),R&&(L=null);let P=Y(L?BigInt(L.valueMinor):null,m.map(c=>c.quantityRemaining),$);m.forEach((c,O)=>{let _=P[O],S=_==null||c.basisRemaining==null?null:_-c.basisRemaining;T.push(p({lotId:c.lotId,originLotId:c.originLotId,acquisitionEventId:c.acquisitionEventId,asset:c.asset,location:c.location,acquiredAt:c.acquiredAt,quantity:c.quantityRemaining.toString(),basisMinor:R?null:C(c.basisRemaining),marketValueMinor:C(_),unrealizedGainMinor:R?null:C(S),valuationId:L?.id??null,status:R||c.basisRemaining==null||_==null?"incomplete":"complete",evidenceStatus:c.evidenceStatus}))})}let Z=z(I,"basisMinor"),ee=z(I,"recognizedProceedsMinor"),te=z(I,"gainMinor"),ne=z(T,"basisMinor"),oe=z(T,"marketValueMinor"),ie=z(T,"unrealizedGainMinor"),se=n.every(s=>BigInt(s.feeMinor)>0n?s.type==="acquisition"?a.acquisitionFees!=="unresolved":s.type==="disposal"?a.disposalFees!=="unresolved":a.transferFees!=="unresolved":!0),pe={recordVersion:ve,recordType:"cost-basis-records",label:Oe,asOf:o,method:r,units:{quantity:"exact asset minor units as base-10 integer strings",usd:"USD minor units as base-10 integer strings"},accountingFacts:{events:n,marketValues:l.values,duplicatesIgnored:i.duplicatesIgnored+l.duplicatesIgnored},jurisdictionalTreatment:{suppliedByCaller:a,status:se?"specified":"unresolved",note:"Fee and lot-selection treatment can vary by jurisdiction. These caller-selected recordkeeping rules are not tax advice."},realized:{disposals:I,totals:{proceedsMinor:ee.value,basisMinor:Z.value,gainMinor:te.value,knownProceedsSubtotalMinor:ee.known,knownBasisSubtotalMinor:Z.known,knownGainSubtotalMinor:te.known}},transfers:q,holdings:T,unrealized:{totals:{marketValueMinor:oe.value,basisMinor:ne.value,gainMinor:ie.value,knownMarketValueSubtotalMinor:oe.known,knownBasisSubtotalMinor:ne.known,knownGainSubtotalMinor:ie.known}},completeness:{accounting:u.some(s=>s.code!=="missing-market-value")?"incomplete":"complete",valuation:T.every(s=>s.marketValueMinor!=null)?"complete":"incomplete",evidence:Je(n,l.values),treatment:se?"specified":"unresolved"},issues:u};return p(pe)}var tt=me,nt=me;function Ue(t){return w(t,"records"),`${V(t)}
2
+ `}function Ge(t){let e=t==null?"":String(t);return/^-?\d+$/.test(e)?e:/^[\s]*[=+\-@]/.test(e)||/^[\t\r]/.test(e)?`'${e}`:e}function de(t){return`"${Ge(t).replaceAll('"','""')}"`}function Ke(t){E(t),w(t,"records");let e=["record_label","row_type","event_id","lot_id","origin_lot_id","asset","chain","account","from_chain","from_account","to_chain","to_account","occurred_at","quantity","gross_amount_minor","fee_minor","proceeds_minor","basis_minor","gain_minor","market_value_minor","status","evidence_status"],o=[],i=n=>o.push(e.map(r=>de(n[r])).join(","));for(let n of t.accountingFacts?.events||[])i({record_label:t.label,row_type:`event:${n.type}`,event_id:n.id,lot_id:n.lotId,asset:n.asset,chain:n.location?.chain,account:n.location?.account,from_chain:n.from?.chain,from_account:n.from?.account,to_chain:n.to?.chain,to_account:n.to?.account,occurred_at:n.occurredAt,quantity:n.quantity,gross_amount_minor:n.grossAmountMinor,fee_minor:n.feeMinor,status:n.grossAmountMinor==null&&n.type!=="transfer"?"incomplete":"recorded",evidence_status:n.evidence?.status});for(let n of t.accountingFacts?.marketValues||[])i({record_label:t.label,row_type:"market-value",event_id:n.id,asset:n.asset,chain:n.location.chain,account:n.location.account,occurred_at:n.asOf,quantity:n.quantity,market_value_minor:n.valueMinor,status:"recorded",evidence_status:n.evidence?.status});for(let n of t.realized?.disposals||[]){n.matches.length===0&&i({record_label:t.label,row_type:"realized",event_id:n.eventId,asset:n.asset,chain:n.location.chain,account:n.location.account,occurred_at:n.occurredAt,quantity:n.quantity,gross_amount_minor:n.grossProceedsMinor,fee_minor:n.feeMinor,proceeds_minor:n.recognizedProceedsMinor,basis_minor:n.basisMinor,gain_minor:n.gainMinor,status:n.status,evidence_status:n.evidenceStatus});for(let r of n.matches)i({record_label:t.label,row_type:"realized-lot",event_id:n.eventId,lot_id:r.lotId,origin_lot_id:r.originLotId,asset:n.asset,chain:n.location.chain,account:n.location.account,occurred_at:n.occurredAt,quantity:r.quantity,gross_amount_minor:n.grossProceedsMinor,fee_minor:n.feeMinor,proceeds_minor:r.proceedsMinor,basis_minor:r.basisMinor,gain_minor:r.gainMinor,status:n.status,evidence_status:r.evidenceStatus})}for(let n of t.transfers||[]){n.moved.length===0&&i({record_label:t.label,row_type:"transfer",event_id:n.eventId,asset:n.asset,from_chain:n.from.chain,from_account:n.from.account,to_chain:n.to.chain,to_account:n.to.account,occurred_at:n.occurredAt,quantity:n.quantity,fee_minor:n.feeMinor,status:n.status});for(let r of n.moved)i({record_label:t.label,row_type:"transfer-lot",event_id:n.eventId,lot_id:r.toLotId,origin_lot_id:r.originLotId,asset:n.asset,from_chain:n.from.chain,from_account:n.from.account,to_chain:n.to.chain,to_account:n.to.account,occurred_at:n.occurredAt,quantity:r.quantity,fee_minor:n.feeMinor,basis_minor:r.basisMinor,status:n.status})}for(let n of t.holdings||[])i({record_label:t.label,row_type:"holding",lot_id:n.lotId,origin_lot_id:n.originLotId,asset:n.asset,chain:n.location.chain,account:n.location.account,occurred_at:n.acquiredAt,quantity:n.quantity,basis_minor:n.basisMinor,gain_minor:n.unrealizedGainMinor,market_value_minor:n.marketValueMinor,status:n.status,evidence_status:n.evidenceStatus});return`${e.map(de).join(",")}
3
+ ${o.join(`
4
+ `)}${o.length?`
5
+ `:""}`}var ot=Ue,it=Ke;export{Oe as COST_BASIS_RECORD_LABEL,ve as COST_BASIS_RECORD_VERSION,Q as CostBasisValidationError,$e as LOT_SELECTION_METHODS,nt as calculateCostBasis,me as createCostBasisRecords,Ke as exportCostBasisCsv,Ue as exportCostBasisJson,et as linkActionReceiptToTaxLotEvent,Ze as normalizePortfolioLedgerFill,X as normalizeTaxLotEvent,xe as normalizeTaxLotEvents,tt as summarizeCostBasis,it as taxLotRecordsToCsv,ot as taxLotRecordsToJson};
@@ -0,0 +1 @@
1
+ import{createHash as M}from"node:crypto";var f=1,p=1,b=1,H="local-owner",W="local-owner",B=Object.freeze(["owner","operator","agent","viewer"]),K=Object.freeze(["tenant","config","policy","grant","workflow","trade","receipt","audit","telemetry"]),g=Object.freeze({read:"read",create:"create",update:"update",delete:"delete",manage:"manage",prepare:"prepare",cancel:"cancel",export:"export",approve:"approve"}),F=Object.freeze(["owner"]),s=Object.freeze({ALLOW_ROLE_PERMISSION:"allow.role_permission",DENY_MISSING_CONTEXT:"deny.missing_context",DENY_INVALID_CONTEXT:"deny.invalid_context",DENY_INVALID_REQUEST:"deny.invalid_request",DENY_UNKNOWN_RESOURCE:"deny.unknown_resource",DENY_UNKNOWN_ACTION:"deny.unknown_action",DENY_UNBOUND_OBJECT:"deny.unbound_object",DENY_TENANT_MISMATCH:"deny.tenant_mismatch",DENY_RESOURCE_MISMATCH:"deny.resource_mismatch",DENY_ROLE_PERMISSION:"deny.role_permission",DENY_POLICY_NOT_APPROVER:"deny.policy_not_approver"}),j=new Set(B),A=new Set(K),X=new Set(Object.values(g)),D=new Set(["user","service","local-owner"]),k=new Set(["verified-session","service-credential","desktop-session","owner-arm-token","local-owner"]),m=/^[A-Za-z0-9][A-Za-z0-9._:@-]{0,127}$/,x="tob1",V=new WeakSet,L=Object.freeze({owner:Object.freeze(["tenant:read","tenant:manage","config:read","config:manage","policy:read","policy:manage","grant:read","grant:create","grant:update","grant:delete","grant:manage","workflow:read","workflow:create","workflow:update","workflow:delete","workflow:cancel","workflow:approve","trade:read","trade:prepare","receipt:read","receipt:export","audit:read","audit:export","telemetry:read","telemetry:create","telemetry:export"]),operator:Object.freeze(["tenant:read","config:read","policy:read","grant:read","workflow:read","workflow:create","workflow:update","workflow:cancel","trade:read","trade:prepare","receipt:read","audit:read","telemetry:read","telemetry:create"]),agent:Object.freeze(["tenant:read","config:read","policy:read","grant:read","workflow:read","workflow:create","workflow:update","trade:read","trade:prepare","receipt:read","telemetry:create"]),viewer:Object.freeze(["tenant:read","config:read","grant:read","workflow:read","trade:read","receipt:read","audit:read","telemetry:read"])}),ee=Object.freeze(Object.fromEntries(Object.entries(L).map(([e,t])=>[e,Object.freeze([...t])]))),o=class extends Error{constructor(t,n="invalid-context"){super(t),this.name="TenantContextError",this.code=n}};function N(e){return!!e&&typeof e=="object"&&!Array.isArray(e)&&Object.getPrototypeOf(e)===Object.prototype}function E(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))E(t)}return e}function I(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(I).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${I(e[t])}`).join(",")}}`}function S(e){return M("sha256").update(I(e)).digest("hex")}function R(e,t,n){if(!N(e))throw new o(`${n} must be a plain object`);let r=Object.keys(e).filter(a=>!t.has(a));if(r.length)throw new o(`${n} has unknown fields: ${r.sort().join(", ")}`)}function O(e,t){let n=String(e??"").trim();if(!m.test(n))throw new o(`${t} is invalid`);return n}function C(e,t="assignedRoles"){if(!Array.isArray(e)||e.length===0)throw new o(`${t} must contain at least one trusted role`,"missing-role-assignment");let n=[...new Set(e.map(a=>String(a??"").trim()))].sort(),r=n.filter(a=>!j.has(a));if(r.length)throw new o(`${t} contains unknown roles: ${r.join(", ")}`,"unknown-role");return n}function Y(e,t){return e.length===t.length&&e.every((n,r)=>n===t[r])}function J(e){if(!N(e)||e.schemaVersion!==f||!m.test(e.tenantId||"")||typeof e.localCompatibility!="boolean")return!1;let t=e.actor;if(!N(t)||t.schemaVersion!==p||!m.test(t.actorId||"")||!D.has(t.actorType)||!k.has(t.authSource)||!Array.isArray(t.roles)||t.roles.length===0)return!1;let n=[...new Set(t.roles)].sort();return n.every(r=>j.has(r))&&Y(n,t.roles)}function $(e,{assignedRoles:t,localCompatibility:n=!1}={}){if(R(e,new Set(["schemaVersion","tenantId","actor","localCompatibility"]),"tenant claims"),e.schemaVersion!=null&&e.schemaVersion!==f)throw new o("unsupported tenant context schema version","unsupported-version");let r=O(e.tenantId,"tenantId");if(R(e.actor,new Set(["schemaVersion","actorId","actorType","authSource","roles"]),"actor claims"),e.actor.schemaVersion!=null&&e.actor.schemaVersion!==p)throw new o("unsupported actor identity schema version","unsupported-version");let a=C(t);if(e.actor.roles!==void 0){let w;try{w=C(e.actor.roles,"claimed roles")}catch{throw new o("claimed roles do not match the trusted assignment","forged-role")}if(!Y(w,a))throw new o("claimed roles do not match the trusted assignment","forged-role")}if(e.localCompatibility!==void 0&&e.localCompatibility!==n)throw new o("local compatibility may only be set by the trusted boundary","forged-local-compatibility");let c=String(e.actor.actorType??"").trim(),d=String(e.actor.authSource??"").trim();if(!D.has(c))throw new o("actorType is invalid");if(!k.has(d))throw new o("authSource is invalid");let i=E({schemaVersion:f,tenantId:r,actor:{schemaVersion:p,actorId:O(e.actor.actorId,"actorId"),actorType:c,authSource:d,roles:a},localCompatibility:n===!0});return V.add(i),i}function Z(e,t){let n=O(e,"tenantId"),r=O(t,"workflowId");if(n.includes(":")||r.includes(":"))throw new o("stream key parts must not contain ':'","invalid-stream-key");return`${n}:${r}`}function te(e,t){return v(e),Z(e.tenantId,t)}function ne(e,{assignedRoles:t,localCompatibility:n=!1}={}){let r=e?.headers,a=typeof r?.get=="function"?d=>r.get(d):d=>r?.[d]??r?.[String(d).toLowerCase()];a?.("x-oracle-tenant-id"),a?.("x-oracle-tenant"),a?.("x-oracle-role"),a?.("x-oracle-roles");let c=e?.stamped??e?.claims??{};return $({schemaVersion:c.schemaVersion??f,tenantId:c.tenantId,actor:{schemaVersion:c.actor?.schemaVersion??p,actorId:c.actor?.actorId,actorType:c.actor?.actorType,authSource:c.actor?.authSource,roles:void 0},localCompatibility:void 0},{assignedRoles:t,localCompatibility:n})}function re({authSource:e="local-owner"}={}){if(!new Set(["local-owner","desktop-session","owner-arm-token"]).has(e))throw new o("local owner authSource is invalid");return $({schemaVersion:f,tenantId:H,actor:{schemaVersion:p,actorId:W,actorType:"local-owner",authSource:e}},{assignedRoles:["owner"],localCompatibility:!0})}function u(e){return V.has(e)&&J(e)}function v(e){if(!u(e))throw new o("a resolved tenant context is required","unresolved-context");return e}function h(e){return Buffer.from(e,"utf8").toString("base64url")}function _(e,t){if(!e||!/^[A-Za-z0-9_-]+$/.test(e))throw new o(`${t} binding is invalid`,"invalid-object-binding");let n=Buffer.from(e,"base64url").toString("utf8");if(!n||h(n)!==e)throw new o(`${t} binding is non-canonical`,"invalid-object-binding");return n}function z(e){let t=String(e??"").trim();if(!t||t.length>256||/[\u0000-\u001f\u007f]/.test(t))throw new o("objectId is invalid","invalid-object-id");return t}function oe(e,t,n){v(e);let r=String(t??"").trim();if(!A.has(r))throw new o("resource is unknown","unknown-resource");let a=z(n);return`${x}.${h(e.tenantId)}.${h(r)}.${h(a)}`}function G(e){let t=String(e??""),n=t.split(".");if(n.length!==4||n[0]!==x)throw new o("tenant-bound object id required","unbound-object");let r=_(n[1],"tenant"),a=_(n[2],"resource"),c=_(n[3],"object");if(!m.test(r)||!A.has(a))throw new o("tenant-bound object id is invalid","invalid-object-binding");return z(c),E({schemaVersion:1,tenantId:r,resource:a,objectId:c,boundId:t})}function P(e){if(typeof e!="string"||!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(e))return null;let t=Date.parse(e);return Number.isFinite(t)&&new Date(t).toISOString()===e?e:null}function T(e){let t={...e,decisionId:S(e)};return E(t)}function Q({context:e,resource:t,action:n,objectId:r=null,decidedAt:a}={}){let c=P(a),d={schemaVersion:b,recordType:"tenant.access-decision",decidedAt:c,tenantId:u(e)?e.tenantId:null,actor:u(e)?{actorId:e.actor.actorId,actorType:e.actor.actorType,authSource:e.actor.authSource,roles:[...e.actor.roles]}:null,request:{resource:typeof t=="string"?t:null,action:typeof n=="string"?n:null,objectRefHash:r==null?null:S(String(r))}},i=l=>T({...d,allowed:!1,outcome:"deny",reason:l});if(e==null)return i(s.DENY_MISSING_CONTEXT);if(!u(e))return i(s.DENY_INVALID_CONTEXT);if(!c)return i(s.DENY_INVALID_REQUEST);if(!A.has(t))return i(s.DENY_UNKNOWN_RESOURCE);if(!X.has(n))return i(s.DENY_UNKNOWN_ACTION);if(r!=null){let l;try{l=G(r)}catch{return i(s.DENY_UNBOUND_OBJECT)}if(l.tenantId!==e.tenantId)return i(s.DENY_TENANT_MISMATCH);if(l.resource!==t)return i(s.DENY_RESOURCE_MISMATCH)}if(n===g.approve&&!e.actor.roles.some(U=>F.includes(U)))return i(s.DENY_ROLE_PERMISSION);let w=`${t}:${n}`,y=e.actor.roles.some(l=>L[l]?.includes(w));return T({...d,allowed:y,outcome:y?"allow":"deny",reason:y?s.ALLOW_ROLE_PERMISSION:s.DENY_ROLE_PERMISSION})}function ae(e={}){let t=P(e.decidedAt),n=e.context,r=e.resource??"workflow",a=e.objectId??null;return T({schemaVersion:b,recordType:"tenant.access-decision",decidedAt:t,tenantId:u(n)?n.tenantId:null,actor:u(n)?{actorId:n.actor.actorId,actorType:n.actor.actorType,authSource:n.actor.authSource,roles:[...n.actor.roles]}:null,request:{resource:typeof r=="string"?r:null,action:g.approve,objectRefHash:a==null?null:S(String(a))},allowed:!1,outcome:"deny",reason:s.DENY_POLICY_NOT_APPROVER})}function ce(e){let t=Q(e);if(!t.allowed){let n=new o(`tenant access denied: ${t.reason}`,"access-denied");throw n.decision=t,n}return t}function ie(e){if(!N(e)||e.schemaVersion!==b||e.recordType!=="tenant.access-decision"||!Object.isFrozen(e))return!1;let{decisionId:t,...n}=e;return typeof t=="string"&&t===S(n)&&typeof e.allowed=="boolean"&&["allow","deny"].includes(e.outcome)}export{p as ACTOR_IDENTITY_VERSION,W as LOCAL_OWNER_ACTOR_ID,H as LOCAL_OWNER_TENANT_ID,b as TENANT_ACCESS_DECISION_VERSION,g as TENANT_ACTIONS,F as TENANT_APPROVER_ROLES,f as TENANT_CONTEXT_VERSION,s as TENANT_DECISION_REASONS,K as TENANT_RESOURCES,B as TENANT_ROLES,ee as TENANT_ROLE_PERMISSIONS,o as TenantContextError,v as assertResolvedTenantContext,oe as bindTenantObjectId,Z as canonicalTenantStreamKey,re as createLocalOwnerTenantContext,ae as decidePolicyApproval,Q as decideTenantAccess,u as isResolvedTenantContext,ie as isTenantAuditDecision,G as parseTenantObjectId,ce as requireTenantAccess,ne as resolveDispatcherStampedTenantContext,$ as resolveTenantContext,te as tenantStreamKeyFromContext};
@@ -0,0 +1 @@
1
+ import{createHash as ee,randomBytes as te}from"node:crypto";var X=Object.freeze(["owner","operator","agent","viewer"]),J=Object.freeze(["tenant","config","policy","grant","workflow","trade","receipt","audit","telemetry"]),G=Object.freeze({read:"read",create:"create",update:"update",delete:"delete",manage:"manage",prepare:"prepare",cancel:"cancel",export:"export",approve:"approve"}),Oe=Object.freeze(["owner"]),be=Object.freeze({ALLOW_ROLE_PERMISSION:"allow.role_permission",DENY_MISSING_CONTEXT:"deny.missing_context",DENY_INVALID_CONTEXT:"deny.invalid_context",DENY_INVALID_REQUEST:"deny.invalid_request",DENY_UNKNOWN_RESOURCE:"deny.unknown_resource",DENY_UNKNOWN_ACTION:"deny.unknown_action",DENY_UNBOUND_OBJECT:"deny.unbound_object",DENY_TENANT_MISMATCH:"deny.tenant_mismatch",DENY_RESOURCE_MISMATCH:"deny.resource_mismatch",DENY_ROLE_PERMISSION:"deny.role_permission",DENY_POLICY_NOT_APPROVER:"deny.policy_not_approver"}),Te=new Set(X),Ee=new Set(J),_e=new Set(Object.values(G));var q=/^[A-Za-z0-9][A-Za-z0-9._:@-]{0,127}$/;var Q=Object.freeze({owner:Object.freeze(["tenant:read","tenant:manage","config:read","config:manage","policy:read","policy:manage","grant:read","grant:create","grant:update","grant:delete","grant:manage","workflow:read","workflow:create","workflow:update","workflow:delete","workflow:cancel","workflow:approve","trade:read","trade:prepare","receipt:read","receipt:export","audit:read","audit:export","telemetry:read","telemetry:create","telemetry:export"]),operator:Object.freeze(["tenant:read","config:read","policy:read","grant:read","workflow:read","workflow:create","workflow:update","workflow:cancel","trade:read","trade:prepare","receipt:read","audit:read","telemetry:read","telemetry:create"]),agent:Object.freeze(["tenant:read","config:read","policy:read","grant:read","workflow:read","workflow:create","workflow:update","trade:read","trade:prepare","receipt:read","telemetry:create"]),viewer:Object.freeze(["tenant:read","config:read","grant:read","workflow:read","trade:read","receipt:read","audit:read","telemetry:read"])}),Ae=Object.freeze(Object.fromEntries(Object.entries(Q).map(([e,t])=>[e,Object.freeze([...t])]))),h=class extends Error{constructor(t,n="invalid-context"){super(t),this.name="TenantContextError",this.code=n}};function k(e,t){let n=String(e??"").trim();if(!q.test(n))throw new h(`${t} is invalid`);return n}function C(e,t){let n=k(e,"tenantId"),r=k(t,"workflowId");if(n.includes(":")||r.includes(":"))throw new h("stream key parts must not contain ':'","invalid-stream-key");return`${n}:${r}`}var L=1,$=1,ne=Object.freeze(["succeeded","denied","invalid","failed","cancelled","timed_out","unavailable","skipped"]),re=Object.freeze(["workflow","task","intent","plan","run","event","eval"]),S=Object.freeze(["taskId","intentId","planId","runId","eventId"]);function I(e,t){return C(e,t)}var p=Object.freeze({maxAttributes:24,maxKeyLength:48,maxStringLength:256,maxArrayLength:8}),D=new Set(ne),oe=new Set(re),ae=new Set(S),ie=/^[0-9a-f]{32}$/,j=/^[0-9a-f]{16}$/,se=/^[0-9a-f]{64}$/,v=new WeakSet,ce=/^[A-Za-z0-9][A-Za-z0-9._:/-]{0,95}$/,V=/^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,127}$/,de=/^[A-Za-z][A-Za-z0-9_.-]*$/,le=Object.freeze(["authorization","bearer","cookie","credential","password","passphrase","secret","token","privatekey","privkey","seed","mnemonic","keystore","signature","prompt","systemmessage","usermessage","assistantmessage","rawtransaction","signedtransaction","serializedtransaction","transactionbytes","calldata","callbytes","inputdata"]),ue=/(?:^|\s)Bearer\s+\S+|-----BEGIN [A-Z ]*PRIVATE KEY-----|\bxprv[0-9A-Za-z]{20,}\b|\bsk-[A-Za-z0-9_-]{16,}\b|[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{16,}/i,fe=/(?:0x)?[0-9a-fA-F]{66,}/,pe=/[A-Za-z0-9+/=_-]{96,}/,a=class extends Error{constructor(t,n="invalid-telemetry"){super(t),this.name="WorkflowTelemetryError",this.code=n}};function w(e){return!!e&&typeof e=="object"&&!Array.isArray(e)&&Object.getPrototypeOf(e)===Object.prototype}function u(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))u(t)}return e}function E(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(E).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${E(e[t])}`).join(",")}}`}function K(e){return ee("sha256").update(E(e)).digest("hex")}function R(e,t,n){let r=n?n(e,t):te(e).toString("hex");return String(r??"").trim().toLowerCase()}function O(e={}){if(e==null)return{};if(!w(e))throw new a("correlation must be a plain object");let t=Object.keys(e).filter(r=>!ae.has(r));if(t.length)throw new a(`unknown correlation fields: ${t.sort().join(", ")}`);let n={};for(let r of S){if(e[r]==null)continue;let o=String(e[r]).trim();if(!V.test(o))throw new a(`${r} is invalid`);n[r]=o}return n}function f(e){if(!w(e)||e.schemaVersion!==L)throw new a("trace context version is invalid","invalid-trace");if(!ie.test(e.traceId||"")||!j.test(e.spanId||"")||/^0+$/.test(e.traceId)||/^0+$/.test(e.spanId))throw new a("trace or span id is invalid","invalid-trace");if(e.parentSpanId!==null&&!j.test(e.parentSpanId||""))throw new a("parent span id is invalid","invalid-trace");if(typeof e.sampled!="boolean")throw new a("sampled must be boolean","invalid-trace");return O(e.correlation),e}function _({traceId:e,spanId:t,parentSpanId:n=null,sampled:r=!1,correlation:o={}}={},{idFactory:s}={}){let i=e==null?R(16,"trace",s):String(e).trim().toLowerCase(),c=t==null?R(8,"span",s):String(t).trim().toLowerCase(),l=n==null?null:String(n).trim().toLowerCase(),d=u({schemaVersion:L,traceId:i,spanId:c,parentSpanId:l,sampled:r===!0,correlation:O(o)});return f(d)}var je=_;function Re(e,{spanId:t,correlation:n={}}={},{idFactory:r}={}){f(e);let o=O(n),s={...e.correlation};for(let[i,c]of Object.entries(o)){if(s[i]!=null&&s[i]!==c)throw new a(`correlation ${i} cannot change inside a trace`,"correlation-conflict");s[i]=c}return _({traceId:e.traceId,spanId:t,parentSpanId:e.spanId,sampled:e.sampled,correlation:s},{idFactory:r})}function we(e){return f(e),`00-${e.traceId}-${e.spanId}-${e.sampled?"01":"00"}`}function me(e,{correlation:t={}}={}){let n=/^00-([0-9a-f]{32})-([0-9a-f]{16})-(0[01])$/.exec(String(e??"").trim().toLowerCase());if(!n||/^0+$/.test(n[1])||/^0+$/.test(n[2]))throw new a("traceparent is invalid","invalid-traceparent");return _({traceId:n[1],spanId:n[2],sampled:n[3]==="01",correlation:t})}var Y=Object.freeze({taskId:"x-oracle-task-id",intentId:"x-oracle-intent-id",planId:"x-oracle-plan-id",runId:"x-oracle-run-id",eventId:"x-oracle-event-id"});function x(e,t){if(e?.get&&typeof e.get=="function")return e.get(t);if(!e||typeof e!="object")return null;let n=t.toLowerCase();for(let[r,o]of Object.entries(e))if(r.toLowerCase()===n)return o;return null}function xe(e,t={}){f(e);let n={};n.traceparent=we(e);for(let[r,o]of Object.entries(Y))e.correlation[r]!=null&&(n[o]=e.correlation[r]);return u(n)}function ze(e){let t={};for(let[n,r]of Object.entries(Y)){let o=x(e,r);o!=null&&String(o).trim()&&(t[n]=String(o).trim())}return me(x(e,"traceparent"),{correlation:t})}function z(e){let t=String(e).replace(/[^a-z0-9]/gi,"").toLowerCase();return le.some(n=>t.includes(n))}function ye(e){return ue.test(e)||fe.test(e)||pe.test(e)?{value:"[REDACTED]",redacted:!0,truncated:!1}:e.length>p.maxStringLength?{value:`${e.slice(0,p.maxStringLength-1)}\u2026`,redacted:!1,truncated:!0}:{value:e,redacted:!1,truncated:!1}}function P(e){if(typeof e=="string")return ye(e);if(typeof e=="boolean")return{value:e,redacted:!1,truncated:!1};if(typeof e=="number"&&Number.isFinite(e))return{value:e,redacted:!1,truncated:!1};if(Array.isArray(e)){let t=e.slice(0,p.maxArrayLength),n=[],r=!1,o=e.length>t.length;for(let s of t){if(!["string","boolean","number"].includes(typeof s))return null;let i=P(s);if(!i)return null;n.push(i.value),r||=i.redacted,o||=i.truncated}return{value:n,redacted:r,truncated:o}}return null}function he(e={}){if(!w(e))throw new a("telemetry attributes must be a plain object");let t={},n=0,r=0,o=0,s=Object.keys(e).sort();for(let i of s){if(Object.keys(t).length>=p.maxAttributes){r+=1;continue}if(i.length>p.maxKeyLength||!de.test(i)||z(i)){r+=1,z(i)&&(n+=1);continue}let c=P(e[i]);if(!c){r+=1;continue}t[i]=c.value,c.redacted&&(n+=1),c.truncated&&(o+=1)}return u({attributes:t,redactedCount:n,droppedCount:r,truncatedCount:o})}function g(e,t){if(!Number.isSafeInteger(e)||e<0)throw new a(`${t} must be a non-negative integer milliseconds value`);return e}function M(e){if(e==null)return null;let t=String(e).trim();if(!/^[a-z0-9][a-z0-9._-]{0,63}$/.test(t))throw new a("outcomeCode is invalid");return t}function Ie({streamKey:e,tenantId:t,workflowId:n,sourceEvent:r}){let o=e??r?.streamKey??null,s=t??r?.tenantId??null,i=n??r?.workflowId??null;if(o!=null){let c=String(o).trim();if(s!=null&&i!=null){let l=I(s,i);if(c!==l)throw new a("streamKey must equal tenantId:workflowId","invalid-stream-key");return l}if(!/^[A-Za-z0-9][A-Za-z0-9._:@-]{0,127}:[A-Za-z0-9][A-Za-z0-9._:@-]{0,127}$/.test(c)||c.split(":").length!==2)throw new a("streamKey must be tenantId:workflowId","invalid-stream-key");return c}return s!=null&&i!=null?I(s,i):null}function U({trace:e,name:t,kind:n,diagnosticOutcome:r=null,outcome:o=null,outcomeCode:s=null,startedAt:i,endedAt:c,attributes:l,authority:d,sourceEvent:m=null,streamKey:F=null,tenantId:W=null,workflowId:Z=null}){f(e);let A=String(t??"").trim();if(!ce.test(A))throw new a("workflow telemetry name is invalid");if(!oe.has(n))throw new a("workflow telemetry kind is invalid");let H=d==="ledger_projection"?o:r;if(!D.has(H))throw new a("workflow telemetry outcome is invalid");let b=g(i,"startedAt"),T=g(c,"endedAt");if(T<b)throw new a("endedAt must not be before startedAt");let y=he(l),B=Ie({streamKey:F,tenantId:W,workflowId:Z,sourceEvent:m}),N={schemaVersion:$,recordType:"oracle.workflow.telemetry",authority:d,streamKey:B,trace:{traceId:e.traceId,spanId:e.spanId,parentSpanId:e.parentSpanId,sampled:e.sampled},correlation:{...e.correlation},name:A,kind:n,...d==="ledger_projection"?{outcome:o,sourceEvent:{...m}}:{diagnosticOutcome:r},outcomeCode:M(s),startedAt:b,endedAt:T,durationMs:T-b,attributes:{...y.attributes},attributePolicy:{redactedCount:y.redactedCount,droppedCount:y.droppedCount,truncatedCount:y.truncatedCount}};return u({...N,recordId:K(N)})}function ge({trace:e,name:t,kind:n="workflow",outcome:r,outcomeCode:o=null,startedAt:s,endedAt:i,attributes:c={},tenantId:l=null,workflowId:d=null,streamKey:m=null}={}){return U({trace:e,name:t,kind:n,diagnosticOutcome:r,outcomeCode:o,startedAt:s,endedAt:i,attributes:c,authority:"diagnostic",tenantId:l,workflowId:d,streamKey:m})}function Le(e,{validateLedgerEvent:t}={}){if(!w(e))throw new a("ledger event must be a plain object","invalid-ledger-event");if(typeof t!="function"||t(e)!==!0)throw new a("ledger event validation failed","invalid-ledger-event");let n=String(e.eventId??"").trim(),r=String(e.eventHash??e.hash??"").trim().toLowerCase();if(!V.test(n)||!se.test(r))throw new a("ledger event id or hash is invalid","invalid-ledger-event");let o=O(e.correlation);for(let d of S)if(o[d]==null)throw new a(`ledger event correlation requires ${d}`,"invalid-ledger-event");if(o.eventId!==n)throw new a("ledger eventId does not match correlation","invalid-ledger-event");if(!D.has(e.outcome))throw new a("ledger event outcome is invalid","invalid-ledger-event");let s=e.tenantId==null?null:String(e.tenantId).trim(),i=e.workflowId==null?null:String(e.workflowId).trim(),c=null;if(s&&i){if(c=I(s,i),e.streamKey!=null&&String(e.streamKey).trim()!==c)throw new a("ledger streamKey must equal tenantId:workflowId","invalid-stream-key")}else if(e.streamKey!=null){let d=String(e.streamKey).split(":");if(d.length!==2)throw new a("ledger streamKey must be tenantId:workflowId","invalid-stream-key");c=I(d[0],d[1])}let l=u({eventId:n,eventHash:r,correlation:o,outcome:e.outcome,outcomeCode:M(e.outcomeCode),startedAt:g(e.startedAt,"ledger event startedAt"),endedAt:g(e.endedAt,"ledger event endedAt"),tenantId:s,workflowId:i,streamKey:c});if(l.endedAt<l.startedAt)throw new a("ledger event endedAt must not be before startedAt","invalid-ledger-event");return v.add(l),l}function $e({sourceEvent:e,trace:t,name:n,kind:r="workflow",attributes:o={}}={}){if(!v.has(e))throw new a("a validated ledger source event is required","unvalidated-ledger-event");f(t);for(let s of S)if(t.correlation[s]!==e.correlation[s])throw new a(`trace correlation ${s} does not match ledger event`,"ledger-correlation-mismatch");return U({trace:t,name:n,kind:r,outcome:e.outcome,outcomeCode:e.outcomeCode,startedAt:e.startedAt,endedAt:e.endedAt,attributes:o,authority:"ledger_projection",sourceEvent:{eventId:e.eventId,eventHash:e.eventHash},tenantId:e.tenantId,workflowId:e.workflowId,streamKey:e.streamKey})}function Se(e){if(!w(e)||!Object.isFrozen(e)||e.schemaVersion!==$||e.recordType!=="oracle.workflow.telemetry")return!1;let{recordId:t,...n}=e;return typeof t=="string"&&t===K(n)}function De({exporter:e=null}={}){if(e!=null&&typeof e!="function"&&typeof e?.export!="function")throw new a("exporter must be a function or expose export(record)");let t=typeof e=="function"?e:e?.export?.bind(e);return Object.freeze({exporterConfigured:!!t,defaultExporter:"none",async emit(n){let r=Se(n)?n:ge(n);if(!t)return Object.freeze({record:r,exported:!1,exporterFailed:!1});try{return await t(r),Object.freeze({record:r,exported:!0,exporterFailed:!1})}catch{return Object.freeze({record:r,exported:!1,exporterFailed:!0})}}})}export{S as CORRELATION_KEYS,p as TELEMETRY_ATTRIBUTE_LIMITS,L as TRACE_CONTEXT_VERSION,re as WORKFLOW_KINDS,ne as WORKFLOW_OUTCOMES,$ as WORKFLOW_TELEMETRY_VERSION,a as WorkflowTelemetryError,Re as createChildTraceContext,je as createRootTraceContext,_ as createTraceContext,De as createWorkflowTelemetry,ge as createWorkflowTelemetryRecord,ze as extractTraceContext,we as formatTraceparent,xe as injectTraceContext,Se as isWorkflowTelemetryRecord,me as parseTraceparent,$e as projectWorkflowTelemetryFromLedgerEvent,he as sanitizeTelemetryAttributes,Le as validateWorkflowTelemetrySourceEvent,I as workflowTelemetryStreamKey};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oracle-agent/oracle",
3
- "version": "0.28.28",
3
+ "version": "0.28.30",
4
4
  "description": "Oracle: standalone multichain agent control plane with an optional encrypted, loopback-only self-hosted signer.",
5
5
  "license": "BUSL-1.1",
6
6
  "type": "module",
@@ -46,6 +46,7 @@
46
46
  },
47
47
  "exports": {
48
48
  ".": "./dist/index.mjs",
49
+ "./task": "./dist/task.mjs",
49
50
  "./farming": "./dist/data/providers/farming.mjs",
50
51
  "./data": "./dist/data/desk-data.mjs",
51
52
  "./policy": "./dist/public-control/policy-schema.mjs",
@@ -65,20 +66,34 @@
65
66
  "./universal-solana-nft-transfer": "./dist/data/providers/universal-solana-nft-transfer.mjs",
66
67
  "./universal-ordinals-transfer": "./dist/data/providers/universal-ordinals-transfer.mjs",
67
68
  "./prepare-envelope": "./dist/prepare-envelope.mjs",
69
+ "./approval-binding": "./dist/control/approval-binding.mjs",
68
70
  "./connect": "./dist/onboarding/harness-configs.mjs",
71
+ "./finality": "./dist/control/finality.mjs",
69
72
  "./receipts": "./dist/action-receipts.mjs",
73
+ "./tax-lots": "./dist/tax-lots.mjs",
74
+ "./position-health": "./dist/position-health.mjs",
75
+ "./governance-prepare": "./dist/governance-prepare.mjs",
70
76
  "./risk": "./dist/portfolio-risk.mjs",
77
+ "./safety-intelligence": "./dist/safety-intelligence.mjs",
71
78
  "./watch": "./dist/watch-preferences.mjs",
72
79
  "./signals": "./dist/signals/index.mjs",
73
80
  "./strategy": "./dist/strategy/index.mjs",
74
81
  "./agent-grants": "./dist/public-api/agent-grants.mjs",
75
- "./local-signer": "./dist/local-signer/index.mjs"
82
+ "./control-plane": "./dist/control-plane/index.mjs",
83
+ "./tenant-rbac": "./dist/tenant-rbac.mjs",
84
+ "./workflow-telemetry": "./dist/workflow-telemetry.mjs",
85
+ "./local-signer": "./dist/local-signer/index.mjs",
86
+ "./local-marketplace": "./dist/local-marketplace.mjs",
87
+ "./local-x402": "./dist/local-x402.mjs",
88
+ "./local-pack-registry": "./dist/local-pack-registry.mjs",
89
+ "./notifications": "./dist/notifications/index.mjs"
76
90
  },
77
91
  "dependencies": {
78
92
  "@msgpack/msgpack": "^3.1.3",
79
93
  "@noble/curves": "^2.2.0",
80
94
  "@noble/hashes": "^2.3.0",
81
95
  "@scure/base": "^2.2.0",
96
+ "@scure/bip39": "^1.6.0",
82
97
  "@scure/btc-signer": "2.3.0",
83
98
  "@solana/addresses": "^7.0.0",
84
99
  "@solana/transaction-messages": "7.0.0",
@@ -13,7 +13,7 @@
13
13
  <a class="wordmark" href="/">ORACLE</a>
14
14
  <p class="eyebrow">AGENT CONNECT</p>
15
15
  <h1>Give your agent market context.<br /><span>Keep custody local.</span></h1>
16
- <p class="lede">Use Oracle's native harness, or connect a read-only Oracle MCP into the agent you already run. The model proposes actions; you review and authorize them through your local operator.</p>
16
+ <p class="lede">Use Oracle's native harness, or connect Oracle MCP into the agent you already run. Skills, quotes, swap cards, and prepare land in Claude or Codex. The model proposes actions; you review and authorize them through your local operator.</p>
17
17
  </header>
18
18
 
19
19
  <section class="card setup" aria-labelledby="connection-title">
@@ -74,7 +74,7 @@
74
74
  <div>
75
75
  <p class="eyebrow">SEPARATE EXECUTION LANE</p>
76
76
  <h2 id="operator-title">Install the local operator to execute</h2>
77
- <p>The cloud/read MCP can research, quote, simulate, and prepare. Execution belongs in a separate local process under your policy and approval controls.</p>
77
+ <p>The cloud/read MCP can research, quote, simulate, prepare, and load Oracle skills. Execution belongs in a separate local process under your policy and approval controls. Self-host: start the local signer, then MCP queue/ack fills the prepared artifact.</p>
78
78
  <div class="command"><code>npx @oracle-agent/oracle init</code><button id="copy-install" type="button">Copy</button></div>
79
79
  </div>
80
80
  </section>
package/public/install.sh CHANGED
@@ -275,8 +275,8 @@ EOF
275
275
  local oracle_bin=""
276
276
  if [ -x "$PKG_DIR/node_modules/.bin/oracle" ]; then
277
277
  oracle_bin="$PKG_DIR/node_modules/.bin/oracle"
278
- elif [ -f "$PKG_DIR/node_modules/@oracle-agent/oracle/bin/oracle.mjs" ]; then
279
- oracle_bin="$PKG_DIR/node_modules/@oracle-agent/oracle/bin/oracle.mjs"
278
+ elif [ -f "$PKG_DIR/node_modules/@oracle-agent/oracle/dist/bin/oracle.mjs" ]; then
279
+ oracle_bin="$PKG_DIR/node_modules/@oracle-agent/oracle/dist/bin/oracle.mjs"
280
280
  else
281
281
  die "install finished but oracle binary missing under $PKG_DIR"
282
282
  fi
@@ -1555,7 +1555,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1555
1555
  <div class="selfcustody rv">
1556
1556
  <p class="section-label rv">Works in any harness</p>
1557
1557
  <h2 class="section-title rv" data-split>Ask in <em>your</em> agent.</h2>
1558
- <p class="section-lede rv">Oracle installs as an MCP server, so the agent you already use gets 110 protocol entries across 13 chains. Type the request the way you would say it. Oracle reads state, prices routes and prepares the transaction. You sign.</p>
1558
+ <p class="section-lede rv">Oracle installs as an MCP server, so Claude, Codex, Cursor and the rest get Oracle skills, live swap cards, quotes, and prepare. Type the request the way you would say it. With <code>oracle signer</code> running on this machine they can also fill through the local signer — same path as Telegram Allow. Keys stay here. You authorize.</p>
1559
1559
  <div class="agent-install rv">
1560
1560
  <span>Add Oracle to your agent:</span>
1561
1561
  <div class="install-cmds">
@@ -1614,7 +1614,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1614
1614
  <noscript><p class="agent-ask">move 5k usdc into weth, cheapest route</p></noscript>
1615
1615
  </figure>
1616
1616
  </div>
1617
- <p class="agent-caption rv">Same tool from the terminal, the desktop app, any MCP client, or your agent on Telegram, Discord, WhatsApp and Signal. Buzz integration shipped. Hosted/keyless cannot hold keys. Self-host execution runs through the local signer.</p>
1617
+ <p class="agent-caption rv">Same tool from the terminal, the desktop app, any MCP client, or your agent on Telegram, Discord, WhatsApp and Signal. Buzz integration shipped. Hosted/keyless cannot hold keys. Self-host fill is MCP <code>signer_queue</code> then <code>signer_ack</code> on the local signer.</p>
1618
1618
  <div class="agent-icons rv" style="display:flex;flex-wrap:wrap;gap:10px;justify-content:center;margin-top:14px"><span style="display:inline-flex;align-items:center;gap:5px;padding:4px 10px;border:1px solid var(--line);border-radius:999px;font-family:var(--mono);font-size:10px;color:var(--cool);letter-spacing:.08em"><svg width="14" height="14" viewBox="0 0 24 24" fill="none"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm4.64 6.8c-.15 1.58-.8 5.42-1.13 7.19-.14.75-.42 1-.68 1.03-.58.05-1.02-.38-1.58-.75-.88-.58-1.38-.94-2.23-1.5-.99-.65-.35-1.01.22-1.59.15-.15 2.71-2.48 2.76-2.69.01-.03.01-.14-.07-.2-.08-.06-.19-.04-.27-.02-.12.03-1.96 1.25-5.54 3.66-.52.36-1 .53-1.42.52-.47-.01-1.37-.26-2.03-.48-.82-.27-1.47-.42-1.41-.87.03-.24.36-.49.99-.74 3.87-1.69 6.45-2.8 7.74-3.34 3.69-1.53 4.45-1.8 4.95-1.81.11 0 .36.03.52.17.14.12.18.28.2.4.02.11.04.37.01.56z" fill="#229ED9"/></svg>Telegram</span><span style="display:inline-flex;align-items:center;gap:5px;padding:4px 10px;border:1px solid var(--line);border-radius:999px;font-family:var(--mono);font-size:10px;color:var(--cool);letter-spacing:.08em"><svg width="14" height="14" viewBox="0 0 24 24" fill="none"><path d="M19.27 5.33C17.94 4.71 14.48 3.26 10.68 4.77a27.98 27.98 0 0 0-6.02 3.13c-.87.51-1.3.9-1.23 1.44.07.46.57.73 1.42 1.12l.33.15c.85.38 1.28.57 1.43 1.01.08.23.07.6-.08 1.1-.15.51-.5 1.15-1.02 2.02-.34.57-.5.85-.37.99.14.15.48.11 1.09-.26 1.76-1.07 3.18-1.93 4.23-2.59 3.22-2.06 5.08-2.82 5.55-2.28.18.21.06.84-.34 1.85-.39 1.01-1.05 2.32-1.51 3.13-.24.43-.37.64-.45.74-.11.14-.2.16-.3.15-.3-.03-.73-.45-1.41-1.3-.5-.62-.94-1.08-1.26-1.25-.64-.34-1.08-.13-1.14.26-.05.29.14.61.56 1.02.43.41 1.15 1.06 1.56 1.5.53.58.82.98.85 1.28.02.24-.04.47-.46.75-.42.27-.86.41-1.34.41-.41 0-.86-.1-1.35-.29-1.7-.68-3.25-1.94-4.64-3.79a18.7 18.7 0 0 1-3.13-5.08c-.38-.79-.16-1.31.41-1.63.47-.27 1.12-.22 1.96.14a10.26 10.26 0 0 1 3.74 2.28c.36.35.68.52.96.52.21 0 .44-.07.69-.22.37-.22.65-.6.86-1.13.21-.53.34-1.14.34-1.57 0-.5-.15-.88-.45-1.12-.52-.42-1.44-.52-2.76-.3-1.71.28-3.62 1.03-5.72 2.24l-.86.49a6.72 6.72 0 0 1-1.02.51c-.37.14-.64.17-.81.09-.18-.1-.24-.29-.2-.58.04-.3.16-.56.36-.76z" fill="#5865F2"/></svg>Discord</span><span style="display:inline-flex;align-items:center;gap:5px;padding:4px 10px;border:1px solid var(--line);border-radius:999px;font-family:var(--mono);font-size:10px;color:var(--cool);letter-spacing:.08em"><svg width="14" height="14" viewBox="0 0 24 24" fill="none"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403-.008-.005h.008l.005-.002h-.005V19.5c0-.248.009-.498.005-.746l.003-.003c.009 0 .018.001.027.002h-.02l-.011.008-.004.024zm-.006-.225h-.003l-.008.003.003.011.003-.005a.018.018 0 0 1 .005-.009zm-.004.17h.003l-.005-.002.002.001v.001zm.02-.003.003.003-.002-.002-.001-.001zM12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0z" fill="#25D366"/></svg>WhatsApp</span><span style="display:inline-flex;align-items:center;gap:5px;padding:4px 10px;border:1px solid var(--line);border-radius:999px;font-family:var(--mono);font-size:10px;color:var(--cool);letter-spacing:.08em"><svg width="14" height="14" viewBox="0 0 24 24" fill="none"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM7.64 15.52c-.38-.66-.6-1.41-.6-2.2 0-2.63 2.14-4.77 4.77-4.77 1.27 0 2.47.5 3.37 1.4.9.9 1.4 2.1 1.4 3.37 0 2.63-2.14 4.77-4.77 4.77-.79 0-1.54-.22-2.2-.6L7.5 18l.14-2.48z" fill="#3B82F6"/></svg>Signal</span><span style="display:inline-flex;align-items:center;gap:5px;padding:4px 10px;border:1px solid var(--line);border-radius:999px;font-family:var(--mono);font-size:10px;color:var(--cool);letter-spacing:.08em"><svg width="14" height="14" viewBox="0 0 24 24" fill="none"><path d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5" stroke="#7C4DFF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>Buzz</span></div>
1619
1619
  <div class="venues rv">
1620
1620
  <div class="venues-head"><span>models // harnesses</span><span><b>bring your own model</b> · oracle is the control plane</span></div>
@@ -275,8 +275,8 @@ EOF
275
275
  local oracle_bin=""
276
276
  if [ -x "$PKG_DIR/node_modules/.bin/oracle" ]; then
277
277
  oracle_bin="$PKG_DIR/node_modules/.bin/oracle"
278
- elif [ -f "$PKG_DIR/node_modules/@oracle-agent/oracle/bin/oracle.mjs" ]; then
279
- oracle_bin="$PKG_DIR/node_modules/@oracle-agent/oracle/bin/oracle.mjs"
278
+ elif [ -f "$PKG_DIR/node_modules/@oracle-agent/oracle/dist/bin/oracle.mjs" ]; then
279
+ oracle_bin="$PKG_DIR/node_modules/@oracle-agent/oracle/dist/bin/oracle.mjs"
280
280
  else
281
281
  die "install finished but oracle binary missing under $PKG_DIR"
282
282
  fi