@wowok/agent-mcp 2.6.8 → 2.6.9

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 (53) hide show
  1. package/dist/customer/customer-advice.js +1 -0
  2. package/dist/customer/info-puzzle.js +1 -0
  3. package/dist/customer/reminder-system.d.ts +1 -0
  4. package/dist/customer/reminder-system.js +20 -0
  5. package/dist/customer/types.d.ts +1 -0
  6. package/dist/examples/{insurance-machine-create-publish.json → insurance-machine-create.json} +9 -9
  7. package/dist/examples/insurance-service-allocators.json +55 -0
  8. package/dist/examples/machine-publish.json +30 -0
  9. package/dist/examples/rental-ziroom-service-create.json +12 -64
  10. package/dist/examples/retail-myshop-service-create.json +14 -64
  11. package/dist/examples/retail-myshop-service-customer-required.json +31 -0
  12. package/dist/examples/threebody-machine-create.json +9 -10
  13. package/dist/examples/threebody-service-allocators.json +3 -4
  14. package/dist/examples/travel-machine-create.json +9 -10
  15. package/dist/examples/travel-service-create.json +11 -79
  16. package/dist/harness/index.d.ts +6 -1
  17. package/dist/harness/index.js +4 -1
  18. package/dist/harness/plan.d.ts +13 -0
  19. package/dist/harness/plan.js +24 -0
  20. package/dist/harness/recover.js +2 -2
  21. package/dist/index.js +10 -0
  22. package/dist/project/context-assembly.d.ts +9 -0
  23. package/dist/project/context-assembly.js +122 -6
  24. package/dist/project/graph-builder.d.ts +6 -1
  25. package/dist/project/graph-builder.js +1 -1
  26. package/dist/project/handlers.d.ts +1 -0
  27. package/dist/project/handlers.js +22 -9
  28. package/dist/schema/call/allocation.js +1 -1
  29. package/dist/schema/call/payment.d.ts +11 -11
  30. package/dist/schema/call/payment.js +5 -3
  31. package/dist/schema/call/semantic.js +10 -1
  32. package/dist/schema/call/service.d.ts +6 -6
  33. package/dist/schema/call/service.js +14 -3
  34. package/dist/schema/operations.d.ts +11 -11
  35. package/dist/schema/project/index.d.ts +105 -0
  36. package/dist/schema/project/index.js +53 -0
  37. package/dist/schema/query/index.d.ts +571 -0
  38. package/dist/schema/query/index.js +42 -1
  39. package/dist/schema/sync-layer4.js +25 -4
  40. package/dist/schemas/index.json +1 -1
  41. package/dist/schemas/onchain_operations.schema.json +7 -8
  42. package/dist/schemas/onchain_operations_allocation.schema.json +1 -1
  43. package/dist/schemas/onchain_operations_payment.schema.json +3 -4
  44. package/dist/schemas/onchain_operations_service.schema.json +3 -3
  45. package/dist/schemas/project_operation.output.json +79 -0
  46. package/dist/schemas/project_operation.schema.json +13 -0
  47. package/dist/schemas/query_toolkit.output.json +39 -1
  48. package/dist/schemas/wowok_buildin_info.output.json +132 -0
  49. package/dist/schemas/wowok_buildin_info.schema.json +14 -0
  50. package/dist/tools/handlers/onchain.js +94 -4
  51. package/dist/tools/index.js +3 -3
  52. package/package.json +2 -2
  53. package/dist/examples/insurance-service-allocators-publish.json +0 -56
@@ -1369,6 +1369,29 @@ export const BridgeTokenInfoSchema = z.object({
1369
1369
  evmChains: z.array(z.number()).optional().describe('Bridge protocol chain IDs where this token is available (e.g. 10 = ETH mainnet)'),
1370
1370
  description: z.string().optional().describe('Token description'),
1371
1371
  }).describe('Mainnet Bridge token info');
