beast-agent 2.53.0 → 2.54.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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "beast-agent",
3
3
  "productName": "Beast Agent",
4
- "version": "2.53.0",
4
+ "version": "2.54.0",
5
5
  "description": "Ultra-fast local agent shell for Windows.",
6
6
  "author": "algokodcom (AlgoKod)",
7
7
  "license": "MIT",
@@ -78,20 +78,25 @@ function call(requests) {
78
78
  const type = String(args.type || '').trim().toLowerCase();
79
79
  const volume = Number(args.volume || 0);
80
80
  const price = Number(args.price || 0);
81
- const izin = ['buy_limit', 'sell_limit', 'buy_stop', 'sell_stop'];
81
+ /* 6 TİP: 4 bekleyen (limit/stop) + 2 ANLIK piyasa (buy_market/sell_market) */
82
+ const izin = ['buy_limit', 'sell_limit', 'buy_stop', 'sell_stop', 'buy_market', 'sell_market'];
82
83
  if (!symbol) return console.log(JSON.stringify({ ok: false, error: 'symbol zorunlu' }));
83
- if (!izin.includes(type)) return console.log(JSON.stringify({ ok: false, error: 'type: buy_limit|sell_limit|buy_stop|sell_stop' }));
84
+ if (!izin.includes(type)) return console.log(JSON.stringify({ ok: false, error: 'type: buy_limit|sell_limit|buy_stop|sell_stop|buy_market|sell_market' }));
84
85
  if (!(volume > 0)) return console.log(JSON.stringify({ ok: false, error: 'volume (lot) zorunlu ve 0 dan buyuk' }));
85
- if (!(price > 0)) return console.log(JSON.stringify({ ok: false, error: 'price zorunlu ve 0 dan buyuk' }));
86
- const params = { symbol: symbol, type: type, volume: volume, price: price };
86
+ const isMarket = type === 'buy_market' || type === 'sell_market';
87
+ if (!isMarket && !(price > 0)) return console.log(JSON.stringify({ ok: false, error: 'price limit/stop emri icin zorunlu ve 0 dan buyuk' }));
88
+ const method = isMarket ? 'market' : 'pending';
89
+ const params = isMarket
90
+ ? { symbol: symbol, side: type.startsWith('buy') ? 'buy' : 'sell', volume: volume }
91
+ : { symbol: symbol, type: type, volume: volume, price: price };
87
92
  if (args.sl) params.sl = Number(args.sl);
88
93
  if (args.tp) params.tp = Number(args.tp);
89
- const r = await call([{ method: 'pending', params: params }]);
94
+ const r = await call([{ method: method, params: params }]);
90
95
  if (r.ok && r.data && r.data.result) {
91
96
  const res = r.data.result;
92
97
  console.log(JSON.stringify({ ok: true, ticket: res.order, retcode: res.retcode, comment: res.comment, detay: r.data }));
93
98
  } else {
94
- console.log(JSON.stringify({ ok: false, error: r.error || 'bekleyen emir reddedildi' }));
99
+ console.log(JSON.stringify({ ok: false, error: r.error || (isMarket ? 'piyasa emri reddedildi' : 'bekleyen emir reddedildi') }));
95
100
  }
96
101
  })();
97
102
 
@@ -1,17 +1,18 @@
1
1
  {
2
2
  "name": "mt5_bekleyen",
3
- "description": "BEKLEYEN EMİR koyar: symbol, type (buy_limit|sell_limit|buy_stop|sell_stop), volume, price zorunlu; sl/tp opsiyonel. Başarıda emir ticket'ı döner.",
3
+ "description": "MT5 EMİR açar (6 tip): buy_limit, sell_limit, buy_stop, sell_stop (bekleyen; price zorunlu) ve buy_market, sell_market (ANLIK piyasa emri; price gerekmez). symbol, type, volume zorunlu; sl/tp opsiyonel. Başarıda emir ticket'ı döner.",
4
4
  "parameters": {
5
5
  "type": "object",
6
6
  "properties": {
7
7
  "symbol": { "type": "string", "description": "Broker sembol adi: GOLD veya BITCOIN (XAUUSD degil)" },
8
- "type": { "type": "string", "description": "buy_limit | sell_limit | buy_stop | sell_stop" },
8
+ "type": { "type": "string", "description": "buy_limit | sell_limit | buy_stop | sell_stop | buy_market | sell_market" },
9
9
  "volume": { "type": "number", "description": "Lot (0.01-0.1)" },
10
- "price": { "type": "number", "description": "Tetiklenme/limit fiyati" },
10
+ "price": { "type": "number", "description": "Tetiklenme/limit fiyati (limit/stop icin zorunlu; market tiplerinde yok sayilir)" },
11
11
  "sl": { "type": "number", "description": "Stop loss (opsiyonel)" },
12
12
  "tp": { "type": "number", "description": "Take profit (opsiyonel)" }
13
13
  },
14
- "required": ["symbol", "type", "volume", "price"]
14
+ "required": ["symbol", "type", "volume"]
15
15
  },
16
- "updatedAt": "2026-09-09T18:50:00.000Z"
16
+ "defaultsVersion": 2,
17
+ "updatedAt": "2026-09-15T14:00:00.000Z"
17
18
  }
