veto-sdk 2.2.1 → 2.4.0

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 (132) hide show
  1. package/README.md +933 -57
  2. package/dist/admin/client.d.ts +93 -0
  3. package/dist/admin/client.d.ts.map +1 -0
  4. package/dist/admin/client.js +365 -0
  5. package/dist/admin/client.js.map +1 -0
  6. package/dist/admin/types.d.ts +206 -0
  7. package/dist/admin/types.d.ts.map +1 -0
  8. package/dist/admin/types.js +2 -0
  9. package/dist/admin/types.js.map +1 -0
  10. package/dist/audit/chain.d.ts +13 -0
  11. package/dist/audit/chain.d.ts.map +1 -0
  12. package/dist/audit/chain.js +32 -0
  13. package/dist/audit/chain.js.map +1 -0
  14. package/dist/browser/types.d.ts +1 -1
  15. package/dist/browser/types.d.ts.map +1 -1
  16. package/dist/browser/veto.d.ts.map +1 -1
  17. package/dist/browser/veto.js +24 -2
  18. package/dist/browser/veto.js.map +1 -1
  19. package/dist/cli/compile.d.ts.map +1 -1
  20. package/dist/cli/compile.js +6 -5
  21. package/dist/cli/compile.js.map +1 -1
  22. package/dist/cli/repl-generate.js +1 -1
  23. package/dist/cli/repl-generate.js.map +1 -1
  24. package/dist/cli/runner.d.ts.map +1 -1
  25. package/dist/cli/runner.js +129 -8
  26. package/dist/cli/runner.js.map +1 -1
  27. package/dist/cli/templates.d.ts +1 -1
  28. package/dist/cli/templates.d.ts.map +1 -1
  29. package/dist/cli/templates.js +1 -1
  30. package/dist/core/history.d.ts +14 -0
  31. package/dist/core/history.d.ts.map +1 -1
  32. package/dist/core/history.js +73 -13
  33. package/dist/core/history.js.map +1 -1
  34. package/dist/core/tool-pack-heuristics.d.ts.map +1 -1
  35. package/dist/core/tool-pack-heuristics.js +33 -0
  36. package/dist/core/tool-pack-heuristics.js.map +1 -1
  37. package/dist/core/validator.d.ts +4 -0
  38. package/dist/core/validator.d.ts.map +1 -1
  39. package/dist/core/validator.js +119 -97
  40. package/dist/core/validator.js.map +1 -1
  41. package/dist/core/veto.d.ts +53 -2
  42. package/dist/core/veto.d.ts.map +1 -1
  43. package/dist/core/veto.js +137 -7
  44. package/dist/core/veto.js.map +1 -1
  45. package/dist/custom/types.d.ts +1 -1
  46. package/dist/custom/types.d.ts.map +1 -1
  47. package/dist/deterministic/types.d.ts +2 -0
  48. package/dist/deterministic/types.d.ts.map +1 -1
  49. package/dist/index.d.ts +11 -1
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +9 -0
  52. package/dist/index.js.map +1 -1
  53. package/dist/integrations/langchain/middleware.d.ts +1 -1
  54. package/dist/integrations/langchain/middleware.js +1 -1
  55. package/dist/integrations/openclaw/hooks.d.ts +30 -0
  56. package/dist/integrations/openclaw/hooks.d.ts.map +1 -0
  57. package/dist/integrations/openclaw/hooks.js +130 -0
  58. package/dist/integrations/openclaw/hooks.js.map +1 -0
  59. package/dist/integrations/openclaw/index.d.ts +3 -0
  60. package/dist/integrations/openclaw/index.d.ts.map +1 -0
  61. package/dist/integrations/openclaw/index.js +2 -0
  62. package/dist/integrations/openclaw/index.js.map +1 -0
  63. package/dist/integrations/vercel-ai/middleware.d.ts +1 -1
  64. package/dist/integrations/vercel-ai/middleware.js +1 -1
  65. package/dist/observability/otel.d.ts +29 -0
  66. package/dist/observability/otel.d.ts.map +1 -0
  67. package/dist/observability/otel.js +43 -0
  68. package/dist/observability/otel.js.map +1 -0
  69. package/dist/proxy/anthropic-interceptor.d.ts +51 -0
  70. package/dist/proxy/anthropic-interceptor.d.ts.map +1 -0
  71. package/dist/proxy/anthropic-interceptor.js +132 -0
  72. package/dist/proxy/anthropic-interceptor.js.map +1 -0
  73. package/dist/proxy/interceptor.d.ts +55 -0
  74. package/dist/proxy/interceptor.d.ts.map +1 -0
  75. package/dist/proxy/interceptor.js +111 -0
  76. package/dist/proxy/interceptor.js.map +1 -0
  77. package/dist/proxy/server.d.ts +21 -0
  78. package/dist/proxy/server.d.ts.map +1 -0
  79. package/dist/proxy/server.js +545 -0
  80. package/dist/proxy/server.js.map +1 -0
  81. package/dist/proxy/types.d.ts +18 -0
  82. package/dist/proxy/types.d.ts.map +1 -0
  83. package/dist/proxy/types.js +7 -0
  84. package/dist/proxy/types.js.map +1 -0
  85. package/dist/rate-limiting/evaluator.d.ts +17 -0
  86. package/dist/rate-limiting/evaluator.d.ts.map +1 -0
  87. package/dist/rate-limiting/evaluator.js +48 -0
  88. package/dist/rate-limiting/evaluator.js.map +1 -0
  89. package/dist/rate-limiting/redis-store.d.ts +36 -0
  90. package/dist/rate-limiting/redis-store.d.ts.map +1 -0
  91. package/dist/rate-limiting/redis-store.js +68 -0
  92. package/dist/rate-limiting/redis-store.js.map +1 -0
  93. package/dist/rate-limiting/store.d.ts +8 -0
  94. package/dist/rate-limiting/store.d.ts.map +1 -0
  95. package/dist/rate-limiting/store.js +60 -0
  96. package/dist/rate-limiting/store.js.map +1 -0
  97. package/dist/rate-limiting/types.d.ts +9 -0
  98. package/dist/rate-limiting/types.d.ts.map +1 -0
  99. package/dist/rate-limiting/types.js +2 -0
  100. package/dist/rate-limiting/types.js.map +1 -0
  101. package/dist/rules/condition-evaluator.d.ts.map +1 -1
  102. package/dist/rules/condition-evaluator.js +29 -0
  103. package/dist/rules/condition-evaluator.js.map +1 -1
  104. package/dist/rules/loader.d.ts.map +1 -1
  105. package/dist/rules/loader.js +5 -0
  106. package/dist/rules/loader.js.map +1 -1
  107. package/dist/rules/local-evaluator.d.ts.map +1 -1
  108. package/dist/rules/local-evaluator.js +9 -1
  109. package/dist/rules/local-evaluator.js.map +1 -1
  110. package/dist/rules/policy-ir-schema.d.ts +145 -4
  111. package/dist/rules/policy-ir-schema.d.ts.map +1 -1
  112. package/dist/rules/policy-ir-schema.js +122 -3
  113. package/dist/rules/policy-ir-schema.js.map +1 -1
  114. package/dist/rules/policy-packs.d.ts.map +1 -1
  115. package/dist/rules/policy-packs.js +1 -0
  116. package/dist/rules/policy-packs.js.map +1 -1
  117. package/dist/rules/types.d.ts +29 -2
  118. package/dist/rules/types.d.ts.map +1 -1
  119. package/dist/rules/types.js.map +1 -1
  120. package/dist/testing/runner.d.ts +21 -0
  121. package/dist/testing/runner.d.ts.map +1 -0
  122. package/dist/testing/runner.js +239 -0
  123. package/dist/testing/runner.js.map +1 -0
  124. package/dist/testing/types.d.ts +39 -0
  125. package/dist/testing/types.d.ts.map +1 -0
  126. package/dist/testing/types.js +7 -0
  127. package/dist/testing/types.js.map +1 -0
  128. package/dist/types/config.d.ts +1 -0
  129. package/dist/types/config.d.ts.map +1 -1
  130. package/dist/types/config.js.map +1 -1
  131. package/package.json +24 -14
  132. package/packs/crypto-trading.yaml +320 -0
