@wowok/agent-mcp 2.7.6 → 2.7.8

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 (243) hide show
  1. package/dist/customer/index.d.ts +3 -4
  2. package/dist/customer/index.js +1 -1
  3. package/dist/customer/info-puzzle.js +1 -1
  4. package/dist/customer/order-monitor.d.ts +0 -9
  5. package/dist/customer/order-monitor.js +1 -1
  6. package/dist/customer/order-strategy.d.ts +0 -19
  7. package/dist/customer/order-strategy.js +1 -1
  8. package/dist/customer/reminder-system.d.ts +0 -5
  9. package/dist/customer/reminder-system.js +1 -1
  10. package/dist/evaluation/game-strategy.js +1 -1
  11. package/dist/evaluation/injection.d.ts +6 -0
  12. package/dist/evaluation/injection.js +1 -0
  13. package/dist/evaluation/node-game.js +1 -1
  14. package/dist/examples/machine-multisig-threshold.json +1 -0
  15. package/dist/harness/recover.js +1 -1
  16. package/dist/harness/types.d.ts +1 -1
  17. package/dist/harness/verify.js +1 -1
  18. package/dist/intent/enrich.js +1 -1
  19. package/dist/intent/matcher.js +1 -1
  20. package/dist/intent/types.d.ts +1 -1
  21. package/dist/intent/types.js +1 -1
  22. package/dist/knowledge/arbitration-ledger.js +1 -1
  23. package/dist/knowledge/contract-invariants.d.ts +53 -0
  24. package/dist/knowledge/contract-invariants.js +1 -0
  25. package/dist/knowledge/deployment-scanner.js +1 -1
  26. package/dist/knowledge/dynamic-pricing.d.ts +0 -2
  27. package/dist/knowledge/dynamic-pricing.js +1 -1
  28. package/dist/knowledge/event-semantics.d.ts +20 -0
  29. package/dist/knowledge/event-semantics.js +1 -0
  30. package/dist/knowledge/examples-scanner-cli.js +1 -1
  31. package/dist/knowledge/examples-scanner.js +1 -1
  32. package/dist/knowledge/glossary.js +1 -1
  33. package/dist/knowledge/guard-submission-prompt.js +1 -1
  34. package/dist/knowledge/immutability.d.ts +11 -0
  35. package/dist/knowledge/immutability.js +1 -0
  36. package/dist/knowledge/index.d.ts +12 -6
  37. package/dist/knowledge/index.js +1 -1
  38. package/dist/knowledge/industry-registry.js +1 -1
  39. package/dist/knowledge/intent-metrics.d.ts +1 -1
  40. package/dist/knowledge/jsonrpc-enum.d.ts +37 -0
  41. package/dist/knowledge/jsonrpc-enum.js +1 -0
  42. package/dist/knowledge/machine-confirm.js +1 -1
  43. package/dist/knowledge/machine-risk.js +1 -1
  44. package/dist/knowledge/machine-topology.d.ts +11 -0
  45. package/dist/knowledge/machine-topology.js +1 -1
  46. package/dist/knowledge/machine-translation.js +1 -1
  47. package/dist/knowledge/market-metrics.d.ts +11 -0
  48. package/dist/knowledge/market-metrics.js +1 -1
  49. package/dist/knowledge/mcp-schema-audit-cli.js +1 -1
  50. package/dist/knowledge/mcp-schema-audit.d.ts +1 -0
  51. package/dist/knowledge/mcp-schema-audit.js +1 -1
  52. package/dist/knowledge/messenger-guard-guidance.d.ts +17 -0
  53. package/dist/knowledge/messenger-guard-guidance.js +1 -0
  54. package/dist/knowledge/operation-dictionary.d.ts +18 -0
  55. package/dist/knowledge/operation-dictionary.js +1 -0
  56. package/dist/knowledge/service-ledger.js +1 -1
  57. package/dist/knowledge/service-risk.js +1 -1
  58. package/dist/knowledge/service-translation.js +1 -1
  59. package/dist/knowledge/supply-chain.d.ts +24 -0
  60. package/dist/knowledge/supply-chain.js +1 -0
  61. package/dist/knowledge/template-registry.js +1 -1
  62. package/dist/knowledge/tools-reference.js +1 -1
  63. package/dist/knowledge/trust-metrics.d.ts +27 -2
  64. package/dist/knowledge/trust-metrics.js +1 -1
  65. package/dist/knowledge/workflow-guidance.d.ts +22 -1
  66. package/dist/knowledge/workflow-guidance.js +1 -1
  67. package/dist/monitor/EventStore.d.ts +78 -0
  68. package/dist/monitor/EventStore.js +1 -0
  69. package/dist/participation/radar-core.d.ts +0 -1
  70. package/dist/participation/radar-core.js +1 -1
  71. package/dist/persona/address-format.d.ts +6 -0
  72. package/dist/persona/address-format.js +1 -0
  73. package/dist/persona/analyzer.js +1 -1
  74. package/dist/persona/index.d.ts +3 -0
  75. package/dist/persona/index.js +1 -1
  76. package/dist/persona/types.d.ts +1 -1
  77. package/dist/persona/types.js +1 -1
  78. package/dist/project/business-puzzle.js +1 -1
  79. package/dist/project/edit-planner.js +1 -1
  80. package/dist/project/evaluation-fix.spec.d.ts +1 -0
  81. package/dist/project/evaluation-fix.spec.js +1 -0
  82. package/dist/project/evaluation.js +1 -1
  83. package/dist/project/graph-builder.js +1 -1
  84. package/dist/project/handlers.d.ts +2 -18
  85. package/dist/project/handlers.js +1 -1
  86. package/dist/project/index.js +1 -1
  87. package/dist/project/machine-nodes.d.ts +23 -0
  88. package/dist/project/machine-nodes.js +1 -1
  89. package/dist/project/machine-panorama.d.ts +41 -0
  90. package/dist/project/machine-panorama.js +1 -0
  91. package/dist/project/object-panorama.d.ts +179 -0
  92. package/dist/project/object-panorama.js +1 -0
  93. package/dist/project/object-type.d.ts +1 -0
  94. package/dist/project/object-type.js +1 -0
  95. package/dist/project/participation-radar.js +1 -1
  96. package/dist/project/semantic-assembler.js +1 -1
  97. package/dist/project/service-panorama.d.ts +180 -0
  98. package/dist/project/service-panorama.js +1 -0
  99. package/dist/project/stage-gate.d.ts +0 -1
  100. package/dist/project/stage-gate.js +1 -1
  101. package/dist/project/task-tracker.d.ts +4 -0
  102. package/dist/project/task-tracker.js +1 -1
  103. package/dist/role/derivation.d.ts +19 -2
  104. package/dist/role/derivation.js +1 -1
  105. package/dist/role/index.d.ts +2 -2
  106. package/dist/role/index.js +1 -1
  107. package/dist/role/model.js +1 -1
  108. package/dist/role/resolution.d.ts +16 -0
  109. package/dist/role/resolution.js +1 -1
  110. package/dist/role/types.d.ts +1 -1
  111. package/dist/role/types.js +1 -1
  112. package/dist/safety/confirm-gate.js +1 -1
  113. package/dist/schema/call/allocation.d.ts +10 -0
  114. package/dist/schema/call/arbitration.d.ts +14 -3
  115. package/dist/schema/call/arbitration.js +1 -1
  116. package/dist/schema/call/base.d.ts +16 -0
  117. package/dist/schema/call/base.js +1 -1
  118. package/dist/schema/call/bridge.d.ts +7 -0
  119. package/dist/schema/call/contact.d.ts +11 -0
  120. package/dist/schema/call/demand.d.ts +11 -0
  121. package/dist/schema/call/guard.d.ts +3 -0
  122. package/dist/schema/call/handler.js +1 -1
  123. package/dist/schema/call/machine.d.ts +12 -0
  124. package/dist/schema/call/machine.js +1 -1
  125. package/dist/schema/call/order.d.ts +11 -0
  126. package/dist/schema/call/payment.d.ts +4 -3
  127. package/dist/schema/call/payment.js +1 -1
  128. package/dist/schema/call/permission.d.ts +11 -0
  129. package/dist/schema/call/personal.d.ts +38 -0
  130. package/dist/schema/call/personal.js +1 -1
  131. package/dist/schema/call/progress.d.ts +11 -0
  132. package/dist/schema/call/proof.d.ts +2 -0
  133. package/dist/schema/call/repository.d.ts +15 -4
  134. package/dist/schema/call/reward.d.ts +17 -12
  135. package/dist/schema/call/reward.js +1 -1
  136. package/dist/schema/call/semantic.d.ts +3 -2
  137. package/dist/schema/call/semantic.js +1 -1
  138. package/dist/schema/call/service.d.ts +17 -0
  139. package/dist/schema/call/service.js +1 -1
  140. package/dist/schema/call/treasury.d.ts +17 -0
  141. package/dist/schema/common/index.d.ts +21 -0
  142. package/dist/schema/common/index.js +1 -1
  143. package/dist/schema/evaluation/index.d.ts +146 -0
  144. package/dist/schema/evaluation/index.js +1 -1
  145. package/dist/schema/index.d.ts +1 -0
  146. package/dist/schema/index.js +1 -1
  147. package/dist/schema/intent-radar/index.d.ts +30 -3
  148. package/dist/schema/intent-radar/index.js +1 -1
  149. package/dist/schema/local/index.d.ts +9 -0
  150. package/dist/schema/local/index.js +1 -1
  151. package/dist/schema/messenger/index.d.ts +54 -0
  152. package/dist/schema/messenger/index.js +1 -1
  153. package/dist/schema/operations.d.ts +932 -9
  154. package/dist/schema/operations.js +1 -1
  155. package/dist/schema/permission/index.d.ts +17 -0
  156. package/dist/schema/permission/index.js +1 -1
  157. package/dist/schema/project/index.d.ts +6 -0
  158. package/dist/schema/project/index.js +1 -1
  159. package/dist/schema/query/index.d.ts +663 -56
  160. package/dist/schema/query/index.js +1 -1
  161. package/dist/schema/schema-version.js +1 -1
  162. package/dist/schema/trust/index.d.ts +17 -0
  163. package/dist/schema/trust/index.js +1 -1
  164. package/dist/schema/watch/index.d.ts +204 -0
  165. package/dist/schema/watch/index.js +1 -0
  166. package/dist/schema/workflow/index.d.ts +301 -0
  167. package/dist/schema/workflow/index.js +1 -1
  168. package/dist/schema-query-impl/index.js +1 -1
  169. package/dist/schemas/account_operation.output.json +5 -2
  170. package/dist/schemas/bridge_operation.output.json +5 -2
  171. package/dist/schemas/bridge_operation.schema.json +25 -9
  172. package/dist/schemas/evaluation_operation.output.json +276 -1
  173. package/dist/schemas/evaluation_operation.schema.json +307 -0
  174. package/dist/schemas/guard2file.schema.json +6 -2
  175. package/dist/schemas/index.json +13 -1
  176. package/dist/schemas/intent_radar.output.json +20 -2
  177. package/dist/schemas/intent_radar.schema.json +10 -1
  178. package/dist/schemas/local_info_operation.output.json +5 -2
  179. package/dist/schemas/local_mark_operation.output.json +5 -2
  180. package/dist/schemas/machineNode2file.schema.json +6 -2
  181. package/dist/schemas/messenger_operation.output.json +105 -2
  182. package/dist/schemas/messenger_operation.schema.json +98 -0
  183. package/dist/schemas/monitor_events.output.json +1360 -0
  184. package/dist/schemas/monitor_events.schema.json +62 -0
  185. package/dist/schemas/onchain_events.output.json +237 -14
  186. package/dist/schemas/onchain_events.schema.json +20 -0
  187. package/dist/schemas/onchain_operations.output.json +10 -5
  188. package/dist/schemas/onchain_operations.schema.json +768 -409
  189. package/dist/schemas/onchain_operations_allocation.schema.json +23 -7
  190. package/dist/schemas/onchain_operations_arbitration.schema.json +34 -9
  191. package/dist/schemas/onchain_operations_contact.schema.json +29 -5
  192. package/dist/schemas/onchain_operations_demand.schema.json +29 -5
  193. package/dist/schemas/onchain_operations_gen_passport.schema.json +6 -2
  194. package/dist/schemas/onchain_operations_gen_proof.schema.json +6 -2
  195. package/dist/schemas/onchain_operations_guard.schema.json +6 -2
  196. package/dist/schemas/onchain_operations_machine.schema.json +34 -10
  197. package/dist/schemas/onchain_operations_order.schema.json +29 -5
  198. package/dist/schemas/onchain_operations_payment.schema.json +13 -10
  199. package/dist/schemas/onchain_operations_permission.schema.json +29 -5
  200. package/dist/schemas/onchain_operations_personal.schema.json +44 -2
  201. package/dist/schemas/onchain_operations_progress.schema.json +29 -5
  202. package/dist/schemas/onchain_operations_proof.schema.json +6 -2
  203. package/dist/schemas/onchain_operations_repository.schema.json +310 -305
  204. package/dist/schemas/onchain_operations_reward.schema.json +46 -10
  205. package/dist/schemas/onchain_operations_service.schema.json +49 -13
  206. package/dist/schemas/onchain_operations_treasury.schema.json +46 -10
  207. package/dist/schemas/onchain_table_data.output.json +3750 -208
  208. package/dist/schemas/onchain_table_data.schema.json +311 -0
  209. package/dist/schemas/permission_operation.output.json +32 -0
  210. package/dist/schemas/project_operation.schema.json +14 -8
  211. package/dist/schemas/query_toolkit.output.json +425 -320
  212. package/dist/schemas/query_toolkit.schema.json +139 -1
  213. package/dist/schemas/trust_score.output.json +38 -0
  214. package/dist/schemas/trust_score.schema.json +32 -0
  215. package/dist/schemas/watch_operation.output.json +827 -0
  216. package/dist/schemas/watch_operation.schema.json +145 -0
  217. package/dist/schemas/workflow_operation.output.json +263 -5
  218. package/dist/schemas/workflow_operation.schema.json +597 -2
  219. package/dist/tools/handlers/config.js +1 -1
  220. package/dist/tools/handlers/evaluation.js +1 -1
  221. package/dist/tools/handlers/intent-radar.js +1 -1
  222. package/dist/tools/handlers/messenger.js +1 -1
  223. package/dist/tools/handlers/monitor.d.ts +2 -0
  224. package/dist/tools/handlers/monitor.js +1 -0
  225. package/dist/tools/handlers/onchain.js +1 -1
  226. package/dist/tools/handlers/permission.js +1 -1
  227. package/dist/tools/handlers/project.js +1 -1
  228. package/dist/tools/handlers/query.js +1 -1
  229. package/dist/tools/handlers/trust.d.ts +14 -0
  230. package/dist/tools/handlers/trust.js +1 -1
  231. package/dist/tools/handlers/watch.d.ts +2 -0
  232. package/dist/tools/handlers/watch.js +1 -0
  233. package/dist/tools/handlers/workflow.js +1 -1
  234. package/dist/tools/index.d.ts +2 -0
  235. package/dist/tools/index.js +1 -1
  236. package/dist/tools/shared.js +1 -1
  237. package/package.json +2 -2
  238. package/dist/customer/post-purchase.d.ts +0 -44
  239. package/dist/customer/post-purchase.js +0 -1
  240. package/dist/project/migration.d.ts +0 -22
  241. package/dist/project/migration.js +0 -1
  242. package/dist/project/rollback-policy.d.ts +0 -45
  243. package/dist/project/rollback-policy.js +0 -1
@@ -18,6 +18,7 @@ export interface ServiceTrustMetrics {
18
18
  hasPublishedEvents?: boolean;
19
19
  hasMachineBound?: boolean;
20
20
  hasBuyGuard?: boolean;
21
+ hasReward?: boolean;
21
22
  }
