@wowok/agent-mcp 3.0.5 → 3.1.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 (129) hide show
  1. package/README.md +25 -20
  2. package/dist/customer/account-events.js +1 -1
  3. package/dist/graph/onchain/dataplane.d.ts +2 -2
  4. package/dist/graph/onchain/edge-schema.js +1 -1
  5. package/dist/graph/onchain/expand.js +1 -1
  6. package/dist/graph/onchain/onchain.spec.js +1 -1
  7. package/dist/graph/onchain/sdk-batch.d.ts +7 -1
  8. package/dist/graph/onchain/sdk-batch.js +1 -1
  9. package/dist/graph/onchain/sdk-dataplane.d.ts +6 -3
  10. package/dist/graph/onchain/sdk-dataplane.js +1 -1
  11. package/dist/graph/onchain/types.d.ts +2 -2
  12. package/dist/index.js +1 -1
  13. package/dist/knowledge/account-marks.js +1 -1
  14. package/dist/knowledge/allocation-risk.js +1 -1
  15. package/dist/knowledge/allocation-templates.js +1 -1
  16. package/dist/knowledge/goal-completion.d.ts +12 -0
  17. package/dist/knowledge/goal-completion.js +1 -1
  18. package/dist/knowledge/guard-risk.js +1 -1
  19. package/dist/knowledge/index.d.ts +4 -0
  20. package/dist/knowledge/index.js +1 -1
  21. package/dist/knowledge/migration-preflight.js +1 -1
  22. package/dist/knowledge/payment-tracker.d.ts +63 -0
  23. package/dist/knowledge/payment-tracker.js +1 -0
  24. package/dist/knowledge/recipient-constraint.d.ts +160 -0
  25. package/dist/knowledge/recipient-constraint.js +1 -0
  26. package/dist/knowledge/safety-rules.d.ts +1 -1
  27. package/dist/knowledge/safety-rules.js +1 -1
  28. package/dist/knowledge/template-registry.js +1 -1
  29. package/dist/knowledge/tools-reference.js +1 -1
  30. package/dist/knowledge/workflow-guidance.js +1 -1
  31. package/dist/knowledge/workspace-lists.d.ts +4 -0
  32. package/dist/knowledge/workspace-lists.js +1 -1
  33. package/dist/monitor/MonitorLoop.js +1 -1
  34. package/dist/participation/arbitrator-interest.d.ts +2 -0
  35. package/dist/participation/arbitrator-interest.js +1 -1
  36. package/dist/participation/collaborator-interest.d.ts +2 -0
  37. package/dist/participation/collaborator-interest.js +1 -1
  38. package/dist/participation/customer-interest.d.ts +2 -0
  39. package/dist/participation/customer-interest.js +1 -1
  40. package/dist/participation/merchant-interest.d.ts +2 -0
  41. package/dist/participation/merchant-interest.js +1 -1
  42. package/dist/participation/supplier-interest.d.ts +2 -0
  43. package/dist/participation/supplier-interest.js +1 -1
  44. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  45. package/dist/playbooks/service-build/context-assembly.js +1 -1
  46. package/dist/playbooks/service-build/merchant-guide.d.ts +7 -0
  47. package/dist/playbooks/service-build/merchant-guide.js +1 -1
  48. package/dist/playbooks/service-build/participation-radar.js +1 -1
  49. package/dist/playbooks/service-build/pipeline-actions.d.ts +2 -2
  50. package/dist/playbooks/service-build/pipeline-actions.js +1 -1
  51. package/dist/playbooks/service-build/relationship-profile.js +1 -1
  52. package/dist/playbooks/service-build/risk-aggregator.js +1 -1
  53. package/dist/playbooks/service-build/topology-query.js +1 -1
  54. package/dist/relationship/derivation.js +1 -1
  55. package/dist/safety/confirm-gate.js +1 -1
  56. package/dist/schema/call/allocation.js +1 -1
  57. package/dist/schema/call/base.js +1 -1
  58. package/dist/schema/call/semantic.js +1 -1
  59. package/dist/schema/call/service.d.ts +6 -6
  60. package/dist/schema/call/service.js +1 -1
  61. package/dist/schema/common/index.js +1 -1
  62. package/dist/schema/evaluation/index.d.ts +4 -4
  63. package/dist/schema/evaluation/index.js +1 -1
  64. package/dist/schema/goal/index.d.ts +21 -21
  65. package/dist/schema/goal/planning.d.ts +6 -6
  66. package/dist/schema/industry-pack/index.d.ts +6 -6
  67. package/dist/schema/industry-pack/modes.d.ts +6 -6
  68. package/dist/schema/intent-radar/index.d.ts +16 -16
  69. package/dist/schema/local/index.js +1 -1
  70. package/dist/schema/messenger/index.d.ts +110 -8
  71. package/dist/schema/messenger/index.js +1 -1
  72. package/dist/schema/operations.d.ts +37 -29
  73. package/dist/schema/operations.js +1 -1
  74. package/dist/schema/persona/index.d.ts +155 -155
  75. package/dist/schema/query/bi.d.ts +26 -26
  76. package/dist/schema/query/bi.js +1 -1
  77. package/dist/schema/query/index.d.ts +15 -12
  78. package/dist/schema/query/index.js +1 -1
  79. package/dist/schema/schema-query/index.d.ts +1 -1
  80. package/dist/schema/schema-version.js +1 -1
  81. package/dist/schema/strategy-review/index.d.ts +1 -1
  82. package/dist/schema-query-impl/index.js +1 -1
  83. package/dist/schemas/bridge_operation.schema.json +14 -14
  84. package/dist/schemas/evaluation_operation.schema.json +7 -7
  85. package/dist/schemas/guard2file.schema.json +3 -3
  86. package/dist/schemas/index.json +1 -1
  87. package/dist/schemas/local_history_operation.schema.json +1 -1
  88. package/dist/schemas/machineNode2file.schema.json +3 -3
  89. package/dist/schemas/messenger_operation.output.json +266 -38
  90. package/dist/schemas/messenger_operation.schema.json +27 -3
  91. package/dist/schemas/onchain_events.schema.json +1 -1
  92. package/dist/schemas/onchain_operations.schema.json +75 -77
  93. package/dist/schemas/onchain_operations_allocation.schema.json +6 -6
  94. package/dist/schemas/onchain_operations_arbitration.schema.json +3 -3
  95. package/dist/schemas/onchain_operations_contact.schema.json +3 -3
  96. package/dist/schemas/onchain_operations_demand.schema.json +3 -3
  97. package/dist/schemas/onchain_operations_gen_passport.schema.json +3 -3
  98. package/dist/schemas/onchain_operations_gen_proof.schema.json +3 -3
  99. package/dist/schemas/onchain_operations_guard.schema.json +4 -4
  100. package/dist/schemas/onchain_operations_machine.schema.json +11 -11
  101. package/dist/schemas/onchain_operations_order.schema.json +3 -3
  102. package/dist/schemas/onchain_operations_payment.schema.json +4 -4
  103. package/dist/schemas/onchain_operations_permission.schema.json +3 -3
  104. package/dist/schemas/onchain_operations_personal.schema.json +3 -3
  105. package/dist/schemas/onchain_operations_progress.schema.json +3 -3
  106. package/dist/schemas/onchain_operations_proof.schema.json +3 -3
  107. package/dist/schemas/onchain_operations_repository.schema.json +3 -3
  108. package/dist/schemas/onchain_operations_reward.schema.json +3 -3
  109. package/dist/schemas/onchain_operations_service.schema.json +9 -11
  110. package/dist/schemas/onchain_operations_treasury.schema.json +5 -5
  111. package/dist/schemas/onchain_table_data.output.json +14 -14
  112. package/dist/schemas/query_toolkit.output.json +38 -13
  113. package/dist/schemas/query_toolkit.schema.json +39 -11
  114. package/dist/strategy/collectors.js +1 -1
  115. package/dist/tools/handlers/config.js +1 -1
  116. package/dist/tools/handlers/evaluation.js +1 -1
  117. package/dist/tools/handlers/messenger.js +1 -1
  118. package/dist/tools/handlers/onchain.js +1 -1
  119. package/dist/tools/handlers/permission.js +1 -1
  120. package/dist/tools/handlers/query.js +1 -1
  121. package/dist/tools/handlers/strategy-review.js +1 -1
  122. package/dist/tools/handlers/workflow.js +1 -1
  123. package/dist/tools/index.js +1 -1
  124. package/dist/tools/registry/onchain.js +1 -1
  125. package/dist/tools/registry/query.js +1 -1
  126. package/dist/tools/rules-hook.d.ts +2 -0
  127. package/dist/tools/rules-hook.js +1 -1
  128. package/dist/tools/shared.js +1 -1
  129. package/package.json +2 -2