@@ -2009,7 +2009,8 @@ class Engine {
2009
2009
  modeBlock2 + '\n' +
2010
2010
  (roleBlockFull ? roleBlockFull + '\n' : '') +
2011
2011
  (teamLine || '') +
2012
- 'MT5 ARAÇLARI: mt5_status (bağlantı), mt5_account (hesap), mt5_market (canlı fiyat), mt5_positions (açık pozisyonlar), mt5_orders (bekleyen emirler), mt5_history (kapanan işlemler), mt5_ea (BeastFinance grafik panosu: status/ping/chart/note), mt5_trade (piyasa emri), mt5_close (kapat), mt5_modify (SL/TP), mt5_pending (bekleyen emir), mt5_cancel (emir iptal).\n' +
2012
+ 'MT5 ARAÇLARI: mt5_status (bağlantı), mt5_account (hesap), mt5_market (canlı fiyat), mt5_positions (açık pozisyonlar), mt5_orders (bekleyen emirler), mt5_history (kapanan işlemler), mt5_ea (BeastFinance grafik panosu: status/ping/chart/note), mt5_trade (TÜM TİPLER: buy/sell market + buy/sell limit/stop), mt5_close (kapat), mt5_modify (SL/TP), mt5_pending (TÜM TİPLER: buy_limit/sell_limit/buy_stop/sell_stop bekleyen + buy_market/sell_market anlık), mt5_cancel (emir iptal).\n' +
2013
+ 'EMİR TİPLERİ (6 tip — HEPSİ AÇIK): buy_market/sell_market = anlık piyasa emri (fiyat beklenmez), buy_limit/sell_limit = bekleyen limit (price zorunlu), buy_stop/sell_stop = bekleyen stop (price zorunlu). mt5_trade ve mt5_pending İKİSİ DE 6 tipi kabul eder; emir tipini net söyle (ör. type:"sell_limit").\n' +
2013
2014
  'KİŞİSEL MT5 ARAÇLARI (VARSAYILAN KURULU — tool__* tüm oturumlarda çağrılabilir): tool__mt5_shot (grafikten GERÇEK PNG + görsel ajana enjekte — grafik işlerinde BİRİNCİL; timeframes:["M1","M15"] ile çoklu periyot, symbols:["GOLD","EURUSD","BTCUSD"] ile çoklu sembol TEK karede), tool__mt5_barlar2 (OHLC mumlar, köprüsüz), tool__mt5_m15_m5 (GOLD M15+M5 hazır paket), tool__mt5_fiyat, tool__mt5_durum (hesap+pozisyon+emir tek çağrı), tool__mt5_gecmis, tool__mt5_pozisyon_gecmis, tool__mt5_sltp, tool__mt5_kapat, tool__mt5_bekleyen, tool__mt5_emir, tool__mt5_emir_iptal.\n' +
2014
2015
  'BEASTFINANCE EA (OTOMATİK GRAFİK UZMANI — ENTEGRASYON KANALI): MT5 terminaline bağlanıldığında BeastFinance uzman danışmanı İLK GRAFİĞE OTOMATİK yüklenir, AutoTrading izni açılır (kurulum sistem tarafından yapılır; elle ekleme gerekmez). Grafik panosu + seviye çizgileri + dosya köprüsü (beast_ea.json / beast_cmd.json / beast_note.json) bu EA üzerinden yürür: entegrasyon işlerinde (status/ping/chart/note) mt5_ea kullan; ekran görüntüsü işlerinde tool__mt5_shot ("shot" komutu — gerçek PNG + ajan görseli) birincildir. Yazdığın not ve çizgiler tool__mt5_shot ve computer_look screenshot\'ında GÖRÜNÜR.\n' +
2015
2016
  'YETKİLERİN (AÇIK — çekinmeden kullan):\n' +
@@ -9,6 +9,7 @@ const mt5 = require('../mt5bridge');
9
9
  const finindicators = require('./finindicators');
10
10
  const finstats = require('./finstats');
11
11
  const finrisk = require('./finrisk');
12
+ const finwatch = require('./finwatch');
12
13
 
13
14
  const NAMES = [
14
15
  'mt5_status',
@@ -252,19 +253,25 @@ const definitions = NAMES.map((name) => {
252
253
  },
253
254
  mt5_trade: {
254
255
  description:
255
- 'PİYASA EMRİ AÇAR: mt5_trade {symbol, side:"buy"|"sell", volume, sl?, tp?, comment?, reason?}. Lot limiti ve max pozisyon sayısı sistem tarafından zorlanır. Otomatik işlem anahtarı kapalıysa reddedilir. SL/TP vermek ŞIDDETLİ önerilir. reason: kararın tek cümlelik tezi (günlüğe yazılır, performans değerlendirmesinde kullanılır).',
256
+ 'EMİR AÇAR — TÜM TİPLER: mt5_trade {symbol, side:"buy"|"sell", volume, type?, sl?, tp?, comment?, reason?}. type: "buy"|"sell" (piyasa/anlık) ya da "buy_market"|"sell_market"|"buy_limit"|"sell_limit"|"buy_stop"|"sell_stop" — limit/stop tipleri otomatik bekleyen emre (mt5_pending) yönlenir ve price gerekir. Lot limiti ve max pozisyon sayısı sistem tarafından zorlanır. Otomatik işlem anahtarı kapalıysa reddedilir. SL/TP vermek ŞİDDETLİ önerilir. reason: kararın tek cümlelik tezi (günlüğe yazılır, performans değerlendirmesinde kullanılır).',
256
257
  parameters: {
257
258
  type: 'object',
258
259
  properties: {
259
260
  symbol: { type: 'string', description: 'Örn: EURUSD' },
260
- side: { type: 'string', enum: ['buy', 'sell'] },
261
+ side: { type: 'string', enum: ['buy', 'sell'], description: 'Yön (type ile birlikte ya da tek başına: piyasa emri)' },
262
+ type: {
263
+ type: 'string',
264
+ enum: ['market', 'buy_market', 'sell_market', 'buy_limit', 'sell_limit', 'buy_stop', 'sell_stop'],
265
+ description: 'Emir tipi. Boş/side verilirse piyasa emri; limit/stop verilirse bekleyen emir (price zorunlu olur).',
266
+ },
261
267
  volume: { type: 'number', description: 'Lot (max lot sınırına tabi)' },
268
+ price: { type: 'number', description: 'Limit/stop emirlerinde tetik fiyatı (piyasa emrinde gerekmez)' },
262
269
  sl: { type: 'number', description: 'Stop loss fiyatı (0 = yok)' },
263
270
  tp: { type: 'number', description: 'Take profit fiyatı (0 = yok)' },
264
271
  comment: { type: 'string', description: 'Kısa işlem notu' },
265
272
  reason: { type: 'string', description: 'Kararın tezi/gerekçesi (tek cümle)' },
266
273
  },
267
- required: ['symbol', 'side', 'volume'],
274
+ required: ['symbol', 'volume'],
268
275
  },
269
276
  },
270
277
  mt5_close: {
@@ -292,19 +299,22 @@ const definitions = NAMES.map((name) => {
292
299
  },
293
300
  mt5_pending: {
294
301
  description:
295
- 'BEKLEYEN EMİR koyar: mt5_pending {symbol, type:"buy_limit"|"sell_limit"|"buy_stop"|"sell_stop", volume, price, sl?, tp?, reason?}. Otomatik işlem anahtarına tabidir. reason: kararın tezi (günlüğe yazılır).',
302
+ 'EMİR AÇAR (6 tip): mt5_pending {symbol, type:"buy_limit"|"sell_limit"|"buy_stop"|"sell_stop"|"buy_market"|"sell_market", volume, price?, sl?, tp?, reason?}. Limit/stop = bekleyen emir (price zorunlu); buy_market/sell_market = ANLIK piyasa emri. Otomatik işlem anahtarına tabidir. reason: kararın tezi (günlüğe yazılır).',
296
303
  parameters: {
297
304
  type: 'object',
298
305
  properties: {
299
306
  symbol: { type: 'string' },
300
- type: { type: 'string', enum: ['buy_limit', 'sell_limit', 'buy_stop', 'sell_stop'] },
307
+ type: {
308
+ type: 'string',
309
+ enum: ['buy_limit', 'sell_limit', 'buy_stop', 'sell_stop', 'buy_market', 'sell_market'],
310
+ },
301
311
  volume: { type: 'number' },
302
- price: { type: 'number' },
312
+ price: { type: 'number', description: 'Tetik fiyatı — limit/stop için zorunlu, market tiplerinde gerekmez' },
303
313
  sl: { type: 'number' },
304
314
  tp: { type: 'number' },
305
315
  reason: { type: 'string', description: 'Kararın tezi/gerekçesi (tek cümle)' },
306
316
  },
307
- required: ['symbol', 'type', 'volume', 'price'],
317
+ required: ['symbol', 'type', 'volume'],
308
318
  },
309
319
  },
310
320
  mt5_cancel: {
@@ -523,13 +533,20 @@ const handlers = {
523
533
  };
524
534
  },
525
535
  async mt5_trade(args, ctx) {
536
+ /* TÜM EMİR TİPLERİ: piyasa (buy/sell, buy_market/sell_market) ve
537
+ bekleyen (buy_limit/sell_limit/buy_stop/sell_stop) — bekleyen tip
538
+ verilirse mt5_pending'e devredilir (tek tutarlı risk hattı). */
539
+ const t = finwatch.parseOrderType(args.type || args.orderType || args.side, args.side);
540
+ if (!t.ok) {
541
+ return { ok: false, error: "side 'buy'|'sell' ya da type: buy_market|sell_market|buy_limit|sell_limit|buy_stop|sell_stop" };
542
+ }
543
+ if (t.kind === 'pending') return handlers.mt5_pending({ ...args, type: t.type }, ctx);
526
544
  const cfg = getCfg();
527
545
  if (!cfg.allowTrading) {
528
546
  return { ok: false, error: 'Otomatik işlem KAPALI — analiz/öneri modundasın. İşlem önerisini yaz, açma.' };
529
547
  }
530
548
  if (!mt5.running) return notConnected();
531
- const side = String(args.side || '').toLowerCase();
532
- if (side !== 'buy' && side !== 'sell') return { ok: false, error: "side 'buy' veya 'sell' olmalı" };
549
+ const side = t.side;
533
550
  const symbol = String(args.symbol || '').trim().toUpperCase();
534
551
  if (!symbol) return { ok: false, error: 'symbol gerekli' };
535
552
  const maxLot = Number(cfg.maxLot) || 0.1;
@@ -626,6 +643,13 @@ const handlers = {
626
643
  return { ok: true, result: data && data.result };
627
644
  },
628
645
  async mt5_pending(args, ctx) {
646
+ /* 6 TİP: buy_limit/sell_limit/buy_stop/sell_stop BEKLEYEN emir;
647
+ buy_market/sell_market ANLIK piyasa emri — mt5_trade'e devredilir. */
648
+ const t = finwatch.parseOrderType(args.type || args.orderType, args.side);
649
+ if (!t.ok) {
650
+ return { ok: false, error: 'type: buy_limit|sell_limit|buy_stop|sell_stop|buy_market|sell_market' };
651
+ }
652
+ if (t.kind === 'market') return handlers.mt5_trade({ ...args, type: 'market', orderType: '', side: t.side }, ctx);
629
653
  const cfg = getCfg();
630
654
  if (!cfg.allowTrading) {
631
655
  return { ok: false, error: 'Otomatik işlem KAPALI — bekleyen emir de açılamaz. Öneriyi yaz.' };
@@ -638,8 +662,11 @@ const handlers = {
638
662
  const norm = finrisk.normalizeVolume(info, args.volume, Number(cfg.maxLot) || 0.1);
639
663
  if (norm.error) return { ok: false, error: norm.error };
640
664
  const vol = norm.volume;
641
- const ptype = String(args.type || '').toLowerCase();
642
- const pside = ptype.startsWith('buy') ? 'buy' : ptype.startsWith('sell') ? 'sell' : '';
665
+ const ptype = t.type;
666
+ const pside = t.side;
667
+ if (!(Number(args.price) > 0)) {
668
+ return { ok: false, error: 'price gerekli — limit/stop bekleyen emirleri için tetik fiyatı ver (market tipleri anlıktır, price istemez)' };
669
+ }
643
670
  /* KODLA DİSİPLİN: bekleyen emir de işlem sayılır */
644
671
  let discErr = null;
645
672
  try { discErr = discipline(pside, symbol, []); } catch {}
@@ -658,7 +685,7 @@ const handlers = {
658
685
  tp: Number(args.tp) || 0,
659
686
  comment: String(args.comment || 'Beast').slice(0, 26),
660
687
  }, 20000);
661
- noteTrade('pending', { symbol, type: args.type, volume: vol, reason: String(args.reason || '').slice(0, 500) }, ctx);
688
+ noteTrade('pending', { symbol, type: ptype, volume: vol, reason: String(args.reason || '').slice(0, 500) }, ctx);
662
689
  return { ok: true, result: data && data.result };
663
690
  },
664
691
  async mt5_cancel(args, ctx) {
@@ -119,6 +119,34 @@ function closeKind(reason) {
119
119
  return '';
120
120
  }
121
121
 
122
+ /* ---- emir tipi çözümleme (6 tip) ----
123
+ "buy"/"sell" → piyasa (market); buy_market/sell_market → piyasa;
124
+ buy_limit/sell_limit/buy_stop/sell_stop → bekleyen (pending).
125
+ Esnek yazım: "sell limit", "limit_buy", "MARKET BUY", "anlık" aynı sonuca iner.
126
+ fallbackSide: tip yön taşımıyorsa (ör. yalnız "market"/"limit") kullanılır.
127
+ Dönüş: { ok, side:'buy'|'sell', kind:'market'|'pending', type:'buy_market'|... } */
128
+ function parseOrderType(raw, fallbackSide) {
129
+ const s = String(raw || '').toLowerCase().replace(/[\s-]+/g, '_');
130
+ const fb = String(fallbackSide || '').toLowerCase().trim();
131
+ const side = /(^|_)sell(_|$)/.test(s)
132
+ ? 'sell'
133
+ : /(^|_)buy(_|$)/.test(s)
134
+ ? 'buy'
135
+ : fb === 'sell'
136
+ ? 'sell'
137
+ : fb === 'buy'
138
+ ? 'buy'
139
+ : '';
140
+ if (!side) return { ok: false };
141
+ const hasLimit = /limit/.test(s);
142
+ const hasStop = /stop/.test(s);
143
+ const hasMarket = /market|instant|piyasa|anl[ıi]k/.test(s);
144
+ if ((hasLimit || hasStop) && !hasMarket) {
145
+ return { ok: true, side, kind: 'pending', type: side + '_' + (hasLimit ? 'limit' : 'stop') };
146
+ }
147
+ return { ok: true, side, kind: 'market', type: side + '_market' };
148
+ }
149
+
122
150
  /* ---- bekleyen emir (pending) → pozisyon eşleştirme ----
123
151
  Watchdog turu emir listesini karşılaştırır: listeden DÜŞEN emir için aynı
124
152
  turda YENİ açılan (ya da netting hesapta hacmi artan) eşleşen bir pozisyon
@@ -188,4 +216,4 @@ function matchPendingDelta(goneOrders, freshPositions) {
188
216
  return out;
189
217
  }
190
218
 
191
- module.exports = { plan, roundTo, stepRound, closeKind, orderSide, orderTypeLabel, orderVolume, matchPendingDelta };
219
+ module.exports = { plan, roundTo, stepRound, closeKind, parseOrderType, orderSide, orderTypeLabel, orderVolume, matchPendingDelta };
package/src/main.js CHANGED
@@ -10516,17 +10516,20 @@ try {
10516
10516
  girmez) — başarılı emir/SL-TP/bekleyen/iptal olayları aynı hatta düşer */
10517
10517
  customtools.setTradeHook((id, args, res, sid) => {
10518
10518
  if (!res || res.ok !== true) return;
10519
+ const a = args || {};
10520
+ /* mt5_bekleyen 6 tip kabul eder: market tipleri ANLIK işlem sayılır */
10519
10521
  const kind = {
10520
10522
  mt5_emir: 'trade',
10521
10523
  mt5_sltp: 'modify',
10522
- mt5_bekleyen: 'pending',
10524
+ mt5_bekleyen: /_market$/i.test(String(a.type || '')) ? 'trade' : 'pending',
10523
10525
  mt5_emir_iptal: 'cancel',
10524
10526
  mt5_kapat: 'close',
10525
10527
  }[String(id || '')];
10526
10528
  if (!kind) return;
10527
- const a = args || {};
10528
- if (kind === 'trade') finTradeEvent('trade', { symbol: a.symbol, side: a.side, volume: a.volume, sl: a.sl, tp: a.tp, reason: a.reason || a.comment || '', result: res }, sid);
10529
- else if (kind === 'modify') finTradeEvent('modify', { ticket: a.ticket, sl: a.sl, tp: a.tp }, sid);
10529
+ if (kind === 'trade') {
10530
+ const side = a.side || (/^buy/i.test(String(a.type || '')) ? 'buy' : /^sell/i.test(String(a.type || '')) ? 'sell' : '');
10531
+ finTradeEvent('trade', { symbol: a.symbol, side, volume: a.volume, sl: a.sl, tp: a.tp, reason: a.reason || a.comment || '', result: res }, sid);
10532
+ } else if (kind === 'modify') finTradeEvent('modify', { ticket: a.ticket, sl: a.sl, tp: a.tp }, sid);
10530
10533
  else if (kind === 'pending') finTradeEvent('pending', { symbol: a.symbol, type: a.type, volume: a.volume, reason: a.reason || '' }, sid);
10531
10534
  else if (kind === 'cancel') finTradeEvent('cancel', { ticket: a.ticket }, sid);
10532
10535
  else if (kind === 'close') finTradeEvent('close', { ticket: a.ticket, volume: a.volume || 'all' }, sid);
@@ -10985,7 +10988,7 @@ function finTraderBrief(agent) {
10985
10988
  `Tur aralığı: ${f.intervalSec} sn · Max lot: ${f.maxLot} · Max eşzamanlı pozisyon: ${f.maxPositions}`,
10986
10989
  roleDef
10987
10990
  ? `UZMANLIK: ${roleDef.desc} — raporlarını bu çerçevede yaz; İŞLEM AÇMA, yalnız analiz + net öneri üret.`
10988
- : 'Otomatik işlem AÇIK (daima): mt5_trade/mt5_close/mt5_modify/mt5_pending kullanabilirsin (limitler sistemce zorlanır). Lot için mt5_risksize hesapla ya da mt5_trade’e riskPct ver; SL/TP broker stops_level mesafesine uymalı.',
10991
+ : 'Otomatik işlem AÇIK (daima): 6 emir tipinin HEPSİ açık — buy_market/sell_market (anlık piyasa), buy_limit/sell_limit ve buy_stop/sell_stop (bekleyen; price zorunlu). mt5_trade ya da mt5_pending İKİSİ de tüm tipleri kabul eder; ayrıca mt5_close/mt5_modify/mt5_cancel açık (limitler sistemce zorlanır). Lot için mt5_risksize hesapla ya da mt5_trade’e riskPct ver; SL/TP broker stops_level mesafesine uymalı.',
10989
10992
  roleDef
10990
10993
  ? 'Bulgularını agent_dm ile ANA TRADER\u2019a bildir (to: "Trader" ya da ajan başlığı anahtarı); teknik/öneri çelişkisi varsa gerekçenle yaz.'
10991
10994
  : f.strategy ? `Sahibinin strateji notu: ${f.strategy}` : 'Strateji notu yok: trend + destek/direnç + momentum ile temel okuma yap.',