@wowok/agent-mcp 3.3.5 → 3.3.7

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/chain-semantics/eval-order.d.ts +17 -0
  2. package/dist/chain-semantics/eval-order.js +1 -0
  3. package/dist/chain-semantics/field-capability.js +1 -1
  4. package/dist/chain-semantics/freeze-map.js +1 -1
  5. package/dist/chain-semantics/fund-flow.js +1 -1
  6. package/dist/chain-semantics/guard-verbs.js +1 -1
  7. package/dist/chain-semantics/index.d.ts +1 -0
  8. package/dist/chain-semantics/index.js +1 -1
  9. package/dist/chain-semantics/object-graph.js +1 -1
  10. package/dist/composition/audit.js +1 -1
  11. package/dist/composition/compile.d.ts +2 -1
  12. package/dist/composition/compile.js +1 -1
  13. package/dist/composition/materialize.js +1 -1
  14. package/dist/data/api/api.spec.d.ts +1 -0
  15. package/dist/data/api/api.spec.js +1 -0
  16. package/dist/data/api/cli.d.ts +1 -0
  17. package/dist/data/api/cli.js +1 -0
  18. package/dist/data/api/head.d.ts +16 -0
  19. package/dist/data/api/head.js +1 -0
  20. package/dist/data/api/head.spec.d.ts +1 -0
  21. package/dist/data/api/head.spec.js +1 -0
  22. package/dist/data/api/index.d.ts +2 -0
  23. package/dist/data/api/index.js +1 -0
  24. package/dist/data/api/match.d.ts +69 -0
  25. package/dist/data/api/match.js +1 -0
  26. package/dist/data/api/match.spec.d.ts +1 -0
  27. package/dist/data/api/match.spec.js +1 -0
  28. package/dist/data/api/server.d.ts +12 -0
  29. package/dist/data/api/server.js +1 -0
  30. package/dist/data/projection/cli.d.ts +1 -0
  31. package/dist/data/projection/cli.js +1 -0
  32. package/dist/data/projection/edges.d.ts +8 -0
  33. package/dist/data/projection/edges.js +1 -0
  34. package/dist/data/projection/edges.spec.d.ts +1 -0
  35. package/dist/data/projection/edges.spec.js +1 -0
  36. package/dist/data/projection/facets.d.ts +18 -0
  37. package/dist/data/projection/facets.js +1 -0
  38. package/dist/data/projection/facets.spec.d.ts +1 -0
  39. package/dist/data/projection/facets.spec.js +1 -0
  40. package/dist/data/projection/facts.d.ts +40 -0
  41. package/dist/data/projection/facts.js +1 -0
  42. package/dist/data/projection/index.d.ts +6 -0
  43. package/dist/data/projection/index.js +1 -0
  44. package/dist/data/projection/project.d.ts +10 -0
  45. package/dist/data/projection/project.js +1 -0
  46. package/dist/data/projection/projection.spec.d.ts +1 -0
  47. package/dist/data/projection/projection.spec.js +1 -0
  48. package/dist/data/projection/schema.d.ts +1 -0
  49. package/dist/data/projection/schema.js +1 -0
  50. package/dist/data/projection/store.d.ts +49 -0
  51. package/dist/data/projection/store.js +1 -0
  52. package/dist/data/projection/types.d.ts +137 -0
  53. package/dist/data/projection/types.js +1 -0
  54. package/dist/data/sync/cdc.d.ts +34 -0
  55. package/dist/data/sync/cdc.js +1 -0
  56. package/dist/data/sync/cdc.spec.d.ts +1 -0
  57. package/dist/data/sync/cdc.spec.js +1 -0
  58. package/dist/data/sync/graphql-source.d.ts +16 -0
  59. package/dist/data/sync/graphql-source.js +1 -0
  60. package/dist/data/sync/index.d.ts +5 -0
  61. package/dist/data/sync/index.js +1 -0
  62. package/dist/data/sync/reconciler.d.ts +14 -0
  63. package/dist/data/sync/reconciler.js +1 -0
  64. package/dist/data/sync/reconciler.spec.d.ts +1 -0
  65. package/dist/data/sync/reconciler.spec.js +1 -0
  66. package/dist/data/sync/schema.d.ts +1 -0
  67. package/dist/data/sync/schema.js +1 -0
  68. package/dist/data/sync/store.d.ts +19 -0
  69. package/dist/data/sync/store.js +1 -0
  70. package/dist/data/sync/sync.spec.d.ts +1 -0
  71. package/dist/data/sync/sync.spec.js +1 -0
  72. package/dist/data/sync/synchronizer.d.ts +10 -0
  73. package/dist/data/sync/synchronizer.js +1 -0
  74. package/dist/data/sync/types.d.ts +162 -0
  75. package/dist/data/sync/types.js +1 -0
  76. package/dist/evaluation/builtins/demand-match.js +1 -1
  77. package/dist/evaluation/builtins/graph-service.spec.js +1 -1
  78. package/dist/evaluation/capability.d.ts +1 -0
  79. package/dist/evaluation/engine.js +1 -1
  80. package/dist/evaluation/extract.d.ts +7 -1
  81. package/dist/evaluation/extract.js +1 -1
  82. package/dist/evaluation/match-policy.d.ts +142 -0
  83. package/dist/evaluation/match-policy.js +1 -0
  84. package/dist/evaluation/match-policy.spec.d.ts +1 -0
  85. package/dist/evaluation/match-policy.spec.js +1 -0
  86. package/dist/experience/realtime-feedback.js +1 -1
  87. package/dist/extensions/business-modules.js +1 -1
  88. package/dist/graph/onchain/expand.js +1 -1
  89. package/dist/graph/onchain/exposure.js +1 -1
  90. package/dist/harness/recover.js +1 -1
  91. package/dist/intent/types.d.ts +1 -1
  92. package/dist/intent/types.js +1 -1
  93. package/dist/keeper/detectors.d.ts +3 -0
  94. package/dist/keeper/detectors.js +1 -1
  95. package/dist/keeper/keeper.spec.js +1 -1
  96. package/dist/knowledge/allocator-rail-verifier.js +1 -1
  97. package/dist/knowledge/arbitration-ledger.js +1 -1
  98. package/dist/knowledge/audit-rules.js +1 -1
  99. package/dist/knowledge/baselines/rules/plan.json +113 -3
  100. package/dist/knowledge/builtin-templates.d.ts +6 -1
  101. package/dist/knowledge/builtin-templates.js +1 -1
  102. package/dist/knowledge/event-semantics.js +1 -1
  103. package/dist/knowledge/getting-started.js +1 -1
  104. package/dist/knowledge/guard-design-patterns.d.ts +1 -1
  105. package/dist/knowledge/guard-design-patterns.js +1 -1
  106. package/dist/knowledge/guard-ledger.js +1 -1
  107. package/dist/knowledge/guard-puzzle.js +1 -1
  108. package/dist/knowledge/guard-render.js +1 -1
  109. package/dist/knowledge/guard-risk.js +1 -1
  110. package/dist/knowledge/guard-templates.d.ts +1 -1
  111. package/dist/knowledge/guard-templates.js +1 -1
  112. package/dist/knowledge/guard-translation.js +1 -1
  113. package/dist/knowledge/index.js +1 -1
  114. package/dist/knowledge/industry-generalizer.d.ts +4 -0
  115. package/dist/knowledge/industry-generalizer.js +1 -1
  116. package/dist/knowledge/industry-registry.js +1 -1
  117. package/dist/knowledge/jsonrpc-enum.d.ts +26 -10
  118. package/dist/knowledge/jsonrpc-enum.js +1 -1
  119. package/dist/knowledge/projection.d.ts +54 -0
  120. package/dist/knowledge/projection.js +1 -0
  121. package/dist/knowledge/projection.spec.d.ts +1 -0
  122. package/dist/knowledge/projection.spec.js +1 -0
  123. package/dist/knowledge/recipient-constraint.d.ts +1 -1
  124. package/dist/knowledge/recipient-constraint.js +1 -1
  125. package/dist/knowledge/semantic-ir.d.ts +113 -0
  126. package/dist/knowledge/semantic-ir.js +1 -0
  127. package/dist/knowledge/service-ledger.d.ts +1 -1
  128. package/dist/knowledge/service-ledger.js +1 -1
  129. package/dist/knowledge/strategy-manuals.js +1 -1
  130. package/dist/knowledge/template-loader.d.ts +34 -0
  131. package/dist/knowledge/template-loader.js +1 -1
  132. package/dist/knowledge/template-prose.d.ts +50 -0
  133. package/dist/knowledge/template-prose.js +1 -0
  134. package/dist/knowledge/template-registry.js +1 -1
  135. package/dist/knowledge/template-scanner.d.ts +1 -1
  136. package/dist/knowledge/template-scanner.js +1 -1
  137. package/dist/knowledge/tools-reference.js +1 -1
  138. package/dist/monitor/MonitorLoop.js +1 -1
  139. package/dist/monitor/normalize.d.ts +1 -1
  140. package/dist/monitor/normalize.js +1 -1
  141. package/dist/monitor/types.js +1 -1
  142. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  143. package/dist/playbooks/service-build/machine-panorama.js +1 -1
  144. package/dist/playbooks/service-build/merchant-guide.d.ts +4 -0
  145. package/dist/playbooks/service-build/merchant-guide.js +1 -1
  146. package/dist/playbooks/service-build/migration-planner.d.ts +2 -1
  147. package/dist/playbooks/service-build/migration-planner.js +1 -1
  148. package/dist/playbooks/service-build/mode-actions.d.ts +7 -0
  149. package/dist/playbooks/service-build/mode-actions.js +1 -1
  150. package/dist/playbooks/service-build/object-panorama.d.ts +22 -1
  151. package/dist/playbooks/service-build/object-panorama.js +1 -1
  152. package/dist/playbooks/service-build/participation-radar.js +1 -1
  153. package/dist/playbooks/service-build/relationship-profile.js +1 -1
  154. package/dist/playbooks/service-build/reverse-mapping-nk4.spec.js +1 -1
  155. package/dist/playbooks/service-build/reverse-mapping.d.ts +1 -0
  156. package/dist/playbooks/service-build/reverse-mapping.js +1 -1
  157. package/dist/playbooks/service-build/service-panorama.js +1 -1
  158. package/dist/playbooks/service-build/service-quote.js +1 -1
  159. package/dist/playbooks/service-build/service-quote.spec.js +1 -1
  160. package/dist/review/index.js +1 -1
  161. package/dist/role/profiles.js +1 -1
  162. package/dist/safety/confirm-gate.js +1 -1
  163. package/dist/schema/benchmark-migration/index.d.ts +64 -10
  164. package/dist/schema/benchmark-migration/index.js +1 -1
  165. package/dist/schema/call/allocation.js +1 -1
  166. package/dist/schema/call/arbitration.js +1 -1
  167. package/dist/schema/call/base.d.ts +8 -0
  168. package/dist/schema/call/bridge.d.ts +2 -0
  169. package/dist/schema/call/error-codes.d.ts +1 -1
  170. package/dist/schema/call/error-codes.js +1 -1
  171. package/dist/schema/call/proof.js +1 -1
  172. package/dist/schema/call/reward.d.ts +10 -0
  173. package/dist/schema/call/reward.js +1 -1
  174. package/dist/schema/call/semantic.js +1 -1
  175. package/dist/schema/call/service.js +1 -1
  176. package/dist/schema/common/index.js +1 -1
  177. package/dist/schema/evaluation/index.d.ts +341 -0
  178. package/dist/schema/evaluation/index.js +1 -1
  179. package/dist/schema/goal/index.d.ts +2 -0
  180. package/dist/schema/goal/planning.d.ts +3 -0
  181. package/dist/schema/goal/planning.js +1 -1
  182. package/dist/schema/industry-pack/index.d.ts +62 -0
  183. package/dist/schema/industry-pack/modes.d.ts +62 -0
  184. package/dist/schema/industry-pack/modes.js +1 -1
  185. package/dist/schema/intent-radar/index.d.ts +3 -0
  186. package/dist/schema/intent-radar/index.js +1 -1
  187. package/dist/schema/local/index.d.ts +20 -0
  188. package/dist/schema/local/index.js +1 -1
  189. package/dist/schema/operations.d.ts +5 -0
  190. package/dist/schema/query/bi.d.ts +4 -0
  191. package/dist/schema/query/bi.js +1 -1
  192. package/dist/schema/query/index.d.ts +145 -47
  193. package/dist/schema/query/index.js +1 -1
  194. package/dist/schema/schema-version.js +1 -1
  195. package/dist/schema-query-impl/index.js +1 -1
  196. package/dist/schemas/account_operation.output.json +2 -0
  197. package/dist/schemas/benchmark_migration_operation.output.json +42 -0
  198. package/dist/schemas/benchmark_migration_operation.schema.json +208 -5
  199. package/dist/schemas/bridge_operation.output.json +2 -0
  200. package/dist/schemas/evaluation_operation.output.json +624 -2
  201. package/dist/schemas/evaluation_operation.schema.json +598 -4
  202. package/dist/schemas/goal_operation.schema.json +18 -10
  203. package/dist/schemas/index.json +1 -1
  204. package/dist/schemas/industry_pack_operation.output.json +86 -2
  205. package/dist/schemas/industry_pack_operation.schema.json +199 -0
  206. package/dist/schemas/intent_radar.output.json +2 -0
  207. package/dist/schemas/intent_radar.schema.json +1 -0
  208. package/dist/schemas/local_cache_operation.output.json +2 -0
  209. package/dist/schemas/local_history_operation.output.json +2 -0
  210. package/dist/schemas/local_info_operation.output.json +2 -0
  211. package/dist/schemas/local_mark_operation.output.json +2 -0
  212. package/dist/schemas/onchain_events.output.json +281 -11
  213. package/dist/schemas/onchain_events.schema.json +5 -1
  214. package/dist/schemas/onchain_operations.output.json +2 -0
  215. package/dist/schemas/onchain_operations.schema.json +914 -314
  216. package/dist/schemas/onchain_operations_allocation.schema.json +1 -1
  217. package/dist/schemas/onchain_operations_arbitration.schema.json +1 -1
  218. package/dist/schemas/onchain_operations_gen_proof.schema.json +1 -1
  219. package/dist/schemas/onchain_operations_guard.schema.json +660 -94
  220. package/dist/schemas/onchain_operations_reward.schema.json +35 -1
  221. package/dist/schemas/onchain_operations_service.schema.json +4 -4
  222. package/dist/schemas/query_toolkit.output.json +333 -0
  223. package/dist/tools/handlers/benchmark-migration.d.ts +5 -2
  224. package/dist/tools/handlers/benchmark-migration.js +1 -1
  225. package/dist/tools/handlers/config.js +1 -1
  226. package/dist/tools/handlers/evaluation.js +1 -1
  227. package/dist/tools/handlers/evaluation.spec.js +1 -1
  228. package/dist/tools/handlers/intent-radar.js +1 -1
  229. package/dist/tools/handlers/messenger.d.ts +1 -0
  230. package/dist/tools/handlers/messenger.js +1 -1
  231. package/dist/tools/handlers/onchain.d.ts +2 -0
  232. package/dist/tools/handlers/onchain.js +1 -1
  233. package/dist/tools/handlers/query.js +1 -1
  234. package/dist/tools/handlers/wip.js +1 -1
  235. package/dist/tools/index.js +1 -1
  236. package/dist/tools/registry/agent.js +1 -1
  237. package/dist/tools/registry/business.js +1 -1
  238. package/dist/tools/registry/query.js +1 -1
  239. package/dist/tools/wip-verify-ledger.d.ts +14 -0
  240. package/dist/tools/wip-verify-ledger.js +1 -0
  241. package/dist/tools/wrap.d.ts +4 -0
  242. package/dist/tools/wrap.js +1 -1
  243. package/package.json +7 -2