package/README.md CHANGED
@@ -30,15 +30,16 @@ Docs: [https://github.com/wowok-ai/docs/](https://github.com/wowok-ai/docs/)
30
30
  ```bash
31
31
  # Personal (global) — available in all sessions:
32
32
  npm install -g @wowok/skills
33
+ wowok-skills doctor # verify skills + MCP registration per client
33
34
 
34
35
  # Project (team sharing) — commit to git for collaboration:
35
36
  cd your-project
36
37
  wowok-skills init # Claude Code (default)
37
38
  wowok-skills init --target agents # Trae IDE
38
- wowok-skills init --target all # All 10 supported clients
39
+ wowok-skills init --target all # All 16 supported clients
39
40
  ```
40
41
 
41
- **Supported clients:** Claude Code, OpenAI Codex, ChatGPT Desktop (Codex Mode), Trae IDE, CodeBuddy, Cursor, Windsurf, Qoder, Roo Code, GitHub Copilot.
42
+ **Supported clients:** Claude Code, OpenAI Codex CLI / ChatGPT (Codex mode), Gemini CLI, Qwen Code, Grok Build, OpenCode, Google Antigravity, Trae (CN & international), Cursor, Devin Desktop (formerly Windsurf), CodeBuddy, WorkBuddy, Qoder, Cline, Kilo Code, GitHub Copilot.
42
43
 
43
44
  > **Note:** The skills package auto-installs and configures the `@wowok/agent-mcp` MCP server. Set `WOWOK_SKILLS_NO_MCP=1` to skip MCP management.
44
45
 
@@ -48,28 +49,32 @@ wowok-skills init --target all # All 10 supported clients
48
49
 
49
50
  | Skill | Purpose |
50
51
  |-------|---------|
51
- | `wowok-output` | Output processing — address resolution, name mapping, data visualization |
52
+ | `wowok-output` | Output processing — address resolution, name mapping, amount formatting, data visualization |
52
53
 
53
- **On-demand** (8 skills — loaded by context):
54
+ **On-demand** (12 skills — loaded by context):
54
55
 
55
56
  | Skill | Role | Purpose |
56
57
  |-------|------|---------|
57
- | `wowok-order` | 👤 Customer | Order lifecycle — due diligence, consensus, order creation, progress, arbitration |
58
- | `wowok-provider` | 🏪 Provider | Service provider guide — create Service, Machine, Allocators, order fulfillment |
59
- | `wowok-machine` | 🏪 Provider | Workflow design — state machines, node/pair/forward graph, publish lifecycle |
60
- | `wowok-arbitrator` | ⚖️ Arbitrator | Arbitration service — dispute resolution, weighted voting, fee management |
61
- | `wowok-messenger` | 🛠️ Shared | Encrypted messaging — E2E communication, WTS evidence, anti-spam |
62
- | `wowok-onboard` | 🆕 New User | First-touch onboarding — 10-round dialogue from zero to first published Service |
63
- | `wowok-planner` | 🛠️ Shared | Planning — converts natural language intent into Object Dependency Graph (ODG) |
64
- | `wowok-auditor` | 🛠️ Shared | Pre-publish audit — Guard completeness, Machine soundness, 32 audit checks |
65
-
66
- **Deprecated** (sunk to MCP knowledge layer — no longer installed as skills; their content is served by `schema_query` / `industry_pack_operation`):
67
-
68
- | Skill | Replaced By |
69
- |-------|-------------|
58
+ | `wowok-order` | 👤 Customer | Buyer lifecycle — pre-purchase due diligence, order creation, progress, arbitration |
59
+ | `wowok-provider` | 🏪 Provider | Service provider guide — create Service, Machine, Allocators, order fulfillment, fork iteration |
60
+ | `wowok-supplier` | 📦 Supplier | Supplier guide — present to a Demand, fulfill sub-orders, collect settlement |
61
+ | `wowok-collaborator` | 🤝 Collaborator | Process collaborators — execute workflow forwards (internal staff / named operators) |
62
+ | `wowok-arbitrator` | ⚖️ Arbitrator | Arbitration service — create Arbitration, handle disputes, organize voting, fees |
63
+ | `wowok-machine` | 🏪 Provider | Machine workflow design — nodes, pairs, forwards, guards, dependency-first build order |
64
+ | `wowok-market` | 🛒 Market | Market discovery & operations — match/discover, arbitration_score, metrics, anti-cheat |
65
+ | `wowok-governance` | 🛡️ Governance | Permission / Treasury / Personal governance — indexes, roles, fund stewardship, audit |
66
+ | `wowok-messenger` | � Shared | Encrypted messaging — E2E communication, WTS evidence, anti-spam, Contact lifecycle |
67
+ | `wowok-onboard` | 🆕 New User | First-touch onboarding — business dialogue from zero to the first published Service |
68
+ | `wowok-planner` | 🛠️ Shared | Planning — natural-language intent → Object Dependency Graph (ODG) |
69
+ | `wowok-auditor` | 🛠️ Shared | Pre-publish audit — Guard completeness, Machine soundness, fund flow, readiness |
70
+
71
+ **Sunk into the MCP knowledge layer** (no skill needed — content is served directly by the MCP server):
72
+
73
+ | Former skill | Now served by |
74
+ |--------------|---------------|
70
75
  | `wowok-tools` | `schema_query action='get_tool_reference'` |
71
- | `wowok-safety` | `schema_query action='get_safety_rules'` + runtime confirm-gate |
72
- | `wowok-guard` | `schema_query action='get_guard_design_patterns'` |
76
+ | `wowok-safety` | `schema_query action='get_safety_rules'` + the runtime confirm gate on every write |
73
77
  | `wowok-scenario` | `industry_pack_operation` (recommend_industry / list_modes) |
78
+ | `wowok-guard` | `schema_query action='get_guard_design_patterns' / 'get_guard_templates'` |
74
79
 
75
- > **Tip:** `wowok-output` is always loaded. Add role-specific skills (`wowok-order`, `wowok-provider`, `wowok-arbitrator`) as needed. Guard design, safety rules, tool reference, and industry mode content are now served directly by the MCP server — no skill installation required.
80
+ > **Tip:** `wowok-output` is always loaded. Add role-specific skills (`wowok-order`, `wowok-provider`, `wowok-supplier`, `wowok-arbitrator`, …) as needed. Guard design, safety rules, tool reference, and industry mode content are served directly by the MCP server — no skill installation required.
@@ -1 +1 @@
1
- import{watch_conversations,query_received,query_events,query_objects}from'@wowok/wowok';import{computeReviewStats,detectReviewManipulation,filterVerifiedReviews}from'../knowledge/reputation-rules.js';const watchers=new Map();export function registerAccountEventWatcher(a){if(!a['id']||watchers['has'](a['id']))return![];return watchers['set'](a['id'],a),!![];}export function unregisterAccountEventWatcher(a){return watchers['delete'](a);}export function listAccountEventWatchers(){return Array['from'](watchers['values']());}const PRIORITY_RANK={'required':0x4,'recommended':0x3,'info':0x2,'reminder':0x1};export async function runAccountEventWatchers(a,b){const c=[],d=b&&b['length']>0x0?new Set(b):undefined;for(const g of watchers['values']()){if(d&&!d['has'](g['id']))continue;if(g['applies']&&!await g['applies'](a))continue;try{c['push'](...await g['watch'](a));}catch{}}const f=new Map();for(const h of c)f['set'](h['id'],h);return Array['from'](f['values']())['sort']((i,j)=>PRIORITY_RANK[j['priority']]-PRIORITY_RANK[i['priority']]||j['timestamp']-i['timestamp']);}registerAccountEventWatcher({'id':'messenger_unread','description':'Unread\x20encrypted\x20messages\x20needing\x20attention','watch':async({account:a})=>{const b=await watch_conversations({'account':a,'unreadOnly':!![],'previewMessageCount':0x1,'skipAutoMarkViewed':!![]});return b['map'](d=>({'id':'messenger_unread:'+d['peerAddress'],'category':'messenger_unread','priority':'reminder','title':'Unread\x20messages\x20from\x20'+d['peerAddress'],'message':d['unreadCount']+'\x20unread\x20message(s)'+(d['lastMessagePreview']?'\x20—\x20\x22'+d['lastMessagePreview']+'\x22':''),'action':'View\x20and\x20reply\x20via\x20messenger_operation','object_ref':d['peerAddress'],'timestamp':Date['now']()}));}}),registerAccountEventWatcher({'id':'order_collection','description':'Pending\x20on-chain\x20collections\x20(CoinWrapper\x20objects\x20awaiting\x20claim)','watch':async({account:a,network:b})=>{if(!a)return[];const c=await query_received({'name_or_address':{'name_or_address':a},'type':undefined,'network':b});if(!Array['isArray'](c))return[];const d=c['filter'](e=>typeof e['type']==='string'&&e['type']['includes']('payment::CoinWrapper'));return d['map'](e=>({'id':'order_collection:'+e['id'],'category':'order_collection','priority':'recommended','title':'Pending\x20collection\x20available','message':'A\x20received\x20payment\x20object\x20is\x20awaiting\x20claim:\x20'+e['id'],'action':'Claim\x20via\x20onchain_operations\x20(order_claim\x20/\x20owner_receive)','object_ref':e['id'],'timestamp':Date['now']()}));}}),registerAccountEventWatcher({'id':'demand_presented','description':'A\x20service\x20presented\x20against\x20one\x20of\x20my\x20demands','watch':async({account:a,network:b})=>{if(!a)return[];const c=await query_events({'type':'DemandPresentEvent','order':'descending','limit':0x14,'network':b,'no_cache':!![]}),d=[];for(const e of c?.['data']??[]){const f=e['demand'];if(!f)continue;try{const g=await query_objects({'objects':[f],'network':b,'no_cache':!![]}),h=g['objects']?.[0x0],i=typeof h?.['owner']==='string'?h['owner']:h?.['owner']?.['AddressOwner'];i&&i['toLowerCase']()===a['toLowerCase']()&&d['push']({'id':'demand_presented:'+f+':'+(e['service']??'?'),'category':'demand_presented','priority':'info','title':'New\x20service\x20presented\x20on\x20your\x20demand','message':'A\x20service\x20('+(e['service']??'unknown')+')\x20presented\x20against\x20demand\x20'+f+(e['recommend']?'\x20—\x20\x22'+e['recommend']+'\x22':''),'action':'Review\x20the\x20presenter\x20via\x20onchain_table_data\x20(demand\x20presenter\x20item)','object_ref':f,'timestamp':Number(e['time']??Date['now']())});}catch{}}return d;}}),registerAccountEventWatcher({'id':'reputation_integrity','description':'Review-reputation\x20analysis\x20for\x20supplied\x20review\x20rows:\x20verification,\x20stats,\x20and\x20manipulation\x20detection\x20(knowledge/reputation-rules)','applies':({reviews:a})=>Array['isArray'](a)&&a['length']>0x0,'watch':async({reviews:a,order_history:b})=>{const c=a??[],d=b&&b['length']>0x0?filterVerifiedReviews(c,b):c,e=computeReviewStats(d),f=detectReviewManipulation(d),g=[];return f['suspicious']&&g['push']({'id':'reputation_integrity:manipulation','category':'reputation_integrity','priority':'required','title':'Suspicious\x20review\x20activity\x20detected','message':'Manipulation\x20signals:\x20'+f['reasons']['join'](';\x20')+'.\x20Stats:\x20'+e['likes']+'\x20likes\x20/\x20'+e['dislikes']+'\x20dislikes\x20across\x20'+e['total']+'\x20reviews\x20('+e['verifiedCount']+'\x20verified).','action':'Cross-check\x20reviewer\x20addresses\x20against\x20completed\x20orders\x20before\x20trusting\x20the\x20review\x20aggregate','timestamp':Date['now']()}),e['total']>=0x5&&e['verifiedCount']/e['total']<0.3&&g['push']({'id':'reputation_integrity:unverified','category':'reputation_integrity','priority':'recommended','title':'Reviews\x20are\x20dominated\x20by\x20unverified\x20submissions','message':'Only\x20'+e['verifiedCount']+'/'+e['total']+'\x20reviews\x20carry\x20a\x20completed-order\x20credential\x20—\x20the\x20aggregate\x20may\x20reflect\x20spam\x20rather\x20than\x20real\x20buyers.','action':'Bind\x20a\x20review\x20Guard\x20(verified-buyer\x20check)\x20to\x20the\x20ReviewRepository\x20—\x20see\x20knowledge/reputation-rules\x20buildReviewRepositorySetup','timestamp':Date['now']()}),e['recentTrend']==='declining'&&g['push']({'id':'reputation_integrity:declining','category':'reputation_integrity','priority':'info','title':'Review\x20trend\x20is\x20declining','message':'Recent\x20like-rate\x20is\x20materially\x20below\x20the\x20earlier\x20period\x20('+Math['round'](e['likeRate']*0x64)+'%\x20overall,\x20top\x20tags:\x20'+(e['topTags']['map'](h=>h['tag'])['join'](',\x20')||'none')+').','action':'Inspect\x20recent\x20dislike\x20tags\x20for\x20recurring\x20complaint\x20themes','timestamp':Date['now']()}),g;}});
1
+ import{watch_conversations,query_events,query_objects}from'@wowok/wowok';import{computeReviewStats,detectReviewManipulation,filterVerifiedReviews}from'../knowledge/reputation-rules.js';import{pendingWrappersAt,trackAccountPayments}from'../knowledge/payment-tracker.js';const watchers=new Map();export function registerAccountEventWatcher(a){if(!a['id']||watchers['has'](a['id']))return![];return watchers['set'](a['id'],a),!![];}export function unregisterAccountEventWatcher(a){return watchers['delete'](a);}export function listAccountEventWatchers(){return Array['from'](watchers['values']());}const PRIORITY_RANK={'required':0x4,'recommended':0x3,'info':0x2,'reminder':0x1};export async function runAccountEventWatchers(a,b){const c=[],d=b&&b['length']>0x0?new Set(b):undefined;for(const g of watchers['values']()){if(d&&!d['has'](g['id']))continue;if(g['applies']&&!await g['applies'](a))continue;try{c['push'](...await g['watch'](a));}catch{}}const f=new Map();for(const h of c)f['set'](h['id'],h);return Array['from'](f['values']())['sort']((i,j)=>PRIORITY_RANK[j['priority']]-PRIORITY_RANK[i['priority']]||j['timestamp']-i['timestamp']);}registerAccountEventWatcher({'id':'messenger_unread','description':'Unread\x20encrypted\x20messages\x20needing\x20attention','watch':async({account:a})=>{const b=await watch_conversations({'account':a,'unreadOnly':!![],'previewMessageCount':0x1,'skipAutoMarkViewed':!![]});return b['map'](d=>({'id':'messenger_unread:'+d['peerAddress'],'category':'messenger_unread','priority':'reminder','title':'Unread\x20messages\x20from\x20'+d['peerAddress'],'message':d['unreadCount']+'\x20unread\x20message(s)'+(d['lastMessagePreview']?'\x20—\x20\x22'+d['lastMessagePreview']+'\x22':''),'action':'View\x20and\x20reply\x20via\x20messenger_operation','object_ref':d['peerAddress'],'timestamp':Date['now']()}));}});function toCollectionEvent(a){const b=a['plan']['holder_kind']==='business_object';return{'id':'order_collection:'+a['wrapper_id'],'category':'order_collection','priority':'recommended','title':b?'Payment\x20awaiting\x20extraction\x20at\x20object\x20'+a['holder']:'Payment\x20awaiting\x20unwrap\x20in\x20your\x20account','message':'CoinWrapper\x20'+a['wrapper_id']+'\x20(payment\x20'+a['payment']+',\x20amount\x20'+a['amount']+')\x20is\x20held\x20by\x20'+a['holder']+'.\x20'+('Drive\x20'+a['plan']['operation']+(a['plan']['anyone_can_submit']?'\x20—\x20anyone\x20may\x20submit\x20the\x20transaction':'')+';\x20')+('the\x20bare\x20Coin\x20settles\x20to\x20'+a['plan']['settles_to']+'.\x20'+a['plan']['steps']['join']('\x20')),'action':'Extract\x20via\x20'+a['plan']['operation'],'object_ref':a['wrapper_id'],'timestamp':Date['now']()};}registerAccountEventWatcher({'id':'order_collection','description':'CoinWrappers\x20awaiting\x20extraction\x20at\x20the\x20account\x20or\x20at\x20objects\x20the\x20account\x20beneficially\x20owns','watch':async({account:a,network:b})=>{if(!a)return[];const c=new Map();try{for(const d of await pendingWrappersAt(a,{'network':b})){c['set'](d['wrapper_id'],toCollectionEvent(d));}}catch{}try{const e=await trackAccountPayments({'account':a,'network':b,'max_events':0x64});for(const f of e){for(const g of f['pending']){if(!c['has'](g['wrapper_id']))c['set'](g['wrapper_id'],toCollectionEvent(g));}}}catch{}return Array['from'](c['values']());}}),registerAccountEventWatcher({'id':'demand_presented','description':'A\x20service\x20presented\x20against\x20one\x20of\x20my\x20demands','watch':async({account:a,network:b})=>{if(!a)return[];const c=await query_events({'type':'DemandPresentEvent','order':'descending','limit':0x14,'network':b,'no_cache':!![]}),d=[];for(const e of c?.['data']??[]){const f=e['demand'];if(!f)continue;try{const g=await query_objects({'objects':[f],'network':b,'no_cache':!![]}),h=g['objects']?.[0x0],i=typeof h?.['owner']==='string'?h['owner']:h?.['owner']?.['AddressOwner'];i&&i['toLowerCase']()===a['toLowerCase']()&&d['push']({'id':'demand_presented:'+f+':'+(e['service']??'?'),'category':'demand_presented','priority':'info','title':'New\x20service\x20presented\x20on\x20your\x20demand','message':'A\x20service\x20('+(e['service']??'unknown')+')\x20presented\x20against\x20demand\x20'+f+(e['recommend']?'\x20—\x20\x22'+e['recommend']+'\x22':''),'action':'Review\x20the\x20presenter\x20via\x20onchain_table_data\x20(demand\x20presenter\x20item)','object_ref':f,'timestamp':Number(e['time']??Date['now']())});}catch{}}return d;}}),registerAccountEventWatcher({'id':'reputation_integrity','description':'Review-reputation\x20analysis\x20for\x20supplied\x20review\x20rows:\x20verification,\x20stats,\x20and\x20manipulation\x20detection\x20(knowledge/reputation-rules)','applies':({reviews:a})=>Array['isArray'](a)&&a['length']>0x0,'watch':async({reviews:a,order_history:b})=>{const c=a??[],d=b&&b['length']>0x0?filterVerifiedReviews(c,b):c,e=computeReviewStats(d),f=detectReviewManipulation(d),g=[];return f['suspicious']&&g['push']({'id':'reputation_integrity:manipulation','category':'reputation_integrity','priority':'required','title':'Suspicious\x20review\x20activity\x20detected','message':'Manipulation\x20signals:\x20'+f['reasons']['join'](';\x20')+'.\x20Stats:\x20'+e['likes']+'\x20likes\x20/\x20'+e['dislikes']+'\x20dislikes\x20across\x20'+e['total']+'\x20reviews\x20('+e['verifiedCount']+'\x20verified).','action':'Cross-check\x20reviewer\x20addresses\x20against\x20completed\x20orders\x20before\x20trusting\x20the\x20review\x20aggregate','timestamp':Date['now']()}),e['total']>=0x5&&e['verifiedCount']/e['total']<0.3&&g['push']({'id':'reputation_integrity:unverified','category':'reputation_integrity','priority':'recommended','title':'Reviews\x20are\x20dominated\x20by\x20unverified\x20submissions','message':'Only\x20'+e['verifiedCount']+'/'+e['total']+'\x20reviews\x20carry\x20a\x20completed-order\x20credential\x20—\x20the\x20aggregate\x20may\x20reflect\x20spam\x20rather\x20than\x20real\x20buyers.','action':'Bind\x20a\x20review\x20Guard\x20(verified-buyer\x20check)\x20to\x20the\x20ReviewRepository\x20—\x20see\x20knowledge/reputation-rules\x20buildReviewRepositorySetup','timestamp':Date['now']()}),e['recentTrend']==='declining'&&g['push']({'id':'reputation_integrity:declining','category':'reputation_integrity','priority':'info','title':'Review\x20trend\x20is\x20declining','message':'Recent\x20like-rate\x20is\x20materially\x20below\x20the\x20earlier\x20period\x20('+Math['round'](e['likeRate']*0x64)+'%\x20overall,\x20top\x20tags:\x20'+(e['topTags']['map'](h=>h['tag'])['join'](',\x20')||'none')+').','action':'Inspect\x20recent\x20dislike\x20tags\x20for\x20recurring\x20complaint\x20themes','timestamp':Date['now']()}),g;}});
@@ -1,4 +1,4 @@
1
- import type { DataPlane, EventCursor, EventPage, ExpandBudget, RawObject, SingletonId, TableItem } from "./types.js";
1
+ import type { DataPlane, EventCursor, EventPage, ExpandBudget, RawObject, TableItem } from "./types.js";
2
2
  export declare const MAX_OBJECTS_PER_QUERY = 50;
3
3
  export declare const DEFAULT_BUDGET: ExpandBudget;
4
4
  export declare function mergeBudget(b?: Partial<ExpandBudget>): ExpandBudget;
@@ -26,7 +26,7 @@ export declare class FakeDataPlane implements DataPlane {
26
26
  private seenKeyed;
27
27
  constructor(state?: Partial<FakePlaneState>);
28
28
  getObjects(ids: string[]): Promise<Map<string, RawObject>>;
29
- getKeyedFields(parent: SingletonId, keys: string[], opts?: {
29
+ getKeyedFields(parent: string, keys: string[], opts?: {
30
30
  keyType?: "address" | "u64";
31
31
  }): Promise<Map<string, RawObject>>;
32
32
  getTable(parent: string, opts?: {
@@ -1 +1 @@
1
- const EOA='EOA',ANY='ANY',F_EDGES=[{'id':'service.permission','family':'F','source':'Service','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'service.move\x20L175-194','bridgeIds':['b06','b09'],'zh':'店铺挂接的权限组(裁决回避\x20E33\x20的对照边)'},{'id':'service.machine','family':'F','source':'Service','target':'Machine','cardinality':'0..1','read':{'kind':'field','path':'machine'},'retention':'complete','evidence':'service.move\x20L175-194','bridgeIds':['b04'],'contract':{'field':'machine','frozenWhen':'after\x20publish','forbiddenActions':['set','remove'],'allowedActions':[],'unfreeze':null,'moveAnchor':'service.move\x20machine_set_imp\x20/\x20machine_none_imp\x20(assert!(!bPublished))'},'zh':'店铺绑定的工作流模板'},{'id':'service.buy_guard','family':'F','source':'Service','target':'Guard','cardinality':'0..1','read':{'kind':'field','path':'buy_guard'},'retention':'complete','evidence':'service.move\x20L175-194','bridgeIds':['b01','b10'],'contract':{'field':'buy_guard','frozenWhen':null,'forbiddenActions':[],'allowedActions':['set','remove'],'unfreeze':null,'moveAnchor':'service.move\x20buy_guard_set_imp\x20/\x20buy_guard_none_imp\x20(no\x20assert!(!bPublished))'},'zh':'下单前置校验\x20Guard'},{'id':'service.arbitration','family':'F','source':'Service','target':'Arbitration','cardinality':'N','read':{'kind':'fields','path':'arbitrations'},'retention':'complete','evidence':'service.move\x20L175-194\x20(≤20)','bridgeIds':['b06'],'contract':{'field':'arbitrations','frozenWhen':'after\x20publish','forbiddenActions':['remove','clear'],'allowedActions':['add'],'unfreeze':'pause\x20+\x20setting_lock_duration\x20elapsed','moveAnchor':'service.move\x20arbitration_remove_imp\x20/\x20arbitration_clear_imp\x20(assert_not_published)'},'zh':'店铺可选仲裁服务(≤20)'},{'id':'service.reward','family':'F','source':'Service','target':'Reward','cardinality':'N','read':{'kind':'fields','path':'rewards'},'retention':'complete','evidence':'service.move\x20L175-194\x20(≤20)','bridgeIds':['b07'],'contract':{'field':'rewards','frozenWhen':'after\x20publish','forbiddenActions':['remove','clear'],'allowedActions':['add'],'unfreeze':'pause\x20+\x20setting_lock_duration\x20elapsed','moveAnchor':'service.move\x20reward_remove_imp\x20/\x20reward_clear_imp\x20(assert_not_published)'},'zh':'店铺挂接的激励池(≤20)'},{'id':'service.repository','family':'F','source':'Service','target':'Repository','cardinality':'N','read':{'kind':'fields','path':'repositories'},'retention':'complete','evidence':'service.move\x20L175-194\x20(≤100)','bridgeIds':['b02'],'contract':{'field':'repositories','frozenWhen':null,'forbiddenActions':[],'allowedActions':['add','remove','clear'],'unfreeze':null,'moveAnchor':'service.move\x20repository_remove_imp\x20/\x20repository_clear_imp\x20(no\x20assert_not_published)'},'zh':'店铺证据资料库(≤100)'},{'id':'service.um','family':'F','source':'Service','target':'Contact','cardinality':'0..1','read':{'kind':'field','path':'um'},'retention':'complete','evidence':'service.move\x20L175-194','bridgeIds':['b11'],'zh':'店铺会员关系簿'},{'id':'service.order_allocator_guard','family':'F','source':'Service','target':'Guard','cardinality':'N','read':{'kind':'deep','segments':['order_allocators','allocators'],'field':'guard'},'retention':'complete','evidence':'service.move\x20L175-194;\x20allocation.move\x20L194-200','bridgeIds':['b05'],'zh':'店铺下单分账模板的触发\x20Guard'},{'id':'order.builder','family':'F','source':'Order','target':EOA,'cardinality':0x1,'read':{'kind':'field','path':'builder'},'retention':'complete','evidence':'order.move\x20L60-75\x20(owner;\x20SDK\x20builder)','bridgeIds':['b01'],'zh':'订单买家(owner/builder)'},{'id':'order.agent','family':'F','source':'Order','target':EOA,'cardinality':'N','read':{'kind':'fields','path':'agent'},'retention':'complete','evidence':'order.move\x20L60-75,L179\x20(≤10)','zh':'买家授权的商家代理人(≤10,买家调用\x20agent_set)'},{'id':'order.service','family':'F','source':'Order','target':'Service','cardinality':0x1,'read':{'kind':'field','path':'service'},'retention':'complete','evidence':'order.move\x20L60-75','bridgeIds':['b01'],'zh':'订单购买的店铺(购买快照)'},{'id':'order.machine','family':'F','source':'Order','target':'Machine','cardinality':'0..1','read':{'kind':'field','path':'machine'},'retention':'complete','evidence':'order.move\x20L130\x20(machine⇒progress)','bridgeIds':['b01','b04'],'zh':'订单绑定的工作流(购买快照)'},{'id':'order.progress','family':'F','source':'Order','target':'Progress','cardinality':'0..1','read':{'kind':'field','path':'progress'},'retention':'complete','evidence':'order.move\x20L130','bridgeIds':['b04'],'zh':'订单履约进度'},{'id':'order.allocation','family':'F','source':'Order','target':'Allocation','cardinality':'0..1','read':{'kind':'field','path':'allocation'},'retention':'complete','evidence':'order.move\x20L130\x20(amount>0⇒allocation)','bridgeIds':['b05'],'zh':'订单分账模板'},{'id':'order.discount','family':'F','source':'Order','target':'Discount','cardinality':'0..1','read':{'kind':'field','path':'discount'},'retention':'complete','evidence':'order.move\x20L60-75','bridgeIds':['b01'],'zh':'订单使用的折扣'},{'id':'order.dispute','family':'F','source':'Order','target':'Arb','cardinality':'N','read':{'kind':'fields','path':'dispute'},'retention':'complete','evidence':'order.move\x20L60-75','bridgeIds':['b06'],'zh':'订单关联的仲裁案件'},{'id':'order.claimed_by','family':'F','source':'Order','target':EOA,'cardinality':'0..1','read':{'kind':'field','path':'claimed_by'},'retention':'complete','evidence':'order.move\x20L86-96\x20(single-use)','bridgeIds':['b06'],'zh':'赔付领取人(单次)'},{'id':'progress.machine','family':'F','source':'Progress','target':'Machine','cardinality':0x1,'read':{'kind':'field','path':'machine'},'retention':'complete','evidence':'progress.move\x20L76-86','bridgeIds':['b04'],'contract':{'field':'machine','frozenWhen':'bound\x20at\x20creation','forbiddenActions':['set','remove'],'allowedActions':[],'unfreeze':null,'moveAnchor':'progress.move\x20new_imp\x20(machine\x20bound\x20at\x20creation;\x20no\x20mutation\x20entry)'},'zh':'进度对应的工作流模板'},{'id':'progress.task','family':'F','source':'Progress','target':'Order','cardinality':'0..1','read':{'kind':'field','path':'task'},'retention':'complete','evidence':'progress.move\x20L76-86','bridgeIds':['b04'],'contract':{'field':'task','frozenWhen':'after\x20task_set','forbiddenActions':['set'],'allowedActions':[],'unfreeze':null,'moveAnchor':'progress.move\x20task_set_imp\x20(assert!\x20option::is_none\x20→\x20E_TASK_ALREADY_SET)'},'zh':'进度关联的订单'},{'id':'progress.named_operator','family':'F','source':'Progress','target':EOA,'cardinality':'N','read':{'kind':'deep','segments':['namedOperator','operators'],'field':''},'retention':'complete','evidence':'progress.move\x20L76-86\x20(≤80)','bridgeIds':['b04'],'zh':'具名操作员运行时绑定(≤80\x20地址)'},{'id':'machine.permission','family':'F','source':'Machine','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'machine.move\x20L299-308','bridgeIds':['b09'],'zh':'工作流的权限组'},{'id':'machine.consensus_repository','family':'F','source':'Machine','target':'Repository','cardinality':'N','read':{'kind':'fields','path':'consensus_repositories'},'retention':'complete','evidence':'machine.move\x20L299-308','contract':{'field':'consensus_repositories','frozenWhen':null,'forbiddenActions':[],'allowedActions':['add','remove','clear'],'unfreeze':null,'moveAnchor':'machine.move\x20consensus_repositories_remove_imp\x20(no\x20assert_not_published)'},'zh':'工作流共识资料库'},{'id':'machine.um','family':'F','source':'Machine','target':'Contact','cardinality':'0..1','read':{'kind':'field','path':'um'},'retention':'complete','evidence':'machine.move\x20L299-308','bridgeIds':['b11'],'zh':'工作流会员关系簿'},{'id':'allocation.guard','family':'F','source':'Allocation','target':'Guard','cardinality':'N','read':{'kind':'deep','segments':['allocators','allocators'],'field':'guard'},'retention':'complete','evidence':'allocation.move\x20L194-200','bridgeIds':['b05'],'contract':{'field':'allocators','frozenWhen':'after\x20create\x20(share)','forbiddenActions':['add','remove','clear','set'],'allowedActions':[],'unfreeze':null,'moveAnchor':'allocation.move\x20create\x20(bound\x20via\x20new_with_balance;\x20no\x20mutation\x20entry)'},'zh':'分账段触发\x20Guard'},{'id':'arbitration.permission','family':'F','source':'Arbitration','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'arbitration.move\x20L48-59','bridgeIds':['b06','b09'],'zh':'仲裁服务的权限组(须与店铺\x20permission\x20不同,E33)'},{'id':'arbitration.voting_guard','family':'F','source':'Arbitration','target':'Guard','cardinality':'N','read':{'kind':'structFields','path':'voting_guard','field':'guard'},'retention':'complete','evidence':'arbitration.move\x20L48-59','bridgeIds':['b06','b10'],'zh':'仲裁投票权\x20Guard(空=人人可投)'},{'id':'arbitration.usage_guard','family':'F','source':'Arbitration','target':'Guard','cardinality':'0..1','read':{'kind':'field','path':'usage_guard'},'retention':'complete','evidence':'arbitration.move\x20L48-59','bridgeIds':['b06','b10'],'zh':'仲裁服务使用门槛\x20Guard'},{'id':'arbitration.um','family':'F','source':'Arbitration','target':'Contact','cardinality':'0..1','read':{'kind':'field','path':'um'},'retention':'complete','evidence':'arbitration.move\x20L48-59','bridgeIds':['b11'],'zh':'仲裁会员关系簿'},{'id':'arb.order','family':'F','source':'Arb','target':'Order','cardinality':0x1,'read':{'kind':'field','path':'order'},'retention':'complete','evidence':'arb.move\x20L96-111','bridgeIds':['b06'],'zh':'仲裁案件对应的订单'},{'id':'arb.arbitration_service','family':'F','source':'Arb','target':'Arbitration','cardinality':'0..1','read':{'kind':'field','path':'arbitration'},'retention':'complete','evidence':'arb.move\x20L96-111','bridgeIds':['b06'],'zh':'案件适用的仲裁服务'},{'id':'arb.voter','family':'S','source':'Arb','target':EOA,'cardinality':'N','read':{'kind':'structFields','path':'voted','field':'voter'},'retention':'complete','evidence':'arb.move\x20L96-111\x20(voted≤520)','bridgeIds':['b06'],'zh':'案件实际投票人及权重(≤520)'},{'id':'demand.permission','family':'F','source':'Demand','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'demand.move\x20L68-77','bridgeIds':['b09'],'zh':'需求的权限组(需求方)'},{'id':'demand.guard','family':'F','source':'Demand','target':'Guard','cardinality':'N','read':{'kind':'structFields','path':'guards','field':'guard'},'retention':'complete','evidence':'demand.move\x20L68-77','bridgeIds':['b03','b10'],'zh':'需求接单\x20Guard(裸\x20present\x20时须为空)'},{'id':'demand.reward','family':'F','source':'Demand','target':'Reward','cardinality':'N','read':{'kind':'fields','path':'rewards'},'retention':'complete','evidence':'demand.move\x20L68-77','bridgeIds':['b07'],'zh':'需求托管激励池'},{'id':'demand.um','family':'F','source':'Demand','target':'Contact','cardinality':'0..1','read':{'kind':'field','path':'um'},'retention':'complete','evidence':'demand.move\x20L68-77','bridgeIds':['b11'],'zh':'需求会员关系簿'},{'id':'reward.permission','family':'F','source':'Reward','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'reward.move\x20L129','bridgeIds':['b09'],'zh':'激励池权限组'},{'id':'reward.guard','family':'F','source':'Reward','target':'Guard','cardinality':'N','read':{'kind':'structFields','path':'guards','field':'guard'},'retention':'complete','evidence':'reward.move\x20L129','bridgeIds':['b07'],'zh':'激励领取\x20Guard'},{'id':'reward.um','family':'F','source':'Reward','target':'Contact','cardinality':'0..1','read':{'kind':'field','path':'um'},'retention':'complete','evidence':'reward.move\x20L129','bridgeIds':['b11'],'zh':'激励池会员关系簿'},{'id':'repository.permission','family':'F','source':'Repository','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'repository.move\x20(struct)','bridgeIds':['b02','b09'],'zh':'资料库权限组'},{'id':'repository.reward','family':'F','source':'Repository','target':'Reward','cardinality':'N','read':{'kind':'fields','path':'rewards'},'retention':'complete','evidence':'repository.move\x20(struct)','bridgeIds':['b07'],'zh':'资料库挂接的激励池'},{'id':'repository.policy_guard','family':'F','source':'Repository','target':'Guard','cardinality':'N','read':{'kind':'structFields','path':'policies','field':'guard'},'retention':'complete','evidence':'repository.move\x20(read/write\x20policies)','bridgeIds':['b02','b10'],'zh':'资料库读写策略\x20Guard(值门控)'},{'id':'contact.permission','family':'F','source':'Contact','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'contact.move\x20L25-31','bridgeIds':['b09','b11'],'zh':'客服会员簿的权限组'},{'id':'permission.admin','family':'F','source':'Permission','target':EOA,'cardinality':'N','read':{'kind':'fields','path':'admin'},'retention':'complete','evidence':'permission.move\x20L34-42\x20(admin\x20vector)','bridgeIds':['b09'],'zh':'权限组管理员\x20EOA\x20列表'},{'id':'guard.relies','family':'F','source':'Guard','target':'Guard','cardinality':'N','read':{'kind':'fields','path':'relies'},'retention':'complete','evidence':'guard.move\x20L85-95\x20(≤4,\x20one\x20level)','bridgeIds':['b10'],'zh':'Guard\x20依赖的子\x20Guard(≤4,仅一层)'},{'id':'passport.signer','family':'F','source':'Passport','target':EOA,'cardinality':0x1,'read':{'kind':'field','path':'signer'},'retention':'complete','evidence':'passport.move\x20L41-49,L94-98','bridgeIds':['b12'],'zh':'通行证签署人(单笔\x20tx\x20一次性)'},{'id':'passport.guard','family':'F','source':'Passport','target':'Guard','cardinality':'N','read':{'kind':'structFields','path':'guard','field':'guard'},'retention':'complete','evidence':'passport.move\x20L41-49','bridgeIds':['b10','b12'],'zh':'通行证持有的\x20Guard\x20校验票据'},{'id':'proof.signer','family':'F','source':'Proof','target':EOA,'cardinality':0x1,'read':{'kind':'field','path':'signer'},'retention':'complete','evidence':'proof.move\x20L14-25','bridgeIds':['b12'],'zh':'WTS\x20证据签名人'},{'id':'proof.about','family':'F','source':'Proof','target':ANY,'cardinality':'0..1','read':{'kind':'field','path':'about'},'retention':'complete','evidence':'proof.move\x20L14-25','bridgeIds':['b12'],'zh':'证据关联对象'},{'id':'treasury.permission','family':'F','source':'Treasury','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'treasury.move\x20L72-83','bridgeIds':['b09'],'zh':'金库权限组'},{'id':'treasury.external_guard','family':'F','source':'Treasury','target':'Guard','cardinality':'N','read':{'kind':'fields','path':'external_guards'},'retention':'complete','evidence':'treasury.move\x20L72-83','bridgeIds':['b10'],'zh':'金库外部存取\x20Guard'}],R_EDGES=[{'id':'eoa.permission','family':'R','source':EOA,'target':'Permission','cardinality':'N','read':{'kind':'reverse','parent':'0xaaad'},'retention':'membership','evidence':'entity_permission.move\x20L32\x20(bits\x201/2/4)','bridgeIds':['b09'],'zh':'账号当前参与的权限组(成员关系,移除即消失)'},{'id':'eoa.order','family':'R','source':EOA,'target':'Order','cardinality':'N','read':{'kind':'reverse','parent':'0xaa8'},'retention':'bounded_window','evidence':'entity_order.move\x20L31\x20(FIFO\x205200)','bridgeIds':['b01'],'zh':'账号作为买家/代理人参与的订单(买家视角,FIFO\x205200)'},{'id':'eoa.contact','family':'R','source':EOA,'target':'Contact','cardinality':'N','read':{'kind':'reverse','parent':'0xaa9'},'retention':'membership','evidence':'entity_contact.move\x20L24','bridgeIds':['b11'],'zh':'账号当前加入的客服会员簿'},{'id':'permission.core_binding','family':'R','source':'Permission','target':ANY,'cardinality':'N','read':{'kind':'reverse','parent':'0xaae'},'retention':'bounded_exact','evidence':'object_linker.move\x20L37,L88\x20(≤5200\x20aborts)','bridgeIds':['b09'],'zh':'权限组无损挂接的核心对象(Service/Demand/Machine/…)'},{'id':'permission.tx_binding','family':'R','source':'Permission','target':ANY,'cardinality':'N','read':{'kind':'reverse','parent':'0xaaf'},'retention':'bounded_window','evidence':'object_linker.move\x20L43\x20(FIFO\x205200\x20operational)','bridgeIds':['b09'],'zh':'权限组运行期触碰对象(FIFO\x205200\x20下界)'},{'id':'service.order','family':'R','source':'Service','target':'Order','cardinality':'N','read':{'kind':'reverse','parent':'0xaaf','filterType':'Order'},'retention':'bounded_window','evidence':'object_linker.move\x20L43,L136-140\x20(FIFO\x205200)','bridgeIds':['b01'],'zh':'店铺订单(商家视角权威路径,FIFO\x205200\x20下界;全量走事件通道)'},{'id':'target.vote','family':'S','source':ANY,'target':EOA,'cardinality':'N','read':{'kind':'reverse','parent':'0xaaa'},'retention':'bounded_window','evidence':'registrar.move\x20L154-171\x20(ring\x205200,\x20bits\x200x02/0x04/0x08)','zh':'目标地址收到的\x20like/dislike/favor\x20投票(环形\x205200)'}],TABLE_EDGES=[{'id':'permission.entity','family':'R','source':'Permission','target':ANY,'cardinality':'N','read':{'kind':'table','rowType':'PermissionPerm'},'retention':'membership','evidence':'permission.move\x20L34-42\x20(entity\x20may\x20be\x20EOA\x20or\x20Guard\x20address)','bridgeIds':['b04','b09'],'zh':'权限组实体表成员(EOA\x20或\x20Guard,携带\x20perm\x20索引位)'},{'id':'demand.presenter','family':'R','source':'Demand','target':EOA,'cardinality':'N','read':{'kind':'table','rowType':'DemandPresenter'},'retention':'membership','evidence':'demand.move\x20L68-77\x20(presenters\x20table)','bridgeIds':['b03'],'zh':'向需求提案的供应方及\x20acceptance_score'},{'id':'machine.node','family':'W','source':'Machine','target':'MachineNode','cardinality':'N','read':{'kind':'table','rowType':'MachineNode'},'retention':'complete','evidence':'machine.move\x20L299-308\x20(immutable\x20after\x20publish)','bridgeIds':['b04'],'contract':{'field':'nodes','frozenWhen':'after\x20publish','forbiddenActions':['add','remove','update'],'allowedActions':[],'unfreeze':null,'moveAnchor':'machine.move\x20node_add_imp\x20/\x20node_remove_imp\x20/\x20node_rename_imp\x20(assert_not_published)'},'zh':'工作流节点表(发布后不可变)'}],W_EDGES=[{'id':'wf.transition','family':'W','source':'MachineNode','target':'MachineNode','cardinality':'N','read':{'kind':'derived','producer':'machineRows'},'retention':'derived','evidence':'machine.move\x20L101\x20NodePair,L269','bridgeIds':['b04'],'zh':'节点对有向边(prev_node→node,携带\x20threshold)'},{'id':'wf.forward_guard','family':'W','source':'MachineNode','target':'Guard','cardinality':'N','read':{'kind':'derived','producer':'machineRows'},'retention':'derived','evidence':'machine.move\x20L63\x20Forward','bridgeIds':['b04','b05','b10','b12'],'zh':'节点前进操作的后置\x20Guard(供应链/赔付分账挂点)'}],M_EDGES=[{'id':'payment.recipient','family':'M','source':'Payment','target':EOA,'cardinality':'N','read':{'kind':'structFields','path':'record','field':'recipient'},'retention':'complete','evidence':'payment.move\x20L93-101\x20(Revenue≤200)','bridgeIds':['b05','b08'],'zh':'支付分账收款人(携带金额,逐腿)'},{'id':'payment.from_object','family':'M','source':'Payment','target':ANY,'cardinality':'0..1','read':{'kind':'field','path':'from_object'},'retention':'complete','evidence':'payment.move\x20L149-161\x20(framework-only)','bridgeIds':['b05','b08'],'zh':'资金来源池(Treasury/Allocation/Service,仅框架可设)'},{'id':'payment.for_object','family':'M','source':'Payment','target':ANY,'cardinality':'0..1','read':{'kind':'field','path':'info.for_object'},'retention':'complete','evidence':'payment.move\x20L93-101\x20(info\x20routing\x20hint)','bridgeIds':['b05','b08'],'zh':'业务路由对象(用户可设)'},{'id':'payment.for_guard','family':'M','source':'Payment','target':'Guard','cardinality':'0..1','read':{'kind':'field','path':'info.for_guard'},'retention':'complete','evidence':'payment.move\x20L93-101','bridgeIds':['b05'],'zh':'业务路由\x20Guard'}];export const EDGE_SCHEMAS=[...F_EDGES,...R_EDGES,...TABLE_EDGES,...W_EDGES,...M_EDGES];export const EDGE_SCHEMA_BY_ID=new Map(EDGE_SCHEMAS['map'](a=>[a['id'],a]));export function outgoingSchemaIds(a){return EDGE_SCHEMAS['filter'](b=>b['source']===a||b['source']===ANY)['map'](b=>b['id']);}export const COVERED_OBJECT_TYPES=[...new Set(EDGE_SCHEMAS['flatMap'](a=>[a['source'],a['target']])['filter'](a=>a!==EOA&&a!==ANY&&a!=='MachineNode'))];
1
+ const EOA='EOA',ANY='ANY',F_EDGES=[{'id':'service.permission','family':'F','source':'Service','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'service.move\x20L175-194','bridgeIds':['b06','b09'],'zh':'店铺挂接的权限组(裁决回避\x20E33\x20的对照边)'},{'id':'service.machine','family':'F','source':'Service','target':'Machine','cardinality':'0..1','read':{'kind':'field','path':'machine'},'retention':'complete','evidence':'service.move\x20L175-194','bridgeIds':['b04'],'contract':{'field':'machine','frozenWhen':'after\x20publish','forbiddenActions':['set','remove'],'allowedActions':[],'unfreeze':null,'moveAnchor':'service.move\x20machine_set_imp\x20/\x20machine_none_imp\x20(assert!(!bPublished))'},'zh':'店铺绑定的工作流模板'},{'id':'service.buy_guard','family':'F','source':'Service','target':'Guard','cardinality':'0..1','read':{'kind':'field','path':'buy_guard'},'retention':'complete','evidence':'service.move\x20L175-194','bridgeIds':['b01','b10'],'contract':{'field':'buy_guard','frozenWhen':null,'forbiddenActions':[],'allowedActions':['set','remove'],'unfreeze':null,'moveAnchor':'service.move\x20buy_guard_set_imp\x20/\x20buy_guard_none_imp\x20(no\x20assert!(!bPublished))'},'zh':'下单前置校验\x20Guard'},{'id':'service.arbitration','family':'F','source':'Service','target':'Arbitration','cardinality':'N','read':{'kind':'fields','path':'arbitrations'},'retention':'complete','evidence':'service.move\x20L175-194\x20(≤20)','bridgeIds':['b06'],'contract':{'field':'arbitrations','frozenWhen':'after\x20publish','forbiddenActions':['remove','clear'],'allowedActions':['add'],'unfreeze':'pause\x20+\x20setting_lock_duration\x20elapsed','moveAnchor':'service.move\x20arbitration_remove_imp\x20/\x20arbitration_clear_imp\x20(assert_not_published)'},'zh':'店铺可选仲裁服务(≤20)'},{'id':'service.reward','family':'F','source':'Service','target':'Reward','cardinality':'N','read':{'kind':'fields','path':'rewards'},'retention':'complete','evidence':'service.move\x20L175-194\x20(≤20)','bridgeIds':['b07'],'contract':{'field':'rewards','frozenWhen':'after\x20publish','forbiddenActions':['remove','clear'],'allowedActions':['add'],'unfreeze':'pause\x20+\x20setting_lock_duration\x20elapsed','moveAnchor':'service.move\x20reward_remove_imp\x20/\x20reward_clear_imp\x20(assert_not_published)'},'zh':'店铺挂接的激励池(≤20)'},{'id':'service.repository','family':'F','source':'Service','target':'Repository','cardinality':'N','read':{'kind':'fields','path':'repositories'},'retention':'complete','evidence':'service.move\x20L175-194\x20(≤100)','bridgeIds':['b02'],'contract':{'field':'repositories','frozenWhen':null,'forbiddenActions':[],'allowedActions':['add','remove','clear'],'unfreeze':null,'moveAnchor':'service.move\x20repository_remove_imp\x20/\x20repository_clear_imp\x20(no\x20assert_not_published)'},'zh':'店铺证据资料库(≤100)'},{'id':'service.um','family':'F','source':'Service','target':'Contact','cardinality':'0..1','read':{'kind':'field','path':'um'},'retention':'complete','evidence':'service.move\x20L175-194','bridgeIds':['b11'],'zh':'店铺会员关系簿'},{'id':'service.order_allocator_guard','family':'F','source':'Service','target':'Guard','cardinality':'N','read':{'kind':'deep','segments':['order_allocators','allocators'],'field':'guard'},'retention':'complete','evidence':'service.move\x20L175-194;\x20allocation.move\x20L194-200','bridgeIds':['b05'],'zh':'店铺下单分账模板的触发\x20Guard'},{'id':'order.builder','family':'F','source':'Order','target':EOA,'cardinality':0x1,'read':{'kind':'field','path':'builder'},'retention':'complete','evidence':'order.move\x20L60-75\x20(owner;\x20SDK\x20builder)','bridgeIds':['b01'],'zh':'订单买家(owner/builder)'},{'id':'order.agent','family':'F','source':'Order','target':EOA,'cardinality':'N','read':{'kind':'fields','path':'agent'},'retention':'complete','evidence':'order.move\x20L60-75,L179\x20(≤10)','zh':'买家授权的商家代理人(≤10,买家调用\x20agent_set)'},{'id':'order.service','family':'F','source':'Order','target':'Service','cardinality':0x1,'read':{'kind':'field','path':'service'},'retention':'complete','evidence':'order.move\x20L60-75','bridgeIds':['b01'],'zh':'订单购买的店铺(购买快照)'},{'id':'order.machine','family':'F','source':'Order','target':'Machine','cardinality':'0..1','read':{'kind':'field','path':'machine'},'retention':'complete','evidence':'order.move\x20L130\x20(machine⇒progress)','bridgeIds':['b01','b04'],'zh':'订单绑定的工作流(购买快照)'},{'id':'order.progress','family':'F','source':'Order','target':'Progress','cardinality':'0..1','read':{'kind':'field','path':'progress'},'retention':'complete','evidence':'order.move\x20L130','bridgeIds':['b04'],'zh':'订单履约进度'},{'id':'order.allocation','family':'F','source':'Order','target':'Allocation','cardinality':'0..1','read':{'kind':'field','path':'allocation'},'retention':'complete','evidence':'order.move\x20L130\x20(amount>0⇒allocation)','bridgeIds':['b05'],'zh':'订单分账模板'},{'id':'order.discount','family':'F','source':'Order','target':'Discount','cardinality':'0..1','read':{'kind':'field','path':'discount'},'retention':'complete','evidence':'order.move\x20L60-75','bridgeIds':['b01'],'zh':'订单使用的折扣'},{'id':'order.dispute','family':'F','source':'Order','target':'Arb','cardinality':'N','read':{'kind':'fields','path':'dispute'},'retention':'complete','evidence':'order.move\x20L60-75','bridgeIds':['b06'],'zh':'订单关联的仲裁案件'},{'id':'order.claimed_by','family':'F','source':'Order','target':EOA,'cardinality':'0..1','read':{'kind':'field','path':'claimed_by'},'retention':'complete','evidence':'order.move\x20L86-96\x20(single-use)','bridgeIds':['b06'],'zh':'赔付领取人(单次)'},{'id':'progress.machine','family':'F','source':'Progress','target':'Machine','cardinality':0x1,'read':{'kind':'field','path':'machine'},'retention':'complete','evidence':'progress.move\x20L76-86','bridgeIds':['b04'],'contract':{'field':'machine','frozenWhen':'bound\x20at\x20creation','forbiddenActions':['set','remove'],'allowedActions':[],'unfreeze':null,'moveAnchor':'progress.move\x20new_imp\x20(machine\x20bound\x20at\x20creation;\x20no\x20mutation\x20entry)'},'zh':'进度对应的工作流模板'},{'id':'progress.task','family':'F','source':'Progress','target':'Order','cardinality':'0..1','read':{'kind':'field','path':'task'},'retention':'complete','evidence':'progress.move\x20L76-86','bridgeIds':['b04'],'contract':{'field':'task','frozenWhen':'after\x20task_set','forbiddenActions':['set'],'allowedActions':[],'unfreeze':null,'moveAnchor':'progress.move\x20task_set_imp\x20(assert!\x20option::is_none\x20→\x20E_TASK_ALREADY_SET)'},'zh':'进度关联的订单'},{'id':'progress.named_operator','family':'F','source':'Progress','target':EOA,'cardinality':'N','read':{'kind':'deep','segments':['namedOperator','operators'],'field':''},'retention':'complete','evidence':'progress.move\x20L76-86\x20(≤80)','bridgeIds':['b04'],'zh':'具名操作员运行时绑定(≤80\x20地址)'},{'id':'machine.permission','family':'F','source':'Machine','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'machine.move\x20L299-308','bridgeIds':['b09'],'zh':'工作流的权限组'},{'id':'machine.consensus_repository','family':'F','source':'Machine','target':'Repository','cardinality':'N','read':{'kind':'fields','path':'consensus_repositories'},'retention':'complete','evidence':'machine.move\x20L299-308','contract':{'field':'consensus_repositories','frozenWhen':null,'forbiddenActions':[],'allowedActions':['add','remove','clear'],'unfreeze':null,'moveAnchor':'machine.move\x20consensus_repositories_remove_imp\x20(no\x20assert_not_published)'},'zh':'工作流共识资料库'},{'id':'machine.um','family':'F','source':'Machine','target':'Contact','cardinality':'0..1','read':{'kind':'field','path':'um'},'retention':'complete','evidence':'machine.move\x20L299-308','bridgeIds':['b11'],'zh':'工作流会员关系簿'},{'id':'allocation.guard','family':'F','source':'Allocation','target':'Guard','cardinality':'N','read':{'kind':'deep','segments':['allocators','allocators'],'field':'guard'},'retention':'complete','evidence':'allocation.move\x20L194-200','bridgeIds':['b05'],'contract':{'field':'allocators','frozenWhen':'after\x20create\x20(share)','forbiddenActions':['add','remove','clear','set'],'allowedActions':[],'unfreeze':null,'moveAnchor':'allocation.move\x20create\x20(bound\x20via\x20new_with_balance;\x20no\x20mutation\x20entry)'},'zh':'分账段触发\x20Guard'},{'id':'arbitration.permission','family':'F','source':'Arbitration','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'arbitration.move\x20L48-59','bridgeIds':['b06','b09'],'zh':'仲裁服务的权限组(须与店铺\x20permission\x20不同,E33)'},{'id':'arbitration.voting_guard','family':'F','source':'Arbitration','target':'Guard','cardinality':'N','read':{'kind':'structFields','path':'voting_guard','field':'guard'},'retention':'complete','evidence':'arbitration.move\x20L48-59','bridgeIds':['b06','b10'],'zh':'仲裁投票权\x20Guard(空=人人可投)'},{'id':'arbitration.usage_guard','family':'F','source':'Arbitration','target':'Guard','cardinality':'0..1','read':{'kind':'field','path':'usage_guard'},'retention':'complete','evidence':'arbitration.move\x20L48-59','bridgeIds':['b06','b10'],'zh':'仲裁服务使用门槛\x20Guard'},{'id':'arbitration.um','family':'F','source':'Arbitration','target':'Contact','cardinality':'0..1','read':{'kind':'field','path':'um'},'retention':'complete','evidence':'arbitration.move\x20L48-59','bridgeIds':['b11'],'zh':'仲裁会员关系簿'},{'id':'arb.order','family':'F','source':'Arb','target':'Order','cardinality':0x1,'read':{'kind':'field','path':'order'},'retention':'complete','evidence':'arb.move\x20L96-111','bridgeIds':['b06'],'zh':'仲裁案件对应的订单'},{'id':'arb.arbitration_service','family':'F','source':'Arb','target':'Arbitration','cardinality':'0..1','read':{'kind':'field','path':'arbitration'},'retention':'complete','evidence':'arb.move\x20L96-111','bridgeIds':['b06'],'zh':'案件适用的仲裁服务'},{'id':'arb.voter','family':'S','source':'Arb','target':EOA,'cardinality':'N','read':{'kind':'structFields','path':'voted','field':'voter'},'retention':'complete','evidence':'arb.move\x20L96-111\x20(voted≤520)','bridgeIds':['b06'],'zh':'案件实际投票人及权重(≤520)'},{'id':'demand.permission','family':'F','source':'Demand','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'demand.move\x20L68-77','bridgeIds':['b09'],'zh':'需求的权限组(需求方)'},{'id':'demand.guard','family':'F','source':'Demand','target':'Guard','cardinality':'N','read':{'kind':'structFields','path':'guards','field':'guard'},'retention':'complete','evidence':'demand.move\x20L68-77','bridgeIds':['b03','b10'],'zh':'需求接单\x20Guard(裸\x20present\x20时须为空)'},{'id':'demand.reward','family':'F','source':'Demand','target':'Reward','cardinality':'N','read':{'kind':'fields','path':'rewards'},'retention':'complete','evidence':'demand.move\x20L68-77','bridgeIds':['b07'],'zh':'需求托管激励池'},{'id':'demand.um','family':'F','source':'Demand','target':'Contact','cardinality':'0..1','read':{'kind':'field','path':'um'},'retention':'complete','evidence':'demand.move\x20L68-77','bridgeIds':['b11'],'zh':'需求会员关系簿'},{'id':'reward.permission','family':'F','source':'Reward','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'reward.move\x20L129','bridgeIds':['b09'],'zh':'激励池权限组'},{'id':'reward.guard','family':'F','source':'Reward','target':'Guard','cardinality':'N','read':{'kind':'structFields','path':'guards','field':'guard'},'retention':'complete','evidence':'reward.move\x20L129','bridgeIds':['b07'],'zh':'激励领取\x20Guard'},{'id':'reward.um','family':'F','source':'Reward','target':'Contact','cardinality':'0..1','read':{'kind':'field','path':'um'},'retention':'complete','evidence':'reward.move\x20L129','bridgeIds':['b11'],'zh':'激励池会员关系簿'},{'id':'repository.permission','family':'F','source':'Repository','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'repository.move\x20(struct)','bridgeIds':['b02','b09'],'zh':'资料库权限组'},{'id':'repository.reward','family':'F','source':'Repository','target':'Reward','cardinality':'N','read':{'kind':'fields','path':'rewards'},'retention':'complete','evidence':'repository.move\x20(struct)','bridgeIds':['b07'],'zh':'资料库挂接的激励池'},{'id':'repository.policy_guard','family':'F','source':'Repository','target':'Guard','cardinality':'N','read':{'kind':'structFields','path':'policies','field':'guard'},'retention':'complete','evidence':'repository.move\x20(read/write\x20policies)','bridgeIds':['b02','b10'],'zh':'资料库读写策略\x20Guard(值门控)'},{'id':'contact.permission','family':'F','source':'Contact','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'contact.move\x20L25-31','bridgeIds':['b09','b11'],'zh':'客服会员簿的权限组'},{'id':'permission.admin','family':'F','source':'Permission','target':EOA,'cardinality':'N','read':{'kind':'fields','path':'admin'},'retention':'complete','evidence':'permission.move\x20L34-42\x20(admin\x20vector)','bridgeIds':['b09'],'zh':'权限组管理员\x20EOA\x20列表'},{'id':'guard.relies','family':'F','source':'Guard','target':'Guard','cardinality':'N','read':{'kind':'fields','path':'relies'},'retention':'complete','evidence':'guard.move\x20L85-95\x20(≤4,\x20one\x20level)','bridgeIds':['b10'],'zh':'Guard\x20依赖的子\x20Guard(≤4,仅一层)'},{'id':'passport.signer','family':'F','source':'Passport','target':EOA,'cardinality':0x1,'read':{'kind':'field','path':'signer'},'retention':'complete','evidence':'passport.move\x20L41-49,L94-98','bridgeIds':['b12'],'zh':'通行证签署人(单笔\x20tx\x20一次性)'},{'id':'passport.guard','family':'F','source':'Passport','target':'Guard','cardinality':'N','read':{'kind':'structFields','path':'guard','field':'guard'},'retention':'complete','evidence':'passport.move\x20L41-49','bridgeIds':['b10','b12'],'zh':'通行证持有的\x20Guard\x20校验票据'},{'id':'proof.signer','family':'F','source':'Proof','target':EOA,'cardinality':0x1,'read':{'kind':'field','path':'signer'},'retention':'complete','evidence':'proof.move\x20L14-25','bridgeIds':['b12'],'zh':'WTS\x20证据签名人'},{'id':'proof.about','family':'F','source':'Proof','target':ANY,'cardinality':'0..1','read':{'kind':'field','path':'about'},'retention':'complete','evidence':'proof.move\x20L14-25','bridgeIds':['b12'],'zh':'证据关联对象'},{'id':'treasury.permission','family':'F','source':'Treasury','target':'Permission','cardinality':0x1,'read':{'kind':'field','path':'permission'},'retention':'complete','evidence':'treasury.move\x20L72-83','bridgeIds':['b09'],'zh':'金库权限组'},{'id':'treasury.external_guard','family':'F','source':'Treasury','target':'Guard','cardinality':'N','read':{'kind':'fields','path':'external_guards'},'retention':'complete','evidence':'treasury.move\x20L72-83','bridgeIds':['b10'],'zh':'金库外部存取\x20Guard'}],R_EDGES=[{'id':'eoa.permission','family':'R','source':EOA,'target':'Permission','cardinality':'N','read':{'kind':'reverse','parent':'0xaad'},'retention':'membership','evidence':'entity_permission.move\x20L32\x20(bits\x201/2/4)','bridgeIds':['b09'],'zh':'账号当前参与的权限组(成员关系,移除即消失)'},{'id':'eoa.order','family':'R','source':EOA,'target':'Order','cardinality':'N','read':{'kind':'reverse','parent':'0xaa8'},'retention':'bounded_window','evidence':'entity_order.move\x20L31\x20(FIFO\x205200)','bridgeIds':['b01'],'zh':'账号作为买家/代理人参与的订单(买家视角,FIFO\x205200)'},{'id':'eoa.contact','family':'R','source':EOA,'target':'Contact','cardinality':'N','read':{'kind':'reverse','parent':'0xaa9'},'retention':'membership','evidence':'entity_contact.move\x20L24','bridgeIds':['b11'],'zh':'账号当前加入的客服会员簿'},{'id':'permission.core_binding','family':'R','source':'Permission','target':ANY,'cardinality':'N','read':{'kind':'reverse','parent':'0xaae'},'retention':'bounded_exact','evidence':'object_linker.move\x20L37,L88\x20(≤5200\x20aborts)','bridgeIds':['b09'],'zh':'权限组无损挂接的核心对象(Service/Demand/Machine/…)'},{'id':'permission.tx_binding','family':'R','source':'Permission','target':ANY,'cardinality':'N','read':{'kind':'reverse','parent':'0xaaf'},'retention':'bounded_window','evidence':'object_linker.move\x20L43\x20(FIFO\x205200\x20operational)','bridgeIds':['b09'],'zh':'权限组运行期触碰对象(FIFO\x205200\x20下界)'},{'id':'service.order','family':'R','source':'Service','target':'Order','cardinality':'N','read':{'kind':'reverse','parent':'0xaaf','filterType':'Order'},'retention':'bounded_window','evidence':'object_linker.move\x20L43,L136-140\x20(FIFO\x205200)','bridgeIds':['b01'],'zh':'店铺订单(商家视角权威路径,FIFO\x205200\x20下界;全量走事件通道)'},{'id':'target.vote','family':'S','source':ANY,'target':EOA,'cardinality':'N','read':{'kind':'reverse','parent':'0xaaa'},'retention':'bounded_window','evidence':'registrar.move\x20L154-171\x20(ring\x205200,\x20bits\x200x02/0x04/0x08)','zh':'目标地址收到的\x20like/dislike/favor\x20投票(环形\x205200)'}],TABLE_EDGES=[{'id':'permission.entity','family':'R','source':'Permission','target':ANY,'cardinality':'N','read':{'kind':'table','rowType':'PermissionPerm'},'retention':'membership','evidence':'permission.move\x20L34-42\x20(entity\x20may\x20be\x20EOA\x20or\x20Guard\x20address)','bridgeIds':['b04','b09'],'zh':'权限组实体表成员(EOA\x20或\x20Guard,携带\x20perm\x20索引位)'},{'id':'demand.presenter','family':'R','source':'Demand','target':EOA,'cardinality':'N','read':{'kind':'table','rowType':'DemandPresenter'},'retention':'membership','evidence':'demand.move\x20L68-77\x20(presenters\x20table)','bridgeIds':['b03'],'zh':'向需求提案的供应方及\x20acceptance_score'},{'id':'machine.node','family':'W','source':'Machine','target':'MachineNode','cardinality':'N','read':{'kind':'table','rowType':'MachineNode'},'retention':'complete','evidence':'machine.move\x20L299-308\x20(immutable\x20after\x20publish)','bridgeIds':['b04'],'contract':{'field':'nodes','frozenWhen':'after\x20publish','forbiddenActions':['add','remove','update'],'allowedActions':[],'unfreeze':null,'moveAnchor':'machine.move\x20node_add_imp\x20/\x20node_remove_imp\x20/\x20node_rename_imp\x20(assert_not_published)'},'zh':'工作流节点表(发布后不可变)'}],W_EDGES=[{'id':'wf.transition','family':'W','source':'MachineNode','target':'MachineNode','cardinality':'N','read':{'kind':'derived','producer':'machineRows'},'retention':'derived','evidence':'machine.move\x20L101\x20NodePair,L269','bridgeIds':['b04'],'zh':'节点对有向边(prev_node→node,携带\x20threshold)'},{'id':'wf.forward_guard','family':'W','source':'MachineNode','target':'Guard','cardinality':'N','read':{'kind':'derived','producer':'machineRows'},'retention':'derived','evidence':'machine.move\x20L63\x20Forward','bridgeIds':['b04','b05','b10','b12'],'zh':'节点前进操作的后置\x20Guard(供应链/赔付分账挂点)'}],M_EDGES=[{'id':'payment.recipient','family':'M','source':'Payment','target':EOA,'cardinality':'N','read':{'kind':'structFields','path':'record','field':'recipient'},'retention':'complete','evidence':'payment.move\x20L93-101\x20(Revenue≤200)','bridgeIds':['b05','b08'],'zh':'支付分账收款人(携带金额,逐腿)'},{'id':'payment.from_object','family':'M','source':'Payment','target':ANY,'cardinality':'0..1','read':{'kind':'field','path':'from_object'},'retention':'complete','evidence':'payment.move\x20L149-161\x20(framework-only)','bridgeIds':['b05','b08'],'zh':'资金来源池(Treasury/Allocation/Service,仅框架可设)'},{'id':'payment.for_object','family':'M','source':'Payment','target':ANY,'cardinality':'0..1','read':{'kind':'field','path':'info.for_object'},'retention':'complete','evidence':'payment.move\x20L93-101\x20(info\x20routing\x20hint)','bridgeIds':['b05','b08'],'zh':'业务路由对象(用户可设)'},{'id':'payment.for_guard','family':'M','source':'Payment','target':'Guard','cardinality':'0..1','read':{'kind':'field','path':'info.for_guard'},'retention':'complete','evidence':'payment.move\x20L93-101','bridgeIds':['b05'],'zh':'业务路由\x20Guard'}];export const EDGE_SCHEMAS=[...F_EDGES,...R_EDGES,...TABLE_EDGES,...W_EDGES,...M_EDGES];export const EDGE_SCHEMA_BY_ID=new Map(EDGE_SCHEMAS['map'](a=>[a['id'],a]));export function outgoingSchemaIds(a){return EDGE_SCHEMAS['filter'](b=>b['source']===a||b['source']===ANY)['map'](b=>b['id']);}export const COVERED_OBJECT_TYPES=[...new Set(EDGE_SCHEMAS['flatMap'](a=>[a['source'],a['target']])['filter'](a=>a!==EOA&&a!==ANY&&a!=='MachineNode'))];
@@ -1 +1 @@
1
- import{EDGE_SCHEMAS,EDGE_SCHEMA_BY_ID}from'./edge-schema.js';import{extractCoinType,extractObjectEdges,extractReverseRefs,extractTableRefs,inferObjectType}from'./extract.js';import{mergeBudget}from'./dataplane.js';import{deriveOrderCompletion,terminalNamesOfEdges}from'./order-status.js';const WINDOW_RING_LIMIT=0x1450;function readStats(a){const b=a;if(b['stats'])return{'batches':b['stats']['batches'],'byChannel':{...b['stats']['byChannel']},'dedupHits':b['stats']['dedupHits']};if(b['batches'])return{'batches':Object['values'](b['batches'])['reduce']((c,d)=>c+d,0x0),'byChannel':{...b['batches']},'dedupHits':b['dedupHits']??0x0};return{'batches':0x0,'byChannel':{'objects':0x0,'keyedFields':0x0,'tables':0x0,'events':0x0},'dedupHits':0x0};}function firstByte(a){return parseInt(a['slice'](0x2,0x4),0x10);}function isEoa(a){return firstByte(a)===0x0;}function isWfNodeId(a){return a['includes']('::node::');}class Gate{['wl'];constructor(a){this['wl']=a;}['allows'](a,b){if(this['wl']['deny']?.['includes'](a['id']))return![];const c=this['wl']['familyDepths']?.[a['family']];if(c!==undefined&&b>=c)return![];if(this['wl']['schemas'])return this['wl']['schemas']['includes'](a['id']);if(this['wl']['families']&&!this['wl']['families']['includes'](a['family']))return![];return!![];}['allowsTable'](a,b){return a['read']['kind']==='table'&&this['allows'](a,b)&&!!this['wl']['tableEdges']?.['includes'](a['id']);}}class GraphBuilder{['graph'];['edgeIds']=new Set();['budget'];['exhausted']={};constructor(a,b,c){this['budget']=c,this['graph']={'network':a,'seed':b,'builtAt':Date['now'](),'nodes':new Map(),'edges':[],'out':new Map(),'inc':new Map(),'gaps':[],'truncations':[],'rpcReport':{'batches':0x0,'byChannel':{'objects':0x0,'keyedFields':0x0,'tables':0x0,'events':0x0},'dedupHits':0x0},'budgetExhausted':{}};}['addSeed'](a){const b=inferObjectType(a),c={'id':a,'kind':isWfNodeId(a)?'wfnode':isEoa(a)?'eoa':'object','objectType':b??undefined,'state':'seed','origins':[],'depth':0x0};return this['graph']['nodes']['set'](a,c),c;}['addNode'](a,b,c){const d=this['graph']['nodes']['get'](a);if(d){if(c)d['origins']['push']({'via':c['schema'],'from':c['from'],'depth':b});return d;}if(this['graph']['nodes']['size']>=this['budget']['maxNodes'])return this['exhausted']['nodes']=!![],undefined;const e=isWfNodeId(a),f=e?undefined:inferObjectType(a),g={'id':a,'kind':e?'wfnode':isEoa(a)?'eoa':'object','objectType':f??undefined,'state':e?'stub':'seed','origins':c?[{'via':c['schema'],'from':c['from'],'depth':b}]:[],'depth':b};return this['graph']['nodes']['set'](a,g),g;}['addEdge'](a,b,c,d,e){const f=c['to'],g=c['key']?'|'+c['key']:'',h=a['id']+'|'+b+'→'+f+g;if(this['edgeIds']['has'](h))return;this['edgeIds']['add'](h);const i={'id':h,'schema':a['id'],'family':a['family'],'from':b,'to':f,'retention':a['retention'],'evidence':a['evidence'],'observedAt':d,'payload':c['payload'],'truncated':e||a['retention']==='bounded_window','key':c['key']};this['graph']['edges']['push'](i),pushMap(this['graph']['out'],b,i),pushMap(this['graph']['inc'],f,i);}['markTruncation'](a){this['graph']['truncations']['push'](a);}['finalize'](a){return this['graph']['rpcReport']=readStats(a),this['graph']['budgetExhausted']=this['exhausted'],this['graph'];}}function pushMap(a,b,c){const d=a['get'](b);if(d)d['push'](c);else a['set'](b,[c]);}export async function expandTopology(a,c){const d=c['seed']['toLowerCase'](),e=mergeBudget(c['budget']),f=new Gate(c['edges']??{}),h=new GraphBuilder(c['network'],d,e);h['addSeed'](d);const i=new Set(),j=new Set(),l=new Set();let m=new Set([d]);for(let n=0x0;n<=e['maxDepth'];n++){if(m['size']===0x0)break;if(h['exhausted']['nodes'])break;const o=Date['now'](),p=[...m]['filter'](y=>{const z=h['graph']['nodes']['get'](y);return z['kind']==='object'&&(z['state']==='seed'||z['state']==='stub')&&!i['has'](y);}),q=new Set();if(p['length']>0x0){const y=await a['getObjects'](p);if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];for(const z of p){const A=h['graph']['nodes']['get'](z),B=lookupMapLower(y,z);i['add'](z);if(!B){A['state']='error',A['error']='not_found_or_failed',h['graph']['gaps']['push'](z);continue;}A['state']='fetched',A['raw']=B,A['objectType']=String(B['type']??A['objectType']??inferObjectType(z)??''),A['coinType']=extractCoinType(B['type_raw']),q['add'](z);}}const r=[];for(const C of q){const D=h['graph']['nodes']['get'](C);if(!D['objectType']||!D['raw'])continue;for(const E of extractObjectEdges(D['objectType'],D['raw'])){const F=EDGE_SCHEMA_BY_ID['get'](E['schemaId']);if(!F||!f['allows'](F,n))continue;r['push']({'schema':F,'sourceId':C,'refs':E['refs'],'observed':E['refs']['length']});}}const s=[...q]['filter'](G=>{const H=h['graph']['nodes']['get'](G);return EDGE_SCHEMAS['some'](I=>I['source']===H['objectType']&&I['read']['kind']==='table');});for(const G of s){const H=h['graph']['nodes']['get'](G);for(const I of EDGE_SCHEMAS){if(I['source']!==H['objectType']||!f['allowsTable'](I,n))continue;const J=G+'|'+I['id'];if(l['has'](J))continue;l['add'](J);const K=e['perKindCaps'][I['id']]??e['maxFanoutPerNode'];try{const {items:L,truncated:M}=await a['getTable'](G,{'maxItems':K});if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];const N=extractTableRefs(I['id'],G,L);for(const O of N){const P=EDGE_SCHEMA_BY_ID['get'](O['schemaId']);r['push']({'schema':P,'sourceId':G,'refs':O['refs'],'observed':O['refs']['length']});}if(M)h['markTruncation']({'nodeId':G,'schema':I['id'],'observed':L['length'],'limit':K});}catch{h['graph']['gaps']['push'](G+'#'+I['id']);}}}const t=[...m]['filter'](Q=>{const R=h['graph']['nodes']['get'](Q);return R['kind']!=='wfnode'&&(R['kind']==='eoa'||R['state']==='fetched');}),u=new Map(),v=new Map();for(const Q of t){const R=h['graph']['nodes']['get'](Q);for(const S of EDGE_SCHEMAS){if(S['read']['kind']!=='reverse'||!f['allows'](S,n))continue;if(!sourceMatches(S['source'],R))continue;const T=S['read']['parent'],U=Q+'|'+T;if(j['has'](U))continue;if(!u['has'](T))u['set'](T,[]);u['get'](T)['push'](Q);const V=Q+'|'+T+'|schema',W=v['get'](V)??[];W['push'](S),v['set'](V,W);}}for(const [X,Y]of u){for(const a0 of Y)j['add'](a0+'|'+X);let Z=new Map();try{Z=await a['getKeyedFields'](X,Y);if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];}catch{h['graph']['gaps']['push']('reverse:'+X);continue;}for(const a1 of Y){const a2=v['get'](a1+'|'+X+'|schema')??[],a3=lookupMapLower(Z,a1);if(!a3)continue;const a4=extractReverseRefs(X,a3['data']??a3);for(const a5 of a2){const a6=a5['read'];let a7=a4;a6['kind']==='reverse'&&a6['filterType']&&(a7=a4['filter'](a8=>inferObjectType(a8['to'])===a6['filterType']));if(a7['length']===0x0)continue;r['push']({'schema':a5,'sourceId':a1,'refs':a7,'observed':a7['length']});}}}const w=new Set(),x=new Map();for(const a8 of r){const a9=e['perKindCaps'][a8['schema']['id']]??e['maxFanoutPerNode'],aa=x['get'](a8['sourceId'])??0x0,ab=Math['max'](0x0,e['maxFanoutPerNode']-aa),ac=Math['min'](a9,ab),ad=a8['refs']['slice'](0x0,ac);a8['refs']['length']>ac&&h['markTruncation']({'nodeId':a8['sourceId'],'schema':a8['schema']['id'],'observed':a8['refs']['length'],'limit':WINDOW_RING_LIMIT});for(const ae of ad){const af=ae['from']??a8['sourceId'],ag=isWfNodeId(ae['to'])?n:n+0x1,ah=h['graph']['nodes']['has'](ae['to']);if(ag>e['maxDepth']&&!ah){h['exhausted']['depth']=!![];continue;}const ai=h['addNode'](ae['to'],Math['min'](ag,e['maxDepth']),{'schema':a8['schema']['id'],'from':af});if(!ai)break;h['addEdge'](a8['schema'],af,ae,o,a8['refs']['length']>ac),x['set'](a8['sourceId'],aa+0x1);if(!isWfNodeId(ae['to'])&&ag<=e['maxDepth'])w['add'](ae['to']);}}if(h['exhausted']['rpcs']){h['graph']['gaps']['push']('budget:maxRpcs');break;}m=w;}return h['finalize'](a);}function sourceMatches(a,b){if(a==='ANY')return!![];if(a==='EOA')return b['kind']==='eoa';return b['objectType']===a;}function lookupMapLower(a,b){const c=a['get'](b);if(c!==undefined)return c;for(const [d,e]of a)if(d['toLowerCase']()===b)return e;return undefined;}export function orderCompletionInGraph(a,b){const c=a['nodes']['get'](b['toLowerCase']()),d=c?.['raw']?.['data']??c?.['raw']??{},e=String(d['machine']??''),f=String(d['progress']??''),g=a['nodes']['get'](f['toLowerCase']()),h=String((g?.['raw']?.['data']??g?.['raw']??{})['current']??'');let i=null;if(e){const j=e['toLowerCase']()+'::node::',k=a['edges']['filter'](l=>l['schema']==='wf.transition'&&l['from']['startsWith'](j))['map'](l=>({'node':l['payload']?.['node'],'prev_node':l['payload']?.['prevNode']}));if(k['length']>0x0)i=terminalNamesOfEdges(k);}return deriveOrderCompletion({'machine':e||null,'progress':f||null,'currentNode':h||null,'terminalNames':i});}
1
+ import{EDGE_SCHEMAS,EDGE_SCHEMA_BY_ID}from'./edge-schema.js';import{extractCoinType,extractObjectEdges,extractReverseRefs,extractTableRefs,inferObjectType}from'./extract.js';import{mergeBudget}from'./dataplane.js';import{deriveOrderCompletion,terminalNamesOfEdges}from'./order-status.js';import{wowAddressKind}from'@wowok/wowok';const WINDOW_RING_LIMIT=0x1450;function readStats(a){const b=a;if(b['stats'])return{'batches':b['stats']['batches'],'byChannel':{...b['stats']['byChannel']},'dedupHits':b['stats']['dedupHits']};if(b['batches'])return{'batches':Object['values'](b['batches'])['reduce']((c,d)=>c+d,0x0),'byChannel':{...b['batches']},'dedupHits':b['dedupHits']??0x0};return{'batches':0x0,'byChannel':{'objects':0x0,'keyedFields':0x0,'tables':0x0,'events':0x0},'dedupHits':0x0};}function isEoa(a){return wowAddressKind(a)==='user';}function isWfNodeId(a){return a['includes']('::node::');}class Gate{['wl'];constructor(a){this['wl']=a;}['allows'](a,b){if(this['wl']['deny']?.['includes'](a['id']))return![];const c=this['wl']['familyDepths']?.[a['family']];if(c!==undefined&&b>=c)return![];if(this['wl']['schemas'])return this['wl']['schemas']['includes'](a['id']);if(this['wl']['families']&&!this['wl']['families']['includes'](a['family']))return![];return!![];}['allowsTable'](a,b){return a['read']['kind']==='table'&&this['allows'](a,b)&&!!this['wl']['tableEdges']?.['includes'](a['id']);}}class GraphBuilder{['graph'];['edgeIds']=new Set();['budget'];['exhausted']={};constructor(a,b,c){this['budget']=c,this['graph']={'network':a,'seed':b,'builtAt':Date['now'](),'nodes':new Map(),'edges':[],'out':new Map(),'inc':new Map(),'gaps':[],'truncations':[],'rpcReport':{'batches':0x0,'byChannel':{'objects':0x0,'keyedFields':0x0,'tables':0x0,'events':0x0},'dedupHits':0x0},'budgetExhausted':{}};}['addSeed'](a){const b=inferObjectType(a),c={'id':a,'kind':isWfNodeId(a)?'wfnode':isEoa(a)?'eoa':'object','objectType':b??undefined,'state':'seed','origins':[],'depth':0x0};return this['graph']['nodes']['set'](a,c),c;}['addNode'](a,b,c){const d=this['graph']['nodes']['get'](a);if(d){if(c)d['origins']['push']({'via':c['schema'],'from':c['from'],'depth':b});return d;}if(this['graph']['nodes']['size']>=this['budget']['maxNodes'])return this['exhausted']['nodes']=!![],undefined;const e=isWfNodeId(a),f=e?undefined:inferObjectType(a),g={'id':a,'kind':e?'wfnode':isEoa(a)?'eoa':'object','objectType':f??undefined,'state':e?'stub':'seed','origins':c?[{'via':c['schema'],'from':c['from'],'depth':b}]:[],'depth':b};return this['graph']['nodes']['set'](a,g),g;}['addEdge'](a,b,c,d,e){const f=c['to'],g=c['key']?'|'+c['key']:'',h=a['id']+'|'+b+'→'+f+g;if(this['edgeIds']['has'](h))return;this['edgeIds']['add'](h);const i={'id':h,'schema':a['id'],'family':a['family'],'from':b,'to':f,'retention':a['retention'],'evidence':a['evidence'],'observedAt':d,'payload':c['payload'],'truncated':e||a['retention']==='bounded_window','key':c['key']};this['graph']['edges']['push'](i),pushMap(this['graph']['out'],b,i),pushMap(this['graph']['inc'],f,i);}['markTruncation'](a){this['graph']['truncations']['push'](a);}['finalize'](a){return this['graph']['rpcReport']=readStats(a),this['graph']['budgetExhausted']=this['exhausted'],this['graph'];}}function pushMap(a,b,c){const d=a['get'](b);if(d)d['push'](c);else a['set'](b,[c]);}export async function expandTopology(a,c){const d=c['seed']['toLowerCase'](),e=mergeBudget(c['budget']),f=new Gate(c['edges']??{}),h=new GraphBuilder(c['network'],d,e);h['addSeed'](d);const i=new Set(),j=new Set(),l=new Set();let m=new Set([d]);for(let n=0x0;n<=e['maxDepth'];n++){if(m['size']===0x0)break;if(h['exhausted']['nodes'])break;const o=Date['now'](),p=[...m]['filter'](y=>{const z=h['graph']['nodes']['get'](y);return z['kind']==='object'&&(z['state']==='seed'||z['state']==='stub')&&!i['has'](y);}),q=new Set();if(p['length']>0x0){const y=await a['getObjects'](p);if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];for(const z of p){const A=h['graph']['nodes']['get'](z),B=lookupMapLower(y,z);i['add'](z);if(!B){A['state']='error',A['error']='not_found_or_failed',h['graph']['gaps']['push'](z);continue;}A['state']='fetched',A['raw']=B,A['objectType']=String(B['type']??A['objectType']??inferObjectType(z)??''),A['coinType']=extractCoinType(B['type_raw']),q['add'](z);}}const r=[];for(const C of q){const D=h['graph']['nodes']['get'](C);if(!D['objectType']||!D['raw'])continue;for(const E of extractObjectEdges(D['objectType'],D['raw'])){const F=EDGE_SCHEMA_BY_ID['get'](E['schemaId']);if(!F||!f['allows'](F,n))continue;r['push']({'schema':F,'sourceId':C,'refs':E['refs'],'observed':E['refs']['length']});}}const s=[...q]['filter'](G=>{const H=h['graph']['nodes']['get'](G);return EDGE_SCHEMAS['some'](I=>I['source']===H['objectType']&&I['read']['kind']==='table');});for(const G of s){const H=h['graph']['nodes']['get'](G);for(const I of EDGE_SCHEMAS){if(I['source']!==H['objectType']||!f['allowsTable'](I,n))continue;const J=G+'|'+I['id'];if(l['has'](J))continue;l['add'](J);const K=e['perKindCaps'][I['id']]??e['maxFanoutPerNode'];try{const {items:L,truncated:M}=await a['getTable'](G,{'maxItems':K});if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];const N=extractTableRefs(I['id'],G,L);for(const O of N){const P=EDGE_SCHEMA_BY_ID['get'](O['schemaId']);r['push']({'schema':P,'sourceId':G,'refs':O['refs'],'observed':O['refs']['length']});}if(M)h['markTruncation']({'nodeId':G,'schema':I['id'],'observed':L['length'],'limit':K});}catch{h['graph']['gaps']['push'](G+'#'+I['id']);}}}const t=[...m]['filter'](Q=>{const R=h['graph']['nodes']['get'](Q);return R['kind']!=='wfnode'&&(R['kind']==='eoa'||R['state']==='fetched');}),u=new Map(),v=new Map();for(const Q of t){const R=h['graph']['nodes']['get'](Q);for(const S of EDGE_SCHEMAS){if(S['read']['kind']!=='reverse'||!f['allows'](S,n))continue;if(!sourceMatches(S['source'],R))continue;const T=S['read']['parent'],U=Q+'|'+T;if(j['has'](U))continue;if(!u['has'](T))u['set'](T,[]);u['get'](T)['push'](Q);const V=Q+'|'+T+'|schema',W=v['get'](V)??[];W['push'](S),v['set'](V,W);}}for(const [X,Y]of u){for(const a0 of Y)j['add'](a0+'|'+X);let Z=new Map();try{Z=await a['getKeyedFields'](X,Y);if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];}catch{h['graph']['gaps']['push']('reverse:'+X);continue;}for(const a1 of Y){const a2=v['get'](a1+'|'+X+'|schema')??[],a3=lookupMapLower(Z,a1);if(!a3)continue;const a4=extractReverseRefs(X,a3['data']??a3);for(const a5 of a2){const a6=a5['read'];let a7=a4;a6['kind']==='reverse'&&a6['filterType']&&(a7=a4['filter'](a8=>inferObjectType(a8['to'])===a6['filterType']));if(a7['length']===0x0)continue;r['push']({'schema':a5,'sourceId':a1,'refs':a7,'observed':a7['length']});}}}const w=new Set(),x=new Map();for(const a8 of r){const a9=e['perKindCaps'][a8['schema']['id']]??e['maxFanoutPerNode'],aa=x['get'](a8['sourceId'])??0x0,ab=Math['max'](0x0,e['maxFanoutPerNode']-aa),ac=Math['min'](a9,ab),ad=a8['refs']['slice'](0x0,ac);a8['refs']['length']>ac&&h['markTruncation']({'nodeId':a8['sourceId'],'schema':a8['schema']['id'],'observed':a8['refs']['length'],'limit':WINDOW_RING_LIMIT});for(const ae of ad){const af=ae['from']??a8['sourceId'],ag=isWfNodeId(ae['to'])?n:n+0x1,ah=h['graph']['nodes']['has'](ae['to']);if(ag>e['maxDepth']&&!ah){h['exhausted']['depth']=!![];continue;}const ai=h['addNode'](ae['to'],Math['min'](ag,e['maxDepth']),{'schema':a8['schema']['id'],'from':af});if(!ai)break;h['addEdge'](a8['schema'],af,ae,o,a8['refs']['length']>ac),x['set'](a8['sourceId'],aa+0x1);if(!isWfNodeId(ae['to'])&&ag<=e['maxDepth'])w['add'](ae['to']);}}if(h['exhausted']['rpcs']){h['graph']['gaps']['push']('budget:maxRpcs');break;}m=w;}return h['finalize'](a);}function sourceMatches(a,b){if(a==='ANY')return!![];if(a==='EOA')return b['kind']==='eoa';return b['objectType']===a;}function lookupMapLower(a,b){const c=a['get'](b);if(c!==undefined)return c;for(const [d,e]of a)if(d['toLowerCase']()===b)return e;return undefined;}export function orderCompletionInGraph(a,b){const c=a['nodes']['get'](b['toLowerCase']()),d=c?.['raw']?.['data']??c?.['raw']??{},e=String(d['machine']??''),f=String(d['progress']??''),g=a['nodes']['get'](f['toLowerCase']()),h=String((g?.['raw']?.['data']??g?.['raw']??{})['current']??'');let i=null;if(e){const j=e['toLowerCase']()+'::node::',k=a['edges']['filter'](l=>l['schema']==='wf.transition'&&l['from']['startsWith'](j))['map'](l=>({'node':l['payload']?.['node'],'prev_node':l['payload']?.['prevNode']}));if(k['length']>0x0)i=terminalNamesOfEdges(k);}return deriveOrderCompletion({'machine':e||null,'progress':f||null,'currentNode':h||null,'terminalNames':i});}
@@ -1 +1 @@
1
- import{describe,expect,it}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'./dataplane.js';import{expandTopology,orderCompletionInGraph}from'./expand.js';import{extractObjectEdges,extractReverseRefs,extractTableRefs}from'./extract.js';import{annotateNodeName,deriveOrderCompletion,terminalNamesOfEdges,terminalNamesOfRows,workflowSubgraphFromRows,workflowSubgraphFromEdges}from'./order-status.js';import{COVERED_OBJECT_TYPES,EDGE_SCHEMAS}from'./edge-schema.js';import{FIELD_MUTABILITY_RULES,fieldMutabilityOf,isActionForbidden}from'../../knowledge/contract-invariants.js';import{buildViewport}from'./viewport.js';function mk(a,b){return'0x'+a['toString'](0x10)['padStart'](0x2,'0')+b['toString'](0x10)['padStart'](0x3e,'0');}const eoa=a=>mk(0x0,a),obj=(a,b)=>mk(0x10+a,b),T_USDT='0x2::wow::coins::USDT',buyer=eoa(0x1),otherBuyer=eoa(0x2),merchant=eoa(0x3),collaborator=eoa(0x4),voter1=eoa(0x5),svc=obj(0x4,0xa),mac=obj(0x5,0xb),o1=obj(0x6,0x15),o2=obj(0x6,0x16),o3=obj(0x6,0x17),o4=obj(0x6,0x18),pr1=obj(0x7,0x1f),pr2=obj(0x7,0x20),pay=obj(0x8,0x29),perm=obj(0x0,0x33),g1=obj(0xa,0x3d),g2=obj(0xa,0x3e),gShip=obj(0xa,0x3f),gOther=obj(0xa,0x45),alloc=obj(0xd,0x47),arbsvc=obj(0x3,0x51),arb=obj(0x2,0x52);function raw(a,b,c,d){return{'object':a,'type':b,'data':c,...d?{'type_raw':d}:{}};}const OBJECTS=[raw(svc,'Service',{'permission':perm,'machine':mac,'arbitrations':[arbsvc],'order_allocators':{'allocators':[{'guard':g1}]}},'0x2::service::Service<'+T_USDT+'>'),raw(o1,'Order',{'builder':buyer,'agent':[],'service':svc,'machine':mac,'progress':pr1,'allocation':alloc,'dispute':[arb]}),raw(o2,'Order',{'builder':buyer,'agent':[],'service':svc,'machine':mac,'progress':pr2,'allocation':alloc,'dispute':[]}),raw(o3,'Order',{'builder':buyer,'agent':[],'service':svc,'dispute':[]}),raw(o4,'Order',{'builder':otherBuyer,'agent':[],'service':svc,'machine':mac,'progress':undefined,'dispute':[]}),raw(mac,'Machine',{'permission':perm,'consensus_repositories':[]}),raw(pr1,'Progress',{'machine':mac,'task':o1,'current':'done'}),raw(pr2,'Progress',{'machine':mac,'task':o2,'current':'shipping'}),raw(alloc,'Allocation',{'allocators':{'threshold':0x1,'allocators':[{'guard':g1,'mode':0x0}]}},'0x2::allocation::Allocation<'+T_USDT+'>'),raw(perm,'Permission',{'admin':[merchant]}),raw(g1,'Guard',{'relies':[g2]}),raw(g2,'Guard',{'relies':[]}),raw(gShip,'Guard',{'relies':[]}),raw(arbsvc,'Arbitration',{'permission':perm,'voting_guard':[{'guard':g1}]}),raw(arb,'Arb',{'order':o1,'arbitration':arbsvc,'voted':[{'voter':voter1,'weight':0x3}]}),raw(pay,'Payment',{'record':[{'recipient':merchant,'amount':'99900'}],'from_object':alloc,'info':{'for_object':o1,'for_guard':g1}},'0x2::payment::Payment<'+T_USDT+'>')];let TABLE_SEQ=0x0;function nodeTableItem(a,b,c){TABLE_SEQ++;const d='0x9'+TABLE_SEQ['toString'](0x10)['padStart'](0x3f,'0');return{'key':a,'objectId':d,'object':raw(d,'TableItem_MachineNode',{'name':b,'value':c})};}function permTableItem(a,b){const c='0x9'+a['slice'](0x2,0x1e)['padEnd'](0x3f,'0')['slice'](0x0,0x3f);return{'key':a,'objectId':c,'object':raw(c,'TableItem_PermissionPerm',{'address':a,'perm':b})};}function makePlane(){const a=[nodeTableItem('start','start',[]),nodeTableItem('shipping','shipping',[{'prev_node':'start','threshold':0x0,'forwards':[{'name':'f_ship','weight':0x1,'guard':gShip}]}]),nodeTableItem('done','done',[{'prev_node':'shipping','threshold':0x0,'forwards':[{'name':'f_done','weight':0x1}]}])],b=new Map(OBJECTS['map'](e=>[e['object']['toLowerCase'](),e])),c=new Map();c['set']('0xaa8',new Map([[buyer,{'items':[{'role':0x1,'order':o1,'time':0x1},{'role':0x2,'order':o2,'time':0x2},{'role':0x1,'order':o3,'time':0x3}]}]])),c['set']('0xaaad',new Map([[merchant,{'items':[{'role':0x1,'permission':perm,'time':0x1}]}]])),c['set']('0xaae',new Map([[perm,{'items':[{'who':svc,'time':0x1}]}]])),c['set']('0xaaf',new Map([[svc,{'items':[{'who':o1,'time':0x1},{'who':o2,'time':0x2},{'who':o4,'time':0x3},{'who':gOther,'time':0x4}]}]]));const d=new Map([[mac['toLowerCase'](),a],[perm['toLowerCase'](),[permTableItem(collaborator,[0x1,0x2])]]]);return new FakeDataPlane({'objects':b,'keyedFields':c,'tables':d});}const FULL_EDGES={'tableEdges':['machine.node','permission.entity']};async function buildBuyerGraph(a){const b=makePlane(),c=await expandTopology(b,{'network':ENTRYPOINT['Mainnet'],'seed':buyer,'edges':FULL_EDGES,...a?{'budget':a}:{}});return{'graph':c,'plane':b};}describe('extract\x20—\x20field\x20edges',()=>{it('reads\x20scalar,\x20vector,\x20struct\x20and\x20deep\x20nested\x20refs\x20defensively',()=>{const a=extractObjectEdges('Service',OBJECTS[0x0]),b=new Map(a['map'](c=>[c['schemaId'],c['refs']['map'](d=>d['to'])]));expect(b['get']('service.permission'))['toEqual']([perm]),expect(b['get']('service.machine'))['toEqual']([mac]),expect(b['get']('service.arbitration'))['toEqual']([arbsvc]),expect(b['get']('service.order_allocator_guard'))['toEqual']([g1]);}),it('parses\x20coin\x20type\x20T\x20and\x20money\x20payloads\x20on\x20Payment',()=>{const a=extractObjectEdges('Payment',OBJECTS['find'](d=>d['object']===pay)),b=new Map(a['map'](d=>[d['schemaId'],d])),c=b['get']('payment.recipient')['refs'][0x0];expect(c['to'])['toBe'](merchant),expect(c['payload']?.['amount'])['toBe']('99900'),expect(c['payload']?.['coinType'])['toBe'](T_USDT),expect(b['get']('payment.from_object')['refs'][0x0]['to'])['toBe'](alloc),expect(b['get']('payment.for_guard')['refs'][0x0]['to'])['toBe'](g1);}),it('reverse\x20field\x20shapes:\x20items[]\x20and\x20votes[]\x20with\x20role/vote\x20payloads',()=>{expect(extractReverseRefs('0xaa8',{'items':[{'role':0x3,'order':o1}]})[0x0]['payload']?.['roleBits'])['toBe'](0x3);const a=extractReverseRefs('0xaaa',{'votes':[{'who':voter1,'like':!![],'favor':!![]}]});expect(a[0x0]['payload']?.['voteBits'])['toBe'](0x2|0x8);}),it('machine\x20table\x20rows\x20produce\x20node\x20+\x20transition\x20+\x20guard\x20edges',()=>{const a=makePlane()['state']['tables']['get'](mac['toLowerCase']()),b=extractTableRefs('machine.node',mac,a),c=new Map(b['map'](e=>[e['schemaId'],e['refs']]));expect(c['get']('machine.node')?.['length'])['toBe'](0x3);const d=c['get']('wf.transition');expect(d['map'](e=>[e['from']['includes']('start'),e['to']['includes']('shipping')]))['toContainEqual']([!![],!![]]),expect(c['get']('wf.forward_guard')?.[0x0]['to'])['toBe'](gShip);});}),describe('order-status\x20—\x20structural\x20authority',()=>{it('terminal\x20=\x20names\x20never\x20appearing\x20as\x20prev_node',()=>{const a=terminalNamesOfEdges([{'node':'shipping','prev_node':'start'},{'node':'done','prev_node':'shipping'}]);expect([...a])['toEqual'](['done']),expect([...terminalNamesOfRows([{'name':'a','value':[]},{'name':'b','value':[{'prev_node':'a'}]}])])['toEqual'](['b']);}),it('four\x20completion\x20states',()=>{const a=new Set(['done']);expect(deriveOrderCompletion({'machine':null})['status'])['toBe']('completed'),expect(deriveOrderCompletion({'machine':mac,'progress':null})['status'])['toBe']('in_progress'),expect(deriveOrderCompletion({'machine':mac,'progress':pr1,'currentNode':'shipping','terminalNames':a})['status'])['toBe']('in_progress'),expect(deriveOrderCompletion({'machine':mac,'progress':pr1,'currentNode':'done','terminalNames':a})['status'])['toBe']('completed'),expect(deriveOrderCompletion({'machine':mac,'progress':pr1,'currentNode':'done','terminalNames':null})['status'])['toBe']('unknown');}),it('name\x20vocabulary\x20is\x20annotation\x20only',()=>{expect(annotateNodeName('order_refunded'))['toBe']('refund'),expect(annotateNodeName('dispute_node'))['toBe']('exception'),expect(annotateNodeName('shipping'))['toBeNull']();}),it('workflowSubgraphFromRows\x20flattens\x20pairs/forwards\x20and\x20keeps\x20structural\x20terminals',()=>{const a=workflowSubgraphFromRows([{'name':'shipped','value':[{'prev_node':'paid','threshold':0x2,'forwards':[{'name':'ship','guard':{'guard':'0xg','retained_submission':[]},'weight':0x1},{'name':'airdrop','namedOperator':'op','permissionIndex':0x3}]}]},{'name':'done','value':[{'prev_node':'shipped','forwards':[{'name':'confirm'}]}]}],'0xm');expect(a['machine'])['toBe']('0xm'),expect(a['transitions']['map'](b=>b['prevNode']+'>'+b['forward']+'>'+b['node']))['toEqual'](['paid>ship>shipped','paid>airdrop>shipped','shipped>confirm>done']),expect(a['transitions'][0x0]['guard'])['toBe']('0xg'),expect(a['transitions'][0x0]['threshold'])['toBe'](0x2),expect(a['transitions'][0x1]['namedOperator'])['toBe']('op'),expect(a['transitions'][0x1]['permissionIndex'])['toBe'](0x3),expect([...a['terminalNames']])['toEqual'](['done']);}),it('workflowSubgraphFromEdges\x20reads\x20wf.transition\x20payloads\x20and\x20filters\x20by\x20machine',()=>{const a=[{'schema':'wf.transition','from':'0xm1::node::paid','to':'0xm1::node::done','payload':{'node':'done','prevNode':'paid','forward':'confirm','guard':'0xg'}},{'schema':'wf.transition','from':'0xm2::node::paid','to':'0xm2::node::done','payload':{'node':'done','prevNode':'paid','forward':'confirm'}},{'schema':'machine.node','from':'0xm1','to':'0xm1::node::paid'}],b=workflowSubgraphFromEdges(a);expect(b['transitions'])['toHaveLength'](0x2);const c=workflowSubgraphFromEdges(a,'0xm1');expect(c['transitions'])['toHaveLength'](0x1),expect(c['transitions'][0x0])['toMatchObject']({'node':'done','prevNode':'paid','forward':'confirm','guard':'0xg'}),expect([...c['terminalNames']])['toEqual'](['done']);});}),describe('expandTopology\x20—\x20wave\x20BFS\x20over\x20DataPlane',()=>{it('connects\x20F/R/W/S/M\x20edges\x20with\x20dedupe\x20and\x20no\x20per-id\x20fan-out',async()=>{const {graph:a,plane:b}=await buildBuyerGraph(),c=new Set(a['edges']['map'](f=>f['schema']));for(const e of['eoa.order','order.service','order.progress','order.allocation','service.permission','service.machine','service.order_allocator_guard','service.arbitration','machine.permission','progress.machine','machine.node','wf.transition','wf.forward_guard','guard.relies','arb.order','arb.voter','allocation.guard']){expect(c['has'](e),'missing\x20edge\x20'+e)['toBe'](!![]);}const d=a['edges']['filter'](f=>f['schema']==='service.order')['map'](f=>f['to']);expect(new Set(d))['toEqual'](new Set([o1,o2,o4])),expect(a['nodes']['get'](svc)?.['objectType'])['toBe']('Service'),expect(a['edges']['length'])['toBe'](new Set(a['edges']['map'](f=>f['id']))['size']),expect(b['batches']['objects'])['toBeLessThanOrEqual'](0x6),expect(a['gaps'])['toEqual']([]);}),it('resolves\x20completion\x20from\x20the\x20graph;\x20unknown\x20when\x20machine\x20table\x20not\x20expanded',async()=>{const {graph:a}=await buildBuyerGraph();expect(orderCompletionInGraph(a,o1)['status'])['toBe']('completed'),expect(orderCompletionInGraph(a,o2)['status'])['toBe']('in_progress'),expect(orderCompletionInGraph(a,o3)['status'])['toBe']('completed');const b=makePlane(),c=await expandTopology(b,{'network':ENTRYPOINT['Mainnet'],'seed':buyer});expect(orderCompletionInGraph(c,o1)['status'])['toBe']('unknown');}),it('caps\x20per-kind\x20fanout\x20and\x20records\x20truncation;\x20window\x20edges\x20flagged',async()=>{const {graph:a}=await buildBuyerGraph({'perKindCaps':{'eoa.order':0x1}});expect(a['edges']['filter'](b=>b['schema']==='eoa.order'))['toHaveLength'](0x1),expect(a['truncations']['some'](b=>b['schema']==='eoa.order'))['toBe'](!![]),expect(a['edges']['find'](b=>b['schema']==='eoa.order')?.['truncated'])['toBe'](!![]);}),it('fail-soft:\x20missing\x20objects\x20become\x20gaps,\x20build\x20still\x20succeeds',async()=>{const a=makePlane();a['state']['objects']['delete'](mac['toLowerCase']());const b=await expandTopology(a,{'network':ENTRYPOINT['Mainnet'],'seed':buyer,'edges':FULL_EDGES});expect(b['nodes']['get'](mac)?.['state'])['toBe']('error'),expect(b['gaps'])['toContain'](mac),expect(b['edges']['some'](c=>c['schema']==='order.service'))['toBe'](!![]);}),it('enforces\x20maxDepth',async()=>{const {graph:a}=await buildBuyerGraph({'maxDepth':0x1});expect(a['nodes']['has'](o1))['toBe'](!![]),expect(a['nodes']['has'](svc))['toBe'](![]),expect(a['budgetExhausted']['depth'])['toBe'](!![]);});}),describe('DataPlane\x20batching',()=>{it('chunks\x20at\x2050\x20and\x20counts\x20logical\x20RPC\x20batches',async()=>{const a=new FakeDataPlane({});await a['getObjects'](Array['from']({'length':0x65},(b,c)=>obj(0x6,0x3e8+c))),expect(a['batches']['objects'])['toBe'](0x3),await a['getObjects'](Array['from']({'length':0x65},(b,c)=>obj(0x6,0x3e8+c))),expect(a['batches']['objects'])['toBe'](0x3),expect(a['dedupHits'])['toBe'](0x65);});}),describe('viewport',()=>{it('buyer\x20never\x20sees\x20other\x20customers\x20through\x20service.order',async()=>{const {graph:a}=await buildBuyerGraph(),b=buildViewport(a,buyer,'buyer');expect(b['visibleNodes']['has'](o1))['toBe'](!![]),expect(b['visibleNodes']['has'](svc))['toBe'](!![]),expect(b['visibleNodes']['has'](o4))['toBe'](![]),expect(b['visibleNodes']['has'](otherBuyer))['toBe'](![]),expect(b['visibleEdges']['some'](c=>c['schema']==='service.order'))['toBe'](![]);}),it('merchant\x20sees\x20shop\x20orders\x20and\x20their\x20parties',async()=>{const {graph:a}=await buildBuyerGraph(),b=buildViewport(a,merchant,'merchant');expect(b['visibleNodes']['has'](perm))['toBe'](!![]),expect(b['visibleNodes']['has'](svc))['toBe'](!![]),expect(b['visibleNodes']['has'](o4))['toBe'](!![]),expect(b['visibleNodes']['has'](otherBuyer))['toBe'](!![]),expect(b['visibleNodes']['has'](collaborator))['toBe'](!![]),expect(b['visibleEdges']['some'](c=>c['schema']==='service.order'))['toBe'](!![]);}),it('neutral\x20role\x20sees\x20the\x20full\x20canon\x20graph',async()=>{const {graph:a}=await buildBuyerGraph(),b=buildViewport(a,buyer,'neutral');expect(b['visibleNodes']['size'])['toBe'](a['nodes']['size']);});}),describe('edge\x20schema\x20registry',()=>{it('covers\x20the\x20core\x20commercial\x20object\x20types',()=>{for(const a of['Service','Order','Machine','Progress','Payment','Allocation','Arbitration','Arb','Permission','Guard','Demand','Reward','Contact','Treasury']){expect(COVERED_OBJECT_TYPES)['toContain'](a);}});}),describe('EdgeSchema.contract\x20—\x20field\x20mutability\x20ground\x20truth',()=>{const a=['service.machine','service.buy_guard','service.arbitration','service.reward','service.repository','progress.machine','progress.task','machine.consensus_repository','machine.node','allocation.guard'];it('marks\x20exactly\x20the\x20address-field\x20edges\x20with\x20mutability\x20metadata',()=>{const b=EDGE_SCHEMAS['filter'](c=>c['contract'])['map'](c=>c['id'])['sort']();expect(b)['toEqual']([...a]['sort']());}),it('carries\x20the\x20publish-freeze\x20distinction\x20(machine\x20frozen,\x20buy_guard\x20mutable)',()=>{const b=EDGE_SCHEMAS['find'](d=>d['id']==='service.machine')['contract'];expect(b['frozenWhen'])['toBe']('after\x20publish'),expect(b['forbiddenActions'])['toContain']('set'),expect(b['unfreeze'])['toBeNull']();const c=EDGE_SCHEMAS['find'](d=>d['id']==='service.buy_guard')['contract'];expect(c['frozenWhen'])['toBeNull'](),expect(c['allowedActions'])['toContain']('set');}),it('derives\x20the\x20knowledge\x20field-rule\x20table\x20without\x20duplicating\x20facts',()=>{expect(fieldMutabilityOf('Service','machine')?.['frozen_when'])['toBe']('after\x20publish'),expect(fieldMutabilityOf('Machine','nodes')?.['forbidden_actions'])['toContain']('update'),expect(fieldMutabilityOf('Allocation','allocators')?.['frozen_when'])['toBe']('after\x20create\x20(share)'),expect(EDGE_SCHEMAS['find'](c=>c['id']==='allocation.guard')['contract']['field'])['toBe']('allocators');const b=FIELD_MUTABILITY_RULES['map'](c=>c['object_type']+'.'+c['field']);expect(new Set(b)['size'])['toBe'](b['length']),expect(FIELD_MUTABILITY_RULES)['toHaveLength'](0x14),expect(isActionForbidden('Service','machine','set',!![]))['toBe'](!![]),expect(isActionForbidden('Service','machine','set',![]))['toBe'](![]),expect(isActionForbidden('Service','buy_guard','set',!![]))['toBe'](![]);});});
1
+ import{describe,expect,it}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'./dataplane.js';import{expandTopology,orderCompletionInGraph}from'./expand.js';import{extractObjectEdges,extractReverseRefs,extractTableRefs}from'./extract.js';import{annotateNodeName,deriveOrderCompletion,terminalNamesOfEdges,terminalNamesOfRows,workflowSubgraphFromRows,workflowSubgraphFromEdges}from'./order-status.js';import{COVERED_OBJECT_TYPES,EDGE_SCHEMAS}from'./edge-schema.js';import{FIELD_MUTABILITY_RULES,fieldMutabilityOf,isActionForbidden}from'../../knowledge/contract-invariants.js';import{buildViewport}from'./viewport.js';function mk(a,b){return'0x'+a['toString'](0x10)['padStart'](0x2,'0')+b['toString'](0x10)['padStart'](0x3e,'0');}const eoa=a=>mk(0x0,a),obj=(a,b)=>mk(0x10+a,b),T_USDT='0x2::wow::coins::USDT',buyer=eoa(0x1),otherBuyer=eoa(0x2),merchant=eoa(0x3),collaborator=eoa(0x4),voter1=eoa(0x5),svc=obj(0x4,0xa),mac=obj(0x5,0xb),o1=obj(0x6,0x15),o2=obj(0x6,0x16),o3=obj(0x6,0x17),o4=obj(0x6,0x18),pr1=obj(0x7,0x1f),pr2=obj(0x7,0x20),pay=obj(0x8,0x29),perm=obj(0x0,0x33),g1=obj(0xa,0x3d),g2=obj(0xa,0x3e),gShip=obj(0xa,0x3f),gOther=obj(0xa,0x45),alloc=obj(0xd,0x47),arbsvc=obj(0x3,0x51),arb=obj(0x2,0x52);function raw(a,b,c,d){return{'object':a,'type':b,'data':c,...d?{'type_raw':d}:{}};}const OBJECTS=[raw(svc,'Service',{'permission':perm,'machine':mac,'arbitrations':[arbsvc],'order_allocators':{'allocators':[{'guard':g1}]}},'0x2::service::Service<'+T_USDT+'>'),raw(o1,'Order',{'builder':buyer,'agent':[],'service':svc,'machine':mac,'progress':pr1,'allocation':alloc,'dispute':[arb]}),raw(o2,'Order',{'builder':buyer,'agent':[],'service':svc,'machine':mac,'progress':pr2,'allocation':alloc,'dispute':[]}),raw(o3,'Order',{'builder':buyer,'agent':[],'service':svc,'dispute':[]}),raw(o4,'Order',{'builder':otherBuyer,'agent':[],'service':svc,'machine':mac,'progress':undefined,'dispute':[]}),raw(mac,'Machine',{'permission':perm,'consensus_repositories':[]}),raw(pr1,'Progress',{'machine':mac,'task':o1,'current':'done'}),raw(pr2,'Progress',{'machine':mac,'task':o2,'current':'shipping'}),raw(alloc,'Allocation',{'allocators':{'threshold':0x1,'allocators':[{'guard':g1,'mode':0x0}]}},'0x2::allocation::Allocation<'+T_USDT+'>'),raw(perm,'Permission',{'admin':[merchant]}),raw(g1,'Guard',{'relies':[g2]}),raw(g2,'Guard',{'relies':[]}),raw(gShip,'Guard',{'relies':[]}),raw(arbsvc,'Arbitration',{'permission':perm,'voting_guard':[{'guard':g1}]}),raw(arb,'Arb',{'order':o1,'arbitration':arbsvc,'voted':[{'voter':voter1,'weight':0x3}]}),raw(pay,'Payment',{'record':[{'recipient':merchant,'amount':'99900'}],'from_object':alloc,'info':{'for_object':o1,'for_guard':g1}},'0x2::payment::Payment<'+T_USDT+'>')];let TABLE_SEQ=0x0;function nodeTableItem(a,b,c){TABLE_SEQ++;const d='0x9'+TABLE_SEQ['toString'](0x10)['padStart'](0x3f,'0');return{'key':a,'objectId':d,'object':raw(d,'TableItem_MachineNode',{'name':b,'value':c})};}function permTableItem(a,b){const c='0x9'+a['slice'](0x2,0x1e)['padEnd'](0x3f,'0')['slice'](0x0,0x3f);return{'key':a,'objectId':c,'object':raw(c,'TableItem_PermissionPerm',{'address':a,'perm':b})};}function makePlane(){const a=[nodeTableItem('start','start',[]),nodeTableItem('shipping','shipping',[{'prev_node':'start','threshold':0x0,'forwards':[{'name':'f_ship','weight':0x1,'guard':gShip}]}]),nodeTableItem('done','done',[{'prev_node':'shipping','threshold':0x0,'forwards':[{'name':'f_done','weight':0x1}]}])],b=new Map(OBJECTS['map'](e=>[e['object']['toLowerCase'](),e])),c=new Map();c['set']('0xaa8',new Map([[buyer,{'items':[{'role':0x1,'order':o1,'time':0x1},{'role':0x2,'order':o2,'time':0x2},{'role':0x1,'order':o3,'time':0x3}]}]])),c['set']('0xaad',new Map([[merchant,{'items':[{'role':0x1,'permission':perm,'time':0x1}]}]])),c['set']('0xaae',new Map([[perm,{'items':[{'who':svc,'time':0x1}]}]])),c['set']('0xaaf',new Map([[svc,{'items':[{'who':o1,'time':0x1},{'who':o2,'time':0x2},{'who':o4,'time':0x3},{'who':gOther,'time':0x4}]}]]));const d=new Map([[mac['toLowerCase'](),a],[perm['toLowerCase'](),[permTableItem(collaborator,[0x1,0x2])]]]);return new FakeDataPlane({'objects':b,'keyedFields':c,'tables':d});}const FULL_EDGES={'tableEdges':['machine.node','permission.entity']};async function buildBuyerGraph(a){const b=makePlane(),c=await expandTopology(b,{'network':ENTRYPOINT['Mainnet'],'seed':buyer,'edges':FULL_EDGES,...a?{'budget':a}:{}});return{'graph':c,'plane':b};}describe('extract\x20—\x20field\x20edges',()=>{it('reads\x20scalar,\x20vector,\x20struct\x20and\x20deep\x20nested\x20refs\x20defensively',()=>{const a=extractObjectEdges('Service',OBJECTS[0x0]),b=new Map(a['map'](c=>[c['schemaId'],c['refs']['map'](d=>d['to'])]));expect(b['get']('service.permission'))['toEqual']([perm]),expect(b['get']('service.machine'))['toEqual']([mac]),expect(b['get']('service.arbitration'))['toEqual']([arbsvc]),expect(b['get']('service.order_allocator_guard'))['toEqual']([g1]);}),it('parses\x20coin\x20type\x20T\x20and\x20money\x20payloads\x20on\x20Payment',()=>{const a=extractObjectEdges('Payment',OBJECTS['find'](d=>d['object']===pay)),b=new Map(a['map'](d=>[d['schemaId'],d])),c=b['get']('payment.recipient')['refs'][0x0];expect(c['to'])['toBe'](merchant),expect(c['payload']?.['amount'])['toBe']('99900'),expect(c['payload']?.['coinType'])['toBe'](T_USDT),expect(b['get']('payment.from_object')['refs'][0x0]['to'])['toBe'](alloc),expect(b['get']('payment.for_guard')['refs'][0x0]['to'])['toBe'](g1);}),it('reverse\x20field\x20shapes:\x20items[]\x20and\x20votes[]\x20with\x20role/vote\x20payloads',()=>{expect(extractReverseRefs('0xaa8',{'items':[{'role':0x3,'order':o1}]})[0x0]['payload']?.['roleBits'])['toBe'](0x3);const a=extractReverseRefs('0xaaa',{'votes':[{'who':voter1,'like':!![],'favor':!![]}]});expect(a[0x0]['payload']?.['voteBits'])['toBe'](0x2|0x8);}),it('machine\x20table\x20rows\x20produce\x20node\x20+\x20transition\x20+\x20guard\x20edges',()=>{const a=makePlane()['state']['tables']['get'](mac['toLowerCase']()),b=extractTableRefs('machine.node',mac,a),c=new Map(b['map'](e=>[e['schemaId'],e['refs']]));expect(c['get']('machine.node')?.['length'])['toBe'](0x3);const d=c['get']('wf.transition');expect(d['map'](e=>[e['from']['includes']('start'),e['to']['includes']('shipping')]))['toContainEqual']([!![],!![]]),expect(c['get']('wf.forward_guard')?.[0x0]['to'])['toBe'](gShip);});}),describe('order-status\x20—\x20structural\x20authority',()=>{it('terminal\x20=\x20names\x20never\x20appearing\x20as\x20prev_node',()=>{const a=terminalNamesOfEdges([{'node':'shipping','prev_node':'start'},{'node':'done','prev_node':'shipping'}]);expect([...a])['toEqual'](['done']),expect([...terminalNamesOfRows([{'name':'a','value':[]},{'name':'b','value':[{'prev_node':'a'}]}])])['toEqual'](['b']);}),it('four\x20completion\x20states',()=>{const a=new Set(['done']);expect(deriveOrderCompletion({'machine':null})['status'])['toBe']('completed'),expect(deriveOrderCompletion({'machine':mac,'progress':null})['status'])['toBe']('in_progress'),expect(deriveOrderCompletion({'machine':mac,'progress':pr1,'currentNode':'shipping','terminalNames':a})['status'])['toBe']('in_progress'),expect(deriveOrderCompletion({'machine':mac,'progress':pr1,'currentNode':'done','terminalNames':a})['status'])['toBe']('completed'),expect(deriveOrderCompletion({'machine':mac,'progress':pr1,'currentNode':'done','terminalNames':null})['status'])['toBe']('unknown');}),it('name\x20vocabulary\x20is\x20annotation\x20only',()=>{expect(annotateNodeName('order_refunded'))['toBe']('refund'),expect(annotateNodeName('dispute_node'))['toBe']('exception'),expect(annotateNodeName('shipping'))['toBeNull']();}),it('workflowSubgraphFromRows\x20flattens\x20pairs/forwards\x20and\x20keeps\x20structural\x20terminals',()=>{const a=workflowSubgraphFromRows([{'name':'shipped','value':[{'prev_node':'paid','threshold':0x2,'forwards':[{'name':'ship','guard':{'guard':'0xg','retained_submission':[]},'weight':0x1},{'name':'airdrop','namedOperator':'op','permissionIndex':0x3}]}]},{'name':'done','value':[{'prev_node':'shipped','forwards':[{'name':'confirm'}]}]}],'0xm');expect(a['machine'])['toBe']('0xm'),expect(a['transitions']['map'](b=>b['prevNode']+'>'+b['forward']+'>'+b['node']))['toEqual'](['paid>ship>shipped','paid>airdrop>shipped','shipped>confirm>done']),expect(a['transitions'][0x0]['guard'])['toBe']('0xg'),expect(a['transitions'][0x0]['threshold'])['toBe'](0x2),expect(a['transitions'][0x1]['namedOperator'])['toBe']('op'),expect(a['transitions'][0x1]['permissionIndex'])['toBe'](0x3),expect([...a['terminalNames']])['toEqual'](['done']);}),it('workflowSubgraphFromEdges\x20reads\x20wf.transition\x20payloads\x20and\x20filters\x20by\x20machine',()=>{const a=[{'schema':'wf.transition','from':'0xm1::node::paid','to':'0xm1::node::done','payload':{'node':'done','prevNode':'paid','forward':'confirm','guard':'0xg'}},{'schema':'wf.transition','from':'0xm2::node::paid','to':'0xm2::node::done','payload':{'node':'done','prevNode':'paid','forward':'confirm'}},{'schema':'machine.node','from':'0xm1','to':'0xm1::node::paid'}],b=workflowSubgraphFromEdges(a);expect(b['transitions'])['toHaveLength'](0x2);const c=workflowSubgraphFromEdges(a,'0xm1');expect(c['transitions'])['toHaveLength'](0x1),expect(c['transitions'][0x0])['toMatchObject']({'node':'done','prevNode':'paid','forward':'confirm','guard':'0xg'}),expect([...c['terminalNames']])['toEqual'](['done']);});}),describe('expandTopology\x20—\x20wave\x20BFS\x20over\x20DataPlane',()=>{it('connects\x20F/R/W/S/M\x20edges\x20with\x20dedupe\x20and\x20no\x20per-id\x20fan-out',async()=>{const {graph:a,plane:b}=await buildBuyerGraph(),c=new Set(a['edges']['map'](f=>f['schema']));for(const e of['eoa.order','order.service','order.progress','order.allocation','service.permission','service.machine','service.order_allocator_guard','service.arbitration','machine.permission','progress.machine','machine.node','wf.transition','wf.forward_guard','guard.relies','arb.order','arb.voter','allocation.guard']){expect(c['has'](e),'missing\x20edge\x20'+e)['toBe'](!![]);}const d=a['edges']['filter'](f=>f['schema']==='service.order')['map'](f=>f['to']);expect(new Set(d))['toEqual'](new Set([o1,o2,o4])),expect(a['nodes']['get'](svc)?.['objectType'])['toBe']('Service'),expect(a['edges']['length'])['toBe'](new Set(a['edges']['map'](f=>f['id']))['size']),expect(b['batches']['objects'])['toBeLessThanOrEqual'](0x6),expect(a['gaps'])['toEqual']([]);}),it('resolves\x20completion\x20from\x20the\x20graph;\x20unknown\x20when\x20machine\x20table\x20not\x20expanded',async()=>{const {graph:a}=await buildBuyerGraph();expect(orderCompletionInGraph(a,o1)['status'])['toBe']('completed'),expect(orderCompletionInGraph(a,o2)['status'])['toBe']('in_progress'),expect(orderCompletionInGraph(a,o3)['status'])['toBe']('completed');const b=makePlane(),c=await expandTopology(b,{'network':ENTRYPOINT['Mainnet'],'seed':buyer});expect(orderCompletionInGraph(c,o1)['status'])['toBe']('unknown');}),it('caps\x20per-kind\x20fanout\x20and\x20records\x20truncation;\x20window\x20edges\x20flagged',async()=>{const {graph:a}=await buildBuyerGraph({'perKindCaps':{'eoa.order':0x1}});expect(a['edges']['filter'](b=>b['schema']==='eoa.order'))['toHaveLength'](0x1),expect(a['truncations']['some'](b=>b['schema']==='eoa.order'))['toBe'](!![]),expect(a['edges']['find'](b=>b['schema']==='eoa.order')?.['truncated'])['toBe'](!![]);}),it('fail-soft:\x20missing\x20objects\x20become\x20gaps,\x20build\x20still\x20succeeds',async()=>{const a=makePlane();a['state']['objects']['delete'](mac['toLowerCase']());const b=await expandTopology(a,{'network':ENTRYPOINT['Mainnet'],'seed':buyer,'edges':FULL_EDGES});expect(b['nodes']['get'](mac)?.['state'])['toBe']('error'),expect(b['gaps'])['toContain'](mac),expect(b['edges']['some'](c=>c['schema']==='order.service'))['toBe'](!![]);}),it('enforces\x20maxDepth',async()=>{const {graph:a}=await buildBuyerGraph({'maxDepth':0x1});expect(a['nodes']['has'](o1))['toBe'](!![]),expect(a['nodes']['has'](svc))['toBe'](![]),expect(a['budgetExhausted']['depth'])['toBe'](!![]);});}),describe('DataPlane\x20batching',()=>{it('chunks\x20at\x2050\x20and\x20counts\x20logical\x20RPC\x20batches',async()=>{const a=new FakeDataPlane({});await a['getObjects'](Array['from']({'length':0x65},(b,c)=>obj(0x6,0x3e8+c))),expect(a['batches']['objects'])['toBe'](0x3),await a['getObjects'](Array['from']({'length':0x65},(b,c)=>obj(0x6,0x3e8+c))),expect(a['batches']['objects'])['toBe'](0x3),expect(a['dedupHits'])['toBe'](0x65);});}),describe('viewport',()=>{it('buyer\x20never\x20sees\x20other\x20customers\x20through\x20service.order',async()=>{const {graph:a}=await buildBuyerGraph(),b=buildViewport(a,buyer,'buyer');expect(b['visibleNodes']['has'](o1))['toBe'](!![]),expect(b['visibleNodes']['has'](svc))['toBe'](!![]),expect(b['visibleNodes']['has'](o4))['toBe'](![]),expect(b['visibleNodes']['has'](otherBuyer))['toBe'](![]),expect(b['visibleEdges']['some'](c=>c['schema']==='service.order'))['toBe'](![]);}),it('merchant\x20sees\x20shop\x20orders\x20and\x20their\x20parties',async()=>{const {graph:a}=await buildBuyerGraph(),b=buildViewport(a,merchant,'merchant');expect(b['visibleNodes']['has'](perm))['toBe'](!![]),expect(b['visibleNodes']['has'](svc))['toBe'](!![]),expect(b['visibleNodes']['has'](o4))['toBe'](!![]),expect(b['visibleNodes']['has'](otherBuyer))['toBe'](!![]),expect(b['visibleNodes']['has'](collaborator))['toBe'](!![]),expect(b['visibleEdges']['some'](c=>c['schema']==='service.order'))['toBe'](!![]);}),it('neutral\x20role\x20sees\x20the\x20full\x20canon\x20graph',async()=>{const {graph:a}=await buildBuyerGraph(),b=buildViewport(a,buyer,'neutral');expect(b['visibleNodes']['size'])['toBe'](a['nodes']['size']);});}),describe('edge\x20schema\x20registry',()=>{it('covers\x20the\x20core\x20commercial\x20object\x20types',()=>{for(const a of['Service','Order','Machine','Progress','Payment','Allocation','Arbitration','Arb','Permission','Guard','Demand','Reward','Contact','Treasury']){expect(COVERED_OBJECT_TYPES)['toContain'](a);}});}),describe('EdgeSchema.contract\x20—\x20field\x20mutability\x20ground\x20truth',()=>{const a=['service.machine','service.buy_guard','service.arbitration','service.reward','service.repository','progress.machine','progress.task','machine.consensus_repository','machine.node','allocation.guard'];it('marks\x20exactly\x20the\x20address-field\x20edges\x20with\x20mutability\x20metadata',()=>{const b=EDGE_SCHEMAS['filter'](c=>c['contract'])['map'](c=>c['id'])['sort']();expect(b)['toEqual']([...a]['sort']());}),it('carries\x20the\x20publish-freeze\x20distinction\x20(machine\x20frozen,\x20buy_guard\x20mutable)',()=>{const b=EDGE_SCHEMAS['find'](d=>d['id']==='service.machine')['contract'];expect(b['frozenWhen'])['toBe']('after\x20publish'),expect(b['forbiddenActions'])['toContain']('set'),expect(b['unfreeze'])['toBeNull']();const c=EDGE_SCHEMAS['find'](d=>d['id']==='service.buy_guard')['contract'];expect(c['frozenWhen'])['toBeNull'](),expect(c['allowedActions'])['toContain']('set');}),it('derives\x20the\x20knowledge\x20field-rule\x20table\x20without\x20duplicating\x20facts',()=>{expect(fieldMutabilityOf('Service','machine')?.['frozen_when'])['toBe']('after\x20publish'),expect(fieldMutabilityOf('Machine','nodes')?.['forbidden_actions'])['toContain']('update'),expect(fieldMutabilityOf('Allocation','allocators')?.['frozen_when'])['toBe']('after\x20create\x20(share)'),expect(EDGE_SCHEMAS['find'](c=>c['id']==='allocation.guard')['contract']['field'])['toBe']('allocators');const b=FIELD_MUTABILITY_RULES['map'](c=>c['object_type']+'.'+c['field']);expect(new Set(b)['size'])['toBe'](b['length']),expect(FIELD_MUTABILITY_RULES)['toHaveLength'](0x14),expect(isActionForbidden('Service','machine','set',!![]))['toBe'](!![]),expect(isActionForbidden('Service','machine','set',![]))['toBe'](![]),expect(isActionForbidden('Service','buy_guard','set',!![]))['toBe'](![]);});});
@@ -46,6 +46,7 @@ export declare function batchQueryTableItems(parent: string, opts?: {
46
46
  }): Promise<BatchTableResult>;
47
47
  export declare function fetchMachineNodes(machine: string, network?: string, noCache?: boolean): Promise<ParsedMachineNode[]>;
48
48
  export declare function batchReadAddressKeyedFields(parent: string, addresses: string[], network?: string, noCache?: boolean): Promise<Map<string, any>>;
49
+ export declare function batchReadKeyedItems(parent: string, addresses: string[], network?: string, noCache?: boolean): Promise<Map<string, any>>;
49
50
  export declare function batchReadU64KeyedFields(parent: string, indices: Array<number | string | bigint>, network?: string, noCache?: boolean): Promise<Map<string, any>>;
50
51
  export declare const ENTITY_REGISTRAR_OBJECT_ID = "0x0000000000000000000000000000000000000000000000000000000000000aab";
51
52
  export declare const ENTITY_LINKER_OBJECT_ID = "0x0000000000000000000000000000000000000000000000000000000000000aaa";
@@ -66,6 +67,7 @@ export interface EntityPermissionContext {
66
67
  items: EntityPermissionItem[];
67
68
  byPermission: Map<string, number>;
68
69
  }
70
+ export declare function batchFetchEntityPermission(addresses: string[], network?: string, noCache?: boolean): Promise<Map<string, EntityPermissionContext>>;
69
71
  export declare function fetchEntityPermission(entityAddr: string, network?: string, noCache?: boolean): Promise<EntityPermissionContext | undefined>;
70
72
  export declare const ENTITY_CONTACT_OBJECT_ID = "0xaa9";
71
73
  export interface EntityContactItem {
@@ -76,6 +78,7 @@ export interface EntityContactContext {
76
78
  items: EntityContactItem[];
77
79
  byContact: Map<string, number>;
78
80
  }
81
+ export declare function batchFetchEntityContact(addresses: string[], network?: string, noCache?: boolean): Promise<Map<string, EntityContactContext>>;
79
82
  export declare function fetchEntityContact(entityAddr: string, network?: string, noCache?: boolean): Promise<EntityContactContext | undefined>;
80
83
  export declare const ENTITY_ORDER_OBJECT_ID = "0xaa8";
81
84
  export declare const ENTITY_ORDER_ROLES: {
@@ -91,7 +94,7 @@ export interface EntityOrderContext {
91
94
  items: EntityOrderItem[];
92
95
  byOrder: Map<string, number>;
93
96
  }
94
- export declare function fetchOrdersOfUser(entityAddr: string, network?: string, noCache?: boolean): Promise<any[] | undefined>;
97
+ export declare function batchFetchEntityOrder(addresses: string[], network?: string, noCache?: boolean): Promise<Map<string, EntityOrderContext>>;
95
98
  export declare const OBJECT_LINKER_CORE_OBJECT_ID = "0xaae";
96
99
  export declare const OBJECT_LINKER_TX_OBJECT_ID = "0xaaf";
97
100
  export interface ObjectLinkerItem {
@@ -102,6 +105,9 @@ export interface ObjectLinkerContext {
102
105
  items: ObjectLinkerItem[];
103
106
  byWho: Map<string, number>;
104
107
  }
108
+ export declare function batchFetchObjectLinker(objectId: string, targetAddrs: string[], network?: string, noCache?: boolean): Promise<Map<string, ObjectLinkerContext>>;
109
+ export declare function batchFetchObjectLinkerCore(targetAddrs: string[], network?: string, noCache?: boolean): Promise<Map<string, ObjectLinkerContext>>;
110
+ export declare function batchFetchObjectLinkerTx(targetAddrs: string[], network?: string, noCache?: boolean): Promise<Map<string, ObjectLinkerContext>>;
105
111
  export declare function fetchObjectLinkerCore(targetAddr: string, network?: string, noCache?: boolean): Promise<ObjectLinkerContext | undefined>;
106
112
  export declare function fetchObjectLinkerTx(targetAddr: string, network?: string, noCache?: boolean): Promise<ObjectLinkerContext | undefined>;
107
113
  export declare function fetchServiceOrders(targetAddr: string, network?: string, noCache?: boolean): Promise<ObjectLinkerContext | undefined>;
@@ -1 +1 @@
1
- import{ObjectType,objectTypeFromAddress,queryOrdersByUser}from'@wowok/wowok';import{MAX_OBJECTS_PER_QUERY}from'./dataplane.js';import{SdkDataPlane}from'./sdk-dataplane.js';export const QUERY_OBJECTS_BATCH=MAX_OBJECTS_PER_QUERY;const planes=new Map();function batchPlane(a,b){const c=(a??'')+'|'+(b?0x1:0x0);let d=planes['get'](c);return!d&&(d=new SdkDataPlane(a??undefined,{'noCache':b}),planes['set'](c,d)),d;}function singletonToken(a){const b=String(a)['toLowerCase']();if(b['length']<=0x5)return b;return'0x'+b['slice'](-0x3);}export async function batchQueryObjectsByIds(a,b,c){const d=await batchPlane(b,c)['getObjects'](a);return[...d['values']()];}export async function fetchTableEntries(a,b){const {items:c,truncated:d}=await batchPlane(b?.['network'],b?.['noCache'])['getTable'](a,{'maxItems':b?.['maxItems'],'pageLimit':b?.['limit'],'fetchValues':![]});return{'entries':c['map'](f=>({'key':f['key'],'objectId':f['objectId']})),'truncated':d};}export async function fetchAllFieldObjectIds(a,b,c){const {entries:d}=await fetchTableEntries(a,{'network':b,'noCache':c});return d['map'](f=>f['objectId']);}export async function batchQueryTableItems(a,b){const c=await batchPlane(b?.['network'],b?.['noCache'])['getTable'](a,{'maxItems':b?.['maxItems'],'pageLimit':b?.['limit']});return{'items':c['items'],'truncated':c['truncated']};}export async function fetchMachineNodes(a,b,c){const d=await batchQueryObjectsByIds([a],b,c),e=d[0x0],f=e?.['object']??(typeof a==='string'&&a['startsWith']('0x')?a:undefined);if(!f)return[];const {items:g}=await batchQueryTableItems(f,{'network':b,'noCache':c});return g['map'](h=>h['object'])['filter'](h=>h?.['type']==='TableItem_MachineNode')['map'](h=>{const i=h?.['data']??h,j=typeof i?.['name']==='string'?i['name']:'',k=Array['isArray'](i?.['value'])?i['value']:Array['isArray'](i?.['pairs'])?i['pairs']:[];if(!j)return null;return{'name':j,'pairs':k['map'](l=>({'prev_node':String(l?.['prev_node']??''),'threshold':Number(l?.['threshold']??0x0),'forwards':Array['isArray'](l?.['forwards'])?l['forwards']['map'](m=>{const n=typeof m?.['guard']==='object'&&m?.['guard']!==null?m['guard']['guard']??undefined:typeof m?.['guard']==='string'?m['guard']:undefined;return{'name':String(m?.['name']??''),'weight':Number(m?.['weight']??0x0),'namedOperator':m?.['namedOperator']!==undefined&&m?.['namedOperator']!==null?String(m['namedOperator']):undefined,'permissionIndex':m?.['permissionIndex']!==undefined&&m?.['permissionIndex']!==null?Number(m['permissionIndex']):undefined,'guard':n};}):[]}))};})['filter'](h=>h!==null);}export async function batchReadAddressKeyedFields(a,b,c,d){const e=[...new Set((b??[])['map'](f=>String(f)['toLowerCase']())['filter'](f=>f['startsWith']('0x')))];return batchPlane(c,d)['getKeyedFields'](singletonToken(a),e);}export async function batchReadU64KeyedFields(a,b,c,d){const e=[...new Set((b??[])['map'](f=>String(f))['filter'](f=>f!==''&&Number['isFinite'](Number(f))))];return batchPlane(c,d)['getKeyedFields'](singletonToken(a),e,{'keyType':'u64'});}export const ENTITY_REGISTRAR_OBJECT_ID='0x0000000000000000000000000000000000000000000000000000000000000aab';export const ENTITY_LINKER_OBJECT_ID='0x0000000000000000000000000000000000000000000000000000000000000aaa';export async function batchFetchEntityRegistrar(a,b,c){try{return await batchReadAddressKeyedFields(ENTITY_REGISTRAR_OBJECT_ID,a,b,c);}catch{return new Map();}}export async function batchFetchEntityLinker(a,b,c){try{return await batchReadAddressKeyedFields(ENTITY_LINKER_OBJECT_ID,a,b,c);}catch{return new Map();}}export const ENTITY_PERMISSION_OBJECT_ID='0xaad';export const ENTITY_PERMISSION_ROLES={'OWNER':0x1,'ADMIN':0x2,'ENTITY':0x4};export async function fetchEntityPermission(a,b,c){try{const e=await batchReadAddressKeyedFields(ENTITY_PERMISSION_OBJECT_ID,[a],b,c),f=e['get'](String(a)['toLowerCase']()),g=[],h=new Map(),i=Array['isArray'](f?.['items'])?f['items']:[];for(const j of i){const k=Number(j?.['role']??0x0),l=String(j?.['permission']??'')['toLowerCase'](),m=Number(j?.['time']??0x0);l&&(g['push']({'role':k,'permission':l,'time':m}),h['set'](l,(h['get'](l)??0x0)|k));}return{'items':g,'byPermission':h};}catch{return undefined;}}export const ENTITY_CONTACT_OBJECT_ID='0xaa9';export async function fetchEntityContact(a,b,c){try{const e=await batchReadAddressKeyedFields(ENTITY_CONTACT_OBJECT_ID,[a],b,c),f=e['get'](String(a)['toLowerCase']()),g=[],h=new Map(),i=Array['isArray'](f?.['items'])?f['items']:[];for(const j of i){const k=String(j?.['contact']??'')['toLowerCase'](),l=Number(j?.['time']??0x0);k&&(g['push']({'contact':k,'time':l}),h['set'](k,(h['get'](k)??l)||l));}return{'items':g,'byContact':h};}catch{return undefined;}}export const ENTITY_ORDER_OBJECT_ID='0xaa8';export const ENTITY_ORDER_ROLES={'OWNER':0x1,'AGENT':0x2};export async function fetchOrdersOfUser(a,b,c){try{return await queryOrdersByUser({'address':a,'no_cache':c,'network':b});}catch{return undefined;}}export const OBJECT_LINKER_CORE_OBJECT_ID='0xaae';export const OBJECT_LINKER_TX_OBJECT_ID='0xaaf';async function fetchObjectLinker(a,b,c,e){try{const f=await batchReadAddressKeyedFields(a,[b],c,e),g=f['get'](String(b)['toLowerCase']()),h=[],i=new Map(),j=Array['isArray'](g?.['items'])?g['items']:[];for(const k of j){const l=String(k?.['who']??'')['toLowerCase'](),m=Number(k?.['time']??0x0);l&&(h['push']({'who':l,'time':m}),i['set'](l,m));}return{'items':h,'byWho':i};}catch{return undefined;}}export function fetchObjectLinkerCore(a,b,c){return fetchObjectLinker(OBJECT_LINKER_CORE_OBJECT_ID,a,b,c);}export function fetchObjectLinkerTx(a,b,c){return fetchObjectLinker(OBJECT_LINKER_TX_OBJECT_ID,a,b,c);}export async function fetchServiceOrders(a,b,c){const d=await fetchObjectLinkerTx(a,b,c);if(!d)return undefined;const e=d['items']['filter'](f=>objectTypeFromAddress(f['who'])===ObjectType['Order']);return{'items':e,'byWho':new Map(e['map'](f=>[f['who'],f['time']]))};}export async function fetchPermissionContext(a,b,c){try{const e=await batchQueryObjectsByIds([a],b,c),f=e[0x0],g=f?.['data']??f,h=new Set((g?.['admin']??[])['map'](k=>String(k)['toLowerCase']())),i=new Map(),{items:j}=await batchQueryTableItems(a,{'network':b,'noCache':c});for(const k of j){const l=k['object'],m=l?.['data']??l;m?.['address']!=null&&Array['isArray'](m['perm'])&&i['set'](String(m['address'])['toLowerCase'](),new Set(m['perm']['map'](n=>Number(n))));}return{'admin':h,'table':i};}catch{return undefined;}}export async function fetchOrderContext(a,b,c){try{const e=await batchQueryObjectsByIds([a],b,c),f=e[0x0];if(f?.['type']!=='Order'&&f?.['data']?.['type']!=='Order')return undefined;const g=f?.['data']??f;return{'builder':String(g['builder']??g['owner']??''),'agent':new Set((g['agent']??[])['map'](h=>String(h)['toLowerCase']()))};}catch{return undefined;}}
1
+ import{ObjectType,objectTypeFromAddress}from'@wowok/wowok';import{MAX_OBJECTS_PER_QUERY}from'./dataplane.js';import{SdkDataPlane}from'./sdk-dataplane.js';export const QUERY_OBJECTS_BATCH=MAX_OBJECTS_PER_QUERY;const planes=new Map();function batchPlane(a,b){const c=(a??'')+'|'+(b?0x1:0x0);let d=planes['get'](c);return!d&&(d=new SdkDataPlane(a??undefined,{'noCache':b}),planes['set'](c,d)),d;}function parentToken(a){return String(a)['toLowerCase']();}export async function batchQueryObjectsByIds(a,b,c){const d=await batchPlane(b,c)['getObjects'](a);return[...d['values']()];}export async function fetchTableEntries(a,b){const {items:c,truncated:d}=await batchPlane(b?.['network'],b?.['noCache'])['getTable'](a,{'maxItems':b?.['maxItems'],'pageLimit':b?.['limit'],'fetchValues':![]});return{'entries':c['map'](f=>({'key':f['key'],'objectId':f['objectId']})),'truncated':d};}export async function fetchAllFieldObjectIds(a,b,c){const {entries:d}=await fetchTableEntries(a,{'network':b,'noCache':c});return d['map'](f=>f['objectId']);}export async function batchQueryTableItems(a,b){const c=await batchPlane(b?.['network'],b?.['noCache'])['getTable'](a,{'maxItems':b?.['maxItems'],'pageLimit':b?.['limit']});return{'items':c['items'],'truncated':c['truncated']};}export async function fetchMachineNodes(a,b,c){const d=await batchQueryObjectsByIds([a],b,c),e=d[0x0],f=e?.['object']??(typeof a==='string'&&a['startsWith']('0x')?a:undefined);if(!f)return[];const {items:g}=await batchQueryTableItems(f,{'network':b,'noCache':c});return g['map'](h=>h['object'])['filter'](h=>h?.['type']==='TableItem_MachineNode')['map'](h=>{const i=h?.['data']??h,j=typeof i?.['name']==='string'?i['name']:'',k=Array['isArray'](i?.['value'])?i['value']:Array['isArray'](i?.['pairs'])?i['pairs']:[];if(!j)return null;return{'name':j,'pairs':k['map'](l=>({'prev_node':String(l?.['prev_node']??''),'threshold':Number(l?.['threshold']??0x0),'forwards':Array['isArray'](l?.['forwards'])?l['forwards']['map'](m=>{const n=typeof m?.['guard']==='object'&&m?.['guard']!==null?m['guard']['guard']??undefined:typeof m?.['guard']==='string'?m['guard']:undefined;return{'name':String(m?.['name']??''),'weight':Number(m?.['weight']??0x0),'namedOperator':m?.['namedOperator']!==undefined&&m?.['namedOperator']!==null?String(m['namedOperator']):undefined,'permissionIndex':m?.['permissionIndex']!==undefined&&m?.['permissionIndex']!==null?Number(m['permissionIndex']):undefined,'guard':n};}):[]}))};})['filter'](h=>h!==null);}export async function batchReadAddressKeyedFields(a,b,c,d){const e=[...new Set((b??[])['map'](f=>String(f)['toLowerCase']())['filter'](f=>f['startsWith']('0x')))];return batchPlane(c,d)['getKeyedFields'](parentToken(a),e);}export async function batchReadKeyedItems(a,b,c,d){const e=[...new Set((b??[])['map'](f=>String(f)['toLowerCase']())['filter'](f=>f['startsWith']('0x')))];return batchPlane(c,d)['getKeyedFields'](parentToken(a),e,{'strict':!![]});}export async function batchReadU64KeyedFields(a,b,c,d){const e=[...new Set((b??[])['map'](f=>String(f))['filter'](f=>f!==''&&Number['isFinite'](Number(f))))];return batchPlane(c,d)['getKeyedFields'](parentToken(a),e,{'keyType':'u64'});}export const ENTITY_REGISTRAR_OBJECT_ID='0x0000000000000000000000000000000000000000000000000000000000000aab';export const ENTITY_LINKER_OBJECT_ID='0x0000000000000000000000000000000000000000000000000000000000000aaa';export async function batchFetchEntityRegistrar(a,b,c){try{return await batchReadAddressKeyedFields(ENTITY_REGISTRAR_OBJECT_ID,a,b,c);}catch{return new Map();}}export async function batchFetchEntityLinker(a,b,c){try{return await batchReadAddressKeyedFields(ENTITY_LINKER_OBJECT_ID,a,b,c);}catch{return new Map();}}export const ENTITY_PERMISSION_OBJECT_ID='0xaad';export const ENTITY_PERMISSION_ROLES={'OWNER':0x1,'ADMIN':0x2,'ENTITY':0x4};export async function batchFetchEntityPermission(b,c,e){const f=new Map(),g=await batchReadKeyedItems(ENTITY_PERMISSION_OBJECT_ID,b,c,e);for(const h of new Set((b??[])['map'](i=>String(i)['toLowerCase']()))){f['set'](h,{'items':[],'byPermission':new Map()});}for(const [i,j]of g){const k=j,l=[],m=new Map();for(const n of Array['isArray'](k?.['items'])?k['items']:[]){const o=Number(n?.['role']??0x0),p=String(n?.['permission']??'')['toLowerCase'](),q=Number(n?.['time']??0x0);p&&(l['push']({'role':o,'permission':p,'time':q}),m['set'](p,(m['get'](p)??0x0)|o));}f['set'](i,{'items':l,'byPermission':m});}return f;}export async function fetchEntityPermission(a,b,c){try{const d=await batchFetchEntityPermission([a],b,c);return d['get'](String(a)['toLowerCase']());}catch{return undefined;}}export const ENTITY_CONTACT_OBJECT_ID='0xaa9';export async function batchFetchEntityContact(b,c,e){const f=new Map(),g=await batchReadKeyedItems(ENTITY_CONTACT_OBJECT_ID,b,c,e);for(const h of new Set((b??[])['map'](i=>String(i)['toLowerCase']()))){f['set'](h,{'items':[],'byContact':new Map()});}for(const [i,j]of g){const k=j,l=[],m=new Map();for(const n of Array['isArray'](k?.['items'])?k['items']:[]){const o=String(n?.['contact']??'')['toLowerCase'](),p=Number(n?.['time']??0x0);o&&(l['push']({'contact':o,'time':p}),m['set'](o,(m['get'](o)??0x0)||p));}f['set'](i,{'items':l,'byContact':m});}return f;}export async function fetchEntityContact(a,b,c){try{const d=await batchFetchEntityContact([a],b,c);return d['get'](String(a)['toLowerCase']());}catch{return undefined;}}export const ENTITY_ORDER_OBJECT_ID='0xaa8';export const ENTITY_ORDER_ROLES={'OWNER':0x1,'AGENT':0x2};export async function batchFetchEntityOrder(b,c,e){const f=new Map(),g=await batchReadKeyedItems(ENTITY_ORDER_OBJECT_ID,b,c,e);for(const h of new Set((b??[])['map'](i=>String(i)['toLowerCase']()))){f['set'](h,{'items':[],'byOrder':new Map()});}for(const [i,j]of g){const k=j,l=[],m=new Map();for(const n of Array['isArray'](k?.['items'])?k['items']:[]){const o=Number(n?.['role']??0x0),p=String(n?.['order']??'')['toLowerCase'](),q=Number(n?.['time']??0x0);p&&(l['push']({'role':o,'order':p,'time':q}),m['set'](p,(m['get'](p)??0x0)|o));}f['set'](i,{'items':l,'byOrder':m});}return f;}export const OBJECT_LINKER_CORE_OBJECT_ID='0xaae';export const OBJECT_LINKER_TX_OBJECT_ID='0xaaf';export async function batchFetchObjectLinker(b,c,e,f){const g=new Map(),h=await batchReadKeyedItems(b,c,e,f);for(const i of new Set((c??[])['map'](j=>String(j)['toLowerCase']()))){g['set'](i,{'items':[],'byWho':new Map()});}for(const [j,k]of h){const l=k,m=[],n=new Map();for(const o of Array['isArray'](l?.['items'])?l['items']:[]){const p=String(o?.['who']??'')['toLowerCase'](),q=Number(o?.['time']??0x0);p&&(m['push']({'who':p,'time':q}),n['set'](p,q));}g['set'](j,{'items':m,'byWho':n});}return g;}export function batchFetchObjectLinkerCore(a,b,c){return batchFetchObjectLinker(OBJECT_LINKER_CORE_OBJECT_ID,a,b,c);}export function batchFetchObjectLinkerTx(a,b,c){return batchFetchObjectLinker(OBJECT_LINKER_TX_OBJECT_ID,a,b,c);}async function fetchObjectLinker(a,b,c,d){try{const e=await batchFetchObjectLinker(a,[b],c,d);return e['get'](String(b)['toLowerCase']());}catch{return undefined;}}export function fetchObjectLinkerCore(a,b,c){return fetchObjectLinker(OBJECT_LINKER_CORE_OBJECT_ID,a,b,c);}export function fetchObjectLinkerTx(a,b,c){return fetchObjectLinker(OBJECT_LINKER_TX_OBJECT_ID,a,b,c);}export async function fetchServiceOrders(a,b,c){const d=await fetchObjectLinkerTx(a,b,c);if(!d)return undefined;const e=d['items']['filter'](f=>objectTypeFromAddress(f['who'])===ObjectType['Order']);return{'items':e,'byWho':new Map(e['map'](f=>[f['who'],f['time']]))};}export async function fetchPermissionContext(a,b,c){try{const e=await batchQueryObjectsByIds([a],b,c),f=e[0x0],g=f?.['data']??f,h=new Set((g?.['admin']??[])['map'](k=>String(k)['toLowerCase']())),i=new Map(),{items:j}=await batchQueryTableItems(a,{'network':b,'noCache':c});for(const k of j){const l=k['object'],m=l?.['data']??l;m?.['address']!=null&&Array['isArray'](m['perm'])&&i['set'](String(m['address'])['toLowerCase'](),new Set(m['perm']['map'](n=>Number(n))));}return{'admin':h,'table':i};}catch{return undefined;}}export async function fetchOrderContext(a,b,c){try{const e=await batchQueryObjectsByIds([a],b,c),f=e[0x0];if(f?.['type']!=='Order'&&f?.['data']?.['type']!=='Order')return undefined;const g=f?.['data']??f;return{'builder':String(g['builder']??g['owner']??''),'agent':new Set((g['agent']??[])['map'](h=>String(h)['toLowerCase']()))};}catch{return undefined;}}