@@ -0,0 +1,320 @@
1
+ version: "1.0"
2
+ name: "@veto/crypto-trading"
3
+ description: >
4
+ Production-grade guardrails for AI trading agents. Covers crypto exchanges
5
+ (Binance, Bybit, OKX), prediction markets (Polymarket, Manifold), and
6
+ general financial instruments. Conservative defaults safe for first-timers.
7
+ One line to safe trading: extends: "@veto/crypto-trading"
8
+
9
+ rules:
10
+ # --- Layer 1: Read-only (always allow) ---
11
+ - id: crypto-allow-reads
12
+ name: Allow all read operations
13
+ description: Market data, portfolio, prices, positions, history — always safe
14
+ enabled: true
15
+ action: allow
16
+ tools:
17
+ - get_price
18
+ - get_portfolio
19
+ - get_balance
20
+ - get_orderbook
21
+ - get_funding_rate
22
+ - get_positions
23
+ - get_open_orders
24
+ - get_trade_history
25
+ - get_ticker
26
+ - get_klines
27
+ - get_market_info
28
+ - get_account_info
29
+ - get_markets
30
+ - get_market_details
31
+ - get_market_odds
32
+ - get_bets
33
+ - get_bet_history
34
+ - get_portfolio_positions
35
+ - get_market_activity
36
+ - get_leaderboard
37
+ - web_search
38
+ - web_fetch
39
+ - get_news
40
+ - get_sentiment
41
+ - get_on_chain_data
42
+
43
+ # --- Layer 2: Hard blocks (non-negotiable) ---
44
+ - id: crypto-max-leverage
45
+ name: Maximum leverage limit
46
+ description: >
47
+ Hard cap on leverage. Even if the agent or user begs, this won't budge
48
+ without manually editing the config. Prevents liquidation cascades.
49
+ enabled: true
50
+ severity: critical
51
+ action: block
52
+ tools: [change_leverage, set_leverage, update_leverage]
53
+ conditions:
54
+ - field: arguments.leverage
55
+ operator: greater_than
56
+ value: 5 # Adjust: your absolute max leverage (conservative: 2, moderate: 5, aggressive: 10)
57
+
58
+ - id: crypto-max-position
59
+ name: Maximum single position size
60
+ description: No single trade can exceed this USD value
61
+ enabled: true
62
+ severity: critical
63
+ action: block
64
+ tools: [place_order, create_order, submit_order, open_position]
65
+ conditions:
66
+ - field: arguments.quote_quantity
67
+ operator: greater_than
68
+ value: 2000 # Adjust: your max single trade in USD (conservative: 500, moderate: 2000, aggressive: 10000)
69
+
70
+ - id: crypto-max-bet
71
+ name: Maximum prediction market bet
72
+ description: No single prediction market bet can exceed this USD value
73
+ enabled: true
74
+ severity: critical
75
+ action: block
76
+ tools: [place_bet, create_bet, buy_shares, buy_outcome]
77
+ conditions:
78
+ - field: arguments.amount
79
+ operator: greater_than
80
+ value: 500 # Adjust: your max single bet in USD (conservative: 100, moderate: 500, aggressive: 2000)
81
+
82
+ - id: crypto-block-withdrawals
83
+ name: Block all withdrawals
84
+ description: Agent can never move funds off-exchange. Period.
85
+ enabled: true
86
+ severity: critical
87
+ action: block
88
+ tools:
89
+ - withdraw
90
+ - withdraw_funds
91
+ - create_withdrawal
92
+ - transfer_out
93
+ - bridge_funds
94
+
95
+ - id: crypto-block-margin-borrow
96
+ name: Block margin borrowing
97
+ description: Agent cannot borrow margin or take loans
98
+ enabled: true
99
+ severity: critical
100
+ action: block
101
+ tools: [borrow_margin, margin_borrow, cross_margin_borrow, take_loan]
102
+
103
+ - id: crypto-block-remove-stop-loss
104
+ name: Block stop-loss removal
105
+ description: Never allow removing a stop-loss without replacing it
106
+ enabled: true
107
+ severity: critical
108
+ action: block
109
+ tools: [cancel_order, cancel_stop_loss, remove_stop_loss]
110
+ conditions:
111
+ - field: arguments.order_type
112
+ operator: equals
113
+ value: "STOP_LOSS"
114
+
115
+ # --- Layer 3: Auto-allow small trades ---
116
+ - id: crypto-allow-small-trades
117
+ name: Auto-allow small trades
118
+ description: Trades under $200 go through without approval — learning money
119
+ enabled: true
120
+ action: allow
121
+ tools: [place_order, create_order, submit_order, open_position]
122
+ conditions:
123
+ - field: arguments.quote_quantity
124
+ operator: less_than_or_equal
125
+ value: 200 # Adjust: your no-approval-needed trade threshold in USD (conservative: 50, moderate: 200, aggressive: 1000)
126
+
127
+ - id: crypto-allow-small-bets
128
+ name: Auto-allow small bets
129
+ description: Prediction market bets under $50 go through without approval
130
+ enabled: true
131
+ action: allow
132
+ tools: [place_bet, create_bet, buy_shares, buy_outcome]
133
+ conditions:
134
+ - field: arguments.amount
135
+ operator: less_than_or_equal
136
+ value: 50 # Adjust: your no-approval-needed bet threshold in USD (conservative: 25, moderate: 50, aggressive: 250)
137
+
138
+ # --- Layer 4: Approval gates ---
139
+ - id: crypto-approve-trades
140
+ name: Approve trades above threshold
141
+ description: >
142
+ Medium-sized trades need your OK. Your phone pings, you see the details,
143
+ you tap approve or deny. Takes 5 seconds, saves you from impulse trades.
144
+ enabled: true
145
+ severity: high
146
+ action: require_approval
147
+ tools: [place_order, create_order, submit_order, open_position]
148
+ conditions:
149
+ - field: arguments.quote_quantity
150
+ operator: greater_than
151
+ value: 200 # Adjust: matches your no-approval-needed trade threshold in USD (conservative: 50, moderate: 200, aggressive: 1000)
152
+ message: "🔔 Trade approval: {arguments.side} {arguments.symbol} — ${arguments.quote_quantity}"
153
+
154
+ - id: crypto-approve-bets
155
+ name: Approve prediction market bets
156
+ description: Bets above the small threshold need approval
157
+ enabled: true
158
+ severity: high
159
+ action: require_approval
160
+ tools: [place_bet, create_bet, buy_shares, buy_outcome]
161
+ conditions:
162
+ - field: arguments.amount
163
+ operator: greater_than
164
+ value: 50 # Adjust: matches your no-approval-needed bet threshold in USD (conservative: 25, moderate: 50, aggressive: 250)
165
+ message: "🔔 Bet approval: {arguments.market} — ${arguments.amount} on {arguments.outcome}"
166
+
167
+ - id: crypto-approve-leverage-change
168
+ name: Approve all leverage changes
169
+ description: Any leverage change pings you — no exceptions
170
+ enabled: true
171
+ severity: high
172
+ action: require_approval
173
+ tools: [change_leverage, set_leverage, update_leverage]
174
+ message: "⚠️ Leverage change: {arguments.symbol} → {arguments.leverage}x"
175
+
176
+ - id: crypto-approve-close-position
177
+ name: Approve position closure
178
+ description: Closing positions pings you — prevents premature panic exits
179
+ enabled: true
180
+ severity: medium
181
+ action: require_approval
182
+ tools: [close_position, close_all_positions, sell_all]
183
+ message: "📤 Close position: {arguments.symbol}"
184
+
185
+ - id: crypto-approve-cancel-all
186
+ name: Approve mass cancellation
187
+ description: Canceling all orders needs explicit OK
188
+ enabled: true
189
+ severity: medium
190
+ action: require_approval
191
+ tools: [cancel_all_orders]
192
+ message: "🗑️ Cancel ALL open orders — confirm?"
193
+
194
+ - id: crypto-approve-transfers
195
+ name: Approve internal transfers
196
+ description: Moving funds between accounts needs approval
197
+ enabled: true
198
+ severity: high
199
+ action: require_approval
200
+ tools: [transfer_between_accounts, internal_transfer, universal_transfer]
201
+ message: "💸 Transfer ${arguments.amount} from {arguments.from_account} → {arguments.to_account}"
202
+
203
+ - id: crypto-approve-redeem
204
+ name: Approve prediction market redemptions
205
+ description: Redeeming winning positions needs approval
206
+ enabled: true
207
+ severity: medium
208
+ action: require_approval
209
+ tools: [redeem_shares, claim_winnings, redeem_position]
210
+ message: "💰 Redeem {arguments.market} — {arguments.shares} shares"
211
+
212
+ # --- Layer 5: Risk management ---
213
+ - id: crypto-warn-no-stop-loss
214
+ name: Warn on trades without stop-loss
215
+ description: Log a warning when opening leveraged positions without protection
216
+ enabled: true
217
+ severity: medium
218
+ action: warn
219
+ tools: [place_order, create_order, open_position]
220
+ conditions:
221
+ - field: arguments.stop_loss
222
+ operator: not_exists
223
+ message: "⚠️ No stop-loss set on {arguments.symbol} — high risk"
224
+
225
+ # --- Layer 6: Research before action ---
226
+ - id: crypto-research-before-trade
227
+ name: Must research before trading
228
+ description: >
229
+ Agent must check price and portfolio before placing any order.
230
+ This is the "10 seconds of friction" that prevents impulse trades.
231
+ enabled: true
232
+ severity: high
233
+ action: block
234
+ tools: [place_order, create_order, submit_order, open_position]
235
+ requires:
236
+ - tool: get_price
237
+ - tool: get_portfolio
238
+ message: "Check price and portfolio first — no blind trades"
239
+
240
+ - id: crypto-research-before-bet
241
+ name: Must research before betting
242
+ description: Agent must look at market details before placing a bet
243
+ enabled: true
244
+ severity: high
245
+ action: block
246
+ tools: [place_bet, create_bet, buy_shares, buy_outcome]
247
+ requires:
248
+ - tool: get_market_details
249
+ message: "Check market details first — no blind bets"
250
+
251
+ # --- Layer 7: Time restrictions ---
252
+ - id: crypto-block-night-leverage
253
+ name: No leveraged trades at night
254
+ description: >
255
+ Between midnight and 6am UTC, block leveraged trades.
256
+ Most bad decisions happen when you're tired.
257
+ enabled: true
258
+ severity: high
259
+ action: block
260
+ tools: [place_order, create_order, open_position]
261
+ conditions:
262
+ - field: arguments.leverage
263
+ operator: greater_than
264
+ value: 1
265
+ - field: timestamp
266
+ operator: outside_hours
267
+ value: "06:00-23:59"
268
+ message: "No leveraged trades between midnight and 6am. Sleep on it."
269
+
270
+ settings:
271
+ default_action: allow
272
+ fail_mode: closed
273
+
274
+ economic:
275
+ budgets:
276
+ - scope: session
277
+ limit: 1000.00 # Adjust: your session trading budget in USD (conservative: 500, moderate: 1000, aggressive: 5000)
278
+ currency: USD
279
+ approval_threshold: 500.00 # Adjust: the per-trade cost that always needs approval in USD (conservative: 250, moderate: 500, aggressive: 2500)
280
+ window: session
281
+
282
+ cost_extraction:
283
+ default: "arguments.quote_quantity"
284
+ overrides:
285
+ place_order: "arguments.quote_quantity"
286
+ create_order: "arguments.quote_quantity"
287
+ open_position: "arguments.quote_quantity"
288
+ place_bet: "arguments.amount"
289
+ create_bet: "arguments.amount"
290
+ buy_shares: "arguments.amount"
291
+ buy_outcome: "arguments.amount"
292
+ transfer_between_accounts: "arguments.amount"
293
+
294
+ payer:
295
+ required: false
296
+
297
+ denial_reasons:
298
+ budget_exceeded: "Daily budget hit: ${spent}/${limit} USD. Done for today — no more trades until next session."
299
+ approval_required: "This ${cost} trade pushes you past the ${threshold} approval threshold. Confirm?"
300
+
301
+ sessionConstraints:
302
+ maxCalls: 100 # Adjust: max tool calls per session (conservative: 50, moderate: 100, aggressive: 250)
303
+ budget: 1000 # Adjust: session spend budget in USD for deterministic tracking (conservative: 500, moderate: 1000, aggressive: 5000)
304
+ spendArgument: "quote_quantity"
305
+ counters:
306
+ open_positions:
307
+ increment: [place_order, create_order, open_position]
308
+ decrement: [close_position]
309
+ max: 3 # Adjust: max simultaneous open positions (conservative: 2, moderate: 3, aggressive: 5)
310
+ maxAction: require_approval
311
+ active_bets:
312
+ increment: [place_bet, create_bet, buy_shares, buy_outcome]
313
+ decrement: [redeem_shares, claim_winnings]
314
+ max: 5 # Adjust: max simultaneous prediction market positions (conservative: 3, moderate: 5, aggressive: 10)
315
+ maxAction: require_approval
316
+ cumulativeLimits:
317
+ - argumentName: quote_quantity
318
+ maxValue: 5000 # Adjust: max cumulative trading volume per session in USD (conservative: 1000, moderate: 5000, aggressive: 25000)
319
+ - argumentName: amount
320
+ maxValue: 2000 # Adjust: max cumulative prediction market volume per session in USD (conservative: 500, moderate: 2000, aggressive: 10000)