@wowok/agent-mcp 3.2.7 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/chain-semantics/field-capability.js +1 -1
- package/dist/chain-semantics/freeze-map.js +1 -1
- package/dist/chain-semantics/fund-flow.js +1 -1
- package/dist/chain-semantics/guard-verbs.js +1 -1
- package/dist/chain-semantics/object-graph.js +1 -1
- package/dist/composition/audit.js +1 -1
- package/dist/composition/compile.d.ts +10 -1
- package/dist/composition/compile.js +1 -1
- package/dist/composition/inflight.d.ts +10 -0
- package/dist/composition/inflight.js +1 -1
- package/dist/extensions/business-modules.d.ts +1 -1
- package/dist/extensions/business-modules.js +1 -1
- package/dist/extensions/capability-manifest.js +1 -1
- package/dist/extensions/industry-audit.spec.js +1 -1
- package/dist/extensions/industry-pack.js +1 -1
- package/dist/graph/onchain/edge-schema.js +1 -1
- package/dist/graph/onchain/facts.spec.js +1 -1
- package/dist/graph/onchain/field-manifest.js +1 -1
- package/dist/harness/index.d.ts +1 -0
- package/dist/harness/index.js +1 -1
- package/dist/harness/operation-id.d.ts +1 -0
- package/dist/harness/operation-id.js +1 -0
- package/dist/harness/recover.js +1 -1
- package/dist/index.js +1 -1
- package/dist/intent/types.d.ts +1 -1
- package/dist/intent/types.js +1 -1
- package/dist/keeper/KeeperScan.d.ts +2 -1
- package/dist/keeper/KeeperScan.js +1 -1
- package/dist/keeper/keeper.spec.js +1 -1
- package/dist/keeper/types.d.ts +3 -0
- package/dist/keeper/types.js +1 -1
- package/dist/knowledge/allocator-rail-verifier.d.ts +34 -0
- package/dist/knowledge/allocator-rail-verifier.js +1 -0
- package/dist/knowledge/arbitration-ledger.js +1 -1
- package/dist/knowledge/arbitration-templates.js +1 -1
- package/dist/knowledge/arbitration-venue-order.js +1 -1
- package/dist/knowledge/audit-rules.d.ts +19 -1
- package/dist/knowledge/audit-rules.js +1 -1
- package/dist/knowledge/baselines/rules/alloc_audit.json +1 -1
- package/dist/knowledge/baselines/rules/arb.json +1 -1
- package/dist/knowledge/baselines/rules/guard.json +106 -1
- package/dist/knowledge/baselines/rules/machine.json +9 -6
- package/dist/knowledge/baselines/rules/plan.json +40 -17
- package/dist/knowledge/baselines/semantic-facts.js +1 -1
- package/dist/knowledge/builtin-templates.d.ts +1 -1
- package/dist/knowledge/builtin-templates.js +1 -1
- package/dist/knowledge/contract-invariants.js +1 -1
- package/dist/knowledge/discount-threshold.d.ts +11 -0
- package/dist/knowledge/discount-threshold.js +1 -1
- package/dist/knowledge/event-semantics.js +1 -1
- package/dist/knowledge/fund-layer.js +1 -1
- package/dist/knowledge/getting-started.js +1 -1
- package/dist/knowledge/guard-anchor-reach.d.ts +1 -1
- package/dist/knowledge/guard-anchor-reach.js +1 -1
- package/dist/knowledge/guard-bindings.js +1 -1
- package/dist/knowledge/guard-design-patterns.d.ts +1 -1
- package/dist/knowledge/guard-design-patterns.js +1 -1
- package/dist/knowledge/guard-field-cognition.js +1 -1
- package/dist/knowledge/guard-ledger.js +1 -1
- package/dist/knowledge/guard-lint.js +1 -1
- package/dist/knowledge/guard-render.js +1 -1
- package/dist/knowledge/guard-risk.d.ts +1 -0
- package/dist/knowledge/guard-risk.js +1 -1
- package/dist/knowledge/guard-submission-brief.d.ts +6 -0
- package/dist/knowledge/guard-submission-brief.js +1 -1
- package/dist/knowledge/guard-templates.d.ts +2 -2
- package/dist/knowledge/guard-templates.js +1 -1
- package/dist/knowledge/index.js +1 -1
- package/dist/knowledge/industry-registry.js +1 -1
- package/dist/knowledge/industry-strategy.js +1 -1
- package/dist/knowledge/jsonrpc-enum.js +1 -1
- package/dist/knowledge/machine-ledger.js +1 -1
- package/dist/knowledge/machine-puzzle.d.ts +1 -1
- package/dist/knowledge/machine-puzzle.js +1 -1
- package/dist/knowledge/machine-risk.js +1 -1
- package/dist/knowledge/machine-templates.js +1 -1
- package/dist/knowledge/machine-topology.d.ts +8 -0
- package/dist/knowledge/machine-topology.js +1 -1
- package/dist/knowledge/machine-translation.js +1 -1
- package/dist/knowledge/order-ledger.js +1 -1
- package/dist/knowledge/permission-ledger.js +1 -1
- package/dist/knowledge/protocol-facts.d.ts +16 -0
- package/dist/knowledge/protocol-facts.js +1 -0
- package/dist/knowledge/recipient-constraint.js +1 -1
- package/dist/knowledge/reward-ledger.d.ts +2 -1
- package/dist/knowledge/reward-ledger.js +1 -1
- package/dist/knowledge/reward-templates.js +1 -1
- package/dist/knowledge/safety-rules.d.ts +0 -2
- package/dist/knowledge/safety-rules.js +1 -1
- package/dist/knowledge/scenario-modes.d.ts +7 -0
- package/dist/knowledge/scenario-modes.js +1 -1
- package/dist/knowledge/strategy-manuals.js +1 -1
- package/dist/knowledge/template-loader.d.ts +13 -1
- package/dist/knowledge/template-loader.js +1 -1
- package/dist/knowledge/template-registry.js +1 -1
- package/dist/knowledge/template-scanner.d.ts +2 -0
- package/dist/knowledge/template-scanner.js +1 -1
- package/dist/knowledge/tool-constraints.js +1 -1
- package/dist/knowledge/tools-reference.js +1 -1
- package/dist/knowledge/workflow-guidance.d.ts +7 -3
- package/dist/knowledge/workflow-guidance.js +1 -1
- package/dist/monitor/MonitorLoop.js +1 -1
- package/dist/monitor/normalize.d.ts +1 -1
- package/dist/monitor/normalize.js +1 -1
- package/dist/monitor/types.d.ts +1 -1
- package/dist/monitor/types.js +1 -1
- package/dist/participation/radar-core.d.ts +1 -1
- package/dist/playbooks/service-build/business-puzzle.js +1 -1
- package/dist/playbooks/service-build/game-theory.d.ts +1 -0
- package/dist/playbooks/service-build/game-theory.js +1 -1
- package/dist/playbooks/service-build/intent-analyzer.js +1 -1
- package/dist/playbooks/service-build/machine-panorama.js +1 -1
- package/dist/playbooks/service-build/merchant-guide.d.ts +8 -0
- package/dist/playbooks/service-build/merchant-guide.js +1 -1
- package/dist/playbooks/service-build/object-panorama.d.ts +28 -1
- package/dist/playbooks/service-build/object-panorama.js +1 -1
- package/dist/playbooks/service-build/participation-radar.d.ts +2 -0
- package/dist/playbooks/service-build/participation-radar.js +1 -1
- package/dist/playbooks/service-build/relationship-profile.js +1 -1
- package/dist/playbooks/service-build/reverse-mapping-nk4.spec.js +1 -1
- package/dist/playbooks/service-build/reverse-mapping.js +1 -1
- package/dist/playbooks/service-build/service-panorama.js +1 -1
- package/dist/playbooks/service-build/service-quote.js +1 -1
- package/dist/playbooks/service-build/service-quote.spec.js +1 -1
- package/dist/relationship/registry.js +1 -1
- package/dist/review/index.js +1 -1
- package/dist/role/profiles.js +1 -1
- package/dist/safety/confirm-gate.js +1 -1
- package/dist/safety/preview.d.ts +1 -0
- package/dist/safety/preview.js +1 -1
- package/dist/schema/benchmark-migration/index.d.ts +19 -1
- package/dist/schema/benchmark-migration/index.js +1 -1
- package/dist/schema/call/allocation.d.ts +1 -1
- package/dist/schema/call/arbitration.d.ts +8 -8
- package/dist/schema/call/arbitration.js +1 -1
- package/dist/schema/call/base.d.ts +52 -5
- package/dist/schema/call/base.js +1 -1
- package/dist/schema/call/bridge.d.ts +3 -0
- package/dist/schema/call/contact.d.ts +5 -5
- package/dist/schema/call/demand.d.ts +5 -5
- package/dist/schema/call/error-codes.d.ts +1 -1
- package/dist/schema/call/error-codes.js +1 -1
- package/dist/schema/call/guard.d.ts +3 -3
- package/dist/schema/call/guard.js +1 -1
- package/dist/schema/call/handler.js +1 -1
- package/dist/schema/call/machine.d.ts +13 -5
- package/dist/schema/call/machine.js +1 -1
- package/dist/schema/call/order.d.ts +5 -5
- package/dist/schema/call/order.js +1 -1
- package/dist/schema/call/permission.d.ts +5 -5
- package/dist/schema/call/personal.d.ts +4 -4
- package/dist/schema/call/progress.d.ts +5 -5
- package/dist/schema/call/progress.js +1 -1
- package/dist/schema/call/proof.js +1 -1
- package/dist/schema/call/receipt.d.ts +8 -0
- package/dist/schema/call/receipt.js +1 -1
- package/dist/schema/call/repository.d.ts +9 -9
- package/dist/schema/call/repository.js +1 -1
- package/dist/schema/call/reward.d.ts +25 -5
- package/dist/schema/call/reward.js +1 -1
- package/dist/schema/call/semantic.js +1 -1
- package/dist/schema/call/service.d.ts +10 -5
- package/dist/schema/call/service.js +1 -1
- package/dist/schema/call/treasury.d.ts +5 -5
- package/dist/schema/common/index.d.ts +6 -6
- package/dist/schema/common/index.js +1 -1
- package/dist/schema/goal/index.d.ts +17 -1
- package/dist/schema/goal/planning.d.ts +28 -2
- package/dist/schema/goal/planning.js +1 -1
- package/dist/schema/industry-pack/index.d.ts +3 -0
- package/dist/schema/industry-pack/index.js +1 -1
- package/dist/schema/intent-radar/index.d.ts +9 -0
- package/dist/schema/intent-radar/index.js +1 -1
- package/dist/schema/local/index.d.ts +31 -0
- package/dist/schema/local/index.js +1 -1
- package/dist/schema/messenger/index.js +1 -1
- package/dist/schema/operations.d.ts +57 -43
- package/dist/schema/operations.js +1 -1
- package/dist/schema/query/bi.d.ts +22 -6
- package/dist/schema/query/bi.js +1 -1
- package/dist/schema/query/index.d.ts +164 -102
- package/dist/schema/query/index.js +1 -1
- package/dist/schema/schema-query/index.d.ts +2 -0
- package/dist/schema/schema-query/index.js +1 -1
- package/dist/schema/schema-version.js +1 -1
- package/dist/schema/utils/permission-machine-check.d.ts +2 -0
- package/dist/schema/utils/permission-machine-check.js +1 -1
- package/dist/schema/workflow/index.d.ts +1 -1
- package/dist/schema-query-impl/index.d.ts +1 -1
- package/dist/schema-query-impl/index.js +1 -1
- package/dist/schemas/account_operation.output.json +3 -0
- package/dist/schemas/account_operation.schema.json +4 -4
- package/dist/schemas/benchmark_migration_operation.output.json +42 -0
- package/dist/schemas/benchmark_migration_operation.schema.json +40 -3
- package/dist/schemas/bridge_operation.output.json +3 -0
- package/dist/schemas/goal_operation.schema.json +52 -2
- package/dist/schemas/index.json +1 -1
- package/dist/schemas/industry_pack_operation.output.json +8 -0
- package/dist/schemas/industry_pack_operation.schema.json +9 -0
- package/dist/schemas/intent_radar.output.json +8 -2
- package/dist/schemas/intent_radar.schema.json +4 -1
- package/dist/schemas/local_cache_operation.output.json +3 -0
- package/dist/schemas/local_history_operation.output.json +3 -0
- package/dist/schemas/local_info_operation.output.json +3 -0
- package/dist/schemas/local_mark_operation.output.json +3 -0
- package/dist/schemas/messenger_operation.schema.json +4 -4
- package/dist/schemas/monitor_events.schema.json +3 -1
- package/dist/schemas/onchain_events.output.json +275 -11
- package/dist/schemas/onchain_events.schema.json +25 -1
- package/dist/schemas/onchain_operations.output.json +47 -5
- package/dist/schemas/onchain_operations.schema.json +664 -179
- package/dist/schemas/onchain_operations_allocation.schema.json +7 -7
- package/dist/schemas/onchain_operations_arbitration.schema.json +21 -15
- package/dist/schemas/onchain_operations_contact.schema.json +15 -10
- package/dist/schemas/onchain_operations_demand.schema.json +15 -10
- package/dist/schemas/onchain_operations_gen_passport.schema.json +5 -5
- package/dist/schemas/onchain_operations_gen_proof.schema.json +1 -1
- package/dist/schemas/onchain_operations_guard.schema.json +346 -8
- package/dist/schemas/onchain_operations_machine.schema.json +24 -11
- package/dist/schemas/onchain_operations_order.schema.json +17 -12
- package/dist/schemas/onchain_operations_permission.schema.json +10 -5
- package/dist/schemas/onchain_operations_personal.schema.json +2 -2
- package/dist/schemas/onchain_operations_progress.schema.json +17 -12
- package/dist/schemas/onchain_operations_proof.schema.json +6 -6
- package/dist/schemas/onchain_operations_repository.schema.json +19 -14
- package/dist/schemas/onchain_operations_reward.schema.json +96 -15
- package/dist/schemas/onchain_operations_service.schema.json +33 -21
- package/dist/schemas/onchain_operations_treasury.schema.json +15 -10
- package/dist/schemas/onchain_table_data.output.json +7 -7
- package/dist/schemas/query_toolkit.output.json +268 -44
- package/dist/schemas/query_toolkit.schema.json +1 -1
- package/dist/schemas/schema_query.schema.json +7 -2
- package/dist/schemas/workflow_operation.schema.json +5 -5
- package/dist/schemas/wowok_buildin_info.output.json +140 -3
- package/dist/schemas/wowok_buildin_info.schema.json +2 -2
- package/dist/tools/handlers/benchmark-migration.d.ts +66 -1
- package/dist/tools/handlers/benchmark-migration.js +1 -1
- package/dist/tools/handlers/config.js +1 -1
- package/dist/tools/handlers/dispatch-expectations.d.ts +0 -1
- package/dist/tools/handlers/dispatch-expectations.js +1 -1
- package/dist/tools/handlers/industry-pack.js +1 -1
- package/dist/tools/handlers/intent-radar.js +1 -1
- package/dist/tools/handlers/keeper.d.ts +1 -1
- package/dist/tools/handlers/local.js +1 -1
- package/dist/tools/handlers/onchain.d.ts +12 -0
- package/dist/tools/handlers/onchain.js +1 -1
- package/dist/tools/handlers/query.d.ts +1 -0
- package/dist/tools/handlers/query.js +1 -1
- package/dist/tools/handlers/review-chain.js +1 -1
- package/dist/tools/handlers/schema-query.js +1 -1
- package/dist/tools/handlers/workflow.js +1 -1
- package/dist/tools/index.js +1 -1
- package/dist/tools/move-fn-index.gen.js +1 -1
- package/dist/tools/registry/agent.js +1 -1
- package/dist/tools/registry/business.js +1 -1
- package/dist/tools/registry/files.js +1 -1
- package/dist/tools/registry/query.js +1 -1
- package/dist/tools/rules-hook.js +1 -1
- package/dist/tools/upgrade-check.d.ts +23 -0
- package/dist/tools/upgrade-check.js +1 -1
- package/dist/tools/wip-deploy-assist.d.ts +6 -0
- package/dist/tools/wip-deploy-assist.js +1 -1
- package/dist/tools/wrap.js +1 -1
- package/package.json +2 -2
|
@@ -110,6 +110,33 @@ export interface OrderPanoramaResult extends PanoBase {
|
|
|
110
110
|
updated_ms: number | null;
|
|
111
111
|
related: PanoRelatedList;
|
|
112
112
|
}
|
|
113
|
+
export interface AllocationPanoramaResult extends PanoBase {
|
|
114
|
+
object_type: "Allocation";
|
|
115
|
+
coin_type: string | null;
|
|
116
|
+
fields: {
|
|
117
|
+
balance: string | null;
|
|
118
|
+
balance_display: string;
|
|
119
|
+
balance_tip: string;
|
|
120
|
+
threshold: string | null;
|
|
121
|
+
for_object: string | null;
|
|
122
|
+
for_guard: string | null;
|
|
123
|
+
remark: string | null;
|
|
124
|
+
index: string | null;
|
|
125
|
+
};
|
|
126
|
+
allocators: {
|
|
127
|
+
guard: string | null;
|
|
128
|
+
sharing: {
|
|
129
|
+
who_kind: "guard_identifier" | "entity" | "signer" | "unknown";
|
|
130
|
+
who_value: string | number | null;
|
|
131
|
+
resolution_note: string;
|
|
132
|
+
sharing: string | null;
|
|
133
|
+
mode: number | null;
|
|
134
|
+
mode_label: string;
|
|
135
|
+
}[];
|
|
136
|
+
}[];
|
|
137
|
+
updated_ms: number | null;
|
|
138
|
+
related: PanoRelatedList;
|
|
139
|
+
}
|
|
113
140
|
export interface ArbPanoramaResult extends PanoBase {
|
|
114
141
|
object_type: "Arb";
|
|
115
142
|
coin_type: string | null;
|
|
@@ -239,7 +266,7 @@ export interface ProofPanoramaResult extends PanoBase {
|
|
|
239
266
|
};
|
|
240
267
|
wts_anchor_check?: AnchorCrossCheck;
|
|
241
268
|
}
|
|
242
|
-
export type ObjectPanoramaResult = ProgressPanoramaResult | DemandPanoramaResult | OrderPanoramaResult | ArbPanoramaResult | ArbitrationPanoramaResult | RepositoryPanoramaResult | ProofPanoramaResult;
|
|
269
|
+
export type ObjectPanoramaResult = ProgressPanoramaResult | DemandPanoramaResult | OrderPanoramaResult | AllocationPanoramaResult | ArbPanoramaResult | ArbitrationPanoramaResult | RepositoryPanoramaResult | ProofPanoramaResult;
|
|
243
270
|
export declare function coinOfTypeRaw(typeRaw: unknown): string | null;
|
|
244
271
|
export declare function handleObjectPanorama(v: ProjectInput): Promise<ObjectPanoramaResult>;
|
|
245
272
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Config,LocalMark,query_objects,query_object_last_updated,objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{createHash}from'node:crypto';import{checkWtsProofAnchor,readWtsDocument}from'../../communication/wts-attestation.js';import{resolveAddress as a330a}from'../../tools/handlers/name-resolution.js';import{batchReadAddressKeyedFields,batchQueryObjectsByIds,fetchObjectLinkerTx,ringWindowSaturated}from'../../graph/onchain/sdk-batch.js';import{formatMoneyAnnotation}from'./facet-money.js';const js=a=>{if(typeof a==='bigint')return a['toString']();if(a&&typeof a==='object'&&!Array['isArray'](a)){const b={};for(const [c,d]of Object['entries'](a)){b[c]=js(d);}return b;}if(Array['isArray'](a))return a['map'](js);return a;},str=a=>a===null||a===undefined?null:String(a),ownerAddr=a=>{if(typeof a==='string')return a;const b=a;if(b&&typeof b==='object'){if(typeof b['AddressOwner']==='string')return b['AddressOwner'];if(typeof b['ObjectOwner']==='string')return b['ObjectOwner'];const c=Object['values'](b)['find'](d=>typeof d==='string'&&d['length']>0x14);if(typeof c==='string')return c;}return null;},num=a=>{if(typeof a==='bigint')return Number(a);if(typeof a==='number')return Number['isFinite'](a)?a:null;if(typeof a==='string'&&a['trim']()!==''){const b=Number(a);return Number['isFinite'](b)?b:null;}return null;},arr=a=>Array['isArray'](a)?a:[];export function coinOfTypeRaw(a){if(typeof a!=='string'||!a)return null;const b=a['match'](/<(.+)>$/),c=b?.[0x1]?.['trim']();return c&&c['includes']('::')?c:null;}const RELATED_PREVIEW_CAP=0x32;async function buildRelatedList(a,b,c,d,e){const f={'key':a,'items':[],'count':0x0,'window_saturated':![],'preview_truncated':![]};if(!a)return f;try{const g=await fetchObjectLinkerTx(a,c,!![]),h=g?.['items']??[];f['window_saturated']=ringWindowSaturated(h['length']);const j=[];for(const k of h){const l=typeof k?.['who']==='string'?k['who']:'';if(!l||l['toLowerCase']()===b['toLowerCase']())continue;let m;try{m=objectTypeFromAddress(l);}catch{}if(!m)continue;j['push']({'address':l,'object_type':m,'time':typeof k?.['time']==='number'?k['time']:null});}f['count']=j['length'],f['items']=j['slice'](-RELATED_PREVIEW_CAP)['reverse'](),f['preview_truncated']=j['length']>f['items']['length'];}catch{d['push']('related:\x20ObjectLinkerTx('+e+')\x20lookup\x20failed');}return f;}const ARB_STATUS_NAMES={0x0:'Principal_confirming',0x1:'Arbitrator_confirming',0x2:'Voting',0x3:'Arbitrated',0x4:'Objectionable',0x5:'Finished',0x6:'Withdrawn'};async function resolveObject(a,b){const c=await a330a(a,'object_address');let d=b??undefined,f=null;if(!d)d=await Config['Instance']()['network_get']();try{const g=await query_objects({'objects':[c],'network':d});f=g?.['objects']?.[0x0]??null;if(!f&&b){const h=await Config['Instance']()['network_get']();if(h&&h!==d){const i=await query_objects({'objects':[c],'network':h,'no_cache':!![]}),j=i?.['objects']?.[0x0]??null;j&&(f=j,d=h);}}}catch(k){throw new Error('Failed\x20to\x20query\x20'+c+'\x20on\x20'+d+':\x20'+(k instanceof Error?k['message']:String(k)));}if(!f)throw new Error(c+'\x20not\x20found\x20on\x20'+d+'.\x20It\x20may\x20not\x20exist\x20on\x20this\x20network.');return f['object']=f['object']??c,{'network':String(d),'obj':f};}async function resolveHead(a,b,c){let d=null,e=[];try{const f=await LocalMark['Instance']()['list']({'address':a});f['length']>0x0&&(d=f[0x0]['name']??null,e=(f[0x0]['tags']??[])['map'](g=>String(g)));}catch{c['push']('head:\x20LocalMark\x20lookup\x20failed');}return{'name':d,'tags':e,'description':str(b['description'])};}async function buildPresenters(a,b,c){const d=[];let e=0x0,f=![];try{const g=await fetchObjectLinkerTx(a,b,!![]),h=Array['isArray'](g?.['items'])?g['items']:[];f=ringWindowSaturated(h['length']);const i=h['map'](l=>({'service':String(l?.['who']??''),'time':typeof l?.['time']==='number'?l['time']:null}))['filter'](l=>objectTypeFromAddress(l['service'])===ObjectType['Service']);e=i['length'];const j=i['slice'](-0x32)['reverse'](),k=await batchReadAddressKeyedFields(a,j['map'](l=>l['service']),b,!![]);for(const l of j){const m=k['get'](l['service']['toLowerCase']());d['push']({'service':l['service'],'recommend':str(m?.['recommend']),'acceptance_score':num(m?.['acceptance_score']),'feedback':str(m?.['feedback']),'feedback_time':num(m?.['feedback_time']),'update_time':num(m?.['update_time'])??l['time']});}}catch{c['push']('presenters:\x20global-table\x20lookup\x20failed\x20(non-blocking)');}return{'count':e,'window_saturated':f,'preview_truncated':e>d['length'],'items':d};}async function buildRepositoryData(a,b,c){return void a,void b,c['push']('data:\x20per-key\x20enumeration\x20requires\x20the\x20{entity,name}\x20pair\x20—\x20showing\x20count\x20only'),{'count':null,'items':[]};}export async function handleObjectPanorama(b){const c=b['object_address']??b['filter'];if(!c)throw new Error('\x27object_address\x27\x20is\x20required\x20for\x20object_panorama\x20(a\x20LocalMark\x20NAME\x20is\x20also\x20accepted).\x20Example:\x20{\x22query_type\x22:\x20\x22object_panorama\x22,\x20\x22object_address\x22:\x20\x220x...\x22}');const {network:e,obj:f}=await resolveObject(c,b['context_network']),g=String(f['object']),h=[],j=await resolveHead(g,f,h),k=String(f['type']??'');if(k==='Progress'){const l=arr(f['session'])[0x0],m=l?{'next_node':str(l['next_node']),'weights':num(l['weights']),'threshold':num(l['threshold']),'forwards':arr(l['forwards'])['map'](q=>{const r=q;return{'forward':str(r['forward'])??'','who':str(r['who']),'accomplished':r['accomplished']===!![],'msg':str(r['msg']),'time':num(r['time'])};})}:null,n=await buildRelatedList(typeof f['machine']==='string'?f['machine']:null,g,e,h,'machine');return{'action':'object_panorama','object':g,'object_type':'Progress','network':e,'head':j,'fields':{'machine':str(f['machine']),'current':str(f['current']),'task':str(f['task']),'history_count':num(f['history_count']),'current_time':num(f['current_time'])},'context_repositories':arr(f['context_repositories'])['map'](q=>String(q)),'operators':arr(f['namedOperator'])['map'](q=>{const r=q;return{'name':str(r['name'])??'','operators':arr(r['operators'])['map'](t=>String(t))};}),'session':m,'related':n,'data_gaps':h};}if(k==='Demand')return{'action':'object_panorama','object':g,'object_type':'Demand','network':e,'head':j,'fields':{'location':str(f['location']),'um':str(f['um']),'permission':str(f['permission']),'presenters_count':num(f['presenters_count'])},'rewards':arr(f['rewards'])['map'](q=>String(q)),'guards':arr(f['guards'])['map'](q=>({'guard':str(q['guard'])??''})),'presenters':await buildPresenters(g,e,h),'data_gaps':h};if(k==='Order'){let q=null;try{const F=await query_object_last_updated({'object':g,'network':e,'previous_transaction':str(f['previousTransaction'])});q=F?.['timestamp_ms']?Number(F['timestamp_ms'])||null:null;}catch{}let r='none',t=null,u=null;const w=str(f['allocation']),x=str(f['progress']),y=str(f['service']),z=[w,x,y]['filter'](G=>!!G);let A=null;if(z['length']>0x0)try{const G=await query_objects({'objects':z,'network':e}),H=G?.['objects']??[];if(w){r='pending';const I=H['find'](K=>K?.['object']===w),J=Number(I?.['balance']??NaN);if(Number['isFinite'](J)&&J===0x0)r='allocated';}if(x){const K=H['find'](L=>L?.['object']===x);t=str(K?.['current']),u=num(K?.['current_time']);}if(y){const L=H['find'](M=>M?.['object']===y);A=coinOfTypeRaw(L?.['type_raw']??L?.['type']);}}catch{}const B=await buildRelatedList(g,g,e,h,'order'),C=str(f['amount']),D=await formatMoneyAnnotation(C,A,e),E=await Promise['all'](arr(f['items'])['map'](async M=>{const N=M,O=str(N['price']),P=await formatMoneyAnnotation(O,A,e);return{'name':str(N['name']),'price':O,'price_display':P['display'],'price_tip':P['tip'],'quantity':str(N['quantity']),'wip_hash':str(N['wip_hash'])};}));return{'action':'object_panorama','object':g,'object_type':'Order','network':e,'head':j,'coin_type':A,'fields':{'service':y,'machine':str(f['machine']),'progress':x,'allocation':w,'discount':str(f['discount']),'amount':C,'amount_display':D['display'],'amount_tip':D['tip'],'owner':ownerAddr(f['builder']??f['owner']),'claimed_by':str(f['claimed_by']),'required_info':str(f['required_info']),'time':num(f['time'])},'updated_ms':q,'related':B,'allocation_state':r,'progress_next':t,'progress_since':u,'items':E,'disputes':arr(f['dispute'])['map'](M=>String(M)),'agents':arr(f['agent'])['map'](M=>String(M)),'data_gaps':h};}if(k==='Arb'){const M=f['indemnity'];let N=null;try{const W=await query_object_last_updated({'object':g,'network':e,'previous_transaction':str(f['previousTransaction'])});N=W?.['timestamp_ms']?Number(W['timestamp_ms'])||null:null;}catch{}const O=str(f['order']);let P=null;if(O)try{const X=await query_objects({'objects':[O],'network':e}),Y=X?.['objects']?.[0x0];P=str(Y?.['service']);}catch{}const Q=await buildRelatedList(g,g,e,h,'arb'),R=coinOfTypeRaw(f['type_raw']),S=str(f['fee']),T=await formatMoneyAnnotation(S,R,e),U=M?str(M['amount']):null,V=await formatMoneyAnnotation(U,R,e);return{'action':'object_panorama','object':g,'object_type':'Arb','network':e,'head':j,'coin_type':R,'fields':{'arbitration':str(f['arbitration']),'order':str(f['order']),'service':P,'fee':S,'fee_display':T['display'],'fee_tip':T['tip'],'feedback':str(f['feedback']),'indemnity':M?{'amount':U,'amount_display':V['display'],'amount_tip':V['tip'],'time':num(M['time'])}:null,'voting_deadline':num(f['voting_deadline']),'objection':str(f['objection']),'status':ARB_STATUS_NAMES[num(f['status'])??-0x1]??str(f['status']),'compensation_time':num(f['compensation_time']),'time':num(f['time']),'type_raw':str(f['type_raw'])},'voted':arr(f['voted'])['map'](Z=>{const a0=Z;return{'voter':str(a0['voter'])??'','agrees':arr(a0['agrees'])['map'](a1=>Number(a1)),'weight':num(a0['weight'])??0x0,'time':num(a0['time'])??0x0};}),'proposition':arr(f['proposition'])['map'](Z=>{const a0=Z;return{'name':str(a0['name'])??'','votes':num(a0['votes'])??0x0};}),'related':Q,'updated_ms':N,'data_gaps':h};}if(k==='Arbitration'){const Z=coinOfTypeRaw(f['type_raw']??f['type']),a0=str(f['fee']),a1=await formatMoneyAnnotation(a0,Z,e),a2=str(f['balance']),a3=await formatMoneyAnnotation(a2,Z,e),a4=a7=>{if(a7&&typeof a7==='object'){const a8=a7;if(a8['GuardIdentifier']!==undefined)return'guard\x20identifier\x20#'+String(a8['GuardIdentifier']);if(a8['FixedValue']!==undefined)return'fixed\x20weight\x20'+String(a8['FixedValue']);}return typeof a7==='number'||typeof a7==='string'?String(a7):null;},a5=arr(f['voting_guard'])['map'](a7=>{const a8=a7;return{'guard':str(a8['guard'])??'','vote_weight':a4(a8['vote_weight'])};}),a6={'count':0x0,'window_saturated':![],'preview_truncated':![],'stats':{'first_created_ms':null,'last_created_ms':null},'items':[]};try{const a7=await fetchObjectLinkerTx(g,e,!![]),a8=a7?.['items']??[];a6['window_saturated']=ringWindowSaturated(a8['length']);const a9=a8['filter'](ac=>objectTypeFromAddress(typeof ac?.['who']==='string'?ac['who']:'')===ObjectType['Arb']);a6['count']=a9['length'];for(const ac of a9){if(typeof ac?.['time']==='number'){if(a6['stats']['first_created_ms']===null||ac['time']<a6['stats']['first_created_ms'])a6['stats']['first_created_ms']=ac['time'];if(a6['stats']['last_created_ms']===null||ac['time']>a6['stats']['last_created_ms'])a6['stats']['last_created_ms']=ac['time'];}}const aa=a9['slice'](-0x3)['reverse'](),ab=new Map();if(aa['length']>0x0)try{const ad=await batchQueryObjectsByIds(aa['map'](ae=>String(ae['who'])),e,!![]);for(const ae of ad){if(ae?.['object'])ab['set'](ae['object'],ae);}}catch{h['push']('cases:\x20detail\x20fetch\x20failed\x20(non-blocking)');}for(const af of aa){const ag=typeof af?.['who']==='string'?af['who']:'';if(!ag)continue;const ah=ab['get'](ag);a6['items']['push']({'arb':ag,'order':ah?str(ah['order']):null,'status':ah?ARB_STATUS_NAMES[num(ah['status'])??-0x1]??str(ah['status']):null,'time':typeof af?.['time']==='number'?af['time']:null});}a6['preview_truncated']=a6['count']>a6['items']['length'],a6['preview_truncated']&&(a6['drilldown']={'total_count':a6['count'],'analyzed_count':a6['items']['length'],'prompt':'Analyze\x20ALL\x20dispute\x20cases\x20of\x20Arbitration\x20'+g+'\x20('+e+')\x20one\x20by\x20one,\x20newest\x20first.\x20'+('The\x20cases\x20live\x20in\x20the\x20arbitration\x27s\x20FIFO\x20tx-linker\x20window\x20holding\x20at\x20most\x205200\x20newest\x20entries\x20—\x20the\x20retained\x20count\x20is\x20a\x20lower\x20bound\x20when\x20the\x20window\x20is\x20saturated\x20(currently\x20'+a6['count']+(a6['window_saturated']?',\x20saturated':'')+').\x20')+'For\x20each\x20case\x20call\x20object_panorama\x20with\x20the\x20Arb\x20case\x27s\x20FULL\x200x\x20address\x20(collect\x20the\x20addresses\x20from\x20the\x20same\x20reverse-index\x20source;\x20work\x20newest-first)\x20and\x20render\x20ONE\x20table\x20row\x20per\x20case:\x20'+'case\x20address\x20chip\x20(first\x20column)\x20|\x20disputed\x20order\x20address\x20chip\x20ON\x20THE\x20SAME\x20ROW\x20(the\x20order\x20is\x20the\x20case\x27s\x20child\x20plane)\x20|\x20status\x20|\x20created\x20(local\x20date)\x20|\x20indemnity\x20(the\x20display\x20value\x20with\x20its\x20token\x20symbol\x20—\x20never\x20reconvert\x20from\x20raw)\x20|\x20arbitrator\x20feedback.\x20'+'Close\x20with\x20the\x203\x20most\x20valuable\x20patterns\x20across\x20the\x20rows\x20(outcomes,\x20indemnity\x20distribution,\x20case\x20age).\x20Cases\x20only\x20—\x20do\x20not\x20re-analyze\x20the\x20Arbitration\x20itself.'});}catch{h['push']('cases:\x20affiliation-window\x20lookup\x20failed\x20(non-blocking)');}return{'action':'object_panorama','object':g,'object_type':'Arbitration','network':e,'head':j,'coin_type':Z,'fields':{'location':str(f['location']),'um':str(f['um']),'permission':str(f['permission']),'fee':a0,'fee_display':a1['display'],'fee_tip':a1['tip'],'balance':a2,'balance_display':a3['display'],'balance_tip':a3['tip'],'paused':typeof f['bPaused']==='boolean'?f['bPaused']:null,'usage_guard':str(f['usage_guard'])},'voting_guards':a5,'cases':a6,'data_gaps':h};}if(k==='Repository')return{'action':'object_panorama','object':g,'object_type':'Repository','network':e,'head':j,'fields':{'um':str(f['um']),'permission':str(f['permission']),'data_count':num(f['data_count'])},'policies':arr(f['policies'])['map'](ai=>{const aj=ai;return{'name':str(aj['name'])??'','description':str(aj['description']),'id_from':str(aj['id_from']),'value_type':str(aj['value_type']),'write_guards':arr(aj['write_guard'])['length'],'quote_guard':str(aj['quote_guard'])};}),'rewards':arr(f['rewards'])['map'](ai=>String(ai)),'data_entries':await buildRepositoryData(g,e,h),'data_gaps':h};if(k==='Proof'){const ai=aq=>typeof aq==='string'&&aq?createHash('sha256')['update'](aq)['digest']('hex')['slice'](0x0,0x10):null,aj=str(f['server_pubkey']),ak=str(f['server_signature']),al=num(f['time']),am=num(f['proof_type']),an=str(f['proof']),ao={'action':'object_panorama','object':g,'object_type':'Proof','network':e,'head':j,'fields':{'description':str(f['description']),'anchored_root':an,'item_count':num(f['item_count']),'proof_type':am,'proof_type_label':am===0x1?'1\x20=\x20WTS\x20message\x20proof\x20(WOWOK_WTS_PROOF_TYPE,\x20proof.move:11)\x20—\x20convention,\x20not\x20chain-validated':(am??'unset')+'\x20—\x20unvalidated\x20by\x20the\x20contract\x20(proof.move\x20checks\x20lengths,\x20not\x20type)','about':ownerAddr(f['about']),'signer':ownerAddr(f['signer'])??str(f['signer']),'time_ms':al,'time_iso':al!==null?new Date(al)['toISOString']():null},'server_pubkey':{'present':!!aj,'length':aj?aj['length']:null,'fingerprint':ai(f['server_pubkey'])},'server_signature':{'present':!!ak,'length':ak?ak['length']:null,'fingerprint':ai(f['server_signature'])},'data_gaps':[...h,'server_pubkey\x20/\x20server_signature\x20are\x20shown\x20as\x20sha256\x20fingerprints\x20+\x20length\x20only\x20(a\x20signature\x20is\x20up\x20to\x2040,480\x20bytes)\x20—\x20pass\x20wts_file_path\x20to\x20have\x20this\x20Proof\x20compared\x20against\x20the\x20packet\x20instead\x20of\x20copying\x20the\x20material\x20out']},ap=b['wts_file_path'];if(ap){const aq=await readWtsDocument(ap);aq===undefined?ao['wts_anchor_check']={'root_matched':![],'matched_leaf_indices':[],'key_matched':![],'anchored_before_packet':null,'verdict':'wts_file_path\x20\x22'+ap+'\x22\x20could\x20not\x20be\x20read\x20as\x20a\x20local\x20JSON\x20WTS\x20packet\x20—\x20no\x20cross-check\x20performed.'}:ao['wts_anchor_check']=checkWtsProofAnchor(aq,{'proof':an,'server_pubkey':aj,'time':al,'signer':ao['fields']['signer'],'address':g});}return ao;}throw new Error('object_panorama:\x20unsupported\x20object\x20type\x20\x27'+(k||'unknown')+'\x27\x20for\x20'+g+'.\x20'+'Supported:\x20Progress\x20/\x20Demand\x20/\x20Order\x20/\x20Arb\x20/\x20Arbitration\x20/\x20Repository\x20/\x20Proof.');}
|
|
1
|
+
import{Config,LocalMark,query_objects,query_object_last_updated,objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{createHash}from'node:crypto';import{checkWtsProofAnchor,readWtsDocument}from'../../communication/wts-attestation.js';import{resolveAddress as a333a}from'../../tools/handlers/name-resolution.js';import{batchReadAddressKeyedFields,batchQueryObjectsByIds,fetchObjectLinkerTx,ringWindowSaturated}from'../../graph/onchain/sdk-batch.js';import{formatMoneyAnnotation}from'./facet-money.js';const js=a=>{if(typeof a==='bigint')return a['toString']();if(a&&typeof a==='object'&&!Array['isArray'](a)){const b={};for(const [c,d]of Object['entries'](a)){b[c]=js(d);}return b;}if(Array['isArray'](a))return a['map'](js);return a;},str=a=>a===null||a===undefined?null:String(a),ownerAddr=a=>{if(typeof a==='string')return a;const b=a;if(b&&typeof b==='object'){if(typeof b['AddressOwner']==='string')return b['AddressOwner'];if(typeof b['ObjectOwner']==='string')return b['ObjectOwner'];const c=Object['values'](b)['find'](d=>typeof d==='string'&&d['length']>0x14);if(typeof c==='string')return c;}return null;},num=a=>{if(typeof a==='bigint')return Number(a);if(typeof a==='number')return Number['isFinite'](a)?a:null;if(typeof a==='string'&&a['trim']()!==''){const b=Number(a);return Number['isFinite'](b)?b:null;}return null;},arr=a=>Array['isArray'](a)?a:[];export function coinOfTypeRaw(a){if(typeof a!=='string'||!a)return null;const b=a['match'](/<(.+)>$/),c=b?.[0x1]?.['trim']();return c&&c['includes']('::')?c:null;}const RELATED_PREVIEW_CAP=0x32;async function buildRelatedList(a,b,c,d,e){const f={'key':a,'items':[],'count':0x0,'window_saturated':![],'preview_truncated':![]};if(!a)return f;try{const g=await fetchObjectLinkerTx(a,c,!![]),h=g?.['items']??[];f['window_saturated']=ringWindowSaturated(h['length']);const j=[];for(const k of h){const l=typeof k?.['who']==='string'?k['who']:'';if(!l||l['toLowerCase']()===b['toLowerCase']())continue;let m;try{m=objectTypeFromAddress(l);}catch{}if(!m)continue;j['push']({'address':l,'object_type':m,'time':typeof k?.['time']==='number'?k['time']:null});}f['count']=j['length'],f['items']=j['slice'](-RELATED_PREVIEW_CAP)['reverse'](),f['preview_truncated']=j['length']>f['items']['length'];}catch{d['push']('related:\x20ObjectLinkerTx('+e+')\x20lookup\x20failed');}return f;}const ARB_STATUS_NAMES={0x0:'Principal_confirming',0x1:'Arbitrator_confirming',0x2:'Voting',0x3:'Arbitrated',0x4:'Objectionable',0x5:'Finished',0x6:'Withdrawn'};async function resolveObject(a,b){const c=await a333a(a,'object_address');let d=b??undefined,f=null;if(!d)d=await Config['Instance']()['network_get']();try{const g=await query_objects({'objects':[c],'network':d});f=g?.['objects']?.[0x0]??null;if(!f&&b){const h=await Config['Instance']()['network_get']();if(h&&h!==d){const i=await query_objects({'objects':[c],'network':h,'no_cache':!![]}),j=i?.['objects']?.[0x0]??null;j&&(f=j,d=h);}}}catch(k){throw new Error('Failed\x20to\x20query\x20'+c+'\x20on\x20'+d+':\x20'+(k instanceof Error?k['message']:String(k)));}if(!f)throw new Error(c+'\x20not\x20found\x20on\x20'+d+(b?'':'\x20(session\x20default\x20network\x20—\x20not\x20an\x20explicit\x20request)')+'.\x20Verify\x20BOTH\x20the\x20object\x20ID\x20and\x20the\x20network:\x20an\x20object\x20that\x20exists\x20on\x20'+'one\x20network\x20answers\x20\x22not\x20found\x22\x20on\x20the\x20other.\x20Pass\x20context_network\x20'+'to\x20query\x20a\x20specific\x20network\x20before\x20concluding\x20the\x20object\x20does\x20not\x20exist.');return f['object']=f['object']??c,{'network':String(d),'obj':f};}async function resolveHead(a,b,c){let d=null,e=[];try{const f=await LocalMark['Instance']()['list']({'address':a});f['length']>0x0&&(d=f[0x0]['name']??null,e=(f[0x0]['tags']??[])['map'](g=>String(g)));}catch{c['push']('head:\x20LocalMark\x20lookup\x20failed');}return{'name':d,'tags':e,'description':str(b['description'])};}async function buildPresenters(a,b,c){const d=[];let e=0x0,f=![];try{const g=await fetchObjectLinkerTx(a,b,!![]),h=Array['isArray'](g?.['items'])?g['items']:[];f=ringWindowSaturated(h['length']);const i=h['map'](l=>({'service':String(l?.['who']??''),'time':typeof l?.['time']==='number'?l['time']:null}))['filter'](l=>objectTypeFromAddress(l['service'])===ObjectType['Service']);e=i['length'];const j=i['slice'](-0x32)['reverse'](),k=await batchReadAddressKeyedFields(a,j['map'](l=>l['service']),b,!![]);for(const l of j){const m=k['get'](l['service']['toLowerCase']());d['push']({'service':l['service'],'recommend':str(m?.['recommend']),'acceptance_score':num(m?.['acceptance_score']),'feedback':str(m?.['feedback']),'feedback_time':num(m?.['feedback_time']),'update_time':num(m?.['update_time'])??l['time']});}}catch{c['push']('presenters:\x20global-table\x20lookup\x20failed\x20(non-blocking)');}return{'count':e,'window_saturated':f,'preview_truncated':e>d['length'],'items':d};}async function buildRepositoryData(a,b,c){return void a,void b,c['push']('data:\x20per-key\x20enumeration\x20requires\x20the\x20{entity,name}\x20pair\x20—\x20showing\x20count\x20only'),{'count':null,'items':[]};}export async function handleObjectPanorama(b){const c=b['object_address']??b['filter'];if(!c)throw new Error('\x27object_address\x27\x20is\x20required\x20for\x20object_panorama\x20(a\x20LocalMark\x20NAME\x20is\x20also\x20accepted).\x20Example:\x20{\x22query_type\x22:\x20\x22object_panorama\x22,\x20\x22object_address\x22:\x20\x220x...\x22}');const {network:e,obj:f}=await resolveObject(c,b['context_network']),g=String(f['object']),h=[],j=await resolveHead(g,f,h),k=String(f['type']??'');if(k==='Progress'){const l=arr(f['session'])[0x0],m=l?{'next_node':str(l['next_node']),'weights':num(l['weights']),'threshold':num(l['threshold']),'forwards':arr(l['forwards'])['map'](q=>{const r=q;return{'forward':str(r['forward'])??'','who':str(r['who']),'accomplished':r['accomplished']===!![],'msg':str(r['msg']),'time':num(r['time'])};})}:null,n=await buildRelatedList(typeof f['machine']==='string'?f['machine']:null,g,e,h,'machine');return{'action':'object_panorama','object':g,'object_type':'Progress','network':e,'head':j,'fields':{'machine':str(f['machine']),'current':str(f['current']),'task':str(f['task']),'history_count':num(f['history_count']),'current_time':num(f['current_time'])},'context_repositories':arr(f['context_repositories'])['map'](q=>String(q)),'operators':arr(f['namedOperator'])['map'](q=>{const r=q;return{'name':str(r['name'])??'','operators':arr(r['operators'])['map'](t=>String(t))};}),'session':m,'related':n,'data_gaps':h};}if(k==='Demand')return{'action':'object_panorama','object':g,'object_type':'Demand','network':e,'head':j,'fields':{'location':str(f['location']),'um':str(f['um']),'permission':str(f['permission']),'presenters_count':num(f['presenters_count'])},'rewards':arr(f['rewards'])['map'](q=>String(q)),'guards':arr(f['guards'])['map'](q=>({'guard':str(q['guard'])??''})),'presenters':await buildPresenters(g,e,h),'data_gaps':h};if(k==='Order'){let q=null;try{const F=await query_object_last_updated({'object':g,'network':e,'previous_transaction':str(f['previousTransaction'])});q=F?.['timestamp_ms']?Number(F['timestamp_ms'])||null:null;}catch{}let r='none',t=null,u=null;const w=str(f['allocation']),x=str(f['progress']),y=str(f['service']),z=[w,x,y]['filter'](G=>!!G);let A=null;if(z['length']>0x0)try{const G=await query_objects({'objects':z,'network':e}),H=G?.['objects']??[];if(w){r='pending';const I=H['find'](K=>K?.['object']===w),J=Number(I?.['balance']??NaN);if(Number['isFinite'](J)&&J===0x0)r='allocated';}if(x){const K=H['find'](L=>L?.['object']===x);t=str(K?.['current']),u=num(K?.['current_time']);}if(y){const L=H['find'](M=>M?.['object']===y);A=coinOfTypeRaw(L?.['type_raw']??L?.['type']);}}catch{}const B=await buildRelatedList(g,g,e,h,'order'),C=str(f['amount']),D=await formatMoneyAnnotation(C,A,e),E=await Promise['all'](arr(f['items'])['map'](async M=>{const N=M,O=str(N['price']),P=await formatMoneyAnnotation(O,A,e);return{'name':str(N['name']),'price':O,'price_display':P['display'],'price_tip':P['tip'],'quantity':str(N['quantity']),'wip_hash':str(N['wip_hash'])};}));return{'action':'object_panorama','object':g,'object_type':'Order','network':e,'head':j,'coin_type':A,'fields':{'service':y,'machine':str(f['machine']),'progress':x,'allocation':w,'discount':str(f['discount']),'amount':C,'amount_display':D['display'],'amount_tip':D['tip'],'owner':ownerAddr(f['builder']??f['owner']),'claimed_by':str(f['claimed_by']),'required_info':str(f['required_info']),'time':num(f['time'])},'updated_ms':q,'related':B,'allocation_state':r,'progress_next':t,'progress_since':u,'items':E,'disputes':arr(f['dispute'])['map'](M=>String(M)),'agents':arr(f['agent'])['map'](M=>String(M)),'data_gaps':h};}if(k==='Arb'){const M=f['indemnity'];let N=null;try{const W=await query_object_last_updated({'object':g,'network':e,'previous_transaction':str(f['previousTransaction'])});N=W?.['timestamp_ms']?Number(W['timestamp_ms'])||null:null;}catch{}const O=str(f['order']);let P=null;if(O)try{const X=await query_objects({'objects':[O],'network':e}),Y=X?.['objects']?.[0x0];P=str(Y?.['service']);}catch{}const Q=await buildRelatedList(g,g,e,h,'arb'),R=coinOfTypeRaw(f['type_raw']),S=str(f['fee']),T=await formatMoneyAnnotation(S,R,e),U=M?str(M['amount']):null,V=await formatMoneyAnnotation(U,R,e);return{'action':'object_panorama','object':g,'object_type':'Arb','network':e,'head':j,'coin_type':R,'fields':{'arbitration':str(f['arbitration']),'order':str(f['order']),'service':P,'fee':S,'fee_display':T['display'],'fee_tip':T['tip'],'feedback':str(f['feedback']),'indemnity':M?{'amount':U,'amount_display':V['display'],'amount_tip':V['tip'],'time':num(M['time'])}:null,'voting_deadline':num(f['voting_deadline']),'objection':str(f['objection']),'status':ARB_STATUS_NAMES[num(f['status'])??-0x1]??str(f['status']),'compensation_time':num(f['compensation_time']),'time':num(f['time']),'type_raw':str(f['type_raw'])},'voted':arr(f['voted'])['map'](Z=>{const a0=Z;return{'voter':str(a0['voter'])??'','agrees':arr(a0['agrees'])['map'](a1=>Number(a1)),'weight':num(a0['weight'])??0x0,'time':num(a0['time'])??0x0};}),'proposition':arr(f['proposition'])['map'](Z=>{const a0=Z;return{'name':str(a0['name'])??'','votes':num(a0['votes'])??0x0};}),'related':Q,'updated_ms':N,'data_gaps':h};}if(k==='Arbitration'){const Z=coinOfTypeRaw(f['type_raw']??f['type']),a0=str(f['fee']),a1=await formatMoneyAnnotation(a0,Z,e),a2=str(f['balance']),a3=await formatMoneyAnnotation(a2,Z,e),a4=a7=>{if(a7&&typeof a7==='object'){const a8=a7;if(a8['GuardIdentifier']!==undefined)return'guard\x20identifier\x20#'+String(a8['GuardIdentifier']);if(a8['FixedValue']!==undefined)return'fixed\x20weight\x20'+String(a8['FixedValue']);}return typeof a7==='number'||typeof a7==='string'?String(a7):null;},a5=arr(f['voting_guard'])['map'](a7=>{const a8=a7;return{'guard':str(a8['guard'])??'','vote_weight':a4(a8['vote_weight'])};}),a6={'count':0x0,'window_saturated':![],'preview_truncated':![],'stats':{'first_created_ms':null,'last_created_ms':null},'items':[]};try{const a7=await fetchObjectLinkerTx(g,e,!![]),a8=a7?.['items']??[];a6['window_saturated']=ringWindowSaturated(a8['length']);const a9=a8['filter'](ac=>objectTypeFromAddress(typeof ac?.['who']==='string'?ac['who']:'')===ObjectType['Arb']);a6['count']=a9['length'];for(const ac of a9){if(typeof ac?.['time']==='number'){if(a6['stats']['first_created_ms']===null||ac['time']<a6['stats']['first_created_ms'])a6['stats']['first_created_ms']=ac['time'];if(a6['stats']['last_created_ms']===null||ac['time']>a6['stats']['last_created_ms'])a6['stats']['last_created_ms']=ac['time'];}}const aa=a9['slice'](-0x3)['reverse'](),ab=new Map();if(aa['length']>0x0)try{const ad=await batchQueryObjectsByIds(aa['map'](ae=>String(ae['who'])),e,!![]);for(const ae of ad){if(ae?.['object'])ab['set'](ae['object'],ae);}}catch{h['push']('cases:\x20detail\x20fetch\x20failed\x20(non-blocking)');}for(const af of aa){const ag=typeof af?.['who']==='string'?af['who']:'';if(!ag)continue;const ah=ab['get'](ag);a6['items']['push']({'arb':ag,'order':ah?str(ah['order']):null,'status':ah?ARB_STATUS_NAMES[num(ah['status'])??-0x1]??str(ah['status']):null,'time':typeof af?.['time']==='number'?af['time']:null});}a6['preview_truncated']=a6['count']>a6['items']['length'],a6['preview_truncated']&&(a6['drilldown']={'total_count':a6['count'],'analyzed_count':a6['items']['length'],'prompt':'Analyze\x20ALL\x20dispute\x20cases\x20of\x20Arbitration\x20'+g+'\x20('+e+')\x20one\x20by\x20one,\x20newest\x20first.\x20'+('The\x20cases\x20live\x20in\x20the\x20arbitration\x27s\x20FIFO\x20tx-linker\x20window\x20holding\x20at\x20most\x205200\x20newest\x20entries\x20—\x20the\x20retained\x20count\x20is\x20a\x20lower\x20bound\x20when\x20the\x20window\x20is\x20saturated\x20(currently\x20'+a6['count']+(a6['window_saturated']?',\x20saturated':'')+').\x20')+'For\x20each\x20case\x20call\x20object_panorama\x20with\x20the\x20Arb\x20case\x27s\x20FULL\x200x\x20address\x20(collect\x20the\x20addresses\x20from\x20the\x20same\x20reverse-index\x20source;\x20work\x20newest-first)\x20and\x20render\x20ONE\x20table\x20row\x20per\x20case:\x20'+'case\x20address\x20chip\x20(first\x20column)\x20|\x20disputed\x20order\x20address\x20chip\x20ON\x20THE\x20SAME\x20ROW\x20(the\x20order\x20is\x20the\x20case\x27s\x20child\x20plane)\x20|\x20status\x20|\x20created\x20(local\x20date)\x20|\x20indemnity\x20(the\x20display\x20value\x20with\x20its\x20token\x20symbol\x20—\x20never\x20reconvert\x20from\x20raw)\x20|\x20arbitrator\x20feedback.\x20'+'Close\x20with\x20the\x203\x20most\x20valuable\x20patterns\x20across\x20the\x20rows\x20(outcomes,\x20indemnity\x20distribution,\x20case\x20age).\x20Cases\x20only\x20—\x20do\x20not\x20re-analyze\x20the\x20Arbitration\x20itself.'});}catch{h['push']('cases:\x20affiliation-window\x20lookup\x20failed\x20(non-blocking)');}return{'action':'object_panorama','object':g,'object_type':'Arbitration','network':e,'head':j,'coin_type':Z,'fields':{'location':str(f['location']),'um':str(f['um']),'permission':str(f['permission']),'fee':a0,'fee_display':a1['display'],'fee_tip':a1['tip'],'balance':a2,'balance_display':a3['display'],'balance_tip':a3['tip'],'paused':typeof f['bPaused']==='boolean'?f['bPaused']:null,'usage_guard':str(f['usage_guard'])},'voting_guards':a5,'cases':a6,'data_gaps':h};}if(k==='Repository')return{'action':'object_panorama','object':g,'object_type':'Repository','network':e,'head':j,'fields':{'um':str(f['um']),'permission':str(f['permission']),'data_count':num(f['data_count'])},'policies':arr(f['policies'])['map'](ai=>{const aj=ai;return{'name':str(aj['name'])??'','description':str(aj['description']),'id_from':str(aj['id_from']),'value_type':str(aj['value_type']),'write_guards':arr(aj['write_guard'])['length'],'quote_guard':str(aj['quote_guard'])};}),'rewards':arr(f['rewards'])['map'](ai=>String(ai)),'data_entries':await buildRepositoryData(g,e,h),'data_gaps':h};if(k==='Proof'){const ai=aq=>typeof aq==='string'&&aq?createHash('sha256')['update'](aq)['digest']('hex')['slice'](0x0,0x10):null,aj=str(f['server_pubkey']),ak=str(f['server_signature']),al=num(f['time']),am=num(f['proof_type']),an=str(f['proof']),ao={'action':'object_panorama','object':g,'object_type':'Proof','network':e,'head':j,'fields':{'description':str(f['description']),'anchored_root':an,'item_count':num(f['item_count']),'proof_type':am,'proof_type_label':am===0x1?'1\x20=\x20WTS\x20message\x20proof\x20(WOWOK_WTS_PROOF_TYPE,\x20proof.move:11)\x20—\x20convention,\x20not\x20chain-validated':(am??'unset')+'\x20—\x20unvalidated\x20by\x20the\x20contract\x20(proof.move\x20checks\x20lengths,\x20not\x20type)','about':ownerAddr(f['about_address']??f['about']),'signer':ownerAddr(f['signer'])??str(f['signer']),'time_ms':al,'time_iso':al!==null?new Date(al)['toISOString']():null},'server_pubkey':{'present':!!aj,'length':aj?aj['length']:null,'fingerprint':ai(f['server_pubkey'])},'server_signature':{'present':!!ak,'length':ak?ak['length']:null,'fingerprint':ai(f['server_signature'])},'data_gaps':[...h,'server_pubkey\x20/\x20server_signature\x20are\x20shown\x20as\x20sha256\x20fingerprints\x20+\x20length\x20only\x20(a\x20signature\x20is\x20up\x20to\x2040,480\x20bytes)\x20—\x20pass\x20wts_file_path\x20to\x20have\x20this\x20Proof\x20compared\x20against\x20the\x20packet\x20instead\x20of\x20copying\x20the\x20material\x20out']},ap=b['wts_file_path'];if(ap){const aq=await readWtsDocument(ap);aq===undefined?ao['wts_anchor_check']={'root_matched':![],'matched_leaf_indices':[],'key_matched':![],'anchored_before_packet':null,'verdict':'wts_file_path\x20\x22'+ap+'\x22\x20could\x20not\x20be\x20read\x20as\x20a\x20local\x20JSON\x20WTS\x20packet\x20—\x20no\x20cross-check\x20performed.'}:ao['wts_anchor_check']=checkWtsProofAnchor(aq,{'proof':an,'server_pubkey':aj,'time':al,'signer':ao['fields']['signer'],'address':g});}return ao;}if(k==='Allocation'){const ar=str(f['balance']);let as=coinOfTypeRaw(f['type_raw']??f['type']);const at=arr(f['allocators']),au=f['allocators'],av=str(au?.['threshold'])??str(f['threshold']);if(!as){const aB=str(f['payment_info']?.['for_object']);if(aB)try{const aC=await query_objects({'objects':[aB],'network':e}),aD=(aC?.['objects']??[])['find'](aF=>aF?.['object']===aB),aE=str(aD?.['service']);if(aE){const aF=await query_objects({'objects':[aE],'network':e}),aG=(aF?.['objects']??[])['find'](aH=>aH?.['object']===aE);as=coinOfTypeRaw(aG?.['type_raw']??aG?.['type']);}}catch{}}const aw=await formatMoneyAnnotation(ar,as,e),ax=f['payment_info'],ay={0x0:'0=Amount\x20(fixed\x20raw\x20units)',0x1:'1=Rate\x20(per-10000\x20of\x20the\x20pool\x20base)',0x2:'2=Surplus\x20(everything\x20left\x20after\x20fixed\x20rows)',0x3:'3=RateGross\x20(per-10000\x20of\x20the\x20GROSS\x20pool)'},az=await buildRelatedList(g,g,e,h,'allocation');let aA=null;try{const aH=await query_object_last_updated({'object':g,'network':e,'previous_transaction':str(f['previousTransaction'])});aA=aH?.['timestamp_ms']?Number(aH['timestamp_ms'])||null:null;}catch{}return{'action':'object_panorama','object':g,'object_type':'Allocation','network':e,'head':j,'coin_type':as,'fields':{'balance':ar,'balance_display':aw['display'],'balance_tip':aw['tip'],'threshold':av,'for_object':str(ax?.['for_object']),'for_guard':str(ax?.['for_guard']),'remark':str(ax?.['remark']),'index':str(ax?.['index'])},'allocators':at['map'](aI=>{const aJ=aI;return{'guard':str(aJ['guard']),'sharing':arr(aJ['sharing'])['map'](aK=>{const aL=aK,aM=aL['who'];let aN='unknown',aO=null;if(aM&&typeof aM==='object'){if(typeof aM['GuardIdentifier']==='number'||typeof aM['GuardIdentifier']==='string')aN='guard_identifier',aO=num(aM['GuardIdentifier']);else{if(aM['Entity']&&typeof aM['Entity']==='object')aN='entity',aO=str(aM['Entity']['name_or_address']);else typeof aM['Signer']==='string'&&(aN='signer',aO=aM['Signer']);}}const aP=num(aL['mode']);return{'who_kind':aN,'who_value':aO,'resolution_note':aN==='guard_identifier'?'slot\x20'+String(aO)+':\x20reads\x20the\x20rail\x20guard\x27s\x20SUBMITTED\x20value\x20for\x20this\x20slot\x20at\x20spend\x20time\x20(order-scoped\x20rails\x20submit\x20the\x20Order\x20address\x20—\x20for_object\x20above).\x20A\x20STATIC\x20row\x20in\x20this\x20slot\x20is\x20the\x20F21\x20bricked\x20shape;\x20cross-check\x20the\x20guard\x27s\x20declared\x20submission\x20slots.':aN==='entity'?'static\x20address:\x20pins\x20this\x20literal\x20recipient\x20regardless\x20of\x20the\x20guard\x27s\x20submitted\x20slots.':aN==='signer'?'signer:\x20resolves\x20to\x20whoever\x20executes\x20the\x20spend\x20transaction.':'unrecognized\x20recipient\x20variant\x20—\x20SDK\x20decode\x20gap;\x20report\x20with\x20the\x20raw\x20object.','sharing':str(aL['sharing']),'mode':aP,'mode_label':ay[aP??-0x1]??(aP??'?')+'\x20=\x20unrecognized\x20mode'};})};}),'updated_ms':aA,'related':az,'data_gaps':h};}throw new Error('object_panorama:\x20unsupported\x20object\x20type\x20\x27'+(k||'unknown')+'\x27\x20for\x20'+g+'.\x20'+'Supported:\x20Progress\x20/\x20Demand\x20/\x20Order\x20/\x20Allocation\x20/\x20Arb\x20/\x20Arbitration\x20/\x20Repository\x20/\x20Proof.');}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { type ENTRYPOINT } from "@wowok/wowok";
|
|
1
2
|
import { type OrderRadarResult } from "../../participation/radar-core.js";
|
|
2
3
|
import type { ParticipationRadarInput } from "../../schema/query/bi.js";
|
|
3
4
|
type ProjectInput = ParticipationRadarInput;
|
|
5
|
+
export declare function fetchEntityPermissions(permissionAddress: string, network: ENTRYPOINT): Promise<Map<string, number[]>>;
|
|
4
6
|
export declare function handleParticipationRadar(v: ProjectInput): Promise<{
|
|
5
7
|
action: "participation_radar";
|
|
6
8
|
account: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{watch_conversations}from'@wowok/wowok';import{analyzeOrderParticipation,aggregateRadar,isConsequenceNode}from'../../participation/radar-core.js';import{workflowSubgraphFromRows}from'../../graph/onchain/index.js';import{Config}from'@wowok/wowok/w/local';import{resolveAddress as a332a}from'../../tools/handlers/name-resolution.js';import{monitorOrder}from'../../customer/order-monitor.js';import{analyzeMerchantInterest}from'../../participation/merchant-interest.js';import{analyzeCustomerInterest}from'../../participation/customer-interest.js';import{analyzeSupplierInterest}from'../../participation/supplier-interest.js';import{analyzeCollaboratorInterest}from'../../participation/collaborator-interest.js';import{buildAllocationAdvice}from'../../participation/allocation-advice.js';import{fetchMachineNodes}from'./machine-nodes.js';import{extractGenericTokenType,registryDisplayHint}from'../../knowledge/fund-layer.js';import{classifyRecipient,derivePayoffFromSharing}from'../../knowledge/recipient-constraint.js';import{batchQueryObjectsByIds,batchQueryTableItems}from'../../graph/onchain/sdk-batch.js';function fld(a,b){return a?.[b]??a?.['data']?.[b];}async function resolveAddress(a,b){return a332a(a,b);}function balanceStr(a){if(a==null)return undefined;if(typeof a==='object'&&'balance'in a)return String(a['balance']);return String(a);}function balanceToken(a){if(a!=null&&typeof a==='object'&&typeof a['token_type']==='string')return a['token_type'];return undefined;}function summarizeAllocation(a,b){const c=Array['isArray'](a)?a:Array['isArray'](a?.['allocators'])?a['allocators']:[];if(c['length']===0x0)return undefined;let d=0x0,e=0x0,f=0x0,g=0x0;const h=[],i=b['toLowerCase']();for(const j of c){const k=j?.['sharing']??[];for(const l of k){d++;const m=classifyRecipient(l['who']);if(!m)continue;if(m['kind']==='submission')e++;else{if(m['kind']==='signer')g++;else{if(m['kind']==='entity'&&m['address']['toLowerCase']()===i)f++;}}}h['push'](derivePayoffFromSharing(k,'service_order_allocators'));}return{'recipient_slots':d,'guard_gated_slots':e,'direct_to_me_slots':f,'to_payer_slots':g,'payoffs':h};}async function fetchEntityPermissions(a,b){const c=new Map(),{items:d}=await batchQueryTableItems(a,{'network':b});for(const e of d){const f=e['object'];if(f?.['type']!=='TableItem_PermissionPerm')continue;const g=fld(f,'address'),h=fld(f,'perm')??[],i=h['map'](j=>typeof j==='number'?j:typeof j?.['index']==='number'?j['index']:null)['filter'](j=>j!==null);if(g)c['set'](g,i);}return c;}function toWorkflowSubgraph(a,b){return workflowSubgraphFromRows(a,b);}export async function handleParticipationRadar(a){if(!a['radar_account'])throw new Error('\x27radar_account\x27\x20is\x20required\x20for\x20participation_radar');if(!a['radar_targets']||a['radar_targets']['length']===0x0)throw new Error('\x27radar_targets\x27\x20(1-20\x20in-flight\x20orders)\x20is\x20required\x20for\x20participation_radar');const b=a['context_network']??await Config['Instance']()['network_get'](),d=a['radar_include_alerts']??!![],f=[],g=await resolveAddress(a['radar_account'],'radar_account'),h=await Promise['all'](a['radar_targets']['map'](async K=>({'progress':await resolveAddress(K['progress'],'progress'),'order':K['order']?await resolveAddress(K['order'],'order'):undefined}))),i=h['flatMap'](K=>K['order']?[K['progress'],K['order']]:[K['progress']]),j=await batchQueryObjectsByIds(i,b),k=new Map();for(const K of j){const L=fld(K,'object');if(L)k['set'](L,K);}const l=new Map(),m=new Map();for(const M of h){const N=k['get'](M['progress']);if(!N){f['push']('Progress\x20'+M['progress']+'\x20not\x20found\x20on\x20'+b+'\x20—\x20target\x20skipped.');continue;}l['set'](M['progress'],N);if(M['order']){const O=k['get'](M['order']);if(O)m['set'](M['order'],O);else f['push']('Order\x20'+M['order']+'\x20not\x20found\x20on\x20'+b+'\x20—\x20order-holder\x20detection\x20disabled\x20for\x20'+M['progress']+'.');}}h['length']>0x0&&l['size']===0x0&&f['push']('NETWORK\x20MISMATCH\x20SUSPECTED:\x200/'+h['length']+'\x20radar\x20targets\x20exist\x20on\x20network=\x27'+b+'\x27.\x20'+'These\x20objects\x20most\x20likely\x20live\x20on\x20a\x20different\x20network\x20—\x20re-run\x20with\x20the\x20matching\x20\x27network\x27\x20parameter.');const q=[...new Set([...l['values']()]['map'](P=>fld(P,'machine'))['filter'](P=>!!P))],s=[...new Set([...m['values']()]['map'](P=>fld(P,'service'))['filter'](P=>!!P))],u=[...new Set([...m['values']()]['flatMap'](P=>{const Q=fld(P,'dispute');return Array['isArray'](Q)?Q:[];}))],w=[...new Set([...m['values']()]['map'](P=>fld(P,'allocation'))['filter'](P=>!!P&&P['startsWith']('0x')))],x=new Map(),y=new Map(),z=new Map(),A=new Map(),B=new Map();await Promise['all']([...q['map'](async P=>{try{const [Q,R]=await Promise['all']([batchQueryObjectsByIds([P],b),fetchMachineNodes(P,b,!![])]);if(Q[0x0])x['set'](P,Q[0x0]);y['set'](P,toWorkflowSubgraph(R,P));}catch(S){f['push']('Machine\x20'+P+'\x20fetch\x20failed:\x20'+S['message']+'\x20—\x20workflow\x20unknown\x20for\x20its\x20orders.');}}),((async()=>{if(s['length']===0x0)return;try{const P=await batchQueryObjectsByIds(s,b);for(const Q of P){const R=fld(Q,'object');if(R)z['set'](R,Q);}}catch(S){f['push']('Service\x20query\x20failed:\x20'+S['message']+'\x20—\x20compensation/reward\x20context\x20degraded.');}})()),((async()=>{if(u['length']===0x0)return;try{const P=await batchQueryObjectsByIds(u,b);for(const Q of P){const R=fld(Q,'object');if(R)A['set'](R,Q);}}catch(S){f['push']('Arb\x20query\x20failed:\x20'+S['message']+'\x20—\x20compensation\x20claim\x20detection\x20disabled.');}})()),((async()=>{if(w['length']===0x0)return;try{const P=await batchQueryObjectsByIds(w,b);for(const Q of P){const R=fld(Q,'object');if(R)B['set'](R,Q);}}catch(S){f['push']('Allocation\x20pool\x20query\x20failed:\x20'+S['message']+'\x20—\x20fund-state\x20advice\x20degraded\x20to\x20template\x20level.');}})())]);const C=new Map(),D=[...new Set(q['map'](P=>fld(x['get'](P),'permission'))['filter'](P=>!!P))],E=new Map();await Promise['all'](D['map'](async P=>{try{const [Q,R]=await Promise['all']([batchQueryObjectsByIds([P],b),fetchEntityPermissions(P,b)]),S=Q[0x0];E['set'](P,{'address':P,'entity_count':fld(S,'entity_count'),'perm_remark':fld(S,'perm_remark'),'entityPermissions':R,'owner':fld(S,'builder')});}catch(T){f['push']('Permission\x20'+P+'\x20fetch\x20failed:\x20'+T['message']+'\x20—\x20operator\x20permission\x20matching\x20degraded.');}}));for(const P of q){const Q=fld(x['get'](P),'permission');if(Q&&E['has'](Q))C['set'](P,E['get'](Q));}let F=0x0;const G=new Map();try{const R=await watch_conversations({'account':g,'unreadOnly':!![],'previewMessageCount':0x0,'skipAutoMarkViewed':!![]}),S=Array['isArray'](R)?R:R?.['conversations']??[];for(const T of S){const U=T?.['peerAddress'],V=typeof T?.['unreadCount']==='number'?T['unreadCount']:0x0;typeof U==='string'&&V>0x0&&(G['set'](U['toLowerCase'](),V),F+=V);}}catch{f['push']('Messenger\x20unread\x20unavailable\x20(radar\x20account\x20is\x20not\x20a\x20local\x20messenger\x20account,\x20or\x20messenger\x20storage\x20offline)\x20'+'—\x20unread_messages_total\x20reported\x20as\x200.');}const H=[],I=Date['now']();for(const W of h){const X=l['get'](W['progress']);if(!X)continue;const Y=W['order']?m['get'](W['order']):undefined,Z=fld(X,'machine'),a0=fld(X,'current')??'',a1=fld(X,'namedOperator')??[],a2={};for(const ai of a1){if(ai?.['name'])a2[ai['name']]=Array['isArray'](ai['operators'])?ai['operators']:[];}const a3=Y?fld(Y,'service'):undefined,a4=a3?z['get'](a3):undefined;let a5;const a6=Y?fld(Y,'builder'):undefined;if(Y&&a6===g){const aj=fld(Y,'dispute')??[];for(const ak of aj){const al=A['get'](ak);if(!al)continue;const am=fld(al,'indemnity');if(am){a5={'arbitration':fld(al,'arbitration')??ak,'note':'Arbitration\x20verdict\x20recorded\x20an\x20indemnity\x20(Arb\x20'+ak+').\x20'+'Claim\x20via\x20order\x20op=\x27arb_claim_compensation\x27\x20—\x20paid\x20directly\x20from\x20the\x20Service\x20compensation_fund.\x20'+'(Claimed-status\x20is\x20not\x20readable\x20from\x20the\x20Arb\x20object;\x20the\x20contract\x20rejects\x20double-claims.)'};break;}}}const a7=isConsequenceNode(a0,'completed'),a8=isConsequenceNode(a0,'refunded'),a9=[];if(a4&&a6===g){if(a8)f['push']('Rewards\x20suppressed\x20for\x20order\x20'+(W['order']??W['progress'])+':\x20the\x20order\x20sits\x20on\x20a\x20refund/exception\x20'+('terminal\x20node\x20('+(a0||'unknown')+'),\x20so\x20Service\x20rewards\x20are\x20not\x20advertised\x20as\x20claimable\x20against\x20it.'));else{const an=fld(a4,'rewards')??[];for(const ao of an){a9['push']({'address':ao,'description':'Service\x20reward\x20'+ao+'\x20(guard-gated\x20—\x20eligibility\x20verified\x20at\x20claim\x20time)'});}}}let aa=0x0;if(G['size']>0x0){const ap=new Set();if(a6)ap['add'](a6['toLowerCase']());for(const aq of Object['values'](a2)){for(const ar of aq)ap['add'](ar['toLowerCase']());}ap['delete'](g['toLowerCase']());for(const as of ap){aa+=G['get'](as)??0x0;}}const ab={'account':g,'progress_address':W['progress'],'order_address':W['order'],'current_node':a0,'order_holder':a6,'workflow':Z?y['get'](Z):undefined,'permission':Z?C['get'](Z)??null:null,'named_accounts':a2,'claimable_rewards':a9['length']>0x0?a9:undefined,'pending_compensation':a5,'rating_pending':a7&&a6===g,'review_summary':a['radar_review_summary'],'unread_messages':aa>0x0?aa:undefined,'last_progress_at':fld(X,'current_time')??undefined,'now':I},ac=analyzeOrderParticipation(ab),ad=(fld(a4,'arbitrations')??[])['length']>0x0,ae=a7?'completed':a8?'refunded':null,af=ab['last_progress_at']!=null?(I-ab['last_progress_at'])/0x36ee80:undefined,ag=summarizeAllocation(fld(a4,'order_allocators'),g);if(ac['perspective']==='merchant')ac['interest_analysis']=analyzeMerchantInterest({'account':g,'current_node':a0,'operable':ac['operable'],'waiting_on':ac['waiting_on'],'order_amount':balanceStr(fld(Y,'amount')),'token_type':balanceToken(fld(Y,'amount')),'allocation':ag,'compensation_fund':balanceStr(fld(a4,'compensation_fund')),'arbitration_bound':ad,'rewards_count':(fld(a4,'rewards')??[])['length'],'stalled_hours':af,'terminal':ae,'unread_messages':aa>0x0?aa:undefined});else{if(ac['perspective']==='supplier')ac['interest_analysis']=analyzeSupplierInterest({'account':g,'current_node':a0,'operable':ac['operable'],'waiting_on':ac['waiting_on'],'order_amount':balanceStr(fld(Y,'amount')),'token_type':balanceToken(fld(Y,'amount')),'arbitration_bound':ad,'compensation_fund':balanceStr(fld(a4,'compensation_fund')),'allocation_payoff':ag?.['payoffs'],'terminal':ae,'stalled_hours':af,'unread_messages':aa>0x0?aa:undefined});else{if(ac['perspective']==='collaborator')ac['interest_analysis']=analyzeCollaboratorInterest({'account':g,'current_node':a0,'operable':ac['operable'],'waiting_on':ac['waiting_on'],'collaborator_kind':ac['collaborator_kind'],'arbitration_bound':ad,'allocation_payoff':ag?.['payoffs'],'terminal':ae,'stalled_hours':af,'unread_messages':aa>0x0?aa:undefined});else ac['perspective']==='customer'&&(ac['interest_analysis']=analyzeCustomerInterest({'account':g,'current_node':a0,'operable':ac['operable'],'waiting_on':ac['waiting_on'],'order_amount':balanceStr(fld(Y,'amount')),'token_type':balanceToken(fld(Y,'amount')),'compensation_fund':balanceStr(fld(a4,'compensation_fund')),'arbitration_bound':ad,'allocation_payoff':ag?.['payoffs'],'terminal':ae,'stalled_hours':af,'unread_messages':aa>0x0?aa:undefined}));}}const ah=Y?fld(Y,'allocation'):undefined;if(Y&&ah){const at=B['get'](ah['toLowerCase']()),au=fld(Y,'dispute')??[];if(at)try{ac['fund_advice']=buildAllocationAdvice({'pool':{'address':ah,'balance':fld(at,'balance'),'allocators':fld(at,'allocators'),'threshold':fld(at,'threshold'),'payment':fld(at,'payment'),'for_object':fld(at,'payment_info')!==undefined?fld(at,'payment_info')?.['for_object']:fld(at,'for_object')},'order_amount':fld(Y,'amount'),'perspective':ac['perspective'],'is_order_holder':a6===g,'completed':a7,'refunded':a8,'can_act_now':ac['operable']['length']>0x0,'compensation_fund':fld(a4,'compensation_fund'),'has_dispute':au['length']>0x0});}catch(av){f['push']('Fund\x20advice\x20failed\x20for\x20'+ah+':\x20'+av['message']+'.');}else f['push']('Allocation\x20pool\x20'+ah+'\x20not\x20found\x20—\x20fund-state\x20advice\x20unavailable\x20for\x20'+W['progress']+'.');}if(d&&Y){const aw={'order_id':W['order'],'service_id':a3??'','current_node':a0||undefined,'created_at':Number(fld(Y,'time')??I)||I,'last_progress_at':fld(X,'current_time')??undefined,'now':I,'order_amount':((()=>{try{return BigInt(fld(Y,'amount')??0x0);}catch{return undefined;}})()),'compensation_balance':((()=>{try{const ax=fld(a4,'compensation_fund');return ax!=null?BigInt(ax):undefined;}catch{return undefined;}})()),'token':registryDisplayHint(extractGenericTokenType(fld(a4,'type_raw'))),'has_arbitration':(fld(a4,'arbitrations')??[])['length']>0x0,'pending_user_action':ac['operable']['some'](ax=>ax['execution_path']==='order_holder'),'completed':a7,'refunded':a8};try{const ax=monitorOrder({'current':aw,'thresholds':a['radar_monitor_thresholds']});ax['length']>0x0&&(ac['attached_alerts']=ax);}catch(ay){f['push']('Order\x20monitor\x20failed\x20for\x20'+W['order']+':\x20'+ay['message']+'.');}}H['push'](ac);}const J=aggregateRadar(H,F);return{'action':'participation_radar','account':g,'orders_analyzed':J['orders_analyzed'],'actionable':J['actionable'],'waiting':J['waiting'],'all_pending_claims':J['all_pending_claims'],'unread_messages_total':J['unread_messages_total'],'data_gaps':f,'summary':J['summary']};}
|
|
1
|
+
import{watch_conversations}from'@wowok/wowok';import{analyzeOrderParticipation,aggregateRadar,isConsequenceNode}from'../../participation/radar-core.js';import{workflowSubgraphFromRows}from'../../graph/onchain/index.js';import{Config}from'@wowok/wowok/w/local';import{resolveAddress as a335a}from'../../tools/handlers/name-resolution.js';import{monitorOrder}from'../../customer/order-monitor.js';import{analyzeMerchantInterest}from'../../participation/merchant-interest.js';import{analyzeCustomerInterest}from'../../participation/customer-interest.js';import{analyzeSupplierInterest}from'../../participation/supplier-interest.js';import{analyzeCollaboratorInterest}from'../../participation/collaborator-interest.js';import{buildAllocationAdvice}from'../../participation/allocation-advice.js';import{fetchMachineNodes}from'./machine-nodes.js';import{extractGenericTokenType,registryDisplayHint}from'../../knowledge/fund-layer.js';import{classifyRecipient,derivePayoffFromSharing}from'../../knowledge/recipient-constraint.js';import{batchQueryObjectsByIds,batchQueryTableItems}from'../../graph/onchain/sdk-batch.js';function fld(a,b){return a?.[b]??a?.['data']?.[b];}async function resolveAddress(a,b){return a335a(a,b);}function balanceStr(a){if(a==null)return undefined;if(typeof a==='object'&&'balance'in a)return String(a['balance']);return String(a);}function balanceToken(a){if(a!=null&&typeof a==='object'&&typeof a['token_type']==='string')return a['token_type'];return undefined;}function summarizeAllocation(a,b){const c=Array['isArray'](a)?a:Array['isArray'](a?.['allocators'])?a['allocators']:[];if(c['length']===0x0)return undefined;let d=0x0,e=0x0,f=0x0,g=0x0;const h=[],i=b['toLowerCase']();for(const j of c){const k=j?.['sharing']??[];for(const l of k){d++;const m=classifyRecipient(l['who']);if(!m)continue;if(m['kind']==='submission')e++;else{if(m['kind']==='signer')g++;else{if(m['kind']==='entity'&&m['address']['toLowerCase']()===i)f++;}}}h['push'](derivePayoffFromSharing(k,'service_order_allocators'));}return{'recipient_slots':d,'guard_gated_slots':e,'direct_to_me_slots':f,'to_payer_slots':g,'payoffs':h};}export async function fetchEntityPermissions(a,b){const c=new Map(),{items:d}=await batchQueryTableItems(a,{'network':b});for(const e of d){const f=e['object'];if(f?.['type']!=='TableItem_PermissionPerm')continue;const g=fld(f,'address'),h=fld(f,'perm')??[],i=h['map'](j=>typeof j==='number'?j:typeof j?.['index']==='number'?j['index']:null)['filter'](j=>j!==null);if(g)c['set'](g,i);}return c;}function toWorkflowSubgraph(a,b){return workflowSubgraphFromRows(a,b);}export async function handleParticipationRadar(a){if(!a['radar_account'])throw new Error('\x27radar_account\x27\x20is\x20required\x20for\x20participation_radar');if(!a['radar_targets']||a['radar_targets']['length']===0x0)throw new Error('\x27radar_targets\x27\x20(1-20\x20in-flight\x20orders)\x20is\x20required\x20for\x20participation_radar');const b=a['context_network']??await Config['Instance']()['network_get'](),d=a['radar_include_alerts']??!![],f=[],g=await resolveAddress(a['radar_account'],'radar_account'),h=await Promise['all'](a['radar_targets']['map'](async K=>({'progress':await resolveAddress(K['progress'],'progress'),'order':K['order']?await resolveAddress(K['order'],'order'):undefined}))),i=h['flatMap'](K=>K['order']?[K['progress'],K['order']]:[K['progress']]),j=await batchQueryObjectsByIds(i,b),k=new Map();for(const K of j){const L=fld(K,'object');if(L)k['set'](L,K);}const l=new Map(),m=new Map();for(const M of h){const N=k['get'](M['progress']);if(!N){f['push']('Progress\x20'+M['progress']+'\x20not\x20found\x20on\x20'+b+'\x20—\x20target\x20skipped.');continue;}l['set'](M['progress'],N);if(M['order']){const O=k['get'](M['order']);if(O)m['set'](M['order'],O);else f['push']('Order\x20'+M['order']+'\x20not\x20found\x20on\x20'+b+'\x20—\x20order-holder\x20detection\x20disabled\x20for\x20'+M['progress']+'.');}}h['length']>0x0&&l['size']===0x0&&f['push']('NETWORK\x20MISMATCH\x20SUSPECTED:\x200/'+h['length']+'\x20radar\x20targets\x20exist\x20on\x20network=\x27'+b+'\x27.\x20'+'These\x20objects\x20most\x20likely\x20live\x20on\x20a\x20different\x20network\x20—\x20re-run\x20with\x20the\x20matching\x20\x27network\x27\x20parameter.');const q=[...new Set([...l['values']()]['map'](P=>fld(P,'machine'))['filter'](P=>!!P))],s=[...new Set([...m['values']()]['map'](P=>fld(P,'service'))['filter'](P=>!!P))],u=[...new Set([...m['values']()]['flatMap'](P=>{const Q=fld(P,'dispute');return Array['isArray'](Q)?Q:[];}))],w=[...new Set([...m['values']()]['map'](P=>fld(P,'allocation'))['filter'](P=>!!P&&P['startsWith']('0x')))],x=new Map(),y=new Map(),z=new Map(),A=new Map(),B=new Map();await Promise['all']([...q['map'](async P=>{try{const [Q,R]=await Promise['all']([batchQueryObjectsByIds([P],b),fetchMachineNodes(P,b,!![])]);if(Q[0x0])x['set'](P,Q[0x0]);y['set'](P,toWorkflowSubgraph(R,P));}catch(S){f['push']('Machine\x20'+P+'\x20fetch\x20failed:\x20'+S['message']+'\x20—\x20workflow\x20unknown\x20for\x20its\x20orders.');}}),((async()=>{if(s['length']===0x0)return;try{const P=await batchQueryObjectsByIds(s,b);for(const Q of P){const R=fld(Q,'object');if(R)z['set'](R,Q);}}catch(S){f['push']('Service\x20query\x20failed:\x20'+S['message']+'\x20—\x20compensation/reward\x20context\x20degraded.');}})()),((async()=>{if(u['length']===0x0)return;try{const P=await batchQueryObjectsByIds(u,b);for(const Q of P){const R=fld(Q,'object');if(R)A['set'](R,Q);}}catch(S){f['push']('Arb\x20query\x20failed:\x20'+S['message']+'\x20—\x20compensation\x20claim\x20detection\x20disabled.');}})()),((async()=>{if(w['length']===0x0)return;try{const P=await batchQueryObjectsByIds(w,b);for(const Q of P){const R=fld(Q,'object');if(R)B['set'](R,Q);}}catch(S){f['push']('Allocation\x20pool\x20query\x20failed:\x20'+S['message']+'\x20—\x20fund-state\x20advice\x20degraded\x20to\x20template\x20level.');}})())]);const C=new Map(),D=[...new Set(q['map'](P=>fld(x['get'](P),'permission'))['filter'](P=>!!P))],E=new Map();await Promise['all'](D['map'](async P=>{try{const [Q,R]=await Promise['all']([batchQueryObjectsByIds([P],b),fetchEntityPermissions(P,b)]),S=Q[0x0];E['set'](P,{'address':P,'entity_count':fld(S,'entity_count'),'perm_remark':fld(S,'perm_remark'),'entityPermissions':R,'owner':fld(S,'builder')});}catch(T){f['push']('Permission\x20'+P+'\x20fetch\x20failed:\x20'+T['message']+'\x20—\x20operator\x20permission\x20matching\x20degraded.');}}));for(const P of q){const Q=fld(x['get'](P),'permission');if(Q&&E['has'](Q))C['set'](P,E['get'](Q));}let F=0x0;const G=new Map();try{const R=await watch_conversations({'account':g,'unreadOnly':!![],'previewMessageCount':0x0,'skipAutoMarkViewed':!![]}),S=Array['isArray'](R)?R:R?.['conversations']??[];for(const T of S){const U=T?.['peerAddress'],V=typeof T?.['unreadCount']==='number'?T['unreadCount']:0x0;typeof U==='string'&&V>0x0&&(G['set'](U['toLowerCase'](),V),F+=V);}}catch{f['push']('Messenger\x20unread\x20unavailable\x20(radar\x20account\x20is\x20not\x20a\x20local\x20messenger\x20account,\x20or\x20messenger\x20storage\x20offline)\x20'+'—\x20unread_messages_total\x20reported\x20as\x200.');}const H=[],I=Date['now']();for(const W of h){const X=l['get'](W['progress']);if(!X)continue;const Y=W['order']?m['get'](W['order']):undefined,Z=fld(X,'machine'),a0=fld(X,'current')??'',a1=fld(X,'namedOperator')??[],a2={};for(const ai of a1){if(ai?.['name'])a2[ai['name']]=Array['isArray'](ai['operators'])?ai['operators']:[];}const a3=Y?fld(Y,'service'):undefined,a4=a3?z['get'](a3):undefined;let a5;const a6=Y?fld(Y,'builder'):undefined;if(Y&&a6===g){const aj=fld(Y,'dispute')??[];for(const ak of aj){const al=A['get'](ak);if(!al)continue;const am=fld(al,'indemnity');if(am){a5={'arbitration':fld(al,'arbitration')??ak,'note':'Arbitration\x20verdict\x20recorded\x20an\x20indemnity\x20(Arb\x20'+ak+').\x20'+'Claim\x20via\x20order\x20op=\x27arb_claim_compensation\x27\x20—\x20paid\x20directly\x20from\x20the\x20Service\x20compensation_fund.\x20'+'(Claimed-status\x20is\x20not\x20readable\x20from\x20the\x20Arb\x20object;\x20the\x20contract\x20rejects\x20double-claims.)'};break;}}}const a7=isConsequenceNode(a0,'completed'),a8=isConsequenceNode(a0,'refunded'),a9=[];if(a4&&a6===g){if(a8)f['push']('Rewards\x20suppressed\x20for\x20order\x20'+(W['order']??W['progress'])+':\x20the\x20order\x20sits\x20on\x20a\x20refund/exception\x20'+('terminal\x20node\x20('+(a0||'unknown')+'),\x20so\x20Service\x20rewards\x20are\x20not\x20advertised\x20as\x20claimable\x20against\x20it.'));else{const an=fld(a4,'rewards')??[];for(const ao of an){a9['push']({'address':ao,'description':'Service\x20reward\x20'+ao+'\x20(guard-gated\x20—\x20eligibility\x20verified\x20at\x20claim\x20time)'});}}}let aa=0x0;if(G['size']>0x0){const ap=new Set();if(a6)ap['add'](a6['toLowerCase']());for(const aq of Object['values'](a2)){for(const ar of aq)ap['add'](ar['toLowerCase']());}ap['delete'](g['toLowerCase']());for(const as of ap){aa+=G['get'](as)??0x0;}}const ab={'account':g,'progress_address':W['progress'],'order_address':W['order'],'current_node':a0,'order_holder':a6,'workflow':Z?y['get'](Z):undefined,'permission':Z?C['get'](Z)??null:null,'named_accounts':a2,'claimable_rewards':a9['length']>0x0?a9:undefined,'pending_compensation':a5,'rating_pending':a7&&a6===g,'review_summary':a['radar_review_summary'],'unread_messages':aa>0x0?aa:undefined,'last_progress_at':fld(X,'current_time')??undefined,'now':I},ac=analyzeOrderParticipation(ab),ad=(fld(a4,'arbitrations')??[])['length']>0x0,ae=a7?'completed':a8?'refunded':null,af=ab['last_progress_at']!=null?(I-ab['last_progress_at'])/0x36ee80:undefined,ag=summarizeAllocation(fld(a4,'order_allocators'),g);if(ac['perspective']==='merchant')ac['interest_analysis']=analyzeMerchantInterest({'account':g,'current_node':a0,'operable':ac['operable'],'waiting_on':ac['waiting_on'],'order_amount':balanceStr(fld(Y,'amount')),'token_type':balanceToken(fld(Y,'amount')),'allocation':ag,'compensation_fund':balanceStr(fld(a4,'compensation_fund')),'arbitration_bound':ad,'rewards_count':(fld(a4,'rewards')??[])['length'],'stalled_hours':af,'terminal':ae,'unread_messages':aa>0x0?aa:undefined});else{if(ac['perspective']==='supplier')ac['interest_analysis']=analyzeSupplierInterest({'account':g,'current_node':a0,'operable':ac['operable'],'waiting_on':ac['waiting_on'],'order_amount':balanceStr(fld(Y,'amount')),'token_type':balanceToken(fld(Y,'amount')),'arbitration_bound':ad,'compensation_fund':balanceStr(fld(a4,'compensation_fund')),'allocation_payoff':ag?.['payoffs'],'terminal':ae,'stalled_hours':af,'unread_messages':aa>0x0?aa:undefined});else{if(ac['perspective']==='collaborator')ac['interest_analysis']=analyzeCollaboratorInterest({'account':g,'current_node':a0,'operable':ac['operable'],'waiting_on':ac['waiting_on'],'collaborator_kind':ac['collaborator_kind'],'arbitration_bound':ad,'allocation_payoff':ag?.['payoffs'],'terminal':ae,'stalled_hours':af,'unread_messages':aa>0x0?aa:undefined});else ac['perspective']==='customer'&&(ac['interest_analysis']=analyzeCustomerInterest({'account':g,'current_node':a0,'operable':ac['operable'],'waiting_on':ac['waiting_on'],'order_amount':balanceStr(fld(Y,'amount')),'token_type':balanceToken(fld(Y,'amount')),'compensation_fund':balanceStr(fld(a4,'compensation_fund')),'arbitration_bound':ad,'allocation_payoff':ag?.['payoffs'],'terminal':ae,'stalled_hours':af,'unread_messages':aa>0x0?aa:undefined}));}}const ah=Y?fld(Y,'allocation'):undefined;if(Y&&ah){const at=B['get'](ah['toLowerCase']()),au=fld(Y,'dispute')??[];if(at)try{ac['fund_advice']=buildAllocationAdvice({'pool':{'address':ah,'balance':fld(at,'balance'),'allocators':fld(at,'allocators'),'threshold':fld(at,'threshold'),'payment':fld(at,'payment'),'for_object':fld(at,'payment_info')!==undefined?fld(at,'payment_info')?.['for_object']:fld(at,'for_object')},'order_amount':fld(Y,'amount'),'perspective':ac['perspective'],'is_order_holder':a6===g,'completed':a7,'refunded':a8,'can_act_now':ac['operable']['length']>0x0,'compensation_fund':fld(a4,'compensation_fund'),'has_dispute':au['length']>0x0});}catch(av){f['push']('Fund\x20advice\x20failed\x20for\x20'+ah+':\x20'+av['message']+'.');}else f['push']('Allocation\x20pool\x20'+ah+'\x20not\x20found\x20—\x20fund-state\x20advice\x20unavailable\x20for\x20'+W['progress']+'.');}if(d&&Y){const aw={'order_id':W['order'],'service_id':a3??'','current_node':a0||undefined,'created_at':Number(fld(Y,'time')??I)||I,'last_progress_at':fld(X,'current_time')??undefined,'now':I,'order_amount':((()=>{try{return BigInt(fld(Y,'amount')??0x0);}catch{return undefined;}})()),'compensation_balance':((()=>{try{const ax=fld(a4,'compensation_fund');return ax!=null?BigInt(ax):undefined;}catch{return undefined;}})()),'token':registryDisplayHint(extractGenericTokenType(fld(a4,'type_raw'))),'has_arbitration':(fld(a4,'arbitrations')??[])['length']>0x0,'pending_user_action':ac['operable']['some'](ax=>ax['execution_path']==='order_holder'),'completed':a7,'refunded':a8};try{const ax=monitorOrder({'current':aw,'thresholds':a['radar_monitor_thresholds']});ax['length']>0x0&&(ac['attached_alerts']=ax);}catch(ay){f['push']('Order\x20monitor\x20failed\x20for\x20'+W['order']+':\x20'+ay['message']+'.');}}H['push'](ac);}const J=aggregateRadar(H,F);return{'action':'participation_radar','account':g,'orders_analyzed':J['orders_analyzed'],'actionable':J['actionable'],'waiting':J['waiting'],'all_pending_claims':J['all_pending_claims'],'unread_messages_total':J['unread_messages_total'],'data_gaps':f,'summary':J['summary']};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Config}from'@wowok/wowok/w/local';import{resolveAddress as
|
|
1
|
+
import{Config}from'@wowok/wowok/w/local';import{resolveAddress as a338a}from'../../tools/handlers/name-resolution.js';import{deriveRelationshipProfile}from'../../relationship/index.js';import{analyzeDemanderInterest}from'../../participation/demander-interest.js';import{GUARD_BINDING_REGISTRY,OWNER_RECEIVE_COGNITION}from'../../knowledge/guard-bindings.js';import{detectBridgesForObjects,summarizeBridge}from'../../knowledge/scenario-topology.js';import{SdkDataPlane,expandTopology,projectRelationshipFacts}from'../../graph/onchain/index.js';export async function resolveAddress(a,b){return a338a(a,b);}export async function handleRelationshipProfile(a){if(!a['radar_account'])throw new Error('\x27radar_account\x27\x20is\x20required\x20for\x20relationship_profile');const b=a['context_network']??await Config['Instance']()['network_get'](),c=await resolveAddress(a['radar_account'],'radar_account'),d=new SdkDataPlane(b),e=await expandTopology(d,{'network':b,'seed':c,'budget':{'maxDepth':0x4,'maxNodes':0x384,'maxRpcs':0xa0,'perKindCaps':{'eoa.permission':0x19,'permission.core_binding':0x3c,'permission.tx_binding':0x3c,'eoa.order':0x28,'service.order':0x28,'order.allocation':0x28,'demand.presenter':0x3c,'machine.node':0x78}},'edges':{'tableEdges':['permission.entity','demand.presenter','machine.node']}}),f=[...e['gaps']];for(const z of e['truncations']){f['push']('truncated\x20'+z['schema']+'\x20at\x20'+z['nodeId']+':\x20observed\x20at\x20least\x20'+z['observed']+'\x20edge(s)');}if(e['budgetExhausted']['rpcs'])f['push']('RPC\x20batch\x20budget\x20exhausted\x20—\x20topology\x20is\x20partial\x20(see\x20budget\x20settings).');if(e['budgetExhausted']['nodes'])f['push']('Node\x20budget\x20exhausted\x20—\x20topology\x20is\x20partial.');const g=projectRelationshipFacts(e,c),{machines:h,orders:i,demands:j,allocations:k,contacts:l,arbitrations:m}={'machines':g['machines']??[],'orders':g['orders']??[],'demands':g['demands']??[],'allocations':g['allocations']??[],'contacts':g['contacts']??[],'arbitrations':g['arbitrations']??[]},n=deriveRelationshipProfile(g),o=new Set();if(k['length']>0x0)o['add']('Allocation');if(j['length']>0x0)o['add']('Demand');if(h['some'](A=>(A['forwards']??[])['some'](B=>B['guard'])))o['add']('MachineForward');if(m['length']>0x0)o['add']('Arbitration');for(const A of o){const B=GUARD_BINDING_REGISTRY['filter'](D=>D['object']===A);if(B['length']===0x0)continue;const C=B['map'](D=>{const E=D['preset_kind']==='amount'&&D['object']==='Allocation'?'\x20(Rate\x20is\x20basis\x20points;\x20rates\x20must\x20complete\x2010000\x20unless\x20a\x20Surplus\x20entry\x20exists)':'';return''+D['slot']+E+'\x20['+D['preset_kind']+']\x20—\x20creator:\x20'+D['creator']['split']('\x20—\x20')[0x0]['split']('.\x20')[0x0]+';\x20user:\x20'+D['user'];})['join']('\x20|\x20');n['notes']['push']('Guard-preset\x20deep\x20context\x20on\x20the\x20'+A+'(s)\x20in\x20this\x20topology:\x20'+C+'.');}k['length']>0x0&&n['notes']['push']('Cognition\x20fixed:\x20'+OWNER_RECEIVE_COGNITION);m['some'](D=>D['object_kind']==='service')&&f['push']('Arbitration\x20service\x20voting-guard\x20member\x20resolution\x20is\x20not\x20implemented\x20yet\x20—\x20arbitration\x20services\x20contribute\x20binding\x20presence\x20only\x20(Arb\x20CASE\x20votes\x20ARE\x20parsed\x20into\x20arbitration_delegation/dispute_resolution\x20edges).');const p=['Permission'];if(i['length']>0x0)p['push']('Order');if(h['length']>0x0)p['push']('Machine','Progress');if(k['length']>0x0)p['push']('Allocation','Payment');if(j['length']>0x0)p['push']('Demand');if(m['length']>0x0)p['push']('Arbitration','Arb');if(l['length']>0x0)p['push']('Contact');if(Object['keys'](g['service_owners']??{})['length']>0x0)p['push']('Service','Guard');const q=detectBridgesForObjects(p);if(q['length']>0x0){const D=q['slice'](0x0,0x8)['map'](E=>summarizeBridge(E))['join']('\x0a-\x20');n['notes']['push']('Scenario\x20topology\x20('+q['length']+'\x20bridge(s)\x20implied\x20by\x20the\x20touched\x20objects\x20—\x20capability\x20comes\x20from\x20the\x20'+('\x22integration,\x20not\x20from\x20any\x20single\x20object):\x0a-\x20'+D));}const r=a['relation_kinds']?new Set(a['relation_kinds']):undefined,s=r?n['edges']['filter'](E=>r['has'](E['kind'])):n['edges'],u=s['reduce']((E,F)=>{return E[F['kind']]=(E[F['kind']]??0x0)+0x1,E;},{});let w=c+'\x20holds\x20'+s['length']+'\x20relationship\x20edge(s)\x20across\x20'+Object['keys'](n['by_counterparty'])['length']+'\x20counterparty(ies)'+(Object['keys'](u)['length']>0x0?':\x20'+Object['entries'](u)['map'](([E,F])=>E+'×'+F)['join'](',\x20')+'.':'.');s['length']===0x0&&f['length']>0x0&&(w+='\x20No\x20edges\x20derived\x20—\x20check\x20data_gaps\x20(the\x20account\x20may\x20have\x20no\x20on-chain\x20power\x20carriers\x20on\x20this\x20network).');const x=(E,F)=>E['toLowerCase']()===F['toLowerCase'](),y=j['filter'](E=>E['owner']&&x(E['owner'],c))['map'](E=>({'demand':E['address'],...analyzeDemanderInterest({'account':c,'demand':E['address'],'presenters':E['presenters']??[],'rewards':(E['rewards']??[])['map'](F=>({'address':F})),'guards':E['guards']??[],'open':!(E['presenters']??[])['some'](F=>F['acceptance_score']!==undefined)})}));return y['length']>0x0&&(w+='\x20Anchor\x20demands\x20'+y['length']+'\x20demand(s)\x20—\x20demander-interest\x20analysis\x20attached.'),{'action':'relationship_profile','account':c,'edges':s,'by_counterparty':n['by_counterparty'],'notes':n['notes'],'data_gaps':f,'summary':w,...y['length']>0x0?{'demander_interest':y}:{}};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{describe,expect,it}from'vitest';import{generateBusinessReport,PENDING_STALE_HOURS_DEFAULT}from'./reverse-mapping.js';const svc=(a={})=>({'type':'0x2::service::Service','object':'0xsvc','name':'NK4\x20Test\x20Service','description':'Deterministic\x20report\x20fixture','bPublished':!![],'bPaused':![],'sales':[{'id':'0xsale'}],'arbitrations':['0xarb'],'compensation_fund':'1000','buy_guard':'0xbuyguard','um':'0xum','rewards':[],'order_allocators':{'allocators':[{'sharing':[{'who':{'GuardIdentifier':0x0}}]}]},...a}),machine=(a={})=>({'type':'0x2::machine::Machine','object':'0xmachine','bPublished':!![],'bPaused':![],'node_count':0x2,...a}),EDGE_OK=[{'from':'','to':'open'},{'from':'open','to':'done_ok'}];describe('N-K4\x20—\x20topology\x20stop\x20derivation',()=>{it('stop\x20nodes\x20come\x20from\x20edges\x20even\x20when\x20names\x20match\x20no\x20suffix',()=>{const a=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':[{'name':'open'},{'name':'beta'}],'machine_edges':[{'from':'','to':'open'},{'from':'open','to':'beta'}]});expect(a['merchantProfile']['workflowDescription'])['toContain']('Stop\x20nodes\x20(derived\x20from\x20workflow\x20edges):\x20beta'),expect(a['merchantProfile']['workflowDescription'])['not']['toContain']('name\x20convention');}),it('an\x20edge\x20table\x20with\x20no\x20entry\x20edge\x20keeps\x20topology\x20stops\x20but\x20degrades\x20reachability',()=>{const a=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':[{'name':'alpha'},{'name':'beta'}],'machine_edges':[{'from':'alpha','to':'beta'}]});expect(a['merchantProfile']['workflowDescription'])['toContain']('Stop\x20nodes\x20(derived\x20from\x20workflow\x20edges):\x20beta'),expect(a['merchantProfile']['refundPolicy'])['not']['toContain']('verify\x20the\x20reversal\x20rail');});}),describe('N-K4\x20—\x20refund-rail\x20verification\x20grades',()=>{const a=[{'name':'open'},{'name':'done_ok'},{'name':'refund'}],b=[{'from':'','to':'open'},{'from':'open','to':'refund'},{'from':'open','to':'done_ok'}],c=[{'from':'','to':'open'},{'from':'open','to':'done_ok'}];it('VERIFIED\x20—\x20reachable\x20rail\x20plus\x20an\x20order-routed\x20allocation\x20slot',()=>{const d=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':a,'machine_edges':b});expect(d['merchantProfile']['refundPolicy'])['toContain']('Workflow\x20edges\x20verify\x20the\x20reversal\x20rail\x20is\x20reachable:\x20node(s)\x20refund.'),expect(d['merchantProfile']['refundPolicy'])['toContain']('Escrow\x20can\x20be\x20routed\x20back\x20to\x20the\x20payer\x20or\x20to\x20the\x20order\x20by\x20an\x20allocation\x20slot.'),expect(d['userRiskAssessment']['protections'])['toContain']('Refund\x20path\x20VERIFIED\x20—\x20reachable\x20rail\x20plus\x20an\x20order-routed\x20allocation\x20slot.');}),it('reachable\x20—\x20rail\x20reachable\x20but\x20no\x20order-routed\x20slot',()=>{const d=generateBusinessReport({'objects':[svc({'order_allocators':{'allocators':[{'sharing':[{'who':{'Entity':'0xseller'}}]}]}}),machine()],'machine_nodes':a,'machine_edges':b});expect(d['merchantProfile']['refundPolicy'])['toContain']('verify\x20the\x20reversal\x20rail\x20is\x20reachable'),expect(d['merchantProfile']['refundPolicy'])['not']['toContain']('allocation\x20slot.'),expect(d['userRiskAssessment']['protections'])['toContain']('Refund\x20path\x20reachable\x20via\x20workflow\x20edges\x20(no\x20order-routed\x20allocation\x20slot\x20found).');}),it('dead\x20rail\x20without\x20a\x20slot\x20—\x20NO\x20refund\x20path\x20at\x20all',()=>{const d=generateBusinessReport({'objects':[svc({'order_allocators':{'allocators':[{'sharing':[{'who':{'Entity':'0xseller'}}]}]}}),machine()],'machine_nodes':a,'machine_edges':c});expect(d['merchantProfile']['refundPolicy'])['toContain']('NO\x20refund\x20path\x20detected'),expect(d['merchantProfile']['refundPolicy'])['toContain']('the\x20named\x20refund\x20node(s)\x20refund\x20are\x20UNREACHABLE\x20from\x20the\x20workflow\x20entry'),expect(d['userRiskAssessment']['keyRisks'])['toContain']('No\x20refund\x20path\x20—\x20escrowed\x20funds\x20may\x20be\x20unrecoverable.');}),it('dead\x20rail\x20with\x20a\x20slot\x20—\x20the\x20slot\x20is\x20the\x20only\x20remaining\x20return\x20leg',()=>{const d=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':a,'machine_edges':c});expect(d['merchantProfile']['refundPolicy'])['toContain']('A\x20refund\x20path\x20is\x20present.'),expect(d['merchantProfile']['refundPolicy'])['toContain']('the\x20named\x20refund\x20node(s)\x20refund\x20are\x20UNREACHABLE\x20from\x20the\x20workflow\x20entry'),expect(d['userRiskAssessment']['keyRisks']['find'](e=>e['includes']('unreachable')))['toContain']('that\x20rail\x20is\x20dead;\x20only\x20the\x20allocation\x20slot\x20can\x20still\x20return\x20funds.');});}),describe('N-K4\x20—\x20pending-order\x20aging',()=>{const a=0x18bcfe56800,b=0x36ee80,c=0x5265c00,d=(e,f=null,g='0xo')=>({'id':g,'created_at_ms':a-e,'claimed_by':f});it('3\x20overdue\x20pending\x20orders\x20floor\x20the\x20risk\x20level\x20to\x20high',()=>{const e=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':[{'name':'open'},{'name':'done_ok'}],'machine_edges':EDGE_OK,'orders':[d(0x8*c,null,'0x1'),d(0x9*c,null,'0x2'),d(0xa*c,null,'0x3')],'now_ms':a});expect(e['orderHealth'])['toMatchObject']({'observed':0x3,'pending':0x3,'agingKnown':!![],'overdue':0x3,'staleHours':0xa8}),expect(e['orderHealth']?.['oldestPendingAgeDays'])['toBe'](0xa),expect(e['userRiskAssessment']['riskLevel'])['toBe']('high'),expect(e['userRiskAssessment']['keyRisks']['find'](f=>f['includes']('settlement\x20window')))['toContain']('oldest:\x2010d');}),it('1\x20overdue\x20pending\x20order\x20floors\x20the\x20risk\x20level\x20to\x20medium',()=>{const e=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':[{'name':'open'},{'name':'done_ok'}],'machine_edges':EDGE_OK,'orders':[d(0x8*c,null,'0x1')],'now_ms':a});expect(e['orderHealth']?.['overdue'])['toBe'](0x1),expect(e['userRiskAssessment']['riskLevel'])['toBe']('medium');}),it('fresh\x20pending\x20orders\x20are\x20a\x20notice,\x20never\x20a\x20risk\x20floor',()=>{const e=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':[{'name':'open'},{'name':'done_ok'}],'machine_edges':EDGE_OK,'orders':[d(0x2*b,null,'0x1'),d(0x5*b,null,'0x2')],'now_ms':a});expect(e['orderHealth']?.['overdue'])['toBe'](0x0),expect(e['userRiskAssessment']['riskLevel'])['toBe']('low'),expect(e['userRiskAssessment']['notices'])['toContain']('2\x20order(s)\x20in\x20the\x20recent\x20window\x20are\x20pending\x20(not\x20yet\x20settled).');}),it('claimed\x20orders\x20are\x20not\x20pending\x20and\x20never\x20age',()=>{const e=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':[{'name':'open'},{'name':'done_ok'}],'machine_edges':EDGE_OK,'orders':[d(0x1e*c,'0xbuyer','0x1')],'now_ms':a});expect(e['orderHealth'])['toMatchObject']({'observed':0x1,'pending':0x0,'overdue':0x0}),expect(e['userRiskAssessment']['riskLevel'])['toBe']('low'),expect(e['userRiskAssessment']['notices']['join']('\x20'))['not']['toContain']('pending');}),it('orders\x20without\x20a\x20readable\x20timestamp\x20count\x20as\x20pending\x20but\x20never\x20overdue',()=>{const e=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':[{'name':'open'},{'name':'done_ok'}],'machine_edges':EDGE_OK,'orders':[{'id':'0x1','claimed_by':null}],'now_ms':a});expect(e['orderHealth'])['toMatchObject']({'observed':0x1,'pending':0x1,'agingKnown':!![],'overdue':0x0,'oldestPendingAgeDays':null}),expect(e['userRiskAssessment']['riskLevel'])['toBe']('low');}),it('no\x20clock\x20supplied\x20—\x20agingKnown=false\x20and\x20overdue\x20is\x200\x20BY\x20CONVENTION',()=>{const e=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':[{'name':'open'},{'name':'done_ok'}],'machine_edges':EDGE_OK,'orders':[d(0x1e*c,null,'0x1')]});expect(e['orderHealth'])['toMatchObject']({'pending':0x1,'agingKnown':![],'overdue':0x0,'oldestPendingAgeDays':null}),expect(e['userRiskAssessment']['riskLevel'])['toBe']('low');}),it('a\x20custom\x20stale\x20threshold\x20overrides\x20the\x20168h\x20default',()=>{const e=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':[{'name':'open'},{'name':'done_ok'}],'machine_edges':EDGE_OK,'orders':[d(0x2*c,null,'0x1')],'now_ms':a,'pending_stale_hours':0x18});expect(e['orderHealth']?.['staleHours'])['toBe'](0x18),expect(e['orderHealth']?.['overdue'])['toBe'](0x1);}),it('the\x20default\x20stale\x20threshold\x20constant\x20is\x20168h',()=>{expect(PENDING_STALE_HOURS_DEFAULT)['toBe'](0xa8);});}),describe('N-K4\x20—\x20determinism\x20and\x20backward\x20compatibility',()=>{it('identical\x20inputs\x20produce\x20byte-identical\x20reports\x20(fixed\x20clock)',()=>{const c={'objects':[svc(),machine()],'machine_nodes':[{'name':'open'},{'name':'done_ok'},{'name':'refund'}],'machine_edges':[{'from':'','to':'open'},{'from':'open','to':'refund'},{'from':'open','to':'done_ok'}],'orders':[{'id':'0x1','created_at_ms':0x18b944a9e00,'claimed_by':null}],'now_ms':0x18bcfe56800},d=JSON['stringify'](generateBusinessReport(c)),e=JSON['stringify'](generateBusinessReport(c));expect(d)['toBe'](e);}),it('no\x20edges\x20and\x20no\x20orders\x20reproduce\x20the\x20legacy\x20name-convention\x20behavior',()=>{const a=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':[{'name':'open'},{'name':'done_ok'},{'name':'refund'}]});expect(a['orderHealth'])['toBeUndefined'](),expect(a['merchantProfile']['workflowDescription'])['toContain']('name\x20convention\x20only'),expect(a['merchantProfile']['refundPolicy'])['toContain']('A\x20refund\x20path\x20is\x20present.'),expect(a['merchantProfile']['refundPolicy'])['toContain']('Reversal\x20rail:\x20workflow\x20node(s)\x20refund.');}),it('an\x20empty\x20order\x20window\x20emits\x20no\x20orderHealth',()=>{const a=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':[{'name':'open'}],'machine_edges':[{'from':'','to':'open'}],'orders':[],'now_ms':0x18bcfe56800});expect(a['orderHealth'])['toBeUndefined']();});});
|
|
1
|
+
import{describe,expect,it}from'vitest';import{generateBusinessReport,PENDING_STALE_HOURS_DEFAULT}from'./reverse-mapping.js';const svc=(a={})=>({'type':'0x2::service::Service','object':'0xsvc','name':'NK4\x20Test\x20Service','description':'Deterministic\x20report\x20fixture','bPublished':!![],'bPaused':![],'sales':[{'id':'0xsale'}],'arbitrations':['0xarb'],'compensation_fund':'1000','buy_guard':'0xbuyguard','um':'0xum','rewards':[],'order_allocators':{'allocators':[{'sharing':[{'who':{'GuardIdentifier':0x0}}]}]},...a}),machine=(a={})=>({'type':'0x2::machine::Machine','object':'0xmachine','bPublished':!![],'bPaused':![],'node_count':0x2,...a}),EDGE_OK=[{'from':'','to':'open'},{'from':'open','to':'done_ok'}];describe('N-K4\x20—\x20topology\x20stop\x20derivation',()=>{it('stop\x20nodes\x20come\x20from\x20edges\x20even\x20when\x20names\x20match\x20no\x20suffix',()=>{const a=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':[{'name':'open'},{'name':'beta'}],'machine_edges':[{'from':'','to':'open'},{'from':'open','to':'beta'}]});expect(a['merchantProfile']['workflowDescription'])['toContain']('Stop\x20nodes\x20(derived\x20from\x20workflow\x20edges):\x20beta'),expect(a['merchantProfile']['workflowDescription'])['not']['toContain']('name\x20convention');}),it('an\x20edge\x20table\x20with\x20no\x20entry\x20edge\x20keeps\x20topology\x20stops\x20but\x20degrades\x20reachability',()=>{const a=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':[{'name':'alpha'},{'name':'beta'}],'machine_edges':[{'from':'alpha','to':'beta'}]});expect(a['merchantProfile']['workflowDescription'])['toContain']('Stop\x20nodes\x20(derived\x20from\x20workflow\x20edges):\x20beta'),expect(a['merchantProfile']['refundPolicy'])['not']['toContain']('verify\x20the\x20reversal\x20rail');});}),describe('N-K4\x20—\x20refund-rail\x20verification\x20grades',()=>{const a=[{'name':'open'},{'name':'done_ok'},{'name':'refund'}],b=[{'from':'','to':'open'},{'from':'open','to':'refund'},{'from':'open','to':'done_ok'}],c=[{'from':'','to':'open'},{'from':'open','to':'done_ok'}];it('statically\x20reachable\x20—\x20reachable\x20rail\x20plus\x20an\x20order-routed\x20allocation\x20slot',()=>{const d=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':a,'machine_edges':b});expect(d['merchantProfile']['refundPolicy'])['toContain']('Workflow\x20edges\x20verify\x20the\x20reversal\x20rail\x20is\x20reachable:\x20node(s)\x20refund.'),expect(d['merchantProfile']['refundPolicy'])['toContain']('Escrow\x20can\x20be\x20routed\x20back\x20to\x20the\x20payer\x20or\x20to\x20the\x20order\x20by\x20an\x20allocation\x20slot.'),expect(d['userRiskAssessment']['protections'])['toContain']('Refund\x20path\x20statically\x20reachable\x20—\x20workflow\x20edges\x20reach\x20the\x20rail\x20and\x20an\x20order-routed\x20allocation\x20slot\x20exists\x20(static\x20graph\x20check\x20only;\x20leg\x20executability\x20is\x20audited\x20by\x20the\x20allocator\x20guard\x20lint,\x20not\x20here).');}),it('reachable\x20—\x20rail\x20reachable\x20but\x20no\x20order-routed\x20slot',()=>{const d=generateBusinessReport({'objects':[svc({'order_allocators':{'allocators':[{'sharing':[{'who':{'Entity':'0xseller'}}]}]}}),machine()],'machine_nodes':a,'machine_edges':b});expect(d['merchantProfile']['refundPolicy'])['toContain']('verify\x20the\x20reversal\x20rail\x20is\x20reachable'),expect(d['merchantProfile']['refundPolicy'])['not']['toContain']('allocation\x20slot.'),expect(d['userRiskAssessment']['protections'])['toContain']('Refund\x20path\x20statically\x20reachable\x20via\x20workflow\x20edges\x20(no\x20order-routed\x20allocation\x20slot\x20found).');}),it('dead\x20rail\x20without\x20a\x20slot\x20—\x20NO\x20refund\x20path\x20at\x20all',()=>{const d=generateBusinessReport({'objects':[svc({'order_allocators':{'allocators':[{'sharing':[{'who':{'Entity':'0xseller'}}]}]}}),machine()],'machine_nodes':a,'machine_edges':c});expect(d['merchantProfile']['refundPolicy'])['toContain']('NO\x20refund\x20path\x20detected'),expect(d['merchantProfile']['refundPolicy'])['toContain']('the\x20named\x20refund\x20node(s)\x20refund\x20are\x20UNREACHABLE\x20from\x20the\x20workflow\x20entry'),expect(d['userRiskAssessment']['keyRisks'])['toContain']('No\x20refund\x20path\x20—\x20escrowed\x20funds\x20may\x20be\x20unrecoverable.');}),it('dead\x20rail\x20with\x20a\x20slot\x20—\x20the\x20slot\x20is\x20the\x20only\x20remaining\x20return\x20leg',()=>{const d=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':a,'machine_edges':c});expect(d['merchantProfile']['refundPolicy'])['toContain']('A\x20refund\x20path\x20is\x20present.'),expect(d['merchantProfile']['refundPolicy'])['toContain']('the\x20named\x20refund\x20node(s)\x20refund\x20are\x20UNREACHABLE\x20from\x20the\x20workflow\x20entry'),expect(d['userRiskAssessment']['keyRisks']['find'](e=>e['includes']('unreachable')))['toContain']('that\x20rail\x20is\x20dead;\x20only\x20the\x20allocation\x20slot\x20can\x20still\x20return\x20funds.');});}),describe('N-K4\x20—\x20pending-order\x20aging',()=>{const a=0x18bcfe56800,b=0x36ee80,c=0x5265c00,d=(e,f=null,g='0xo')=>({'id':g,'created_at_ms':a-e,'claimed_by':f});it('3\x20overdue\x20pending\x20orders\x20floor\x20the\x20risk\x20level\x20to\x20high',()=>{const e=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':[{'name':'open'},{'name':'done_ok'}],'machine_edges':EDGE_OK,'orders':[d(0x8*c,null,'0x1'),d(0x9*c,null,'0x2'),d(0xa*c,null,'0x3')],'now_ms':a});expect(e['orderHealth'])['toMatchObject']({'observed':0x3,'pending':0x3,'agingKnown':!![],'overdue':0x3,'staleHours':0xa8}),expect(e['orderHealth']?.['oldestPendingAgeDays'])['toBe'](0xa),expect(e['userRiskAssessment']['riskLevel'])['toBe']('high'),expect(e['userRiskAssessment']['keyRisks']['find'](f=>f['includes']('settlement\x20window')))['toContain']('oldest:\x2010d');}),it('1\x20overdue\x20pending\x20order\x20floors\x20the\x20risk\x20level\x20to\x20medium',()=>{const e=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':[{'name':'open'},{'name':'done_ok'}],'machine_edges':EDGE_OK,'orders':[d(0x8*c,null,'0x1')],'now_ms':a});expect(e['orderHealth']?.['overdue'])['toBe'](0x1),expect(e['userRiskAssessment']['riskLevel'])['toBe']('medium');}),it('fresh\x20pending\x20orders\x20are\x20a\x20notice,\x20never\x20a\x20risk\x20floor',()=>{const e=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':[{'name':'open'},{'name':'done_ok'}],'machine_edges':EDGE_OK,'orders':[d(0x2*b,null,'0x1'),d(0x5*b,null,'0x2')],'now_ms':a});expect(e['orderHealth']?.['overdue'])['toBe'](0x0),expect(e['userRiskAssessment']['riskLevel'])['toBe']('low'),expect(e['userRiskAssessment']['notices'])['toContain']('2\x20order(s)\x20in\x20the\x20recent\x20window\x20are\x20pending\x20(not\x20yet\x20settled).');}),it('claimed\x20orders\x20are\x20not\x20pending\x20and\x20never\x20age',()=>{const e=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':[{'name':'open'},{'name':'done_ok'}],'machine_edges':EDGE_OK,'orders':[d(0x1e*c,'0xbuyer','0x1')],'now_ms':a});expect(e['orderHealth'])['toMatchObject']({'observed':0x1,'pending':0x0,'overdue':0x0}),expect(e['userRiskAssessment']['riskLevel'])['toBe']('low'),expect(e['userRiskAssessment']['notices']['join']('\x20'))['not']['toContain']('pending');}),it('orders\x20without\x20a\x20readable\x20timestamp\x20count\x20as\x20pending\x20but\x20never\x20overdue',()=>{const e=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':[{'name':'open'},{'name':'done_ok'}],'machine_edges':EDGE_OK,'orders':[{'id':'0x1','claimed_by':null}],'now_ms':a});expect(e['orderHealth'])['toMatchObject']({'observed':0x1,'pending':0x1,'agingKnown':!![],'overdue':0x0,'oldestPendingAgeDays':null}),expect(e['userRiskAssessment']['riskLevel'])['toBe']('low');}),it('no\x20clock\x20supplied\x20—\x20agingKnown=false\x20and\x20overdue\x20is\x200\x20BY\x20CONVENTION',()=>{const e=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':[{'name':'open'},{'name':'done_ok'}],'machine_edges':EDGE_OK,'orders':[d(0x1e*c,null,'0x1')]});expect(e['orderHealth'])['toMatchObject']({'pending':0x1,'agingKnown':![],'overdue':0x0,'oldestPendingAgeDays':null}),expect(e['userRiskAssessment']['riskLevel'])['toBe']('low');}),it('a\x20custom\x20stale\x20threshold\x20overrides\x20the\x20168h\x20default',()=>{const e=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':[{'name':'open'},{'name':'done_ok'}],'machine_edges':EDGE_OK,'orders':[d(0x2*c,null,'0x1')],'now_ms':a,'pending_stale_hours':0x18});expect(e['orderHealth']?.['staleHours'])['toBe'](0x18),expect(e['orderHealth']?.['overdue'])['toBe'](0x1);}),it('the\x20default\x20stale\x20threshold\x20constant\x20is\x20168h',()=>{expect(PENDING_STALE_HOURS_DEFAULT)['toBe'](0xa8);});}),describe('N-K4\x20—\x20determinism\x20and\x20backward\x20compatibility',()=>{it('identical\x20inputs\x20produce\x20byte-identical\x20reports\x20(fixed\x20clock)',()=>{const c={'objects':[svc(),machine()],'machine_nodes':[{'name':'open'},{'name':'done_ok'},{'name':'refund'}],'machine_edges':[{'from':'','to':'open'},{'from':'open','to':'refund'},{'from':'open','to':'done_ok'}],'orders':[{'id':'0x1','created_at_ms':0x18b944a9e00,'claimed_by':null}],'now_ms':0x18bcfe56800},d=JSON['stringify'](generateBusinessReport(c)),e=JSON['stringify'](generateBusinessReport(c));expect(d)['toBe'](e);}),it('no\x20edges\x20and\x20no\x20orders\x20reproduce\x20the\x20legacy\x20name-convention\x20behavior',()=>{const a=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':[{'name':'open'},{'name':'done_ok'},{'name':'refund'}]});expect(a['orderHealth'])['toBeUndefined'](),expect(a['merchantProfile']['workflowDescription'])['toContain']('name\x20convention\x20only'),expect(a['merchantProfile']['refundPolicy'])['toContain']('A\x20refund\x20path\x20is\x20present.'),expect(a['merchantProfile']['refundPolicy'])['toContain']('Reversal\x20rail:\x20workflow\x20node(s)\x20refund.');}),it('an\x20empty\x20order\x20window\x20emits\x20no\x20orderHealth',()=>{const a=generateBusinessReport({'objects':[svc(),machine()],'machine_nodes':[{'name':'open'}],'machine_edges':[{'from':'','to':'open'}],'orders':[],'now_ms':0x18bcfe56800});expect(a['orderHealth'])['toBeUndefined']();});});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function fld(a,b){return a?.[b]??a?.['data']?.[b];}function detectType(a){const b=fld(a,'type')??fld(a,'type_raw');if(typeof b!=='string'||b['length']===0x0)return'';const c=b['split']('::')['pop']()??b;return c;}function objectsOfType(a,b){return a['filter'](c=>detectType(c)===b);}function identity(a){const b=fld(a,'name');if(typeof b==='string'&&b['trim']())return b['trim']();const c=fld(a,'object')??fld(a,'id');if(typeof c==='string'&&c['trim']())return c['trim']();return'unknown';}function balanceStr(a){if(a==null)return undefined;if(typeof a==='object'&&'balance'in a)return String(a['balance']);return String(a);}function extractService(a){const b=objectsOfType(a,'Service')[0x0];if(!b)return{'found':![],'name':'unavailable','description':'No\x20Service\x20object\x20found','published':![],'paused':![],'salesCount':0x0,'arbitrations':[],'hasBuyGuard':![],'hasUm':![],'rewardsCount':0x0};return{'found':!![],'name':identity(b),'description':fld(b,'description')??'Service\x20(no\x20description)','published':fld(b,'bPublished')??![],'paused':fld(b,'bPaused')??![],'salesCount':Array['isArray'](fld(b,'sales'))?fld(b,'sales')['length']:0x0,'arbitrations':(fld(b,'arbitrations')??[])['filter'](c=>!!c),'compensationFund':balanceStr(fld(b,'compensation_fund')),'hasBuyGuard':fld(b,'buy_guard')!=null,'hasUm':fld(b,'um')!=null,'rewardsCount':(fld(b,'rewards')??[])['length']};}const REFUND_TERMS=['refund','refunded','return','returned','cancel','cancelled','canceled','reverse','reversal','chargeback','reimburse','compensat','expir','expired','void','voided','reject','rejected','fail','failed','abort','aborted','walk','dispute'],TERMINAL_SUFFIXES=['complete','completed','done','finish','finished','delivered','accepted',...REFUND_TERMS],matchesAny=(a,b)=>{const c=a['toLowerCase']();return b['some'](d=>c['includes'](d));},MACHINE_START_NODE='';function extractMachine(a,b,c){const d=objectsOfType(a,'Machine')[0x0];if(!d)return{'found':![],'nodeCount':0x0,'published':![],'paused':![],'entryNodes':[],'terminalNodeNames':[],'terminalSource':'names','refundNodeNames':[],'refundReachable':[],'reachabilityKnown':![]};const f=(b??[])['map'](j=>j['name'])['filter'](j=>typeof j==='string'),g=f['filter'](j=>matchesAny(j,REFUND_TERMS)),h=(c??[])['filter'](j=>!!j&&typeof j['from']==='string'&&typeof j['to']==='string');if(h['length']>0x0){const j=new Map();for(const p of h){const q=j['get'](p['from'])??[];q['push'](p['to']),j['set'](p['from'],q);}const k=new Set(f);for(const r of h){if(r['from'])k['add'](r['from']);if(r['to'])k['add'](r['to']);}k['delete'](MACHINE_START_NODE);const l=[...k]['filter'](s=>(j['get'](s)?.['length']??0x0)===0x0)['sort'](),n=new Set();if(j['has'](MACHINE_START_NODE)){n['add'](MACHINE_START_NODE);const s=[MACHINE_START_NODE];while(s['length']>0x0){const t=s['shift']();for(const u of j['get'](t)??[]){!n['has'](u)&&(n['add'](u),s['push'](u));}}}const o=j['has'](MACHINE_START_NODE);return{'found':!![],'nodeCount':f['length']>0x0?f['length']:(fld(d,'node_count')??0x0)+0x1,'published':fld(d,'bPublished')??![],'paused':fld(d,'bPaused')??![],'entryNodes':[],'terminalNodeNames':l,'terminalSource':'topology','refundNodeNames':g,'refundReachable':o?g['filter'](v=>n['has'](v)):[],'reachabilityKnown':o};}const i=f['filter'](v=>matchesAny(v,TERMINAL_SUFFIXES));return{'found':!![],'nodeCount':f['length']>0x0?f['length']:(fld(d,'node_count')??0x0)+0x1,'published':fld(d,'bPublished')??![],'paused':fld(d,'bPaused')??![],'entryNodes':[],'terminalNodeNames':i,'terminalSource':'names','refundNodeNames':g,'refundReachable':[],'reachabilityKnown':![]};}function detectAllocationRefundSlot(a){const b=objectsOfType(a,'Service')[0x0],c=fld(b,'order_allocators'),d=Array['isArray'](c)?c:Array['isArray'](c?.['allocators'])?c['allocators']:[];for(const e of d){for(const f of e?.['sharing']??[]){const g=f?.['who'];if(g==null)continue;if(typeof g==='object'){if('GuardIdentifier'in g)return!![];if('Signer'in g)return!![];continue;}if(typeof g==='string'){const h=g['toLowerCase']();if(h['includes']('guard\x20identifier')||h==='signer')return!![];}}}return![];}export const PENDING_STALE_HOURS_DEFAULT=0xa8;function computeOrderHealth(a,b,c){if(!a||a['length']===0x0)return undefined;const d=a['filter'](h=>h&&h['claimed_by']==null),e=typeof b==='number'&&Number['isFinite'](b)&&b>0x0;let f=0x0,g=null;for(const h of d){const i=Number(h?.['created_at_ms']??0x0);if(!e||!Number['isFinite'](i)||i<=0x0)continue;const j=b-i;if(j>c*0x36ee80)f++;if(g==null||j>g)g=j;}return{'observed':a['length'],'pending':d['length'],'agingKnown':e,'overdue':e?f:0x0,'oldestPendingAgeDays':e&&g!=null?Math['floor'](g/0x5265c00):null,'staleHours':c};}export function generateBusinessReport(a){const b=a['objects']??[],c=extractService(b),d=extractMachine(b,a['machine_nodes'],a['machine_edges']),e=detectAllocationRefundSlot(b),f=d['refundNodeNames']['length']>0x0,g=d['refundReachable']['length']>0x0,h=d['reachabilityKnown']?g||e:f||e,i=d['reachabilityKnown']&&f&&!g,j=a['pending_stale_hours']??PENDING_STALE_HOURS_DEFAULT,k=computeOrderHealth(a['orders'],a['now_ms'],j),l=k?.['agingKnown']?k['overdue']:0x0,m=k?.['pending']??0x0,n=c['arbitrations']['length']>0x0,o=c['compensationFund'],p=o==null||o==='0',q=!c['found']?'unavailable':c['published']?c['paused']?'published\x20but\x20PAUSED':'published\x20and\x20active':'not\x20yet\x20published',r=!c['found']?'No\x20Service\x20object\x20available\x20to\x20describe.':c['description']+'\x20('+q+(c['salesCount']>0x0?',\x20'+c['salesCount']+'\x20sale\x20option(s)':'')+').',s=!d['found']?'Workflow\x20(Machine)\x20unavailable\x20—\x20cannot\x20describe\x20the\x20process.':d['nodeCount']>0x0?d['nodeCount']+'-node\x20workflow\x20('+(d['published']?'published':'draft')+(d['paused']?',\x20paused':'')+').'+(d['terminalNodeNames']['length']>0x0?d['terminalSource']==='topology'?'\x20Stop\x20nodes\x20(derived\x20from\x20workflow\x20edges):\x20'+d['terminalNodeNames']['join'](',\x20')+'.':'\x20Stop/refund\x20nodes\x20detected\x20(name\x20convention\x20only\x20—\x20no\x20edge\x20table\x20to\x20verify):\x20'+d['terminalNodeNames']['join'](',\x20')+'.':d['terminalSource']==='topology'?'\x20No\x20stop\x20node\x20in\x20the\x20workflow\x20graph.':'\x20No\x20explicit\x20stop\x20node\x20detected\x20from\x20names.'):'Workflow\x20node\x20details\x20unavailable\x20(node_count\x20not\x20resolved).',t=!f?'':d['reachabilityKnown']?g?'\x20Workflow\x20edges\x20verify\x20the\x20reversal\x20rail\x20is\x20reachable:\x20node(s)\x20'+d['refundReachable']['join'](',\x20')+'.':'\x20WARNING:\x20the\x20named\x20refund\x20node(s)\x20'+d['refundNodeNames']['join'](',\x20')+'\x20are\x20UNREACHABLE\x20from\x20the\x20workflow\x20entry\x20—\x20that\x20rail\x20cannot\x20fire.':'\x20Reversal\x20rail:\x20workflow\x20node(s)\x20'+d['refundNodeNames']['join'](',\x20')+'.',u=h?['A\x20refund\x20path\x20is\x20present.',t,e?'\x20Escrow\x20can\x20be\x20routed\x20back\x20to\x20the\x20payer\x20or\x20to\x20the\x20order\x20by\x20an\x20allocation\x20slot.':'']['filter'](Boolean)['join'](''):'NO\x20refund\x20path\x20detected\x20—\x20funds\x20may\x20be\x20unrecoverable\x20once\x20the\x20workflow\x20advances\x20to\x20completion.'+(i?t:''),v=n?c['arbitrations']['length']+'\x20arbitration\x20service(s)\x20bound\x20—\x20disputes\x20have\x20a\x20resolution\x20path.':'NO\x20arbitration\x20bound\x20—\x20disputes\x20have\x20no\x20neutral\x20resolution\x20path.',w=[];if(!h)w['push']('No\x20refund\x20path\x20—\x20escrowed\x20funds\x20may\x20be\x20unrecoverable.');i&&h&&w['push']('The\x20named\x20refund\x20node(s)\x20'+d['refundNodeNames']['join'](',\x20')+'\x20are\x20unreachable\x20from\x20the\x20workflow\x20entry\x20—\x20'+'that\x20rail\x20is\x20dead;\x20only\x20the\x20allocation\x20slot\x20can\x20still\x20return\x20funds.');if(!n)w['push']('No\x20arbitration\x20bound\x20—\x20no\x20dispute\x20recourse.');if(p)w['push']('Compensation\x20fund\x20is\x20empty\x20—\x20arbitration\x20indemnity\x20would\x20be\x20unenforceable.');l>0x0&&w['push'](l+'\x20pending\x20order(s)\x20exceed\x20the\x20'+j+'h\x20settlement\x20window'+(k?.['oldestPendingAgeDays']!=null?'\x20(oldest:\x20'+k['oldestPendingAgeDays']+'d)':'')+'\x20—\x20funds\x20held\x20in\x20escrow\x20with\x20no\x20settlement\x20progress.');const x=[];if(c['published']&&!c['paused'])x['push']('Service\x20is\x20published\x20and\x20active.');h&&x['push'](d['reachabilityKnown']&&g&&e?'Refund\x20path\x20VERIFIED\x20—\x20reachable\x20rail\x20plus\x20an\x20order-routed\x20allocation\x20slot.':d['reachabilityKnown']&&g?'Refund\x20path\x20reachable\x20via\x20workflow\x20edges\x20(no\x20order-routed\x20allocation\x20slot\x20found).':'Refund\x20path\x20present.');if(n)x['push']('Arbitration\x20bound\x20(neutral\x20dispute\x20resolution).');if(!p)x['push']('Compensation\x20fund\x20funded\x20('+o+'\x20raw\x20units)\x20—\x20indemnity\x20enforceable.');if(c['hasBuyGuard'])x['push']('Buy\x20guard\x20present\x20(purchase\x20is\x20validated\x20by\x20on-chain\x20rules).');const y=[];if(!h)y['push']('Refund\x20path');if(!n)y['push']('Arbitration');if(p)y['push']('Compensation\x20fund');let z='low';if(!h&&!n)z='critical';else{if(!h||!n)z='high';else p&&(z='medium');}if(l>=0x3&&(z==='low'||z==='medium'))z='high';else{if(l>=0x1&&z==='low')z='medium';}const A=[];if(c['found']&&c['paused'])A['push']('Service\x20is\x20currently\x20PAUSED\x20—\x20purchases\x20are\x20rejected\x20until\x20the\x20merchant\x20resumes\x20it.\x20This\x20is\x20a\x20merchant-side\x20availability\x20state,\x20not\x20a\x20trust\x20signal:\x20do\x20not\x20purchase\x20while\x20paused.');else c['found']&&!c['published']&&A['push']('Service\x20is\x20not\x20yet\x20published\x20—\x20purchases\x20are\x20not\x20possible\x20until\x20the\x20merchant\x20publishes\x20it.\x20This\x20is\x20a\x20launch\x20state,\x20not\x20a\x20trust\x20signal.');c['found']&&!c['hasUm']&&A['push']('No\x20contact\x20channel\x20(um)\x20configured\x20—\x20Messenger\x20pre-order\x20negotiation\x20with\x20the\x20merchant\x20is\x20unavailable.');m>0x0&&l===0x0&&A['push'](m+'\x20order(s)\x20in\x20the\x20recent\x20window\x20are\x20pending\x20(not\x20yet\x20settled).');const B=[];B['push']('Escrowed\x20settlement:\x20funds\x20release\x20only\x20when\x20the\x20workflow\x20advances\x20—\x20the\x20merchant\x20is\x20incentivized\x20to\x20deliver.'),B['push']('On-chain\x20reputation\x20(Registrar\x20like/dislike\x20+\x20dispute\x20rate)\x20is\x20a\x20public\x20trust\x20signal\x20for\x20future\x20buyers.');if(c['rewardsCount']>0x0)B['push'](c['rewardsCount']+'\x20reward(s)\x20configured\x20—\x20repeat-buyer\x20incentives\x20lower\x20acquisition\x20cost.');const C=[];C['push']('Escrow\x20safety:\x20money\x20is\x20locked\x20on-chain\x20until\x20completion,\x20not\x20held\x20by\x20the\x20merchant.');if(h)C['push']('Refund\x20path\x20exists\x20—\x20a\x20verified\x20refund\x20returns\x20the\x20escrow.');if(n)C['push']('Arbitration\x20recourse\x20—\x20a\x20neutral\x20third\x20party\x20can\x20rule\x20on\x20disputes.');if(!p)C['push']('Compensation\x20fund\x20backs\x20arbitration\x20indemnity.');const D=[];D['push']('Merchant\x20wants\x20settlement\x20released\x20early;\x20user\x20wants\x20to\x20verify\x20the\x20deliverable\x20first\x20—\x20the\x20workflow\x27s\x20confirm\x20step\x20is\x20the\x20contention\x20point.'),D['push']('Merchant\x20controls\x20the\x20Machine/Guards;\x20user\x20is\x20limited\x20to\x20the\x20confirm/refund\x20forwards\x20the\x20merchant\x20designed.');if(!n)D['push']('No\x20arbitration:\x20a\x20deadlock\x20has\x20no\x20neutral\x20tie-breaker.');const E=[];E['push']('Escrow\x20alignment:\x20funds\x20stay\x20locked\x20until\x20both\x20sides\x20advance\x20the\x20workflow\x20—\x20neither\x20can\x20unilaterally\x20take\x20the\x20money.');if(h)E['push']('Allocation\x20alignment:\x20a\x20refund\x20slot\x20routes\x20the\x20escrow\x20back\x20to\x20the\x20buyer\x20on\x20the\x20refund\x20path.');if(n)E['push']('Arbitration\x20alignment:\x20an\x20independent\x20Permission\x20+\x20public\x20voters\x20provide\x20a\x20neutral\x20dispute\x20authority.');E['push']('Reputation\x20alignment:\x20Registrar\x20like/dislike\x20is\x20framework-enforced\x20and\x20unforgeable\x20—\x20both\x20sides\x20are\x20accountable\x20to\x20public\x20history.');const F=z['toUpperCase'](),G=a['order_amount']!=null?'\x20'+a['order_amount']+'\x20raw\x20units\x20are\x20escrowed.':'',H=c['found']&&c['paused']?'\x20NOTE:\x20the\x20service\x20is\x20PAUSED\x20—\x20purchases\x20are\x20rejected\x20until\x20the\x20merchant\x20resumes\x20it.':c['found']&&!c['published']?'\x20NOTE:\x20the\x20service\x20is\x20not\x20yet\x20published\x20—\x20purchases\x20are\x20not\x20possible.':'',I=!c['found']?'No\x20Service\x20object\x20found\x20—\x20reverse\x20mapping\x20produced\x20a\x20minimal\x20report.':'\x22'+c['name']+'\x22\x20is\x20'+q+'.'+G+'\x20'+('Risk\x20level:\x20'+F+'.\x20'+(h?'Refund\x20path\x20present.':'NO\x20refund\x20path.')+'\x20')+(''+(n?'Arbitration\x20bound.':'NO\x20arbitration.'))+(H+'\x20')+'This\x20report\x20is\x20generated\x20deterministically\x20from\x20on-chain\x20facts\x20—\x20the\x20buyer\x20decides.';return{'summary':I,'merchantProfile':{'serviceDescription':r,'workflowDescription':s,'refundPolicy':u,'arbitrationPolicy':v},'userRiskAssessment':{'riskLevel':z,'keyRisks':w,'protections':x,'missingProtections':y,'notices':A},'gameTheoryAnalysis':{'merchantIncentives':B,'userIncentives':C,'potentialConflicts':D,'wowAlignments':E},'orderHealth':k};}export function classifyObjectType(a){return detectType(a);}export function extractObjectFields(a){if(!a||typeof a!=='object')return{};const b=a['data']??a;if(!b||typeof b!=='object')return{};return{...b};}
|
|
1
|
+
function fld(a,b){return a?.[b]??a?.['data']?.[b];}function detectType(a){const b=fld(a,'type')??fld(a,'type_raw');if(typeof b!=='string'||b['length']===0x0)return'';const c=b['split']('::')['pop']()??b;return c;}function objectsOfType(a,b){return a['filter'](c=>detectType(c)===b);}function identity(a){const b=fld(a,'name');if(typeof b==='string'&&b['trim']())return b['trim']();const c=fld(a,'object')??fld(a,'id');if(typeof c==='string'&&c['trim']())return c['trim']();return'unknown';}function balanceStr(a){if(a==null)return undefined;if(typeof a==='object'&&'balance'in a)return String(a['balance']);return String(a);}function extractService(a){const b=objectsOfType(a,'Service')[0x0];if(!b)return{'found':![],'name':'unavailable','description':'No\x20Service\x20object\x20found','published':![],'paused':![],'salesCount':0x0,'arbitrations':[],'hasBuyGuard':![],'hasUm':![],'rewardsCount':0x0};return{'found':!![],'name':identity(b),'description':fld(b,'description')??'Service\x20(no\x20description)','published':fld(b,'bPublished')??![],'paused':fld(b,'bPaused')??![],'salesCount':Array['isArray'](fld(b,'sales'))?fld(b,'sales')['length']:0x0,'arbitrations':(fld(b,'arbitrations')??[])['filter'](c=>!!c),'compensationFund':balanceStr(fld(b,'compensation_fund')),'hasBuyGuard':fld(b,'buy_guard')!=null,'hasUm':fld(b,'um')!=null,'rewardsCount':(fld(b,'rewards')??[])['length']};}const REFUND_TERMS=['refund','refunded','return','returned','cancel','cancelled','canceled','reverse','reversal','chargeback','reimburse','compensat','expir','expired','void','voided','reject','rejected','fail','failed','abort','aborted','walk','dispute'],TERMINAL_SUFFIXES=['complete','completed','done','finish','finished','delivered','accepted',...REFUND_TERMS],matchesAny=(a,b)=>{const c=a['toLowerCase']();return b['some'](d=>c['includes'](d));},MACHINE_START_NODE='';function extractMachine(a,b,c){const d=objectsOfType(a,'Machine')[0x0];if(!d)return{'found':![],'nodeCount':0x0,'published':![],'paused':![],'entryNodes':[],'terminalNodeNames':[],'terminalSource':'names','refundNodeNames':[],'refundReachable':[],'reachabilityKnown':![]};const f=(b??[])['map'](j=>j['name'])['filter'](j=>typeof j==='string'),g=f['filter'](j=>matchesAny(j,REFUND_TERMS)),h=(c??[])['filter'](j=>!!j&&typeof j['from']==='string'&&typeof j['to']==='string');if(h['length']>0x0){const j=new Map();for(const p of h){const q=j['get'](p['from'])??[];q['push'](p['to']),j['set'](p['from'],q);}const k=new Set(f);for(const r of h){if(r['from'])k['add'](r['from']);if(r['to'])k['add'](r['to']);}k['delete'](MACHINE_START_NODE);const l=[...k]['filter'](s=>(j['get'](s)?.['length']??0x0)===0x0)['sort'](),n=new Set();if(j['has'](MACHINE_START_NODE)){n['add'](MACHINE_START_NODE);const s=[MACHINE_START_NODE];while(s['length']>0x0){const t=s['shift']();for(const u of j['get'](t)??[]){!n['has'](u)&&(n['add'](u),s['push'](u));}}}const o=j['has'](MACHINE_START_NODE);return{'found':!![],'nodeCount':f['length']>0x0?f['length']:(fld(d,'node_count')??0x0)+0x1,'published':fld(d,'bPublished')??![],'paused':fld(d,'bPaused')??![],'entryNodes':[],'terminalNodeNames':l,'terminalSource':'topology','refundNodeNames':g,'refundReachable':o?g['filter'](v=>n['has'](v)):[],'reachabilityKnown':o};}const i=f['filter'](v=>matchesAny(v,TERMINAL_SUFFIXES));return{'found':!![],'nodeCount':f['length']>0x0?f['length']:(fld(d,'node_count')??0x0)+0x1,'published':fld(d,'bPublished')??![],'paused':fld(d,'bPaused')??![],'entryNodes':[],'terminalNodeNames':i,'terminalSource':'names','refundNodeNames':g,'refundReachable':[],'reachabilityKnown':![]};}function detectAllocationRefundSlot(a){const b=objectsOfType(a,'Service')[0x0],c=fld(b,'order_allocators'),d=Array['isArray'](c)?c:Array['isArray'](c?.['allocators'])?c['allocators']:[];for(const e of d){for(const f of e?.['sharing']??[]){const g=f?.['who'];if(g==null)continue;if(typeof g==='object'){if('GuardIdentifier'in g)return!![];if('Signer'in g)return!![];continue;}if(typeof g==='string'){const h=g['toLowerCase']();if(h['includes']('guard\x20identifier')||h==='signer')return!![];}}}return![];}export const PENDING_STALE_HOURS_DEFAULT=0xa8;function computeOrderHealth(a,b,c){if(!a||a['length']===0x0)return undefined;const d=a['filter'](h=>h&&h['claimed_by']==null),e=typeof b==='number'&&Number['isFinite'](b)&&b>0x0;let f=0x0,g=null;for(const h of d){const i=Number(h?.['created_at_ms']??0x0);if(!e||!Number['isFinite'](i)||i<=0x0)continue;const j=b-i;if(j>c*0x36ee80)f++;if(g==null||j>g)g=j;}return{'observed':a['length'],'pending':d['length'],'agingKnown':e,'overdue':e?f:0x0,'oldestPendingAgeDays':e&&g!=null?Math['floor'](g/0x5265c00):null,'staleHours':c};}export function generateBusinessReport(a){const b=a['objects']??[],c=extractService(b),d=extractMachine(b,a['machine_nodes'],a['machine_edges']),e=detectAllocationRefundSlot(b),f=d['refundNodeNames']['length']>0x0,g=d['refundReachable']['length']>0x0,h=d['reachabilityKnown']?g||e:f||e,i=d['reachabilityKnown']&&f&&!g,j=a['pending_stale_hours']??PENDING_STALE_HOURS_DEFAULT,k=computeOrderHealth(a['orders'],a['now_ms'],j),l=k?.['agingKnown']?k['overdue']:0x0,m=k?.['pending']??0x0,n=c['arbitrations']['length']>0x0,o=c['compensationFund'],p=o==null||o==='0',q=!c['found']?'unavailable':c['published']?c['paused']?'published\x20but\x20PAUSED':'published\x20and\x20active':'not\x20yet\x20published',r=!c['found']?'No\x20Service\x20object\x20available\x20to\x20describe.':c['description']+'\x20('+q+(c['salesCount']>0x0?',\x20'+c['salesCount']+'\x20sale\x20option(s)':'')+').',s=!d['found']?'Workflow\x20(Machine)\x20unavailable\x20—\x20cannot\x20describe\x20the\x20process.':d['nodeCount']>0x0?d['nodeCount']+'-node\x20workflow\x20('+(d['published']?'published':'draft')+(d['paused']?',\x20paused':'')+').'+(d['terminalNodeNames']['length']>0x0?d['terminalSource']==='topology'?'\x20Stop\x20nodes\x20(derived\x20from\x20workflow\x20edges):\x20'+d['terminalNodeNames']['join'](',\x20')+'.':'\x20Stop/refund\x20nodes\x20detected\x20(name\x20convention\x20only\x20—\x20no\x20edge\x20table\x20to\x20verify):\x20'+d['terminalNodeNames']['join'](',\x20')+'.':d['terminalSource']==='topology'?'\x20No\x20stop\x20node\x20in\x20the\x20workflow\x20graph.':'\x20No\x20explicit\x20stop\x20node\x20detected\x20from\x20names.'):'Workflow\x20node\x20details\x20unavailable\x20(node_count\x20not\x20resolved).',t=!f?'':d['reachabilityKnown']?g?'\x20Workflow\x20edges\x20verify\x20the\x20reversal\x20rail\x20is\x20reachable:\x20node(s)\x20'+d['refundReachable']['join'](',\x20')+'.':'\x20WARNING:\x20the\x20named\x20refund\x20node(s)\x20'+d['refundNodeNames']['join'](',\x20')+'\x20are\x20UNREACHABLE\x20from\x20the\x20workflow\x20entry\x20—\x20that\x20rail\x20cannot\x20fire.':'\x20Reversal\x20rail:\x20workflow\x20node(s)\x20'+d['refundNodeNames']['join'](',\x20')+'.',u=h?['A\x20refund\x20path\x20is\x20present.',t,e?'\x20Escrow\x20can\x20be\x20routed\x20back\x20to\x20the\x20payer\x20or\x20to\x20the\x20order\x20by\x20an\x20allocation\x20slot.':'']['filter'](Boolean)['join'](''):'NO\x20refund\x20path\x20detected\x20—\x20funds\x20may\x20be\x20unrecoverable\x20once\x20the\x20workflow\x20advances\x20to\x20completion.'+(i?t:''),v=n?c['arbitrations']['length']+'\x20arbitration\x20service(s)\x20bound\x20—\x20disputes\x20have\x20a\x20resolution\x20path.':'NO\x20arbitration\x20bound\x20—\x20disputes\x20have\x20no\x20neutral\x20resolution\x20path.',w=[];if(!h)w['push']('No\x20refund\x20path\x20—\x20escrowed\x20funds\x20may\x20be\x20unrecoverable.');i&&h&&w['push']('The\x20named\x20refund\x20node(s)\x20'+d['refundNodeNames']['join'](',\x20')+'\x20are\x20unreachable\x20from\x20the\x20workflow\x20entry\x20—\x20'+'that\x20rail\x20is\x20dead;\x20only\x20the\x20allocation\x20slot\x20can\x20still\x20return\x20funds.');if(!n)w['push']('No\x20arbitration\x20bound\x20—\x20no\x20dispute\x20recourse.');if(p)w['push']('Compensation\x20fund\x20is\x20empty\x20—\x20arbitration\x20indemnity\x20would\x20be\x20unenforceable.');l>0x0&&w['push'](l+'\x20pending\x20order(s)\x20exceed\x20the\x20'+j+'h\x20settlement\x20window'+(k?.['oldestPendingAgeDays']!=null?'\x20(oldest:\x20'+k['oldestPendingAgeDays']+'d)':'')+'\x20—\x20funds\x20held\x20in\x20escrow\x20with\x20no\x20settlement\x20progress.');const x=[];if(c['published']&&!c['paused'])x['push']('Service\x20is\x20published\x20and\x20active.');h&&x['push'](d['reachabilityKnown']&&g&&e?'Refund\x20path\x20statically\x20reachable\x20—\x20workflow\x20edges\x20reach\x20the\x20rail\x20and\x20an\x20order-routed\x20allocation\x20slot\x20exists\x20(static\x20graph\x20check\x20only;\x20leg\x20executability\x20is\x20audited\x20by\x20the\x20allocator\x20guard\x20lint,\x20not\x20here).':d['reachabilityKnown']&&g?'Refund\x20path\x20statically\x20reachable\x20via\x20workflow\x20edges\x20(no\x20order-routed\x20allocation\x20slot\x20found).':'Refund\x20path\x20present.');if(n)x['push']('Arbitration\x20bound\x20(neutral\x20dispute\x20resolution).');if(!p)x['push']('Compensation\x20fund\x20funded\x20('+o+'\x20raw\x20units)\x20—\x20indemnity\x20enforceable.');if(c['hasBuyGuard'])x['push']('Buy\x20guard\x20present\x20(purchase\x20is\x20validated\x20by\x20on-chain\x20rules).');const y=[];if(!h)y['push']('Refund\x20path');if(!n)y['push']('Arbitration');if(p)y['push']('Compensation\x20fund');let z='low';if(!h&&!n)z='critical';else{if(!h||!n)z='high';else p&&(z='medium');}if(l>=0x3&&(z==='low'||z==='medium'))z='high';else{if(l>=0x1&&z==='low')z='medium';}const A=[];if(c['found']&&c['paused'])A['push']('Service\x20is\x20currently\x20PAUSED\x20—\x20purchases\x20are\x20rejected\x20until\x20the\x20merchant\x20resumes\x20it.\x20This\x20is\x20a\x20merchant-side\x20availability\x20state,\x20not\x20a\x20trust\x20signal:\x20do\x20not\x20purchase\x20while\x20paused.');else c['found']&&!c['published']&&A['push']('Service\x20is\x20not\x20yet\x20published\x20—\x20purchases\x20are\x20not\x20possible\x20until\x20the\x20merchant\x20publishes\x20it.\x20This\x20is\x20a\x20launch\x20state,\x20not\x20a\x20trust\x20signal.');c['found']&&!c['hasUm']&&A['push']('No\x20contact\x20channel\x20(um)\x20configured\x20—\x20Messenger\x20pre-order\x20negotiation\x20with\x20the\x20merchant\x20is\x20unavailable.');m>0x0&&l===0x0&&A['push'](m+'\x20order(s)\x20in\x20the\x20recent\x20window\x20are\x20pending\x20(not\x20yet\x20settled).');const B=[];B['push']('Escrowed\x20settlement:\x20funds\x20release\x20only\x20when\x20the\x20workflow\x20advances\x20—\x20the\x20merchant\x20is\x20incentivized\x20to\x20deliver.'),B['push']('On-chain\x20reputation\x20(Registrar\x20like/dislike\x20+\x20dispute\x20rate)\x20is\x20a\x20public\x20trust\x20signal\x20for\x20future\x20buyers.');if(c['rewardsCount']>0x0)B['push'](c['rewardsCount']+'\x20reward(s)\x20configured\x20—\x20repeat-buyer\x20incentives\x20lower\x20acquisition\x20cost.');const C=[];C['push']('Escrow\x20safety:\x20money\x20is\x20locked\x20on-chain\x20until\x20completion,\x20not\x20held\x20by\x20the\x20merchant.');if(h)C['push']('Refund\x20path\x20exists\x20—\x20a\x20verified\x20refund\x20returns\x20the\x20escrow.');if(n)C['push']('Arbitration\x20recourse\x20—\x20a\x20neutral\x20third\x20party\x20can\x20rule\x20on\x20disputes.');if(!p)C['push']('Compensation\x20fund\x20backs\x20arbitration\x20indemnity.');const D=[];D['push']('Merchant\x20wants\x20settlement\x20released\x20early;\x20user\x20wants\x20to\x20verify\x20the\x20deliverable\x20first\x20—\x20the\x20workflow\x27s\x20confirm\x20step\x20is\x20the\x20contention\x20point.'),D['push']('Merchant\x20controls\x20the\x20Machine/Guards;\x20user\x20is\x20limited\x20to\x20the\x20confirm/refund\x20forwards\x20the\x20merchant\x20designed.');if(!n)D['push']('No\x20arbitration:\x20a\x20deadlock\x20has\x20no\x20neutral\x20tie-breaker.');const E=[];E['push']('Escrow\x20alignment:\x20funds\x20stay\x20locked\x20until\x20both\x20sides\x20advance\x20the\x20workflow\x20—\x20neither\x20can\x20unilaterally\x20take\x20the\x20money.');if(h)E['push']('Allocation\x20alignment:\x20a\x20refund\x20slot\x20routes\x20the\x20escrow\x20back\x20to\x20the\x20buyer\x20on\x20the\x20refund\x20path.');if(n)E['push']('Arbitration\x20alignment:\x20an\x20independent\x20Permission\x20+\x20public\x20voters\x20provide\x20a\x20neutral\x20dispute\x20authority.');E['push']('Reputation\x20alignment:\x20Registrar\x20like/dislike\x20is\x20framework-enforced\x20and\x20unforgeable\x20—\x20both\x20sides\x20are\x20accountable\x20to\x20public\x20history.');const F=z['toUpperCase'](),G=a['order_amount']!=null?'\x20'+a['order_amount']+'\x20raw\x20units\x20are\x20escrowed.':'',H=c['found']&&c['paused']?'\x20NOTE:\x20the\x20service\x20is\x20PAUSED\x20—\x20purchases\x20are\x20rejected\x20until\x20the\x20merchant\x20resumes\x20it.':c['found']&&!c['published']?'\x20NOTE:\x20the\x20service\x20is\x20not\x20yet\x20published\x20—\x20purchases\x20are\x20not\x20possible.':'',I=!c['found']?'No\x20Service\x20object\x20found\x20—\x20reverse\x20mapping\x20produced\x20a\x20minimal\x20report.':'\x22'+c['name']+'\x22\x20is\x20'+q+'.'+G+'\x20'+('Risk\x20level:\x20'+F+'.\x20'+(h?'Refund\x20path\x20present.':'NO\x20refund\x20path.')+'\x20')+(''+(n?'Arbitration\x20bound.':'NO\x20arbitration.'))+(H+'\x20')+'This\x20report\x20is\x20generated\x20deterministically\x20from\x20on-chain\x20facts\x20—\x20the\x20buyer\x20decides.';return{'summary':I,'merchantProfile':{'serviceDescription':r,'workflowDescription':s,'refundPolicy':u,'arbitrationPolicy':v},'userRiskAssessment':{'riskLevel':z,'keyRisks':w,'protections':x,'missingProtections':y,'notices':A},'gameTheoryAnalysis':{'merchantIncentives':B,'userIncentives':C,'potentialConflicts':D,'wowAlignments':E},'orderHealth':k};}export function classifyObjectType(a){return detectType(a);}export function extractObjectFields(a){if(!a||typeof a!=='object')return{};const b=a['data']??a;if(!b||typeof b!=='object')return{};return{...b};}
|