1372
+ export const FundingGuidanceSchema = z.object({
1373
+ overview: z.string().describe('Overview of how to obtain WOW gas and payment tokens'),
1374
+ testnet: z.object({
1375
+ token: z.string().describe('Testnet token (WOW)'),
1376
+ method: z.literal('faucet').describe('Testnet funding method (faucet)'),
1377
+ faucet_url: z.string().describe('Testnet faucet URL'),
1378
+ note: z.string().describe('Testnet funding note: all merchant/order testing can use WOW'),
1379
+ }),
1380
+ mainnet: z.object({
1381
+ method: z.literal('eth_bridge').describe('Mainnet funding method (ETH mainnet cross-chain bridge)'),
1382
+ supported_tokens: z.array(z.string()).describe('Tokens supported by the mainnet bridge (ETH/USDT/USDC/WBTC)'),
1383
+ steps: z.array(z.string()).describe('Step-by-step mainnet funding flow: query active EVM account → transfer from external wallet → confirm balance → cross-chain to WOW'),
1384
+ }),
1385
+ airdrop: z.object({
1386
+ url: z.string().describe('WOW mainnet airdrop URL'),
1387
+ status: z.string().describe('Airdrop status (under construction)'),
1388
+ }),
1389
+ payment_token: z.object({
1390
+ testnet_default: z.string().describe('Default testnet payment token (WOW)'),
1391
+ mainnet_option: z.string().describe('Mainnet payment token option (USDT and other stablecoins)'),
1392
+ migration_note: z.string().describe('Guidance: ask whether to switch payment token when migrating testnet → mainnet'),
1393
+ }),
1394
+ }).describe('Funding guidance — how to obtain WOW gas and payment tokens (testnet faucet / mainnet bridge / airdrop). This is the first-step guidance for new users.');
1372
1395
  export const ProtocolInfoQuerySchema = z.discriminatedUnion('info', [
1373
1396
  z.object({
1374
1397
  info: z.literal('constants')
@@ -1393,7 +1416,10 @@ export const ProtocolInfoQuerySchema = z.discriminatedUnion('info', [
1393
1416
  }).strict().describe('Value types query - returns all supported value types with their numeric and string representations'),
1394
1417
  z.object({
1395
1418
  info: z.literal('mainnet bridge tokens')
1396
- }).strict().describe('Mainnet Bridge tokens query - returns all tokens deployed on the mainnet bridge with their symbol, WOW-side type tag, EVM address, decimals, and description')
1419
+ }).strict().describe('Mainnet Bridge tokens query - returns all tokens deployed on the mainnet bridge with their symbol, WOW-side type tag, EVM address, decimals, and description'),
1420
+ z.object({
1421
+ info: z.literal('funding guidance')
1422
+ }).strict().describe('Funding guidance query - how to obtain WOW gas and payment tokens. Returns testnet faucet info, mainnet ETH cross-chain bridge flow, and the WOW mainnet airdrop link. Use this when a user asks how to obtain tokens/gas/funds, or as a proactive first-use reminder.')
1397
1423
  ]).describe('WoWok Build-in infomation query');