22
23
  export interface TrustDimension {
23
24
  name: string;
@@ -25,6 +26,13 @@ export interface TrustDimension {
25
26
  maxScore: number;
26
27
  description: string;
27
28
  humanReadable: string;
29
+ weight?: number;
30
+ }
31
+ export interface TrustFinding {
32
+ kind: string;
33
+ severity: "critical" | "warning" | "info";
34
+ message: string;
35
+ deduction: number;
28
36
  }
29
37
  export interface ServiceTrustScore {
30
38
  score: number;
@@ -32,9 +40,26 @@ export interface ServiceTrustScore {
32
40
  breakdown: TrustDimension[];
33
41
  summary: string;
34
42
  warnings: string[];
43
+ findings: TrustFinding[];
44
+ }
45
+ export declare const TRUST_METRICS_VERSION = 2;
46
+ export declare const TRUST_DIMENSION_WEIGHTS: {
47
+ readonly trust_arbitration: 20;
48
+ readonly trust_reviews: 35;
49
+ readonly trust_fulfillment: 20;
50
+ readonly trust_fund_safety: 15;
51
+ readonly trust_transparency: 10;
52
+ };
53
+ export type TrustDimensionId = keyof typeof TRUST_DIMENSION_WEIGHTS;
54
+ export interface TrustInjection {
55
+ overrides?: {
56
+ rules?: Record<string, {
57
+ enabled?: boolean;
58
+ weight?: number;
59
+ }>;
60
+ };
35
61
  }
36
- export declare const TRUST_METRICS_VERSION = 1;
37
- export declare function computeServiceTrustScore(metrics: ServiceTrustMetrics): ServiceTrustScore;
62
+ export declare function computeServiceTrustScore(metrics: ServiceTrustMetrics, injection?: TrustInjection): ServiceTrustScore;
38
63
  export declare function quickTrustCheck(metrics: ServiceTrustMetrics): {
39
64
  pass: boolean;
40
65
  reason: string;
@@ -1 +1 @@
1
- export const TRUST_METRICS_VERSION=0x1;const TRUST_LEVELS=[{'min':0x4b,'level':'trusted','label':'High\x20trust'},{'min':0x32,'level':'moderate','label':'Moderate\x20trust'},{'min':0x19,'level':'caution','label':'Needs\x20attention'},{'min':0x0,'level':'high_risk','label':'High\x20risk'}];export function computeServiceTrustScore(a){const b=[],c=[],d=computeArbitrationDimension(a);b['push'](d);d['score']<d['maxScore']*0.3&&c['push']('Arbitration\x20trust\x20score\x20is\x20low;\x20recommend\x20checking\x20arbitration\x20records');const e=computeReviewDimension(a);b['push'](e);e['score']<e['maxScore']*0.3&&a['reviewStats']&&c['push']('Low\x20like\x20rate\x20('+a['reviewStats']['likes']+'/'+a['reviewStats']['totalReviews']+')');const f=computeFulfillmentDimension(a);b['push'](f);a['completedRate']!==undefined&&a['completedRate']<0.7&&c['push']('Completion\x20rate\x20only\x20'+Math['round'](a['completedRate']*0x64)+'%');const g=computeFundDimension(a);b['push'](g);(a['compensationFundBalance']===undefined||a['compensationFundBalance']===0x0n)&&c['push']('No\x20compensation\x20fund;\x20insufficient\x20protection\x20of\x20customer\x20rights');const h=computeTransparencyDimension(a);b['push'](h);const i=b['reduce']((m,n)=>m+n['score'],0x0),j=TRUST_LEVELS['find'](m=>i>=m['min'])?.['level']??'high_risk',k=TRUST_LEVELS['find'](m=>i>=m['min'])?.['label']??'High\x20risk',l=buildSummary(i,k,a,b);return{'score':i,'level':j,'breakdown':b,'summary':l,'warnings':c};}function computeArbitrationDimension(a){const b=0x1e;if(a['arbitrationScore']===undefined&&a['arbitrationVotingGuardCount']===undefined)return{'name':'arbitration','score':b*0.25,'maxScore':b,'description':'Arbitration\x20trust\x20score\x20(no\x20data;\x20default\x20low\x20because\x20arbitration\x20is\x20critical)','humanReadable':'Arbitration:\x20no\x20data\x20(default\x20low\x20—\x20critical\x20missing)'};let c=0x0;const d=[];if(a['arbitrationScore']!==undefined){const e=Math['round'](a['arbitrationScore']/0x64*0xa);c+=e,d['push']('score\x20'+a['arbitrationScore']+'/100');}else c+=0x3;a['arbitrationVotingGuardCount']!==undefined&&a['arbitrationVotingGuardCount']>0x0&&(c+=0x5,d['push'](a['arbitrationVotingGuardCount']+'\x20voting_guard(s)'));a['arbitrationFeeBalance']!==undefined&&a['arbitrationFeeBalance']>0x0n&&(c+=0x5,d['push']('fee\x20funded'));if(a['arbitrationPaused']===![])c+=0x5,d['push']('active');else a['arbitrationPaused']===!![]&&d['push']('paused');return a['arbitrationCases']!==undefined&&a['arbitrationCases']>0x0&&(c+=0x5,d['push'](a['arbitrationCases']+'\x20case(s)')),c=Math['min'](b,c),{'name':'arbitration','score':c,'maxScore':b,'description':'Arbitration\x20config:\x20'+d['join'](',\x20'),'humanReadable':'Arbitration:\x20'+d['join'](',\x20')};}function computeReviewDimension(a){const b=0x19;if(!a['reviewStats']||a['reviewStats']['totalReviews']===0x0)return{'name':'reviews','score':b*0.5,'maxScore':b,'description':'Review\x20reputation\x20(no\x20review\x20data)','humanReadable':'Reviews:\x20no\x20data'};const {likes:c,dislikes:d,verifiedReviews:e,totalReviews:f}=a['reviewStats'],g=c/Math['max'](0x1,f),h=Math['min'](0x5,e),i=Math['round'](g*(b-0x5)+h);return{'name':'reviews','score':Math['min'](b,i),'maxScore':b,'description':'Like\x20rate\x20'+Math['round'](g*0x64)+'%\x20('+f+'\x20reviews,\x20'+e+'\x20verified)','humanReadable':'Like\x20rate\x20'+Math['round'](g*0x64)+'%\x20('+f+'\x20reviews)'};}function computeFulfillmentDimension(a){const b=0x14;if(a['orderCount']===undefined)return{'name':'fulfillment','score':b*0.5,'maxScore':b,'description':'Fulfillment\x20record\x20(no\x20order\x20data)','humanReadable':'Fulfillment:\x20no\x20data'};let c=0x0;const d=Math['min'](0xa,Math['floor'](a['orderCount']/0x5));return c+=d,a['completedRate']!==undefined?c+=Math['round'](a['completedRate']*0xa):c+=0x5,{'name':'fulfillment','score':Math['min'](b,c),'maxScore':b,'description':'Completed\x20'+a['orderCount']+'\x20orders,\x20completion\x20rate\x20'+(a['completedRate']!==undefined?Math['round'](a['completedRate']*0x64)+'%':'unknown'),'humanReadable':'Fulfillment:\x20'+a['orderCount']+'\x20orders'+(a['avgCompletionTime']!==undefined?',\x20avg\x20'+a['avgCompletionTime']+'h':'')};}function computeFundDimension(a){const b=0xf;if(a['compensationFundBalance']===undefined||a['compensationFundBalance']===0x0n)return{'name':'fund_safety','score':0x0,'maxScore':b,'description':'No\x20compensation\x20fund','humanReadable':'Compensation\x20fund:\x20none'};const c=a['compensationFundBalance'];if(a['typicalOrderAmount']!==undefined&&a['typicalOrderAmount']>0x0n){const g=Number(c*0x64n/a['typicalOrderAmount'])/0x64;let h,i;if(g>=0xa)h=b,i='Compensation\x20fund:\x20'+g['toFixed'](0x1)+'x\x20order\x20amount\x20(excellent)';else g>=0x1?(h=0xa+Math['round']((g-0x1)/0x9*0x5),i='Compensation\x20fund:\x20'+g['toFixed'](0x1)+'x\x20order\x20amount\x20(covers\x20≥1\x20payout)'):(h=Math['round'](g*0xa),i='Compensation\x20fund:\x20'+g['toFixed'](0x1)+'x\x20order\x20amount\x20(insufficient)');return{'name':'fund_safety','score':Math['min'](b,h),'maxScore':b,'description':'Fund\x20'+c['toString']()+'\x20/\x20typical\x20order\x20'+a['typicalOrderAmount']['toString']()+'\x20=\x20'+g['toFixed'](0x2)+'x','humanReadable':i};}const d=0xe8d4a51000n,e=Number(a['compensationFundBalance']*0x64n/d)/0x64,f=Math['min'](b,Math['round'](e*b));return{'name':'fund_safety','score':f,'maxScore':b,'description':'Compensation\x20fund\x20'+a['compensationFundBalance']+'\x20smallest\x20unit\x20(absolute\x20threshold\x20fallback)','humanReadable':'Compensation\x20fund:\x20'+e['toFixed'](0x2)+'x\x20absolute\x20threshold'};}function computeTransparencyDimension(a){const b=0xa;let c=0x0;if(a['hasPublishedEvents'])c+=0x4;if(a['hasMachineBound'])c+=0x3;if(a['hasBuyGuard'])c+=0x3;return{'name':'transparency','score':Math['min'](b,c),'maxScore':b,'description':'On-chain\x20events\x20'+(a['hasPublishedEvents']?'✓':'✗')+',\x20Machine\x20'+(a['hasMachineBound']?'✓':'✗')+',\x20Guard\x20'+(a['hasBuyGuard']?'✓':'✗'),'humanReadable':'Transparency:\x20'+(['Events','Machine','Guard']['filter']((d,e)=>[a['hasPublishedEvents'],a['hasMachineBound'],a['hasBuyGuard']][e])['join']('+')||'none')};}function buildSummary(a,b,c,e){const f=['Trust\x20score\x20'+a+'/100\x20('+b+')'];for(const g of e){f['push'](''+g['humanReadable']);}return f['join'](';\x20');}export function quickTrustCheck(a){const b=computeServiceTrustScore(a);if(b['score']<0x19)return{'pass':![],'reason':'Trust\x20score\x20'+b['score']+'/100,\x20high\x20risk:\x20'+b['warnings']['join'](';\x20')};return{'pass':!![],'reason':'Trust\x20score\x20'+b['score']+'/100\x20('+b['level']+')'};}
1
+ export const TRUST_METRICS_VERSION=0x2;const TRUST_LEVELS=[{'min':0x4b,'level':'trusted','label':'High\x20trust'},{'min':0x32,'level':'moderate','label':'Moderate\x20trust'},{'min':0x19,'level':'caution','label':'Needs\x20attention'},{'min':0x0,'level':'high_risk','label':'High\x20risk'}];export const TRUST_DIMENSION_WEIGHTS={'trust_arbitration':0x14,'trust_reviews':0x23,'trust_fulfillment':0x14,'trust_fund_safety':0xf,'trust_transparency':0xa};function trustWeight(a,b){const c=b?.['overrides']?.['rules']?.[a];if(c?.['enabled']===![])return 0x0;if(c?.['weight']!==undefined)return Math['max'](0x0,c['weight']);return TRUST_DIMENSION_WEIGHTS[a];}export function computeServiceTrustScore(a,b){const c=[{'id':'trust_arbitration','dim':computeArbitrationDimension(a)},{'id':'trust_reviews','dim':computeReviewDimension(a)},{'id':'trust_fulfillment','dim':computeFulfillmentDimension(a)},{'id':'trust_fund_safety','dim':computeFundDimension(a)},{'id':'trust_transparency','dim':computeTransparencyDimension(a)}],d=[],e=[];let f=0x0,g=0x0;for(const {id:m,dim:n}of c){const o=trustWeight(m,b),p=n['maxScore']>0x0?n['score']/n['maxScore']*0x64:0x0;f+=p*o,g+=o,e['push']({...n,'weight':o}),o>0x0&&p<0x1e&&d['push'](n['name']+':\x20low\x20score\x20('+Math['round'](p)+'/100)');}const h=[];(a['compensationFundBalance']===undefined||a['compensationFundBalance']===0x0n)&&h['push']({'kind':'fund_safety_missing','severity':'warning','message':'No\x20compensation\x20fund;\x20insufficient\x20protection\x20of\x20customer\x20rights','deduction':0x5});const i=g>0x0?Math['round'](f/g):0x0,j=TRUST_LEVELS['find'](q=>i>=q['min'])?.['level']??'high_risk',k=TRUST_LEVELS['find'](q=>i>=q['min'])?.['label']??'High\x20risk',l=buildSummary(i,k,a,e);return{'score':i,'level':j,'breakdown':e,'summary':l,'warnings':d,'findings':h};}function computeArbitrationDimension(a){const b=0x14;if(a['arbitrationScore']===undefined&&a['arbitrationVotingGuardCount']===undefined)return{'name':'arbitration','score':b*0.25,'maxScore':b,'description':'Arbitration\x20trust\x20score\x20(no\x20data;\x20default\x20low\x20because\x20arbitration\x20is\x20critical)','humanReadable':'Arbitration:\x20no\x20data\x20(default\x20low\x20—\x20critical\x20missing)'};let c=0x0;const d=[];if(a['arbitrationScore']!==undefined){const e=Math['round'](a['arbitrationScore']/0x64*0x8);c+=e,d['push']('score\x20'+a['arbitrationScore']+'/100');}else c+=0x2;a['arbitrationVotingGuardCount']!==undefined&&a['arbitrationVotingGuardCount']>0x0&&(c+=0x3,d['push'](a['arbitrationVotingGuardCount']+'\x20voting_guard(s)'));a['arbitrationFeeBalance']!==undefined&&a['arbitrationFeeBalance']>0x0n&&(c+=0x3,d['push']('fee\x20funded'));if(a['arbitrationPaused']===![])c+=0x3,d['push']('active');else a['arbitrationPaused']===!![]&&d['push']('paused');return a['arbitrationCases']!==undefined&&a['arbitrationCases']>0x0&&(c+=0x3,d['push'](a['arbitrationCases']+'\x20case(s)')),c=Math['min'](b,c),{'name':'arbitration','score':c,'maxScore':b,'description':'Arbitration\x20config:\x20'+d['join'](',\x20'),'humanReadable':'Arbitration:\x20'+d['join'](',\x20')};}function computeReviewDimension(a){const b=0x23;if(!a['reviewStats']||a['reviewStats']['totalReviews']===0x0)return{'name':'reviews','score':b*0.5,'maxScore':b,'description':'Review\x20reputation\x20(no\x20review\x20data)','humanReadable':'Reviews:\x20no\x20data'};const {likes:c,dislikes:d,verifiedReviews:e,totalReviews:f}=a['reviewStats'],g=c/Math['max'](0x1,f),h=Math['min'](0x5,e),i=Math['round'](g*0x14+h),j=a['hasReward']?0xa:0x0;return{'name':'reviews','score':Math['min'](b,i+j),'maxScore':b,'description':'Like\x20rate\x20'+Math['round'](g*0x64)+'%\x20('+f+'\x20reviews,\x20'+e+'\x20verified)\x20+\x20reward\x20mechanism\x20'+(a['hasReward']?'✓':'✗'),'humanReadable':'Like\x20rate\x20'+Math['round'](g*0x64)+'%\x20('+f+'\x20reviews)'+(a['hasReward']?',\x20reward\x20✓':'')};}function computeFulfillmentDimension(a){const b=0x14;if(a['orderCount']===undefined)return{'name':'fulfillment','score':b*0.5,'maxScore':b,'description':'Fulfillment\x20record\x20(no\x20order\x20data)','humanReadable':'Fulfillment:\x20no\x20data'};let c=0x0;const d=Math['min'](0xa,Math['floor'](a['orderCount']/0x5));return c+=d,a['completedRate']!==undefined?c+=Math['round'](a['completedRate']*0xa):c+=0x5,{'name':'fulfillment','score':Math['min'](b,c),'maxScore':b,'description':'Completed\x20'+a['orderCount']+'\x20orders,\x20completion\x20rate\x20'+(a['completedRate']!==undefined?Math['round'](a['completedRate']*0x64)+'%':'unknown'),'humanReadable':'Fulfillment:\x20'+a['orderCount']+'\x20orders'+(a['avgCompletionTime']!==undefined?',\x20avg\x20'+a['avgCompletionTime']+'h':'')};}function computeFundDimension(a){const b=0xf;if(a['compensationFundBalance']===undefined||a['compensationFundBalance']===0x0n)return{'name':'fund_safety','score':0x0,'maxScore':b,'description':'No\x20compensation\x20fund','humanReadable':'Compensation\x20fund:\x20none'};const c=a['compensationFundBalance'];if(a['typicalOrderAmount']!==undefined&&a['typicalOrderAmount']>0x0n){const g=Number(c*0x64n/a['typicalOrderAmount'])/0x64;let h,i;if(g>=0xa)h=b,i='Compensation\x20fund:\x20'+g['toFixed'](0x1)+'x\x20order\x20amount\x20(excellent)';else g>=0x1?(h=0xa+Math['round']((g-0x1)/0x9*0x5),i='Compensation\x20fund:\x20'+g['toFixed'](0x1)+'x\x20order\x20amount\x20(covers\x20≥1\x20payout)'):(h=Math['round'](g*0xa),i='Compensation\x20fund:\x20'+g['toFixed'](0x1)+'x\x20order\x20amount\x20(insufficient)');return{'name':'fund_safety','score':Math['min'](b,h),'maxScore':b,'description':'Fund\x20'+c['toString']()+'\x20/\x20typical\x20order\x20'+a['typicalOrderAmount']['toString']()+'\x20=\x20'+g['toFixed'](0x2)+'x','humanReadable':i};}const d=0xe8d4a51000n,e=Number(a['compensationFundBalance']*0x64n/d)/0x64,f=Math['min'](b,Math['round'](e*b));return{'name':'fund_safety','score':f,'maxScore':b,'description':'Compensation\x20fund\x20'+a['compensationFundBalance']+'\x20smallest\x20unit\x20(absolute\x20threshold\x20fallback)','humanReadable':'Compensation\x20fund:\x20'+e['toFixed'](0x2)+'x\x20absolute\x20threshold'};}function computeTransparencyDimension(a){const b=0xa;let c=0x0;if(a['hasPublishedEvents'])c+=0x4;if(a['hasMachineBound'])c+=0x3;if(a['hasBuyGuard'])c+=0x3;return{'name':'transparency','score':Math['min'](b,c),'maxScore':b,'description':'On-chain\x20events\x20'+(a['hasPublishedEvents']?'✓':'✗')+',\x20Machine\x20'+(a['hasMachineBound']?'✓':'✗')+',\x20Guard\x20'+(a['hasBuyGuard']?'✓':'✗'),'humanReadable':'Transparency:\x20'+(['Events','Machine','Guard']['filter']((d,e)=>[a['hasPublishedEvents'],a['hasMachineBound'],a['hasBuyGuard']][e])['join']('+')||'none')};}function buildSummary(a,b,c,e){const f=['Trust\x20score\x20'+a+'/100\x20('+b+')'];for(const g of e){f['push'](''+g['humanReadable']);}return f['join'](';\x20');}export function quickTrustCheck(a){const b=computeServiceTrustScore(a);if(b['score']<0x19)return{'pass':![],'reason':'Trust\x20score\x20'+b['score']+'/100,\x20high\x20risk:\x20'+b['warnings']['join'](';\x20')};return{'pass':!![],'reason':'Trust\x20score\x20'+b['score']+'/100\x20('+b['level']+')'};}
@@ -16,6 +16,9 @@ export interface ParsedMachineNode {
16
16
  }
17
17
  export type NameResolver = (addr: string | undefined | null) => string | undefined;
18
18
  export declare function resolvePermissionRole(index: number | undefined | null, permissionDescription?: string): string;
19
+ export declare const QUERY_OBJECTS_BATCH = 50;
20
+ export declare function fetchAllFieldObjectIds(parent: string, network?: string, noCache?: boolean): Promise<string[]>;
21
+ export declare function batchQueryObjectsByIds(ids: string[], network?: string, noCache?: boolean): Promise<any[]>;
19
22
  export declare function fetchMachineNodes(machine: string, network?: string, noCache?: boolean): Promise<ParsedMachineNode[]>;
20
23
  export interface GuidanceInput {
21
24
  current: string;
@@ -158,7 +161,25 @@ export interface EntityContactContext {
158
161
  items: EntityContactItem[];
159
162
  byContact: Map<string, number>;
160
163
  }
161
- export declare function fetchEntityContact(entityAddr: string, network?: string, noCache?: boolean): Promise<EntityContactContext | undefined>;
164
+ export declare const ENTITY_ORDER_OBJECT_ID = "0xaa8";
165
+ export declare const ENTITY_ORDER_ROLES: {
166
+ readonly OWNER: 1;
167
+ readonly AGENT: 2;
168
+ };
169
+ export interface EntityOrderItem {
170
+ role: number;
171
+ order: string;
172
+ time: number;
173
+ }
174
+ export interface EntityOrderContext {
175
+ items: EntityOrderItem[];
176
+ byOrder: Map<string, number>;
177
+ }
178
+ export declare function fetchOrdersOfUser(entityAddr: string, network?: string, noCache?: boolean): Promise<any[] | undefined>;
179
+ export interface ResolvedLocalNames {
180
+ byAddress: Map<string, string>;
181
+ }
182
+ export declare function resolveLocalNamesFor(addresses: string[]): Promise<ResolvedLocalNames>;
162
183
  export declare const OBJECT_LINKER_CORE_OBJECT_ID = "0xaae";
163
184
  export declare const OBJECT_LINKER_TX_OBJECT_ID = "0xaaf";
164
185
  export interface ObjectLinkerItem {
@@ -1 +1 @@
1
- import{query_objects,query_table,query_account_list,LocalMark,GetLocalNamesByAddresses,bcs,deriveDynamicFieldID}from'@wowok/wowok';import{REPOSITORY_PERMISSIONS,REWARD_PERMISSIONS,MACHINE_PERMISSIONS,PROGRESS_PERMISSIONS,TREASURY_PERMISSIONS,SERVICE_PERMISSIONS,ARBITRATION_PERMISSIONS,DEMAND_PERMISSIONS,CONTACT_PERMISSIONS}from'./permission-ledger.js';const BUILTIN_PERMISSION_MAP=new Map();for(const entry of[...REPOSITORY_PERMISSIONS,...REWARD_PERMISSIONS,...MACHINE_PERMISSIONS,...PROGRESS_PERMISSIONS,...TREASURY_PERMISSIONS,...SERVICE_PERMISSIONS,...ARBITRATION_PERMISSIONS,...DEMAND_PERMISSIONS,...CONTACT_PERMISSIONS]){BUILTIN_PERMISSION_MAP['set'](entry['index'],entry['name']);}export function resolvePermissionRole(a,b){if(a===undefined||a===null)return'unknown\x20role';if(b){const d=/([A-Za-z][A-Za-z0-9_]*)\s*=\s*(\d+)/g;let e;while((e=d['exec'](b))!==null){if(Number(e[0x2])===a)return e[0x1]+'\x20(permission\x20'+a+')';}}const c=BUILTIN_PERMISSION_MAP['get'](a);if(c)return c+'\x20(permission\x20'+a+')';return'permission\x20'+a;}export async function fetchMachineNodes(a,b,c){const d=await query_objects({'objects':[a],'no_cache':c,'network':b}),e=d?.['objects']?.[0x0],f=e?.['object']??(typeof a==='string'&&a['startsWith']('0x')?a:undefined);if(!f)return[];const g=await query_table({'parent':f,'no_cache':c,'network':b}),h=(g?.['items']??[])['map'](j=>j?.['object'])['filter'](j=>typeof j==='string');if(h['length']===0x0)return[];const i=await query_objects({'objects':h,'no_cache':c,'network':b});return(i?.['objects']??[])['filter'](j=>j?.['type']==='TableItem_MachineNode')['map'](j=>{const k=j?.['data']??j,l=typeof k?.['name']==='string'?k['name']:'',m=Array['isArray'](k?.['value'])?k['value']:Array['isArray'](k?.['pairs'])?k['pairs']:[];if(!l)return null;return{'name':l,'pairs':m['map'](n=>({'prev_node':String(n?.['prev_node']??''),'threshold':Number(n?.['threshold']??0x0),'forwards':Array['isArray'](n?.['forwards'])?n['forwards']['map'](q=>{const r=typeof q?.['guard']==='object'&&q?.['guard']!==null?q['guard']['guard']??undefined:typeof q?.['guard']==='string'?q['guard']:undefined;return{'name':String(q?.['name']??''),'weight':Number(q?.['weight']??0x0),'namedOperator':q?.['namedOperator']!==undefined&&q?.['namedOperator']!==null?String(q['namedOperator']):undefined,'permissionIndex':q?.['permissionIndex']!==undefined&&q?.['permissionIndex']!==null?Number(q['permissionIndex']):undefined,'guard':r};}):[]}))};})['filter'](j=>j!==null);}const COMPLETE_RE=/(^|_)(completed?|done|finished|received|delivered|accepted|confirmed|finalized|success|approved)(_|$)/i,REFUND_RE=/(^|_)(cancel(led)?|refund(ed)?|return(ed|_approved)?)(_|$)/i,EXCEPTION_RE=/(^|_)(interrupt(ed)?|exception|dispute(d)?|fail(ed)?|abort(ed)?|reject(ed)?)(_|$)/i;function classifyNode(a){if(COMPLETE_RE['test'](a))return'complete';if(REFUND_RE['test'](a))return'refund';if(EXCEPTION_RE['test'](a))return'exception';return'advance';}function businessMeaning(a,b){switch(b){case'complete':return'Service/deliverable\x20accepted\x20at\x20\x22'+a+'\x22\x20—\x20triggers\x20settlement\x20allocation\x20(funds\x20released\x20to\x20the\x20provider)';case'refund':return'Order\x20cancelled/returned\x20at\x20\x22'+a+'\x22\x20—\x20triggers\x20refund\x20allocation\x20(funds\x20back\x20to\x20the\x20customer)';case'exception':return'Exception\x20path\x20at\x20\x22'+a+'\x22\x20—\x20typically\x20routes\x20to\x20arbitration\x20or\x20partial-refund\x20handling';default:return'Progress\x20to\x20\x22'+a+'\x22';}}function shortAddr(a){if(!a)return undefined;if(a['length']>0xe)return a['slice'](0x0,0x8)+'...'+a['slice'](-0x4);return a;}function callerIsOrderHolder(a,b){if(!a||!b?.['length'])return![];const d=a['toLowerCase']();return b['some'](e=>e?.['toLowerCase']()===d);}function resolveOperator(a,b,c,d){if(a['namedOperator']===''){const e=b?.[0x0];return{'kind':'order_holder','role_name':'order\x20holder\x20(customer)','account_name':d?d(e):shortAddr(e)};}if(typeof a['namedOperator']==='string'&&a['namedOperator']['length']>0x0)return{'kind':'named_operator','named_operator':a['namedOperator'],'role_name':'named\x20operator\x20\x22'+a['namedOperator']+'\x22'};if(a['permissionIndex']!==undefined&&a['permissionIndex']!==null)return{'kind':'permission_index','permission_index':a['permissionIndex'],'role_name':resolvePermissionRole(a['permissionIndex'],c)};return{'kind':'order_holder','role_name':'unknown\x20operator'};}function gainsRisksFor(a,b,c){if(!c)return{'gains':[],'risks':[]};if(b)switch(a){case'complete':return{'gains':['Flow\x20advances','Settlement\x20triggered\x20(funds\x20released)'],'risks':['Funds\x20released\x20to\x20provider','Refund\x20leverage\x20lost\x20—\x20confirm\x20only\x20if\x20service\x20verified']};case'refund':return{'gains':['Funds\x20returned\x20to\x20you'],'risks':['If\x20service\x20was\x20already\x20rendered,\x20cancellation\x20may\x20be\x20disputed']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20reputation\x20impact']};default:return{'gains':['Flow\x20advances'],'risks':[]};}switch(a){case'complete':return{'gains':['Settlement\x20triggered\x20—\x20funds\x20released\x20to\x20provider'],'risks':[]};case'refund':return{'gains':['Clean\x20closure'],'risks':['Lost\x20revenue\x20for\x20this\x20order']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20compensation\x20fund']};default:return{'gains':['Flow\x20advances'],'risks':[]};}}function consistencyFor(a,b,c,d,e){let f;if(!e)f=a==='exception'?0x2d:0x32;else b?f=a==='refund'?0x46:a==='complete'?0x37:a==='exception'?0x23:0x32:f=a==='complete'?0x4b:a==='refund'?0x1e:a==='exception'?0x23:0x32;if(e&&c)f+=0x14;if(d)f-=0xa;return Math['max'](0x0,Math['min'](0x64,f));}export function buildWorkflowGuidance(a){const b=[];for(const i of a['nodes']){for(const j of i['pairs']){if(j['prev_node']!==a['current'])continue;for(const k of j['forwards']){if(!k['name'])continue;const l=resolveOperator(k,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver']),m=callerIsOrderHolder(a['callerAddress']??a['caller'],a['orderHolderAddresses']);let n=![];a['callerAddress']&&(n=accountCanExecuteForward(k,a['callerAddress'],a['progressNamedOperator']??[],a['orderContext'],a['permissionContext']));const p=classifyNode(i['name']),q=!!a['caller'],{gains:r,risks:s}=gainsRisksFor(p,m,q),t=consistencyFor(p,m,n,!!k['guard'],q);b['push']({'next_node':i['name'],'forward':k['name'],'weight':k['weight'],'operator':l,'guard':k['guard'],'business_meaning':businessMeaning(i['name'],p),'gains':r,'risks':s,'consistency':t,'recommended':![]});}}}if(b['length']===0x0)return{'current_node':a['current'],'caller':a['caller'],'options':[],'note':'Node\x20\x22'+a['current']+'\x22\x20has\x20no\x20outgoing\x20forwards\x20—\x20it\x20is\x20a\x20terminal\x20node\x20(or\x20the\x20workflow\x20is\x20stuck).\x20No\x20further\x20progress\x20operation\x20is\x20available\x20here.'};b['sort']((u,v)=>v['consistency']-u['consistency']);const c=b[0x0];b[0x0]={...c,'recommended':!![]};const d=[];for(const u of b){u!==c&&u['consistency']>0x0&&u['forward']!==c['forward']&&d['push']('Choosing\x20\x22'+u['forward']+'\x20→\x20'+u['next_node']+'\x22\x20forfeits\x20the\x20faster/more\x20aligned\x20path\x20\x22'+c['forward']+'\x20→\x20'+c['next_node']+'\x22');}const e=[],g=b['filter'](v=>v['operator']['kind']==='order_holder'&&v['forward']!==c['forward']&&c['forward']!==v['forward']),h=b['filter'](v=>v['operator']['account_name']&&v['operator']['account_name']!==a['caller']);return h['length']>0x0&&!b['some'](v=>v['recommended']&&v['operator']['account_name']===a['caller'])&&e['push']('The\x20recommended\x20action\x20is\x20executed\x20by\x20another\x20account\x20('+h[0x0]['operator']['account_name']+');\x20switch\x20the\x20signing\x20account\x20(env.account)\x20before\x20operating.'),{'current_node':a['current'],'caller':a['caller'],'options':b,'recommendation':{'best':c['forward']+'\x20→\x20'+c['next_node'],'rationale':'Highest\x20consistency\x20('+c['consistency']+'/100)\x20with\x20the\x20caller\x27s\x20interests.\x20Gains:\x20'+(c['gains']['join'](';\x20')||'none')+'.\x20Risks:\x20'+(c['risks']['join'](';\x20')||'none')+'.\x20Operator:\x20'+(c['operator']['role_name']??c['operator']['kind'])+(c['operator']['account_name']?'\x20('+c['operator']['account_name']+')':'')+'.'+(c['guard']?'\x20Guard\x20to\x20satisfy:\x20'+c['guard']+'.':''),'caveat':d['length']?d['join']('.\x20'):undefined},'note':e['length']?e['join']('\x20'):undefined};}export function buildWorkflowReceipt(a){const b=a['current']===a['targetNode'],c={'account':a['callerName'],'action':a['callerName']+'\x20executed\x20'+a['forward']+'\x20(→\x20'+a['targetNode']+')','forward':a['forward'],'target_node':a['targetNode'],'op':a['op'],'migrated':b,'current_node':a['current']};if(!b){const e=a['nodes']['filter'](j=>j['name']===a['targetNode'])['flatMap'](j=>j['pairs'])['find'](j=>j['prev_node']===a['current']),g=a['session']?.['slice'](-0x1)[0x0],h=g?.['threshold']??e?.['threshold']??0x0,i=g?.['weights']??0x0;if(h>0x0){c['threshold']=h,c['accumulated_weight']=i,c['remaining']=Math['max'](0x0,h-i);const j=new Set((g?.['forwards']??[])['filter'](l=>l?.['accomplished']!==![])['map'](l=>l?.['forward'])['filter'](l=>!!l)),k=[];for(const l of e?.['forwards']??[]){if(!l['name']||j['has'](l['name']))continue;k['push']({'forward':l['name'],'operator':resolveOperator(l,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver'])});}if(k['length'])c['waiting_on']=k;c['note']='Node\x20did\x20not\x20migrate:\x20threshold\x20'+h+',\x20accumulated\x20weight\x20'+i+',\x20remaining\x20'+Math['max'](0x0,h-i)+'.\x20'+(k['length']?'Waiting\x20for:\x20'+k['map'](m=>m['forward']+'\x20('+(m['operator']['role_name']??m['operator']['kind'])+')')['join'](';\x20'):'All\x20forwards\x20on\x20this\x20pair\x20are\x20accomplished\x20—\x20the\x20node\x20should\x20migrate\x20on\x20the\x20next\x20operation.');}else c['note']='Node\x20did\x20not\x20migrate\x20(threshold\x200)\x20—\x20no\x20further\x20weight\x20cooperation\x20required;\x20verify\x20the\x20operation\x20outcome.';}const d=buildWorkflowGuidance({'current':a['current'],'nodes':a['nodes'],'caller':a['caller'],'orderHolderAddresses':a['orderHolderAddresses'],'permissionDescription':a['permissionDescription'],'nameResolver':a['nameResolver']});if(d['options']['length']>0x0)c['next_guidance']=d;return c;}function operatorText(a){const b=[a['role_name']??a['kind']];if(a['account_name'])b['push'](a['account_name']);return b['join']('\x20/\x20');}export function renderGuidanceText(a){const b=['[WORKFLOW\x20GUIDANCE]\x20current\x20node:\x20\x22'+a['current_node']+'\x22'+(a['caller']?'\x20(caller:\x20'+a['caller']+')':'')];if(a['options']['length']===0x0)return b['push']('\x20\x20•\x20'+(a['note']??'No\x20reachable\x20next\x20nodes.')),b['join']('\x0a');for(const c of a['options']){const d=['\x22'+c['forward']+'\x22\x20→\x20\x22'+c['next_node']+'\x22','operator:\x20'+operatorText(c['operator']),'weight:\x20'+c['weight'],'consistency:\x20'+c['consistency']+'/100'+(c['recommended']?'\x20[RECOMMENDED]':'')];if(c['guard'])d['push']('guard:\x20'+c['guard']);d['push']('meaning:\x20'+c['business_meaning']);if(c['gains']['length'])d['push']('gains:\x20'+c['gains']['join'](';\x20'));if(c['risks']['length'])d['push']('risks:\x20'+c['risks']['join'](';\x20'));b['push']('\x20\x20•\x20'+d['join']('\x20|\x20'));}if(a['recommendation']?.['best']){b['push']('\x20\x20RECOMMENDED:\x20'+a['recommendation']['best']+'.\x20'+(a['recommendation']['rationale']??''));if(a['recommendation']['caveat'])b['push']('\x20\x20CAVEAT\x20(opportunity\x20cost):\x20'+a['recommendation']['caveat']);}if(a['note'])b['push']('\x20\x20NOTE:\x20'+a['note']);return b['push']('\x20\x20(AI\x20recommendation\x20only\x20—\x20the\x20account\x20decides;\x20switch\x20env.account\x20if\x20another\x20operator\x20must\x20act.)'),b['join']('\x0a');}export function renderReceiptText(a){const b=['[WORKFLOW\x20RECEIPT]\x20'+a['action']];b['push']('\x20\x20•\x20node\x20migrated:\x20'+(a['migrated']?'yes\x20→\x20current:\x20\x22'+a['current_node']+'\x22':'no\x20→\x20current:\x20\x22'+a['current_node']+'\x22'));if(!a['migrated']){a['threshold']!==undefined&&a['threshold']>0x0&&(b['push']('\x20\x20•\x20threshold:\x20'+a['threshold']+'\x20|\x20accumulated\x20weight:\x20'+(a['accumulated_weight']??0x0)+'\x20|\x20remaining:\x20'+(a['remaining']??0x0)),a['waiting_on']?.['length']&&b['push']('\x20\x20•\x20waiting\x20on:\x20'+a['waiting_on']['map'](c=>'\x22'+c['forward']+'\x22\x20('+operatorText(c['operator'])+')')['join'](';\x20')));if(a['note'])b['push']('\x20\x20•\x20note:\x20'+a['note']);}return a['next_guidance']&&a['next_guidance']['options']['length']>0x0&&b['push'](renderGuidanceText(a['next_guidance'])),b['join']('\x0a');}async function makeNameResolver(a){const b=[...new Set(a['filter'](d=>!!d))],c=new Map();if(b['length'])try{const d=await GetLocalNamesByAddresses(b);for(const e of d){const f=e?.['account']??e?.['local_mark'];if(f)c['set'](e['address']['toLowerCase'](),f);}}catch{}return g=>{if(!g)return undefined;const h=c['get'](g['toLowerCase']());return h??shortAddr(g);};}export async function enrichWorkflowGuidance(a){try{let b;if(a['progressRef']['startsWith']('0x'))b=a['progressRef'];else b=await LocalMark['Instance']()['get_address'](a['progressRef'])??undefined;if(!b)return undefined;const c=await query_objects({'objects':[b],'no_cache':a['noCache'],'network':a['network']}),d=c?.['objects']?.[0x0],e=d?.['data']??d;if((d?.['type']??e?.['type'])!=='Progress')return undefined;const f=e['current']??'',g=e['machine'],h=Array['isArray'](e['session'])?e['session']:[],i=(Array['isArray'](e['namedOperator'])?e['namedOperator']['find'](u=>u?.['name']==='')?.['operators']:undefined)??[];if(!g)return undefined;const j=await fetchMachineNodes(g,a['network'],a['noCache']);let k,l;try{const u=await query_objects({'objects':[g],'no_cache':a['noCache'],'network':a['network']}),v=u?.['objects']?.[0x0],w=v?.['data']??v,x=w?.['permission'];if(x){const y=await query_objects({'objects':[x],'no_cache':a['noCache'],'network':a['network']}),z=y?.['objects']?.[0x0];k=(z?.['data']??z)?.['description']??undefined,l=await fetchPermissionContext(x,a['network'],a['noCache']);}}catch{}const m=(Array['isArray'](e['namedOperator'])?e['namedOperator']:[])['map'](A=>({'name':String(A?.['name']??''),'operators':(A?.['operators']??[])['map'](B=>String(B))}));let n;e['task']&&(n=await fetchOrderContext(e['task'],a['network'],a['noCache']));let o;try{o=await LocalMark['Instance']()['get_address'](a['accountName'])??undefined;}catch{o=undefined;}const p=await makeNameResolver([a['accountName'],...i]),q={'current':f,'nodes':j,'caller':a['accountName'],'callerAddress':o,'orderHolderAddresses':i,'progressNamedOperator':m,'permissionContext':l,'orderContext':n,'permissionDescription':k,'nameResolver':p},r=buildWorkflowGuidance(q);let s;a['operate']?.['forward']&&a['operate']?.['next_node_name']&&(s=buildWorkflowReceipt({...q,'callerName':a['accountName']??b,'forward':a['operate']['forward'],'targetNode':a['operate']['next_node_name'],'op':a['operate']['op'],'session':h}));const t=[s?renderReceiptText(s):undefined,r['options']['length']?renderGuidanceText(r):undefined]['filter'](A=>!!A)['join']('\x0a\x0a');return{'guidance':r,'receipt':s,'text':t};}catch{return undefined;}}export function mergeGuidanceIntoOutput(a,b){if(!b)return a;try{const c=a?.['structuredContent'];if(c&&typeof c==='object'){const d=c['semantic'];if(d&&typeof d==='object'){if(b['guidance'])d['workflow_guidance']=b['guidance'];if(b['receipt'])d['workflow_receipt']=b['receipt'];}}b['text']&&Array['isArray'](a?.['content'])&&a['content'][0x0]?.['text']!==undefined&&(a['content'][0x0]['text']=b['text']+'\x0a\x0a'+a['content'][0x0]['text']);}catch{}return a;}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=bcs['Address']['serialize'](a)['toBytes'](),f=deriveDynamicFieldID(ENTITY_PERMISSION_OBJECT_ID,'address',e),g=await query_objects({'objects':[f],'no_cache':c,'network':b}),h=g?.['objects']?.[0x0],i=h?.['data']??h,j=[],k=new Map(),l=Array['isArray'](i?.['items'])?i['items']:[];for(const m of l){const n=Number(m?.['role']??0x0),o=String(m?.['permission']??'')['toLowerCase'](),p=Number(m?.['time']??0x0);o&&(j['push']({'role':n,'permission':o,'time':p}),k['set'](o,(k['get'](o)??0x0)|n));}return{'items':j,'byPermission':k};}catch{return undefined;}}export const ENTITY_CONTACT_OBJECT_ID='0xaa9';export async function fetchEntityContact(a,b,c){try{const e=bcs['Address']['serialize'](a)['toBytes'](),f=deriveDynamicFieldID(ENTITY_CONTACT_OBJECT_ID,'address',e),g=await query_objects({'objects':[f],'no_cache':c,'network':b}),h=g?.['objects']?.[0x0],i=h?.['data']??h,j=[],k=new Map(),l=Array['isArray'](i?.['items'])?i['items']:[];for(const m of l){const n=String(m?.['contact']??'')['toLowerCase'](),o=Number(m?.['time']??0x0);n&&(j['push']({'contact':n,'time':o}),k['set'](n,o));}return{'items':j,'byContact':k};}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=bcs['Address']['serialize'](b)['toBytes'](),g=deriveDynamicFieldID(a,'address',f),h=await query_objects({'objects':[g],'no_cache':e,'network':c}),i=h?.['objects']?.[0x0],j=i?.['data']??i,k=[],l=new Map(),m=Array['isArray'](j?.['items'])?j['items']:[];for(const n of m){const o=String(n?.['who']??'')['toLowerCase'](),p=Number(n?.['time']??0x0);o&&(k['push']({'who':o,'time':p}),l['set'](o,p));}return{'items':k,'byWho':l};}catch{return undefined;}}export async function fetchObjectLinkerCore(a,b,c){return fetchObjectLinker(OBJECT_LINKER_CORE_OBJECT_ID,a,b,c);}export async function fetchObjectLinkerTx(a,b,c){return fetchObjectLinker(OBJECT_LINKER_TX_OBJECT_ID,a,b,c);}export async function fetchPermissionContext(a,b,c){try{const e=await query_objects({'objects':[a],'no_cache':c,'network':b}),f=e?.['objects']?.[0x0],g=f?.['data']??f,h=new Set((g?.['admin']??[])['map'](l=>String(l)['toLowerCase']())),i=new Map(),j=await query_table({'parent':a,'no_cache':c,'network':b}),k=(j?.['items']??[])['map'](l=>l?.['object'])['filter'](l=>typeof l==='string');if(k['length']>0x0){const l=await query_objects({'objects':k,'no_cache':c,'network':b});for(const m of l?.['objects']??[]){const n=m?.['data']??m,p=n?.['address'],q=n?.['perm'];p!=null&&Array['isArray'](q)&&i['set'](String(p)['toLowerCase'](),new Set(q['map'](r=>Number(r))));}}return{'admin':h,'table':i};}catch{return undefined;}}export async function fetchOrderContext(a,b,c){try{const e=await query_objects({'objects':[a],'no_cache':c,'network':b}),f=e?.['objects']?.[0x0];if((f?.['type']??f?.['data']?.['type'])!=='Order')return undefined;const g=f?.['data']??f;return{'builder':String(g?.['builder']??''),'agent':new Set((g?.['agent']??[])['map'](h=>String(h)['toLowerCase']()))};}catch{return undefined;}}export async function listLocalAccounts(){try{const a=await query_account_list({'suspended':![]});return(a??[])['filter'](b=>b?.['address'])['map'](b=>({'address':String(b['address']),'name':b['name']??undefined}));}catch{return[];}}export function accountCanExecuteForward(a,b,c,d,e){const g=b['toLowerCase']();if(a['namedOperator']!==undefined&&a['namedOperator']!==null){if(a['namedOperator']===''){if(d&&(g===d['builder']['toLowerCase']()||d['agent']['has'](g)))return!![];}else{if(a['namedOperator']['length']>0x0){const h=c['find'](i=>i?.['name']===a['namedOperator']);if(h?.['operators']?.['some'](i=>String(i)['toLowerCase']()===g))return!![];}}}if(a['permissionIndex']!==undefined&&a['permissionIndex']!==null&&e){if(e['admin']['has'](g))return!![];const i=e['table']['get'](g);if(i?.['has'](a['permissionIndex']))return!![];}return![];}
1
+ import{query_objects,query_table,query_account_list,LocalMark,GetLocalNamesByAddresses,bcs,deriveDynamicFieldID,queryOrdersByUser}from'@wowok/wowok';import{REPOSITORY_PERMISSIONS,REWARD_PERMISSIONS,MACHINE_PERMISSIONS,PROGRESS_PERMISSIONS,TREASURY_PERMISSIONS,SERVICE_PERMISSIONS,ARBITRATION_PERMISSIONS,DEMAND_PERMISSIONS,CONTACT_PERMISSIONS}from'./permission-ledger.js';import{formatShortAddress}from'../persona/address-format.js';const BUILTIN_PERMISSION_MAP=new Map();for(const entry of[...REPOSITORY_PERMISSIONS,...REWARD_PERMISSIONS,...MACHINE_PERMISSIONS,...PROGRESS_PERMISSIONS,...TREASURY_PERMISSIONS,...SERVICE_PERMISSIONS,...ARBITRATION_PERMISSIONS,...DEMAND_PERMISSIONS,...CONTACT_PERMISSIONS]){BUILTIN_PERMISSION_MAP['set'](entry['index'],entry['name']);}export function resolvePermissionRole(a,b){if(a===undefined||a===null)return'unknown\x20role';if(b){const d=/([A-Za-z][A-Za-z0-9_]*)\s*=\s*(\d+)/g;let e;while((e=d['exec'](b))!==null){if(Number(e[0x2])===a)return e[0x1]+'\x20(permission\x20'+a+')';}}const c=BUILTIN_PERMISSION_MAP['get'](a);if(c)return c+'\x20(permission\x20'+a+')';return'permission\x20'+a;}export const QUERY_OBJECTS_BATCH=0x32;export async function fetchAllFieldObjectIds(a,b,c){const d=[];let e=undefined;for(;;){const f=await query_table({'parent':a,'cursor':e??undefined,'no_cache':c,'network':b});if(!f?.['items']||f['items']['length']===0x0)break;for(const g of f['items']){const h=g?.['object'];if(typeof h==='string')d['push'](h);}if(!f['hasNextPage']||!f['nextCursor'])break;e=f['nextCursor'];}return d;}export async function batchQueryObjectsByIds(a,b,c){const d=[];for(let e=0x0;e<a['length'];e+=QUERY_OBJECTS_BATCH){const f=a['slice'](e,e+QUERY_OBJECTS_BATCH),g=await query_objects({'objects':f,'no_cache':c,'network':b});d['push'](...g?.['objects']??[]);}return d;}export async function fetchMachineNodes(a,b,c){const d=await query_objects({'objects':[a],'no_cache':c,'network':b}),e=d?.['objects']?.[0x0],f=e?.['object']??(typeof a==='string'&&a['startsWith']('0x')?a:undefined);if(!f)return[];const g=await fetchAllFieldObjectIds(f,b,c);if(g['length']===0x0)return[];const h=await batchQueryObjectsByIds(g,b,c);return(h??[])['filter'](i=>i?.['type']==='TableItem_MachineNode')['map'](i=>{const j=i?.['data']??i,k=typeof j?.['name']==='string'?j['name']:'',l=Array['isArray'](j?.['value'])?j['value']:Array['isArray'](j?.['pairs'])?j['pairs']:[];if(!k)return null;return{'name':k,'pairs':l['map'](m=>({'prev_node':String(m?.['prev_node']??''),'threshold':Number(m?.['threshold']??0x0),'forwards':Array['isArray'](m?.['forwards'])?m['forwards']['map'](n=>{const q=typeof n?.['guard']==='object'&&n?.['guard']!==null?n['guard']['guard']??undefined:typeof n?.['guard']==='string'?n['guard']:undefined;return{'name':String(n?.['name']??''),'weight':Number(n?.['weight']??0x0),'namedOperator':n?.['namedOperator']!==undefined&&n?.['namedOperator']!==null?String(n['namedOperator']):undefined,'permissionIndex':n?.['permissionIndex']!==undefined&&n?.['permissionIndex']!==null?Number(n['permissionIndex']):undefined,'guard':q};}):[]}))};})['filter'](i=>i!==null);}const COMPLETE_RE=/(^|_)(completed?|done|finished|received|delivered|accepted|confirmed|finalized|success|approved)(_|$)/i,REFUND_RE=/(^|_)(cancel(led)?|refund(ed)?|return(ed|_approved)?)(_|$)/i,EXCEPTION_RE=/(^|_)(interrupt(ed)?|exception|dispute(d)?|fail(ed)?|abort(ed)?|reject(ed)?)(_|$)/i;function classifyNode(a){if(COMPLETE_RE['test'](a))return'complete';if(REFUND_RE['test'](a))return'refund';if(EXCEPTION_RE['test'](a))return'exception';return'advance';}function businessMeaning(a,b){switch(b){case'complete':return'Service/deliverable\x20accepted\x20at\x20\x22'+a+'\x22\x20—\x20triggers\x20settlement\x20allocation\x20(funds\x20released\x20to\x20the\x20provider)';case'refund':return'Order\x20cancelled/returned\x20at\x20\x22'+a+'\x22\x20—\x20triggers\x20refund\x20allocation\x20(funds\x20back\x20to\x20the\x20customer)';case'exception':return'Exception\x20path\x20at\x20\x22'+a+'\x22\x20—\x20typically\x20routes\x20to\x20arbitration\x20or\x20partial-refund\x20handling';default:return'Progress\x20to\x20\x22'+a+'\x22';}}function shortAddr(a){if(!a)return undefined;return formatShortAddress(a);}function callerIsOrderHolder(a,b){if(!a||!b?.['length'])return![];const d=a['toLowerCase']();return b['some'](e=>e?.['toLowerCase']()===d);}function resolveOperator(a,b,c,d){if(a['namedOperator']===''){const e=b?.[0x0];return{'kind':'order_holder','role_name':'order\x20holder\x20(customer)','account_name':d?d(e):shortAddr(e)};}if(typeof a['namedOperator']==='string'&&a['namedOperator']['length']>0x0)return{'kind':'named_operator','named_operator':a['namedOperator'],'role_name':'named\x20operator\x20\x22'+a['namedOperator']+'\x22'};if(a['permissionIndex']!==undefined&&a['permissionIndex']!==null)return{'kind':'permission_index','permission_index':a['permissionIndex'],'role_name':resolvePermissionRole(a['permissionIndex'],c)};return{'kind':'order_holder','role_name':'unknown\x20operator'};}function gainsRisksFor(a,b,c){if(!c)return{'gains':[],'risks':[]};if(b)switch(a){case'complete':return{'gains':['Flow\x20advances','Settlement\x20triggered\x20(funds\x20released)'],'risks':['Funds\x20released\x20to\x20provider','Refund\x20leverage\x20lost\x20—\x20confirm\x20only\x20if\x20service\x20verified']};case'refund':return{'gains':['Funds\x20returned\x20to\x20you'],'risks':['If\x20service\x20was\x20already\x20rendered,\x20cancellation\x20may\x20be\x20disputed']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20reputation\x20impact']};default:return{'gains':['Flow\x20advances'],'risks':[]};}switch(a){case'complete':return{'gains':['Settlement\x20triggered\x20—\x20funds\x20released\x20to\x20provider'],'risks':[]};case'refund':return{'gains':['Clean\x20closure'],'risks':['Lost\x20revenue\x20for\x20this\x20order']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20compensation\x20fund']};default:return{'gains':['Flow\x20advances'],'risks':[]};}}function consistencyFor(a,b,c,d,e){let f;if(!e)f=a==='exception'?0x2d:0x32;else b?f=a==='refund'?0x46:a==='complete'?0x37:a==='exception'?0x23:0x32:f=a==='complete'?0x4b:a==='refund'?0x1e:a==='exception'?0x23:0x32;if(e&&c)f+=0x14;if(d)f-=0xa;return Math['max'](0x0,Math['min'](0x64,f));}export function buildWorkflowGuidance(a){const b=[];for(const i of a['nodes']){for(const j of i['pairs']){if(j['prev_node']!==a['current'])continue;for(const k of j['forwards']){if(!k['name'])continue;const l=resolveOperator(k,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver']),m=callerIsOrderHolder(a['callerAddress']??a['caller'],a['orderHolderAddresses']);let n=![];a['callerAddress']&&(n=accountCanExecuteForward(k,a['callerAddress'],a['progressNamedOperator']??[],a['orderContext'],a['permissionContext']));const p=classifyNode(i['name']),q=!!a['caller'],{gains:r,risks:s}=gainsRisksFor(p,m,q),t=consistencyFor(p,m,n,!!k['guard'],q);b['push']({'next_node':i['name'],'forward':k['name'],'weight':k['weight'],'operator':l,'guard':k['guard'],'business_meaning':businessMeaning(i['name'],p),'gains':r,'risks':s,'consistency':t,'recommended':![]});}}}if(b['length']===0x0)return{'current_node':a['current'],'caller':a['caller'],'options':[],'note':'Node\x20\x22'+a['current']+'\x22\x20has\x20no\x20outgoing\x20forwards\x20—\x20it\x20is\x20a\x20terminal\x20node\x20(or\x20the\x20workflow\x20is\x20stuck).\x20No\x20further\x20progress\x20operation\x20is\x20available\x20here.'};b['sort']((u,v)=>v['consistency']-u['consistency']);const c=b[0x0];b[0x0]={...c,'recommended':!![]};const d=[];for(const u of b){u!==c&&u['consistency']>0x0&&u['forward']!==c['forward']&&d['push']('Choosing\x20\x22'+u['forward']+'\x20→\x20'+u['next_node']+'\x22\x20forfeits\x20the\x20faster/more\x20aligned\x20path\x20\x22'+c['forward']+'\x20→\x20'+c['next_node']+'\x22');}const e=[],g=b['filter'](v=>v['operator']['kind']==='order_holder'&&v['forward']!==c['forward']&&c['forward']!==v['forward']),h=b['filter'](v=>v['operator']['account_name']&&v['operator']['account_name']!==a['caller']);return h['length']>0x0&&!b['some'](v=>v['recommended']&&v['operator']['account_name']===a['caller'])&&e['push']('The\x20recommended\x20action\x20is\x20executed\x20by\x20another\x20account\x20('+h[0x0]['operator']['account_name']+');\x20switch\x20the\x20signing\x20account\x20(env.account)\x20before\x20operating.'),{'current_node':a['current'],'caller':a['caller'],'options':b,'recommendation':{'best':c['forward']+'\x20→\x20'+c['next_node'],'rationale':'Highest\x20consistency\x20('+c['consistency']+'/100)\x20with\x20the\x20caller\x27s\x20interests.\x20Gains:\x20'+(c['gains']['join'](';\x20')||'none')+'.\x20Risks:\x20'+(c['risks']['join'](';\x20')||'none')+'.\x20Operator:\x20'+(c['operator']['role_name']??c['operator']['kind'])+(c['operator']['account_name']?'\x20('+c['operator']['account_name']+')':'')+'.'+(c['guard']?'\x20Guard\x20to\x20satisfy:\x20'+c['guard']+'.':''),'caveat':d['length']?d['join']('.\x20'):undefined},'note':e['length']?e['join']('\x20'):undefined};}export function buildWorkflowReceipt(a){const b=a['current']===a['targetNode'],c={'account':a['callerName'],'action':a['callerName']+'\x20executed\x20'+a['forward']+'\x20(→\x20'+a['targetNode']+')','forward':a['forward'],'target_node':a['targetNode'],'op':a['op'],'migrated':b,'current_node':a['current']};if(!b){const e=a['nodes']['filter'](j=>j['name']===a['targetNode'])['flatMap'](j=>j['pairs'])['find'](j=>j['prev_node']===a['current']),g=a['session']?.['slice'](-0x1)[0x0],h=g?.['threshold']??e?.['threshold']??0x0,i=g?.['weights']??0x0;if(h>0x0){c['threshold']=h,c['accumulated_weight']=i,c['remaining']=Math['max'](0x0,h-i);const j=new Set((g?.['forwards']??[])['filter'](l=>l?.['accomplished']!==![])['map'](l=>l?.['forward'])['filter'](l=>!!l)),k=[];for(const l of e?.['forwards']??[]){if(!l['name']||j['has'](l['name']))continue;k['push']({'forward':l['name'],'operator':resolveOperator(l,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver'])});}if(k['length'])c['waiting_on']=k;c['note']='Node\x20did\x20not\x20migrate:\x20threshold\x20'+h+',\x20accumulated\x20weight\x20'+i+',\x20remaining\x20'+Math['max'](0x0,h-i)+'.\x20'+(k['length']?'Waiting\x20for:\x20'+k['map'](m=>m['forward']+'\x20('+(m['operator']['role_name']??m['operator']['kind'])+')')['join'](';\x20'):'All\x20forwards\x20on\x20this\x20pair\x20are\x20accomplished\x20—\x20the\x20node\x20should\x20migrate\x20on\x20the\x20next\x20operation.');}else c['note']='Node\x20did\x20not\x20migrate\x20(threshold\x200)\x20—\x20no\x20further\x20weight\x20cooperation\x20required;\x20verify\x20the\x20operation\x20outcome.';}const d=buildWorkflowGuidance({'current':a['current'],'nodes':a['nodes'],'caller':a['caller'],'orderHolderAddresses':a['orderHolderAddresses'],'permissionDescription':a['permissionDescription'],'nameResolver':a['nameResolver']});if(d['options']['length']>0x0)c['next_guidance']=d;return c;}function operatorText(a){const b=[a['role_name']??a['kind']];if(a['account_name'])b['push'](a['account_name']);return b['join']('\x20/\x20');}export function renderGuidanceText(a){const b=['[WORKFLOW\x20GUIDANCE]\x20current\x20node:\x20\x22'+a['current_node']+'\x22'+(a['caller']?'\x20(caller:\x20'+a['caller']+')':'')];if(a['options']['length']===0x0)return b['push']('\x20\x20•\x20'+(a['note']??'No\x20reachable\x20next\x20nodes.')),b['join']('\x0a');for(const c of a['options']){const d=['\x22'+c['forward']+'\x22\x20→\x20\x22'+c['next_node']+'\x22','operator:\x20'+operatorText(c['operator']),'weight:\x20'+c['weight'],'consistency:\x20'+c['consistency']+'/100'+(c['recommended']?'\x20[RECOMMENDED]':'')];if(c['guard'])d['push']('guard:\x20'+c['guard']);d['push']('meaning:\x20'+c['business_meaning']);if(c['gains']['length'])d['push']('gains:\x20'+c['gains']['join'](';\x20'));if(c['risks']['length'])d['push']('risks:\x20'+c['risks']['join'](';\x20'));b['push']('\x20\x20•\x20'+d['join']('\x20|\x20'));}if(a['recommendation']?.['best']){b['push']('\x20\x20RECOMMENDED:\x20'+a['recommendation']['best']+'.\x20'+(a['recommendation']['rationale']??''));if(a['recommendation']['caveat'])b['push']('\x20\x20CAVEAT\x20(opportunity\x20cost):\x20'+a['recommendation']['caveat']);}if(a['note'])b['push']('\x20\x20NOTE:\x20'+a['note']);return b['push']('\x20\x20(AI\x20recommendation\x20only\x20—\x20the\x20account\x20decides;\x20switch\x20env.account\x20if\x20another\x20operator\x20must\x20act.)'),b['join']('\x0a');}export function renderReceiptText(a){const b=['[WORKFLOW\x20RECEIPT]\x20'+a['action']];b['push']('\x20\x20•\x20node\x20migrated:\x20'+(a['migrated']?'yes\x20→\x20current:\x20\x22'+a['current_node']+'\x22':'no\x20→\x20current:\x20\x22'+a['current_node']+'\x22'));if(!a['migrated']){a['threshold']!==undefined&&a['threshold']>0x0&&(b['push']('\x20\x20•\x20threshold:\x20'+a['threshold']+'\x20|\x20accumulated\x20weight:\x20'+(a['accumulated_weight']??0x0)+'\x20|\x20remaining:\x20'+(a['remaining']??0x0)),a['waiting_on']?.['length']&&b['push']('\x20\x20•\x20waiting\x20on:\x20'+a['waiting_on']['map'](c=>'\x22'+c['forward']+'\x22\x20('+operatorText(c['operator'])+')')['join'](';\x20')));if(a['note'])b['push']('\x20\x20•\x20note:\x20'+a['note']);}return a['next_guidance']&&a['next_guidance']['options']['length']>0x0&&b['push'](renderGuidanceText(a['next_guidance'])),b['join']('\x0a');}async function makeNameResolver(a){const b=[...new Set(a['filter'](d=>!!d))],c=new Map();if(b['length'])try{const d=await GetLocalNamesByAddresses(b);for(const e of d){const f=e?.['account']??e?.['local_mark'];if(f)c['set'](e['address']['toLowerCase'](),f);}}catch{}return g=>{if(!g)return undefined;const h=c['get'](g['toLowerCase']());return h??shortAddr(g);};}export async function enrichWorkflowGuidance(a){try{let b;if(a['progressRef']['startsWith']('0x'))b=a['progressRef'];else b=await LocalMark['Instance']()['get_address'](a['progressRef'])??undefined;if(!b)return undefined;const c=await query_objects({'objects':[b],'no_cache':a['noCache'],'network':a['network']}),d=c?.['objects']?.[0x0],e=d?.['data']??d;if((d?.['type']??e?.['type'])!=='Progress')return undefined;const f=e['current']??'',g=e['machine'],h=Array['isArray'](e['session'])?e['session']:[],i=(Array['isArray'](e['namedOperator'])?e['namedOperator']['find'](v=>v?.['name']==='')?.['operators']:undefined)??[];if(!g)return undefined;const j=await fetchMachineNodes(g,a['network'],![]);let k,l;try{const v=await query_objects({'objects':[g],'no_cache':a['noCache'],'network':a['network']}),w=v?.['objects']?.[0x0],x=w?.['data']??w,y=x?.['permission'];if(y){const z=await query_objects({'objects':[y],'no_cache':a['noCache'],'network':a['network']}),A=z?.['objects']?.[0x0];k=(A?.['data']??A)?.['description']??undefined,l=await fetchPermissionContext(y,a['network'],a['noCache']);}}catch{}const m=(Array['isArray'](e['namedOperator'])?e['namedOperator']:[])['map'](B=>({'name':String(B?.['name']??''),'operators':(B?.['operators']??[])['map'](C=>String(C))}));let n;e['task']&&(n=await fetchOrderContext(e['task'],a['network'],a['noCache']));const o=n?Array['from'](new Set([n['builder'],...n['agent']])['values']()):i;let p;try{p=await LocalMark['Instance']()['get_address'](a['accountName'])??undefined;}catch{p=undefined;}const q=await makeNameResolver([a['accountName'],...o]),r={'current':f,'nodes':j,'caller':a['accountName'],'callerAddress':p,'orderHolderAddresses':o,'progressNamedOperator':m,'permissionContext':l,'orderContext':n,'permissionDescription':k,'nameResolver':q},s=buildWorkflowGuidance(r);let t;a['operate']?.['forward']&&a['operate']?.['next_node_name']&&(t=buildWorkflowReceipt({...r,'callerName':a['accountName']??b,'forward':a['operate']['forward'],'targetNode':a['operate']['next_node_name'],'op':a['operate']['op'],'session':h}));const u=[t?renderReceiptText(t):undefined,s['options']['length']?renderGuidanceText(s):undefined]['filter'](B=>!!B)['join']('\x0a\x0a');return{'guidance':s,'receipt':t,'text':u};}catch{return undefined;}}export function mergeGuidanceIntoOutput(a,b){if(!b)return a;try{const c=a?.['structuredContent'];if(c&&typeof c==='object'){const d=c['semantic'];if(d&&typeof d==='object'){if(b['guidance'])d['workflow_guidance']=b['guidance'];if(b['receipt'])d['workflow_receipt']=b['receipt'];}}b['text']&&Array['isArray'](a?.['content'])&&a['content'][0x0]?.['text']!==undefined&&(a['content'][0x0]['text']=b['text']+'\x0a\x0a'+a['content'][0x0]['text']);}catch{}return a;}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=bcs['Address']['serialize'](a)['toBytes'](),f=deriveDynamicFieldID(ENTITY_PERMISSION_OBJECT_ID,'address',e),g=await query_objects({'objects':[f],'no_cache':c,'network':b}),h=g?.['objects']?.[0x0],i=h?.['data']??h,j=[],k=new Map(),l=Array['isArray'](i?.['items'])?i['items']:[];for(const m of l){const n=Number(m?.['role']??0x0),o=String(m?.['permission']??'')['toLowerCase'](),p=Number(m?.['time']??0x0);o&&(j['push']({'role':n,'permission':o,'time':p}),k['set'](o,(k['get'](o)??0x0)|n));}return{'items':j,'byPermission':k};}catch{return undefined;}}export const ENTITY_CONTACT_OBJECT_ID='0xaa9';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 async function resolveLocalNamesFor(a){const b=new Map();try{const c=[...new Set((a??[])['filter'](e=>typeof e==='string'&&e['startsWith']('0x')))];if(c['length']===0x0)return{'byAddress':b};const d=await GetLocalNamesByAddresses(c);for(const e of d??[]){const f=e?.['account']||e?.['local_mark'];if(f)b['set'](String(e['address'])['toLowerCase'](),f);}}catch{}return{'byAddress':b};}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=bcs['Address']['serialize'](b)['toBytes'](),g=deriveDynamicFieldID(a,'address',f),h=await query_objects({'objects':[g],'no_cache':e,'network':c}),i=h?.['objects']?.[0x0],j=i?.['data']??i,k=[],l=new Map(),m=Array['isArray'](j?.['items'])?j['items']:[];for(const n of m){const o=String(n?.['who']??'')['toLowerCase'](),p=Number(n?.['time']??0x0);o&&(k['push']({'who':o,'time':p}),l['set'](o,p));}return{'items':k,'byWho':l};}catch{return undefined;}}export async function fetchObjectLinkerCore(a,b,c){return fetchObjectLinker(OBJECT_LINKER_CORE_OBJECT_ID,a,b,c);}export async function fetchObjectLinkerTx(a,b,c){return fetchObjectLinker(OBJECT_LINKER_TX_OBJECT_ID,a,b,c);}export async function fetchPermissionContext(a,b,c){try{const e=await query_objects({'objects':[a],'no_cache':c,'network':b}),f=e?.['objects']?.[0x0],g=f?.['data']??f,h=new Set((g?.['admin']??[])['map'](k=>String(k)['toLowerCase']())),i=new Map(),j=await fetchAllFieldObjectIds(a,b,c);if(j['length']>0x0){const k=await batchQueryObjectsByIds(j,b,c);for(const l of k??[]){const m=l?.['data']??l,n=m?.['address'],p=m?.['perm'];n!=null&&Array['isArray'](p)&&i['set'](String(n)['toLowerCase'](),new Set(p['map'](q=>Number(q))));}}return{'admin':h,'table':i};}catch{return undefined;}}export async function fetchOrderContext(a,b,c){try{const e=await query_objects({'objects':[a],'no_cache':c,'network':b}),f=e?.['objects']?.[0x0];if((f?.['type']??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;}}export async function listLocalAccounts(){try{const a=await query_account_list({'suspended':![]});return(a??[])['filter'](b=>b?.['address'])['map'](b=>({'address':String(b['address']),'name':b['name']??undefined}));}catch{return[];}}export function accountCanExecuteForward(a,b,c,d,e){const g=b['toLowerCase']();if(a['namedOperator']!==undefined&&a['namedOperator']!==null){if(a['namedOperator']===''){if(d&&(g===d['builder']['toLowerCase']()||d['agent']['has'](g)))return!![];}else{if(a['namedOperator']['length']>0x0){const h=a['namedOperator'],i=c['find'](j=>String(j?.['name']??'')===h);if(i?.['operators']?.['some'](j=>String(j)['toLowerCase']()===g))return!![];}}}if(a['permissionIndex']!==undefined&&a['permissionIndex']!==null&&e){if(e['admin']['has'](g))return!![];const j=e['table']['get'](g);if(j?.['has'](a['permissionIndex']))return!![];}return![];}
@@ -0,0 +1,78 @@
1
+ import { SQLiteStorage } from "@wowok/wowok/w/local";
2
+ export declare const MONITOR_EVENT_MODULES: readonly ["order", "arb", "demand", "progress", "treasury", "reward"];
3
+ export type MonitorEventModule = (typeof MONITOR_EVENT_MODULES)[number];
4
+ export interface MonitorEventRecord {
5
+ module: MonitorEventModule;
6
+ type: string;
7
+ time: number;
8
+ event: unknown;
9
+ }
10
+ export interface MonitorEventWithSeen extends MonitorEventRecord {
11
+ id: string;
12
+ seen: boolean;
13
+ }
14
+ interface CursorRow {
15
+ cursors: Record<string, {
16
+ eventSeq: string;
17
+ txDigest: string;
18
+ }>;
19
+ lastPollAt: number;
20
+ }
21
+ export interface LegacyMonitorState {
22
+ cursors?: Record<string, {
23
+ eventSeq: string;
24
+ txDigest: string;
25
+ }>;
26
+ modules?: Record<string, any[]>;
27
+ seenIds?: string[];
28
+ lastPollAt?: number;
29
+ }
30
+ export declare function monitorEventId(id: {
31
+ eventSeq?: string | number;
32
+ txDigest?: string;
33
+ } | null | undefined): string;
34
+ export declare class MonitorEventStore {
35
+ private storage;
36
+ private locks;
37
+ constructor(storage?: SQLiteStorage);
38
+ private withLock;
39
+ private evKey;
40
+ private idxKey;
41
+ private unreadKey;
42
+ private cursorKey;
43
+ private metaKey;
44
+ private getJson;
45
+ private putJson;
46
+ ensureMigrated(network: string, legacy?: LegacyMonitorState | null, legacyCursors?: Record<string, {
47
+ eventSeq: string;
48
+ txDigest: string;
49
+ }>, legacyLastPollAt?: number): Promise<void>;
50
+ insert(network: string, module: MonitorEventModule, events: any[]): Promise<number>;
51
+ private unreadSets;
52
+ private pool;
53
+ list(network: string, opts?: {
54
+ module?: MonitorEventModule;
55
+ offset?: number;
56
+ limit?: number;
57
+ }): Promise<{
58
+ events: MonitorEventWithSeen[];
59
+ total: number;
60
+ moduleCounts: Record<string, number>;
61
+ unreadByModule: Record<string, number>;
62
+ totalUnread: number;
63
+ }>;
64
+ unreadCount(network: string, module?: MonitorEventModule): Promise<number>;
65
+ markRead(network: string, ids: string[]): Promise<{
66
+ marked: number;
67
+ }>;
68
+ markAllRead(network: string, module?: MonitorEventModule): Promise<{
69
+ marked: number;
70
+ }>;
71
+ getCursors(network: string): Promise<CursorRow>;
72
+ saveCursors(network: string, cursors: Record<string, {
73
+ eventSeq: string;
74
+ txDigest: string;
75
+ }>, lastPollAt: number): Promise<void>;
76
+ }
77
+ export declare const monitorEventStore: MonitorEventStore;
78
+ export {};
@@ -0,0 +1 @@
1
+ import{SQLiteStorage}from'@wowok/wowok/w/local';export const MONITOR_EVENT_MODULES=['order','arb','demand','progress','treasury','reward'];const KEY_PREFIX='mon_ev:v3:',IDX_PREFIX='mon_idx:v3:',UNREAD_PREFIX='mon_unread:v3:',CURSOR_PREFIX='mon_cur:v3:',META_PREFIX='mon_meta:v3:';function netKey(a){return(a||'default')['replace'](/[^a-zA-Z0-9_-]/g,'_');}export function monitorEventId(a){if(!a||!a['txDigest']||a['eventSeq']===undefined||a['eventSeq']===null)return'';return a['eventSeq']+':'+a['txDigest'];}export class MonitorEventStore{['storage'];['locks']=new Map();constructor(a){this['storage']=a??new SQLiteStorage();}['withLock'](a,b){const c=netKey(a),d=this['locks']['get'](c)??Promise['resolve'](),e=d['then'](b,b);return this['locks']['set'](c,e['catch'](()=>undefined)),e;}['evKey'](a,b){return''+KEY_PREFIX+netKey(a)+':'+b;}['idxKey'](a,b){return''+IDX_PREFIX+netKey(a)+':'+b;}['unreadKey'](a,b){return''+UNREAD_PREFIX+netKey(a)+':'+b;}['cursorKey'](a){return''+CURSOR_PREFIX+netKey(a);}['metaKey'](a){return''+META_PREFIX+netKey(a);}async['getJson'](a){const b=await this['storage']['get'](a);if(!b)return undefined;try{return JSON['parse'](b);}catch{return undefined;}}async['putJson'](a,b){await this['storage']['put'](a,JSON['stringify'](b));}async['ensureMigrated'](a,b,c,d){await this['withLock'](a,async()=>{const e=await this['getJson'](this['metaKey'](a));if(e?.['migrated'])return;if(b?.['modules']&&typeof b['modules']==='object'){const f=new Set(Array['isArray'](b['seenIds'])?b['seenIds']:[]);for(const g of Object['keys'](b['modules'])){if(!MONITOR_EVENT_MODULES['includes'](g))continue;const h=Array['isArray'](b['modules'][g])?b['modules'][g]:[],j=[],k=[],l=[];for(const m of h){const n=monitorEventId(m?.['id']);if(!n)continue;const o=Number(m?.['time']??0x0)||0x0;l['push']({'key':this['evKey'](a,n),'value':JSON['stringify']({'module':g,'type':m?.['type']??'','time':o,'event':m})}),j['push']({'id':n,'t':o});if(!f['has'](n))k['push'](n);}j['sort']((q,r)=>r['t']-q['t']),await this['storage']['putMany'](l),await this['putJson'](this['idxKey'](a,g),{'entries':j}),await this['putJson'](this['unreadKey'](a,g),{'ids':k});}}c&&Object['keys'](c)['length']>0x0&&await this['putJson'](this['cursorKey'](a),{'cursors':c,'lastPollAt':d??0x0}),await this['putJson'](this['metaKey'](a),{'migrated':!![]});});}async['insert'](a,b,c){const d=c['filter'](e=>monitorEventId(e?.['id'])!=='');if(d['length']===0x0)return 0x0;return this['withLock'](a,async()=>{const e=d['map'](n=>monitorEventId(n['id'])),f=await this['storage']['getMany'](e['map'](n=>this['evKey'](a,n))),g=[];d['forEach']((n,o)=>{if(f[o]===undefined||f[o]===null)g['push']({'id':e[o],'ev':n});});if(g['length']===0x0)return 0x0;await this['storage']['putMany'](g['map'](({id:n,ev:o})=>({'key':this['evKey'](a,n),'value':JSON['stringify']({'module':b,'type':o?.['type']??'','time':Number(o?.['time']??0x0)||0x0,'event':o})})));const h=await this['getJson'](this['idxKey'](a,b))??{'entries':[]},j=new Set(h['entries']['map'](n=>n['id'])),k=[];for(const {id:n,ev:o}of g){if(j['has'](n))continue;j['add'](n),k['push']({'id':n,'t':Number(o?.['time']??0x0)||0x0});}k['sort']((q,r)=>r['t']-q['t']),h['entries']=[...k,...h['entries']],await this['putJson'](this['idxKey'](a,b),h);const l=await this['getJson'](this['unreadKey'](a,b))??{'ids':[]},m=new Set(l['ids']);for(const {id:q}of g)m['add'](q);return await this['putJson'](this['unreadKey'](a,b),{'ids':[...m]}),g['length'];});}async['unreadSets'](a){const b=new Map();for(const c of MONITOR_EVENT_MODULES){const d=await this['getJson'](this['unreadKey'](a,c));b['set'](c,new Set(d?.['ids']??[]));}return b;}async['pool'](a,b){if(b){const f=await this['getJson'](this['idxKey'](a,b));return f?.['entries']??[];}const c=[];for(const g of MONITOR_EVENT_MODULES){const h=await this['getJson'](this['idxKey'](a,g));if(h?.['entries']?.['length'])c['push'](h['entries']);}const d=[],e=c['map'](j=>({'p':j,'i':0x0}));for(;;){let j=-0x1;for(let l=0x0;l<e['length'];l++){const {p:n,i:o}=e[l];if(o<n['length']&&(j<0x0||n[o]['t']>e[j]['p'][e[j]['i']]['t']))j=l;}if(j<0x0)break;d['push'](e[j]['p'][e[j]['i']]),e[j]['i']++;}return d;}async['list'](a,b={}){const c=netKey(a),d=await this['pool'](a,b['module']),e={};for(const r of MONITOR_EVENT_MODULES){const s=await this['getJson'](this['idxKey'](a,r));e[r]=s?.['entries']?.['length']??0x0;}const f=await this['unreadSets'](a),g={};let h=0x0;for(const t of MONITOR_EVENT_MODULES){const u=f['get'](t)?.['size']??0x0;g[t]=u,h+=u;}const j=Math['max'](0x0,Number(b['offset'])||0x0),k=Math['max'](0x1,Number(b['limit'])||0x32),l=d['slice'](j,j+k),o=await this['storage']['getMany'](l['map'](v=>this['evKey'](a,v['id']))),q=[];return l['forEach']((v,w)=>{let x;try{x=o[w]?JSON['parse'](o[w]):undefined;}catch{x=undefined;}if(!x||!MONITOR_EVENT_MODULES['includes'](x['module']))return;q['push']({'id':v['id'],'module':x['module'],'type':x['type']??'','time':x['time']??v['t'],'event':x['event']??null,'seen':!(f['get'](x['module'])?.['has'](v['id'])??![])});}),{'events':q,'total':d['length'],'moduleCounts':e,'unreadByModule':g,'totalUnread':h};}async['unreadCount'](a,b){const c=await this['unreadSets'](a);if(b)return c['get'](b)?.['size']??0x0;let d=0x0;for(const e of MONITOR_EVENT_MODULES)d+=c['get'](e)?.['size']??0x0;return d;}async['markRead'](a,b){const c=(b??[])['filter'](d=>typeof d==='string'&&d['length']>0x0);if(c['length']===0x0)return{'marked':0x0};return this['withLock'](a,async()=>{const d=await this['storage']['getMany'](c['map'](g=>this['evKey'](a,g))),e=new Map();let f=0x0;c['forEach']((g,h)=>{if(!d[h])return;let j;try{j=JSON['parse'](d[h]);}catch{return;}if(!j?.['module']||!MONITOR_EVENT_MODULES['includes'](j['module']))return;if(!e['has'](j['module']))e['set'](j['module'],new Set());e['get'](j['module'])['add'](g);});for(const [g,h]of e){const j=await this['getJson'](this['unreadKey'](a,g))??{'ids':[]},k=j['ids']['length'],l=j['ids']['filter'](m=>!h['has'](m));f+=k-l['length'],l['length']!==k&&await this['putJson'](this['unreadKey'](a,g),{'ids':l});}return{'marked':f};});}async['markAllRead'](a,b){return this['withLock'](a,async()=>{const c=b?[b]:[...MONITOR_EVENT_MODULES];let d=0x0;for(const e of c){const f=await this['getJson'](this['unreadKey'](a,e))??{'ids':[]};d+=f['ids']['length'],f['ids']['length']>0x0&&await this['putJson'](this['unreadKey'](a,e),{'ids':[]});}return{'marked':d};});}async['getCursors'](a){const b=await this['getJson'](this['cursorKey'](a));return b??{'cursors':{},'lastPollAt':0x0};}async['saveCursors'](a,b,c){await this['putJson'](this['cursorKey'](a),{'cursors':b,'lastPollAt':c});}}export const monitorEventStore=new MonitorEventStore();
@@ -31,7 +31,6 @@ export interface OrderRadarInput {
31
31
  machine_nodes?: RadarMachineNode[];
32
32
  permission?: PermissionObjectData | null;
33
33
  named_accounts?: Record<string, string | string[]>;
34
- service_builder?: string;
35
34
  demand_presenters?: string[];
36
35
  node_annotations?: NodeAnnotations;
37
36
  claimable_rewards?: Array<{
@@ -1 +1 @@
1
- import{deriveCommercialRole}from'../role/derivation.js';const DEFAULT_ANNOTATIONS={'completed':['complete','completed','done','finish','finished','delivered','accepted'],'refunded':['refund','refunded','cancelled','canceled','lost','closed']};export function analyzeOrderParticipation(a){const b={'completed':a['node_annotations']?.['completed']??DEFAULT_ANNOTATIONS['completed'],'refunded':a['node_annotations']?.['refunded']??DEFAULT_ANNOTATIONS['refunded']},c=a['current_node']??'',d=!!a['order_holder']&&a['order_holder']===a['account'],e=new Set();if(a['permission']?.['entityPermissions'])for(const [t,u]of a['permission']['entityPermissions']){if(t===a['account']){for(const v of u)e['add'](v);}}const f=[];if(a['named_accounts'])for(const [w,x]of Object['entries'](a['named_accounts'])){if(nameResolvesTo(x,a['account']))f['push'](w);}const g=deriveCommercialRole({'account':a['account'],'order_holder':a['order_holder'],'held_permission_indexes':Array['from'](e),'named_operator_names':f,'service_builder':a['service_builder'],'demand_presenters':a['demand_presenters'],'has_active_order':!![]}),h=g['role'],i=g['collaborator_kind'],j=[],k=[],l=!a['machine_nodes'];let m;if(a['machine_nodes'])for(const y of a['machine_nodes']){for(const z of y['pairs']??[]){if(z['prev_node']!==c)continue;m=z['threshold'];for(const A of z['forwards']??[]){const B=resolveForward(A,y['name'],a,d,e,b);if(B['execution_path']==='not_available'){const C=A['permissionIndex']!=null?'permission\x20index\x20'+A['permissionIndex']:A['namedOperator']===''?'OrderHolder\x20(customer)':'named\x20operator\x20\x27'+A['namedOperator']+'\x27',D=k['find'](E=>E['role']===C);if(D)D['forwards']['push'](B['name']);else k['push']({'role':C,'forwards':[B['name']]});}else j['push'](B);}}}const n=[];d&&n['push']({'label':'OrderHolder\x20(customer)','can_act_now':j['some'](E=>E['execution_path']==='order_holder')});for(const E of[...e]['sort']((F,G)=>F-G)){n['push']({'label':'permission\x20index\x20'+E,'can_act_now':j['some'](F=>F['permission_index']===E)});}if(a['named_accounts'])for(const [F,G]of Object['entries'](a['named_accounts'])){nameResolvesTo(G,a['account'])&&n['push']({'label':'named\x20operator\x20\x27'+F+'\x27','can_act_now':j['some'](H=>H['named_operator']===F)});}let o;j['length']>0x1&&(o={'message':j['length']+'\x20operations\x20are\x20available\x20to\x20you\x20at\x20node\x20\x27'+(c||'(entry)')+'\x27.\x20'+'Each\x20leads\x20to\x20a\x20different\x20outcome\x20—\x20review\x20the\x20consequences\x20and\x20choose;\x20no\x20one\x20else\x20can\x20make\x20this\x20decision\x20for\x20you.','options':j['map'](H=>({'forward':H['name'],'to_node':H['to_node'],'consequence':H['consequence']}))});const p=[];for(const H of a['claimable_rewards']??[]){if(H['already_claimed'])continue;p['push']({'kind':'reward','label':H['description']??'Reward\x20'+H['address'],'how':'onchain_operations\x20reward\x20op=\x27claim\x27\x20(object=\x27'+H['address']+'\x27)'});}a['pending_compensation']&&p['push']({'kind':'compensation','label':a['pending_compensation']['note']??'Arbitration\x20indemnity\x20awarded\x20to\x20you','how':'onchain_operations\x20service\x20op=\x27compensation_claim\x27\x20(arbitration=\x27'+a['pending_compensation']['arbitration']+'\x27)\x20—\x20paid\x20directly\x20from\x20the\x20Service\x20compensation_fund'});a['discount_available']&&p['push']({'kind':'discount','label':a['discount_available'],'how':'Mention\x20the\x20discount\x20when\x20placing\x20the\x20next\x20order\x20(reward\x20discount\x20config\x20applies\x20at\x20purchase)'});a['rating_pending']&&p['push']({'kind':'rating','label':'Rate\x20this\x20transaction\x20(like/dislike)\x20—\x20builds\x20on-chain\x20reputation\x20for\x20both\x20sides','how':'onchain_operations\x20operation_type=\x27personal\x27,\x20data.mark={op:\x27like\x27|\x27dislike\x27,\x20address:\x27<merchant\x20address>\x27}\x20—\x20votes\x20through\x20registrar::like/dislike\x20into\x20the\x20PUBLIC\x20aggregate\x20count'});const q=buildInterestHints(a,h,j,k,c),s=buildSummary(a,h,n,j,k,p,l,c);return{'account':a['account'],'progress':a['progress_address'],'order':a['order_address'],'current_node':c,'perspective':h,'collaborator_kind':i,'roles':n,'operable':j,'branch_choice':o,'waiting_on':k,'pending_claims':p,'interest_hints':q,'workflow_unknown':l,'threshold':m,'summary':s};}export function aggregateRadar(a,b){const c=a['filter'](g=>g['operable']['length']>0x0||g['pending_claims']['length']>0x0)['sort']((g,h)=>(g['perspective']==='customer'?0x0:0x1)-(h['perspective']==='customer'?0x0:0x1)),d=a['filter'](g=>g['operable']['length']===0x0&&g['pending_claims']['length']===0x0),e=a['flatMap'](g=>g['pending_claims']['map'](h=>({...h,'progress':g['progress']}))),f=a['length']===0x0?'No\x20in-flight\x20orders\x20found\x20for\x20this\x20account.':a['length']+'\x20in-flight\x20order(s):\x20'+c['length']+'\x20need\x20your\x20action\x20or\x20have\x20claims,\x20'+d['length']+'\x20are\x20waiting\x20on\x20other\x20roles.\x20'+(e['length']>0x0?e['length']+'\x20unclaimed\x20benefit(s)\x20detected.\x20':'')+(c['length']>0x0?'Top\x20priority:\x20'+c[0x0]['summary']:'Nothing\x20requires\x20your\x20action\x20right\x20now.');return{'account':a[0x0]?.['account']??'','orders_analyzed':a['length'],'actionable':c,'waiting':d,'all_pending_claims':e,'unread_messages_total':b??0x0,'summary':f};}function nameResolvesTo(a,b){if(!a)return![];return Array['isArray'](a)?a['includes'](b):a===b;}export function isConsequenceNode(a,b,c){const d=c?.[b]??DEFAULT_ANNOTATIONS[b],e=(a??'')['toLowerCase']();return d['some'](f=>e['includes'](f));}function resolveForward(a,b,c,d,e,f){let g='not_available';if(a['permissionIndex']!=null){if(e['has'](a['permissionIndex']))g='permission';}else{if(a['namedOperator']===''){if(d)g='order_holder';}else{if(a['namedOperator']!=null){const k=c['named_accounts']?.[a['namedOperator']];if(nameResolvesTo(k,c['account']))g='named_operator';}}}const h=b,i=describeForward(a['name']??'',h,g,a['permissionIndex'],a['namedOperator']),j=consequenceOf(h,f);return{'name':a['name']??'(unnamed)','to_node':h,'execution_path':g,'permission_index':a['permissionIndex']??undefined,'named_operator':a['namedOperator']??undefined,'guard':a['guard']??undefined,'semantics':i,'consequence':j,'weight':a['weight']??undefined};}function describeForward(a,b,c,d,e){const f=d!=null?'requires\x20permission\x20index\x20'+d:e===''?'executable\x20by\x20the\x20order\x20holder\x20(customer)':'executable\x20by\x20named\x20operator\x20\x27'+e+'\x27',g=c==='not_available'?'You\x20CANNOT\x20execute\x20this':'You\x20CAN\x20execute\x20this';return'\x27'+a+'\x27\x20advances\x20the\x20order\x20to\x20node\x20\x27'+b+'\x27\x20('+f+').\x20'+g+'.';}function consequenceOf(a,b){if(isConsequenceNode(a,'completed',b))return'Completion\x20path\x20—\x20funds\x20are\x20released\x20to\x20the\x20merchant\x20per\x20the\x20Allocation\x20waterfall;\x20refunds\x20become\x20harder\x20after\x20this\x20point.';if(isConsequenceNode(a,'refunded',b))return'Refund/cancellation\x20path\x20—\x20escrowed\x20funds\x20return\x20to\x20the\x20buyer\x20per\x20the\x20Allocation\x20configuration.';return undefined;}function buildInterestHints(a,b,c,d,e){const f=[],g=a['now']??Date['now'](),h=a['last_progress_at']!=null?(g-a['last_progress_at'])/0x36ee80:undefined;if(b==='customer')c['length']>0x0&&f['push']('Your\x20confirmation\x20is\x20the\x20fund-release\x20trigger:\x20escrowed\x20money\x20stays\x20locked\x20until\x20YOU\x20act\x20—\x20only\x20confirm\x20when\x20the\x20deliverable\x20matches\x20the\x20agreement.'),d['some'](i=>i['role']!=='OrderHolder\x20(customer)')&&f['push']('Delivery\x20depends\x20on\x20the\x20merchant-side\x20roles\x20listed\x20in\x20waiting_on;\x20if\x20they\x20stall,\x20Messenger\x20first,\x20then\x20consider\x20dispute\x20via\x20the\x20bound\x20Arbitration.'),h!=null&&h>0x18&&f['push']('Order\x20has\x20not\x20advanced\x20for\x20'+Math['round'](h)+'h.\x20Your\x20leverage:\x20compensation_fund\x20(if\x20any)\x20+\x20arbitration\x20+\x20on-chain\x20reputation\x20(dislike)\x20—\x20in\x20that\x20order.');else{if(b==='supplier')c['length']>0x0&&f['push']('Advancing\x20your\x20sub-order\x20NOW\x20unlocks\x20YOUR\x20settlement\x20—\x20upload\x20delivery\x20evidence\x20first\x20to\x20protect\x20your\x20payment\x20claim\x20against\x20the\x20upstream\x20merchant.'),d['some'](i=>i['role']!=='OrderHolder\x20(customer)')&&f['push']('Your\x20settlement\x20depends\x20on\x20upstream\x20roles\x20in\x20waiting_on;\x20if\x20they\x20stall,\x20a\x20Messenger\x20nudge\x20first,\x20then\x20arbitration\x20via\x20the\x20bound\x20Arbitration.'),h!=null&&h>0x30&&f['push']('Sub-order\x20stalled\x20'+Math['round'](h)+'h:\x20your\x20claim\x20erodes\x20with\x20time\x20—\x20evidence\x20+\x20a\x20Messenger\x20nudge\x20are\x20your\x20cheapest\x20protections.');else{if(b==='collaborator'||b==='merchant'){const i=d['filter'](j=>j['role']['startsWith']('permission\x20index'));c['length']>0x0&&f['push']('Advancing\x20the\x20workflow\x20NOW\x20improves\x20flow\x20efficiency\x20and\x20shortens\x20your\x20fund-settlement\x20cycle;\x20stalled\x20orders\x20degrade\x20your\x20on-chain\x20reputation\x20metrics\x20(dispute\x20rate,\x20stall\x20statistics).'),i['length']>0x0&&f['push']('Nodes\x20waiting\x20on\x20YOUR\x20permission\x20indexes\x20are\x20your\x20responsibility\x20surface:\x20prolonged\x20inaction\x20may\x20trigger\x20timeout\x20penalties\x20or\x20disputes\x20recorded\x20permanently\x20on-chain.'),e&&c['length']===0x0&&f['push']('Nothing\x20for\x20you\x20to\x20execute\x20at\x20this\x20node\x20—\x20monitor\x20only;\x20avoid\x20unnecessary\x20interference\x20that\x20creates\x20semantic\x20responsibility.');}else f['push']('You\x20hold\x20no\x20operative\x20role\x20on\x20this\x20order\x20(prospect).\x20On-chain\x20data\x20remains\x20transparent\x20to\x20you\x20for\x20auditing.');}}return(a['unread_messages']??0x0)>0x0&&f['push'](a['unread_messages']+'\x20unread\x20Messenger\x20message(s)\x20—\x20negotiation\x20evidence\x20(WTS)\x20forms\x20the\x20arbitration\x20record;\x20timely\x20replies\x20protect\x20your\x20position.'),f;}function buildSummary(a,b,c,d,e,f,g,h){const i=c['length']>0x0?c['map'](m=>m['label'])['join'](',\x20'):'no\x20operative\x20role',j=h===''?'(entry,\x20not\x20started)':'\x27'+h+'\x27';if(g)return'Order\x20'+a['progress_address']+'\x20is\x20at\x20'+j+';\x20you\x20are\x20'+b+'\x20('+i+').\x20Machine\x20workflow\x20data\x20unavailable\x20—\x20fetch\x20the\x20bound\x20Machine\x20to\x20see\x20executable\x20operations.';const k=d['length']>0x0?'you\x20can\x20execute:\x20'+d['map'](m=>'\x27'+m['name']+'\x27→\x27'+m['to_node']+'\x27')['join'](',\x20'):e['length']>0x0?'waiting\x20on\x20'+e['map'](m=>m['role'])['join'](',\x20'):'no\x20pending\x20operations\x20at\x20this\x20node',l=f['length']>0x0?'\x20'+f['length']+'\x20unclaimed\x20benefit(s).':'';return'Order\x20at\x20'+j+';\x20you\x20are\x20'+b+'\x20('+i+')\x20—\x20'+k+'.'+l;}
1
+ import{deriveCommercialRole,CORE_PERMISSION_INDEX}from'../role/derivation.js';const DEFAULT_ANNOTATIONS={'completed':['complete','completed','done','finish','finished','delivered','accepted'],'refunded':['refund','refunded','cancelled','canceled','lost','closed']};export function analyzeOrderParticipation(a){const b={'completed':a['node_annotations']?.['completed']??DEFAULT_ANNOTATIONS['completed'],'refunded':a['node_annotations']?.['refunded']??DEFAULT_ANNOTATIONS['refunded']},c=a['current_node']??'',d=!!a['order_holder']&&a['order_holder']===a['account'],e=new Set();if(a['permission']?.['entityPermissions'])for(const [t,u]of a['permission']['entityPermissions']){if(t===a['account']){for(const v of u)e['add'](v);}}if(a['permission']){const w=a['permission']['admin']??[],x=a['permission']['owner'];(w['some'](y=>y['toLowerCase']()===a['account']['toLowerCase']())||x&&x['toLowerCase']()===a['account']['toLowerCase']())&&e['add'](CORE_PERMISSION_INDEX['service']);}const f=[];if(a['named_accounts'])for(const [y,z]of Object['entries'](a['named_accounts'])){if(nameResolvesTo(z,a['account']))f['push'](y);}const g=deriveCommercialRole({'account':a['account'],'order_holder':a['order_holder'],'held_permission_indexes':Array['from'](e),'named_operator_names':f,'demand_presenters':a['demand_presenters'],'has_active_order':!![]}),h=g['role'],i=g['collaborator_kind'],j=[],k=[],l=!a['machine_nodes'];let m;if(a['machine_nodes'])for(const A of a['machine_nodes']){for(const B of A['pairs']??[]){if(B['prev_node']!==c)continue;m=B['threshold'];for(const C of B['forwards']??[]){const D=resolveForward(C,A['name'],a,d,e,b);if(D['execution_path']==='not_available'){const E=C['permissionIndex']!=null?'permission\x20index\x20'+C['permissionIndex']:C['namedOperator']===''?'OrderHolder\x20(customer)':'named\x20operator\x20\x27'+C['namedOperator']+'\x27',F=k['find'](G=>G['role']===E);if(F)F['forwards']['push'](D['name']);else k['push']({'role':E,'forwards':[D['name']]});}else j['push'](D);}}}const n=[];d&&n['push']({'label':'OrderHolder\x20(customer)','can_act_now':j['some'](G=>G['execution_path']==='order_holder')});for(const G of[...e]['sort']((H,I)=>H-I)){n['push']({'label':'permission\x20index\x20'+G,'can_act_now':j['some'](H=>H['permission_index']===G)});}if(a['named_accounts'])for(const [H,I]of Object['entries'](a['named_accounts'])){nameResolvesTo(I,a['account'])&&n['push']({'label':'named\x20operator\x20\x27'+H+'\x27','can_act_now':j['some'](J=>J['named_operator']===H)});}let o;j['length']>0x1&&(o={'message':j['length']+'\x20operations\x20are\x20available\x20to\x20you\x20at\x20node\x20\x27'+(c||'(entry)')+'\x27.\x20'+'Each\x20leads\x20to\x20a\x20different\x20outcome\x20—\x20review\x20the\x20consequences\x20and\x20choose;\x20no\x20one\x20else\x20can\x20make\x20this\x20decision\x20for\x20you.','options':j['map'](J=>({'forward':J['name'],'to_node':J['to_node'],'consequence':J['consequence']}))});const p=[];for(const J of a['claimable_rewards']??[]){if(J['already_claimed'])continue;p['push']({'kind':'reward','label':J['description']??'Reward\x20'+J['address'],'how':'onchain_operations\x20reward\x20op=\x27claim\x27\x20(object=\x27'+J['address']+'\x27)'});}a['pending_compensation']&&p['push']({'kind':'compensation','label':a['pending_compensation']['note']??'Arbitration\x20indemnity\x20awarded\x20to\x20you','how':'onchain_operations\x20service\x20op=\x27compensation_claim\x27\x20(arbitration=\x27'+a['pending_compensation']['arbitration']+'\x27)\x20—\x20paid\x20directly\x20from\x20the\x20Service\x20compensation_fund'});a['discount_available']&&p['push']({'kind':'discount','label':a['discount_available'],'how':'Mention\x20the\x20discount\x20when\x20placing\x20the\x20next\x20order\x20(reward\x20discount\x20config\x20applies\x20at\x20purchase)'});a['rating_pending']&&p['push']({'kind':'rating','label':'Rate\x20this\x20transaction\x20(like/dislike)\x20—\x20builds\x20on-chain\x20reputation\x20for\x20both\x20sides','how':'onchain_operations\x20operation_type=\x27personal\x27,\x20data.mark={op:\x27like\x27|\x27dislike\x27,\x20address:\x27<merchant\x20address>\x27}\x20—\x20votes\x20through\x20registrar::like/dislike\x20into\x20the\x20PUBLIC\x20aggregate\x20count'});const q=buildInterestHints(a,h,j,k,c),s=buildSummary(a,h,n,j,k,p,l,c);return{'account':a['account'],'progress':a['progress_address'],'order':a['order_address'],'current_node':c,'perspective':h,'collaborator_kind':i,'roles':n,'operable':j,'branch_choice':o,'waiting_on':k,'pending_claims':p,'interest_hints':q,'workflow_unknown':l,'threshold':m,'summary':s};}export function aggregateRadar(a,b){const c=a['filter'](g=>g['operable']['length']>0x0||g['pending_claims']['length']>0x0)['sort']((g,h)=>(g['perspective']==='customer'?0x0:0x1)-(h['perspective']==='customer'?0x0:0x1)),d=a['filter'](g=>g['operable']['length']===0x0&&g['pending_claims']['length']===0x0),e=a['flatMap'](g=>g['pending_claims']['map'](h=>({...h,'progress':g['progress']}))),f=a['length']===0x0?'No\x20in-flight\x20orders\x20found\x20for\x20this\x20account.':a['length']+'\x20in-flight\x20order(s):\x20'+c['length']+'\x20need\x20your\x20action\x20or\x20have\x20claims,\x20'+d['length']+'\x20are\x20waiting\x20on\x20other\x20roles.\x20'+(e['length']>0x0?e['length']+'\x20unclaimed\x20benefit(s)\x20detected.\x20':'')+(c['length']>0x0?'Top\x20priority:\x20'+c[0x0]['summary']:'Nothing\x20requires\x20your\x20action\x20right\x20now.');return{'account':a[0x0]?.['account']??'','orders_analyzed':a['length'],'actionable':c,'waiting':d,'all_pending_claims':e,'unread_messages_total':b??0x0,'summary':f};}function nameResolvesTo(a,b){if(!a)return![];return Array['isArray'](a)?a['includes'](b):a===b;}export function isConsequenceNode(a,b,c){const d=c?.[b]??DEFAULT_ANNOTATIONS[b],e=(a??'')['toLowerCase']();return d['some'](f=>e['includes'](f));}function resolveForward(a,b,c,d,e,f){let g='not_available';if(a['permissionIndex']!=null){if(e['has'](a['permissionIndex']))g='permission';}else{if(a['namedOperator']===''){if(d)g='order_holder';}else{if(a['namedOperator']!=null){const k=c['named_accounts']?.[a['namedOperator']];if(nameResolvesTo(k,c['account']))g='named_operator';}}}const h=b,i=describeForward(a['name']??'',h,g,a['permissionIndex'],a['namedOperator']),j=consequenceOf(h,f);return{'name':a['name']??'(unnamed)','to_node':h,'execution_path':g,'permission_index':a['permissionIndex']??undefined,'named_operator':a['namedOperator']??undefined,'guard':a['guard']??undefined,'semantics':i,'consequence':j,'weight':a['weight']??undefined};}function describeForward(a,b,c,d,e){const f=d!=null?'requires\x20permission\x20index\x20'+d:e===''?'executable\x20by\x20the\x20order\x20holder\x20(customer)':'executable\x20by\x20named\x20operator\x20\x27'+e+'\x27',g=c==='not_available'?'You\x20CANNOT\x20execute\x20this':'You\x20CAN\x20execute\x20this';return'\x27'+a+'\x27\x20advances\x20the\x20order\x20to\x20node\x20\x27'+b+'\x27\x20('+f+').\x20'+g+'.';}function consequenceOf(a,b){if(isConsequenceNode(a,'completed',b))return'Completion\x20path\x20—\x20funds\x20are\x20released\x20to\x20the\x20merchant\x20per\x20the\x20Allocation\x20waterfall;\x20refunds\x20become\x20harder\x20after\x20this\x20point.';if(isConsequenceNode(a,'refunded',b))return'Refund/cancellation\x20path\x20—\x20escrowed\x20funds\x20return\x20to\x20the\x20buyer\x20per\x20the\x20Allocation\x20configuration.';return undefined;}function buildInterestHints(a,b,c,d,e){const f=[],g=a['now']??Date['now'](),h=a['last_progress_at']!=null?(g-a['last_progress_at'])/0x36ee80:undefined;if(b==='customer')c['length']>0x0&&f['push']('Your\x20confirmation\x20is\x20the\x20fund-release\x20trigger:\x20escrowed\x20money\x20stays\x20locked\x20until\x20YOU\x20act\x20—\x20only\x20confirm\x20when\x20the\x20deliverable\x20matches\x20the\x20agreement.'),d['some'](i=>i['role']!=='OrderHolder\x20(customer)')&&f['push']('Delivery\x20depends\x20on\x20the\x20merchant-side\x20roles\x20listed\x20in\x20waiting_on;\x20if\x20they\x20stall,\x20Messenger\x20first,\x20then\x20consider\x20dispute\x20via\x20the\x20bound\x20Arbitration.'),h!=null&&h>0x18&&f['push']('Order\x20has\x20not\x20advanced\x20for\x20'+Math['round'](h)+'h.\x20Your\x20leverage:\x20compensation_fund\x20(if\x20any)\x20+\x20arbitration\x20+\x20on-chain\x20reputation\x20(dislike)\x20—\x20in\x20that\x20order.');else{if(b==='supplier')c['length']>0x0&&f['push']('Advancing\x20your\x20sub-order\x20NOW\x20unlocks\x20YOUR\x20settlement\x20—\x20upload\x20delivery\x20evidence\x20first\x20to\x20protect\x20your\x20payment\x20claim\x20against\x20the\x20upstream\x20merchant.'),d['some'](i=>i['role']!=='OrderHolder\x20(customer)')&&f['push']('Your\x20settlement\x20depends\x20on\x20upstream\x20roles\x20in\x20waiting_on;\x20if\x20they\x20stall,\x20a\x20Messenger\x20nudge\x20first,\x20then\x20arbitration\x20via\x20the\x20bound\x20Arbitration.'),h!=null&&h>0x30&&f['push']('Sub-order\x20stalled\x20'+Math['round'](h)+'h:\x20your\x20claim\x20erodes\x20with\x20time\x20—\x20evidence\x20+\x20a\x20Messenger\x20nudge\x20are\x20your\x20cheapest\x20protections.');else{if(b==='collaborator'||b==='merchant'){const i=d['filter'](j=>j['role']['startsWith']('permission\x20index'));c['length']>0x0&&f['push']('Advancing\x20the\x20workflow\x20NOW\x20improves\x20flow\x20efficiency\x20and\x20shortens\x20your\x20fund-settlement\x20cycle;\x20stalled\x20orders\x20degrade\x20your\x20on-chain\x20reputation\x20metrics\x20(dispute\x20rate,\x20stall\x20statistics).'),i['length']>0x0&&f['push']('Nodes\x20waiting\x20on\x20YOUR\x20permission\x20indexes\x20are\x20your\x20responsibility\x20surface:\x20prolonged\x20inaction\x20may\x20trigger\x20timeout\x20penalties\x20or\x20disputes\x20recorded\x20permanently\x20on-chain.'),e&&c['length']===0x0&&f['push']('Nothing\x20for\x20you\x20to\x20execute\x20at\x20this\x20node\x20—\x20monitor\x20only;\x20avoid\x20unnecessary\x20interference\x20that\x20creates\x20semantic\x20responsibility.');}else f['push']('You\x20hold\x20no\x20operative\x20role\x20on\x20this\x20order\x20(neutral).\x20On-chain\x20data\x20remains\x20transparent\x20to\x20you\x20for\x20auditing.');}}return(a['unread_messages']??0x0)>0x0&&f['push'](a['unread_messages']+'\x20unread\x20Messenger\x20message(s)\x20—\x20negotiation\x20evidence\x20(WTS)\x20forms\x20the\x20arbitration\x20record;\x20timely\x20replies\x20protect\x20your\x20position.'),f;}function buildSummary(a,b,c,d,e,f,g,h){const i=c['length']>0x0?c['map'](m=>m['label'])['join'](',\x20'):'no\x20operative\x20role',j=h===''?'(entry,\x20not\x20started)':'\x27'+h+'\x27';if(g)return'Order\x20'+a['progress_address']+'\x20is\x20at\x20'+j+';\x20you\x20are\x20'+b+'\x20('+i+').\x20Machine\x20workflow\x20data\x20unavailable\x20—\x20fetch\x20the\x20bound\x20Machine\x20to\x20see\x20executable\x20operations.';const k=d['length']>0x0?'you\x20can\x20execute:\x20'+d['map'](m=>'\x27'+m['name']+'\x27→\x27'+m['to_node']+'\x27')['join'](',\x20'):e['length']>0x0?'waiting\x20on\x20'+e['map'](m=>m['role'])['join'](',\x20'):'no\x20pending\x20operations\x20at\x20this\x20node',l=f['length']>0x0?'\x20'+f['length']+'\x20unclaimed\x20benefit(s).':'';return'Order\x20at\x20'+j+';\x20you\x20are\x20'+b+'\x20('+i+')\x20—\x20'+k+'.'+l;}
@@ -0,0 +1,6 @@
1
+ export type AddressFormat = "short-4-3" | "short-5" | "full";
2
+ export declare const ADDRESS_FORMAT_DEFAULT: AddressFormat;
3
+ export declare const ADDRESS_FORMATS: readonly AddressFormat[];
4
+ export declare const ADDRESS_FORMAT_PREF_KEY = "address_format";
5
+ export declare function isAddressFormat(v: unknown): v is AddressFormat;
6
+ export declare function formatShortAddress(addr: string | null | undefined, format?: AddressFormat): string;
@@ -0,0 +1 @@
1
+ export const ADDRESS_FORMAT_DEFAULT='short-4-3';export const ADDRESS_FORMATS=['short-4-3','short-5','full'];export const ADDRESS_FORMAT_PREF_KEY='address_format';export function isAddressFormat(a){return a==='short-4-3'||a==='short-5'||a==='full';}export function formatShortAddress(a,b=ADDRESS_FORMAT_DEFAULT){if(!a)return'--';if(b==='full')return a;const c=a['startsWith']('0x')?a['slice'](0x2):a;if(b==='short-5')return c['slice'](0x0,0x5)['toUpperCase']();if(c['length']<=0x7)return c['toUpperCase']();return c['slice'](0x0,0x4)['toUpperCase']()+'-'+c['slice'](-0x3)['toUpperCase']();}
@@ -1 +1 @@
1
- const INDUSTRY_KEYWORDS={'freelance':['freelance','upwork'],'rental':['rental','airbnb'],'education':['education','coursera'],'travel':['travel','booking'],'subscription':['subscription','patreon'],'retail':['retail','amazon']},ROLE_KEYWORDS={'merchant':['merchant','seller','provider'],'customer':['customer','buyer'],'prospect':['prospect','considering\x20a\x20purchase','shopping\x20for'],'supplier':['supplier','subcontractor','sub-order'],'collaborator':['collaborator','operator','staff','named\x20operator'],'arbitrator':['arbitrator','arbiter','judge']},RISK_KEYWORDS={'conservative':['conservative'],'aggressive':['aggressive']};export function analyzePersonaContext(a){const b=a['toLowerCase'](),c={'industries':[],'preferences':{},'requirements':[],'rules':[],'suggestions':[],'confidence':0x0};for(const [f,g]of Object['entries'](ROLE_KEYWORDS)){if(g['some'](h=>b['includes'](h))){c['role']=f,c['suggestions']['push']({'field':'role','value':f,'reason':'role\x20keyword\x20matched'});break;}}for(const [h,i]of Object['entries'](INDUSTRY_KEYWORDS)){i['some'](j=>b['includes'](j))&&(c['industries']['push'](h),c['suggestions']['push']({'field':'industries','value':h,'reason':'industry\x20keyword\x20matched'}));}if(RISK_KEYWORDS['conservative']['some'](j=>b['includes'](j)))c['preferences']['risk_appetite']='conservative',c['suggestions']['push']({'field':'preferences.risk_appetite','value':'conservative','reason':'conservative\x20keyword'});else RISK_KEYWORDS['aggressive']['some'](j=>b['includes'](j))&&(c['preferences']['risk_appetite']='aggressive',c['suggestions']['push']({'field':'preferences.risk_appetite','value':'aggressive','reason':'aggressive\x20keyword'}));const d=['must','forbid','never','require'],e=['learned','avoid'];for(const j of a['split'](/[;.\n]/)){const k=j['trim']();if(!k)continue;if(d['some'](l=>k['toLowerCase']()['includes'](l['toLowerCase']())))c['requirements']['push'](k),c['suggestions']['push']({'field':'requirements','value':k,'reason':'red-line\x20keyword'});else e['some'](l=>k['toLowerCase']()['includes'](l['toLowerCase']()))&&(c['rules']['push'](k),c['suggestions']['push']({'field':'rules','value':k,'reason':'experience\x20keyword'}));}return c['confidence']=Math['min'](0x1,c['suggestions']['length']*0.2),c;}
1
+ const INDUSTRY_KEYWORDS={'freelance':['freelance','upwork'],'rental':['rental','airbnb'],'education':['education','coursera'],'travel':['travel','booking'],'subscription':['subscription','patreon'],'retail':['retail','amazon']},ROLE_KEYWORDS={'merchant':['merchant','seller','provider'],'customer':['customer','buyer'],'demander':['demander','demand','requester','looking\x20for'],'prospect':['prospect','considering\x20a\x20purchase','shopping\x20for'],'supplier':['supplier','subcontractor','sub-order'],'collaborator':['collaborator','operator','staff','named\x20operator'],'arbitrator':['arbitrator','arbiter','judge']},RISK_KEYWORDS={'conservative':['conservative'],'aggressive':['aggressive']};export function analyzePersonaContext(a){const b=a['toLowerCase'](),c={'industries':[],'preferences':{},'requirements':[],'rules':[],'suggestions':[],'confidence':0x0};for(const [f,g]of Object['entries'](ROLE_KEYWORDS)){if(g['some'](h=>b['includes'](h))){c['role']=f,c['suggestions']['push']({'field':'role','value':f,'reason':'role\x20keyword\x20matched'});break;}}for(const [h,i]of Object['entries'](INDUSTRY_KEYWORDS)){i['some'](j=>b['includes'](j))&&(c['industries']['push'](h),c['suggestions']['push']({'field':'industries','value':h,'reason':'industry\x20keyword\x20matched'}));}if(RISK_KEYWORDS['conservative']['some'](j=>b['includes'](j)))c['preferences']['risk_appetite']='conservative',c['suggestions']['push']({'field':'preferences.risk_appetite','value':'conservative','reason':'conservative\x20keyword'});else RISK_KEYWORDS['aggressive']['some'](j=>b['includes'](j))&&(c['preferences']['risk_appetite']='aggressive',c['suggestions']['push']({'field':'preferences.risk_appetite','value':'aggressive','reason':'aggressive\x20keyword'}));const d=['must','forbid','never','require'],e=['learned','avoid'];for(const j of a['split'](/[;.\n]/)){const k=j['trim']();if(!k)continue;if(d['some'](l=>k['toLowerCase']()['includes'](l['toLowerCase']())))c['requirements']['push'](k),c['suggestions']['push']({'field':'requirements','value':k,'reason':'red-line\x20keyword'});else e['some'](l=>k['toLowerCase']()['includes'](l['toLowerCase']()))&&(c['rules']['push'](k),c['suggestions']['push']({'field':'rules','value':k,'reason':'experience\x20keyword'}));}return c['confidence']=Math['min'](0x1,c['suggestions']['length']*0.2),c;}
@@ -1,4 +1,5 @@
1
1
  import { type PersonaAnalysis } from "./analyzer.js";
2
+ import { type AddressFormat } from "./address-format.js";
2
3
  import type { EffectivePersona, Industry, Persona, PersonaLayer, PersonaRole, PersonaScope, SystemOverrideValue } from "./types.js";
3
4
  import type { UserProfile } from "../experience/types.js";
4
5
  export { GENERIC_PERSONA, getIndustryDefault, listIndustryDefaults } from "./defaults.js";
@@ -13,8 +14,10 @@ export { resolveOverrides, validateLayerOverrides, getOverrideDefault, SYSTEM_OV
13
14
  export type { SystemOverrideSetting } from "./overrides.js";
14
15
  export * from "./strategy-intent.js";
15
16
  export * from "./local-region.js";
17
+ export * from "./address-format.js";
16
18
  export type { EffectivePersona, Industry, Persona, PersonaIdentity, PersonaLayer, PersonaMutationMode, PersonaRole, PersonaScope, SystemOverrideValue, } from "./types.js";
17
19
  export declare function getEffectivePersona(account?: string, industry?: Industry, role?: PersonaRole): Promise<EffectivePersona>;
20
+ export declare function resolveAddressFormat(account?: string, industry?: Industry, role?: PersonaRole): Promise<AddressFormat>;
18
21
  export declare function resolveEffectiveOverrides(account?: string): Promise<Record<string, SystemOverrideValue>>;
19
22
  export declare function analysisToLayerDelta(analysis: PersonaAnalysis): PersonaLayer;
20
23
  export declare function applyAnalysisToCurrent(scope: PersonaScope, account: string | undefined, analysis: PersonaAnalysis, mode?: "merge" | "replace", role?: PersonaRole, industries?: Industry[]): Promise<Persona>;
@@ -1 +1 @@
1
- import{GENERIC_PERSONA,getIndustryDefault}from'./defaults.js';import{getPersonaStore}from'./store.js';import{emptyPersona,mergeLayers,mutateLayer,resolveEffective,validatePersona}from'./model.js';import{getIndustryPersona}from'./pack-personae.js';import{resolveOverrides}from'./overrides.js';import{profileToCurrentLayer}from'./experience-bridge.js';import{getProfile}from'../experience/index.js';export{GENERIC_PERSONA,getIndustryDefault,listIndustryDefaults}from'./defaults.js';export{SqlitePersonaStore,getPersonaStore,setPersonaStore}from'./store.js';export{countPersonaLines,emptyPersona,mergeLayers,mutateLayer,resolveEffective,validatePersona}from'./model.js';export{personaToContextText,personaToInjection,mergeInjections}from'./bridge.js';export{analyzePersonaContext}from'./analyzer.js';export{profileToCurrentLayer}from'./experience-bridge.js';export{registerIndustryPersonae,getIndustryPersona,listPersonaeIndustries,unregisterIndustryPersonae}from'./pack-personae.js';export{resolveOverrides,validateLayerOverrides,getOverrideDefault,SYSTEM_OVERRIDE_SETTINGS}from'./overrides.js';export*from'./strategy-intent.js';export*from'./local-region.js';export async function getEffectivePersona(a,b,c){const d=getPersonaStore(),e=await d['get']('system'),f=a?await d['get']('account',a):null,g=b?mergeIndustryExternal(c??'customer',b):{...GENERIC_PERSONA,'role':c??'customer'};return resolveEffective(e,f,g);}function mergeIndustryExternal(a,b){const c=getIndustryDefault(a,b),d=getIndustryPersona(b,a);if(!d)return c;return{...c,'long_term':mergeLayers([c['long_term'],d['long_term']]),'current':mergeLayers([c['current'],d['current']])};}export async function resolveEffectiveOverrides(a){const b=getPersonaStore(),c=await b['get']('system'),d=a?await b['get']('account',a):null,e=[];if(c)e['push'](c['long_term'],c['current']);if(d)e['push'](d['long_term'],d['current']);return resolveOverrides(e);}export function analysisToLayerDelta(a){const b={};a['preferences']&&Object['keys'](a['preferences'])['length']&&(b['preferences']=a['preferences']);if(a['requirements']['length'])b['requirements']=a['requirements'];if(a['rules']['length'])b['rules']=a['rules'];return b;}export async function applyAnalysisToCurrent(a,b,c,d='merge',e,f){const g=getPersonaStore(),h=a==='account'&&b?await g['get']('account',b):await g['get']('system'),i=e??c['role']??h?.['role']??'customer',j=f??c['industries'],k=h??emptyPersona(a,b,i,j),l=Array['from'](new Set([...k['industries'],...j??[]])),m=analysisToLayerDelta(c),n=mutateLayer(k['current'],m,d),o={...k,'role':i,'industries':l,'current':n,'updated_at':Date['now']()},p=validatePersona(o);if(p['length']>0x0)throw new Error('persona\x20invalid\x20after\x20apply:\x20'+p['join'](';\x20'));return await g['put'](o),o;}export async function syncExperienceToCurrent(a,b){const c=getPersonaStore(),d=a?'account':'system',e=a?await c['get']('account',a):await c['get']('system'),f=e??emptyPersona(d,a,'customer',[]),g=profileToCurrentLayer(b??getProfile()),h=mutateLayer(f['current'],g,'merge'),i={...f,'current':h,'updated_at':Date['now']()},j=validatePersona(i);if(j['length']>0x0)throw new Error('persona\x20invalid\x20after\x20sync:\x20'+j['join'](';\x20'));return await c['put'](i),{'persona':i,'applied':g,'effective':await getEffectivePersona(a)};}
1
+ import{GENERIC_PERSONA,getIndustryDefault}from'./defaults.js';import{getPersonaStore}from'./store.js';import{emptyPersona,mergeLayers,mutateLayer,resolveEffective,validatePersona}from'./model.js';import{getIndustryPersona}from'./pack-personae.js';import{resolveOverrides}from'./overrides.js';import{profileToCurrentLayer}from'./experience-bridge.js';import{getProfile}from'../experience/index.js';import{ADDRESS_FORMAT_DEFAULT,ADDRESS_FORMAT_PREF_KEY,isAddressFormat}from'./address-format.js';export{GENERIC_PERSONA,getIndustryDefault,listIndustryDefaults}from'./defaults.js';export{SqlitePersonaStore,getPersonaStore,setPersonaStore}from'./store.js';export{countPersonaLines,emptyPersona,mergeLayers,mutateLayer,resolveEffective,validatePersona}from'./model.js';export{personaToContextText,personaToInjection,mergeInjections}from'./bridge.js';export{analyzePersonaContext}from'./analyzer.js';export{profileToCurrentLayer}from'./experience-bridge.js';export{registerIndustryPersonae,getIndustryPersona,listPersonaeIndustries,unregisterIndustryPersonae}from'./pack-personae.js';export{resolveOverrides,validateLayerOverrides,getOverrideDefault,SYSTEM_OVERRIDE_SETTINGS}from'./overrides.js';export*from'./strategy-intent.js';export*from'./local-region.js';export*from'./address-format.js';export async function getEffectivePersona(a,b,c){const d=getPersonaStore(),e=await d['get']('system'),f=a?await d['get']('account',a):null,g=b?mergeIndustryExternal(c??'customer',b):{...GENERIC_PERSONA,'role':c??'customer'};return resolveEffective(e,f,g);}export async function resolveAddressFormat(a,b,c){try{const d=await getEffectivePersona(a,b,c),e=d['layer']['preferences']?.[ADDRESS_FORMAT_PREF_KEY];if(isAddressFormat(e))return e;}catch{}return ADDRESS_FORMAT_DEFAULT;}function mergeIndustryExternal(a,b){const c=getIndustryDefault(a,b),d=getIndustryPersona(b,a);if(!d)return c;return{...c,'long_term':mergeLayers([c['long_term'],d['long_term']]),'current':mergeLayers([c['current'],d['current']])};}export async function resolveEffectiveOverrides(a){const b=getPersonaStore(),c=await b['get']('system'),d=a?await b['get']('account',a):null,e=[];if(c)e['push'](c['long_term'],c['current']);if(d)e['push'](d['long_term'],d['current']);return resolveOverrides(e);}export function analysisToLayerDelta(a){const b={};a['preferences']&&Object['keys'](a['preferences'])['length']&&(b['preferences']=a['preferences']);if(a['requirements']['length'])b['requirements']=a['requirements'];if(a['rules']['length'])b['rules']=a['rules'];return b;}export async function applyAnalysisToCurrent(a,b,c,d='merge',e,f){const g=getPersonaStore(),h=a==='account'&&b?await g['get']('account',b):await g['get']('system'),i=e??c['role']??h?.['role']??'customer',j=f??c['industries'],k=h??emptyPersona(a,b,i,j),l=Array['from'](new Set([...k['industries'],...j??[]])),m=analysisToLayerDelta(c),n=mutateLayer(k['current'],m,d),o={...k,'role':i,'industries':l,'current':n,'updated_at':Date['now']()},p=validatePersona(o);if(p['length']>0x0)throw new Error('persona\x20invalid\x20after\x20apply:\x20'+p['join'](';\x20'));return await g['put'](o),o;}export async function syncExperienceToCurrent(a,b){const c=getPersonaStore(),d=a?'account':'system',e=a?await c['get']('account',a):await c['get']('system'),f=e??emptyPersona(d,a,'customer',[]),g=profileToCurrentLayer(b??getProfile()),h=mutateLayer(f['current'],g,'merge'),i={...f,'current':h,'updated_at':Date['now']()},j=validatePersona(i);if(j['length']>0x0)throw new Error('persona\x20invalid\x20after\x20sync:\x20'+j['join'](';\x20'));return await c['put'](i),{'persona':i,'applied':g,'effective':await getEffectivePersona(a)};}
@@ -1,6 +1,6 @@
1
1
  import { type CommercialRole } from "../role/types.js";
2
2
  export type PersonaScope = "system" | "account";
3
- export type PersonaRole = Exclude<CommercialRole, "system">;
3
+ export type PersonaRole = Exclude<CommercialRole, "system" | "neutral">;
4
4
  export declare const PERSONA_ROLES: readonly PersonaRole[];
5
5
  export type Industry = string;
6
6
  export declare const SUPPORTED_INDUSTRIES: Industry[];
@@ -1 +1 @@
1
- import{COMMERCIAL_ROLES}from'../role/types.js';export const PERSONA_ROLES=COMMERCIAL_ROLES['filter'](a=>a!=='system');export const SUPPORTED_INDUSTRIES=['freelance','rental','education','travel','subscription','retail'];export const PERSONA_VERSION=0x1;export const PERSONA_MAX_LINES=0x12c;
1
+ import{COMMERCIAL_ROLES}from'../role/types.js';export const PERSONA_ROLES=COMMERCIAL_ROLES['filter'](a=>a!=='system'&&a!=='neutral');export const SUPPORTED_INDUSTRIES=['freelance','rental','education','travel','subscription','retail'];export const PERSONA_VERSION=0x1;export const PERSONA_MAX_LINES=0x12c;