@wowok/agent-mcp 2.3.18 → 2.4.1
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/dist/customer/industry-risks.js +31 -31
- package/dist/customer/order-monitor.js +57 -57
- package/dist/customer/order-strategy.js +89 -89
- package/dist/customer/post-purchase.js +97 -97
- package/dist/customer/reminder-system.js +26 -26
- package/dist/customer/risk-assessment.js +46 -46
- package/dist/customer/types.d.ts +4 -4
- package/dist/customer/types.js +4 -4
- package/dist/customer/user-preferences.js +50 -50
- package/dist/experience/intent-distill.js +6 -6
- package/dist/knowledge/acquisition-flywheel.js +64 -64
- package/dist/knowledge/arbitration-trust.js +10 -10
- package/dist/knowledge/demand-matching.js +8 -8
- package/dist/knowledge/dynamic-pricing.js +18 -18
- package/dist/knowledge/flywheel-loop.js +11 -11
- package/dist/knowledge/glossary.js +22 -22
- package/dist/knowledge/guard-ledger.d.ts +1 -1
- package/dist/knowledge/guard-ledger.js +131 -104
- package/dist/knowledge/guard-lint.d.ts +76 -0
- package/dist/knowledge/guard-lint.js +590 -0
- package/dist/knowledge/guard-puzzle.d.ts +109 -14
- package/dist/knowledge/guard-puzzle.js +627 -101
- package/dist/knowledge/guard-risk.d.ts +8 -1
- package/dist/knowledge/guard-risk.js +868 -296
- package/dist/knowledge/guard-templates.d.ts +37 -0
- package/dist/knowledge/guard-templates.js +329 -0
- package/dist/knowledge/guard-translation.d.ts +14 -2
- package/dist/knowledge/guard-translation.js +825 -194
- package/dist/knowledge/index.d.ts +8 -4
- package/dist/knowledge/index.js +9 -5
- package/dist/knowledge/industry-evolution.js +29 -29
- package/dist/knowledge/industry-generalizer.js +52 -52
- package/dist/knowledge/industry-registry.js +20 -33
- package/dist/knowledge/intent-metrics.js +67 -67
- package/dist/knowledge/process-model.js +80 -80
- package/dist/knowledge/reputation-rules.js +9 -9
- package/dist/knowledge/reward-templates.js +51 -51
- package/dist/knowledge/safety-rules.js +3 -3
- package/dist/knowledge/tool-constraints.js +20 -4
- package/dist/knowledge/trust-metrics.js +26 -26
- package/dist/schema/call/base.js +16 -16
- package/dist/schema/call/bridge.d.ts +32 -32
- package/dist/schema/call/demand.d.ts +84 -84
- package/dist/schema/call/guard.d.ts +153 -0
- package/dist/schema/call/guard.js +50 -0
- package/dist/schema/call/permission.d.ts +78 -78
- package/dist/schema/call/repository.d.ts +22 -22
- package/dist/schema/call/semantic.js +228 -24
- package/dist/schema/local/wip.d.ts +39 -19
- package/dist/schema/local/wip.js +5 -5
- package/dist/schema/messenger/index.d.ts +26 -26
- package/dist/schema/messenger/index.js +2 -2
- package/dist/schema/operations.d.ts +222 -144
- package/dist/schema/query/index.d.ts +38 -38
- package/dist/schema/trust/index.d.ts +4 -4
- package/dist/schema/utils/guard-parser.js +4 -4
- package/dist/schema/utils/node-parser.js +14 -14
- package/dist/schemas/bridge_operation.output.json +14 -14
- package/dist/schemas/index.json +1 -1
- package/dist/schemas/messenger_operation.output.json +17 -15
- package/dist/schemas/onchain_events.output.json +14 -14
- package/dist/schemas/onchain_operations.output.json +14 -14
- package/dist/schemas/onchain_table_data.output.json +14 -14
- package/dist/schemas/wip_file.output.json +24 -1
- package/package.json +2 -2
|
@@ -2,10 +2,10 @@ import { CUSTOMER_INTELLIGENCE_VERSION } from "./types.js";
|
|
|
2
2
|
const SCENARIO_SPECS = {
|
|
3
3
|
info_asymmetry: {
|
|
4
4
|
scenario: "info_asymmetry",
|
|
5
|
-
merchant_tactic: "
|
|
6
|
-
user_strategy: "
|
|
7
|
-
nash_equilibrium: "
|
|
8
|
-
fallback: "
|
|
5
|
+
merchant_tactic: "Hides key workflow information; Machine is not public",
|
|
6
|
+
user_strategy: "Request machineNode2file export + Guard configuration; ask about key nodes via Messenger",
|
|
7
|
+
nash_equilibrium: "Merchant becomes transparent (provides full Machine docs) ↔ User purchases",
|
|
8
|
+
fallback: "Abandon purchase",
|
|
9
9
|
confidence: (puzzle) => {
|
|
10
10
|
if (puzzle.workflow_analysis === undefined)
|
|
11
11
|
return 0.9;
|
|
@@ -15,20 +15,20 @@ const SCENARIO_SPECS = {
|
|
|
15
15
|
},
|
|
16
16
|
rationale: (puzzle) => {
|
|
17
17
|
if (puzzle.workflow_analysis === undefined) {
|
|
18
|
-
return "
|
|
18
|
+
return "Workflow structure analysis missing; severe information asymmetry";
|
|
19
19
|
}
|
|
20
20
|
if (puzzle.completeness < 0.5) {
|
|
21
|
-
return
|
|
21
|
+
return `Information completeness is only ${Math.round(puzzle.completeness * 100)}%; key puzzle pieces missing`;
|
|
22
22
|
}
|
|
23
|
-
return "
|
|
23
|
+
return "Information completeness is acceptable, but still recommend requesting Machine docs";
|
|
24
24
|
},
|
|
25
25
|
},
|
|
26
26
|
fund_safety: {
|
|
27
27
|
scenario: "fund_safety",
|
|
28
|
-
merchant_tactic: "
|
|
29
|
-
user_strategy: "
|
|
30
|
-
nash_equilibrium: "
|
|
31
|
-
fallback: "
|
|
28
|
+
merchant_tactic: "No compensation fund or insufficient compensation fund",
|
|
29
|
+
user_strategy: "Require merchant to top up compensation_fund to 100% of order amount; write into WTS agreement",
|
|
30
|
+
nash_equilibrium: "Merchant tops up compensation fund ↔ User purchases",
|
|
31
|
+
fallback: "Choose another merchant or require arbitration upfront",
|
|
32
32
|
confidence: (puzzle) => {
|
|
33
33
|
const fund = puzzle.fund_safety;
|
|
34
34
|
if (!fund)
|
|
@@ -40,19 +40,19 @@ const SCENARIO_SPECS = {
|
|
|
40
40
|
rationale: (puzzle) => {
|
|
41
41
|
const fund = puzzle.fund_safety;
|
|
42
42
|
if (!fund)
|
|
43
|
-
return "
|
|
43
|
+
return "Fund safety analysis missing";
|
|
44
44
|
if (fund.compensation_covers_order === false) {
|
|
45
|
-
return
|
|
45
|
+
return `Compensation fund covers only ${Math.round(fund.compensation_ratio * 100)}% of order amount`;
|
|
46
46
|
}
|
|
47
|
-
return "
|
|
47
|
+
return "Compensation fund covers the order amount";
|
|
48
48
|
},
|
|
49
49
|
},
|
|
50
50
|
refund_dispute: {
|
|
51
51
|
scenario: "refund_dispute",
|
|
52
|
-
merchant_tactic: "
|
|
53
|
-
user_strategy: "
|
|
54
|
-
nash_equilibrium: "
|
|
55
|
-
fallback: "
|
|
52
|
+
merchant_tactic: "No refund path or unfair refund Allocator configuration",
|
|
53
|
+
user_strategy: "Negotiate refund terms via Messenger + require 100%→Order Allocator",
|
|
54
|
+
nash_equilibrium: "Merchant configures refund Allocator ↔ User purchases",
|
|
55
|
+
fallback: "Arbitration",
|
|
56
56
|
confidence: (puzzle) => {
|
|
57
57
|
const wf = puzzle.workflow_analysis;
|
|
58
58
|
if (!wf)
|
|
@@ -64,18 +64,18 @@ const SCENARIO_SPECS = {
|
|
|
64
64
|
rationale: (puzzle) => {
|
|
65
65
|
const wf = puzzle.workflow_analysis;
|
|
66
66
|
if (!wf)
|
|
67
|
-
return "
|
|
67
|
+
return "Workflow structure missing; cannot confirm refund path";
|
|
68
68
|
if (wf.has_refund_path === false)
|
|
69
|
-
return "
|
|
70
|
-
return "
|
|
69
|
+
return "No refund path detected in the workflow";
|
|
70
|
+
return "Refund path exists";
|
|
71
71
|
},
|
|
72
72
|
},
|
|
73
73
|
arbitration_fairness: {
|
|
74
74
|
scenario: "arbitration_fairness",
|
|
75
|
-
merchant_tactic: "
|
|
76
|
-
user_strategy: "
|
|
77
|
-
nash_equilibrium: "
|
|
78
|
-
fallback: "
|
|
75
|
+
merchant_tactic: "Self-built arbitration (owner=service owner)",
|
|
76
|
+
user_strategy: "Require third-party arbitration; verify arb owner via query_toolkit",
|
|
77
|
+
nash_equilibrium: "Third-party arbitration ↔ User purchases",
|
|
78
|
+
fallback: "Do not purchase",
|
|
79
79
|
confidence: (puzzle) => {
|
|
80
80
|
const trust = puzzle.trust_signals;
|
|
81
81
|
if (!trust)
|
|
@@ -87,19 +87,19 @@ const SCENARIO_SPECS = {
|
|
|
87
87
|
rationale: (puzzle) => {
|
|
88
88
|
const trust = puzzle.trust_signals;
|
|
89
89
|
if (!trust)
|
|
90
|
-
return "
|
|
90
|
+
return "Trust signals missing; cannot judge arbitration independence";
|
|
91
91
|
if (trust.arbitration_independent === false) {
|
|
92
|
-
return "
|
|
92
|
+
return "Arbitrator and merchant are the same address; fairness is questionable";
|
|
93
93
|
}
|
|
94
|
-
return "
|
|
94
|
+
return "Arbitration is independent; fairness is assured";
|
|
95
95
|
},
|
|
96
96
|
},
|
|
97
97
|
pricing: {
|
|
98
98
|
scenario: "pricing",
|
|
99
|
-
merchant_tactic: "
|
|
100
|
-
user_strategy: "
|
|
101
|
-
nash_equilibrium: "
|
|
102
|
-
fallback: "
|
|
99
|
+
merchant_tactic: "Price is 20%+ above market average",
|
|
100
|
+
user_strategy: "Cite puzzle.market_context.avg_price in negotiation; request discount or Reward",
|
|
101
|
+
nash_equilibrium: "Merchant lowers price or provides Reward ↔ User purchases",
|
|
102
|
+
fallback: "Accept current price but request additional benefits",
|
|
103
103
|
confidence: (puzzle) => {
|
|
104
104
|
const market = puzzle.market_context;
|
|
105
105
|
if (!market)
|
|
@@ -111,16 +111,16 @@ const SCENARIO_SPECS = {
|
|
|
111
111
|
rationale: (puzzle) => {
|
|
112
112
|
const market = puzzle.market_context;
|
|
113
113
|
if (!market)
|
|
114
|
-
return "
|
|
115
|
-
return
|
|
114
|
+
return "Market context data missing";
|
|
115
|
+
return `Price is at the ${Math.round(market.price_percentile * 100)}th market percentile`;
|
|
116
116
|
},
|
|
117
117
|
},
|
|
118
118
|
delivery_sla: {
|
|
119
119
|
scenario: "delivery_sla",
|
|
120
|
-
merchant_tactic: "
|
|
121
|
-
user_strategy: "
|
|
122
|
-
nash_equilibrium: "
|
|
123
|
-
fallback: "
|
|
120
|
+
merchant_tactic: "No milestone nodes / no delivery time commitment",
|
|
121
|
+
user_strategy: "Require milestone nodes + write time commitment into WTS",
|
|
122
|
+
nash_equilibrium: "Merchant configures SLA ↔ User purchases",
|
|
123
|
+
fallback: "Accept but agree on timeline in writing via Messenger",
|
|
124
124
|
confidence: (puzzle) => {
|
|
125
125
|
const wf = puzzle.workflow_analysis;
|
|
126
126
|
if (!wf)
|
|
@@ -132,18 +132,18 @@ const SCENARIO_SPECS = {
|
|
|
132
132
|
rationale: (puzzle) => {
|
|
133
133
|
const wf = puzzle.workflow_analysis;
|
|
134
134
|
if (!wf)
|
|
135
|
-
return "
|
|
135
|
+
return "Workflow structure missing; cannot assess milestones";
|
|
136
136
|
if (wf.has_milestone_nodes === false)
|
|
137
|
-
return "
|
|
138
|
-
return "
|
|
137
|
+
return "No milestone nodes detected";
|
|
138
|
+
return "Milestone nodes are configured";
|
|
139
139
|
},
|
|
140
140
|
},
|
|
141
141
|
quality_verification: {
|
|
142
142
|
scenario: "quality_verification",
|
|
143
|
-
merchant_tactic: "WIP hash
|
|
144
|
-
user_strategy: "
|
|
145
|
-
nash_equilibrium: "
|
|
146
|
-
fallback: "
|
|
143
|
+
merchant_tactic: "WIP hash not verified",
|
|
144
|
+
user_strategy: "Require WIP hash verification; request samples or phased delivery evidence",
|
|
145
|
+
nash_equilibrium: "Merchant provides WIP verification ↔ User purchases",
|
|
146
|
+
fallback: "Request samples via Messenger",
|
|
147
147
|
confidence: (puzzle) => {
|
|
148
148
|
const basics = puzzle.service_basics;
|
|
149
149
|
if (basics.wip_verified === false)
|
|
@@ -153,16 +153,16 @@ const SCENARIO_SPECS = {
|
|
|
153
153
|
rationale: (puzzle) => {
|
|
154
154
|
const basics = puzzle.service_basics;
|
|
155
155
|
if (basics.wip_verified === false)
|
|
156
|
-
return "WIP hash
|
|
157
|
-
return "WIP hash
|
|
156
|
+
return "WIP hash is unverified; deliverables may have been tampered with";
|
|
157
|
+
return "WIP hash is verified";
|
|
158
158
|
},
|
|
159
159
|
},
|
|
160
160
|
after_sales: {
|
|
161
161
|
scenario: "after_sales",
|
|
162
|
-
merchant_tactic: "
|
|
163
|
-
user_strategy: "
|
|
164
|
-
nash_equilibrium: "
|
|
165
|
-
fallback: "
|
|
162
|
+
merchant_tactic: "No Messenger or post-sale support",
|
|
163
|
+
user_strategy: "Require Messenger to be configured; require post-sale terms to be written down",
|
|
164
|
+
nash_equilibrium: "Merchant provides post-sale channel ↔ User purchases",
|
|
165
|
+
fallback: "Use Contact channel as a substitute",
|
|
166
166
|
confidence: (puzzle) => {
|
|
167
167
|
const trust = puzzle.trust_signals;
|
|
168
168
|
if (!trust)
|
|
@@ -174,10 +174,10 @@ const SCENARIO_SPECS = {
|
|
|
174
174
|
rationale: (puzzle) => {
|
|
175
175
|
const trust = puzzle.trust_signals;
|
|
176
176
|
if (!trust)
|
|
177
|
-
return "
|
|
177
|
+
return "Trust signals missing; cannot confirm Messenger";
|
|
178
178
|
if (trust.has_messenger === false)
|
|
179
|
-
return "
|
|
180
|
-
return "
|
|
179
|
+
return "Messenger is not configured; no post-sale channel";
|
|
180
|
+
return "Messenger is configured";
|
|
181
181
|
},
|
|
182
182
|
},
|
|
183
183
|
};
|
|
@@ -233,22 +233,22 @@ export function flowMigrationStrategy(puzzle) {
|
|
|
233
233
|
const wf = puzzle.workflow_analysis;
|
|
234
234
|
if (!wf || wf.machine_published === false) {
|
|
235
235
|
return {
|
|
236
|
-
strategy: "Machine
|
|
236
|
+
strategy: "Machine is not published; strongly recommend requiring the merchant to publish before ordering",
|
|
237
237
|
risk: "high",
|
|
238
|
-
advice: "Machine
|
|
238
|
+
advice: "An unpublished Machine means the workflow is not yet in effect; after ordering, the order may not advance along the expected path. Suggest asking the merchant via Messenger to publish the Machine before placing the order.",
|
|
239
239
|
};
|
|
240
240
|
}
|
|
241
241
|
if (wf.machine_paused === true) {
|
|
242
242
|
return {
|
|
243
|
-
strategy: "Machine
|
|
243
|
+
strategy: "Machine is paused; confirm the reason before ordering",
|
|
244
244
|
risk: "medium",
|
|
245
|
-
advice: "Machine
|
|
245
|
+
advice: "The Machine has been paused by the merchant; it may be temporary maintenance or an active delisting. Suggest asking the merchant via Messenger about the reason and confirming the resumption time before ordering.",
|
|
246
246
|
};
|
|
247
247
|
}
|
|
248
248
|
return {
|
|
249
|
-
strategy: "
|
|
249
|
+
strategy: "Safe to order; workflow is stable",
|
|
250
250
|
risk: "low",
|
|
251
|
-
advice: "Machine
|
|
251
|
+
advice: "The Machine is published and not paused; the workflow is active and it is safe to order. Still recommend monitoring progress via Progress nodes after ordering.",
|
|
252
252
|
};
|
|
253
253
|
}
|
|
254
254
|
export function repeatGameStrategy(puzzle, history) {
|
|
@@ -259,26 +259,26 @@ export function repeatGameStrategy(puzzle, history) {
|
|
|
259
259
|
? Math.round((history.disputes / history.completed) * 100)
|
|
260
260
|
: 0;
|
|
261
261
|
return {
|
|
262
|
-
strategy: "
|
|
262
|
+
strategy: "Long-term trust established; consider bulk ordering / discount negotiation",
|
|
263
263
|
is_long_term_partner: true,
|
|
264
|
-
advice:
|
|
265
|
-
"
|
|
264
|
+
advice: `Historical completed orders: ${history.completed}, dispute rate: ${disputeRate}%, trust level is high. ` +
|
|
265
|
+
"Consider bulk ordering to negotiate discounts, or negotiate a long-term cooperation agreement. Still recommend keeping WTS evidence for future rights protection.",
|
|
266
266
|
};
|
|
267
267
|
}
|
|
268
268
|
if (history.completed < 5) {
|
|
269
269
|
return {
|
|
270
|
-
strategy: "
|
|
270
|
+
strategy: "First-time cooperation; recommend a small test order before scaling up once trust is established",
|
|
271
271
|
is_long_term_partner: false,
|
|
272
|
-
advice:
|
|
273
|
-
"
|
|
274
|
-
"
|
|
272
|
+
advice: `Only ${history.completed} historical order(s); sample is insufficient to judge long-term trust. ` +
|
|
273
|
+
"Recommend testing the merchant's fulfillment and communication efficiency with a small order first, " +
|
|
274
|
+
"and scaling up once trust is accumulated. Focus on refund path and arbitration configuration.",
|
|
275
275
|
};
|
|
276
276
|
}
|
|
277
277
|
const disputeRate = Math.round((history.disputes / history.completed) * 100);
|
|
278
278
|
return {
|
|
279
|
-
strategy: "
|
|
279
|
+
strategy: "Historical dispute rate is high; recommend ordering with caution and strengthening risk safeguards",
|
|
280
280
|
is_long_term_partner: false,
|
|
281
|
-
advice:
|
|
281
|
+
advice: `Among ${history.completed} historical orders, the dispute rate of ${disputeRate}% is high. Recommend requiring the merchant to top up the compensation fund, write terms into the WTS agreement, and strengthen upfront arbitration clauses for this order.`,
|
|
282
282
|
};
|
|
283
283
|
}
|
|
284
284
|
export function rightsProtectionStrategy(puzzle, prefs) {
|
|
@@ -290,56 +290,56 @@ export function rightsProtectionStrategy(puzzle, prefs) {
|
|
|
290
290
|
const arbIndependent = puzzle.trust_signals?.arbitration_independent ?? true;
|
|
291
291
|
const compensationRatio = puzzle.fund_safety?.compensation_ratio ?? 0;
|
|
292
292
|
if (!hasRefundPath) {
|
|
293
|
-
required.push("
|
|
293
|
+
required.push("Require the merchant to configure a refund Allocator (100%→Order)");
|
|
294
294
|
}
|
|
295
295
|
else {
|
|
296
|
-
required.push("
|
|
296
|
+
required.push("Confirm the refund path is available");
|
|
297
297
|
}
|
|
298
298
|
if (!hasArbPath) {
|
|
299
|
-
required.push("
|
|
299
|
+
required.push("Require the merchant to bind a third-party arbitration service");
|
|
300
300
|
}
|
|
301
301
|
else if (!arbIndependent) {
|
|
302
|
-
required.push("
|
|
302
|
+
required.push("Require the merchant to switch to third-party arbitration (currently self-built arbitration)");
|
|
303
303
|
}
|
|
304
304
|
else {
|
|
305
|
-
required.push("
|
|
305
|
+
required.push("Confirm the arbitration path is available");
|
|
306
306
|
}
|
|
307
307
|
if (compensationRatio < 1) {
|
|
308
|
-
required.push(
|
|
308
|
+
required.push(`Require the merchant to top up the compensation fund to 100% of the order amount (currently covers ${Math.round(compensationRatio * 100)}%)`);
|
|
309
309
|
}
|
|
310
310
|
else {
|
|
311
|
-
required.push("
|
|
311
|
+
required.push("Confirm the compensation fund is sufficient");
|
|
312
312
|
}
|
|
313
313
|
if (prefs?.require_arbitration && !hasArbPath) {
|
|
314
|
-
required.push("
|
|
314
|
+
required.push("User preference requires mandatory arbitration");
|
|
315
315
|
}
|
|
316
316
|
if (prefs?.require_compensation_fund && compensationRatio < 1) {
|
|
317
|
-
required.push("
|
|
317
|
+
required.push("User preference requires a mandatory compensation fund");
|
|
318
318
|
}
|
|
319
|
-
negotiable.push("
|
|
320
|
-
negotiable.push("
|
|
321
|
-
negotiable.push("Reward
|
|
319
|
+
negotiable.push("Price (negotiate based on market average)");
|
|
320
|
+
negotiable.push("Delivery time (agree in writing via Messenger)");
|
|
321
|
+
negotiable.push("Reward or discount (based on puzzle.market_context)");
|
|
322
322
|
if (prefs) {
|
|
323
323
|
if (prefs.bargain_hunting > 0.5) {
|
|
324
|
-
negotiable.push("
|
|
324
|
+
negotiable.push("Additional discount (user has a strong bargain-hunting tendency)");
|
|
325
325
|
}
|
|
326
326
|
if (prefs.reward_seeking) {
|
|
327
|
-
negotiable.push("Reward
|
|
327
|
+
negotiable.push("Reward incentive terms");
|
|
328
328
|
}
|
|
329
329
|
if (prefs.delivery_speed_priority === "urgent") {
|
|
330
|
-
negotiable.push("
|
|
330
|
+
negotiable.push("Expedited delivery commitment");
|
|
331
331
|
}
|
|
332
332
|
}
|
|
333
333
|
if (!hasArbPath && !hasRefundPath) {
|
|
334
|
-
red_lines.push("
|
|
334
|
+
red_lines.push("No arbitration and no refund path: the merchant can breach at will, funds are unprotected; recommend not purchasing");
|
|
335
335
|
}
|
|
336
336
|
if (compensationRatio < 0.5) {
|
|
337
|
-
red_lines.push(
|
|
337
|
+
red_lines.push(`Compensation fund coverage is only ${Math.round(compensationRatio * 100)}% (<50%): payout is severely insufficient if the order fails; recommend not purchasing`);
|
|
338
338
|
}
|
|
339
339
|
if (prefs) {
|
|
340
340
|
const trustScore = puzzle.trust_signals?.trust_score ?? 100;
|
|
341
341
|
if (trustScore < prefs.min_trust_score) {
|
|
342
|
-
red_lines.push(
|
|
342
|
+
red_lines.push(`Composite trust score ${trustScore} is below the user's minimum requirement of ${prefs.min_trust_score}`);
|
|
343
343
|
}
|
|
344
344
|
}
|
|
345
345
|
return {
|
|
@@ -360,12 +360,12 @@ function applyPrefsToFallback(scenario, defaultFallback, prefs) {
|
|
|
360
360
|
return defaultFallback;
|
|
361
361
|
if (prefs.risk_appetite === "conservative") {
|
|
362
362
|
if (scenario === "arbitration_fairness" || scenario === "fund_safety") {
|
|
363
|
-
return "
|
|
363
|
+
return "Abandon purchase (conservative user)";
|
|
364
364
|
}
|
|
365
365
|
}
|
|
366
366
|
if (prefs.risk_appetite === "aggressive") {
|
|
367
367
|
if (scenario === "pricing") {
|
|
368
|
-
return "
|
|
368
|
+
return "Accept current price but request additional Reward or discount";
|
|
369
369
|
}
|
|
370
370
|
}
|
|
371
371
|
return defaultFallback;
|