1398
1424
  export const BuiltinPermissionSchema = z.object({
1399
1425
  result: z.array(PermissionInfoTypeSchema).describe('Built-in permissions result')
@@ -1426,6 +1452,10 @@ export const ProtocolInfoResultWrappedSchema = z.discriminatedUnion('info', [
1426
1452
  z.object({
1427
1453
  info: z.literal('mainnet bridge tokens'),
1428
1454
  result: z.array(BridgeTokenInfoSchema).describe('Mainnet Bridge tokens result - each item contains tokenId, symbol, wowTypeTag, evmAddress, evmDecimals, wowDecimals, evmChains, and description')
1455
+ }),
1456
+ z.object({
1457
+ info: z.literal('funding guidance'),
1458
+ result: FundingGuidanceSchema.describe('Funding guidance result - testnet faucet / mainnet bridge / airdrop / payment-token guidance')
1429
1459
  })
1430
1460
  ]).describe('Protocol info result');
1431
1461
  export const ProtocolInfoResultSchema = z.object({
@@ -1467,6 +1497,14 @@ export const TxBalanceChangeSchema = z.object({
1467
1497
  coin_type: z.string().describe("Coin type (e.g. 0x2::wow::WOW)"),
1468
1498
  amount: z.string().describe("Amount changed (signed string, positive=incoming, negative=outgoing)"),
1469
1499
  }).strict().describe("Balance change within a transaction");
1500
+ export const TxEventSchema = z.object({
1501
+ type: z.string().describe("Fully-qualified event type (e.g. 0x2::progress::ProgressEvent)"),
1502
+ package_id: z.string().optional().describe("Package that declared the event module"),
1503
+ module: z.string().optional().describe("Module name that emitted the event"),
1504
+ sender: z.string().optional().describe("Sender of the emitting transaction"),
1505
+ parsed_json: z.unknown().optional().describe("Parsed JSON payload of the event (Move struct fields)"),
1506
+ bcs: z.string().optional().describe("Raw BCS bytes of the event (base64)"),
1507
+ }).strict().describe("Event emitted by a transaction");
1470
1508
  export const TransactionDetailSchema = z.object({
1471
1509
  digest: z.string().describe("Transaction digest (0x...)"),
1472
1510
  status: z.enum(["success", "failed"]).describe("Transaction execution status"),
@@ -1479,6 +1517,9 @@ export const TransactionDetailSchema = z.object({
1479
1517
  object_changes: z.array(TxObjectChangeSchema).describe("Object changes (created/mutated/deleted)"),
1480
1518
  balance_changes: z.array(TxBalanceChangeSchema).describe("Balance changes for all involved owners"),
1481
1519
  event_count: z.number().describe("Number of events emitted by this transaction"),
1520
+ events: z.array(TxEventSchema).describe("Events emitted by the transaction. Always populated by query_transaction (showEvents=true). " +
1521
+ "Each event carries its Move struct payload (parsed_json) so callers can inspect " +
1522
+ "ProgressEvent, NewOrderEvent, ArbEvent, etc. without an extra query."),
1482
1523
  epoch: z.string().optional().describe("Epoch number when the transaction was executed"),
1483
1524
  is_system_tx: z.boolean().optional().describe("Whether this was a system transaction"),
1484
1525
  cache_expire: z.union([z.number(), z.literal("INFINITE")]).optional().describe("Cache expiration timestamp"),
@@ -22,6 +22,7 @@ export const TOOLS_17 = [
22
22
  'trust_score',
23
23
  ];
24
24
  const JSON_SCHEMA_DRAFT7 = 'http://json-schema.org/draft-07/schema#';
25
+ const RECURSIVE_EXTERNAL_FILES = new Set(['guard-node-schema.json']);
25
26
  function createExternalFileCache() {
26
27
  return new Map();
27
28
  }
@@ -70,18 +71,37 @@ function resolveRefTarget(ref, root, layer3Dir, cache) {
70
71
  }
71
72
  return target;
72
73
  }
73
- function resolveRefs(node, root, layer3Dir, cache, seen = new Set()) {
74
+ function resolveRefs(node, root, layer3Dir, cache, seen = new Set(), memo = new Map()) {
74
75
  if (node === null || typeof node !== 'object') {
75
76
  return node;
76
77
  }
77
78
  if (Array.isArray(node)) {
78
- return node.map((item) => resolveRefs(item, root, layer3Dir, cache, seen));
79
+ return node.map((item) => resolveRefs(item, root, layer3Dir, cache, seen, memo));
79
80
  }
80
81
  if (typeof node.$ref === 'string') {
81
82
  const ref = node.$ref;
83
+ if (!ref.startsWith('#') && RECURSIVE_EXTERNAL_FILES.has(ref.split('#', 2)[0])) {
84
+ return {
85
+ type: 'object',
86
+ additionalProperties: true,
87
+ description: 'Recursive GuardNode computational tree (55 self-referential node types). ' +
88
+ 'NOT inlined here to avoid exponential schema bloat. ' +
89
+ "Use schema_query (e.g. action='get' name='onchain_operations_guard') or read guard-node-schema.json " +
90
+ 'for the complete node definitions. Key node families: identifier / query / context / ' +
91
+ 'logic_* / calc_* / convert_* / vec_* / query_progress_* / query_reward_*.',
92
+ };
93
+ }
82
94
  if (seen.has(ref)) {
83
95
  return { $ref: ref, description: node.description };
84
96
  }
97
+ if (memo.has(ref)) {
98
+ const cached = memo.get(ref);
99
+ const copy = JSON.parse(JSON.stringify(cached));
100
+ if (node.description && !copy.description) {
101
+ copy.description = node.description;
102
+ }
103
+ return copy;
104
+ }
85
105
  const target = resolveRefTarget(ref, root, layer3Dir, cache);
86
106
  if (target === undefined || target === null) {
87
107
  throw new Error(`Cannot resolve $ref target: ${ref}`);
@@ -91,15 +111,16 @@ function resolveRefs(node, root, layer3Dir, cache, seen = new Set()) {
91
111
  const externalRoot = ref.startsWith('#')
92
112
  ? root
93
113
  : loadExternalFile(ref.split('#', 2)[0], layer3Dir, cache);
94
- const resolved = resolveRefs(target, externalRoot, layer3Dir, cache, nextSeen);
114
+ const resolved = resolveRefs(target, externalRoot, layer3Dir, cache, nextSeen, memo);
95
115
  if (node.description && !resolved.description) {
96
116
  resolved.description = node.description;
97
117
  }
118
+ memo.set(ref, resolved);
98
119
  return resolved;
99
120
  }
100
121
  const result = {};
101
122
  for (const [key, value] of Object.entries(node)) {
102
- result[key] = resolveRefs(value, root, layer3Dir, cache, seen);
123
+ result[key] = resolveRefs(value, root, layer3Dir, cache, seen, memo);
103
124
  }
104
125
  return result;
105
126
  }
@@ -2,7 +2,7 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "title": "WoWok MCP Schema Index",
4
4
  "description": "Index of all available JSON schemas for WoWok MCP tools",
5
- "generatedAt": "2026-08-10T12:46:37.677Z",
5
+ "generatedAt": "2026-08-15T01:29:23.265Z",
6
6
  "tools": [
7
7
  {
8
8
  "name": "onchain_operations",
@@ -1988,7 +1988,7 @@
1988
1988
  },
1989
1989
  "order_required_info": {
1990
1990
  "type": "string",
1991
- "description": "Contact object ID or WTS Proof object"
1991
+ "description": "Contact object ID or WTS Proof object, recorded on the Order as proof that the order holder delivered the required private information (service.customer_required) to the merchant. FLOW: when a Service declares customer_required (e.g. phone/email/shipping_address), the order holder MUST send that private information to the Service's Contact (um) via end-to-end encrypted Messenger, then pass the Contact object ID or the generated WTS Proof here so the delivery is verifiable on-chain."
1992
1992
  },
1993
1993
  "transfer": {
1994
1994
  "$ref": "#/definitions/data_service/properties/order_new/properties/agents/properties/entities/items",
@@ -2339,7 +2339,7 @@
2339
2339
  "type": "string",
2340
2340
  "minLength": 1
2341
2341
  },
2342
- "description": "Customer required information. Such as phone, email, etc."
2342
+ "description": "Customer required information labels. Such as phone, email, shipping_address, etc. ⚠️ HARD LINKAGE (SDK-enforced): if customer_required is set (non-empty), the Service MUST also bind a Contact via `um` — otherwise the customer's private information cannot be delivered through end-to-end encrypted Messenger (which routes to the Contact bound as um). Set `um` together with customer_required."
2343
2343
  },
2344
2344
  "order_allocators": {
2345
2345
  "anyOf": [
@@ -2681,7 +2681,7 @@
2681
2681
  "type": "null"
2682
2682
  }
2683
2683
  ],
2684
- "description": "Contact object ID or name."
2684
+ "description": "Contact object ID or name — the Service's customer-service channel. This is the object that Messenger routes encrypted messages to for pre-order negotiation, private-info delivery (see customer_required), and post-sale support. ⚠️ REQUIRED whenever customer_required is set: without um, the customer's private information has no channel to reach the merchant."
2685
2685
  },
2686
2686
  "pause": {
2687
2687
  "type": "boolean",
@@ -6929,7 +6929,7 @@
6929
6929
  },
6930
6930
  "alloc_by_guard": {
6931
6931
  "$ref": "#/definitions/data_allocation/anyOf/0/properties/allocators/properties/allocators/items/properties/sharing/items/properties/who/anyOf/1/properties/Entity/properties/name_or_address",
6932
- "description": "Verify the specified Guard and execute the corresponding fund allocation. POST-ALLOCATION CLAIM (required step): each recipient receives a CoinWrapper object (NOT spendable coins). Recipient address resolution (allocation.move): Entity recipients receive it at the Entity's address; Signer recipients receive it at the transaction sender's address; GuardIdentifier n recipients receive it at the ADDRESS SUBMITTED for identifier n in this call's submission (resolved via passport::submission_get) — conventionally the Order OBJECT address (escrow pattern), in which case the order owner claims it via operation_type='order' {object:'<order_id>', receive:'recently'}. Claim paths by holder: EOA wallet → operation_type='payment' RECEIVE mode {object:'<coinwrapper_id>', receive:true, type_parameter:'0x2::wow::WOW'}; Order object → order receive; Treasury object → treasury receive. Find pending CoinWrappers via query_toolkit query_type='onchain_received'. Verify the distribution via the immutable Payment object created by this call (allocation.payment array)."
6932
+ "description": "Verify the specified Guard and execute the corresponding fund allocation. POST-ALLOCATION CLAIM (required step): each recipient receives a CoinWrapper object (NOT spendable coins). Recipient address resolution (allocation.move): Entity recipients receive it at the Entity's address; Signer recipients receive it at the transaction sender's address; GuardIdentifier n recipients receive it at the ADDRESS SUBMITTED for identifier n in this call's submission (resolved via passport::submission_get) — conventionally the Order OBJECT address (escrow pattern), in which case the order owner claims it via operation_type='order' {object:'<order_id>', receive:'recently'}. Claim paths by holder: EOA wallet → operation_type='payment' RECEIVE mode {object:'<coinwrapper_id>', receive:true} (type_parameter optional, auto-derived from the CoinWrapper type); Order object → order receive; Treasury object → treasury receive. Find pending CoinWrappers via query_toolkit query_type='onchain_received'. Verify the distribution via the immutable Payment object created by this call (allocation.payment array)."
6933
6933
  }
6934
6934
  },
6935
6935
  "required": [
@@ -8938,19 +8938,18 @@
8938
8938
  },
8939
8939
  "type_parameter": {
8940
8940
  "type": "string",
8941
- "description": "Coin type of the CoinWrapper, e.g. '0x2::wow::WOW'. Must match the type used when the Allocation created the Payment."
8941
+ "description": "Coin type of the CoinWrapper, e.g. '0x2::wow::WOW'. OPTIONAL: when omitted it is auto-derived from the CoinWrapper's own on-chain type (the inner T of `CoinWrapper<T>`), so {object, receive:true} alone unwraps to spendable coins. Only provide it explicitly when auto-derivation fails."
8942
8942
  }
8943
8943
  },
8944
8944
  "required": [
8945
8945
  "object",
8946
- "receive",
8947
- "type_parameter"
8946
+ "receive"
8948
8947
  ],
8949
8948
  "additionalProperties": false,
8950
8949
  "description": "Receive mode: unwrap a CoinWrapper to the caller's wallet. Use after Allocation's alloc_by_guard creates a Payment with your address as a revenue recipient. The CoinWrapper holds your share — call this to convert it to actual coins in your wallet."
8951
8950
  }
8952
8951
  ],
8953
- "description": "On-chain Payment operations. TWO modes:\n(1) CREATE: Set 'object' with {name, type_parameter, ...}, 'revenue', and 'info' to create a new Payment.\n(2) RECEIVE: Set {object: '<coinwrapper_id_or_name>', receive: true, type_parameter: '0x2::wow::WOW'} to unwrap a CoinWrapper to your wallet.\nThe 'object' field is CRITICAL and REQUIRED in both modes. STRING for receive (CoinWrapper ID/name), OBJECT for create."
8952
+ "description": "On-chain Payment operations. TWO modes:\n(1) CREATE: Set 'object' with {name, type_parameter, ...}, 'revenue', and 'info' to create a new Payment.\n(2) RECEIVE: Set {object: '<coinwrapper_id_or_name>', receive: true} to unwrap a CoinWrapper to your wallet (type_parameter optional — auto-derived from the CoinWrapper's type).\nThe 'object' field is CRITICAL and REQUIRED in both modes. STRING for receive (CoinWrapper ID/name), OBJECT for create."
8954
8953
  },
8955
8954
  "data_demand": {
8956
8955
  "type": "object",
@@ -361,7 +361,7 @@
361
361
  },
362
362
  "alloc_by_guard": {
363
363
  "$ref": "#/definitions/data/anyOf/0/properties/allocators/properties/allocators/items/properties/sharing/items/properties/who/anyOf/1/properties/Entity/properties/name_or_address",
364
- "description": "Verify the specified Guard and execute the corresponding fund allocation. POST-ALLOCATION CLAIM (required step): each recipient receives a CoinWrapper object (NOT spendable coins). Recipient address resolution (allocation.move): Entity recipients receive it at the Entity's address; Signer recipients receive it at the transaction sender's address; GuardIdentifier n recipients receive it at the ADDRESS SUBMITTED for identifier n in this call's submission (resolved via passport::submission_get) — conventionally the Order OBJECT address (escrow pattern), in which case the order owner claims it via operation_type='order' {object:'<order_id>', receive:'recently'}. Claim paths by holder: EOA wallet → operation_type='payment' RECEIVE mode {object:'<coinwrapper_id>', receive:true, type_parameter:'0x2::wow::WOW'}; Order object → order receive; Treasury object → treasury receive. Find pending CoinWrappers via query_toolkit query_type='onchain_received'. Verify the distribution via the immutable Payment object created by this call (allocation.payment array)."
364
+ "description": "Verify the specified Guard and execute the corresponding fund allocation. POST-ALLOCATION CLAIM (required step): each recipient receives a CoinWrapper object (NOT spendable coins). Recipient address resolution (allocation.move): Entity recipients receive it at the Entity's address; Signer recipients receive it at the transaction sender's address; GuardIdentifier n recipients receive it at the ADDRESS SUBMITTED for identifier n in this call's submission (resolved via passport::submission_get) — conventionally the Order OBJECT address (escrow pattern), in which case the order owner claims it via operation_type='order' {object:'<order_id>', receive:'recently'}. Claim paths by holder: EOA wallet → operation_type='payment' RECEIVE mode {object:'<coinwrapper_id>', receive:true} (type_parameter optional, auto-derived from the CoinWrapper type); Order object → order receive; Treasury object → treasury receive. Find pending CoinWrappers via query_toolkit query_type='onchain_received'. Verify the distribution via the immutable Payment object created by this call (allocation.payment array)."
365
365
  }
366
366
  },
367
367
  "required": [
@@ -182,19 +182,18 @@
182
182
  },
183
183
  "type_parameter": {
184
184
  "type": "string",
185
- "description": "Coin type of the CoinWrapper, e.g. '0x2::wow::WOW'. Must match the type used when the Allocation created the Payment."
185
+ "description": "Coin type of the CoinWrapper, e.g. '0x2::wow::WOW'. OPTIONAL: when omitted it is auto-derived from the CoinWrapper's own on-chain type (the inner T of `CoinWrapper<T>`), so {object, receive:true} alone unwraps to spendable coins. Only provide it explicitly when auto-derivation fails."
186
186
  }
187
187
  },
188
188
  "required": [
189
189
  "object",
190
- "receive",
191
- "type_parameter"
190
+ "receive"
192
191
  ],
193
192
  "additionalProperties": false,
194
193
  "description": "Receive mode: unwrap a CoinWrapper to the caller's wallet. Use after Allocation's alloc_by_guard creates a Payment with your address as a revenue recipient. The CoinWrapper holds your share — call this to convert it to actual coins in your wallet."
195
194
  }
196
195
  ],