@@ -1 +1 @@
1
- import{createAcceptanceRule}from'../acceptance.js';import{requiredCapabilities}from'../capability.js';import{getEvaluationEngine}from'../engine.js';import{extractDemandCapability,extractServiceCapability}from'../extract.js';import{relateRegion}from'../region.js';import{getJudgmentDoc}from'../../config/judgment.js';export const DEMAND_MATCH_EVALUATION='demand_match';function matchParams(){return getJudgmentDoc()['match'];}const dsCaps={'id':'ds_caps','description':'Extract\x20demand\x20+\x20service\x20capability\x20vectors\x20(either\x20may\x20be\x20pre-computed\x20or\x20raw)','evaluation_ids':[DEMAND_MATCH_EVALUATION],'extract':a=>({'demand_cap':a['entities']['demand_cap']??extractDemandCapability(a['entities']['demand']),'service_cap':a['entities']['service_cap']??extractServiceCapability(a['entities']['service'])})},regionRule={'id':'region','description':'Geographic\x20region\x20relation\x20between\x20demand\x20and\x20service','dimension':'region',get 'weight'(){return matchParams()['weights']['region'];},'evaluation_ids':[DEMAND_MATCH_EVALUATION],'evaluate':a=>{const b=matchParams(),c=a['facts']['demand_cap'],e=a['facts']['service_cap'],f=relateRegion(c['region'],e['region']);return{'score':b['region_scores'][f],'weight':b['weights']['region'],'reason':'region\x20'+f};}},industryRule={'id':'industry','description':'Industry\x20scenario\x20match','dimension':'industry',get 'weight'(){return matchParams()['weights']['industry'];},'evaluation_ids':[DEMAND_MATCH_EVALUATION],'evaluate':a=>{const b=matchParams(),c=a['facts']['demand_cap'],e=a['facts']['service_cap'];if(c['industry']==='general'||e['industry']==='general')return{'score':b['neutral_score'],'weight':b['weights']['industry'],'reason':'industry\x20unknown\x20(neutral)'};const f=c['industry']===e['industry']?0x64:0x0;return{'score':f,'weight':b['weights']['industry'],'reason':c['industry']+'\x20vs\x20'+e['industry']};}},priceRule={'id':'price','description':'Service\x20price\x20within\x20demand\x20budget','dimension':'price',get 'weight'(){return matchParams()['weights']['price'];},'evaluation_ids':[DEMAND_MATCH_EVALUATION],'evaluate':a=>{const b=matchParams(),c=a['facts']['demand_cap'],e=a['facts']['service_cap'];if(c['price_max']===undefined||e['price_min']===undefined)return{'score':b['neutral_score'],'weight':b['weights']['price'],'reason':'price\x20unknown\x20(neutral)'};if(e['price_min']<=c['price_max'])return{'score':0x64,'weight':b['weights']['price'],'reason':'within\x20budget'};const f=c['price_max']*BigInt(Math['round'](0x64+b['price_over_budget_tolerance_pct']))/0x64n;if(e['price_min']<=f)return{'score':b['neutral_score'],'weight':b['weights']['price'],'reason':'slightly\x20over\x20budget'};return{'score':0x0,'weight':b['weights']['price'],'reason':'over\x20budget'};}},trustRule={'id':'trust','description':'Service\x20trust\x20score','dimension':'trust',get 'weight'(){return matchParams()['weights']['trust'];},'evaluation_ids':[DEMAND_MATCH_EVALUATION],'evaluate':a=>{const b=matchParams(),c=a['facts']['service_cap'],d=c['trust_score'],e=b['trust_bands']['find'](g=>d>=g['min']),f=e?e['score']:0x0;return{'score':f,'weight':b['weights']['trust'],'reason':'trust\x20'+d};}},capabilitiesRule={'id':'capabilities','description':'Demand\x20capability\x20requirements\x20covered\x20by\x20the\x20service','dimension':'capabilities',get 'weight'(){return matchParams()['weights']['capabilities'];},'evaluation_ids':[DEMAND_MATCH_EVALUATION],'evaluate':a=>{const b=matchParams(),c=a['facts']['demand_cap'],e=a['facts']['service_cap'],f=requiredCapabilities(c['capabilities']);if(f['length']===0x0)return{'score':b['neutral_score'],'weight':b['weights']['capabilities'],'reason':'no\x20capability\x20requirement\x20(neutral)'};const g=f['filter'](h=>e['capabilities'][h]);return{'score':Math['round'](g['length']/f['length']*0x64),'weight':b['weights']['capabilities'],'matched':g,'mismatched':f['filter'](h=>!e['capabilities'][h]),'reason':g['length']+'/'+f['length']+'\x20required\x20capabilities\x20covered'};}},tagsRule={'id':'tags','description':'Keyword/tag\x20overlap','dimension':'tags',get 'weight'(){return matchParams()['weights']['tags'];},'evaluation_ids':[DEMAND_MATCH_EVALUATION],'evaluate':a=>{const b=matchParams(),c=a['facts']['demand_cap'],e=a['facts']['service_cap'],f=new Set((c['keywords']??[])['map'](i=>i['toLowerCase']())),g=new Set([...e['tags']??[],...e['keywords']??[]]['map'](i=>i['toLowerCase']()));if(f['size']===0x0)return{'score':b['neutral_score'],'weight':b['weights']['tags'],'reason':'no\x20keywords\x20(neutral)'};const h=[...f]['filter'](i=>g['has'](i))['length'];return{'score':Math['round'](h/f['size']*0x64),'weight':b['weights']['tags'],'reason':h+'/'+f['size']+'\x20keywords'};}},acceptanceRule=createAcceptanceRule(DEMAND_MATCH_EVALUATION,{'weight':matchParams()['weights']['acceptance'],'weightOf':()=>matchParams()['weights']['acceptance']});export function registerDemandMatchEvaluation(a=getEvaluationEngine()){a['registerDataSource'](dsCaps);for(const b of[regionRule,industryRule,priceRule,trustRule,capabilitiesRule,tagsRule,acceptanceRule]){a['registerRule'](b);}}export async function matchDemandToServices(a,b,c,d,e){const f=d??matchParams()['top_n'],g=getEvaluationEngine(),h=[];for(const i of b){const j=await g['evaluate'](DEMAND_MATCH_EVALUATION,{'demand_cap':a,'service':i,'presenter_history':e??[]},c);h['push']({'service':i,'result':j});}return h['sort']((k,l)=>l['result']['total']-k['result']['total']),h['slice'](0x0,f);}export async function matchServiceToDemands(a,b,c,d,e){const f=d??matchParams()['top_n'],g=getEvaluationEngine(),h=[];for(const i of b){const j=await g['evaluate'](DEMAND_MATCH_EVALUATION,{'service_cap':a,'demand':i,'presenter_history':e??[]},c);h['push']({'demand':i,'result':j});}return h['sort']((k,l)=>l['result']['total']-k['result']['total']),h['slice'](0x0,f);}
1
+ import{createAcceptanceRule}from'../acceptance.js';import{requiredCapabilities}from'../capability.js';import{getEvaluationEngine}from'../engine.js';import{extractDemandCapability,extractServiceCapability}from'../extract.js';import{relateRegion}from'../region.js';import{getJudgmentDoc}from'../../config/judgment.js';export const DEMAND_MATCH_EVALUATION='demand_match';function matchParams(){return getJudgmentDoc()['match'];}const dsCaps={'id':'ds_caps','description':'Extract\x20demand\x20+\x20service\x20capability\x20vectors\x20(either\x20may\x20be\x20pre-computed\x20or\x20raw)','evaluation_ids':[DEMAND_MATCH_EVALUATION],'extract':a=>({'demand_cap':a['entities']['demand_cap']??extractDemandCapability(a['entities']['demand']),'service_cap':a['entities']['service_cap']??extractServiceCapability(a['entities']['service'])})},regionRule={'id':'region','description':'Geographic\x20region\x20relation\x20between\x20demand\x20and\x20service','dimension':'region',get 'weight'(){return matchParams()['weights']['region'];},'evaluation_ids':[DEMAND_MATCH_EVALUATION],'evaluate':a=>{const b=matchParams(),c=a['facts']['demand_cap'],e=a['facts']['service_cap'],f=relateRegion(c['region'],e['region']);return{'score':b['region_scores'][f],'weight':b['weights']['region'],'reason':'region\x20'+f};}},industryRule={'id':'industry','description':'Industry\x20scenario\x20match','dimension':'industry',get 'weight'(){return matchParams()['weights']['industry'];},'evaluation_ids':[DEMAND_MATCH_EVALUATION],'evaluate':a=>{const b=matchParams(),c=a['facts']['demand_cap'],e=a['facts']['service_cap'];if(c['industry']==='general'||e['industry']==='general')return{'score':b['neutral_score'],'weight':b['weights']['industry'],'reason':'industry\x20unknown\x20(neutral)'};const f=c['industry']===e['industry']?0x64:0x0;return{'score':f,'weight':b['weights']['industry'],'reason':c['industry']+'\x20vs\x20'+e['industry']};}},priceRule={'id':'price','description':'Service\x20price\x20within\x20demand\x20budget','dimension':'price',get 'weight'(){return matchParams()['weights']['price'];},'evaluation_ids':[DEMAND_MATCH_EVALUATION],'evaluate':a=>{const b=matchParams(),c=a['facts']['demand_cap'],e=a['facts']['service_cap'];if(c['price_max']===undefined||e['price_min']===undefined)return{'score':b['neutral_score'],'weight':b['weights']['price'],'reason':'price\x20unknown\x20(neutral)'};if(e['price_min']<=c['price_max'])return{'score':0x64,'weight':b['weights']['price'],'reason':'within\x20budget'};const f=c['price_max']*BigInt(Math['round'](0x64+b['price_over_budget_tolerance_pct']))/0x64n;if(e['price_min']<=f)return{'score':b['neutral_score'],'weight':b['weights']['price'],'reason':'slightly\x20over\x20budget'};return{'score':0x0,'weight':b['weights']['price'],'reason':'over\x20budget'};}},trustRule={'id':'trust','description':'Service\x20trust\x20score','dimension':'trust',get 'weight'(){return matchParams()['weights']['trust'];},'evaluation_ids':[DEMAND_MATCH_EVALUATION],'evaluate':a=>{const b=matchParams(),c=a['facts']['service_cap'],d=c['trust_score'],e=b['trust_bands']['find'](h=>d>=h['min']),f=e?e['score']:0x0,g=c['trust_provenance']==='cold_start_prior'?'trust\x20'+d+'\x20(cold-start\x20prior\x20—\x20no\x20verified\x20reputation\x20yet)':'trust\x20'+d;return{'score':f,'weight':b['weights']['trust'],'reason':g};}},capabilitiesRule={'id':'capabilities','description':'Demand\x20capability\x20requirements\x20covered\x20by\x20the\x20service','dimension':'capabilities',get 'weight'(){return matchParams()['weights']['capabilities'];},'evaluation_ids':[DEMAND_MATCH_EVALUATION],'evaluate':a=>{const b=matchParams(),c=a['facts']['demand_cap'],e=a['facts']['service_cap'],f=requiredCapabilities(c['capabilities']);if(f['length']===0x0)return{'score':b['neutral_score'],'weight':b['weights']['capabilities'],'reason':'no\x20capability\x20requirement\x20(neutral)'};const g=f['filter'](h=>e['capabilities'][h]);return{'score':Math['round'](g['length']/f['length']*0x64),'weight':b['weights']['capabilities'],'matched':g,'mismatched':f['filter'](h=>!e['capabilities'][h]),'reason':g['length']+'/'+f['length']+'\x20required\x20capabilities\x20covered'};}},tagsRule={'id':'tags','description':'Keyword/tag\x20overlap','dimension':'tags',get 'weight'(){return matchParams()['weights']['tags'];},'evaluation_ids':[DEMAND_MATCH_EVALUATION],'evaluate':a=>{const b=matchParams(),c=a['facts']['demand_cap'],e=a['facts']['service_cap'],f=new Set((c['keywords']??[])['map'](i=>i['toLowerCase']())),g=new Set([...e['tags']??[],...e['keywords']??[]]['map'](i=>i['toLowerCase']()));if(f['size']===0x0)return{'score':b['neutral_score'],'weight':b['weights']['tags'],'reason':'no\x20keywords\x20(neutral)'};const h=[...f]['filter'](i=>g['has'](i))['length'];return{'score':Math['round'](h/f['size']*0x64),'weight':b['weights']['tags'],'reason':h+'/'+f['size']+'\x20keywords'};}},acceptanceRule=createAcceptanceRule(DEMAND_MATCH_EVALUATION,{'weight':matchParams()['weights']['acceptance'],'weightOf':()=>matchParams()['weights']['acceptance']});export function registerDemandMatchEvaluation(a=getEvaluationEngine()){a['registerDataSource'](dsCaps);for(const b of[regionRule,industryRule,priceRule,trustRule,capabilitiesRule,tagsRule,acceptanceRule]){a['registerRule'](b);}}export async function matchDemandToServices(a,b,c,d,e){const f=d??matchParams()['top_n'],g=getEvaluationEngine(),h=await Promise['all'](b['map'](async i=>({'service':i,'result':await g['evaluate'](DEMAND_MATCH_EVALUATION,{'demand_cap':a,'service':i,'presenter_history':e??[]},c)})));return h['sort']((i,j)=>j['result']['total']-i['result']['total']||i['service']['object']['localeCompare'](j['service']['object'])),h['slice'](0x0,f);}export async function matchServiceToDemands(a,b,c,d,e){const f=d??matchParams()['top_n'],g=getEvaluationEngine(),h=await Promise['all'](b['map'](async i=>({'demand':i,'result':await g['evaluate'](DEMAND_MATCH_EVALUATION,{'service_cap':a,'demand':i,'presenter_history':e??[]},c)})));return h['sort']((i,j)=>j['result']['total']-i['result']['total']||i['demand']['object']['localeCompare'](j['demand']['object'])),h['slice'](0x0,f);}
@@ -1 +1 @@
1
- import{describe,expect,it}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'../../graph/onchain/dataplane.js';import{expandTopology}from'../../graph/onchain/expand.js';import{FULL,GAP,fullServiceState,gapServiceState,truncatedServiceState}from'../../graph/onchain/fixtures.js';import{buildViewport}from'../../graph/onchain/viewport.js';import{runAnalyzers}from'../../graph/onchain/analyze.js';import{EVALUATION_SERVICE_INTENTS,resolveExpansionStrategy,withEvaluationBundle}from'../../graph/onchain/strategy.js';import{projectEvaluationFacts as a37a}from'../../graph/onchain/facts.js';import{evaluateGraphServiceFacts,GRAPH_RULE_INPUT_FACTS,registerGraphServiceEvaluations}from'./graph-service.js';async function evalState(a,b){registerGraphServiceEvaluations();const c=withEvaluationBundle(resolveExpansionStrategy({'intents':[...EVALUATION_SERVICE_INTENTS]})),d=await expandTopology(new FakeDataPlane(a),{'network':ENTRYPOINT['Mainnet'],'seed':b,'edges':c['edges'],'budget':c['budget']}),e=buildViewport(d,b,'neutral'),f=a37a(e,b,runAnalyzers(e));return{'projected':f,'r':await evaluateGraphServiceFacts(f)};}const scoreOf=(a,b,c)=>a[b]['breakdown']['find'](d=>d['rule_id']===c);describe('graph\x20service\x20evaluation\x20—\x20fully\x20hooked\x20shop\x20(TR-14.1)',()=>{it('scores\x20all\x20nine\x20dimensions\x20from\x20material\x20facts\x20with\x20no\x20default-low\x20deductions',async()=>{const {r:a}=await evalState(fullServiceState(),FULL['svc']);expect(a['unverified'])['toEqual']([]),expect(a['completeness'])['toBe'](0x64);const c=scoreOf(a,'trust','trust_arbitration');expect(c['score'])['toBe'](0x64),expect(c['matched'])['toEqual'](expect['arrayContaining'](['arbitrator\x20roster\x20configured','arbitration\x20fee\x20funded','arbitration\x20active'])),expect(c['reason'])['toContain']('Arbitration\x2020/20'),expect(scoreOf(a,'trust','trust_reviews')['score'])['toBe'](0x28),expect(scoreOf(a,'trust','trust_fulfillment')['score'])['toBe'](0x19);const d=scoreOf(a,'trust','trust_fund_safety');expect(d['score'])['toBe'](0x0),expect(d['mismatched'])['toContain']('compensation\x20fund\x20below\x20the\x20statutory\x203x\x20largest-order\x20exposure\x20ceiling'),expect(scoreOf(a,'trust','trust_transparency')['score'])['toBe'](0x64),expect(a['trust']['total'])['toBe'](0x31);const e=scoreOf(a,'risk','risk_fund');expect(e['score'])['toBeLessThan'](0x64),expect(e['mismatched'])['toContain']('Payout\x20exposure:\x20compensation\x20fund\x20cannot\x20cover\x20a\x20maximum-multiple\x20award\x20on\x20the\x20largest\x20windowed\x20order'),expect(e['mismatched']?.['some'](h=>h['startsWith']('R2:')))['toBe'](![]),expect(e['finding_refs']?.['map'](h=>h['id']))['toContain']('R2:'+FULL['svc']['toLowerCase']());const f=scoreOf(a,'risk','risk_trust');expect(f['score'])['toBeLessThan'](0x64),expect(f['mismatched']?.['some'](h=>h['startsWith']('R1:')))['toBe'](![]),expect(f['mismatched']?.['length'])['toBeGreaterThan'](0x0),expect(f['finding_refs']?.['some'](h=>h['id']['startsWith']('R1:')))['toBe'](!![]);for(const h of[...a['trust']['breakdown'],...a['risk']['breakdown']]){for(const i of h['mismatched']??[])expect(i)['not']['toContain']('::node::');}expect(scoreOf(a,'risk','risk_workflow')['score'])['toBe'](0x64),expect(scoreOf(a,'risk','risk_behavior')['score'])['toBe'](0x64);for(const j of[...a['trust']['breakdown'],...a['risk']['breakdown']]){const k=(j['reason']??'')['toLowerCase']();expect(k)['not']['toContain']('no\x20data'),expect(k)['not']['toContain']('default\x20low');}const g=a['trust']['trace']['filter'](l=>l['kind']==='rule'&&l['detail']['startsWith']('score='));expect(g['map'](l=>l['id']))['toEqual'](expect['arrayContaining'](Object['keys'](GRAPH_RULE_INPUT_FACTS)['filter'](l=>l['startsWith']('trust_'))));}),it('keeps\x20the\x20injection\x20+\x20requirement\x20mechanisms\x20working',async()=>{const {projected:a}=await evalState(fullServiceState(),FULL['svc']),b=await evaluateGraphServiceFacts(a,{'overrides':{'rules':{'trust_arbitration':{'weight':0x28}}}});expect(b['trust']['total'])['toBe'](0x3a);const c=await evaluateGraphServiceFacts(a,{'requirements':[{'rule_id':'trust_fund_safety','condition':'require'}]});expect(c['trust']['blocked'])['toBe'](!![]),expect(c['trust']['red_flags']['length'])['toBeGreaterThan'](0x0);});}),describe('graph\x20service\x20evaluation\x20—\x20configured-empty\x20shell\x20(TR-14.1)',()=>{it('scores\x20verified\x20absence\x20as\x20a\x20configured\x20fact\x20and\x20excludes\x20only\x20the\x20gap\x20dimension',async()=>{const {r:a}=await evalState(gapServiceState(),GAP['svc']),b=scoreOf(a,'trust','trust_arbitration');expect(b['score'])['toBe'](0x0),expect(b['reason'])['toContain']('verified\x20absence'),expect(scoreOf(a,'trust','trust_reviews')['score'])['toBe'](0x32),expect(a['unverified'])['toEqual'](['risk_workflow']),expect(scoreOf(a,'risk','risk_workflow'))['toBeUndefined'](),expect(a['risk']['unverified'])['toEqual'](['risk_workflow']),expect(a['trust']['unverified'])['toEqual'](['risk_workflow']);const c=a['risk']['trace']['find'](d=>d['kind']==='rule'&&d['id']==='risk_workflow');expect(c?.['detail'])['toContain']('not\x20applicable'),expect(scoreOf(a,'trust','trust_transparency')['score'])['toBe'](0x28),expect(scoreOf(a,'trust','trust_fund_safety')['score'])['toBe'](0x0);});}),describe('graph\x20service\x20evaluation\x20—\x20truncated\x20order\x20window\x20(TR-14.1)',()=>{it('excludes\x20the\x20unverifiable\x20dimensions\x20and\x20renormalizes\x20the\x20weighted\x20total',async()=>{const {r:a}=await evalState(truncatedServiceState(),FULL['svc']);expect(a['unverified'])['toEqual'](expect['arrayContaining'](['trust_fulfillment','trust_fund_safety','risk_fund','risk_behavior'])),expect(scoreOf(a,'trust','trust_fulfillment'))['toBeUndefined'](),expect(scoreOf(a,'trust','trust_fund_safety'))['toBeUndefined'](),expect(scoreOf(a,'risk','risk_fund'))['toBeUndefined'](),expect(scoreOf(a,'risk','risk_behavior'))['toBeUndefined'](),expect(a['trust']['total'])['toBe'](0x44);for(const b of['trust_fulfillment','trust_fund_safety']){expect(a['trust']['trace']['find'](c=>c['kind']==='rule'&&c['id']===b)?.['detail'])['toContain']('not\x20applicable');}for(const c of['risk_fund','risk_behavior']){expect(a['risk']['trace']['find'](d=>d['kind']==='rule'&&d['id']===c)?.['detail'])['toContain']('not\x20applicable');}});}),describe('graph\x20service\x20evaluation\x20—\x20scoring\x20report\x20(TR-14.2)',()=>{it('renders\x20a\x20per-dimension\x20report\x20with\x20score,\x20weight,\x20state,\x20confidence\x20and\x20evidence',async()=>{const {projected:a,r:c}=await evalState(fullServiceState(),FULL['svc']),d=new Map(a['facts']['map'](g=>[g['key'],g])),e=[];for(const g of['trust','risk']){const h=c[g];e['push'](g['toUpperCase']()+'\x20'+h['total']+'/100\x20('+h['level']+')\x20—\x20'+h['summary']);for(const i of h['breakdown']){const j=GRAPH_RULE_INPUT_FACTS[i['rule_id']]??[],k=j['map'](o=>o+':state='+(d['get'](o)?.['state']??'missing')),l=j['map'](o=>d['get'](o)?.['provenance']['confidence']??'missing'),n=j['map'](o=>d['get'](o)?.['evidence']??'missing')['join']('\x20');e['push'](i['rule_id']+':\x20score='+i['score']+'\x20weight='+i['weight']+'\x20'+k['join'](',')+'\x20confidence='+[...new Set(l)]['join']('+')+'\x20evidence=\x22'+n+'\x22');}}expect(e)['toHaveLength'](0xb);const f=e['filter'](o=>o['includes']('score='));expect(f)['toHaveLength'](0x9);for(const o of f){expect(o)['toMatch'](/weight=\d+/),expect(o)['toContain']('state=present'),expect(o)['toMatch'](/confidence=(exact|bounded|windowed|derived)/);const p=o['match'](/evidence="(.*)"/);expect(p,o)['not']['toBeNull'](),expect(p[0x1]['length'],o)['toBeGreaterThan'](0x0);}expect(c['trust']['summary'])['toContain']('weakest\x20Fund\x20safety'),expect(c['trust']['summary'])['not']['toContain']('trust_fund_safety'),expect(c['trust']['summary'])['toMatch'](/grade: (strong|fair|weak)/),expect(c['trust']['summary'])['toContain']('Compensation\x20fund');});});
1
+ import{describe,expect,it}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'../../graph/onchain/dataplane.js';import{expandTopology}from'../../graph/onchain/expand.js';import{FULL,GAP,fullServiceState,gapServiceState,truncatedServiceState}from'../../graph/onchain/fixtures.js';import{buildViewport}from'../../graph/onchain/viewport.js';import{runAnalyzers}from'../../graph/onchain/analyze.js';import{EVALUATION_SERVICE_INTENTS,resolveExpansionStrategy,withEvaluationBundle}from'../../graph/onchain/strategy.js';import{projectEvaluationFacts as a69a}from'../../graph/onchain/facts.js';import{evaluateGraphServiceFacts,GRAPH_RULE_INPUT_FACTS,registerGraphServiceEvaluations}from'./graph-service.js';async function evalState(a,b){registerGraphServiceEvaluations();const c=withEvaluationBundle(resolveExpansionStrategy({'intents':[...EVALUATION_SERVICE_INTENTS]})),d=await expandTopology(new FakeDataPlane(a),{'network':ENTRYPOINT['Mainnet'],'seed':b,'edges':c['edges'],'budget':c['budget']}),e=buildViewport(d,b,'neutral'),f=a69a(e,b,runAnalyzers(e));return{'projected':f,'r':await evaluateGraphServiceFacts(f)};}const scoreOf=(a,b,c)=>a[b]['breakdown']['find'](d=>d['rule_id']===c);describe('graph\x20service\x20evaluation\x20—\x20fully\x20hooked\x20shop\x20(TR-14.1)',()=>{it('scores\x20all\x20nine\x20dimensions\x20from\x20material\x20facts\x20with\x20no\x20default-low\x20deductions',async()=>{const {r:a}=await evalState(fullServiceState(),FULL['svc']);expect(a['unverified'])['toEqual']([]),expect(a['completeness'])['toBe'](0x64);const c=scoreOf(a,'trust','trust_arbitration');expect(c['score'])['toBe'](0x64),expect(c['matched'])['toEqual'](expect['arrayContaining'](['arbitrator\x20roster\x20configured','arbitration\x20fee\x20funded','arbitration\x20active'])),expect(c['reason'])['toContain']('Arbitration\x2020/20'),expect(scoreOf(a,'trust','trust_reviews')['score'])['toBe'](0x28),expect(scoreOf(a,'trust','trust_fulfillment')['score'])['toBe'](0x19);const d=scoreOf(a,'trust','trust_fund_safety');expect(d['score'])['toBe'](0x0),expect(d['mismatched'])['toContain']('compensation\x20fund\x20below\x20the\x20statutory\x203x\x20largest-order\x20exposure\x20ceiling'),expect(scoreOf(a,'trust','trust_transparency')['score'])['toBe'](0x64),expect(a['trust']['total'])['toBe'](0x31);const e=scoreOf(a,'risk','risk_fund');expect(e['score'])['toBeLessThan'](0x64),expect(e['mismatched'])['toContain']('Payout\x20exposure:\x20compensation\x20fund\x20cannot\x20cover\x20a\x20maximum-multiple\x20award\x20on\x20the\x20largest\x20windowed\x20order'),expect(e['mismatched']?.['some'](h=>h['startsWith']('R2:')))['toBe'](![]),expect(e['finding_refs']?.['map'](h=>h['id']))['toContain']('R2:'+FULL['svc']['toLowerCase']());const f=scoreOf(a,'risk','risk_trust');expect(f['score'])['toBeLessThan'](0x64),expect(f['mismatched']?.['some'](h=>h['startsWith']('R1:')))['toBe'](![]),expect(f['mismatched']?.['length'])['toBeGreaterThan'](0x0),expect(f['finding_refs']?.['some'](h=>h['id']['startsWith']('R1:')))['toBe'](!![]);for(const h of[...a['trust']['breakdown'],...a['risk']['breakdown']]){for(const i of h['mismatched']??[])expect(i)['not']['toContain']('::node::');}expect(scoreOf(a,'risk','risk_workflow')['score'])['toBe'](0x64),expect(scoreOf(a,'risk','risk_behavior')['score'])['toBe'](0x64);for(const j of[...a['trust']['breakdown'],...a['risk']['breakdown']]){const k=(j['reason']??'')['toLowerCase']();expect(k)['not']['toContain']('no\x20data'),expect(k)['not']['toContain']('default\x20low');}const g=a['trust']['trace']['filter'](l=>l['kind']==='rule'&&l['detail']['startsWith']('score='));expect(g['map'](l=>l['id']))['toEqual'](expect['arrayContaining'](Object['keys'](GRAPH_RULE_INPUT_FACTS)['filter'](l=>l['startsWith']('trust_'))));}),it('keeps\x20the\x20injection\x20+\x20requirement\x20mechanisms\x20working',async()=>{const {projected:a}=await evalState(fullServiceState(),FULL['svc']),b=await evaluateGraphServiceFacts(a,{'overrides':{'rules':{'trust_arbitration':{'weight':0x28}}}});expect(b['trust']['total'])['toBe'](0x3a);const c=await evaluateGraphServiceFacts(a,{'requirements':[{'rule_id':'trust_fund_safety','condition':'require'}]});expect(c['trust']['blocked'])['toBe'](!![]),expect(c['trust']['red_flags']['length'])['toBeGreaterThan'](0x0);});}),describe('graph\x20service\x20evaluation\x20—\x20configured-empty\x20shell\x20(TR-14.1)',()=>{it('scores\x20verified\x20absence\x20as\x20a\x20configured\x20fact\x20and\x20excludes\x20only\x20the\x20gap\x20dimension',async()=>{const {r:a}=await evalState(gapServiceState(),GAP['svc']),b=scoreOf(a,'trust','trust_arbitration');expect(b['score'])['toBe'](0x0),expect(b['reason'])['toContain']('verified\x20absence'),expect(scoreOf(a,'trust','trust_reviews')['score'])['toBe'](0x32),expect(a['unverified'])['toEqual'](['risk_workflow']),expect(scoreOf(a,'risk','risk_workflow'))['toBeUndefined'](),expect(a['risk']['unverified'])['toEqual'](['risk_workflow']),expect(a['trust']['unverified'])['toEqual'](['risk_workflow']);const c=a['risk']['trace']['find'](d=>d['kind']==='rule'&&d['id']==='risk_workflow');expect(c?.['detail'])['toContain']('not\x20applicable'),expect(scoreOf(a,'trust','trust_transparency')['score'])['toBe'](0x28),expect(scoreOf(a,'trust','trust_fund_safety')['score'])['toBe'](0x0);});}),describe('graph\x20service\x20evaluation\x20—\x20truncated\x20order\x20window\x20(TR-14.1)',()=>{it('excludes\x20the\x20unverifiable\x20dimensions\x20and\x20renormalizes\x20the\x20weighted\x20total',async()=>{const {r:a}=await evalState(truncatedServiceState(),FULL['svc']);expect(a['unverified'])['toEqual'](expect['arrayContaining'](['trust_fulfillment','trust_fund_safety','risk_fund','risk_behavior'])),expect(scoreOf(a,'trust','trust_fulfillment'))['toBeUndefined'](),expect(scoreOf(a,'trust','trust_fund_safety'))['toBeUndefined'](),expect(scoreOf(a,'risk','risk_fund'))['toBeUndefined'](),expect(scoreOf(a,'risk','risk_behavior'))['toBeUndefined'](),expect(a['trust']['total'])['toBe'](0x44);for(const b of['trust_fulfillment','trust_fund_safety']){expect(a['trust']['trace']['find'](c=>c['kind']==='rule'&&c['id']===b)?.['detail'])['toContain']('not\x20applicable');}for(const c of['risk_fund','risk_behavior']){expect(a['risk']['trace']['find'](d=>d['kind']==='rule'&&d['id']===c)?.['detail'])['toContain']('not\x20applicable');}});}),describe('graph\x20service\x20evaluation\x20—\x20scoring\x20report\x20(TR-14.2)',()=>{it('renders\x20a\x20per-dimension\x20report\x20with\x20score,\x20weight,\x20state,\x20confidence\x20and\x20evidence',async()=>{const {projected:a,r:c}=await evalState(fullServiceState(),FULL['svc']),d=new Map(a['facts']['map'](g=>[g['key'],g])),e=[];for(const g of['trust','risk']){const h=c[g];e['push'](g['toUpperCase']()+'\x20'+h['total']+'/100\x20('+h['level']+')\x20—\x20'+h['summary']);for(const i of h['breakdown']){const j=GRAPH_RULE_INPUT_FACTS[i['rule_id']]??[],k=j['map'](o=>o+':state='+(d['get'](o)?.['state']??'missing')),l=j['map'](o=>d['get'](o)?.['provenance']['confidence']??'missing'),n=j['map'](o=>d['get'](o)?.['evidence']??'missing')['join']('\x20');e['push'](i['rule_id']+':\x20score='+i['score']+'\x20weight='+i['weight']+'\x20'+k['join'](',')+'\x20confidence='+[...new Set(l)]['join']('+')+'\x20evidence=\x22'+n+'\x22');}}expect(e)['toHaveLength'](0xb);const f=e['filter'](o=>o['includes']('score='));expect(f)['toHaveLength'](0x9);for(const o of f){expect(o)['toMatch'](/weight=\d+/),expect(o)['toContain']('state=present'),expect(o)['toMatch'](/confidence=(exact|bounded|windowed|derived)/);const p=o['match'](/evidence="(.*)"/);expect(p,o)['not']['toBeNull'](),expect(p[0x1]['length'],o)['toBeGreaterThan'](0x0);}expect(c['trust']['summary'])['toContain']('weakest\x20Fund\x20safety'),expect(c['trust']['summary'])['not']['toContain']('trust_fund_safety'),expect(c['trust']['summary'])['toMatch'](/grade: (strong|fair|weak)/),expect(c['trust']['summary'])['toContain']('Compensation\x20fund');});});
@@ -24,6 +24,7 @@ export interface CapabilityVector {
24
24
  token_type: string;
25
25
  ticket_size: "micro" | "small" | "medium" | "large";
26
26
  trust_score: number;
27
+ trust_provenance?: "cold_start_prior" | "verified";
27
28
  reputation_like_ratio: number;
28
29
  arbitration_independent: boolean;
29
30
  merchant_history_count: number;
@@ -1 +1 @@
1
- import{REQUIREMENT_PASS_THRESHOLD,effectiveWeight,isDataSourceEnabled,isRuleEnabled,normalizeInjection}from'./user-injection.js';import{levelFromScore as a43a}from'./standards.js';export function levelFromScore(a){return a43a(a);}function appliesTo(a,b){if(!a||a['length']===0x0)return!![];return a['includes'](b);}export class EvaluationEngine{static ['instance']=null;['dataSources']=new Map();['rules']=new Map();static['Instance'](){return!EvaluationEngine['instance']&&(EvaluationEngine['instance']=new EvaluationEngine()),EvaluationEngine['instance'];}['registerDataSource'](a){if(!a['id']||this['dataSources']['has'](a['id']))return![];return this['dataSources']['set'](a['id'],a),!![];}['unregisterDataSource'](a){return this['dataSources']['delete'](a);}['registerRule'](a){if(!a['id']||this['rules']['has'](a['id']))return![];return this['rules']['set'](a['id'],a),!![];}['unregisterRule'](a){return this['rules']['delete'](a);}['getRule'](a){return this['rules']['get'](a);}['listRules'](){return Array['from'](this['rules']['values']());}['getDataSource'](a){return this['dataSources']['get'](a);}['listDataSources'](){return Array['from'](this['dataSources']['values']());}async['evaluate'](a,b,c){const d=normalizeInjection(c),e={'evaluation_id':a,'entities':b,'facts':{},'injection':d,'now':Date['now']()},f=[],g=Array['from'](this['dataSources']['values']())['filter'](m=>appliesTo(m['evaluation_ids'],a))['sort']((m,n)=>(m['priority']??0x0)-(n['priority']??0x0));for(const m of g){if(!isDataSourceEnabled(m['id'],d)){f['push']({'kind':'override','id':m['id'],'detail':'data\x20source\x20disabled\x20by\x20user\x20override'});continue;}if(m['isEnabled']&&!m['isEnabled'](e))continue;const n=await m['extract'](e);Object['assign'](e['facts'],n),f['push']({'kind':'data_source','id':m['id'],'detail':'extracted\x20'+Object['keys'](n)['length']+'\x20fact(s)'});}const h=[],i=[];for(const o of this['rules']['values']()){if(!appliesTo(o['evaluation_ids'],a))continue;if(!isRuleEnabled(o['id'],d)){f['push']({'kind':'override','id':o['id'],'detail':'rule\x20disabled\x20by\x20user\x20override'});continue;}if(o['isEnabled']&&!o['isEnabled'](e))continue;const p=o['evaluate'](e);if(!p){f['push']({'kind':'rule','id':o['id'],'detail':'not\x20applicable\x20—\x20excluded\x20from\x20weighted\x20aggregation'});continue;}const q=effectiveWeight(o,d);h['push']({'rule_id':o['id'],'dimension':o['dimension'],'score':p['score'],'weight':q,'weight_source':q!==o['weight']?'override':'default','reason':p['reason'],'matched':p['matched'],'mismatched':p['mismatched'],'finding_refs':p['finding_refs'],'red_flag':p['red_flag']}),p['red_flag']&&i['push'](p['reason']??o['id']+'\x20triggered\x20a\x20hard\x20block'),f['push']({'kind':'rule','id':o['id'],'detail':'score='+p['score']+'\x20weight='+q});}const j=aggregateScore(h);let k=i['length']>0x0;for(const r of d['requirements']??[]){const s=h['find'](t=>t['rule_id']===r['rule_id']);if(r['condition']==='require')(!s||s['score']<REQUIREMENT_PASS_THRESHOLD||s['red_flag'])&&(k=!![],i['push'](r['note']??'Requirement\x20requires\x20rule\x20\x27'+r['rule_id']+'\x27\x20to\x20pass'));else r['condition']==='forbid'&&(s&&s['red_flag']&&(k=!![],i['push'](r['note']??'Requirement\x20forbids\x20rule\x20\x27'+r['rule_id']+'\x27\x20from\x20triggering')));}const l=e['facts']['summary']??buildSummary(a,j,h,i,k);return{'evaluation_id':a,'total':j,'level':levelFromScore(j),'breakdown':h,'red_flags':i,'blocked':k,'trace':f,'summary':l,'criterionScores':e['facts']['criterionScores'],'findings':e['facts']['findings'],'strengths':e['facts']['strengths'],'needsLlm':e['facts']['needsLlm'],'llmPrompt':e['facts']['llmPrompt']};}}function aggregateScore(a){if(a['length']===0x0)return 0x0;let c=0x0,d=0x0;for(const e of a){c+=e['score']*e['weight'],d+=e['weight'];}if(d<=0x0)return 0x0;return clamp(Math['round'](c/d),0x0,0x64);}function clamp(a,b,c){return Math['max'](b,Math['min'](c,a));}function buildSummary(a,b,c,d,e){const f=['Evaluation\x20\x27'+a+'\x27:\x20score\x20'+b+'/100'];return e?f['push']('BLOCKED\x20('+d['length']+'\x20red\x20flag(s))'):f['push'](c['length']+'\x20rule(s)\x20evaluated'),f['join']('\x20—\x20');}export function getEvaluationEngine(){return EvaluationEngine['Instance']();}
1
+ import{REQUIREMENT_PASS_THRESHOLD,effectiveWeight,isDataSourceEnabled,isRuleEnabled,normalizeInjection}from'./user-injection.js';import{levelFromScore as a75a}from'./standards.js';export function levelFromScore(a){return a75a(a);}function appliesTo(a,b){if(!a||a['length']===0x0)return!![];return a['includes'](b);}export class EvaluationEngine{static ['instance']=null;['dataSources']=new Map();['rules']=new Map();static['Instance'](){return!EvaluationEngine['instance']&&(EvaluationEngine['instance']=new EvaluationEngine()),EvaluationEngine['instance'];}['registerDataSource'](a){if(!a['id']||this['dataSources']['has'](a['id']))return![];return this['dataSources']['set'](a['id'],a),!![];}['unregisterDataSource'](a){return this['dataSources']['delete'](a);}['registerRule'](a){if(!a['id']||this['rules']['has'](a['id']))return![];return this['rules']['set'](a['id'],a),!![];}['unregisterRule'](a){return this['rules']['delete'](a);}['getRule'](a){return this['rules']['get'](a);}['listRules'](){return Array['from'](this['rules']['values']());}['getDataSource'](a){return this['dataSources']['get'](a);}['listDataSources'](){return Array['from'](this['dataSources']['values']());}async['evaluate'](a,b,c){const d=normalizeInjection(c),e={'evaluation_id':a,'entities':b,'facts':{},'injection':d,'now':Date['now']()},f=[],g=Array['from'](this['dataSources']['values']())['filter'](m=>appliesTo(m['evaluation_ids'],a))['sort']((m,n)=>(m['priority']??0x0)-(n['priority']??0x0));for(const m of g){if(!isDataSourceEnabled(m['id'],d)){f['push']({'kind':'override','id':m['id'],'detail':'data\x20source\x20disabled\x20by\x20user\x20override'});continue;}if(m['isEnabled']&&!m['isEnabled'](e))continue;const n=await m['extract'](e);Object['assign'](e['facts'],n),f['push']({'kind':'data_source','id':m['id'],'detail':'extracted\x20'+Object['keys'](n)['length']+'\x20fact(s)'});}const h=[],i=[];for(const o of this['rules']['values']()){if(!appliesTo(o['evaluation_ids'],a))continue;if(!isRuleEnabled(o['id'],d)){f['push']({'kind':'override','id':o['id'],'detail':'rule\x20disabled\x20by\x20user\x20override'});continue;}if(o['isEnabled']&&!o['isEnabled'](e))continue;const p=o['evaluate'](e);if(!p){f['push']({'kind':'rule','id':o['id'],'detail':'not\x20applicable\x20—\x20excluded\x20from\x20weighted\x20aggregation'});continue;}const q=effectiveWeight(o,d);h['push']({'rule_id':o['id'],'dimension':o['dimension'],'score':p['score'],'weight':q,'weight_source':q!==o['weight']?'override':'default','reason':p['reason'],'matched':p['matched'],'mismatched':p['mismatched'],'finding_refs':p['finding_refs'],'red_flag':p['red_flag']}),p['red_flag']&&i['push'](p['reason']??o['id']+'\x20triggered\x20a\x20hard\x20block'),f['push']({'kind':'rule','id':o['id'],'detail':'score='+p['score']+'\x20weight='+q});}const j=aggregateScore(h);let k=i['length']>0x0;for(const r of d['requirements']??[]){const s=h['find'](t=>t['rule_id']===r['rule_id']);if(r['condition']==='require')(!s||s['score']<REQUIREMENT_PASS_THRESHOLD||s['red_flag'])&&(k=!![],i['push'](r['note']??'Requirement\x20requires\x20rule\x20\x27'+r['rule_id']+'\x27\x20to\x20pass'));else r['condition']==='forbid'&&(s&&s['red_flag']&&(k=!![],i['push'](r['note']??'Requirement\x20forbids\x20rule\x20\x27'+r['rule_id']+'\x27\x20from\x20triggering')));}const l=e['facts']['summary']??buildSummary(a,j,h,i,k);return{'evaluation_id':a,'total':j,'level':levelFromScore(j),'breakdown':h,'red_flags':i,'blocked':k,'trace':f,'summary':l,'criterionScores':e['facts']['criterionScores'],'findings':e['facts']['findings'],'strengths':e['facts']['strengths'],'needsLlm':e['facts']['needsLlm'],'llmPrompt':e['facts']['llmPrompt']};}}function aggregateScore(a){if(a['length']===0x0)return 0x0;let c=0x0,d=0x0;for(const e of a){c+=e['score']*e['weight'],d+=e['weight'];}if(d<=0x0)return 0x0;return clamp(Math['round'](c/d),0x0,0x64);}function clamp(a,b,c){return Math['max'](b,Math['min'](c,a));}function buildSummary(a,b,c,d,e){const f=['Evaluation\x20\x27'+a+'\x27:\x20score\x20'+b+'/100'];return e?f['push']('BLOCKED\x20('+d['length']+'\x20red\x20flag(s))'):f['push'](c['length']+'\x20rule(s)\x20evaluated'),f['join']('\x20—\x20');}export function getEvaluationEngine(){return EvaluationEngine['Instance']();}
@@ -1,4 +1,10 @@
1
- import type { CapabilityVector } from "./capability.js";
1
+ import type { CapabilityVector, IndustryScenario } from "./capability.js";
2
+ export declare function enrichFromDescription(description: string | undefined): {
3
+ industry: IndustryScenario;
4
+ industry_confidence: number;
5
+ tags: string[];
6
+ keywords: string[];
7
+ };
2
8
  export interface ServiceExtractInput {
3
9
  object: string;
4
10
  description: string;
@@ -1 +1 @@
1
- import{parseRegion}from'./region.js';import{findSimilarIndustries,inferTraitsFromDescription}from'../knowledge/industry-generalizer.js';import{isRegisteredIndustry}from'../knowledge/industry-registry.js';function enrichFromDescription(a){const b=a?.['trim']();if(!b)return{'industry':'general','industry_confidence':0x0,'tags':[],'keywords':[]};const {traits:c,confidence:d,matched_keywords:e}=inferTraitsFromDescription(b),f=findSimilarIndustries(c,0x3),g=f[0x0],h=g&&isRegisteredIndustry(g['industry'])?g['industry']:'general',i=e['length']>0x0||(g?.['similarity']??0x0)>0.2;return{'industry':i?h:'general','industry_confidence':i?Math['max'](d,g?.['similarity']??0x0):0x0,'tags':i?f['slice'](0x0,0x3)['map'](j=>j['industry']):[],'keywords':e};}export function extractServiceCapability(a,b){const c=a['sales']??[],d=c['map'](j=>toBigInt(j['price']))['filter'](j=>j!==undefined),e=a['arbitrations']??[],f=toBigInt(a['compensation_fund'])??0x0n,g=enrichFromDescription(a['description']),h={'has_arbitration':e['length']>0x0,'has_refund_path':e['length']>0x0&&f>0x0n,'has_milestone_nodes':a['machine']!=null,'has_compensation_fund':f>0x0n,'has_wip_verification':c['some'](j=>!!j['wip_hash']),'has_messenger':a['um']!=null,'has_buy_guard':a['buy_guard']!=null,'has_dynamic_pricing':![],'is_published':a['bPublished']===!![],'is_paused':a['bPaused']===!![]},i={'id':a['object'],'kind':'service','owner':a['owner']??'','industry':g['industry'],'industry_confidence':g['industry_confidence'],'region':parseRegion(a['location']),'price_min':d['length']>0x0?minBigInt(d):undefined,'price_max':d['length']>0x0?maxBigInt(d):undefined,'token_type':'','ticket_size':'medium','trust_score':0x32,'reputation_like_ratio':0x1,'arbitration_independent':![],'merchant_history_count':0x0,'capabilities':h,'tags':g['tags'],'keywords':g['keywords']};return{...i,...b};}export function extractDemandCapability(a,b){const c=enrichFromDescription(a['description']),d={'id':a['object'],'kind':'demand','owner':a['owner']??'','industry':c['industry'],'industry_confidence':c['industry_confidence'],'region':parseRegion(a['location']),'price_min':undefined,'price_max':undefined,'token_type':'','ticket_size':'medium','trust_score':0x32,'reputation_like_ratio':0x1,'arbitration_independent':![],'merchant_history_count':0x0,'capabilities':{'has_arbitration':![],'has_refund_path':![],'has_milestone_nodes':![],'has_compensation_fund':![],'has_wip_verification':![],'has_messenger':a['um']!=null,'has_buy_guard':![],'has_dynamic_pricing':![],'is_published':!![],'is_paused':![]},'tags':c['tags'],'keywords':c['keywords']};return{...d,...b};}function toBigInt(a){if(a===undefined||a===null)return undefined;try{return BigInt(a);}catch{return undefined;}}function minBigInt(a){return a['reduce']((c,d)=>c<d?c:d);}function maxBigInt(a){return a['reduce']((c,d)=>c>d?c:d);}
1
+ import{parseRegion}from'./region.js';import{findSimilarIndustries,inferTraitsFromDescription}from'../knowledge/industry-generalizer.js';import{isRegisteredIndustry}from'../knowledge/industry-registry.js';export function enrichFromDescription(a){const b=a?.['trim']();if(!b)return{'industry':'general','industry_confidence':0x0,'tags':[],'keywords':[]};const {traits:c,confidence:d,matched_keywords:e}=inferTraitsFromDescription(b),f=findSimilarIndustries(c,0x3),g=f[0x0],h=g&&isRegisteredIndustry(g['industry'])?g['industry']:'general',i=e['length']>0x0||(g?.['similarity']??0x0)>0.2;return{'industry':i?h:'general','industry_confidence':i?Math['max'](d,g?.['similarity']??0x0):0x0,'tags':i?f['slice'](0x0,0x3)['map'](j=>j['industry']):[],'keywords':e};}export function extractServiceCapability(a,b){const c=a['sales']??[],d=c['map'](j=>toBigInt(j['price']))['filter'](j=>j!==undefined),e=a['arbitrations']??[],f=toBigInt(a['compensation_fund'])??0x0n,g=enrichFromDescription(a['description']),h={'has_arbitration':e['length']>0x0,'has_refund_path':e['length']>0x0&&f>0x0n,'has_milestone_nodes':a['machine']!=null,'has_compensation_fund':f>0x0n,'has_wip_verification':c['some'](j=>!!j['wip_hash']),'has_messenger':a['um']!=null,'has_buy_guard':a['buy_guard']!=null,'has_dynamic_pricing':![],'is_published':a['bPublished']===!![],'is_paused':a['bPaused']===!![]},i={'id':a['object'],'kind':'service','owner':a['owner']??'','industry':g['industry'],'industry_confidence':g['industry_confidence'],'region':parseRegion(a['location']),'price_min':d['length']>0x0?minBigInt(d):undefined,'price_max':d['length']>0x0?maxBigInt(d):undefined,'token_type':'','ticket_size':'medium','trust_score':0x32,'trust_provenance':'cold_start_prior','reputation_like_ratio':0x1,'arbitration_independent':![],'merchant_history_count':0x0,'capabilities':h,'tags':g['tags'],'keywords':g['keywords']};return{...i,...b};}export function extractDemandCapability(a,b){const c=enrichFromDescription(a['description']),d={'id':a['object'],'kind':'demand','owner':a['owner']??'','industry':c['industry'],'industry_confidence':c['industry_confidence'],'region':parseRegion(a['location']),'price_min':undefined,'price_max':undefined,'token_type':'','ticket_size':'medium','trust_score':0x32,'trust_provenance':'cold_start_prior','reputation_like_ratio':0x1,'arbitration_independent':![],'merchant_history_count':0x0,'capabilities':{'has_arbitration':![],'has_refund_path':![],'has_milestone_nodes':![],'has_compensation_fund':![],'has_wip_verification':![],'has_messenger':a['um']!=null,'has_buy_guard':![],'has_dynamic_pricing':![],'is_published':!![],'is_paused':![]},'tags':c['tags'],'keywords':c['keywords']};return{...d,...b};}function toBigInt(a){if(a===undefined||a===null)return undefined;try{return BigInt(a);}catch{return undefined;}}function minBigInt(a){return a['reduce']((c,d)=>c<d?c:d);}function maxBigInt(a){return a['reduce']((c,d)=>c>d?c:d);}
@@ -0,0 +1,142 @@
1
+ import type { ServiceExtractInput } from "./extract.js";
2
+ import type { UserInjection } from "./types.js";
3
+ export interface PolicyGate {
4
+ dim: string;
5
+ op?: string;
6
+ value?: boolean | number | string | string[];
7
+ params?: Record<string, unknown>;
8
+ }
9
+ export interface PolicyExclude {
10
+ dim: string;
11
+ objects?: string[];
12
+ owners?: string[];
13
+ flags?: string[];
14
+ source?: string[];
15
+ rule?: string;
16
+ }
17
+ export interface PolicyRerank {
18
+ diversity?: {
19
+ by: "owner" | "permission";
20
+ max_per_group: number;
21
+ };
22
+ explore?: unknown;
23
+ llm?: unknown;
24
+ fairness?: unknown;
25
+ }
26
+ export interface PolicyOutput {
27
+ top_n?: number;
28
+ explain?: boolean;
29
+ evidence_chain?: unknown;
30
+ coverage_report?: unknown;
31
+ }
32
+ export interface MatchPolicy {
33
+ policy_id: string;
34
+ version?: number;
35
+ direction?: "demand_to_supply" | "supply_to_demand";
36
+ unknown_policy?: "pass" | "drop" | "neutral_score";
37
+ gates?: PolicyGate[];
38
+ excludes?: PolicyExclude[];
39
+ weights?: Record<string, number>;
40
+ rerank?: PolicyRerank;
41
+ recall?: unknown;
42
+ verify?: unknown;
43
+ output?: PolicyOutput;
44
+ }
45
+ export type MatchPolicyInput = string | MatchPolicy;
46
+ export declare const POLICY_WEIGHT_RULE_IDS: readonly ["region", "industry", "price", "trust", "capabilities", "tags", "acceptance"];
47
+ export declare const PRESET_MATCH_POLICIES: Record<string, MatchPolicy>;
48
+ export declare function resolveMatchPolicy(input: MatchPolicyInput | undefined, direction: "demand_to_supply" | "supply_to_demand"): MatchPolicy | undefined;
49
+ export type GateStatus = "satisfied" | "violated" | "unknown";
50
+ export interface GateVerdict {
51
+ dim: string;
52
+ status: GateStatus;
53
+ reason: string;
54
+ }
55
+ export interface PolicyGateOutcome<T extends {
56
+ object: string;
57
+ } = ServiceExtractInput> {
58
+ passed: T[];
59
+ dropped: Array<{
60
+ object: string;
61
+ reason: string;
62
+ }>;
63
+ unknown_notes: Array<{
64
+ object: string;
65
+ dim: string;
66
+ reason: string;
67
+ }>;
68
+ ignored: string[];
69
+ }
70
+ export declare function applyPolicyGates(policy: MatchPolicy, candidates: ServiceExtractInput[], ctx?: {
71
+ budgetWei?: bigint;
72
+ }): PolicyGateOutcome<ServiceExtractInput>;
73
+ export interface DemandGateCandidate {
74
+ object: string;
75
+ description: string;
76
+ location: string;
77
+ rewards?: string[];
78
+ um?: string | null;
79
+ owner?: string;
80
+ guards?: unknown[];
81
+ presenters_count?: number;
82
+ }
83
+ export declare function applyDemandPolicyGates(policy: MatchPolicy, candidates: DemandGateCandidate[]): PolicyGateOutcome<DemandGateCandidate>;
84
+ export declare function policyToInjection(policy: MatchPolicy): {
85
+ injection: UserInjection;
86
+ applied: Record<string, number>;
87
+ ignored: string[];
88
+ };
89
+ export interface PolicyRankedMatch {
90
+ service: {
91
+ object: string;
92
+ owner?: string;
93
+ };
94
+ result: {
95
+ total: number;
96
+ };
97
+ }
98
+ export interface PolicyRerankSummary {
99
+ order: string;
100
+ diversity_applied: boolean;
101
+ deferred: number;
102
+ ignored: string[];
103
+ }
104
+ export interface PolicyRerankOutcome<M> extends PolicyRerankSummary {
105
+ matches: M[];
106
+ }
107
+ export declare function applyPolicyRerank<M extends PolicyRankedMatch>(matches: M[], policy: MatchPolicy): PolicyRerankOutcome<M>;
108
+ export declare function rerankDemandMatches<M extends {
109
+ demand: {
110
+ object: string;
111
+ owner?: string;
112
+ };
113
+ result: {
114
+ total: number;
115
+ };
116
+ }>(matches: M[], policy: MatchPolicy): PolicyRerankOutcome<M>;
117
+ export declare function policyHash(policy: MatchPolicy): string;
118
+ export interface PolicyEffect {
119
+ policy_id: string;
120
+ version?: number;
121
+ direction: string;
122
+ policy_hash: string;
123
+ unknown_policy: string;
124
+ dropped: Array<{
125
+ object: string;
126
+ reason: string;
127
+ }>;
128
+ unknown_kept: Array<{
129
+ object: string;
130
+ dim: string;
131
+ reason: string;
132
+ }>;
133
+ weights_applied: Record<string, number>;
134
+ rerank: string;
135
+ deferred_by_diversity: number;
136
+ ignored: string[];
137
+ privacy: string;
138
+ }
139
+ export declare function buildPolicyEffect(policy: MatchPolicy, gateOutcome: PolicyGateOutcome, weights: {
140
+ applied: Record<string, number>;
141
+ ignored: string[];
142
+ }, rerank: PolicyRerankSummary, extraIgnored?: string[]): PolicyEffect;
@@ -0,0 +1 @@
1
+ import{createHash}from'node:crypto';export const POLICY_WEIGHT_RULE_IDS=['region','industry','price','trust','capabilities','tags','acceptance'];export const PRESET_MATCH_POLICIES={'default':{'policy_id':'default','version':0x1,'unknown_policy':'neutral_score'},'retail':{'policy_id':'retail','version':0x1,'unknown_policy':'neutral_score','gates':[{'dim':'live','op':'eq','value':!![]}],'weights':{'region':0xa,'industry':0xf,'price':0x19,'trust':0xf,'capabilities':0x1e,'tags':0x5}},'life_service':{'policy_id':'life_service','version':0x1,'unknown_policy':'neutral_score','gates':[{'dim':'live','op':'eq','value':!![]}],'weights':{'region':0x14,'industry':0xf,'price':0xa,'trust':0x19,'capabilities':0x19,'tags':0x5}},'trust_first':{'policy_id':'trust_first','version':0x1,'unknown_policy':'drop','gates':[{'dim':'live','op':'eq','value':!![]},{'dim':'arb','op':'gte','value':0x1}],'weights':{'trust':0x1e,'capabilities':0x19,'region':0xa,'industry':0xa,'price':0xa,'tags':0x5}},'cross_border':{'policy_id':'cross_border','version':0x1,'unknown_policy':'neutral_score','gates':[{'dim':'live','op':'eq','value':!![]},{'dim':'wip_verify','op':'eq','value':!![]}],'weights':{'capabilities':0x19,'trust':0x14,'industry':0x14,'tags':0xf,'price':0xf,'region':0x5}},'cheap_and_fast':{'policy_id':'cheap_and_fast','version':0x1,'unknown_policy':'drop','gates':[{'dim':'price','op':'lte','params':{'from_budget':!![],'hard':!![]}}],'weights':{'price':0x23,'trust':0xf,'capabilities':0xf,'region':0xa,'industry':0xa,'tags':0x5}},'enterprise':{'policy_id':'enterprise','version':0x1,'unknown_policy':'drop','gates':[{'dim':'live','op':'eq','value':!![]},{'dim':'machine','op':'eq','value':!![]},{'dim':'buy_guard','op':'eq','value':!![]}],'weights':{'capabilities':0x1e,'trust':0x19,'industry':0xf,'acceptance':0xa,'price':0xa,'region':0x5,'tags':0x5}},'supplier_hunting':{'policy_id':'supplier_hunting','version':0x1,'direction':'supply_to_demand','unknown_policy':'neutral_score'}};function normalizePresetId(a){return a['trim']()['toLowerCase']()['replace'](/-/g,'_');}export function resolveMatchPolicy(a,b){if(a===undefined)return undefined;let c;if(typeof a==='string'){const e=PRESET_MATCH_POLICIES[normalizePresetId(a)];if(!e)throw new Error('unknown\x20match_policy\x20preset\x20\x27'+a+'\x27\x20—\x20available:\x20'+Object['keys'](PRESET_MATCH_POLICIES)['join'](',\x20')+'\x20(or\x20pass\x20an\x20inline\x20policy\x20object)');c=e;}else{if(typeof a!=='object'||a===null||typeof a['policy_id']!=='string'||a['policy_id']['length']===0x0)throw new Error('inline\x20match_policy\x20must\x20be\x20an\x20object\x20with\x20a\x20non-empty\x20string\x20policy_id');c=a;}const d=c['direction']??'demand_to_supply';if(d!==b)throw new Error('match_policy\x20\x27'+c['policy_id']+'\x27\x20has\x20direction\x20\x27'+d+'\x27\x20and\x20cannot\x20drive\x20a\x20\x27'+b+'\x27\x20query');return c;}function bigIntValue(a){if(typeof a==='bigint')return a;if(typeof a==='number'&&Number['isInteger'](a))return BigInt(a);if(typeof a==='string'&&/^-?\d+$/['test'](a['trim']()))return BigInt(a['trim']());return undefined;}function asStringArray(a){if(Array['isArray'](a))return a['map'](String);if(typeof a==='string')return[a];return undefined;}function minSalePrice(a){if(!a['sales']||a['sales']['length']===0x0)return undefined;let b;for(const c of a['sales']){const d=bigIntValue(c['price']);if(d===undefined)continue;if(b===undefined||d<b)b=d;}return b;}function evalGate(a,b,c){const d=a['op']??'eq';switch(a['dim']){case'live':{const e=a['value']===undefined?!![]:Boolean(a['value']);if(b['bPublished']===undefined&&b['bPaused']===undefined)return{'dim':a['dim'],'status':'unknown','reason':'published/paused\x20flags\x20absent\x20from\x20candidate\x20payload'};const f=(b['bPublished']??![])&&!(b['bPaused']??![]);return f===e?{'dim':a['dim'],'status':'satisfied','reason':'live='+f}:{'dim':a['dim'],'status':'violated','reason':'live='+f+',\x20gate\x20requires\x20'+e};}case'price':{if(d!=='lte'&&d!=='gte')return null;let g=bigIntValue(a['value']);if(g===undefined&&a['params']?.['from_budget']===!![])g=c['budgetWei'];if(g===undefined)return{'dim':a['dim'],'status':'unknown','reason':'no\x20gate\x20value\x20and\x20no\x20request\x20budget\x20to\x20bind\x20from_budget'};const h=minSalePrice(b);if(h===undefined)return{'dim':a['dim'],'status':'unknown','reason':'candidate\x20exposes\x20no\x20sale\x20price'};const i=d==='lte'?h<=g:h>=g;return i?{'dim':a['dim'],'status':'satisfied','reason':'price_min\x20'+h+'\x20'+d+'\x20'+g}:{'dim':a['dim'],'status':'violated','reason':'price_min\x20'+h+'\x20fails\x20'+d+'\x20'+g};}case'arb':{if(d!=='gte')return null;const j=bigIntValue(a['value']);if(j===undefined)return null;if(!b['arbitrations'])return{'dim':a['dim'],'status':'unknown','reason':'arbitration\x20list\x20absent\x20from\x20candidate\x20payload'};const k=BigInt(b['arbitrations']['length'])>=j;return k?{'dim':a['dim'],'status':'satisfied','reason':'arb_count\x20'+b['arbitrations']['length']+'\x20>=\x20'+j}:{'dim':a['dim'],'status':'violated','reason':'arb_count\x20'+b['arbitrations']['length']+'\x20<\x20'+j};}case'compensation':{if(d!=='gte')return null;const l=bigIntValue(a['value']);if(l===undefined)return null;const m=bigIntValue(b['compensation_fund']);if(m===undefined)return{'dim':a['dim'],'status':'unknown','reason':'compensation_fund\x20absent\x20from\x20candidate\x20payload'};return m>=l?{'dim':a['dim'],'status':'satisfied','reason':'compensation_fund\x20'+m+'\x20>=\x20'+l}:{'dim':a['dim'],'status':'violated','reason':'compensation_fund\x20'+m+'\x20<\x20'+l};}case'machine':case'messenger':case'buy_guard':{const n=a['value']===undefined?!![]:Boolean(a['value']),o=a['dim']==='machine'?b['machine']:a['dim']==='messenger'?b['um']:b['buy_guard'];if(o===undefined)return{'dim':a['dim'],'status':'unknown','reason':a['dim']+'\x20binding\x20absent\x20from\x20candidate\x20payload'};const p=o!==null;return p===n?{'dim':a['dim'],'status':'satisfied','reason':a['dim']+'\x20bound='+p}:{'dim':a['dim'],'status':'violated','reason':a['dim']+'\x20bound='+p+',\x20gate\x20requires\x20'+n};}case'wip_verify':{const q=a['value']===undefined?!![]:Boolean(a['value']);if(!b['sales'])return{'dim':a['dim'],'status':'unknown','reason':'sales\x20absent\x20from\x20candidate\x20payload'};const r=b['sales']['some'](t=>typeof t['wip_hash']==='string'&&t['wip_hash']['length']>0x0);return r===q?{'dim':a['dim'],'status':'satisfied','reason':'has_wip_verification='+r}:{'dim':a['dim'],'status':'violated','reason':'has_wip_verification='+r+',\x20gate\x20requires\x20'+q};}case'text':{if(d!=='must_contain'&&d!=='must_not_contain')return null;const t=asStringArray(a['value']);if(!t||t['length']===0x0)return null;const u=[b['description']??'',...(b['sales']??[])['map'](w=>w['name']??'')]['join']('\x20')['toLowerCase']();if(u['trim']()['length']===0x0)return{'dim':a['dim'],'status':'unknown','reason':'candidate\x20carries\x20no\x20text\x20to\x20match'};if(d==='must_contain'){const w=t['filter'](x=>!u['includes'](x['toLowerCase']()));return w['length']===0x0?{'dim':a['dim'],'status':'satisfied','reason':'all\x20'+t['length']+'\x20term(s)\x20present'}:{'dim':a['dim'],'status':'violated','reason':'missing\x20term(s):\x20'+w['join'](',\x20')};}const v=t['filter'](x=>u['includes'](x['toLowerCase']()));return v['length']===0x0?{'dim':a['dim'],'status':'satisfied','reason':'no\x20forbidden\x20term\x20present'}:{'dim':a['dim'],'status':'violated','reason':'forbidden\x20term(s)\x20present:\x20'+v['join'](',\x20')};}case'owner':{if(d!=='in'&&d!=='not_in')return null;const x=asStringArray(a['value']);if(!x)return null;if(b['owner']===undefined)return{'dim':a['dim'],'status':'unknown','reason':'owner\x20absent\x20from\x20candidate\x20payload'};const y=x['includes'](b['owner']),z=d==='in'?y:!y;return z?{'dim':a['dim'],'status':'satisfied','reason':'owner\x20'+d+'\x20list'}:{'dim':a['dim'],'status':'violated','reason':'owner\x20fails\x20'+d+'\x20list'};}default:return null;}}function applyGates(a,b,d,e){const f=a['unknown_policy']??'neutral_score',g=new Set(),h=[],i=[],j=[];for(const m of a['gates']??[]){d(m,e)===null&&g['add']('gate\x20dim\x20\x27'+m['dim']+'\x27\x20(op\x20\x27'+(m['op']??'eq')+'\x27)\x20not\x20enforceable\x20client-side');}const k=new Set(),l=new Set();for(const n of a['excludes']??[]){if(n['dim']==='blacklist'){for(const p of n['objects']??[])k['add'](p);for(const q of n['owners']??[])l['add'](q);}else g['add']('exclude\x20dim\x20\x27'+n['dim']+'\x27\x20not\x20enforceable\x20client-side\x20(no\x20local\x20facet)');}for(const r of b){if(k['has'](r['object'])){i['push']({'object':r['object'],'reason':'excluded:\x20blacklisted\x20object'});continue;}const s=r['owner'];if(s!==undefined&&l['has'](s)){i['push']({'object':r['object'],'reason':'excluded:\x20blacklisted\x20owner'});continue;}let t=!![];for(const u of a['gates']??[]){const v=d(u,r);if(v===null){g['add']('gate\x20dim\x20\x27'+u['dim']+'\x27\x20(op\x20\x27'+(u['op']??'eq')+'\x27)\x20not\x20enforceable\x20client-side');continue;}if(v['status']==='violated'){i['push']({'object':r['object'],'reason':'gate\x20'+v['dim']+':\x20'+v['reason']}),t=![];break;}if(v['status']==='unknown'){if(f==='drop'){i['push']({'object':r['object'],'reason':'gate\x20'+v['dim']+'\x20unknown\x20('+v['reason']+')\x20and\x20unknown_policy=drop'}),t=![];break;}j['push']({'object':r['object'],'dim':v['dim'],'reason':v['reason']});}}if(t)h['push'](r);}return{'passed':h,'dropped':i,'unknown_notes':j,'ignored':[...g]['sort']()};}export function applyPolicyGates(a,b,c={}){return applyGates(a,b,(d,e)=>evalGate(d,e,c),{'object':'','description':'','location':''});}function evalDemandGate(a,b){const c=a['op']??'eq';switch(a['dim']){case'text':{if(c!=='must_contain'&&c!=='must_not_contain')return null;const e=asStringArray(a['value']);if(!e||e['length']===0x0)return null;const f=(b['description']??'')['toLowerCase']();if(f['trim']()['length']===0x0)return{'dim':a['dim'],'status':'unknown','reason':'demand\x20carries\x20no\x20description\x20text'};if(c==='must_contain'){const h=e['filter'](i=>!f['includes'](i['toLowerCase']()));return h['length']===0x0?{'dim':a['dim'],'status':'satisfied','reason':'all\x20'+e['length']+'\x20term(s)\x20present'}:{'dim':a['dim'],'status':'violated','reason':'missing\x20term(s):\x20'+h['join'](',\x20')};}const g=e['filter'](i=>f['includes'](i['toLowerCase']()));return g['length']===0x0?{'dim':a['dim'],'status':'satisfied','reason':'no\x20forbidden\x20term\x20present'}:{'dim':a['dim'],'status':'violated','reason':'forbidden\x20term(s)\x20present:\x20'+g['join'](',\x20')};}case'location':{if(c!=='must_contain'&&c!=='must_not_contain')return null;const i=asStringArray(a['value']);if(!i||i['length']===0x0)return null;const j=(b['location']??'')['toLowerCase']();if(j['trim']()['length']===0x0)return{'dim':a['dim'],'status':'unknown','reason':'demand\x20carries\x20no\x20location'};if(c==='must_contain'){const l=i['filter'](m=>!j['includes'](m['toLowerCase']()));return l['length']===0x0?{'dim':a['dim'],'status':'satisfied','reason':'all\x20'+i['length']+'\x20term(s)\x20present\x20in\x20location'}:{'dim':a['dim'],'status':'violated','reason':'location\x20missing\x20term(s):\x20'+l['join'](',\x20')};}const k=i['filter'](m=>j['includes'](m['toLowerCase']()));return k['length']===0x0?{'dim':a['dim'],'status':'satisfied','reason':'no\x20forbidden\x20term\x20in\x20location'}:{'dim':a['dim'],'status':'violated','reason':'forbidden\x20term(s)\x20in\x20location:\x20'+k['join'](',\x20')};}case'reward':{if(c!=='gte'&&c!=='lte')return null;const m=bigIntValue(a['value']);if(m===undefined)return null;if(b['rewards']===undefined)return{'dim':a['dim'],'status':'unknown','reason':'reward\x20list\x20absent\x20from\x20demand\x20payload'};const n=BigInt(b['rewards']['length']),o=c==='gte'?n>=m:n<=m;return o?{'dim':a['dim'],'status':'satisfied','reason':'reward_count\x20'+n+'\x20'+c+'\x20'+m}:{'dim':a['dim'],'status':'violated','reason':'reward_count\x20'+n+'\x20fails\x20'+c+'\x20'+m};}case'messenger':{const p=a['value']===undefined?!![]:Boolean(a['value']);if(b['um']===undefined)return{'dim':a['dim'],'status':'unknown','reason':'messenger\x20binding\x20absent\x20from\x20demand\x20payload'};const q=b['um']!==null;return q===p?{'dim':a['dim'],'status':'satisfied','reason':'messenger\x20bound='+q}:{'dim':a['dim'],'status':'violated','reason':'messenger\x20bound='+q+',\x20gate\x20requires\x20'+p};}case'guard':{const r=a['value']===undefined?!![]:Boolean(a['value']);if(b['guards']===undefined)return{'dim':a['dim'],'status':'unknown','reason':'guard\x20list\x20absent\x20from\x20demand\x20payload'};const s=b['guards']['length']>0x0;return s===r?{'dim':a['dim'],'status':'satisfied','reason':'guarded='+s}:{'dim':a['dim'],'status':'violated','reason':'guarded='+s+',\x20gate\x20requires\x20'+r};}case'presenters':{if(c!=='gte'&&c!=='lte')return null;const t=bigIntValue(a['value']);if(t===undefined)return null;if(b['presenters_count']===undefined)return{'dim':a['dim'],'status':'unknown','reason':'presenters_count\x20absent\x20from\x20demand\x20payload'};const u=BigInt(b['presenters_count']),v=c==='gte'?u>=t:u<=t;return v?{'dim':a['dim'],'status':'satisfied','reason':'presenters_count\x20'+u+'\x20'+c+'\x20'+t}:{'dim':a['dim'],'status':'violated','reason':'presenters_count\x20'+u+'\x20fails\x20'+c+'\x20'+t};}case'owner':{if(c!=='in'&&c!=='not_in')return null;const w=asStringArray(a['value']);if(!w)return null;if(b['owner']===undefined)return{'dim':a['dim'],'status':'unknown','reason':'owner\x20absent\x20from\x20demand\x20payload'};const x=w['includes'](b['owner']),y=c==='in'?x:!x;return y?{'dim':a['dim'],'status':'satisfied','reason':'owner\x20'+c+'\x20list'}:{'dim':a['dim'],'status':'violated','reason':'owner\x20fails\x20'+c+'\x20list'};}default:return null;}}export function applyDemandPolicyGates(a,b){return applyGates(a,b,evalDemandGate,{'object':'','description':'','location':''});}export function policyToInjection(a){const b={},c=[],d=new Set(POLICY_WEIGHT_RULE_IDS);for(const [e,f]of Object['entries'](a['weights']??{})){if(d['has'](e))b[e]=f;else c['push']('weight\x20on\x20unregistered\x20rule\x20\x27'+e+'\x27\x20ignored\x20(client\x20engine\x20has:\x20'+POLICY_WEIGHT_RULE_IDS['join'](',\x20')+')');}return{'injection':{'overrides':{'rules':Object['fromEntries'](Object['entries'](b)['map'](([g,h])=>[g,{'weight':h}]))}},'applied':b,'ignored':c['sort']()};}export function applyPolicyRerank(a,b){const c=[],d=[...a]['sort']((k,l)=>l['result']['total']-k['result']['total']||k['service']['object']['localeCompare'](l['service']['object']));let e=d,f=![],g=0x0;const h=b['rerank']?.['diversity'];if(h){if(h['by']==='permission')c['push']('rerank.diversity\x20by\x20\x27permission\x27\x20not\x20enforceable\x20client-side\x20(no\x20permission\x20facet\x20on\x20candidates);\x20use\x20\x27owner\x27');else{const k=new Map(),l=[],n=[];for(const o of e){const p=o['service']['owner'];if(p===undefined){l['push'](o);continue;}const q=k['get'](p)??0x0;q<h['max_per_group']?(k['set'](p,q+0x1),l['push'](o)):n['push'](o);}e=[...l,...n],f=!![],g=n['length'];}}if(b['rerank']?.['explore']!==undefined)c['push']('rerank.explore\x20not\x20enforceable\x20in\x20this\x20build\x20(no\x20local\x20bandit\x20state)');if(b['rerank']?.['llm']!==undefined)c['push']('rerank.llm\x20not\x20enforceable\x20in\x20this\x20build\x20(deterministic\x20kernel\x20only)');if(b['rerank']?.['fairness']!==undefined)c['push']('rerank.fairness\x20not\x20enforceable\x20in\x20this\x20build\x20(no\x20exposure\x20accounting)');const i=b['output']?.['top_n'],j=i!==undefined?e['slice'](0x0,i):e;return{'matches':j,'order':'total\x20DESC,\x20object_id\x20ASC'+(f?',\x20diversity(owner)<='+h['max_per_group']:''),'diversity_applied':f,'deferred':g,'ignored':c['sort']()};}export function rerankDemandMatches(a,b){const c=applyPolicyRerank(a['map'](e=>({'service':{'object':e['demand']['object'],...e['demand']['owner']!==undefined?{'owner':e['demand']['owner']}:{}},'result':e['result']})),b),d=new Map(a['map'](e=>[e['demand']['object'],e]));return{...c,'matches':c['matches']['map'](e=>d['get'](e['service']['object']))};}function canonicalize(a){if(Array['isArray'](a))return a['map'](canonicalize);if(a&&typeof a==='object'){const b={};for(const c of Object['keys'](a)['sort']()){b[c]=canonicalize(a[c]);}return b;}return a;}export function policyHash(a){return createHash('sha256')['update'](JSON['stringify'](canonicalize(a)))['digest']('hex');}export function buildPolicyEffect(a,b,c,d,e=[]){const f=[...new Set([...b['ignored'],...c['ignored'],...d['ignored'],...e])]['sort']();if(a['recall']!==undefined)f['push']('section\x20\x27recall\x27\x20is\x20a\x20server-side\x20directive\x20—\x20not\x20sent\x20upstream\x20from\x20a\x20private\x20policy;\x20recall\x20stays\x20on\x20the\x20route\x20in\x20effect');if(a['verify']!==undefined)f['push']('section\x20\x27verify\x27\x20not\x20enforceable\x20client-side\x20in\x20this\x20build');return{'policy_id':a['policy_id'],'version':a['version'],'direction':a['direction']??'demand_to_supply','policy_hash':policyHash(a),'unknown_policy':a['unknown_policy']??'neutral_score','dropped':b['dropped'],'unknown_kept':b['unknown_notes'],'weights_applied':c['applied'],'rerank':d['order'],'deferred_by_diversity':d['deferred'],'ignored':f['sort'](),'privacy':'client_side_only\x20—\x20the\x20policy\x20and\x20its\x20hash\x20never\x20leave\x20this\x20device'};}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ import{describe,expect,it}from'vitest';import{PRESET_MATCH_POLICIES,applyDemandPolicyGates,applyPolicyGates,applyPolicyRerank,buildPolicyEffect,policyHash,policyToInjection,rerankDemandMatches,resolveMatchPolicy}from'./match-policy.js';import{MatchPolicySchema}from'../schema/evaluation/index.js';function svc(a,b={}){return{'object':a,'description':'freelance\x20logo\x20design','location':'Shanghai','sales':[{'name':'logo','price':'100','wip_hash':'abc'}],'arbitrations':[],'bPublished':!![],'bPaused':![],...b};}describe('resolveMatchPolicy',()=>{it('resolves\x20preset\x20ids\x20case-insensitively\x20with\x20dash/underscore\x20tolerance',()=>{expect(resolveMatchPolicy('trust-first','demand_to_supply')?.['policy_id'])['toBe']('trust_first'),expect(resolveMatchPolicy('Cheap_And_Fast','demand_to_supply')?.['policy_id'])['toBe']('cheap_and_fast'),expect(resolveMatchPolicy(undefined,'demand_to_supply'))['toBeUndefined']();}),it('rejects\x20unknown\x20preset\x20ids\x20with\x20the\x20available\x20list',()=>{expect(()=>resolveMatchPolicy('nope','demand_to_supply'))['toThrow'](/available:.*default/);}),it('rejects\x20a\x20supply_to_demand\x20policy\x20on\x20a\x20demand_to_supply\x20query',()=>{expect(()=>resolveMatchPolicy('supplier_hunting','demand_to_supply'))['toThrow'](/direction/),expect(resolveMatchPolicy('supplier_hunting','supply_to_demand')?.['policy_id'])['toBe']('supplier_hunting');}),it('every\x20preset\x20passes\x20the\x20public\x20schema',()=>{for(const [a,b]of Object['entries'](PRESET_MATCH_POLICIES)){expect(MatchPolicySchema['safeParse'](b)['success'],a)['toBe'](!![]);}}),it('accepts\x20the\x20K5-05\x20§4.1\x20JSON\x20shape\x20including\x20not-yet-enforceable\x20sections',()=>{const a={'policy_id':'cross-border-retail-v1','version':0x3,'direction':'demand_to_supply','unknown_policy':'neutral_score','gates':[{'dim':'live','op':'eq','value':!![]},{'dim':'geo','op':'relation_in','value':['exact','contains'],'params':{'sensitivity':'logistics'}},{'dim':'price','op':'lte','value':'500','params':{'hard':!![]}},{'dim':'reputation','op':'custom','params':{'min_delivered':0x3}}],'excludes':[{'dim':'anti_cheat','flags':['self_buy']},{'dim':'blacklist','objects':['0xbad']}],'recall':{'text':{'mode':'hybrid'}},'weights':{'region':0xa,'price':0x19,'process_fit':0xf},'rerank':{'diversity':{'by':'owner','max_per_group':0x2},'explore':{'strategy':'epsilon_greedy'}},'verify':{'sampling_rate':0.01},'output':{'top_n':0x14}};expect(MatchPolicySchema['safeParse'](a)['success'])['toBe'](!![]);});}),describe('applyPolicyGates',()=>{const a={'budgetWei':0x96n};it('live\x20gate\x20drops\x20paused\x20candidates',()=>{const b={'policy_id':'t','gates':[{'dim':'live','op':'eq','value':!![]}]},c=applyPolicyGates(b,[svc('0xa'),svc('0xb',{'bPaused':!![]})]);expect(c['passed']['map'](d=>d['object']))['toEqual'](['0xa']),expect(c['dropped'][0x0])['toMatchObject']({'object':'0xb'}),expect(c['dropped'][0x0]['reason'])['toContain']('live=false');}),it('price\x20gate\x20binds\x20from\x20the\x20request\x20budget\x20via\x20from_budget',()=>{const b={'policy_id':'t','gates':[{'dim':'price','op':'lte','params':{'from_budget':!![],'hard':!![]}}]},c=applyPolicyGates(b,[svc('0xok'),svc('0xrich',{'sales':[{'price':'900'}]})],a);expect(c['passed']['map'](d=>d['object']))['toEqual'](['0xok']),expect(c['dropped'][0x0]['reason'])['toContain']('fails\x20lte\x20150');}),it('missing\x20input\x20is\x20unknown,\x20never\x20violated\x20(axiom\x203):\x20neutral_score\x20keeps\x20+\x20notes,\x20drop\x20eliminates',()=>{const b=svc('0xnp',{'sales':[]}),c={'dim':'price','op':'lte','value':'150'},d=applyPolicyGates({'policy_id':'t','gates':[c]},[b]);expect(d['passed'])['toHaveLength'](0x1),expect(d['unknown_notes'][0x0])['toMatchObject']({'object':'0xnp','dim':'price'});const e=applyPolicyGates({'policy_id':'t','unknown_policy':'drop','gates':[c]},[b]);expect(e['passed'])['toHaveLength'](0x0),expect(e['dropped'][0x0]['reason'])['toContain']('unknown_policy=drop');}),it('text\x20gates:\x20must_contain\x20/\x20must_not_contain\x20over\x20description\x20+\x20sale\x20names',()=>{const b={'policy_id':'t','gates':[{'dim':'text','op':'must_contain','value':'LOGO'},{'dim':'text','op':'must_not_contain','value':['mural']}]},c=applyPolicyGates(b,[svc('0xa'),svc('0xb',{'description':'mural\x20painting'})]);expect(c['passed']['map'](d=>d['object']))['toEqual'](['0xa']),expect(c['dropped'][0x0]['reason'])['toContain']('forbidden\x20term(s)\x20present:\x20mural');}),it('arb\x20+\x20machine\x20+\x20wip_verify\x20gates',()=>{const b={'policy_id':'t','gates':[{'dim':'arb','op':'gte','value':0x1},{'dim':'machine','op':'eq','value':!![]},{'dim':'wip_verify','op':'eq','value':!![]}]},c=applyPolicyGates(b,[svc('0xgood',{'arbitrations':['0xarb'],'machine':'0xm'}),svc('0xnoarb',{'machine':'0xm'}),svc('0xnowip',{'arbitrations':['0xarb'],'machine':'0xm','sales':[{'price':'5'}]})]);expect(c['passed']['map'](d=>d['object']))['toEqual'](['0xgood']),expect(c['dropped']['map'](e=>e['object']))['toEqual'](['0xnoarb','0xnowip']);}),it('blacklist\x20excludes\x20by\x20object\x20and\x20by\x20owner',()=>{const b={'policy_id':'t','excludes':[{'dim':'blacklist','objects':['0xbad'],'owners':['0xevilowner']}]},c=applyPolicyGates(b,[svc('0xa'),svc('0xbad'),svc('0xc',{'owner':'0xevilowner'})]);expect(c['passed']['map'](d=>d['object']))['toEqual'](['0xa']),expect(c['dropped']['map'](e=>e['reason']))['toEqual'](['excluded:\x20blacklisted\x20object','excluded:\x20blacklisted\x20owner']);}),it('non-enforceable\x20dims\x20are\x20reported\x20ignored\x20and\x20never\x20eliminate',()=>{const b={'policy_id':'t','gates':[{'dim':'geo','op':'relation_in','value':['exact']},{'dim':'reputation','op':'custom'}],'excludes':[{'dim':'anti_cheat','flags':['self_buy']}]},c=applyPolicyGates(b,[svc('0xa')]);expect(c['passed'])['toHaveLength'](0x1),expect(c['ignored']['join']('|'))['toContain']('geo'),expect(c['ignored']['join']('|'))['toContain']('reputation'),expect(c['ignored']['join']('|'))['toContain']('anti_cheat');});}),describe('policyToInjection',()=>{it('maps\x20registered\x20weights\x20to\x20rule\x20overrides\x20and\x20reports\x20unregistered\x20ids',()=>{const a=policyToInjection({'policy_id':'t','weights':{'price':0x19,'trust':0x14,'process_fit':0xf,'arb_guarantee':0x14}});expect(a['applied'])['toEqual']({'price':0x19,'trust':0x14}),expect(a['injection']['overrides']?.['rules'])['toEqual']({'price':{'weight':0x19},'trust':{'weight':0x14}}),expect(a['ignored']['join']('|'))['toContain']('process_fit'),expect(a['ignored']['join']('|'))['toContain']('arb_guarantee');});}),describe('applyPolicyRerank',()=>{const a=(b,c,d)=>({'service':{'object':b,'owner':d},'result':{'total':c},'location':{'relation':'exact','satisfied':!![],'score':0x1,'reason':''}});it('final\x20private\x20order:\x20total\x20DESC\x20then\x20object\x20ASC\x20(K5-A10)',()=>{const b=applyPolicyRerank([a('0xb',0x32),a('0xa',0x46),a('0xc',0x46)],{'policy_id':'t'});expect(b['matches']['map'](c=>c['service']['object']))['toEqual'](['0xa','0xc','0xb']),expect(b['order'])['toContain']('total\x20DESC,\x20object_id\x20ASC');}),it('diversity\x20cap\x20defers\x20overflow\x20candidates\x20to\x20the\x20tail,\x20deterministically',()=>{const b=applyPolicyRerank([a('0xa1',0x5a,'0xshop'),a('0xa2',0x50,'0xshop'),a('0xa3',0x46,'0xshop'),a('0xb1',0x3c,'0xother')],{'policy_id':'t','rerank':{'diversity':{'by':'owner','max_per_group':0x2}}});expect(b['matches']['map'](c=>c['service']['object']))['toEqual'](['0xa1','0xa2','0xb1','0xa3']),expect(b['diversity_applied'])['toBe'](!![]),expect(b['deferred'])['toBe'](0x1);}),it('output.top_n\x20slices\x20after\x20ordering',()=>{const b=applyPolicyRerank([a('0xa',0xa),a('0xb',0x5a),a('0xc',0x32)],{'policy_id':'t','output':{'top_n':0x2}});expect(b['matches']['map'](c=>c['service']['object']))['toEqual'](['0xb','0xc']);}),it('reports\x20non-enforceable\x20rerank\x20sections\x20instead\x20of\x20silently\x20ignoring',()=>{const b=applyPolicyRerank([a('0xa',0xa)],{'policy_id':'t','rerank':{'diversity':{'by':'permission','max_per_group':0x1},'llm':{'enabled':!![]}}});expect(b['diversity_applied'])['toBe'](![]),expect(b['ignored']['join']('|'))['toContain']('permission'),expect(b['ignored']['join']('|'))['toContain']('llm');});}),describe('applyDemandPolicyGates\x20(supply→demand,\x20K5-05\x20§4)',()=>{function a(b,c={}){return{'object':b,'description':'need\x20a\x20freelance\x20logo\x20redesign','location':'Shanghai','rewards':['0xr1'],'um':'0xum','guards':[],'presenters_count':0x0,...c};}it('text\x20+\x20location\x20gates\x20judge\x20the\x20demand\x20description/location',()=>{const b=applyDemandPolicyGates({'policy_id':'t','gates':[{'dim':'text','op':'must_contain','value':'logo'}]},[a('0xa'),a('0xc',{'description':'kitchen\x20remodel'})]);expect(b['passed']['map'](d=>d['object']))['toEqual'](['0xa']),expect(b['dropped'][0x0]['reason'])['toContain']('missing\x20term(s):\x20logo');const c=applyDemandPolicyGates({'policy_id':'t','gates':[{'dim':'location','op':'must_not_contain','value':['shenzhen']}]},[a('0xa'),a('0xb',{'location':'Shenzhen\x20bay'})]);expect(c['passed']['map'](d=>d['object']))['toEqual'](['0xa']),expect(c['dropped'][0x0]['reason'])['toContain']('forbidden\x20term(s)\x20in\x20location:\x20shenzhen');}),it('reward\x20/\x20messenger\x20/\x20guard\x20/\x20presenters\x20gates',()=>{const b={'policy_id':'t','gates':[{'dim':'reward','op':'gte','value':0x2},{'dim':'messenger','op':'eq','value':!![]},{'dim':'guard','op':'eq','value':![]},{'dim':'presenters','op':'lte','value':0x3}]},c=applyDemandPolicyGates(b,[a('0xok',{'rewards':['0xr1','0xr2']}),a('0xfew',{'um':null}),a('0xguarded',{'rewards':['0xr1','0xr2','0xr3'],'guards':[{'guard':'0xg'}]}),a('0xcrowded',{'rewards':['0xr1','0xr2'],'presenters_count':0x5})]);expect(c['passed']['map'](d=>d['object']))['toEqual'](['0xok']);}),it('missing\x20demand\x20input\x20is\x20unknown,\x20never\x20violated\x20(axiom\x203)',()=>{const b={'dim':'reward','op':'gte','value':0x2},c=applyDemandPolicyGates({'policy_id':'t','gates':[b]},[a('0xnorewards',{'rewards':undefined})]);expect(c['passed'])['toHaveLength'](0x1),expect(c['unknown_notes'][0x0])['toMatchObject']({'object':'0xnorewards','dim':'reward'});const d=applyDemandPolicyGates({'policy_id':'t','unknown_policy':'drop','gates':[b]},[a('0xnorewards',{'rewards':undefined})]);expect(d['passed'])['toHaveLength'](0x0),expect(d['dropped'][0x0]['reason'])['toContain']('unknown_policy=drop');}),it('a\x20price\x20gate\x20is\x20reported\x20ignored\x20on\x20the\x20demand\x20side\x20(budget\x20lives\x20in\x20unreadable\x20Reward\x20guards)',()=>{const b={'policy_id':'t','gates':[{'dim':'price','op':'lte','value':'100'}]},c=applyDemandPolicyGates(b,[a('0xa')]);expect(c['passed'])['toHaveLength'](0x1),expect(c['ignored']['join']('|'))['toContain']('price');}),it('blacklist\x20excludes\x20apply\x20to\x20demands\x20by\x20object\x20and\x20owner',()=>{const b={'policy_id':'t','excludes':[{'dim':'blacklist','objects':['0xbad'],'owners':['0xevil']}]},c=applyDemandPolicyGates(b,[a('0xa'),a('0xbad'),a('0xc',{'owner':'0xevil'})]);expect(c['passed']['map'](d=>d['object']))['toEqual'](['0xa']);});}),describe('rerankDemandMatches\x20(supply→demand\x20final\x20ordering)',()=>{const a=(b,c,d)=>({'demand':{'object':b,'owner':d},'result':{'total':c},'next':{'operation':'demand.present'}});it('orders\x20by\x20total\x20DESC\x20then\x20object\x20ASC,\x20keeps\x20the\x20original\x20match\x20objects',()=>{const c=a('0xb',0x32),d=a('0xa',0x46),e=rerankDemandMatches([c,d],{'policy_id':'t'});expect(e['matches']['map'](f=>f['demand']['object']))['toEqual'](['0xa','0xb']),expect(e['matches'][0x0])['toBe'](d),expect(e['order'])['toContain']('total\x20DESC,\x20object_id\x20ASC');}),it('output.top_n\x20slices\x20after\x20ordering',()=>{const b=rerankDemandMatches([a('0xa',0xa),a('0xb',0x5a),a('0xc',0x32)],{'policy_id':'t','output':{'top_n':0x2}});expect(b['matches']['map'](c=>c['demand']['object']))['toEqual'](['0xb','0xc']);});}),describe('policyHash\x20+\x20buildPolicyEffect',()=>{it('hash\x20is\x20deterministic\x20and\x20key-order\x20independent',()=>{const c={'policy_id':'p','weights':{'price':0x19,'trust':0x14},'unknown_policy':'drop'},d={'unknown_policy':'drop','weights':{'trust':0x14,'price':0x19},'policy_id':'p'};expect(policyHash(c))['toBe'](policyHash(d)),expect(policyHash({...c,'policy_id':'q'}))['not']['toBe'](policyHash(c));}),it('effect\x20report\x20carries\x20drops,\x20unknowns,\x20weights,\x20ignored\x20and\x20the\x20privacy\x20note',()=>{const a={'policy_id':'t','version':0x2,'gates':[{'dim':'arb','op':'gte','value':0x1},{'dim':'stake','op':'gte','value':0x3e8}],'weights':{'trust':0x1e},'recall':{'text':{'mode':'hybrid'}}},b=applyPolicyGates(a,[svc('0xnoarb')]),c=policyToInjection(a),d=applyPolicyRerank([],a),e=buildPolicyEffect(a,b,c,d);expect(e['policy_id'])['toBe']('t'),expect(e['version'])['toBe'](0x2),expect(e['dropped'][0x0]['object'])['toBe']('0xnoarb'),expect(e['weights_applied'])['toEqual']({'trust':0x1e}),expect(e['ignored']['join']('|'))['toContain']('stake'),expect(e['ignored']['join']('|'))['toContain']('recall'),expect(e['privacy'])['toContain']('never\x20leave\x20this\x20device');});});
@@ -1 +1 @@
1
- import{distillIntent,extractSignals}from'./intent-distill.js';import{getProfile,updateFromOperation}from'./user-profile.js';import{findMatches,recordSignature}from'./experience-reuse.js';import{EXPERIENCE_LAYER_VERSION}from'./types.js';import{isEnabled as a66a}from'../config/index.js';import{recordIndustrySignal}from'../knowledge/flywheel-loop.js';export{EXPERIENCE_LAYER_VERSION};export function getExperienceFeedback(a,b,c){try{const d=distillIntent(a,b,c),e=findMatches(d['primary_intent'],a,b,0x3);if(e['length']===0x0)return undefined;const f=e[0x0],g=getProfile();return formatFeedback(f,e,d['scenario'],g);}catch{return undefined;}}export function recordOperationOutcome(a,b,c,d,e,f=[]){try{const g=distillIntent(a,b,c),h=extractSignals(a,b);recordSignature({'intent':g['primary_intent'],'scenario':g['scenario'],'signals':h,'timestamp':Date['now'](),'outcome':d,'error_code':e}),updateFromOperation(g['primary_intent'],g['scenario'],d,e,f);try{if(a66a('industry_evolution')){const i=typeof b?.['industry']==='string'&&b['industry']['trim']()?b['industry']['trim']():undefined;if(i){const j=d==='success'?{'success':!![]}:{'success':![],'error_code':e};recordIndustrySignal(i,{'type':a,'data':b},j);}}}catch{}}catch{}}function formatFeedback(a,b,c,d){const e=buildAdviceText(a,b,d),f=collectAvoidList(b,d),g=a['relevance'],h=c??a['signature']['scenario'],i={};if(e)i['advice']=e;if(f['length']>0x0)i['avoid']=f;if(g>0x0)i['relevance']=Math['round'](g*0x64)/0x64;if(h)i['matched_scenario']=h;return i;}function buildAdviceText(a,b,c){const d=[];if(a['signature']['outcome']==='success')d['push']('Historically,\x20'+a['signature']['intent']+'\x20operation\x20succeeded');else a['signature']['outcome']==='failed'&&d['push']('Historically,\x20'+a['signature']['intent']+'\x20operation\x20failed\x20('+(a['signature']['error_code']??'unknown\x20error')+'),\x20pay\x20special\x20attention\x20to\x20parameters');return c['expertise_tier']==='novice'&&b['length']>0x0&&d['push']('It\x20is\x20recommended\x20to\x20carefully\x20check\x20parameters\x20before\x20executing'),d['join'](';\x20')||a['advice'];}function collectAvoidList(b,c){const d=new Set();for(const e of b){for(const f of e['avoid']){d['add'](f);}}for(const g of c['frequent_pitfalls']){d['add']('You\x20often\x20make\x20mistakes\x20at\x20the\x20'+g+'\x20step,\x20please\x20be\x20especially\x20careful');}return Array['from'](d)['slice'](0x0,0x5);}
1
+ import{distillIntent,extractSignals}from'./intent-distill.js';import{getProfile,updateFromOperation}from'./user-profile.js';import{findMatches,recordSignature}from'./experience-reuse.js';import{EXPERIENCE_LAYER_VERSION}from'./types.js';import{isEnabled as a100a}from'../config/index.js';import{recordIndustrySignal}from'../knowledge/flywheel-loop.js';export{EXPERIENCE_LAYER_VERSION};export function getExperienceFeedback(a,b,c){try{const d=distillIntent(a,b,c),e=findMatches(d['primary_intent'],a,b,0x3);if(e['length']===0x0)return undefined;const f=e[0x0],g=getProfile();return formatFeedback(f,e,d['scenario'],g);}catch{return undefined;}}export function recordOperationOutcome(a,b,c,d,e,f=[]){try{const g=distillIntent(a,b,c),h=extractSignals(a,b);recordSignature({'intent':g['primary_intent'],'scenario':g['scenario'],'signals':h,'timestamp':Date['now'](),'outcome':d,'error_code':e}),updateFromOperation(g['primary_intent'],g['scenario'],d,e,f);try{if(a100a('industry_evolution')){const i=typeof b?.['industry']==='string'&&b['industry']['trim']()?b['industry']['trim']():undefined;if(i){const j=d==='success'?{'success':!![]}:{'success':![],'error_code':e};recordIndustrySignal(i,{'type':a,'data':b},j);}}}catch{}}catch{}}function formatFeedback(a,b,c,d){const e=buildAdviceText(a,b,d),f=collectAvoidList(b,d),g=a['relevance'],h=c??a['signature']['scenario'],i={};if(e)i['advice']=e;if(f['length']>0x0)i['avoid']=f;if(g>0x0)i['relevance']=Math['round'](g*0x64)/0x64;if(h)i['matched_scenario']=h;return i;}function buildAdviceText(a,b,c){const d=[];if(a['signature']['outcome']==='success')d['push']('Historically,\x20'+a['signature']['intent']+'\x20operation\x20succeeded');else a['signature']['outcome']==='failed'&&d['push']('Historically,\x20'+a['signature']['intent']+'\x20operation\x20failed\x20('+(a['signature']['error_code']??'unknown\x20error')+'),\x20pay\x20special\x20attention\x20to\x20parameters');return c['expertise_tier']==='novice'&&b['length']>0x0&&d['push']('It\x20is\x20recommended\x20to\x20carefully\x20check\x20parameters\x20before\x20executing'),d['join'](';\x20')||a['advice'];}function collectAvoidList(b,c){const d=new Set();for(const e of b){for(const f of e['avoid']){d['add'](f);}}for(const g of c['frequent_pitfalls']){d['add']('You\x20often\x20make\x20mistakes\x20at\x20the\x20'+g+'\x20step,\x20please\x20be\x20especially\x20careful');}return Array['from'](d)['slice'](0x0,0x5);}