197
- "description": "On-chain Payment operations. TWO modes:\n(1) CREATE: Set 'object' with {name, type_parameter, ...}, 'revenue', and 'info' to create a new Payment.\n(2) RECEIVE: Set {object: '<coinwrapper_id_or_name>', receive: true, type_parameter: '0x2::wow::WOW'} to unwrap a CoinWrapper to your wallet.\nThe 'object' field is CRITICAL and REQUIRED in both modes. STRING for receive (CoinWrapper ID/name), OBJECT for create."
196
+ "description": "On-chain Payment operations. TWO modes:\n(1) CREATE: Set 'object' with {name, type_parameter, ...}, 'revenue', and 'info' to create a new Payment.\n(2) RECEIVE: Set {object: '<coinwrapper_id_or_name>', receive: true} to unwrap a CoinWrapper to your wallet (type_parameter optional — auto-derived from the CoinWrapper's type).\nThe 'object' field is CRITICAL and REQUIRED in both modes. STRING for receive (CoinWrapper ID/name), OBJECT for create."
198
197
  },
199
198
  "env": {
200
199
  "type": "object",
@@ -225,7 +225,7 @@
225
225
  },
226
226
  "order_required_info": {
227
227
  "type": "string",
228
- "description": "Contact object ID or WTS Proof object"
228
+ "description": "Contact object ID or WTS Proof object, recorded on the Order as proof that the order holder delivered the required private information (service.customer_required) to the merchant. FLOW: when a Service declares customer_required (e.g. phone/email/shipping_address), the order holder MUST send that private information to the Service's Contact (um) via end-to-end encrypted Messenger, then pass the Contact object ID or the generated WTS Proof here so the delivery is verifiable on-chain."
229
229
  },
230
230
  "transfer": {
231
231
  "$ref": "#/definitions/data/properties/order_new/properties/agents/properties/entities/items",
@@ -576,7 +576,7 @@
576
576
  "type": "string",
577
577
  "minLength": 1
578
578
  },
579
- "description": "Customer required information. Such as phone, email, etc."
579
+ "description": "Customer required information labels. Such as phone, email, shipping_address, etc. ⚠️ HARD LINKAGE (SDK-enforced): if customer_required is set (non-empty), the Service MUST also bind a Contact via `um` — otherwise the customer's private information cannot be delivered through end-to-end encrypted Messenger (which routes to the Contact bound as um). Set `um` together with customer_required."
580
580
  },
581
581
  "order_allocators": {
582
582
  "anyOf": [
@@ -918,7 +918,7 @@
918
918
  "type": "null"
919
919
  }
920
920
  ],
921
- "description": "Contact object ID or name."
921
+ "description": "Contact object ID or name — the Service's customer-service channel. This is the object that Messenger routes encrypted messages to for pre-order negotiation, private-info delivery (see customer_required), and post-sale support. ⚠️ REQUIRED whenever customer_required is set: without um, the customer's private information has no channel to reach the merchant."
922
922
  },
923
923
  "pause": {
924
924
  "type": "boolean",
@@ -1878,6 +1878,49 @@
1878
1878
  "additionalProperties": {},
1879
1879
  "description": "Operation history extracted from object states — NOT from tx queries. Progress objects: session.forwards (who did what, when, accomplished). Order objects: disputes, claimed_by, progress_object. This is the CORRECT history source: convergent, no infinite recursion."
1880
1880
  },
1881
+ "dependencies": {
1882
+ "type": "array",
1883
+ "items": {
1884
+ "type": "object",
1885
+ "properties": {
1886
+ "object": {
1887
+ "type": "string",
1888
+ "description": "Discovered dependency object ID (0x...)."
1889
+ },
1890
+ "depth": {
1891
+ "type": "integer",
1892
+ "minimum": 1,
1893
+ "description": "BFS depth at which this dependency was discovered (1 = direct reference from a center object)."
1894
+ },
1895
+ "via_field": {
1896
+ "type": "string",
1897
+ "description": "Field name on the parent object that references this dependency (e.g. 'permission', 'machine', 'guard'). Matches extractAddressFields output."
1898
+ },
1899
+ "via_type": {
1900
+ "type": "string",
1901
+ "description": "Semantic edge type: 'bind' | 'validate' | 'consume' | 'trigger' | 'create'."
1902
+ },
1903
+ "parent": {
1904
+ "type": "string",
1905
+ "description": "Object ID of the parent that referenced this dependency."
1906
+ }
1907
+ },
1908
+ "required": [
1909
+ "object",
1910
+ "depth",
1911
+ "via_field",
1912
+ "via_type",
1913
+ "parent"
1914
+ ],
1915
+ "additionalProperties": false
1916
+ },
1917
+ "description": "Dependency edges discovered via BFS expansion (only when context_depth > 0). Each entry describes one outbound reference (parent → child) with the field name and semantic edge type. Use with dependency_objects to get the full states. Cycles are deduplicated — each object ID appears at most once at its shallowest depth."
1918
+ },
1919
+ "dependency_objects": {
1920
+ "type": "array",
1921
+ "items": {},
1922
+ "description": "Full on-chain states of the discovered dependency objects (only when context_depth > 0). Order matches `dependencies` when possible; safe to consume as an unordered set. Center objects are NOT repeated here — they live in `objects`."
1923
+ },
1881
1924
  "semantic_summary": {
1882
1925
  "description": "Business semantic annotations generated by buildDataSemantic — maps raw object fields to business-meaningful concepts for LLM consumption."
1883
1926
  },
@@ -3740,6 +3783,41 @@
3740
3783
  "type": "string",
3741
3784
  "description": "Explains that testnet/mainnet are different projects with different addresses for same names."
3742
3785
  },
3786
+ "payment_token_decision": {
3787
+ "type": "object",
3788
+ "properties": {
3789
+ "round": {
3790
+ "type": "string",
3791
+ "description": "Decision round identifier (e.g. 'M1')."
3792
+ },
3793
+ "question": {
3794
+ "type": "string",
3795
+ "description": "Question asking whether to keep WOW or switch to a stablecoin when migrating testnet → mainnet."
3796
+ },
3797
+ "options": {
3798
+ "type": "array",
3799
+ "items": {
3800
+ "type": "string"
3801
+ },
3802
+ "description": "Available choices (e.g. Keep WOW / Switch to USDT / Switch to USDC / Other stablecoin)."
3803
+ },
3804
+ "default": {
3805
+ "type": "string",
3806
+ "description": "Recommended default choice (Keep WOW)."
3807
+ },
3808
+ "note": {
3809
+ "type": "string",
3810
+ "description": "Guidance: mainnet stablecoins are available via the ETH mainnet cross-chain bridge; if switching, update Service/Treasury/Allocation type_parameter before publishing."
3811
+ }
3812
+ },
3813
+ "required": [
3814
+ "round",
3815
+ "question",
3816
+ "options"
3817
+ ],
3818
+ "additionalProperties": false,
3819
+ "description": "Payment-token migration decision. testnet recommends WOW; mainnet supports USDT and other stablecoins via the ETH mainnet bridge. Must be resolved BEFORE step 2 (on-chain deployment) because the Service/Treasury/Allocation type_parameter determines the payment token."
3820
+ },
3743
3821
  "migration_plan": {
3744
3822
  "type": "array",
3745
3823
  "items": {
@@ -3838,6 +3916,7 @@
3838
3916
  "source_project",
3839
3917
  "target_project",
3840
3918
  "key_principle",
3919
+ "payment_token_decision",
3841
3920
  "migration_plan",
3842
3921
  "summary"
3843
3922
  ],
@@ -86,6 +86,19 @@
86
86
  ],
87
87
  "description": "Network for assemble_context queries. Defaults to 'testnet' if omitted."
88
88
  },
89
+ "context_depth": {
90
+ "type": "integer",
91
+ "minimum": 0,
92
+ "maximum": 5,
93
+ "description": "BFS recursion depth for dependency expansion in assemble_context (default 0 = no expansion). When >0, the assembly recursively queries objects referenced by the center objects (permission, guard, machine, service, repositories, etc.) up to the given depth, using the same address-field extraction rules as build_graph (Pathway 1). Each level issues one batched query_objects call (≤50 IDs per batch). Cycles are detected and skipped via a visited set. Discovered dependencies are returned in `dependencies` (edge metadata) and `dependency_objects` (full object states). Recommended: 1–2 for most use cases; 3+ may pull large subgraphs (use context_include to constrain)."
94
+ },
95
+ "context_include": {
96
+ "type": "array",
97
+ "items": {
98
+ "type": "string"
99
+ },
100
+ "description": "Optional filter for dependency expansion edge types. When omitted, ALL outbound references are followed. When provided, only edges whose `field` matches one of the listed names are followed. Recognized field names (from extractAddressFields): 'permission', 'machine', 'service', 'progress', 'buy_guard', 'um', 'repositories', 'arbitrations', 'rewards', 'consensus_repositories', 'context_repositories', 'dispute', 'allocation', 'external_deposit_guard', 'external_withdraw_guard', 'allocator_guard', 'for_object', 'for_guard', 'payment', 'voting_guard', 'usage_guard', 'guard', 'write_guard', 'quote_guard', 'recipient_entity', 'order_allocators'. Example: ['permission','guard'] expands only permission/guard dependencies."
101
+ },
89
102
  "filter_status": {
90
103
  "type": "string",
91
104
  "enum": [
@@ -14396,6 +14396,43 @@
14396
14396
  "type": "number",
14397
14397
  "description": "Number of events emitted by this transaction"
14398
14398
  },
14399
+ "events": {
14400
+ "type": "array",
14401
+ "items": {
14402
+ "type": "object",
14403
+ "properties": {
14404
+ "type": {
14405
+ "type": "string",
14406
+ "description": "Fully-qualified event type (e.g. 0x2::progress::ProgressEvent)"
14407
+ },
14408
+ "package_id": {
14409
+ "type": "string",
14410
+ "description": "Package that declared the event module"
14411
+ },
14412
+ "module": {
14413
+ "type": "string",
14414
+ "description": "Module name that emitted the event"
14415
+ },
14416
+ "sender": {
14417
+ "type": "string",
14418
+ "description": "Sender of the emitting transaction"
14419
+ },
14420
+ "parsed_json": {
14421
+ "description": "Parsed JSON payload of the event (Move struct fields)"
14422
+ },
14423
+ "bcs": {
14424
+ "type": "string",
14425
+ "description": "Raw BCS bytes of the event (base64)"
14426
+ }
14427
+ },
14428
+ "required": [
14429
+ "type"
14430
+ ],
14431
+ "additionalProperties": false,
14432
+ "description": "Event emitted by a transaction"
14433
+ },
14434
+ "description": "Events emitted by the transaction. Always populated by query_transaction (showEvents=true). Each event carries its Move struct payload (parsed_json) so callers can inspect ProgressEvent, NewOrderEvent, ArbEvent, etc. without an extra query."
14435
+ },
14399
14436
  "epoch": {
14400
14437
  "type": "string",
14401
14438
  "description": "Epoch number when the transaction was executed"
@@ -14422,7 +14459,8 @@
14422
14459
  "status",
14423
14460
  "object_changes",
14424
14461
  "balance_changes",
14425
- "event_count"
14462
+ "event_count",
14463
+ "events"
14426
14464
  ],
14427
14465
  "additionalProperties": false,
14428
14466
  "description": "Full transaction detail — verifiable proof of an on-chain operation"
@@ -703,6 +703,138 @@
703
703
  "result"
704
704
  ],
705
705
  "additionalProperties": false
706
+ },
707
+ {
708
+ "type": "object",
709
+ "properties": {
710
+ "info": {
711
+ "type": "string",
712
+ "const": "funding guidance"
713
+ },
714
+ "result": {
715
+ "type": "object",
716
+ "properties": {
717
+ "overview": {
718
+ "type": "string",
719
+ "description": "Overview of how to obtain WOW gas and payment tokens"
720
+ },
721
+ "testnet": {
722
+ "type": "object",
723
+ "properties": {
724
+ "token": {
725
+ "type": "string",
726
+ "description": "Testnet token (WOW)"
727
+ },
728
+ "method": {
729
+ "type": "string",
730
+ "const": "faucet",
731
+ "description": "Testnet funding method (faucet)"
732
+ },
733
+ "faucet_url": {
734
+ "type": "string",
735
+ "description": "Testnet faucet URL"
736
+ },
737
+ "note": {
738
+ "type": "string",
739
+ "description": "Testnet funding note: all merchant/order testing can use WOW"
740
+ }
741
+ },
742
+ "required": [
743
+ "token",
744
+ "method",
745
+ "faucet_url",
746
+ "note"
747
+ ],
748
+ "additionalProperties": false
749
+ },
750
+ "mainnet": {
751
+ "type": "object",
752
+ "properties": {
753
+ "method": {
754
+ "type": "string",
755
+ "const": "eth_bridge",
756
+ "description": "Mainnet funding method (ETH mainnet cross-chain bridge)"
757
+ },
758
+ "supported_tokens": {
759
+ "type": "array",
760
+ "items": {
761
+ "type": "string"
762
+ },
763
+ "description": "Tokens supported by the mainnet bridge (ETH/USDT/USDC/WBTC)"
764
+ },
765
+ "steps": {
766
+ "type": "array",
767
+ "items": {
768
+ "type": "string"
769
+ },
770
+ "description": "Step-by-step mainnet funding flow: query active EVM account → transfer from external wallet → confirm balance → cross-chain to WOW"
771
+ }
772
+ },
773
+ "required": [
774
+ "method",
775
+ "supported_tokens",
776
+ "steps"
777
+ ],
778
+ "additionalProperties": false
779
+ },
780
+ "airdrop": {
781
+ "type": "object",
782
+ "properties": {
783
+ "url": {
784
+ "type": "string",
785
+ "description": "WOW mainnet airdrop URL"
786
+ },
787
+ "status": {
788
+ "type": "string",
789
+ "description": "Airdrop status (under construction)"
790
+ }
791
+ },
792
+ "required": [
793
+ "url",
794
+ "status"
795
+ ],
796
+ "additionalProperties": false
797
+ },
798
+ "payment_token": {
799
+ "type": "object",
800
+ "properties": {
801
+ "testnet_default": {
802
+ "type": "string",
803
+ "description": "Default testnet payment token (WOW)"
804
+ },
805
+ "mainnet_option": {
806
+ "type": "string",
807
+ "description": "Mainnet payment token option (USDT and other stablecoins)"
808
+ },
809
+ "migration_note": {
810
+ "type": "string",
811
+ "description": "Guidance: ask whether to switch payment token when migrating testnet → mainnet"
812
+ }
813
+ },
814
+ "required": [
815
+ "testnet_default",
816
+ "mainnet_option",
817
+ "migration_note"
818
+ ],
819
+ "additionalProperties": false
820
+ }
821
+ },
822
+ "required": [
823
+ "overview",
824
+ "testnet",
825
+ "mainnet",
826
+ "airdrop",
827
+ "payment_token"
828
+ ],
829
+ "additionalProperties": false,
830
+ "description": "Funding guidance result - testnet faucet / mainnet bridge / airdrop / payment-token guidance"
831
+ }
832
+ },
833
+ "required": [
834
+ "info",
835
+ "result"
836
+ ],
837
+ "additionalProperties": false
706
838
  }
707
839
  ],
708
840
  "description": "Protocol info result"
@@ -537,6 +537,20 @@
537
537
  ],
538
538
  "additionalProperties": false,
539
539
  "description": "Mainnet Bridge tokens query - returns all tokens deployed on the mainnet bridge with their symbol, WOW-side type tag, EVM address, decimals, and description"
540
+ },
541
+ {
542
+ "type": "object",
543
+ "properties": {
544
+ "info": {
545
+ "type": "string",
546
+ "const": "funding guidance"
547
+ }
548
+ },
549
+ "required": [
550
+ "info"
551
+ ],
552
+ "additionalProperties": false,
553
+ "description": "Funding guidance query - how to obtain WOW gas and payment tokens. Returns testnet faucet info, mainnet ETH cross-chain bridge flow, and the WOW mainnet airdrop link. Use this when a user asks how to obtain tokens/gas/funds, or as a proactive first-use reminder."
540
554
  }
541
555
  ],
542
556
  "description": "WoWok Build-in infomation query"