@wowok/agent-mcp 2.7.10 → 3.0.1
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/dist/communication/evidence.d.ts +6 -0
- package/dist/communication/evidence.js +1 -0
- package/dist/evaluation/acceptance.d.ts +24 -0
- package/dist/evaluation/acceptance.js +1 -0
- package/dist/evaluation/builtins/demand-match.d.ts +3 -2
- package/dist/evaluation/builtins/demand-match.js +1 -1
- package/dist/evaluation/builtins/service-risk.d.ts +2 -1
- package/dist/evaluation/builtins/service-risk.js +1 -1
- package/dist/evaluation/index.d.ts +1 -0
- package/dist/evaluation/index.js +1 -1
- package/dist/evaluation/match-operation.d.ts +14 -0
- package/dist/evaluation/match-operation.js +1 -0
- package/dist/experience/realtime-feedback.js +1 -1
- package/dist/extensions/capability-manifest.d.ts +1 -82
- package/dist/extensions/capability-manifest.js +1 -1
- package/dist/extensions/constraint-registry.d.ts +6 -4
- package/dist/extensions/constraint-registry.js +1 -1
- package/dist/extensions/index.d.ts +4 -5
- package/dist/extensions/index.js +1 -1
- package/dist/extensions/industry-pack.js +1 -1
- package/dist/extensions/metric-registry.d.ts +6 -4
- package/dist/extensions/metric-registry.js +1 -1
- package/dist/extensions/mode-evaluator.d.ts +2 -3
- package/dist/extensions/mode-evaluator.js +1 -1
- package/dist/extensions/modes.js +1 -1
- package/dist/extensions/registry.d.ts +3 -25
- package/dist/extensions/registry.js +1 -1
- package/dist/extensions/types.d.ts +0 -68
- package/dist/goal/GoalClassifier.js +1 -1
- package/dist/goal/GoalEngine.d.ts +44 -1
- package/dist/goal/GoalEngine.js +1 -1
- package/dist/goal/types.d.ts +5 -1
- package/dist/harness/auto-escalation.d.ts +0 -12
- package/dist/harness/auto-escalation.js +1 -1
- package/dist/harness/index.d.ts +1 -14
- package/dist/harness/index.js +1 -1
- package/dist/harness/types.d.ts +0 -38
- package/dist/keeper/KeeperScan.d.ts +39 -0
- package/dist/keeper/KeeperScan.js +1 -0
- package/dist/keeper/KeeperStore.d.ts +43 -0
- package/dist/keeper/KeeperStore.js +1 -0
- package/dist/keeper/detectors.d.ts +23 -0
- package/dist/keeper/detectors.js +1 -0
- package/dist/keeper/keeper.spec.d.ts +1 -0
- package/dist/keeper/keeper.spec.js +1 -0
- package/dist/keeper/types.d.ts +65 -0
- package/dist/keeper/types.js +1 -0
- package/dist/knowledge/account-marks.d.ts +1 -0
- package/dist/knowledge/account-marks.js +1 -1
- package/dist/knowledge/demand-risk.js +1 -1
- package/dist/knowledge/event-semantics.d.ts +3 -0
- package/dist/knowledge/event-semantics.js +1 -1
- package/dist/knowledge/event-semantics.spec.d.ts +1 -0
- package/dist/knowledge/event-semantics.spec.js +1 -0
- package/dist/knowledge/evidence-review.d.ts +23 -0
- package/dist/knowledge/evidence-review.js +1 -1
- package/dist/knowledge/examples-scanner-cli.js +1 -1
- package/dist/knowledge/examples-scanner.js +1 -1
- package/dist/knowledge/fund-layer.d.ts +13 -9
- package/dist/knowledge/fund-layer.js +1 -1
- package/dist/knowledge/goal-completion.js +1 -1
- package/dist/knowledge/guard-bindings.d.ts +21 -0
- package/dist/knowledge/guard-bindings.js +1 -0
- package/dist/knowledge/guard-bytecode-spec.d.ts +82 -0
- package/dist/knowledge/guard-bytecode-spec.js +1 -0
- package/dist/knowledge/guard-design-patterns.d.ts +1 -1
- package/dist/knowledge/guard-design-patterns.js +1 -1
- package/dist/knowledge/index.d.ts +13 -7
- package/dist/knowledge/index.js +1 -1
- package/dist/knowledge/industry-registry.js +1 -1
- package/dist/knowledge/mcp-schema-audit-cli.js +1 -1
- package/dist/knowledge/mcp-schema-audit.js +1 -1
- package/dist/knowledge/reward-risk.d.ts +1 -1
- package/dist/knowledge/reward-risk.js +1 -1
- package/dist/knowledge/safety-rules.d.ts +2 -1
- package/dist/knowledge/safety-rules.js +1 -1
- package/dist/knowledge/scenario-modes.d.ts +1 -1
- package/dist/knowledge/scenario-modes.js +1 -1
- package/dist/knowledge/scenario-topology.d.ts +43 -0
- package/dist/knowledge/scenario-topology.js +1 -0
- package/dist/knowledge/supply-chain.js +1 -1
- package/dist/knowledge/template-registry.js +1 -1
- package/dist/knowledge/tools-reference.js +1 -1
- package/dist/knowledge/workflow-guidance.d.ts +55 -0
- package/dist/knowledge/workflow-guidance.js +1 -1
- package/dist/knowledge/workspace-lists.d.ts +1 -0
- package/dist/knowledge/workspace-lists.js +1 -1
- package/dist/monitor/MonitorLoop.d.ts +3 -0
- package/dist/monitor/MonitorLoop.js +1 -1
- package/dist/monitor/ScopeResolver.js +1 -1
- package/dist/monitor/SuggestionBridge.d.ts +38 -0
- package/dist/monitor/SuggestionBridge.js +1 -0
- package/dist/monitor/SuggestionBridge.spec.d.ts +1 -0
- package/dist/monitor/SuggestionBridge.spec.js +1 -0
- package/dist/monitor/types.d.ts +0 -1
- package/dist/monitor/types.js +1 -1
- package/dist/participation/arbitrator-interest.d.ts +20 -0
- package/dist/participation/arbitrator-interest.js +1 -0
- package/dist/participation/demander-interest.d.ts +23 -0
- package/dist/participation/demander-interest.js +1 -0
- package/dist/participation/employee-kpi.d.ts +12 -0
- package/dist/participation/employee-kpi.js +1 -1
- package/dist/participation/employee-kpi.spec.d.ts +1 -0
- package/dist/participation/employee-kpi.spec.js +1 -0
- package/dist/playbooks/service-build/business-puzzle.js +1 -1
- package/dist/playbooks/service-build/context-assembly.js +1 -1
- package/dist/playbooks/service-build/machine-nodes.js +1 -1
- package/dist/playbooks/service-build/machine-panorama.js +1 -1
- package/dist/playbooks/service-build/merchant-guide.d.ts +20 -0
- package/dist/playbooks/service-build/merchant-guide.js +1 -1
- package/dist/playbooks/service-build/mode-actions.d.ts +30 -12
- package/dist/playbooks/service-build/mode-actions.js +1 -1
- package/dist/playbooks/service-build/object-panorama.js +1 -1
- package/dist/playbooks/service-build/participation-radar.js +1 -1
- package/dist/playbooks/service-build/relationship-profile.d.ts +2 -0
- package/dist/playbooks/service-build/relationship-profile.js +1 -0
- package/dist/playbooks/service-build/semantic-graph.d.ts +5 -1
- package/dist/playbooks/service-build/semantic-graph.js +1 -1
- package/dist/playbooks/service-build/service-panorama.js +1 -1
- package/dist/relationship/derivation.d.ts +94 -0
- package/dist/relationship/derivation.js +1 -0
- package/dist/relationship/derivation.spec.d.ts +1 -0
- package/dist/relationship/derivation.spec.js +1 -0
- package/dist/relationship/incentive.d.ts +38 -0
- package/dist/relationship/incentive.js +1 -0
- package/dist/relationship/index.d.ts +4 -0
- package/dist/relationship/index.js +1 -0
- package/dist/relationship/registry.d.ts +13 -0
- package/dist/relationship/registry.js +1 -0
- package/dist/relationship/types.d.ts +45 -0
- package/dist/relationship/types.js +1 -0
- package/dist/review/progress.js +1 -1
- package/dist/role/index.d.ts +2 -2
- package/dist/role/index.js +1 -1
- package/dist/role/model.d.ts +2 -1
- package/dist/role/model.js +1 -1
- package/dist/role/types.d.ts +5 -0
- package/dist/rules.d.ts +1 -1
- package/dist/safety/confirm-gate.js +1 -1
- package/dist/safety/preview.js +1 -1
- package/dist/schema/call/bridge.d.ts +25 -3
- package/dist/schema/call/bridge.js +1 -1
- package/dist/schema/call/semantic.js +1 -1
- package/dist/schema/common/index.js +1 -1
- package/dist/schema/employee/index.d.ts +61 -1
- package/dist/schema/employee/index.js +1 -1
- package/dist/schema/evaluation/index.d.ts +70 -5
- package/dist/schema/evaluation/index.js +1 -1
- package/dist/schema/goal/index.d.ts +40 -14
- package/dist/schema/goal/index.js +1 -1
- package/dist/schema/goal/planning.d.ts +6 -6
- package/dist/schema/index.d.ts +1 -0
- package/dist/schema/index.js +1 -1
- package/dist/schema/industry-pack/index.d.ts +59 -7
- package/dist/schema/industry-pack/index.js +1 -1
- package/dist/schema/industry-pack/modes.d.ts +59 -7
- package/dist/schema/industry-pack/modes.js +1 -1
- package/dist/schema/intent-radar/index.d.ts +19 -19
- package/dist/schema/keeper/index.d.ts +475 -0
- package/dist/schema/keeper/index.js +1 -0
- package/dist/schema/local/index.d.ts +11 -0
- package/dist/schema/local/index.js +1 -1
- package/dist/schema/messenger/index.d.ts +2 -0
- package/dist/schema/messenger/index.js +1 -1
- package/dist/schema/operations.d.ts +64 -16
- package/dist/schema/persona/index.d.ts +1 -1
- package/dist/schema/query/bi.d.ts +244 -16
- package/dist/schema/query/bi.js +1 -1
- package/dist/schema/query/index.d.ts +2 -2
- package/dist/schema/schema-query/index.d.ts +2 -11
- package/dist/schema/schema-query/index.js +1 -1
- package/dist/schema/schema-version.js +1 -1
- package/dist/schema/utils/skills-recommendation.js +1 -1
- package/dist/schema/watch/index.d.ts +4 -0
- package/dist/schema/watch/index.js +1 -1
- package/dist/schema-query-impl/index.d.ts +33 -14
- package/dist/schema-query-impl/index.js +1 -1
- package/dist/schemas/account_operation.output.json +29 -0
- package/dist/schemas/account_operation.schema.json +6 -2
- package/dist/schemas/bridge_operation.output.json +24 -1
- package/dist/schemas/bridge_operation.schema.json +73 -1
- package/dist/schemas/employee_operation.output.json +100 -0
- package/dist/schemas/employee_operation.schema.json +148 -5
- package/dist/schemas/evaluation_operation.output.json +135 -9
- package/dist/schemas/evaluation_operation.schema.json +176 -7
- package/dist/schemas/goal_operation.schema.json +76 -0
- package/dist/schemas/index.json +7 -1
- package/dist/schemas/industry_pack_operation.output.json +172 -27
- package/dist/schemas/industry_pack_operation.schema.json +19 -0
- package/dist/schemas/keeper_operation.output.json +1274 -0
- package/dist/schemas/keeper_operation.schema.json +359 -0
- package/dist/schemas/messenger_operation.schema.json +8 -0
- package/dist/schemas/onchain_events.output.json +1 -1
- package/dist/schemas/onchain_operations.schema.json +41 -41
- package/dist/schemas/onchain_operations_allocation.schema.json +4 -4
- package/dist/schemas/onchain_operations_arbitration.schema.json +3 -3
- package/dist/schemas/onchain_operations_contact.schema.json +2 -2
- package/dist/schemas/onchain_operations_demand.schema.json +2 -2
- package/dist/schemas/onchain_operations_machine.schema.json +2 -2
- package/dist/schemas/onchain_operations_order.schema.json +2 -2
- package/dist/schemas/onchain_operations_payment.schema.json +1 -1
- package/dist/schemas/onchain_operations_permission.schema.json +2 -2
- package/dist/schemas/onchain_operations_progress.schema.json +2 -2
- package/dist/schemas/onchain_operations_repository.schema.json +2 -2
- package/dist/schemas/onchain_operations_reward.schema.json +6 -6
- package/dist/schemas/onchain_operations_service.schema.json +7 -7
- package/dist/schemas/onchain_operations_treasury.schema.json +6 -6
- package/dist/schemas/onchain_table_data.output.json +71 -0
- package/dist/schemas/query_toolkit.output.json +485 -7
- package/dist/schemas/query_toolkit.schema.json +71 -0
- package/dist/schemas/schema_query.output.json +1 -64
- package/dist/schemas/schema_query.schema.json +18 -3
- package/dist/schemas/watch_operation.output.json +21 -1
- package/dist/task/ProcessStore.d.ts +18 -1
- package/dist/task/ProcessStore.js +1 -1
- package/dist/task/playbook.js +1 -1
- package/dist/task/types.d.ts +24 -0
- package/dist/tools/handlers/bridge.js +1 -1
- package/dist/tools/handlers/config.js +1 -1
- package/dist/tools/handlers/employee.d.ts +6 -0
- package/dist/tools/handlers/employee.js +1 -1
- package/dist/tools/handlers/employee.spec.d.ts +1 -0
- package/dist/tools/handlers/employee.spec.js +1 -0
- package/dist/tools/handlers/evaluation.js +1 -1
- package/dist/tools/handlers/evaluation.spec.d.ts +1 -0
- package/dist/tools/handlers/evaluation.spec.js +1 -0
- package/dist/tools/handlers/goal.js +1 -1
- package/dist/tools/handlers/industry-pack.js +1 -1
- package/dist/tools/handlers/keeper.d.ts +12 -0
- package/dist/tools/handlers/keeper.js +1 -0
- package/dist/tools/handlers/local.d.ts +4 -3
- package/dist/tools/handlers/local.js +1 -1
- package/dist/tools/handlers/messenger.js +1 -1
- package/dist/tools/handlers/onchain.js +1 -1
- package/dist/tools/handlers/permission.js +1 -1
- package/dist/tools/handlers/query.js +1 -1
- package/dist/tools/handlers/schema-query.js +1 -1
- package/dist/tools/handlers/watch.js +1 -1
- package/dist/tools/handlers/workflow.js +1 -1
- package/dist/tools/index.js +1 -1
- package/dist/tools/registry/agent.d.ts +2 -0
- package/dist/tools/registry/agent.js +1 -0
- package/dist/tools/registry/bridge.d.ts +2 -0
- package/dist/tools/registry/bridge.js +1 -0
- package/dist/tools/registry/business.d.ts +2 -0
- package/dist/tools/registry/business.js +1 -0
- package/dist/tools/registry/config.d.ts +2 -0
- package/dist/tools/registry/config.js +1 -0
- package/dist/tools/registry/files.d.ts +2 -0
- package/dist/tools/registry/files.js +1 -0
- package/dist/tools/registry/identity.d.ts +2 -0
- package/dist/tools/registry/identity.js +1 -0
- package/dist/tools/registry/local.d.ts +2 -0
- package/dist/tools/registry/local.js +1 -0
- package/dist/tools/registry/messenger.d.ts +2 -0
- package/dist/tools/registry/messenger.js +1 -0
- package/dist/tools/registry/monitor.d.ts +2 -0
- package/dist/tools/registry/monitor.js +1 -0
- package/dist/tools/registry/onchain.d.ts +2 -0
- package/dist/tools/registry/onchain.js +1 -0
- package/dist/tools/registry/query.d.ts +2 -0
- package/dist/tools/registry/query.js +1 -0
- package/dist/tools/registry/trust.d.ts +2 -0
- package/dist/tools/registry/trust.js +1 -0
- package/dist/tools/rules-hook.d.ts +1 -0
- package/dist/tools/rules-hook.js +1 -1
- package/dist/tools/shared.js +1 -1
- package/dist/tools/wrap.js +1 -1
- package/package.json +2 -2
- package/dist/examples/arbitration-dispute-create.json +0 -41
- package/dist/examples/arbitration-vote-weighted.json +0 -35
- package/dist/examples/arbitration-voting-guard-add.json +0 -38
- package/dist/examples/demand-present-service.json +0 -33
- package/dist/examples/education-contact-create.json +0 -40
- package/dist/examples/freelance-contact-create.json +0 -40
- package/dist/examples/gen-passport-verify-guard.json +0 -48
- package/dist/examples/guard-template-balance-check.json +0 -59
- package/dist/examples/guard-template-time-lock.json +0 -60
- package/dist/examples/insurance-guard-claim-timelock.json +0 -75
- package/dist/examples/insurance-guard-withdraw-allocation.json +0 -96
- package/dist/examples/insurance-machine-create.json +0 -75
- package/dist/examples/insurance-service-allocators.json +0 -55
- package/dist/examples/machine-multisig-threshold.json +0 -87
- package/dist/examples/machine-publish.json +0 -30
- package/dist/examples/machine-template-7node-rental.json +0 -119
- package/dist/examples/payment-scenario-bound.json +0 -45
- package/dist/examples/rental-ziroom-machine-create.json +0 -148
- package/dist/examples/rental-ziroom-permission-create.json +0 -41
- package/dist/examples/rental-ziroom-service-create.json +0 -36
- package/dist/examples/retail-adv-guard-customer-win-create.json +0 -80
- package/dist/examples/retail-adv-guard-messenger-proof-create.json +0 -65
- package/dist/examples/retail-adv-guard-reward-timeout-create.json +0 -92
- package/dist/examples/retail-adv-reward-guard-add.json +0 -51
- package/dist/examples/retail-myshop-allocation-activate.json +0 -55
- package/dist/examples/retail-myshop-arbitration-create.json +0 -40
- package/dist/examples/retail-myshop-contact-create.json +0 -43
- package/dist/examples/retail-myshop-order-create.json +0 -56
- package/dist/examples/retail-myshop-progress-operate.json +0 -38
- package/dist/examples/retail-myshop-reward-create.json +0 -35
- package/dist/examples/retail-myshop-service-create.json +0 -38
- package/dist/examples/retail-myshop-service-customer-required.json +0 -31
- package/dist/examples/service-discount-issue.json +0 -46
- package/dist/examples/subscription-contact-create.json +0 -40
- package/dist/examples/threebody-guard-create.json +0 -56
- package/dist/examples/threebody-machine-create.json +0 -71
- package/dist/examples/threebody-permission-create.json +0 -38
- package/dist/examples/threebody-service-allocators.json +0 -48
- package/dist/examples/travel-guard-time-lock.json +0 -69
- package/dist/examples/travel-guard-weather-oracle.json +0 -70
- package/dist/examples/travel-machine-create.json +0 -135
- package/dist/examples/travel-repository-create.json +0 -47
- package/dist/examples/travel-service-create.json +0 -34
- package/dist/examples/travel-treasury-create.json +0 -34
- package/dist/examples/treasury-deposit.json +0 -37
- package/dist/examples/treasury-withdraw.json +0 -38
- package/dist/harness/plan.d.ts +0 -33
- package/dist/harness/plan.js +0 -1
- package/dist/knowledge/demand-matching.d.ts +0 -29
- package/dist/knowledge/demand-matching.js +0 -1
- package/dist/knowledge/guard-context.d.ts +0 -56
- package/dist/knowledge/guard-context.js +0 -1
- package/dist/knowledge/guard-migration.d.ts +0 -48
- package/dist/knowledge/guard-migration.js +0 -1
- package/dist/mode-market/index.d.ts +0 -3
- package/dist/mode-market/index.js +0 -1
- package/dist/mode-market/registry.d.ts +0 -53
- package/dist/mode-market/registry.js +0 -1
- package/dist/mode-market/review.d.ts +0 -27
- package/dist/mode-market/review.js +0 -1
- package/dist/mode-market/submission.d.ts +0 -25
- package/dist/mode-market/submission.js +0 -1
- package/dist/schemas/guard-node-schema.json +0 -1000
- package/dist/task/stage-gate.d.ts +0 -22
- package/dist/task/stage-gate.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{query_objects,query_table,query_account_list,LocalMark,GetLocalNamesByAddresses,bcs,deriveDynamicFieldID,queryOrdersByUser}from'@wowok/wowok';import{REPOSITORY_PERMISSIONS,REWARD_PERMISSIONS,MACHINE_PERMISSIONS,PROGRESS_PERMISSIONS,TREASURY_PERMISSIONS,SERVICE_PERMISSIONS,ARBITRATION_PERMISSIONS,DEMAND_PERMISSIONS,CONTACT_PERMISSIONS}from'./permission-ledger.js';import{formatShortAddress}from'../persona/address-format.js';const BUILTIN_PERMISSION_MAP=new Map();for(const entry of[...REPOSITORY_PERMISSIONS,...REWARD_PERMISSIONS,...MACHINE_PERMISSIONS,...PROGRESS_PERMISSIONS,...TREASURY_PERMISSIONS,...SERVICE_PERMISSIONS,...ARBITRATION_PERMISSIONS,...DEMAND_PERMISSIONS,...CONTACT_PERMISSIONS]){BUILTIN_PERMISSION_MAP['set'](entry['index'],entry['name']);}export function resolvePermissionRole(a,b){if(a===undefined||a===null)return'unknown\x20role';if(b){const d=/([A-Za-z][A-Za-z0-9_]*)\s*=\s*(\d+)/g;let e;while((e=d['exec'](b))!==null){if(Number(e[0x2])===a)return e[0x1]+'\x20(permission\x20'+a+')';}}const c=BUILTIN_PERMISSION_MAP['get'](a);if(c)return c+'\x20(permission\x20'+a+')';return'permission\x20'+a;}export const QUERY_OBJECTS_BATCH=0x32;export async function fetchAllFieldObjectIds(a,b,c){const d=[];let e=undefined;for(;;){const f=await query_table({'parent':a,'cursor':e??undefined,'no_cache':c,'network':b});if(!f?.['items']||f['items']['length']===0x0)break;for(const g of f['items']){const h=g?.['object'];if(typeof h==='string')d['push'](h);}if(!f['hasNextPage']||!f['nextCursor'])break;e=f['nextCursor'];}return d;}export async function batchQueryObjectsByIds(a,b,c){const d=[];for(let e=0x0;e<a['length'];e+=QUERY_OBJECTS_BATCH){const f=a['slice'](e,e+QUERY_OBJECTS_BATCH),g=await query_objects({'objects':f,'no_cache':c,'network':b});d['push'](...g?.['objects']??[]);}return d;}export async function fetchMachineNodes(a,b,c){const d=await query_objects({'objects':[a],'no_cache':c,'network':b}),e=d?.['objects']?.[0x0],f=e?.['object']??(typeof a==='string'&&a['startsWith']('0x')?a:undefined);if(!f)return[];const g=await fetchAllFieldObjectIds(f,b,c);if(g['length']===0x0)return[];const h=await batchQueryObjectsByIds(g,b,c);return(h??[])['filter'](i=>i?.['type']==='TableItem_MachineNode')['map'](i=>{const j=i?.['data']??i,k=typeof j?.['name']==='string'?j['name']:'',l=Array['isArray'](j?.['value'])?j['value']:Array['isArray'](j?.['pairs'])?j['pairs']:[];if(!k)return null;return{'name':k,'pairs':l['map'](m=>({'prev_node':String(m?.['prev_node']??''),'threshold':Number(m?.['threshold']??0x0),'forwards':Array['isArray'](m?.['forwards'])?m['forwards']['map'](n=>{const q=typeof n?.['guard']==='object'&&n?.['guard']!==null?n['guard']['guard']??undefined:typeof n?.['guard']==='string'?n['guard']:undefined;return{'name':String(n?.['name']??''),'weight':Number(n?.['weight']??0x0),'namedOperator':n?.['namedOperator']!==undefined&&n?.['namedOperator']!==null?String(n['namedOperator']):undefined,'permissionIndex':n?.['permissionIndex']!==undefined&&n?.['permissionIndex']!==null?Number(n['permissionIndex']):undefined,'guard':q};}):[]}))};})['filter'](i=>i!==null);}const COMPLETE_RE=/(^|_)(completed?|done|finished|received|delivered|accepted|confirmed|finalized|success|approved)(_|$)/i,REFUND_RE=/(^|_)(cancel(led)?|refund(ed)?|return(ed|_approved)?)(_|$)/i,EXCEPTION_RE=/(^|_)(interrupt(ed)?|exception|dispute(d)?|fail(ed)?|abort(ed)?|reject(ed)?)(_|$)/i;function classifyNode(a){if(COMPLETE_RE['test'](a))return'complete';if(REFUND_RE['test'](a))return'refund';if(EXCEPTION_RE['test'](a))return'exception';return'advance';}function businessMeaning(a,b){switch(b){case'complete':return'Service/deliverable\x20accepted\x20at\x20\x22'+a+'\x22\x20—\x20triggers\x20settlement\x20allocation\x20(funds\x20released\x20to\x20the\x20provider)';case'refund':return'Order\x20cancelled/returned\x20at\x20\x22'+a+'\x22\x20—\x20triggers\x20refund\x20allocation\x20(funds\x20back\x20to\x20the\x20customer)';case'exception':return'Exception\x20path\x20at\x20\x22'+a+'\x22\x20—\x20typically\x20routes\x20to\x20arbitration\x20or\x20partial-refund\x20handling';default:return'Progress\x20to\x20\x22'+a+'\x22';}}function shortAddr(a){if(!a)return undefined;return formatShortAddress(a);}function callerIsOrderHolder(a,b){if(!a||!b?.['length'])return![];const d=a['toLowerCase']();return b['some'](e=>e?.['toLowerCase']()===d);}function resolveOperator(a,b,c,d){if(a['namedOperator']===''){const e=b?.[0x0];return{'kind':'order_holder','role_name':'order\x20holder\x20(customer)','account_name':d?d(e):shortAddr(e)};}if(typeof a['namedOperator']==='string'&&a['namedOperator']['length']>0x0)return{'kind':'named_operator','named_operator':a['namedOperator'],'role_name':'named\x20operator\x20\x22'+a['namedOperator']+'\x22'};if(a['permissionIndex']!==undefined&&a['permissionIndex']!==null)return{'kind':'permission_index','permission_index':a['permissionIndex'],'role_name':resolvePermissionRole(a['permissionIndex'],c)};return{'kind':'order_holder','role_name':'unknown\x20operator'};}function gainsRisksFor(a,b,c){if(!c)return{'gains':[],'risks':[]};if(b)switch(a){case'complete':return{'gains':['Flow\x20advances','Settlement\x20triggered\x20(funds\x20released)'],'risks':['Funds\x20released\x20to\x20provider','Refund\x20leverage\x20lost\x20—\x20confirm\x20only\x20if\x20service\x20verified']};case'refund':return{'gains':['Funds\x20returned\x20to\x20you'],'risks':['If\x20service\x20was\x20already\x20rendered,\x20cancellation\x20may\x20be\x20disputed']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20reputation\x20impact']};default:return{'gains':['Flow\x20advances'],'risks':[]};}switch(a){case'complete':return{'gains':['Settlement\x20triggered\x20—\x20funds\x20released\x20to\x20provider'],'risks':[]};case'refund':return{'gains':['Clean\x20closure'],'risks':['Lost\x20revenue\x20for\x20this\x20order']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20compensation\x20fund']};default:return{'gains':['Flow\x20advances'],'risks':[]};}}function consistencyFor(a,b,c,d,e){let f;if(!e)f=a==='exception'?0x2d:0x32;else b?f=a==='refund'?0x46:a==='complete'?0x37:a==='exception'?0x23:0x32:f=a==='complete'?0x4b:a==='refund'?0x1e:a==='exception'?0x23:0x32;if(e&&c)f+=0x14;if(d)f-=0xa;return Math['max'](0x0,Math['min'](0x64,f));}export function buildWorkflowGuidance(a){const b=[];for(const i of a['nodes']){for(const j of i['pairs']){if(j['prev_node']!==a['current'])continue;for(const k of j['forwards']){if(!k['name'])continue;const l=resolveOperator(k,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver']),m=callerIsOrderHolder(a['callerAddress']??a['caller'],a['orderHolderAddresses']);let n=![];a['callerAddress']&&(n=accountCanExecuteForward(k,a['callerAddress'],a['progressNamedOperator']??[],a['orderContext'],a['permissionContext']));const p=classifyNode(i['name']),q=!!a['caller'],{gains:r,risks:s}=gainsRisksFor(p,m,q),t=consistencyFor(p,m,n,!!k['guard'],q);b['push']({'next_node':i['name'],'forward':k['name'],'weight':k['weight'],'operator':l,'guard':k['guard'],'business_meaning':businessMeaning(i['name'],p),'gains':r,'risks':s,'consistency':t,'recommended':![]});}}}if(b['length']===0x0)return{'current_node':a['current'],'caller':a['caller'],'options':[],'note':'Node\x20\x22'+a['current']+'\x22\x20has\x20no\x20outgoing\x20forwards\x20—\x20it\x20is\x20a\x20terminal\x20node\x20(or\x20the\x20workflow\x20is\x20stuck).\x20No\x20further\x20progress\x20operation\x20is\x20available\x20here.'};b['sort']((u,v)=>v['consistency']-u['consistency']);const c=b[0x0];b[0x0]={...c,'recommended':!![]};const d=[];for(const u of b){u!==c&&u['consistency']>0x0&&u['forward']!==c['forward']&&d['push']('Choosing\x20\x22'+u['forward']+'\x20→\x20'+u['next_node']+'\x22\x20forfeits\x20the\x20faster/more\x20aligned\x20path\x20\x22'+c['forward']+'\x20→\x20'+c['next_node']+'\x22');}const e=[],g=b['filter'](v=>v['operator']['kind']==='order_holder'&&v['forward']!==c['forward']&&c['forward']!==v['forward']),h=b['filter'](v=>v['operator']['account_name']&&v['operator']['account_name']!==a['caller']);return h['length']>0x0&&!b['some'](v=>v['recommended']&&v['operator']['account_name']===a['caller'])&&e['push']('The\x20recommended\x20action\x20is\x20executed\x20by\x20another\x20account\x20('+h[0x0]['operator']['account_name']+');\x20switch\x20the\x20signing\x20account\x20(env.account)\x20before\x20operating.'),{'current_node':a['current'],'caller':a['caller'],'options':b,'recommendation':{'best':c['forward']+'\x20→\x20'+c['next_node'],'rationale':'Highest\x20consistency\x20('+c['consistency']+'/100)\x20with\x20the\x20caller\x27s\x20interests.\x20Gains:\x20'+(c['gains']['join'](';\x20')||'none')+'.\x20Risks:\x20'+(c['risks']['join'](';\x20')||'none')+'.\x20Operator:\x20'+(c['operator']['role_name']??c['operator']['kind'])+(c['operator']['account_name']?'\x20('+c['operator']['account_name']+')':'')+'.'+(c['guard']?'\x20Guard\x20to\x20satisfy:\x20'+c['guard']+'.':''),'caveat':d['length']?d['join']('.\x20'):undefined},'note':e['length']?e['join']('\x20'):undefined};}export function buildWorkflowReceipt(a){const b=a['current']===a['targetNode'],c={'account':a['callerName'],'action':a['callerName']+'\x20executed\x20'+a['forward']+'\x20(→\x20'+a['targetNode']+')','forward':a['forward'],'target_node':a['targetNode'],'op':a['op'],'migrated':b,'current_node':a['current']};if(!b){const e=a['nodes']['filter'](j=>j['name']===a['targetNode'])['flatMap'](j=>j['pairs'])['find'](j=>j['prev_node']===a['current']),g=a['session']?.['slice'](-0x1)[0x0],h=g?.['threshold']??e?.['threshold']??0x0,i=g?.['weights']??0x0;if(h>0x0){c['threshold']=h,c['accumulated_weight']=i,c['remaining']=Math['max'](0x0,h-i);const j=new Set((g?.['forwards']??[])['filter'](l=>l?.['accomplished']!==![])['map'](l=>l?.['forward'])['filter'](l=>!!l)),k=[];for(const l of e?.['forwards']??[]){if(!l['name']||j['has'](l['name']))continue;k['push']({'forward':l['name'],'operator':resolveOperator(l,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver'])});}if(k['length'])c['waiting_on']=k;c['note']='Node\x20did\x20not\x20migrate:\x20threshold\x20'+h+',\x20accumulated\x20weight\x20'+i+',\x20remaining\x20'+Math['max'](0x0,h-i)+'.\x20'+(k['length']?'Waiting\x20for:\x20'+k['map'](m=>m['forward']+'\x20('+(m['operator']['role_name']??m['operator']['kind'])+')')['join'](';\x20'):'All\x20forwards\x20on\x20this\x20pair\x20are\x20accomplished\x20—\x20the\x20node\x20should\x20migrate\x20on\x20the\x20next\x20operation.');}else c['note']='Node\x20did\x20not\x20migrate\x20(threshold\x200)\x20—\x20no\x20further\x20weight\x20cooperation\x20required;\x20verify\x20the\x20operation\x20outcome.';}const d=buildWorkflowGuidance({'current':a['current'],'nodes':a['nodes'],'caller':a['caller'],'orderHolderAddresses':a['orderHolderAddresses'],'permissionDescription':a['permissionDescription'],'nameResolver':a['nameResolver']});if(d['options']['length']>0x0)c['next_guidance']=d;return c;}function operatorText(a){const b=[a['role_name']??a['kind']];if(a['account_name'])b['push'](a['account_name']);return b['join']('\x20/\x20');}export function renderGuidanceText(a){const b=['[WORKFLOW\x20GUIDANCE]\x20current\x20node:\x20\x22'+a['current_node']+'\x22'+(a['caller']?'\x20(caller:\x20'+a['caller']+')':'')];if(a['options']['length']===0x0)return b['push']('\x20\x20•\x20'+(a['note']??'No\x20reachable\x20next\x20nodes.')),b['join']('\x0a');for(const c of a['options']){const d=['\x22'+c['forward']+'\x22\x20→\x20\x22'+c['next_node']+'\x22','operator:\x20'+operatorText(c['operator']),'weight:\x20'+c['weight'],'consistency:\x20'+c['consistency']+'/100'+(c['recommended']?'\x20[RECOMMENDED]':'')];if(c['guard'])d['push']('guard:\x20'+c['guard']);d['push']('meaning:\x20'+c['business_meaning']);if(c['gains']['length'])d['push']('gains:\x20'+c['gains']['join'](';\x20'));if(c['risks']['length'])d['push']('risks:\x20'+c['risks']['join'](';\x20'));b['push']('\x20\x20•\x20'+d['join']('\x20|\x20'));}if(a['recommendation']?.['best']){b['push']('\x20\x20RECOMMENDED:\x20'+a['recommendation']['best']+'.\x20'+(a['recommendation']['rationale']??''));if(a['recommendation']['caveat'])b['push']('\x20\x20CAVEAT\x20(opportunity\x20cost):\x20'+a['recommendation']['caveat']);}if(a['note'])b['push']('\x20\x20NOTE:\x20'+a['note']);return b['push']('\x20\x20(AI\x20recommendation\x20only\x20—\x20the\x20account\x20decides;\x20switch\x20env.account\x20if\x20another\x20operator\x20must\x20act.)'),b['join']('\x0a');}export function renderReceiptText(a){const b=['[WORKFLOW\x20RECEIPT]\x20'+a['action']];b['push']('\x20\x20•\x20node\x20migrated:\x20'+(a['migrated']?'yes\x20→\x20current:\x20\x22'+a['current_node']+'\x22':'no\x20→\x20current:\x20\x22'+a['current_node']+'\x22'));if(!a['migrated']){a['threshold']!==undefined&&a['threshold']>0x0&&(b['push']('\x20\x20•\x20threshold:\x20'+a['threshold']+'\x20|\x20accumulated\x20weight:\x20'+(a['accumulated_weight']??0x0)+'\x20|\x20remaining:\x20'+(a['remaining']??0x0)),a['waiting_on']?.['length']&&b['push']('\x20\x20•\x20waiting\x20on:\x20'+a['waiting_on']['map'](c=>'\x22'+c['forward']+'\x22\x20('+operatorText(c['operator'])+')')['join'](';\x20')));if(a['note'])b['push']('\x20\x20•\x20note:\x20'+a['note']);}return a['next_guidance']&&a['next_guidance']['options']['length']>0x0&&b['push'](renderGuidanceText(a['next_guidance'])),b['join']('\x0a');}async function makeNameResolver(a){const b=[...new Set(a['filter'](d=>!!d))],c=new Map();if(b['length'])try{const d=await GetLocalNamesByAddresses(b);for(const e of d){const f=e?.['account']??e?.['local_mark'];if(f)c['set'](e['address']['toLowerCase'](),f);}}catch{}return g=>{if(!g)return undefined;const h=c['get'](g['toLowerCase']());return h??shortAddr(g);};}export async function enrichWorkflowGuidance(a){try{let b;if(a['progressRef']['startsWith']('0x'))b=a['progressRef'];else b=await LocalMark['Instance']()['get_address'](a['progressRef'])??undefined;if(!b)return undefined;const c=await query_objects({'objects':[b],'no_cache':a['noCache'],'network':a['network']}),d=c?.['objects']?.[0x0],e=d?.['data']??d;if((d?.['type']??e?.['type'])!=='Progress')return undefined;const f=e['current']??'',g=e['machine'],h=Array['isArray'](e['session'])?e['session']:[],i=(Array['isArray'](e['namedOperator'])?e['namedOperator']['find'](v=>v?.['name']==='')?.['operators']:undefined)??[];if(!g)return undefined;const j=await fetchMachineNodes(g,a['network'],![]);let k,l;try{const v=await query_objects({'objects':[g],'no_cache':a['noCache'],'network':a['network']}),w=v?.['objects']?.[0x0],x=w?.['data']??w,y=x?.['permission'];if(y){const z=await query_objects({'objects':[y],'no_cache':a['noCache'],'network':a['network']}),A=z?.['objects']?.[0x0];k=(A?.['data']??A)?.['description']??undefined,l=await fetchPermissionContext(y,a['network'],a['noCache']);}}catch{}const m=(Array['isArray'](e['namedOperator'])?e['namedOperator']:[])['map'](B=>({'name':String(B?.['name']??''),'operators':(B?.['operators']??[])['map'](C=>String(C))}));let n;e['task']&&(n=await fetchOrderContext(e['task'],a['network'],a['noCache']));const o=n?Array['from'](new Set([n['builder'],...n['agent']])['values']()):i;let p;try{p=await LocalMark['Instance']()['get_address'](a['accountName'])??undefined;}catch{p=undefined;}const q=await makeNameResolver([a['accountName'],...o]),r={'current':f,'nodes':j,'caller':a['accountName'],'callerAddress':p,'orderHolderAddresses':o,'progressNamedOperator':m,'permissionContext':l,'orderContext':n,'permissionDescription':k,'nameResolver':q},s=buildWorkflowGuidance(r);let t;a['operate']?.['forward']&&a['operate']?.['next_node_name']&&(t=buildWorkflowReceipt({...r,'callerName':a['accountName']??b,'forward':a['operate']['forward'],'targetNode':a['operate']['next_node_name'],'op':a['operate']['op'],'session':h}));const u=[t?renderReceiptText(t):undefined,s['options']['length']?renderGuidanceText(s):undefined]['filter'](B=>!!B)['join']('\x0a\x0a');return{'guidance':s,'receipt':t,'text':u};}catch{return undefined;}}export function mergeGuidanceIntoOutput(a,b){if(!b)return a;try{const c=a?.['structuredContent'];if(c&&typeof c==='object'){const d=c['semantic'];if(d&&typeof d==='object'){if(b['guidance'])d['workflow_guidance']=b['guidance'];if(b['receipt'])d['workflow_receipt']=b['receipt'];}}b['text']&&Array['isArray'](a?.['content'])&&a['content'][0x0]?.['text']!==undefined&&(a['content'][0x0]['text']=b['text']+'\x0a\x0a'+a['content'][0x0]['text']);}catch{}return a;}export const ENTITY_PERMISSION_OBJECT_ID='0xaad';export const ENTITY_PERMISSION_ROLES={'OWNER':0x1,'ADMIN':0x2,'ENTITY':0x4};export async function fetchEntityPermission(a,b,c){try{const e=bcs['Address']['serialize'](a)['toBytes'](),f=deriveDynamicFieldID(ENTITY_PERMISSION_OBJECT_ID,'address',e),g=await query_objects({'objects':[f],'no_cache':c,'network':b}),h=g?.['objects']?.[0x0],i=h?.['data']??h,j=[],k=new Map(),l=Array['isArray'](i?.['items'])?i['items']:[];for(const m of l){const n=Number(m?.['role']??0x0),o=String(m?.['permission']??'')['toLowerCase'](),p=Number(m?.['time']??0x0);o&&(j['push']({'role':n,'permission':o,'time':p}),k['set'](o,(k['get'](o)??0x0)|n));}return{'items':j,'byPermission':k};}catch{return undefined;}}export const ENTITY_CONTACT_OBJECT_ID='0xaa9';export async function fetchEntityContact(a,b,c){try{const e=bcs['Address']['serialize'](a)['toBytes'](),f=deriveDynamicFieldID(ENTITY_CONTACT_OBJECT_ID,'address',e),g=await query_objects({'objects':[f],'no_cache':c,'network':b}),h=g?.['objects']?.[0x0],i=h?.['data']??h,j=[],k=new Map(),l=Array['isArray'](i?.['items'])?i['items']:[];for(const m of l){const n=String(m?.['contact']??'')['toLowerCase'](),o=Number(m?.['time']??0x0);n&&(j['push']({'contact':n,'time':o}),k['set'](n,(k['get'](n)??o)||o));}return{'items':j,'byContact':k};}catch{return undefined;}}export const ENTITY_ORDER_OBJECT_ID='0xaa8';export const ENTITY_ORDER_ROLES={'OWNER':0x1,'AGENT':0x2};export async function fetchOrdersOfUser(a,b,c){try{return await queryOrdersByUser({'address':a,'no_cache':c,'network':b});}catch{return undefined;}}export async function resolveLocalNamesFor(a){const b=new Map();try{const c=[...new Set((a??[])['filter'](e=>typeof e==='string'&&e['startsWith']('0x')))];if(c['length']===0x0)return{'byAddress':b};const d=await GetLocalNamesByAddresses(c);for(const e of d??[]){const f=e?.['account']||e?.['local_mark'];if(f)b['set'](String(e['address'])['toLowerCase'](),f);}}catch{}return{'byAddress':b};}export const OBJECT_LINKER_CORE_OBJECT_ID='0xaae';export const OBJECT_LINKER_TX_OBJECT_ID='0xaaf';async function fetchObjectLinker(a,b,c,e){try{const f=bcs['Address']['serialize'](b)['toBytes'](),g=deriveDynamicFieldID(a,'address',f),h=await query_objects({'objects':[g],'no_cache':e,'network':c}),i=h?.['objects']?.[0x0],j=i?.['data']??i,k=[],l=new Map(),m=Array['isArray'](j?.['items'])?j['items']:[];for(const n of m){const o=String(n?.['who']??'')['toLowerCase'](),p=Number(n?.['time']??0x0);o&&(k['push']({'who':o,'time':p}),l['set'](o,p));}return{'items':k,'byWho':l};}catch{return undefined;}}export async function fetchObjectLinkerCore(a,b,c){return fetchObjectLinker(OBJECT_LINKER_CORE_OBJECT_ID,a,b,c);}export async function fetchObjectLinkerTx(a,b,c){return fetchObjectLinker(OBJECT_LINKER_TX_OBJECT_ID,a,b,c);}export async function fetchPermissionContext(a,b,c){try{const e=await query_objects({'objects':[a],'no_cache':c,'network':b}),f=e?.['objects']?.[0x0],g=f?.['data']??f,h=new Set((g?.['admin']??[])['map'](k=>String(k)['toLowerCase']())),i=new Map(),j=await fetchAllFieldObjectIds(a,b,c);if(j['length']>0x0){const k=await batchQueryObjectsByIds(j,b,c);for(const l of k??[]){const m=l?.['data']??l,n=m?.['address'],p=m?.['perm'];n!=null&&Array['isArray'](p)&&i['set'](String(n)['toLowerCase'](),new Set(p['map'](q=>Number(q))));}}return{'admin':h,'table':i};}catch{return undefined;}}export async function fetchOrderContext(a,b,c){try{const e=await query_objects({'objects':[a],'no_cache':c,'network':b}),f=e?.['objects']?.[0x0];if((f?.['type']??f?.['data']?.['type'])!=='Order')return undefined;const g=f?.['data']??f;return{'builder':String(g?.['builder']??g?.['owner']??''),'agent':new Set((g?.['agent']??[])['map'](h=>String(h)['toLowerCase']()))};}catch{return undefined;}}export async function listLocalAccounts(){try{const a=await query_account_list({'suspended':![]});return(a??[])['filter'](b=>b?.['address'])['map'](b=>({'address':String(b['address']),'name':b['name']??undefined}));}catch{return[];}}export function accountCanExecuteForward(a,b,c,d,e){const g=b['toLowerCase']();if(a['namedOperator']!==undefined&&a['namedOperator']!==null){if(a['namedOperator']===''){if(d&&(g===d['builder']['toLowerCase']()||d['agent']['has'](g)))return!![];}else{if(a['namedOperator']['length']>0x0){const h=a['namedOperator'],i=c['find'](j=>String(j?.['name']??'')===h);if(i?.['operators']?.['some'](j=>String(j)['toLowerCase']()===g))return!![];}}}if(a['permissionIndex']!==undefined&&a['permissionIndex']!==null&&e){if(e['admin']['has'](g))return!![];const j=e['table']['get'](g);if(j?.['has'](a['permissionIndex']))return!![];}return![];}
|
|
1
|
+
import{query_objects,query_table,query_account_list,LocalMark,GetLocalNamesByAddresses,bcs,deriveDynamicFieldID,queryOrdersByUser,objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{REPOSITORY_PERMISSIONS,REWARD_PERMISSIONS,MACHINE_PERMISSIONS,PROGRESS_PERMISSIONS,TREASURY_PERMISSIONS,SERVICE_PERMISSIONS,ARBITRATION_PERMISSIONS,DEMAND_PERMISSIONS,CONTACT_PERMISSIONS}from'./permission-ledger.js';import{formatShortAddress}from'../persona/address-format.js';const BUILTIN_PERMISSION_MAP=new Map();for(const entry of[...REPOSITORY_PERMISSIONS,...REWARD_PERMISSIONS,...MACHINE_PERMISSIONS,...PROGRESS_PERMISSIONS,...TREASURY_PERMISSIONS,...SERVICE_PERMISSIONS,...ARBITRATION_PERMISSIONS,...DEMAND_PERMISSIONS,...CONTACT_PERMISSIONS]){BUILTIN_PERMISSION_MAP['set'](entry['index'],entry['name']);}export function resolvePermissionRole(a,b){if(a===undefined||a===null)return'unknown\x20role';if(b){const d=/([A-Za-z][A-Za-z0-9_]*)\s*=\s*(\d+)/g;let e;while((e=d['exec'](b))!==null){if(Number(e[0x2])===a)return e[0x1]+'\x20(permission\x20'+a+')';}}const c=BUILTIN_PERMISSION_MAP['get'](a);if(c)return c+'\x20(permission\x20'+a+')';return'permission\x20'+a;}export const QUERY_OBJECTS_BATCH=0x32;export async function fetchTableEntries(a,b){const c=[],d=b?.['maxItems'];let e=![],f=undefined;for(;;){const g=await query_table({'parent':a,'cursor':f??undefined,'limit':b?.['limit'],'no_cache':b?.['noCache'],'network':b?.['network']});for(const i of g?.['items']??[]){if(d!==undefined&&c['length']>=d)break;const j=String(i?.['object']??'');if(!j['startsWith']('0x'))continue;c['push']({'key':String(i?.['key']?.['value']??''),'objectId':j});}const h=g?.['hasNextPage']===!![]&&!!g?.['nextCursor'];if(d!==undefined&&c['length']>=d){e=h;break;}if(!h)break;f=String(g['nextCursor']);}return{'entries':c,'truncated':e};}export async function fetchAllFieldObjectIds(a,b,c){const {entries:d}=await fetchTableEntries(a,{'network':b,'noCache':c});return d['map'](f=>f['objectId']);}export async function batchQueryObjectsByIds(a,b,c){const d=[];for(let e=0x0;e<a['length'];e+=QUERY_OBJECTS_BATCH){const f=a['slice'](e,e+QUERY_OBJECTS_BATCH),g=await query_objects({'objects':f,'no_cache':c,'network':b});d['push'](...g?.['objects']??[]);}return d;}export async function batchQueryTableItems(a,b){const {entries:c,truncated:d}=await fetchTableEntries(a,b),e=c['length']>0x0?await batchQueryObjectsByIds(c['map'](h=>h['objectId']),b?.['network'],b?.['noCache']):[],f=new Map();for(const h of e){const i=String(h?.['object']??'')['toLowerCase']();if(i)f['set'](i,h);}const g=c['map'](j=>({...j,'object':f['get'](j['objectId']['toLowerCase']())}));return{'items':g,'truncated':d};}export async function fetchMachineNodes(a,b,c){const d=await query_objects({'objects':[a],'no_cache':c,'network':b}),e=d?.['objects']?.[0x0],f=e?.['object']??(typeof a==='string'&&a['startsWith']('0x')?a:undefined);if(!f)return[];const {items:g}=await batchQueryTableItems(f,{'network':b,'noCache':c});return g['map'](h=>h['object'])['filter'](h=>h?.['type']==='TableItem_MachineNode')['map'](h=>{const i=h?.['data']??h,j=typeof i?.['name']==='string'?i['name']:'',k=Array['isArray'](i?.['value'])?i['value']:Array['isArray'](i?.['pairs'])?i['pairs']:[];if(!j)return null;return{'name':j,'pairs':k['map'](l=>({'prev_node':String(l?.['prev_node']??''),'threshold':Number(l?.['threshold']??0x0),'forwards':Array['isArray'](l?.['forwards'])?l['forwards']['map'](m=>{const n=typeof m?.['guard']==='object'&&m?.['guard']!==null?m['guard']['guard']??undefined:typeof m?.['guard']==='string'?m['guard']:undefined;return{'name':String(m?.['name']??''),'weight':Number(m?.['weight']??0x0),'namedOperator':m?.['namedOperator']!==undefined&&m?.['namedOperator']!==null?String(m['namedOperator']):undefined,'permissionIndex':m?.['permissionIndex']!==undefined&&m?.['permissionIndex']!==null?Number(m['permissionIndex']):undefined,'guard':n};}):[]}))};})['filter'](h=>h!==null);}const COMPLETE_RE=/(^|_)(completed?|done|finished|received|delivered|accepted|confirmed|finalized|success|approved)(_|$)/i,REFUND_RE=/(^|_)(cancel(led)?|refund(ed)?|return(ed|_approved)?)(_|$)/i,EXCEPTION_RE=/(^|_)(interrupt(ed)?|exception|dispute(d)?|fail(ed)?|abort(ed)?|reject(ed)?)(_|$)/i;function classifyNode(a){if(COMPLETE_RE['test'](a))return'complete';if(REFUND_RE['test'](a))return'refund';if(EXCEPTION_RE['test'](a))return'exception';return'advance';}function businessMeaning(a,b){switch(b){case'complete':return'Service/deliverable\x20accepted\x20at\x20\x22'+a+'\x22\x20—\x20triggers\x20settlement\x20allocation\x20(funds\x20released\x20to\x20the\x20provider)';case'refund':return'Order\x20cancelled/returned\x20at\x20\x22'+a+'\x22\x20—\x20triggers\x20refund\x20allocation\x20(funds\x20back\x20to\x20the\x20customer)';case'exception':return'Exception\x20path\x20at\x20\x22'+a+'\x22\x20—\x20typically\x20routes\x20to\x20arbitration\x20or\x20partial-refund\x20handling';default:return'Progress\x20to\x20\x22'+a+'\x22';}}function shortAddr(a){if(!a)return undefined;return formatShortAddress(a);}function callerIsOrderHolder(a,b){if(!a||!b?.['length'])return![];const d=a['toLowerCase']();return b['some'](e=>e?.['toLowerCase']()===d);}function resolveOperator(a,b,c,d){if(a['namedOperator']===''){const e=b?.[0x0];return{'kind':'order_holder','role_name':'order\x20holder\x20(customer)','account_name':d?d(e):shortAddr(e)};}if(typeof a['namedOperator']==='string'&&a['namedOperator']['length']>0x0)return{'kind':'named_operator','named_operator':a['namedOperator'],'role_name':'named\x20operator\x20\x22'+a['namedOperator']+'\x22'};if(a['permissionIndex']!==undefined&&a['permissionIndex']!==null)return{'kind':'permission_index','permission_index':a['permissionIndex'],'role_name':resolvePermissionRole(a['permissionIndex'],c)};return{'kind':'order_holder','role_name':'unknown\x20operator'};}function gainsRisksFor(a,b,c){if(!c)return{'gains':[],'risks':[]};if(b)switch(a){case'complete':return{'gains':['Flow\x20advances','Settlement\x20triggered\x20(funds\x20released)'],'risks':['Funds\x20released\x20to\x20provider','Refund\x20leverage\x20lost\x20—\x20confirm\x20only\x20if\x20service\x20verified']};case'refund':return{'gains':['Funds\x20returned\x20to\x20you'],'risks':['If\x20service\x20was\x20already\x20rendered,\x20cancellation\x20may\x20be\x20disputed']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20reputation\x20impact']};default:return{'gains':['Flow\x20advances'],'risks':[]};}switch(a){case'complete':return{'gains':['Settlement\x20triggered\x20—\x20funds\x20released\x20to\x20provider'],'risks':[]};case'refund':return{'gains':['Clean\x20closure'],'risks':['Lost\x20revenue\x20for\x20this\x20order']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20compensation\x20fund']};default:return{'gains':['Flow\x20advances'],'risks':[]};}}function consistencyFor(a,b,c,d,e){let f;if(!e)f=a==='exception'?0x2d:0x32;else b?f=a==='refund'?0x46:a==='complete'?0x37:a==='exception'?0x23:0x32:f=a==='complete'?0x4b:a==='refund'?0x1e:a==='exception'?0x23:0x32;if(e&&c)f+=0x14;if(d)f-=0xa;return Math['max'](0x0,Math['min'](0x64,f));}export function buildWorkflowGuidance(a){const b=[];for(const i of a['nodes']){for(const j of i['pairs']){if(j['prev_node']!==a['current'])continue;for(const k of j['forwards']){if(!k['name'])continue;const l=resolveOperator(k,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver']),m=callerIsOrderHolder(a['callerAddress']??a['caller'],a['orderHolderAddresses']);let n=![];a['callerAddress']&&(n=accountCanExecuteForward(k,a['callerAddress'],a['progressNamedOperator']??[],a['orderContext'],a['permissionContext']));const p=classifyNode(i['name']),q=!!a['caller'],{gains:r,risks:s}=gainsRisksFor(p,m,q),t=consistencyFor(p,m,n,!!k['guard'],q);b['push']({'next_node':i['name'],'forward':k['name'],'weight':k['weight'],'operator':l,'guard':k['guard'],'business_meaning':businessMeaning(i['name'],p),'gains':r,'risks':s,'consistency':t,'recommended':![]});}}}if(b['length']===0x0)return{'current_node':a['current'],'caller':a['caller'],'options':[],'note':'Node\x20\x22'+a['current']+'\x22\x20has\x20no\x20outgoing\x20forwards\x20—\x20it\x20is\x20a\x20terminal\x20node\x20(or\x20the\x20workflow\x20is\x20stuck).\x20No\x20further\x20progress\x20operation\x20is\x20available\x20here.'};b['sort']((u,v)=>v['consistency']-u['consistency']);const c=b[0x0];b[0x0]={...c,'recommended':!![]};const d=[];for(const u of b){u!==c&&u['consistency']>0x0&&u['forward']!==c['forward']&&d['push']('Choosing\x20\x22'+u['forward']+'\x20→\x20'+u['next_node']+'\x22\x20forfeits\x20the\x20faster/more\x20aligned\x20path\x20\x22'+c['forward']+'\x20→\x20'+c['next_node']+'\x22');}const e=[],g=b['filter'](v=>v['operator']['kind']==='order_holder'&&v['forward']!==c['forward']&&c['forward']!==v['forward']),h=b['filter'](v=>v['operator']['account_name']&&v['operator']['account_name']!==a['caller']);return h['length']>0x0&&!b['some'](v=>v['recommended']&&v['operator']['account_name']===a['caller'])&&e['push']('The\x20recommended\x20action\x20is\x20executed\x20by\x20another\x20account\x20('+h[0x0]['operator']['account_name']+');\x20switch\x20the\x20signing\x20account\x20(env.account)\x20before\x20operating.'),{'current_node':a['current'],'caller':a['caller'],'options':b,'recommendation':{'best':c['forward']+'\x20→\x20'+c['next_node'],'rationale':'Highest\x20consistency\x20('+c['consistency']+'/100)\x20with\x20the\x20caller\x27s\x20interests.\x20Gains:\x20'+(c['gains']['join'](';\x20')||'none')+'.\x20Risks:\x20'+(c['risks']['join'](';\x20')||'none')+'.\x20Operator:\x20'+(c['operator']['role_name']??c['operator']['kind'])+(c['operator']['account_name']?'\x20('+c['operator']['account_name']+')':'')+'.'+(c['guard']?'\x20Guard\x20to\x20satisfy:\x20'+c['guard']+'.':''),'caveat':d['length']?d['join']('.\x20'):undefined},'note':e['length']?e['join']('\x20'):undefined};}export function buildWorkflowReceipt(a){const b=a['current']===a['targetNode'],c={'account':a['callerName'],'action':a['callerName']+'\x20executed\x20'+a['forward']+'\x20(→\x20'+a['targetNode']+')','forward':a['forward'],'target_node':a['targetNode'],'op':a['op'],'migrated':b,'current_node':a['current']};if(!b){const e=a['nodes']['filter'](j=>j['name']===a['targetNode'])['flatMap'](j=>j['pairs'])['find'](j=>j['prev_node']===a['current']),g=a['session']?.['slice'](-0x1)[0x0],h=g?.['threshold']??e?.['threshold']??0x0,i=g?.['weights']??0x0;if(h>0x0){c['threshold']=h,c['accumulated_weight']=i,c['remaining']=Math['max'](0x0,h-i);const j=new Set((g?.['forwards']??[])['filter'](l=>l?.['accomplished']!==![])['map'](l=>l?.['forward'])['filter'](l=>!!l)),k=[];for(const l of e?.['forwards']??[]){if(!l['name']||j['has'](l['name']))continue;k['push']({'forward':l['name'],'operator':resolveOperator(l,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver'])});}if(k['length'])c['waiting_on']=k;c['note']='Node\x20did\x20not\x20migrate:\x20threshold\x20'+h+',\x20accumulated\x20weight\x20'+i+',\x20remaining\x20'+Math['max'](0x0,h-i)+'.\x20'+(k['length']?'Waiting\x20for:\x20'+k['map'](m=>m['forward']+'\x20('+(m['operator']['role_name']??m['operator']['kind'])+')')['join'](';\x20'):'All\x20forwards\x20on\x20this\x20pair\x20are\x20accomplished\x20—\x20the\x20node\x20should\x20migrate\x20on\x20the\x20next\x20operation.');}else c['note']='Node\x20did\x20not\x20migrate\x20(threshold\x200)\x20—\x20no\x20further\x20weight\x20cooperation\x20required;\x20verify\x20the\x20operation\x20outcome.';}const d=buildWorkflowGuidance({'current':a['current'],'nodes':a['nodes'],'caller':a['caller'],'callerAddress':a['callerAddress'],'orderHolderAddresses':a['orderHolderAddresses'],'progressNamedOperator':a['progressNamedOperator'],'permissionContext':a['permissionContext'],'orderContext':a['orderContext'],'permissionDescription':a['permissionDescription'],'nameResolver':a['nameResolver']});if(d['options']['length']>0x0)c['next_guidance']=d;return c;}function operatorText(a){const b=[a['role_name']??a['kind']];if(a['account_name'])b['push'](a['account_name']);return b['join']('\x20/\x20');}export function renderGuidanceText(a){const b=['[WORKFLOW\x20GUIDANCE]\x20current\x20node:\x20\x22'+a['current_node']+'\x22'+(a['caller']?'\x20(caller:\x20'+a['caller']+')':'')];if(a['options']['length']===0x0)return b['push']('\x20\x20•\x20'+(a['note']??'No\x20reachable\x20next\x20nodes.')),b['join']('\x0a');for(const c of a['options']){const d=['\x22'+c['forward']+'\x22\x20→\x20\x22'+c['next_node']+'\x22','operator:\x20'+operatorText(c['operator']),'weight:\x20'+c['weight'],'consistency:\x20'+c['consistency']+'/100'+(c['recommended']?'\x20[RECOMMENDED]':'')];if(c['guard'])d['push']('guard:\x20'+c['guard']);d['push']('meaning:\x20'+c['business_meaning']);if(c['gains']['length'])d['push']('gains:\x20'+c['gains']['join'](';\x20'));if(c['risks']['length'])d['push']('risks:\x20'+c['risks']['join'](';\x20'));b['push']('\x20\x20•\x20'+d['join']('\x20|\x20'));}if(a['recommendation']?.['best']){b['push']('\x20\x20RECOMMENDED:\x20'+a['recommendation']['best']+'.\x20'+(a['recommendation']['rationale']??''));if(a['recommendation']['caveat'])b['push']('\x20\x20CAVEAT\x20(opportunity\x20cost):\x20'+a['recommendation']['caveat']);}if(a['note'])b['push']('\x20\x20NOTE:\x20'+a['note']);return b['push']('\x20\x20(AI\x20recommendation\x20only\x20—\x20the\x20account\x20decides;\x20switch\x20env.account\x20if\x20another\x20operator\x20must\x20act.)'),b['join']('\x0a');}export function renderReceiptText(a){const b=['[WORKFLOW\x20RECEIPT]\x20'+a['action']];b['push']('\x20\x20•\x20node\x20migrated:\x20'+(a['migrated']?'yes\x20→\x20current:\x20\x22'+a['current_node']+'\x22':'no\x20→\x20current:\x20\x22'+a['current_node']+'\x22'));if(!a['migrated']){a['threshold']!==undefined&&a['threshold']>0x0&&(b['push']('\x20\x20•\x20threshold:\x20'+a['threshold']+'\x20|\x20accumulated\x20weight:\x20'+(a['accumulated_weight']??0x0)+'\x20|\x20remaining:\x20'+(a['remaining']??0x0)),a['waiting_on']?.['length']&&b['push']('\x20\x20•\x20waiting\x20on:\x20'+a['waiting_on']['map'](c=>'\x22'+c['forward']+'\x22\x20('+operatorText(c['operator'])+')')['join'](';\x20')));if(a['note'])b['push']('\x20\x20•\x20note:\x20'+a['note']);}return a['next_guidance']&&a['next_guidance']['options']['length']>0x0&&b['push'](renderGuidanceText(a['next_guidance'])),b['join']('\x0a');}async function makeNameResolver(a){const b=[...new Set(a['filter'](d=>!!d))],c=new Map();if(b['length'])try{const d=await GetLocalNamesByAddresses(b);for(const e of d){const f=e?.['account']??e?.['local_mark'];if(f)c['set'](e['address']['toLowerCase'](),f);}}catch{}return g=>{if(!g)return undefined;const h=c['get'](g['toLowerCase']());return h??shortAddr(g);};}export async function enrichWorkflowGuidance(a){try{let b;if(a['progressRef']['startsWith']('0x'))b=a['progressRef'];else b=await LocalMark['Instance']()['get_address'](a['progressRef'])??undefined;if(!b)return undefined;const c=await query_objects({'objects':[b],'no_cache':a['noCache'],'network':a['network']}),d=c?.['objects']?.[0x0],e=d?.['data']??d;if((d?.['type']??e?.['type'])!=='Progress')return undefined;const f=e['current']??'',g=e['machine'],h=Array['isArray'](e['session'])?e['session']:[],i=(Array['isArray'](e['namedOperator'])?e['namedOperator']['find'](v=>v?.['name']==='')?.['operators']:undefined)??[];if(!g)return undefined;const j=await fetchMachineNodes(g,a['network'],![]);let k,l;try{const v=await query_objects({'objects':[g],'no_cache':a['noCache'],'network':a['network']}),w=v?.['objects']?.[0x0],x=w?.['data']??w,y=x?.['permission'];if(y){const z=await query_objects({'objects':[y],'no_cache':a['noCache'],'network':a['network']}),A=z?.['objects']?.[0x0];k=(A?.['data']??A)?.['description']??undefined,l=await fetchPermissionContext(y,a['network'],a['noCache']);}}catch{}const m=(Array['isArray'](e['namedOperator'])?e['namedOperator']:[])['map'](B=>({'name':String(B?.['name']??''),'operators':(B?.['operators']??[])['map'](C=>String(C))}));let n;e['task']&&(n=await fetchOrderContext(e['task'],a['network'],a['noCache']));const o=n?Array['from'](new Set([n['builder'],...n['agent']])['values']()):i;let p;try{p=await LocalMark['Instance']()['get_address'](a['accountName'])??undefined;}catch{p=undefined;}const q=await makeNameResolver([a['accountName'],...o]),r={'current':f,'nodes':j,'caller':a['accountName'],'callerAddress':p,'orderHolderAddresses':o,'progressNamedOperator':m,'permissionContext':l,'orderContext':n,'permissionDescription':k,'nameResolver':q},s=buildWorkflowGuidance(r);let t;a['operate']?.['forward']&&a['operate']?.['next_node_name']&&(t=buildWorkflowReceipt({...r,'callerName':a['accountName']??b,'forward':a['operate']['forward'],'targetNode':a['operate']['next_node_name'],'op':a['operate']['op'],'session':h}));const u=[t?renderReceiptText(t):undefined,s['options']['length']&&!t?.['next_guidance']?.['options']['length']?renderGuidanceText(s):undefined]['filter'](B=>!!B)['join']('\x0a\x0a');return{'guidance':s,'receipt':t,'text':u};}catch{return undefined;}}export function mergeGuidanceIntoOutput(a,b){if(!b)return a;try{const c=a?.['structuredContent'];if(c&&typeof c==='object'){const d=c['semantic'];if(d&&typeof d==='object'){if(b['guidance'])d['workflow_guidance']=b['guidance'];if(b['receipt'])d['workflow_receipt']=b['receipt'];}}b['text']&&Array['isArray'](a?.['content'])&&a['content'][0x0]?.['text']!==undefined&&(a['content'][0x0]['text']=b['text']+'\x0a\x0a'+a['content'][0x0]['text']);}catch{}return a;}export const ENTITY_REGISTRAR_OBJECT_ID='0x0000000000000000000000000000000000000000000000000000000000000aab';export const ENTITY_LINKER_OBJECT_ID='0x0000000000000000000000000000000000000000000000000000000000000aaa';async function batchReadDerivedFields(a,b,c,d){const e=new Map();if(b['length']===0x0)return e;const f=new Map();for(const h of b){const i=deriveDynamicFieldID(a,h['typeTag'],h['keyBytes'])['toLowerCase']();f['set'](i,h['joinKey']);}const g=await batchQueryObjectsByIds([...f['keys']()],c,d);for(const j of g){const l=String(j?.['object']??'')['toLowerCase'](),m=f['get'](l);if(!m)continue;e['set'](m,j?.['data']??j);}return e;}export async function batchReadAddressKeyedFields(a,b,c,d){const e=[...new Set((b??[])['map'](f=>String(f)['toLowerCase']())['filter'](f=>f['startsWith']('0x')))];return batchReadDerivedFields(a,e['map'](f=>({'typeTag':'address','keyBytes':bcs['Address']['serialize'](f)['toBytes'](),'joinKey':f})),c,d);}export async function batchReadU64KeyedFields(a,b,c,d){const e=[...new Set((b??[])['map'](f=>String(f))['filter'](f=>f!==''&&Number['isFinite'](Number(f))))];return batchReadDerivedFields(a,e['map'](f=>({'typeTag':'u64','keyBytes':bcs['u64']()['serialize'](Number(f))['toBytes'](),'joinKey':f})),c,d);}export async function batchFetchEntityRegistrar(a,b,c){try{return await batchReadAddressKeyedFields(ENTITY_REGISTRAR_OBJECT_ID,a,b,c);}catch{return new Map();}}export async function batchFetchEntityLinker(a,b,c){try{return await batchReadAddressKeyedFields(ENTITY_LINKER_OBJECT_ID,a,b,c);}catch{return new Map();}}export const ENTITY_PERMISSION_OBJECT_ID='0xaad';export const ENTITY_PERMISSION_ROLES={'OWNER':0x1,'ADMIN':0x2,'ENTITY':0x4};export async function fetchEntityPermission(a,b,c){try{const e=await batchReadAddressKeyedFields(ENTITY_PERMISSION_OBJECT_ID,[a],b,c),f=e['get'](String(a)['toLowerCase']()),g=[],h=new Map(),i=Array['isArray'](f?.['items'])?f['items']:[];for(const j of i){const k=Number(j?.['role']??0x0),l=String(j?.['permission']??'')['toLowerCase'](),m=Number(j?.['time']??0x0);l&&(g['push']({'role':k,'permission':l,'time':m}),h['set'](l,(h['get'](l)??0x0)|k));}return{'items':g,'byPermission':h};}catch{return undefined;}}export const ENTITY_CONTACT_OBJECT_ID='0xaa9';export async function fetchEntityContact(a,b,c){try{const e=await batchReadAddressKeyedFields(ENTITY_CONTACT_OBJECT_ID,[a],b,c),f=e['get'](String(a)['toLowerCase']()),g=[],h=new Map(),i=Array['isArray'](f?.['items'])?f['items']:[];for(const j of i){const k=String(j?.['contact']??'')['toLowerCase'](),l=Number(j?.['time']??0x0);k&&(g['push']({'contact':k,'time':l}),h['set'](k,(h['get'](k)??l)||l));}return{'items':g,'byContact':h};}catch{return undefined;}}export const ENTITY_ORDER_OBJECT_ID='0xaa8';export const ENTITY_ORDER_ROLES={'OWNER':0x1,'AGENT':0x2};export async function fetchOrdersOfUser(a,b,c){try{return await queryOrdersByUser({'address':a,'no_cache':c,'network':b});}catch{return undefined;}}export async function resolveLocalNamesFor(a){const b=new Map();try{const c=[...new Set((a??[])['filter'](e=>typeof e==='string'&&e['startsWith']('0x')))];if(c['length']===0x0)return{'byAddress':b};const d=await GetLocalNamesByAddresses(c);for(const e of d??[]){const f=e?.['account']||e?.['local_mark'];if(f)b['set'](String(e['address'])['toLowerCase'](),f);}}catch{}return{'byAddress':b};}export const OBJECT_LINKER_CORE_OBJECT_ID='0xaae';export const OBJECT_LINKER_TX_OBJECT_ID='0xaaf';async function fetchObjectLinker(a,b,c,e){try{const f=await batchReadAddressKeyedFields(a,[b],c,e),g=f['get'](String(b)['toLowerCase']()),h=[],i=new Map(),j=Array['isArray'](g?.['items'])?g['items']:[];for(const k of j){const l=String(k?.['who']??'')['toLowerCase'](),m=Number(k?.['time']??0x0);l&&(h['push']({'who':l,'time':m}),i['set'](l,m));}return{'items':h,'byWho':i};}catch{return undefined;}}export async function fetchObjectLinkerCore(a,b,c){return fetchObjectLinker(OBJECT_LINKER_CORE_OBJECT_ID,a,b,c);}export async function fetchObjectLinkerTx(a,b,c){return fetchObjectLinker(OBJECT_LINKER_TX_OBJECT_ID,a,b,c);}export async function fetchServiceOrders(a,b,c){const d=await fetchObjectLinkerTx(a,b,c);if(!d)return undefined;const e=d['items']['filter'](f=>objectTypeFromAddress(f['who'])===ObjectType['Order']);return{'items':e,'byWho':new Map(e['map'](f=>[f['who'],f['time']]))};}export async function fetchPermissionContext(a,b,c){try{const e=await query_objects({'objects':[a],'no_cache':c,'network':b}),f=e?.['objects']?.[0x0],g=f?.['data']??f,h=new Set((g?.['admin']??[])['map'](k=>String(k)['toLowerCase']())),i=new Map(),{items:j}=await batchQueryTableItems(a,{'network':b,'noCache':c});for(const k of j){const l=k['object'];if(!l)continue;const m=l?.['data']??l,n=m?.['address'],p=m?.['perm'];n!=null&&Array['isArray'](p)&&i['set'](String(n)['toLowerCase'](),new Set(p['map'](q=>Number(q))));}return{'admin':h,'table':i};}catch{return undefined;}}export async function fetchOrderContext(a,b,c){try{const e=await query_objects({'objects':[a],'no_cache':c,'network':b}),f=e?.['objects']?.[0x0];if((f?.['type']??f?.['data']?.['type'])!=='Order')return undefined;const g=f?.['data']??f;return{'builder':String(g?.['builder']??g?.['owner']??''),'agent':new Set((g?.['agent']??[])['map'](h=>String(h)['toLowerCase']()))};}catch{return undefined;}}export async function listLocalAccounts(){try{const a=await query_account_list({'suspended':![]});return(a??[])['filter'](b=>b?.['address'])['map'](b=>({'address':String(b['address']),'name':b['name']??undefined}));}catch{return[];}}export function accountCanExecuteForward(a,b,c,d,e){const g=b['toLowerCase']();if(a['namedOperator']!==undefined&&a['namedOperator']!==null){if(a['namedOperator']===''){if(d&&(g===d['builder']['toLowerCase']()||d['agent']['has'](g)))return!![];}else{if(a['namedOperator']['length']>0x0){const h=a['namedOperator'],i=c['find'](j=>String(j?.['name']??'')===h);if(i?.['operators']?.['some'](j=>String(j)['toLowerCase']()===g))return!![];}}}if(a['permissionIndex']!==undefined&&a['permissionIndex']!==null&&e){if(e['admin']['has'](g))return!![];const j=e['table']['get'](g);if(j?.['has'](a['permissionIndex']))return!![];}return![];}export function forwardOperatorKind(a){if(a['namedOperator']==='')return'order_holder';if(typeof a['namedOperator']==='string'&&a['namedOperator']['length']>0x0)return'named_operator';return'permission_index';}export function enumerateActionableForwards(a,b,c,d,e,g){const h=typeof a?.['current']==='string'?a['current']:'',i=new Map();for(const k of Array['isArray'](a?.['session'])?a['session']:[]){const l=String(k?.['next_node']??'');for(const m of Array['isArray'](k?.['forwards'])?k['forwards']:[]){i['set'](l+'|'+String(m?.['forward']??''),{'who':m?.['who']?String(m['who'])['toLowerCase']():null,'accomplished':!!m?.['accomplished']});}}const j=[];for(const n of b){for(const o of n['pairs']){if(o['prev_node']!==h)continue;for(const p of o['forwards']){if(!p['name'])continue;const q=i['get'](n['name']+'|'+p['name']);if(q?.['accomplished'])continue;let r=c['filter'](t=>accountCanExecuteForward(p,t,d,e,g));q?.['who']&&(r=r['filter'](t=>t['toLowerCase']()===q['who'])),j['push']({'next_node':n['name'],'forward':p['name'],'weight':p['weight'],'threshold':o['threshold'],'guard':p['guard'],'operator_kind':forwardOperatorKind(p),'permission_index':p['permissionIndex']??undefined,'named_operator':typeof p['namedOperator']==='string'&&p['namedOperator']['length']>0x0?p['namedOperator']:undefined,'executable_accounts':r['map'](t=>t['toLowerCase']())});}}}return j;}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{objectTypeFromAddress,query_affiliations,query_objects,query_local_mark_list,query_table,queryTableItem_EntityRegistrar,queryTableItem_EntityLinker}from'@wowok/wowok';import{ObjectType}from'@wowok/wowok';import{fetchEntityPermission,fetchEntityContact,fetchObjectLinkerCore,fetchObjectLinkerTx,listLocalAccounts,resolveLocalNamesFor}from'./workflow-guidance.js';import{fetchMachineNodes}from'../playbooks/service-build/machine-nodes.js';const AGG_TTL_MS=0x1d4c0,AGG_CACHE_MAX=0x8,aggCache=new Map(),aggInflight=new Map(),CLASSIFIED_TYPES=new Set([ObjectType['Permission'],ObjectType['Service'],ObjectType['Machine'],ObjectType['Treasury'],ObjectType['Repository'],ObjectType['Reward'],ObjectType['Demand'],ObjectType['Arbitration'],ObjectType['Arb'],ObjectType['Contact'],ObjectType['Order'],ObjectType['Progress']]);function sortItems(a){return a['sort']((c,d)=>(d['time']??0x0)-(c['time']??0x0)||c['object']['localeCompare'](d['object']));}export async function buildWorkspaceLists(a){const b=a['network'],c=a['account']?.['trim']()['toLowerCase']()||undefined,d=a['no_cache']===!![],e=(b??'')+'|'+(c??'');if(!d){const g=aggCache['get'](e);if(g&&Date['now']()-g['at']<AGG_TTL_MS)return{...g['value'],'cached':!![]};const h=aggInflight['get'](e);if(h)return h;}const f=((async()=>{const i=c?[{'address':c,'name':undefined}]:await listLocalAccounts(),j={'action':'workspace_lists','network':b,'updated_at_ms':Date['now'](),'cached':![],'treasuries':[],'repositories':[],'contacts':[],'machines':[],'rewards':[],'others':[],'counts':{'treasuries':0x0,'repositories':0x0,'contacts':0x0,'machines':0x0,'rewards':0x0,'others':0x0},'note':i['length']===0x0?'No\x20local\x20accounts\x20found\x20—\x20create\x20or\x20import\x20an\x20account\x20first.':undefined};if(i['length']===0x0)return aggCache['set'](e,{'at':Date['now'](),'value':j}),j;const [k,l,n]=await Promise['all']([Promise['all'](i['map'](R=>fetchEntityPermission(R['address'],b,d))),Promise['all'](i['map'](R=>fetchEntityContact(R['address'],b,d))),Promise['all'](i['map'](R=>fetchObjectLinkerTx(R['address'],b,d)))]),p=[],q=new Set();for(const R of k){for(const S of R?.['items']??[]){!q['has'](S['permission'])&&(q['add'](S['permission']),p['push'](S['permission']));}}const s=await Promise['all'](p['map'](T=>fetchObjectLinkerCore(T,b,d))),v={'treasuries':new Map(),'repositories':new Map(),'contacts':new Map(),'machines':new Map(),'rewards':new Map()},w=(T,U,V)=>{const W=U['toLowerCase'](),X=T['get'](W);if(X===undefined||(V??0x0)>X)T['set'](W,V??0x0);};s['forEach'](T=>{for(const U of T?.['items']??[]){const V=objectTypeFromAddress(U['who']);if(V===ObjectType['Treasury'])w(v['treasuries'],U['who'],U['time']);else{if(V===ObjectType['Repository'])w(v['repositories'],U['who'],U['time']);else{if(V===ObjectType['Machine'])w(v['machines'],U['who'],U['time']);else{if(V===ObjectType['Reward'])w(v['rewards'],U['who'],U['time']);else{if(V===ObjectType['Contact'])w(v['contacts'],U['who'],U['time']);}}}}}});for(const T of l){for(const U of T?.['items']??[])w(v['contacts'],U['contact'],U['time']);}const x=new Map();for(const V of n){for(const W of V?.['items']??[]){const X=objectTypeFromAddress(W['who']);if(X&&CLASSIFIED_TYPES['has'](X))continue;w(x,W['who'],W['time']);}}const y=[...v['treasuries']['keys'](),...v['repositories']['keys'](),...v['contacts']['keys'](),...v['machines']['keys'](),...v['rewards']['keys'](),...x['keys']()],z=Y=>Y['startsWith']('0x00'),A=[],B=[];for(const Y of y){if(z(Y))B['push'](Y);else A['push'](Y);}const C=await resolveLocalNamesFor(y),D=new Map(),E=new Map(),F=new Map(),G=new Map(),H=new Map(),I=new Map(),J=new Map();try{const [Z,a0,a1,a2]=await Promise['all']([A['length']>0x0?query_objects({'objects':A,'no_cache':!![],'network':b}):Promise['resolve']({'objects':[]}),Promise['all'](B['map'](a8=>queryTableItem_EntityRegistrar({'address':a8,'no_cache':d,'network':b})['then'](a9=>({'addr':a8,'row':a9}))['catch'](()=>null))),query_local_mark_list(undefined),listLocalAccounts()]),a3=new Set((a2??[])['map'](a8=>String(a8?.['address']??'')['toLowerCase']())),a4=new Set((Z?.['objects']??[])['map'](a8=>String(a8?.['object']??a8?.['address']??'')['toLowerCase']())['filter'](Boolean));for(const a8 of a0){if(!a8)continue;a4['add'](a8['addr']['toLowerCase']());const a9=a8['row']?.['description']??a8['row']?.['info']?.['description'];if(typeof a9==='string'&&a9['trim']())D['set'](a8['addr']['toLowerCase'](),a9['trim']());}if(a4['size']>0x0){const aa=ab=>{for(const ac of[...ab['keys']()])if(!a4['has'](ac))ab['delete'](ac);};aa(v['treasuries']),aa(v['repositories']),aa(v['contacts']),aa(v['machines']),aa(v['rewards']),aa(x);}const a5=new Set([...v['treasuries']['keys'](),...v['repositories']['keys'](),...v['contacts']['keys'](),...v['machines']['keys'](),...v['rewards']['keys'](),...x['keys']()]);await Promise['all']([...a5]['map'](async ab=>{try{const ac=await queryTableItem_EntityLinker({'address':ab,'no_cache':d,'network':b}),ad=Array['isArray'](ac?.['votes'])?ac['votes']:[];ad['length']>0x0&&J['set'](ab,{'like':ad['filter'](ae=>ae&&ae['like'])['length'],'dislike':ad['filter'](ae=>ae&&ae['dislike'])['length'],'favor':ad['filter'](ae=>ae&&ae['favor'])['length'],'votes':ad['map'](ae=>({'who':ae?.['who']??null,'like':!!ae?.['like'],'dislike':!!ae?.['dislike'],'favor':!!ae?.['favor']}))});}catch{}}));for(const ab of Z?.['objects']??[]){const ac=String(ab?.['object']??ab?.['address']??'')['toLowerCase'](),ad=ab?.['description']??ab?.['data']?.['description'];ac&&typeof ad==='string'&&ad['trim']()&&D['set'](ac,ad['trim']());if(ac&&v['contacts']['has'](ac)){const ae=Array['isArray'](ab?.['ims'])?ab['ims']:[],af=typeof ab?.['location']==='string'?ab['location']['trim']():'';F['set'](ac,{...af?{'location':af}:{},'members_total':ae['length'],'members_mine':ae['filter'](ag=>a3['has'](String(ag?.['at']??'')['toLowerCase']()))['length']});}if(ac&&v['rewards']['has'](ac)){const ag=/<([0-9a-zA-Z_:]+)>\s*$/['exec'](String(ab?.['type_raw']??'')),ah=Array['isArray'](ab?.['guards'])?ab['guards']:[],ai=Number(ab?.['record_count']);I['set'](ac,{...ag?{'token':ag[0x1]['split']('::')['pop']()}:{},'guards_total':ah['length'],...Number['isFinite'](ai)?{'claimers':ai}:{},...ab?.['balance']!=null?{'balance_total':String(ab['balance'])}:{},...ab?.['type_raw']!=null?{'type_raw':String(ab['type_raw'])}:{}});}if(ac&&v['treasuries']['has'](ac)){const aj=/<([0-9a-zA-Z_:]+)>\s*$/['exec'](String(ab?.['type_raw']??'')),ak=al=>al===null||al===undefined||al===''?undefined:String(al);I['set'](ac,{...aj?{'token':aj[0x1]['split']('::')['pop']()}:{},...ab?.['balance']!=null?{'balance_total':String(ab['balance'])}:{},...ab?.['type_raw']!=null?{'type_raw':String(ab['type_raw'])}:{},...ab?.['inflow']!=null?{'inflow':ak(ab['inflow'])}:{},...ab?.['outflow']!=null?{'outflow':ak(ab['outflow'])}:{}});}if(ac&&v['repositories']['has'](ac)){const al=Number(ab?.['data_count']),am=Array['isArray'](ab?.['policies'])?ab['policies']:[],an=Array['isArray'](ab?.['rewards'])?ab['rewards']:[];G['set'](ac,{...Number['isFinite'](al)?{'records_total':al}:{},'policies_total':am['length'],'rewards_total':an['length']});}ac&&v['machines']['has'](ac)&&(ab?.['bPublished']!=null||ab?.['bPaused']!=null||ab?.['node_count']!=null)&&H['set'](ac,{'status':ab['bPublished']===!![]?ab['bPaused']===!![]?'PAUSED':'LIVE':'UNPUBLISHED',...Number['isFinite'](Number(ab?.['node_count']))?{'nodes':Number(ab['node_count'])}:{}});}for(const ao of a1??[]){const ap=String(ao?.['address']??'')['toLowerCase']();ap&&Array['isArray'](ao?.['tags'])&&ao['tags']['length']>0x0&&E['set'](ap,ao['tags']['map'](String));}await Promise['all']([...F['keys'](),...G['keys'](),...[...I['keys']()]['filter'](aq=>v['treasuries']['has'](aq)||v['rewards']['has'](aq))]['map'](async aq=>{try{const ar=await query_affiliations({'address':aq,'no_cache':d,'network':b}),as=new Set();let at=0x0;for(const av of ar?.['entries']??[]){const aw=String(av?.['who']??'')['toLowerCase']();if(!aw||aw==='0x0')continue;if(objectTypeFromAddress(aw)===undefined)continue;const ax=(av?.['table']??'')+':'+aw;if(as['has'](ax))continue;as['add'](ax),at++;}const au=F['get'](aq)??G['get'](aq)??(v['treasuries']['has'](aq)||v['rewards']['has'](aq)?I['get'](aq):undefined);if(au)au['related_objects']=at;}catch{}})),await Promise['all']([...v['machines']['keys']()]['map'](async aq=>{try{const [ar,as]=await Promise['all']([fetchMachineNodes(aq,b)['catch'](()=>undefined),fetchObjectLinkerTx(aq,b,d)]);if(!H['has'](aq))H['set'](aq,{});const at=H['get'](aq);if(ar){at['nodes']=ar['length'];let au=0x0;for(const av of ar){for(const aw of Array['isArray'](av?.['value'])?av['value']:[]){if(aw&&typeof aw==='object'&&aw['prev_node'])au++;}}at['edges']=au;}if(as){const ax=new Set();let ay=0x0,az=0x0;for(const aA of as['items']??[]){const aB=String(aA?.['who']??'')['toLowerCase']();if(!aB||aB==='0x0'||ax['has'](aB))continue;ax['add'](aB);if(objectTypeFromAddress(aB)===undefined)continue;ay++;if(objectTypeFromAddress(aB)===ObjectType['Progress'])az++;}at['related_objects']=ay,at['progresses']=az;}}catch{}}));const a6=0x12c,a7=0xc8;await Promise['all']([...G['keys']()]['map'](async aq=>{try{let ar=undefined,as=0x0;for(;;){const au=await query_table({'parent':aq,'cursor':ar,'limit':a7,'no_cache':d,'network':b});as+=Array['isArray'](au?.['items'])?au['items']['length']:0x0;if(!au?.['hasNextPage']||!au?.['nextCursor']||as>=a6)break;ar=String(au['nextCursor']);}const at=G['get'](aq);if(at)at['records_total']=Math['min'](as,a6);}catch(av){if(/query\.parent/i['test'](String(av?.['message']??av))){const aw=G['get'](aq);if(aw)aw['records_total']=0x0;}}}));}catch{}const K=aq=>sortItems([...aq['entries']()]['map'](([ar,as])=>({'object':ar,'object_type':objectTypeFromAddress(ar)??null,'name':C['byAddress']['get'](ar),'time':as||undefined,'description':D['get'](ar),'tags':E['get'](ar)}))),L=aq=>sortItems([...aq['entries']()]['map'](([ar,as])=>({'object':ar,'object_type':objectTypeFromAddress(ar)??null,'name':C['byAddress']['get'](ar),'time':as||undefined,'description':D['get'](ar),'tags':E['get'](ar),...F['get'](ar)??{}}))),M=aq=>sortItems([...aq['entries']()]['map'](([ar,as])=>({'object':ar,'object_type':objectTypeFromAddress(ar)??null,'name':C['byAddress']['get'](ar),'time':as||undefined,'description':D['get'](ar),'tags':E['get'](ar),...I['get'](ar)??{}}))),N=aq=>sortItems([...aq['entries']()]['map'](([ar,as])=>({'object':ar,'object_type':objectTypeFromAddress(ar)??null,'name':C['byAddress']['get'](ar),'time':as||undefined,'description':D['get'](ar),'tags':E['get'](ar),...I['get'](ar)??{}}))),O=aq=>sortItems([...aq['entries']()]['map'](([ar,as])=>({'object':ar,'object_type':objectTypeFromAddress(ar)??null,'name':C['byAddress']['get'](ar),'time':as||undefined,'description':D['get'](ar),'tags':E['get'](ar),...G['get'](ar)??{}}))),P=aq=>sortItems([...aq['entries']()]['map'](([ar,as])=>({'object':ar,'object_type':objectTypeFromAddress(ar)??null,'name':C['byAddress']['get'](ar),'time':as||undefined,'description':D['get'](ar),'tags':E['get'](ar),...H['get'](ar)??{}}))),Q={'action':'workspace_lists','network':b,'updated_at_ms':Date['now'](),'cached':![],'treasuries':N(v['treasuries']),'repositories':O(v['repositories']),'contacts':L(v['contacts']),'machines':P(v['machines']),'rewards':M(v['rewards']),'others':K(x),'counts':{'treasuries':v['treasuries']['size'],'repositories':v['repositories']['size'],'contacts':v['contacts']['size'],'machines':v['machines']['size'],'rewards':v['rewards']['size'],'others':x['size']}};for(const aq of[Q['treasuries'],Q['repositories'],Q['contacts'],Q['machines'],Q['rewards'],Q['others']]){for(const ar of aq){const as=J['get'](ar['object']);if(as)ar['rep']=as;}}aggCache['set'](e,{'at':Date['now'](),'value':Q});if(aggCache['size']>AGG_CACHE_MAX){const at=aggCache['keys']()['next']()['value'];if(at!==undefined)aggCache['delete'](at);}return Q;})());if(!d)aggInflight['set'](e,f);try{return await f;}finally{if(!d)aggInflight['delete'](e);}}
|
|
1
|
+
import{objectTypeFromAddress,query_affiliations,query_local_mark_list,query_table}from'@wowok/wowok';import{ObjectType}from'@wowok/wowok';import{batchFetchEntityLinker,batchFetchEntityRegistrar,batchQueryObjectsByIds,fetchEntityPermission,fetchEntityContact,fetchObjectLinkerCore,fetchObjectLinkerTx,listLocalAccounts,resolveLocalNamesFor}from'./workflow-guidance.js';import{fetchMachineNodes}from'../playbooks/service-build/machine-nodes.js';const AGG_TTL_MS=0x1d4c0,AGG_CACHE_MAX=0x8,aggCache=new Map(),aggInflight=new Map(),CLASSIFIED_TYPES=new Set([ObjectType['Permission'],ObjectType['Service'],ObjectType['Machine'],ObjectType['Treasury'],ObjectType['Repository'],ObjectType['Reward'],ObjectType['Demand'],ObjectType['Arbitration'],ObjectType['Arb'],ObjectType['Contact'],ObjectType['Order'],ObjectType['Progress']]);function sortItems(a){return a['sort']((c,d)=>(d['time']??0x0)-(c['time']??0x0)||c['object']['localeCompare'](d['object']));}export async function buildWorkspaceLists(a){const b=a['network'],c=a['account']?.['trim']()['toLowerCase']()||undefined,d=a['no_cache']===!![],e=(b??'')+'|'+(c??'');if(!d){const g=aggCache['get'](e);if(g&&Date['now']()-g['at']<AGG_TTL_MS)return{...g['value'],'cached':!![]};const h=aggInflight['get'](e);if(h)return h;}const f=((async()=>{const i=c?[{'address':c,'name':undefined}]:await listLocalAccounts(),j={'action':'workspace_lists','network':b,'updated_at_ms':Date['now'](),'cached':![],'treasuries':[],'repositories':[],'contacts':[],'machines':[],'rewards':[],'others':[],'counts':{'treasuries':0x0,'repositories':0x0,'contacts':0x0,'machines':0x0,'rewards':0x0,'others':0x0},'note':i['length']===0x0?'No\x20local\x20accounts\x20found\x20—\x20create\x20or\x20import\x20an\x20account\x20first.':undefined};if(i['length']===0x0)return aggCache['set'](e,{'at':Date['now'](),'value':j}),j;const [k,l,n]=await Promise['all']([Promise['all'](i['map'](Q=>fetchEntityPermission(Q['address'],b,d))),Promise['all'](i['map'](Q=>fetchEntityContact(Q['address'],b,d))),Promise['all'](i['map'](Q=>fetchObjectLinkerTx(Q['address'],b,d)))]),p=[],q=new Set();for(const Q of k){for(const R of Q?.['items']??[]){!q['has'](R['permission'])&&(q['add'](R['permission']),p['push'](R['permission']));}}const s=await Promise['all'](p['map'](S=>fetchObjectLinkerCore(S,b,d))),u={'treasuries':new Map(),'repositories':new Map(),'contacts':new Map(),'machines':new Map(),'rewards':new Map()},v=(S,T,U)=>{const V=T['toLowerCase'](),W=S['get'](V);if(W===undefined||(U??0x0)>W)S['set'](V,U??0x0);};s['forEach'](S=>{for(const T of S?.['items']??[]){const U=objectTypeFromAddress(T['who']);if(U===ObjectType['Treasury'])v(u['treasuries'],T['who'],T['time']);else{if(U===ObjectType['Repository'])v(u['repositories'],T['who'],T['time']);else{if(U===ObjectType['Machine'])v(u['machines'],T['who'],T['time']);else{if(U===ObjectType['Reward'])v(u['rewards'],T['who'],T['time']);else{if(U===ObjectType['Contact'])v(u['contacts'],T['who'],T['time']);}}}}}});for(const S of l){for(const T of S?.['items']??[])v(u['contacts'],T['contact'],T['time']);}const w=new Map();for(const U of n){for(const V of U?.['items']??[]){const W=objectTypeFromAddress(V['who']);if(W&&CLASSIFIED_TYPES['has'](W))continue;v(w,V['who'],V['time']);}}const x=[...u['treasuries']['keys'](),...u['repositories']['keys'](),...u['contacts']['keys'](),...u['machines']['keys'](),...u['rewards']['keys'](),...w['keys']()],y=X=>X['startsWith']('0x00'),z=[],A=[];for(const X of x){if(y(X))A['push'](X);else z['push'](X);}const B=await resolveLocalNamesFor(x);if(a['light']){const Y=a0=>sortItems([...a0['entries']()]['map'](([a1,a2])=>({'object':a1,'object_type':objectTypeFromAddress(a1)??null,'name':B['byAddress']['get'](a1),'time':a2||undefined}))),Z={'treasuries':u['treasuries']['size'],'repositories':u['repositories']['size'],'contacts':u['contacts']['size'],'machines':u['machines']['size'],'rewards':u['rewards']['size'],'others':w['size']};return{'action':'workspace_lists','network':b,'updated_at_ms':Date['now'](),'cached':![],'treasuries':Y(u['treasuries']),'repositories':Y(u['repositories']),'contacts':Y(u['contacts']),'machines':Y(u['machines']),'rewards':Y(u['rewards']),'others':Y(w),'counts':Z,'note':i['length']===0x0?'No\x20local\x20accounts\x20found\x20—\x20create\x20or\x20import\x20an\x20account\x20first.':undefined};}const C=new Map(),D=new Map(),E=new Map(),F=new Map(),G=new Map(),H=new Map(),I=new Map();try{const [a0,a1,a2,a3]=await Promise['all']([z['length']>0x0?batchQueryObjectsByIds(z,b,d)['then'](a9=>({'objects':a9})):Promise['resolve']({'objects':[]}),batchFetchEntityRegistrar(A,b,d),query_local_mark_list(undefined),listLocalAccounts()]),a4=new Set((a3??[])['map'](a9=>String(a9?.['address']??'')['toLowerCase']())),a5=new Set((a0?.['objects']??[])['map'](a9=>String(a9?.['object']??a9?.['address']??'')['toLowerCase']())['filter'](Boolean));for(const [a9,aa]of a1){a5['add'](a9);const ab=aa?.['description']??aa?.['info']?.['description'];if(typeof ab==='string'&&ab['trim']())C['set'](a9,ab['trim']());}if(a5['size']>0x0){const ac=ad=>{for(const ae of[...ad['keys']()])if(!a5['has'](ae))ad['delete'](ae);};ac(u['treasuries']),ac(u['repositories']),ac(u['contacts']),ac(u['machines']),ac(u['rewards']),ac(w);}const a6=new Set([...u['treasuries']['keys'](),...u['repositories']['keys'](),...u['contacts']['keys'](),...u['machines']['keys'](),...u['rewards']['keys'](),...w['keys']()]);try{const ad=await batchFetchEntityLinker([...a6],b,d);for(const [ae,af]of ad){const ag=Array['isArray'](af?.['votes'])?af['votes']:[];if(ag['length']===0x0)continue;I['set'](ae,{'like':ag['filter'](ah=>ah&&ah['like'])['length'],'dislike':ag['filter'](ah=>ah&&ah['dislike'])['length'],'favor':ag['filter'](ah=>ah&&ah['favor'])['length'],'votes':ag['map'](ah=>({'who':ah?.['who']??null,'like':!!ah?.['like'],'dislike':!!ah?.['dislike'],'favor':!!ah?.['favor']}))});}}catch{}for(const ah of a0?.['objects']??[]){const ai=String(ah?.['object']??ah?.['address']??'')['toLowerCase'](),aj=ah?.['description']??ah?.['data']?.['description'];ai&&typeof aj==='string'&&aj['trim']()&&C['set'](ai,aj['trim']());if(ai&&u['contacts']['has'](ai)){const ak=Array['isArray'](ah?.['ims'])?ah['ims']:[],al=typeof ah?.['location']==='string'?ah['location']['trim']():'';E['set'](ai,{...al?{'location':al}:{},'members_total':ak['length'],'members_mine':ak['filter'](am=>a4['has'](String(am?.['at']??'')['toLowerCase']()))['length']});}if(ai&&u['rewards']['has'](ai)){const am=/<([0-9a-zA-Z_:]+)>\s*$/['exec'](String(ah?.['type_raw']??'')),an=Array['isArray'](ah?.['guards'])?ah['guards']:[],ao=Number(ah?.['record_count']);H['set'](ai,{...am?{'token':am[0x1]['split']('::')['pop']()}:{},'guards_total':an['length'],...Number['isFinite'](ao)?{'claimers':ao}:{},...ah?.['balance']!=null?{'balance_total':String(ah['balance'])}:{},...ah?.['type_raw']!=null?{'type_raw':String(ah['type_raw'])}:{}});}if(ai&&u['treasuries']['has'](ai)){const ap=/<([0-9a-zA-Z_:]+)>\s*$/['exec'](String(ah?.['type_raw']??'')),aq=ar=>ar===null||ar===undefined||ar===''?undefined:String(ar);H['set'](ai,{...ap?{'token':ap[0x1]['split']('::')['pop']()}:{},...ah?.['balance']!=null?{'balance_total':String(ah['balance'])}:{},...ah?.['type_raw']!=null?{'type_raw':String(ah['type_raw'])}:{},...ah?.['inflow']!=null?{'inflow':aq(ah['inflow'])}:{},...ah?.['outflow']!=null?{'outflow':aq(ah['outflow'])}:{}});}if(ai&&u['repositories']['has'](ai)){const ar=Number(ah?.['data_count']),as=Array['isArray'](ah?.['policies'])?ah['policies']:[],at=Array['isArray'](ah?.['rewards'])?ah['rewards']:[];F['set'](ai,{...Number['isFinite'](ar)?{'records_total':ar}:{},'policies_total':as['length'],'rewards_total':at['length']});}ai&&u['machines']['has'](ai)&&(ah?.['bPublished']!=null||ah?.['bPaused']!=null||ah?.['node_count']!=null)&&G['set'](ai,{'status':ah['bPublished']===!![]?ah['bPaused']===!![]?'PAUSED':'LIVE':'UNPUBLISHED',...Number['isFinite'](Number(ah?.['node_count']))?{'nodes':Number(ah['node_count'])}:{}});}for(const au of a2??[]){const av=String(au?.['address']??'')['toLowerCase']();av&&Array['isArray'](au?.['tags'])&&au['tags']['length']>0x0&&D['set'](av,au['tags']['map'](String));}await Promise['all']([...E['keys'](),...F['keys'](),...[...H['keys']()]['filter'](aw=>u['treasuries']['has'](aw)||u['rewards']['has'](aw))]['map'](async aw=>{try{const ax=await query_affiliations({'address':aw,'no_cache':d,'network':b}),ay=new Set();let az=0x0;for(const aB of ax?.['entries']??[]){const aC=String(aB?.['who']??'')['toLowerCase']();if(!aC||aC==='0x0')continue;if(objectTypeFromAddress(aC)===undefined)continue;const aD=(aB?.['table']??'')+':'+aC;if(ay['has'](aD))continue;ay['add'](aD),az++;}const aA=E['get'](aw)??F['get'](aw)??(u['treasuries']['has'](aw)||u['rewards']['has'](aw)?H['get'](aw):undefined);if(aA)aA['related_objects']=az;}catch{}})),await Promise['all']([...u['machines']['keys']()]['map'](async aw=>{try{const [ax,ay]=await Promise['all']([fetchMachineNodes(aw,b)['catch'](()=>undefined),fetchObjectLinkerTx(aw,b,d)]);if(!G['has'](aw))G['set'](aw,{});const az=G['get'](aw);if(ax){az['nodes']=ax['length'];let aA=0x0;for(const aB of ax){for(const aC of Array['isArray'](aB?.['value'])?aB['value']:[]){if(aC&&typeof aC==='object'&&aC['prev_node'])aA++;}}az['edges']=aA;}if(ay){const aD=new Set();let aE=0x0,aF=0x0;for(const aG of ay['items']??[]){const aH=String(aG?.['who']??'')['toLowerCase']();if(!aH||aH==='0x0'||aD['has'](aH))continue;aD['add'](aH);if(objectTypeFromAddress(aH)===undefined)continue;aE++;if(objectTypeFromAddress(aH)===ObjectType['Progress'])aF++;}az['related_objects']=aE,az['progresses']=aF;}}catch{}}));const a7=0x12c,a8=0xc8;await Promise['all']([...F['keys']()]['map'](async aw=>{try{let ax=undefined,ay=0x0;for(;;){const aA=await query_table({'parent':aw,'cursor':ax,'limit':a8,'no_cache':d,'network':b});ay+=Array['isArray'](aA?.['items'])?aA['items']['length']:0x0;if(!aA?.['hasNextPage']||!aA?.['nextCursor']||ay>=a7)break;ax=String(aA['nextCursor']);}const az=F['get'](aw);if(az)az['records_total']=Math['min'](ay,a7);}catch(aB){if(/query\.parent/i['test'](String(aB?.['message']??aB))){const aC=F['get'](aw);if(aC)aC['records_total']=0x0;}}}));}catch{}const J=aw=>sortItems([...aw['entries']()]['map'](([ax,ay])=>({'object':ax,'object_type':objectTypeFromAddress(ax)??null,'name':B['byAddress']['get'](ax),'time':ay||undefined,'description':C['get'](ax),'tags':D['get'](ax)}))),K=aw=>sortItems([...aw['entries']()]['map'](([ax,ay])=>({'object':ax,'object_type':objectTypeFromAddress(ax)??null,'name':B['byAddress']['get'](ax),'time':ay||undefined,'description':C['get'](ax),'tags':D['get'](ax),...E['get'](ax)??{}}))),L=aw=>sortItems([...aw['entries']()]['map'](([ax,ay])=>({'object':ax,'object_type':objectTypeFromAddress(ax)??null,'name':B['byAddress']['get'](ax),'time':ay||undefined,'description':C['get'](ax),'tags':D['get'](ax),...H['get'](ax)??{}}))),M=aw=>sortItems([...aw['entries']()]['map'](([ax,ay])=>({'object':ax,'object_type':objectTypeFromAddress(ax)??null,'name':B['byAddress']['get'](ax),'time':ay||undefined,'description':C['get'](ax),'tags':D['get'](ax),...H['get'](ax)??{}}))),N=aw=>sortItems([...aw['entries']()]['map'](([ax,ay])=>({'object':ax,'object_type':objectTypeFromAddress(ax)??null,'name':B['byAddress']['get'](ax),'time':ay||undefined,'description':C['get'](ax),'tags':D['get'](ax),...F['get'](ax)??{}}))),O=aw=>sortItems([...aw['entries']()]['map'](([ax,ay])=>({'object':ax,'object_type':objectTypeFromAddress(ax)??null,'name':B['byAddress']['get'](ax),'time':ay||undefined,'description':C['get'](ax),'tags':D['get'](ax),...G['get'](ax)??{}}))),P={'action':'workspace_lists','network':b,'updated_at_ms':Date['now'](),'cached':![],'treasuries':M(u['treasuries']),'repositories':N(u['repositories']),'contacts':K(u['contacts']),'machines':O(u['machines']),'rewards':L(u['rewards']),'others':J(w),'counts':{'treasuries':u['treasuries']['size'],'repositories':u['repositories']['size'],'contacts':u['contacts']['size'],'machines':u['machines']['size'],'rewards':u['rewards']['size'],'others':w['size']}};for(const aw of[P['treasuries'],P['repositories'],P['contacts'],P['machines'],P['rewards'],P['others']]){for(const ax of aw){const ay=I['get'](ax['object']);if(ay)ax['rep']=ay;}}aggCache['set'](e,{'at':Date['now'](),'value':P});if(aggCache['size']>AGG_CACHE_MAX){const az=aggCache['keys']()['next']()['value'];if(az!==undefined)aggCache['delete'](az);}return P;})());if(!d)aggInflight['set'](e,f);try{return await f;}finally{if(!d)aggInflight['delete'](e);}}
|
|
@@ -4,6 +4,7 @@ import { SubscriptionStore } from "./SubscriptionStore.js";
|
|
|
4
4
|
import { type ResolveScopeResult } from "./ScopeResolver.js";
|
|
5
5
|
import { annotateBatch } from "./EventRouter.js";
|
|
6
6
|
import { type ProblemBridgeInput } from "./ProblemBridge.js";
|
|
7
|
+
import { type SuggestionBridgeInput } from "./SuggestionBridge.js";
|
|
7
8
|
import { type ScopeSnapshot, type SubscriptionConfig } from "./types.js";
|
|
8
9
|
export interface MonitorLoopStatus {
|
|
9
10
|
running: boolean;
|
|
@@ -56,6 +57,8 @@ export interface MonitorLoopDeps {
|
|
|
56
57
|
bootId: string;
|
|
57
58
|
logger(message: string): void;
|
|
58
59
|
openProblems?(input: ProblemBridgeInput): Promise<number>;
|
|
60
|
+
openSuggestions?(input: SuggestionBridgeInput): Promise<number>;
|
|
61
|
+
runKeeperScan?(network: string, scope: ScopeSnapshot): Promise<unknown>;
|
|
59
62
|
setTimer(cb: () => void, ms: number): unknown;
|
|
60
63
|
clearTimer(handle: unknown): void;
|
|
61
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{randomUUID}from'node:crypto';import{Config,SQLiteStorage}from'@wowok/wowok/w/local';import{query_events}from'@wowok/wowok';import{monitorEventStore}from'./EventStore.js';import{subscriptionStore}from'./SubscriptionStore.js';import{loadScopeSnapshot,resolveScope}from'./ScopeResolver.js';import{annotateBatch,backfillAnnotations}from'./EventRouter.js';import{bridgeMonitorProblems}from'./ProblemBridge.js';import{EVENT_MODULE_OF,MONITOR_CAPTURE_TYPES,PAYMENT_EVENT_TYPE,normalizeMonitorEvent}from'./normalize.js';import{LOOP_DEFAULTS}from'./types.js';import{goalStore}from'../goal/GoalStore.js';import{addProblem,listProblems}from'../task/ProcessStore.js';const LEASE_PREFIX='mon_lease:v4:',SEED_PAGE=0x64,SEED_MAX=0x7d0,POLL_BATCH=0x32,MAX_BACKOFF_MS=0x493e0;function netKey(a){return(a||'default')['replace'](/[^a-zA-Z0-9_-]/g,'_');}function leaseKey(a){return''+LEASE_PREFIX+netKey(a);}function realDeps(){return{'store':monitorEventStore,'configStore':subscriptionStore,'storage':new SQLiteStorage(),'resolveScope':(a,b)=>resolveScope(a,b),'loadScope':a=>loadScopeSnapshot(a),'router':{'annotateBatch':annotateBatch,'backfillAnnotations':backfillAnnotations},'queryEvents':a=>query_events({'type':a['type'],'cursor':a['cursor'],'limit':a['limit'],'order':a['order'],'network':a['network']}),'defaultNetwork':()=>Config['Instance']()['network_get'](),'now':()=>Date['now'](),'pid':process['pid'],'bootId':randomUUID(),'logger':a=>console['error']('[monitor]\x20'+a),'openProblems':a=>bridgeMonitorProblems(a,{'getGoal':(b,c)=>goalStore['get'](b,c),'addProblem':addProblem,'listProblems':listProblems,'logger':b=>console['error']('[monitor]\x20'+b)}),'setTimer':(a,b)=>setTimeout(a,b),'clearTimer':a=>clearTimeout(a)};}function newRuntime(a){return{'network':a,'started':![],'holdsLease':![],'leaseHolder':null,'timer':undefined,'ticking':![],'scope':undefined,'lastScopeRefreshAt':0x0,'pollIntervalMs':LOOP_DEFAULTS['poll_interval_ms'],'lastTickAt':0x0,'lastNewCount':0x0,'lastSummary':undefined,'consecutiveErrors':0x0,'backoffMs':0x0};}export class MonitorLoop{['deps'];['runtimes']=new Map();constructor(a){this['deps']={...realDeps(),...a??{}};}async['start'](a){let b=a&&a['length']>0x0?a:undefined;if(!b)b=[await this['deps']['defaultNetwork']()];for(const c of b){const d=netKey(c);if(this['runtimes']['has'](d)){const f=this['runtimes']['get'](d);if(f['started'])continue;f['started']=!![],this['schedule'](f,0x0);continue;}const e=newRuntime(c);e['started']=!![],this['runtimes']['set'](d,e);try{const g=await this['deps']['loadScope'](c);g&&(e['scope']=g,e['lastScopeRefreshAt']=Number(g['resolved_at'])||0x0);}catch{}this['schedule'](e,0x0);}return b;}async['stop'](a){const b=a?[netKey(a)]:[...this['runtimes']['keys']()];for(const c of b){const d=this['runtimes']['get'](c);if(!d)continue;d['started']=![];d['timer']!==undefined&&(this['deps']['clearTimer'](d['timer']),d['timer']=undefined);if(d['holdsLease']){d['holdsLease']=![];try{await this['deps']['storage']['del'](leaseKey(d['network']));}catch{}}this['runtimes']['delete'](c);}}['status'](a){const b=a?this['runtimes']['get'](netKey(a)):[...this['runtimes']['values']()][0x0];if(!b)return{'running':![],'lease_holder':null,'last_tick_at':0x0,'last_new_count':0x0,'scope_version':0x0,'backoff_ms':0x0};return{'running':b['started']&&b['holdsLease'],'lease_holder':b['leaseHolder']?b['leaseHolder']['pid']+':'+b['leaseHolder']['boot_id']:null,'last_tick_at':b['lastTickAt'],'last_new_count':b['lastNewCount'],'scope_version':b['scope']?.['version']??0x0,'backoff_ms':b['backoffMs'],...b['lastSummary']?{'last_tick':b['lastSummary']}:{}};}['kick'](a){const b=this['runtimes']['get'](netKey(a));if(!b||!b['started']||!b['holdsLease']||b['ticking'])return;if(this['deps']['now']()-b['lastTickAt']<b['pollIntervalMs'])return;void this['tick'](b['network']);}['invalidateScope'](a){const b=this['runtimes']['get'](netKey(a));if(!b)return;b['scope']=undefined,b['lastScopeRefreshAt']=0x0;}async['tick'](a){const b=netKey(a);let c=this['runtimes']['get'](b);!c&&(c=newRuntime(a),this['runtimes']['set'](b,c));if(c['ticking'])return undefined;c['ticking']=!![];const d=this['deps']['now']();try{const f=await this['deps']['configStore']['getConfig'](a),g=Number(f['loop']?.['poll_interval_ms'])||LOOP_DEFAULTS['poll_interval_ms'];c['pollIntervalMs']=g;const h=await this['acquireLease'](c,g);if(!h)return undefined;const {newCount:i,events:j}=await this['capture'](c,f),k=await this['getScope'](c,f);let l=0x0,m=[];if(i>0x0&&j['length']>0x0){const p=this['deps']['router']['annotateBatch'](j,k,f)['filter'](q=>q['rules']['length']>0x0||q['focus_hit']||q['matched_filters']['length']>0x0);p['length']>0x0&&(await this['deps']['store']['saveAnnotations'](a,p),l=p['length'],m=p);}if(m['length']>0x0&&this['deps']['openProblems'])try{await this['deps']['openProblems']({'network':a,'events':j,'annotations':m,'scope':k});}catch(q){this['deps']['logger']('monitor\x20loop:\x20problem\x20bridge\x20error\x20on\x20'+a+':\x20'+String(q?.['message']??q));}const n=Number(f['loop']?.['scope_refresh_ms'])||LOOP_DEFAULTS['scope_refresh_ms'];if(this['deps']['now']()-c['lastScopeRefreshAt']>=n){c['lastScopeRefreshAt']=this['deps']['now']();const {snapshot:s,changed:t}=await this['deps']['resolveScope'](a,f);c['scope']=s;if(t){const u=Number(f['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']),v=await this['deps']['router']['backfillAnnotations'](a,this['deps']['store'],s,u,f);this['deps']['logger']('monitor\x20loop:\x20scope\x20v'+s['version']+'\x20on\x20'+a+'\x20changed\x20—\x20backfill\x20rescanned\x20'+v['rescanned']+',\x20updated\x20'+v['updated']);}}c['lastTickAt']=this['deps']['now'](),c['lastNewCount']=i,c['consecutiveErrors']=0x0,c['backoffMs']=0x0;const o={'captured':j['length'],'annotated':l,'duration_ms':this['deps']['now']()-d};return c['lastSummary']=o,o;}catch(w){const x=String(w?.['message']??w);return this['deps']['logger']('monitor\x20loop:\x20tick\x20error\x20on\x20'+a+':\x20'+x),c['consecutiveErrors']+=0x1,c['backoffMs']=Math['min'](c['pollIntervalMs']*0x2**c['consecutiveErrors'],MAX_BACKOFF_MS),undefined;}finally{c['ticking']=![],c['started']&&this['schedule'](c,c['backoffMs']>0x0?c['backoffMs']:c['pollIntervalMs']);}}['schedule'](a,b){if(a['timer']!==undefined)this['deps']['clearTimer'](a['timer']);const c=this['deps']['setTimer'](()=>{a['timer']=undefined,void this['tick'](a['network']);},Math['max'](0x0,b));c?.['unref']?.(),a['timer']=c;}async['acquireLease'](a,b){const c=leaseKey(a['network']),d=this['deps']['now']();let e;try{const i=await this['deps']['storage']['get'](c);e=i?JSON['parse'](i):undefined;}catch{e=undefined;}const f={'pid':this['deps']['pid'],'boot_id':this['deps']['bootId']},g=!!e&&e['boot_id']===f['boot_id']&&e['pid']===f['pid'],h=!e||d-Number(e['heartbeat_at']??0x0)>0x2*b;if(g||h)return await this['deps']['storage']['put'](c,JSON['stringify']({...f,'heartbeat_at':d})),a['holdsLease']=!![],a['leaseHolder']=f,!![];return a['holdsLease']=![],a['leaseHolder']={'pid':e['pid'],'boot_id':e['boot_id']},![];}async['getScope'](a,b){if(!a['scope'])try{const c=await this['deps']['loadScope'](a['network']);c&&(a['scope']=c,a['lastScopeRefreshAt']=Number(c['resolved_at'])||0x0);}catch{}if(!a['scope']){a['lastScopeRefreshAt']=this['deps']['now']();const {snapshot:d,changed:e}=await this['deps']['resolveScope'](a['network'],b);a['scope']=d;if(e){const f=Number(b['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']);await this['deps']['router']['backfillAnnotations'](a['network'],this['deps']['store'],d,f,b);}}return a['scope'];}async['capture'](a,b){const c=a['network'],d=await this['deps']['store']['getCursors'](c);let f=0x0;const g=[],h=[...MONITOR_CAPTURE_TYPES];if(b['events']?.[PAYMENT_EVENT_TYPE]===!![])h['push'](PAYMENT_EVENT_TYPE);for(const i of h){const j=EVENT_MODULE_OF[i];if(!j)continue;try{const k=d['cursors'][i];let l=null;if(!k){let m=null,n=0x0;while(n<SEED_MAX){const o=await this['deps']['queryEvents']({'type':i,'cursor':m,'limit':Math['min'](SEED_PAGE,SEED_MAX-n),'order':'descending','network':c}),p=(o?.['data']??[])['map'](q=>normalizeMonitorEvent(q));if(p['length']===0x0)break;if(l===null)l=p[0x0];n+=p['length'],f+=await this['deps']['store']['insert'](c,j,p),g['push'](...p);if(!o?.['hasNextPage']||!o?.['nextCursor'])break;m=o['nextCursor'];}}else{const q=await this['deps']['queryEvents']({'type':i,'cursor':k,'limit':POLL_BATCH,'order':'ascending','network':c}),r=(q?.['data']??[])['map'](s=>normalizeMonitorEvent(s));f+=await this['deps']['store']['insert'](c,j,r),g['push'](...r);if(r['length']>0x0)l=r[r['length']-0x1];}if(l?.['id']){const s=d['cursors'][i];(!s||BigInt(l['id']['eventSeq'])>BigInt(s['eventSeq']||'0'))&&(d['cursors'][i]={'eventSeq':String(l['id']['eventSeq']),'txDigest':String(l['id']['txDigest'])});}}catch(t){const u=String(t?.['message']??t);this['deps']['logger']('monitor\x20loop:\x20type\x20'+i+'\x20poll\x20error:\x20'+u),/referenced transaction/i['test'](u)&&(delete d['cursors'][i],this['deps']['logger']('monitor\x20loop:\x20type\x20'+i+'\x20cursor\x20invalid\x20—\x20dropped,\x20will\x20re-seed\x20next\x20cycle'));}}return await this['deps']['store']['saveCursors'](c,d['cursors'],this['deps']['now']()),{'newCount':f,'events':g};}}export const monitorLoop=new MonitorLoop();
|
|
1
|
+
import{randomUUID}from'node:crypto';import{Config,SQLiteStorage}from'@wowok/wowok/w/local';import{query_events}from'@wowok/wowok';import{monitorEventStore}from'./EventStore.js';import{subscriptionStore}from'./SubscriptionStore.js';import{loadScopeSnapshot,resolveScope}from'./ScopeResolver.js';import{annotateBatch,backfillAnnotations}from'./EventRouter.js';import{bridgeMonitorProblems}from'./ProblemBridge.js';import{bridgeMonitorSuggestions}from'./SuggestionBridge.js';import{EVENT_MODULE_OF,MONITOR_CAPTURE_TYPES,PAYMENT_EVENT_TYPE,normalizeMonitorEvent}from'./normalize.js';import{LOOP_DEFAULTS}from'./types.js';import{goalStore}from'../goal/GoalStore.js';import{runKeeperScan as a259a,realKeeperScanDeps}from'../keeper/KeeperScan.js';import{addProblem,addSuggestion,listProblems,listSuggestions}from'../task/ProcessStore.js';const LEASE_PREFIX='mon_lease:v4:',SEED_PAGE=0x64,SEED_MAX=0x7d0,POLL_BATCH=0x32,MAX_BACKOFF_MS=0x493e0;function netKey(a){return(a||'default')['replace'](/[^a-zA-Z0-9_-]/g,'_');}function leaseKey(a){return''+LEASE_PREFIX+netKey(a);}function realDeps(){return{'store':monitorEventStore,'configStore':subscriptionStore,'storage':new SQLiteStorage(),'resolveScope':(a,b)=>resolveScope(a,b),'loadScope':a=>loadScopeSnapshot(a),'router':{'annotateBatch':annotateBatch,'backfillAnnotations':backfillAnnotations},'queryEvents':a=>query_events({'type':a['type'],'cursor':a['cursor'],'limit':a['limit'],'order':a['order'],'network':a['network']}),'defaultNetwork':()=>Config['Instance']()['network_get'](),'now':()=>Date['now'](),'pid':process['pid'],'bootId':randomUUID(),'logger':a=>console['error']('[monitor]\x20'+a),'openProblems':a=>bridgeMonitorProblems(a,{'getGoal':(b,c)=>goalStore['get'](b,c),'addProblem':addProblem,'listProblems':listProblems,'logger':b=>console['error']('[monitor]\x20'+b)}),'openSuggestions':a=>bridgeMonitorSuggestions(a,{'getGoal':(b,c)=>goalStore['get'](b,c),'addSuggestion':addSuggestion,'listSuggestions':listSuggestions,'logger':b=>console['error']('[monitor]\x20'+b)}),'runKeeperScan':(a,b)=>a259a(a,b,realKeeperScanDeps()),'setTimer':(a,b)=>setTimeout(a,b),'clearTimer':a=>clearTimeout(a)};}function newRuntime(a){return{'network':a,'started':![],'holdsLease':![],'leaseHolder':null,'timer':undefined,'ticking':![],'scope':undefined,'lastScopeRefreshAt':0x0,'pollIntervalMs':LOOP_DEFAULTS['poll_interval_ms'],'lastTickAt':0x0,'lastNewCount':0x0,'lastSummary':undefined,'consecutiveErrors':0x0,'backoffMs':0x0};}export class MonitorLoop{['deps'];['runtimes']=new Map();constructor(a){this['deps']={...realDeps(),...a??{}};}async['start'](a){let b=a&&a['length']>0x0?a:undefined;if(!b)b=[await this['deps']['defaultNetwork']()];for(const c of b){const d=netKey(c);if(this['runtimes']['has'](d)){const f=this['runtimes']['get'](d);if(f['started'])continue;f['started']=!![],this['schedule'](f,0x0);continue;}const e=newRuntime(c);e['started']=!![],this['runtimes']['set'](d,e);try{const g=await this['deps']['loadScope'](c);g&&(e['scope']=g,e['lastScopeRefreshAt']=Number(g['resolved_at'])||0x0);}catch{}this['schedule'](e,0x0);}return b;}async['stop'](a){const b=a?[netKey(a)]:[...this['runtimes']['keys']()];for(const c of b){const d=this['runtimes']['get'](c);if(!d)continue;d['started']=![];d['timer']!==undefined&&(this['deps']['clearTimer'](d['timer']),d['timer']=undefined);if(d['holdsLease']){d['holdsLease']=![];try{await this['deps']['storage']['del'](leaseKey(d['network']));}catch{}}this['runtimes']['delete'](c);}}['status'](a){const b=a?this['runtimes']['get'](netKey(a)):[...this['runtimes']['values']()][0x0];if(!b)return{'running':![],'lease_holder':null,'last_tick_at':0x0,'last_new_count':0x0,'scope_version':0x0,'backoff_ms':0x0};return{'running':b['started']&&b['holdsLease'],'lease_holder':b['leaseHolder']?b['leaseHolder']['pid']+':'+b['leaseHolder']['boot_id']:null,'last_tick_at':b['lastTickAt'],'last_new_count':b['lastNewCount'],'scope_version':b['scope']?.['version']??0x0,'backoff_ms':b['backoffMs'],...b['lastSummary']?{'last_tick':b['lastSummary']}:{}};}['kick'](a){const b=this['runtimes']['get'](netKey(a));if(!b||!b['started']||!b['holdsLease']||b['ticking'])return;if(this['deps']['now']()-b['lastTickAt']<b['pollIntervalMs'])return;void this['tick'](b['network']);}['invalidateScope'](a){const b=this['runtimes']['get'](netKey(a));if(!b)return;b['scope']=undefined,b['lastScopeRefreshAt']=0x0;}async['tick'](a){const b=netKey(a);let c=this['runtimes']['get'](b);!c&&(c=newRuntime(a),this['runtimes']['set'](b,c));if(c['ticking'])return undefined;c['ticking']=!![];const d=this['deps']['now']();try{const f=await this['deps']['configStore']['getConfig'](a),g=Number(f['loop']?.['poll_interval_ms'])||LOOP_DEFAULTS['poll_interval_ms'];c['pollIntervalMs']=g;const h=await this['acquireLease'](c,g);if(!h)return undefined;const {newCount:i,events:j}=await this['capture'](c,f),k=await this['getScope'](c,f);let l=0x0,m=[];if(i>0x0&&j['length']>0x0){const p=this['deps']['router']['annotateBatch'](j,k,f)['filter'](q=>q['rules']['length']>0x0||q['focus_hit']||q['matched_filters']['length']>0x0);p['length']>0x0&&(await this['deps']['store']['saveAnnotations'](a,p),l=p['length'],m=p);}if(m['length']>0x0&&this['deps']['openProblems'])try{await this['deps']['openProblems']({'network':a,'events':j,'annotations':m,'scope':k});}catch(q){this['deps']['logger']('monitor\x20loop:\x20problem\x20bridge\x20error\x20on\x20'+a+':\x20'+String(q?.['message']??q));}if(m['length']>0x0&&this['deps']['openSuggestions'])try{await this['deps']['openSuggestions']({'network':a,'events':j,'annotations':m,'scope':k});}catch(s){this['deps']['logger']('monitor\x20loop:\x20suggestion\x20bridge\x20error\x20on\x20'+a+':\x20'+String(s?.['message']??s));}if(this['deps']['runKeeperScan'])try{await this['deps']['runKeeperScan'](a,k);}catch(t){this['deps']['logger']('monitor\x20loop:\x20keeper\x20scan\x20error\x20on\x20'+a+':\x20'+String(t?.['message']??t));}const n=Number(f['loop']?.['scope_refresh_ms'])||LOOP_DEFAULTS['scope_refresh_ms'];if(this['deps']['now']()-c['lastScopeRefreshAt']>=n){c['lastScopeRefreshAt']=this['deps']['now']();const {snapshot:u,changed:v}=await this['deps']['resolveScope'](a,f);c['scope']=u;if(v){const w=Number(f['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']),x=await this['deps']['router']['backfillAnnotations'](a,this['deps']['store'],u,w,f);this['deps']['logger']('monitor\x20loop:\x20scope\x20v'+u['version']+'\x20on\x20'+a+'\x20changed\x20—\x20backfill\x20rescanned\x20'+x['rescanned']+',\x20updated\x20'+x['updated']);}}c['lastTickAt']=this['deps']['now'](),c['lastNewCount']=i,c['consecutiveErrors']=0x0,c['backoffMs']=0x0;const o={'captured':j['length'],'annotated':l,'duration_ms':this['deps']['now']()-d};return c['lastSummary']=o,o;}catch(y){const z=String(y?.['message']??y);return this['deps']['logger']('monitor\x20loop:\x20tick\x20error\x20on\x20'+a+':\x20'+z),c['consecutiveErrors']+=0x1,c['backoffMs']=Math['min'](c['pollIntervalMs']*0x2**c['consecutiveErrors'],MAX_BACKOFF_MS),undefined;}finally{c['ticking']=![],c['started']&&this['schedule'](c,c['backoffMs']>0x0?c['backoffMs']:c['pollIntervalMs']);}}['schedule'](a,b){if(a['timer']!==undefined)this['deps']['clearTimer'](a['timer']);const c=this['deps']['setTimer'](()=>{a['timer']=undefined,void this['tick'](a['network']);},Math['max'](0x0,b));c?.['unref']?.(),a['timer']=c;}async['acquireLease'](a,b){const c=leaseKey(a['network']),d=this['deps']['now']();let e;try{const i=await this['deps']['storage']['get'](c);e=i?JSON['parse'](i):undefined;}catch{e=undefined;}const f={'pid':this['deps']['pid'],'boot_id':this['deps']['bootId']},g=!!e&&e['boot_id']===f['boot_id']&&e['pid']===f['pid'],h=!e||d-Number(e['heartbeat_at']??0x0)>0x2*b;if(g||h)return await this['deps']['storage']['put'](c,JSON['stringify']({...f,'heartbeat_at':d})),a['holdsLease']=!![],a['leaseHolder']=f,!![];return a['holdsLease']=![],a['leaseHolder']={'pid':e['pid'],'boot_id':e['boot_id']},![];}async['getScope'](a,b){if(!a['scope'])try{const c=await this['deps']['loadScope'](a['network']);c&&(a['scope']=c,a['lastScopeRefreshAt']=Number(c['resolved_at'])||0x0);}catch{}if(!a['scope']){a['lastScopeRefreshAt']=this['deps']['now']();const {snapshot:d,changed:e}=await this['deps']['resolveScope'](a['network'],b);a['scope']=d;if(e){const f=Number(b['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']);await this['deps']['router']['backfillAnnotations'](a['network'],this['deps']['store'],d,f,b);}}return a['scope'];}async['capture'](a,b){const c=a['network'],d=await this['deps']['store']['getCursors'](c);let f=0x0;const g=[],h=[...MONITOR_CAPTURE_TYPES];if(b['events']?.[PAYMENT_EVENT_TYPE]===!![])h['push'](PAYMENT_EVENT_TYPE);for(const i of h){const j=EVENT_MODULE_OF[i];if(!j)continue;try{const k=d['cursors'][i];let l=null;if(!k){let m=null,n=0x0;while(n<SEED_MAX){const o=await this['deps']['queryEvents']({'type':i,'cursor':m,'limit':Math['min'](SEED_PAGE,SEED_MAX-n),'order':'descending','network':c}),p=(o?.['data']??[])['map'](q=>normalizeMonitorEvent(q));if(p['length']===0x0)break;if(l===null)l=p[0x0];n+=p['length'],f+=await this['deps']['store']['insert'](c,j,p),g['push'](...p);if(!o?.['hasNextPage']||!o?.['nextCursor'])break;m=o['nextCursor'];}}else{const q=await this['deps']['queryEvents']({'type':i,'cursor':k,'limit':POLL_BATCH,'order':'ascending','network':c}),r=(q?.['data']??[])['map'](s=>normalizeMonitorEvent(s));f+=await this['deps']['store']['insert'](c,j,r),g['push'](...r);if(r['length']>0x0)l=r[r['length']-0x1];}if(l?.['id']){const s=d['cursors'][i];(!s||BigInt(l['id']['eventSeq'])>BigInt(s['eventSeq']||'0'))&&(d['cursors'][i]={'eventSeq':String(l['id']['eventSeq']),'txDigest':String(l['id']['txDigest'])});}}catch(t){const u=String(t?.['message']??t);this['deps']['logger']('monitor\x20loop:\x20type\x20'+i+'\x20poll\x20error:\x20'+u),/referenced transaction/i['test'](u)&&(delete d['cursors'][i],this['deps']['logger']('monitor\x20loop:\x20type\x20'+i+'\x20cursor\x20invalid\x20—\x20dropped,\x20will\x20re-seed\x20next\x20cycle'));}}return await this['deps']['store']['saveCursors'](c,d['cursors'],this['deps']['now']()),{'newCount':f,'events':g};}}export const monitorLoop=new MonitorLoop();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{SQLiteStorage}from'@wowok/wowok/w/local';import{query_objects,queryOrdersByUser,
|
|
1
|
+
import{SQLiteStorage}from'@wowok/wowok/w/local';import{query_objects,queryOrdersByUser,objectTypeFromAddress}from'@wowok/wowok';import{fetchEntityPermission,fetchObjectLinkerCore,fetchObjectLinkerTx,fetchServiceOrders,listLocalAccounts}from'../knowledge/workflow-guidance.js';import{monitorEventStore}from'./EventStore.js';import{formatShortAddress}from'../persona/address-format.js';import{LOOP_DEFAULTS,normalizeAddr}from'./types.js';const SCOPE_PREFIX='mon_scope:v4:',SCOPE_HIST_PREFIX='mon_scope_hist:v4:',SCOPE_HISTORY_KEEP=0x5,FAVOR_SCAN_MAX=0x1388;function netKey(a){return(a||'default')['replace'](/[^a-zA-Z0-9_-]/g,'_');}function realDeps(){return{'listLocalAccounts':()=>listLocalAccounts(),'fetchEntityPermission':(a,b)=>fetchEntityPermission(a,b),'fetchObjectLinkerCore':(a,b)=>fetchObjectLinkerCore(a,b),'fetchObjectLinkerTx':(a,b)=>fetchObjectLinkerTx(a,b),'queryServiceOrders':a=>fetchServiceOrders(a['address'],a['network']),'queryOrdersByUser':a=>queryOrdersByUser({'address':a['address'],'network':a['network']}),'queryObjects':a=>query_objects({'objects':a['objects'],'network':a['network']}),'objectTypeFromAddress':a=>objectTypeFromAddress(a),'store':monitorEventStore,'storage':new SQLiteStorage(),'now':()=>Date['now']()};}function canonicalize(a){if(Array['isArray'](a))return a['map'](canonicalize)['sort']((c,d)=>{const e=JSON['stringify'](c),f=JSON['stringify'](d);return e<f?-0x1:e>f?0x1:0x0;});if(a&&typeof a==='object'){const b={};for(const c of Object['keys'](a)['sort']()){b[c]=canonicalize(a[c]);}return b;}return a;}function semanticHashOf(a){return JSON['stringify'](canonicalize({'accounts':a['accounts'],'permissions':a['permissions'],'managed_objects':a['managed_objects'],'services':a['services'],'orders':a['orders'],'order_children':a['order_children'],'focus':a['focus']}));}function lowerTypeOf(a,b){try{return a['objectTypeFromAddress'](b)?.['toLowerCase']()??null;}catch{return null;}}function objectFields(a){return a?.['data']??a??{};}function childrenOfOrder(a){const b=[],c=Array['isArray'](a?.['dispute'])?a['dispute']:[];for(const e of c){if(typeof e==='string'&&e)b['push']({'type':'arb','object':e});}return typeof a?.['progress']==='string'&&a['progress']&&b['push']({'type':'progress','object':a['progress']}),typeof a?.['allocation']==='string'&&a['allocation']&&b['push']({'type':'allocation','object':a['allocation']}),b;}export async function loadScopeSnapshot(a,b){try{const c=await(b??new SQLiteStorage())['get'](''+SCOPE_PREFIX+netKey(a));if(!c)return undefined;const d=JSON['parse'](c);return d&&typeof d['version']==='number'?d:undefined;}catch{return undefined;}}export async function resolveScope(a,b,e){const g={...realDeps(),...e??{}},h=g['now'](),j=[],k=async(N,O)=>{try{return await O();}catch{return j['push'](N),undefined;}},l=''+SCOPE_PREFIX+netKey(a),n=''+SCOPE_HIST_PREFIX+netKey(a);let p;try{const N=await g['storage']['get'](l);p=N?JSON['parse'](N):undefined;}catch{p=undefined;}let q;if(b['scope']['accounts']==='local-all'){const O=await k('accounts',()=>g['listLocalAccounts']());q=(O??[])['map'](P=>P['address'])['filter'](P=>typeof P==='string'&&P);}else q=[...b['scope']['accounts']];q=[...new Set(q)];const s=b['scope']['rules'],t=[],u=[],w=new Map();if(s['managed_objects']||s['merchant_orders']){for(const R of q){const S=await k('entity_permission:'+formatShortAddress(R),()=>g['fetchEntityPermission'](R,a));for(const T of S?.['items']??[]){if(T?.['permission'])t['push'](T['permission']);}}const P=[...new Set(t)];t['length']=0x0,t['push'](...P);const Q=new Set();for(const U of P){const V=await k('object_linker_core:'+formatShortAddress(U),()=>g['fetchObjectLinkerCore'](U,a)),W=await k('object_linker_tx:'+formatShortAddress(U),()=>g['fetchObjectLinkerTx'](U,a)),X=[...(V?.['items']??[])['map'](Y=>Y?.['who']),...(W?.['items']??[])['map'](Y=>Y?.['who'])];for(const Y of X){if(typeof Y!=='string'||!Y)continue;const Z=lowerTypeOf(g,Y);if(!Z)continue;const a0=normalizeAddr(Y);if(Q['has'](a0))continue;Q['add'](a0),u['push']({'type':Z,'object':Y}),w['set'](a0,U);}}}const x=u['filter'](a1=>a1['type']==='service')['map'](a1=>a1['object']),y=new Map(),z=(a1,a2)=>{const a3=normalizeAddr(a1);if(!a3)return;const a4=y['get'](a3)??{'order':a1,'merchant':![],'buyer':![]};a4[a2]=!![],y['set'](a3,a4);};if(s['merchant_orders'])for(const a1 of x){const a2=await k('service_orders:'+formatShortAddress(a1),()=>g['queryServiceOrders']({'address':a1,'network':a}));for(const a3 of a2?.['items']??[]){if(typeof a3?.['who']==='string'&&a3['who'])z(a3['who'],'merchant');}}if(s['my_orders'])for(const a4 of q){const a5=await k('user_orders:'+formatShortAddress(a4),()=>g['queryOrdersByUser']({'address':a4,'network':a}));for(const a6 of a5??[]){if(!a6?.['is_owner']&&!a6?.['is_agent'])continue;const a7=a6?.['order']?.['object']??a6?.['order']?.['id'];if(typeof a7==='string'&&a7)z(a7,'buyer');}}const A=[...y['values']()]['map'](a8=>({'order':a8['order'],'role':a8['merchant']&&a8['buyer']?'both':a8['merchant']?'merchant':'buyer'})),B=[],C=new Map();if(s['order_children']&&y['size']>0x0){const a8=[...y['values']()]['map'](a9=>a9['order']);for(let a9=0x0;a9<a8['length'];a9+=0x32){const aa=a8['slice'](a9,a9+0x32),ab=await k('order_objects:'+formatShortAddress(aa[0x0]),()=>g['queryObjects']({'objects':aa,'network':a}));for(const ac of ab?.['objects']??[]){const ad=objectFields(ac),ae=ac?.['object']??ad?.['object']??ad?.['id'];if(typeof ae!=='string'||!ae)continue;for(const af of childrenOfOrder(ad)){const ag=normalizeAddr(af['object']);if(C['has'](ag))continue;C['set'](ag,ae),B['push'](af);}}}}const D=(b['scope']['focus_objects']??[])['map'](ah=>({...ah})),E=new Set(D['map'](ah=>normalizeAddr(ah['object']))),F=new Map();for(const ah of p?.['focus']??[]){if(ah?.['reason']==='favor'&&ah['object'])F['set'](normalizeAddr(ah['object']),ah['added_at']);}if(s['favor_objects']&&q['length']>0x0){const ai=Number(b['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']),aj=h-Math['max'](0x0,ai)*0x5265c00,ak=new Set(q['map'](al=>normalizeAddr(al)));try{let al=0x0;for(;;){const am=await g['store']['list'](a,{'module':'arb','eventType':'FeedbackEvent','since':aj,'offset':al,'limit':0xc8});if(am['events']['length']===0x0)break;for(const an of am['events']){const ao=an['event'],ap=normalizeAddr(ao?.['sender']);if(!ap||!ak['has'](ap))continue;const aq=ao?.['object'],ar=normalizeAddr(typeof aq==='string'?aq:'');if(!ar||E['has'](ar))continue;E['add'](ar),D['push']({'object':aq,'added_at':F['get'](ar)??h,'reason':'favor','closure':!![]});}al+=am['events']['length'];if(al>=am['total']||al>=FAVOR_SCAN_MAX)break;}}catch{j['push']('favor_scan');}}const G={},H=(as,at)=>{const au=normalizeAddr(as);if(!au)return;const av=G[au]??=[],aw=av['some'](ax=>ax['rule']===at['rule']&&normalizeAddr(ax['object'])===normalizeAddr(at['object']));if(!aw)av['push'](at);};if(s['managed_objects'])for(const as of u){const at=w['get'](normalizeAddr(as['object']));H(as['object'],{'rule':'managed_objects','object':as['object'],'detail':at?as['type']+'\x20'+formatShortAddress(as['object'])+'\x20of\x20permission\x20'+formatShortAddress(at):as['type']+'\x20'+formatShortAddress(as['object'])+'\x20(managed)'});}for(const au of A){(au['role']==='merchant'||au['role']==='both')&&H(au['order'],{'rule':'merchant_orders','object':au['order'],'detail':'order\x20'+formatShortAddress(au['order'])+'\x20(merchant)'}),(au['role']==='buyer'||au['role']==='both')&&H(au['order'],{'rule':'my_orders','object':au['order'],'detail':'order\x20'+formatShortAddress(au['order'])+'\x20(buyer)'});}if(s['order_children'])for(const av of B){const aw=C['get'](normalizeAddr(av['object']));H(av['object'],{'rule':'order_children','object':av['object'],'detail':aw?av['type']+'\x20'+formatShortAddress(av['object'])+'\x20of\x20order\x20'+formatShortAddress(aw):av['type']+'\x20'+formatShortAddress(av['object'])+'\x20(order\x20child)'});}for(const ax of D){const ay=lowerTypeOf(g,ax['object']);H(ax['object'],{'rule':'focus','object':ax['object'],'detail':'focused\x20'+(ay??'object')+'\x20'+formatShortAddress(ax['object'])});if(!ax['closure'])continue;if(ay==='service'){const az=await k('focus_service_orders:'+formatShortAddress(ax['object']),()=>g['queryServiceOrders']({'address':ax['object'],'network':a}));for(const aA of az?.['items']??[]){if(typeof aA?.['who']!=='string'||!aA['who'])continue;H(aA['who'],{'rule':'focus','object':aA['who'],'detail':'order\x20'+formatShortAddress(aA['who'])+'\x20of\x20focused\x20service\x20'+formatShortAddress(ax['object'])});}}else{if(ay==='order'){const aB=await k('focus_order:'+formatShortAddress(ax['object']),()=>g['queryObjects']({'objects':[ax['object']],'network':a})),aC=objectFields(aB?.['objects']?.[0x0]);for(const aD of childrenOfOrder(aC)){H(aD['object'],{'rule':'focus','object':aD['object'],'detail':aD['type']+'\x20'+formatShortAddress(aD['object'])+'\x20of\x20focused\x20order\x20'+formatShortAddress(ax['object'])});}}}}const I={'accounts':q,'permissions':t,'managed_objects':u,'services':x,'orders':A,'order_children':B,'focus':D},J=semanticHashOf(I),K=!p||semanticHashOf(p)!==J,L=p?K?p['version']+0x1:p['version']:0x1,M={'version':L,'resolved_at':h,...I,'index':G,...j['length']>0x0?{'data_gaps':j}:{}};try{await g['storage']['put'](l,JSON['stringify'](M));if(K){let aE=[];try{const aF=await g['storage']['get'](n),aG=aF?JSON['parse'](aF):undefined;aE=Array['isArray'](aG?.['snapshots'])?aG['snapshots']:[];}catch{aE=[];}aE['unshift'](M),await g['storage']['put'](n,JSON['stringify']({'snapshots':aE['slice'](0x0,SCOPE_HISTORY_KEEP)}));}}catch{j['push']('snapshot_persist');}return{'snapshot':M,'changed':K};}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { GoalRecord, GoalStage } from "../goal/types.js";
|
|
2
|
+
import type { SuggestionRecord } from "../task/types.js";
|
|
3
|
+
import type { RelevanceAnnotation, ScopeSnapshot } from "./types.js";
|
|
4
|
+
export interface ProgressionClassification {
|
|
5
|
+
kind: "advance_stage" | "complete_goal" | "note";
|
|
6
|
+
stage?: GoalStage;
|
|
7
|
+
goal_type?: string;
|
|
8
|
+
title: string;
|
|
9
|
+
detail: string;
|
|
10
|
+
object: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function classifyProgression(ev: any): ProgressionClassification | null;
|
|
13
|
+
export interface SuggestionBridgeDeps {
|
|
14
|
+
getGoal(network: string, id: string): Promise<GoalRecord | undefined>;
|
|
15
|
+
addSuggestion(dir: string, input: {
|
|
16
|
+
object?: string;
|
|
17
|
+
kind: SuggestionRecord["kind"];
|
|
18
|
+
stage?: string;
|
|
19
|
+
objects?: {
|
|
20
|
+
type: string;
|
|
21
|
+
object: string;
|
|
22
|
+
}[];
|
|
23
|
+
title: string;
|
|
24
|
+
detail?: string;
|
|
25
|
+
origin?: SuggestionRecord["origin"];
|
|
26
|
+
}): SuggestionRecord;
|
|
27
|
+
listSuggestions(dir: string, filter?: {
|
|
28
|
+
status?: SuggestionRecord["status"];
|
|
29
|
+
}): SuggestionRecord[];
|
|
30
|
+
logger(message: string): void;
|
|
31
|
+
}
|
|
32
|
+
export interface SuggestionBridgeInput {
|
|
33
|
+
network: string;
|
|
34
|
+
events: any[];
|
|
35
|
+
annotations: RelevanceAnnotation[];
|
|
36
|
+
scope: ScopeSnapshot;
|
|
37
|
+
}
|
|
38
|
+
export declare function bridgeMonitorSuggestions(input: SuggestionBridgeInput, deps: SuggestionBridgeDeps): Promise<number>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{monitorEventId}from'./EventStore.js';const ARB_STATUS_VOTING=0x2,ARB_STATUS_ARBITRATED=0x3,ARB_STATUS_FINISHED=0x5,STAGE_GATE={'advance_stage':'acting','complete_goal':'monitoring'};export function classifyProgression(a){if(!a||typeof a!=='object')return null;if(a['type']==='NewOrderEvent'){const b=typeof a['order']==='string'?a['order']:null,c=typeof a['service']==='string'?a['service']:null,d=b??c;if(!d)return null;return{'kind':'advance_stage','stage':'monitoring','title':'First\x20order\x20received\x20—\x20enter\x20monitoring','detail':'NewOrderEvent\x20on\x20'+d+(c?'\x20for\x20service\x20'+c:'')+'.\x20The\x20goal\x27s\x20live\x20object\x20now\x20transacts\x20on\x20its\x20own;\x20confirm\x20to\x20enter\x20the\x20monitoring\x20station\x20(auto-binds\x20focus\x20for\x20the\x20order\x20lifecycle).','object':d};}if(a['type']==='ArbEvent'){const e=Number(a['status']),f=typeof a['order']==='string'?a['order']:null,g=typeof a['arb']==='string'?a['arb']:null,h=f??g;if(!h)return null;if(e===ARB_STATUS_FINISHED)return{'kind':'complete_goal','title':'Arbitration\x20finished\x20—\x20verify\x20completion','detail':'The\x20dispute\x20covering\x20'+h+'\x20finished\x20(ArbEvent\x20Finished)'+(a['arbitration']?'\x20—\x20arbitration\x20'+a['arbitration']:'')+'.\x20Confirm\x20to\x20run\x20the\x20COMPLETE\x20station:\x20chain\x20conditions\x20are\x20re-verified\x20before\x20the\x20goal\x20closes.','object':h};if(e===ARB_STATUS_VOTING)return{'kind':'note','title':'Arbitration\x20voting\x20started\x20—\x20cast\x20your\x20vote','detail':'The\x20dispute\x20covering\x20'+h+'\x20entered\x20Voting\x20(ArbEvent\x20status\x202)'+(g?'\x20—\x20Arb\x20'+g:'')+'.\x20If\x20you\x20are\x20a\x20voting\x20guard\x20member:\x20read\x20the\x20Arb\x20object\x27s\x20voting_deadline\x20and\x20cast\x20your\x20vote\x20via\x20the\x20arbitration\x20workflow\x20(wowok-arbitrator\x20skill)\x20before\x20it\x20passes\x20—\x20the\x20deadline\x20itself\x20never\x20fires\x20an\x20event.\x20Parties:\x20voting\x20is\x20underway;\x20the\x20verdict\x20arrives\x20as\x20Arbitrated\x20(objection\x20window),\x20then\x20Finished.','object':h};if(e===ARB_STATUS_ARBITRATED)return{'kind':'note','title':'Verdict\x20reached\x20—\x20objection\x20window\x20open','detail':'The\x20dispute\x20covering\x20'+h+'\x20was\x20Arbitrated\x20(ArbEvent\x20status\x203):\x20voting\x20closed\x20and\x20the\x20verdict\x20is\x20on-chain'+(g?'\x20(Arb\x20'+g+')':'')+'.\x20The\x20objection\x20window\x20is\x20now\x20open\x20—\x20contest\x20the\x20verdict\x20BEFORE\x20it\x20finalizes\x20(Finished),\x20or\x20no\x20action\x20is\x20needed.','object':h};return null;}if(a['type']==='FeedbackEvent'){const i=typeof a['object']==='string'?a['object']:null;if(!i)return null;const j=typeof a['feedback']==='string'&&a['feedback']?a['feedback']['slice'](0x0,0x8c):null;return{'kind':'note','title':'Feedback\x20recorded\x20on\x20an\x20arbitration\x20case','detail':'FeedbackEvent\x20on\x20Arb\x20'+i+(j?':\x20\x22'+j+'\x22':'')+'.\x20The\x20feedback\x20joins\x20the\x20case\x27s\x20permanent\x20on-chain\x20record\x20and\x20feeds\x20the\x20voters\x27\x20reputation\x20—\x20review\x20it\x20in\x20the\x20arbitration\x20workflow.','object':i};}if(a['type']==='DemandFeedbackEvent'){const k=typeof a['demand']==='string'?a['demand']:null;if(!k)return null;const l=typeof a['service']==='string'?a['service']:null,m=a['acceptance_score']!==null&&a['acceptance_score']!==undefined?String(a['acceptance_score']):null,n=typeof a['feedback']==='string'&&a['feedback']?a['feedback']['slice'](0x0,0x8c):null;return{'kind':'note','title':'Presentation\x20feedback\x20recorded','detail':'DemandEvent\x20on\x20demand\x20'+k+(l?'\x20—\x20presented\x20service\x20'+l:'')+(m?'\x20—\x20acceptance_score\x20'+m:'')+(n?'\x20—\x20\x22'+n+'\x22':'')+'.\x20The\x20score\x20becomes\x20the\x20presenter\x27s\x20permanent\x20on-chain\x20reputation\x20signal;\x20the\x20presenter\x20should\x20review\x20the\x20feedback\x20and\x20improve.','object':k};}if(a['type']==='ServiceEvent'){const o=typeof a['object']==='string'?a['object']:null;if(!o)return null;return{'kind':'complete_goal','goal_type':'publish_service','title':'Service\x20live\x20—\x20verify\x20completion','detail':'ServiceEvent\x20on\x20'+o+(a['description']?'\x20('+a['description']+')':'')+'.\x20Confirm\x20to\x20run\x20the\x20COMPLETE\x20station:\x20the\x20service\x20conjunction\x20(healthy,\x20sales,\x20machine,\x20permission)\x20is\x20re-verified\x20on\x20chain.','object':o};}if(a['type']==='AllocationEvent'){const p=typeof a['object']==='string'?a['object']:null;if(!p)return null;const q=typeof a['payment']==='string'?a['payment']:null,r=a['amount']!==null&&a['amount']!==undefined?String(a['amount']):null;return{'kind':'note','title':'Settlement\x20executed\x20—\x20payment\x20split\x20created','detail':'AllocationEvent\x20on\x20'+p+(r?'\x20—\x20amount\x20'+r+'\x20(smallest\x20unit)':'')+(q?'\x20→\x20Payment\x20'+q:'')+'.\x20The\x20order\x27s\x20allocation\x20split\x20funds\x20on-chain;\x20recipients\x20receive\x20CoinWrapper(s)\x20they\x20claim\x20via\x20payment\x20{receive:true}\x20(the\x20keeper\x20surfaces\x20unclaimed\x20funds\x20separately).','object':p};}if(a['type']==='TreasuryEvent'){const s=typeof a['object']==='string'?a['object']:null;if(!s)return null;const t=Number(a['op']),u=t===0x0?'withdraw':t===0x1?'deposit':t===0x2?'receive':null,v=a['amount']!==null&&a['amount']!==undefined?String(a['amount']):null;return{'kind':'note','title':u?'Treasury\x20'+u+'\x20recorded':'Treasury\x20operation\x20recorded','detail':'TreasuryEvent\x20on\x20'+s+(u?'\x20—\x20'+u:'')+(v?'\x20of\x20'+v+'\x20(smallest\x20unit)':'')+(typeof a['payment']==='string'&&a['payment']?'\x20(Payment\x20'+a['payment']+')':'')+'.\x20The\x20treasury\x27s\x20on-chain\x20history\x20keeps\x20the\x20immutable\x20audit\x20trail\x20of\x20this\x20fund\x20movement.','object':s};}if(a['type']==='RewardClaimEvent'){const w=typeof a['object']==='string'?a['object']:null;if(!w)return null;const x=a['amount']!==null&&a['amount']!==undefined?String(a['amount']):null;return{'kind':'note','title':'Reward\x20claimed','detail':'RewardClaimEvent\x20on\x20'+w+(x?'\x20—\x20'+x+'\x20(smallest\x20unit)':'')+(typeof a['recipient']==='string'&&a['recipient']?'\x20to\x20'+a['recipient']:'')+(a['balance_left']!==null&&a['balance_left']!==undefined?'\x20—\x20pool\x20balance\x20left\x20'+String(a['balance_left'])+'\x20(smallest\x20unit)':'')+'.\x20The\x20claim\x20passed\x20its\x20guard\x20conditions\x20on-chain;\x20the\x20reward\x27s\x20record\x20table\x20keeps\x20the\x20receipt.','object':w};}if(a['type']==='RewardFundEvent'){const y=typeof a['object']==='string'?a['object']:null;if(!y)return null;const z=a['amount']!==null&&a['amount']!==undefined?String(a['amount']):null;return{'kind':'note','title':'Reward\x20pool\x20funded','detail':'RewardFundEvent\x20on\x20'+y+(z?'\x20—\x20+'+z+'\x20(smallest\x20unit)':'')+(a['balance']!==null&&a['balance']!==undefined?'\x20→\x20pool\x20balance\x20'+String(a['balance'])+'\x20(smallest\x20unit)':'')+'.\x20New\x20funding\x20is\x20claimable\x20under\x20the\x20pool\x27s\x20existing\x20reward\x20guards.','object':y};}if(a['type']==='ProgressEvent'){const A=typeof a['progress']==='string'?a['progress']:null;if(!A)return null;const B=typeof a['node']==='string'?a['node']:null,C=a['hold']===!![]||a['hold']==='true';return{'kind':'note','goal_type':'purchase_service','title':B?'Delivery\x20advanced\x20to\x20\x27'+B+'\x27':'Delivery\x20progressed','detail':'ProgressEvent\x20on\x20'+A+(B?'\x20—\x20workflow\x20advanced\x20to\x20node\x20\x27'+B+'\x27':'')+(typeof a['forward']==='string'&&a['forward']?'\x20via\x20forward\x20\x27'+a['forward']+'\x27':'')+(C?'\x20—\x20the\x20progress\x20is\x20HELD\x20(paused)':'')+'.\x20Review\x20the\x20delivery\x20evidence\x20for\x20this\x20node;\x20if\x20the\x20advance\x20looks\x20wrong\x20you\x20can\x20raise\x20a\x20dispute\x20(the\x20node\x27s\x20guard\x20verdict\x20and\x20WIP\x20hashes\x20are\x20on-chain).','object':A};}if(a['type']==='DemandPresentEvent'){const D=typeof a['demand']==='string'?a['demand']:null;if(!D)return null;const E=typeof a['service']==='string'?a['service']:null,F=typeof a['recommend']==='string'&&a['recommend']['length']>0x0?a['recommend']['slice'](0x0,0x8c):null;return{'kind':'note','goal_type':'publish_demand','title':'A\x20candidate\x20presented\x20to\x20your\x20demand\x20—\x20evaluate\x20&\x20select','detail':'DemandPresentEvent\x20on\x20'+D+(E?'\x20—\x20presented\x20service\x20'+E:'\x20(no\x20service\x20attached)')+(F?'\x20—\x20pitch:\x20\x22'+F+'\x22':'')+'.\x20Compare\x20the\x20candidate\x20via\x20the\x20service\x27s\x20trust\x20data\x20(registrar\x20votes,\x20past\x20orders,\x20arbitration\x20bindings)\x20before\x20selecting;\x20your\x20on-chain\x20feedback\x20(acceptance_score)\x20becomes\x20the\x20presenter\x27s\x20permanent\x20reputation.','object':D};}return null;}const EVENT_OBJECT_FIELDS=['order','service','arb','arbitration','object','progress','demand'];export async function bridgeMonitorSuggestions(b,c){const {network:d,events:g,annotations:h,scope:i}=b;try{const j=new Set(h['map'](n=>n['event_id'])),k=new Map();for(const n of h){k['set'](n['event_id'],n['rules']['map'](o=>o['object']));}const l=new Map();for(const o of i['focus']??[]){if(o['goal_id']&&o['object'])l['set'](o['object'],o['goal_id']);}if(l['size']===0x0)return 0x0;const m=[];for(const p of g){const q=monitorEventId(p?.['id']);if(!q||!j['has'](q))continue;const r=classifyProgression(p);if(!r)continue;const s=[...k['get'](q)??[],...EVENT_OBJECT_FIELDS['map'](y=>p[y])['filter'](y=>typeof y==='string'&&y['length']>0x0)];let t;for(const y of s){const z=l['get'](y);if(z){t=z;break;}}if(!t)continue;const u=await c['getGoal'](d,t),v=u?.['process']?.['dir'];if(!u||!v)continue;const w=STAGE_GATE[r['kind']];if(w&&u['stage']!==w)continue;if(r['goal_type']&&u['goal_type']!==r['goal_type'])continue;const x=c['listSuggestions'](v)['some'](A=>A['origin']?.['source']==='monitor'&&A['origin']?.['event_id']===q);if(x)continue;c['addSuggestion'](v,{'object':r['object'],'kind':r['kind'],...r['stage']?{'stage':r['stage']}:{},'title':r['title'],'detail':r['detail'],'origin':{'source':'monitor','network':d,'event_id':q,'event_type':String(p['type']??'unknown')}}),m['push'](q);}return m['length']>0x0&&c['logger']('suggestion\x20bridge:\x20opened\x20'+m['length']+'\x20suggestion(s)\x20on\x20'+d+'\x20from\x20monitor\x20progressions'),m['length'];}catch(A){return c['logger']('suggestion\x20bridge:\x20skipped\x20('+String(A?.['message']??A)+')'),0x0;}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{describe,expect,it}from'vitest';import{bridgeMonitorSuggestions,classifyProgression}from'./SuggestionBridge.js';const NET='testnet',PROGRESS='0xprogress1',DEMAND='0xdemand1',SERVICE='0xservice1',ARB='0xarb1',ORDER='0xorder1',GOAL_ID='goal-1';function ev(a,b,c='1'){return{'id':{'eventSeq':c,'txDigest':'0xtx'},'type':a,...b};}function annotation(a,b){return{'event_id':a+':0xtx','event_type':'ProgressEvent','rules':[{'kind':'focus','object':b}],'focus_hit':!![],'matched_filters':[],'scope_version':0x1,'annotated_at':0x0};}function scopeWithFocus(a){return{'focus':[{'object':a,'added_at':0x0,'reason':'goal','closure':!![],'goal_id':GOAL_ID}]};}function goalOf(a,b){return{'id':GOAL_ID,'stage':a,'goal_type':b,'process':{'dir':'proc-dir'}};}function depsOf(a){const b=[],c={'getGoal':async()=>a,'addSuggestion':(d,e)=>{return b['push'](e),{'id':'sug-'+b['length'],'status':'pending',...e};},'listSuggestions':()=>b['map']((d,e)=>({'id':'sug-'+(e+0x1),'status':'pending',...d})),'logger':()=>{}};return{'deps':c,'added':b};}describe('classifyProgression',()=>{it('ProgressEvent\x20→\x20note\x20for\x20purchase_service\x20goals,\x20carries\x20node/forward/hold',()=>{const a=classifyProgression(ev('ProgressEvent',{'progress':PROGRESS,'node':'deliver','forward':'ship','hold':![]}));expect(a?.['kind'])['toBe']('note'),expect(a?.['goal_type'])['toBe']('purchase_service'),expect(a?.['object'])['toBe'](PROGRESS),expect(a?.['title'])['toContain']('deliver');}),it('ProgressEvent\x20without\x20progress\x20address\x20→\x20null',()=>{expect(classifyProgression(ev('ProgressEvent',{'node':'x'})))['toBeNull']();}),it('DemandPresentEvent\x20→\x20note\x20for\x20publish_demand\x20goals\x20with\x20pitch\x20preview',()=>{const a=classifyProgression(ev('DemandPresentEvent',{'demand':DEMAND,'service':SERVICE,'recommend':'I\x20can\x20do\x20it'}));expect(a?.['kind'])['toBe']('note'),expect(a?.['goal_type'])['toBe']('publish_demand'),expect(a?.['object'])['toBe'](DEMAND),expect(a?.['detail'])['toContain']('I\x20can\x20do\x20it');}),it('ArbEvent\x20Voting\x20(status\x202)\x20→\x20voting-started\x20note\x20pointing\x20at\x20the\x20deadline',()=>{const a=classifyProgression(ev('ArbEvent',{'arb':ARB,'order':ORDER,'status':0x2}));expect(a?.['kind'])['toBe']('note'),expect(a?.['object'])['toBe'](ORDER),expect(a?.['title'])['toContain']('voting\x20started'),expect(a?.['detail'])['toContain']('voting_deadline');}),it('ArbEvent\x20Arbitrated\x20(status\x203)\x20→\x20objection-window\x20note',()=>{const a=classifyProgression(ev('ArbEvent',{'arb':ARB,'order':ORDER,'status':0x3}));expect(a?.['kind'])['toBe']('note'),expect(a?.['title'])['toContain']('objection\x20window');}),it('ArbEvent\x20Finished\x20(status\x205)\x20→\x20complete_goal\x20(pre-existing\x20behavior\x20preserved)',()=>{const a=classifyProgression(ev('ArbEvent',{'arb':ARB,'order':ORDER,'status':0x5}));expect(a?.['kind'])['toBe']('complete_goal'),expect(a?.['object'])['toBe'](ORDER);}),it('ArbEvent\x20other\x20statuses\x20→\x20null',()=>{expect(classifyProgression(ev('ArbEvent',{'arb':ARB,'order':ORDER,'status':0x0})))['toBeNull'](),expect(classifyProgression(ev('ArbEvent',{'arb':ARB,'order':ORDER,'status':0x4})))['toBeNull'](),expect(classifyProgression(ev('ArbEvent',{'arb':ARB,'order':ORDER,'status':0x6})))['toBeNull']();}),it('FeedbackEvent\x20→\x20reputation\x20note\x20with\x20feedback\x20preview',()=>{const a=classifyProgression(ev('FeedbackEvent',{'object':ARB,'feedback':'fair\x20and\x20fast'}));expect(a?.['kind'])['toBe']('note'),expect(a?.['object'])['toBe'](ARB),expect(a?.['detail'])['toContain']('fair\x20and\x20fast'),expect(a?.['detail'])['toContain']('reputation');}),it('DemandFeedbackEvent\x20→\x20presenter-reputation\x20note\x20carrying\x20acceptance_score',()=>{const a=classifyProgression(ev('DemandFeedbackEvent',{'demand':DEMAND,'service':SERVICE,'acceptance_score':0x55,'feedback':'solid\x20work'}));expect(a?.['kind'])['toBe']('note'),expect(a?.['object'])['toBe'](DEMAND),expect(a?.['detail'])['toContain']('85'),expect(a?.['detail'])['toContain']('solid\x20work');}),it('AllocationEvent\x20→\x20settlement\x20note\x20carrying\x20amount\x20+\x20payment',()=>{const a=classifyProgression(ev('AllocationEvent',{'object':'0xalloc1','payment':'0xpay1','amount':'5000'}));expect(a?.['kind'])['toBe']('note'),expect(a?.['object'])['toBe']('0xalloc1'),expect(a?.['title'])['toContain']('Settlement\x20executed'),expect(a?.['detail'])['toContain']('5000'),expect(a?.['detail'])['toContain']('0xpay1'),expect(a?.['detail'])['toContain']('keeper');}),it('TreasuryEvent\x20→\x20op-labelled\x20note\x20(withdraw/deposit/receive)',()=>{const a=classifyProgression(ev('TreasuryEvent',{'object':'0xtre1','op':0x0,'amount':'7'}));expect(a?.['title'])['toContain']('withdraw'),expect(a?.['object'])['toBe']('0xtre1');const b=classifyProgression(ev('TreasuryEvent',{'object':'0xtre1','op':0x1}));expect(b?.['title'])['toContain']('deposit');const c=classifyProgression(ev('TreasuryEvent',{'object':'0xtre1','op':0x2}));expect(c?.['title'])['toContain']('receive');const e=classifyProgression(ev('TreasuryEvent',{'object':'0xtre1','op':0x9}));expect(e?.['title'])['toBe']('Treasury\x20operation\x20recorded');}),it('RewardClaimEvent\x20/\x20RewardFundEvent\x20→\x20reward\x20notes',()=>{const a=classifyProgression(ev('RewardClaimEvent',{'object':'0xrew1','recipient':'0xuser1','amount':'100','balance_left':'900'}));expect(a?.['kind'])['toBe']('note'),expect(a?.['title'])['toBe']('Reward\x20claimed'),expect(a?.['detail'])['toContain']('0xuser1'),expect(a?.['detail'])['toContain']('900');const b=classifyProgression(ev('RewardFundEvent',{'object':'0xrew1','amount':'1000','balance':'1000'}));expect(b?.['kind'])['toBe']('note'),expect(b?.['title'])['toBe']('Reward\x20pool\x20funded');}),it('NewPaymentEvent\x20is\x20deliberately\x20NOT\x20bridged\x20(keeper\x20owns\x20the\x20claim\x20reminder)',()=>{expect(classifyProgression(ev('NewPaymentEvent',{'object':'0xpay1','amount':'100'})))['toBeNull']();});}),describe('bridgeMonitorSuggestions',()=>{it('bridges\x20an\x20annotated\x20ProgressEvent\x20into\x20a\x20purchase_service\x20goal\x27s\x20suggestions',async()=>{const {deps:a,added:b}=depsOf(goalOf('monitoring','purchase_service')),c=await bridgeMonitorSuggestions({'network':NET,'events':[ev('ProgressEvent',{'progress':PROGRESS,'node':'deliver'})],'annotations':[annotation('1',PROGRESS)],'scope':scopeWithFocus(PROGRESS)},a);expect(c)['toBe'](0x1),expect(b[0x0]?.['kind'])['toBe']('note'),expect(b[0x0]?.['origin']?.['event_type'])['toBe']('ProgressEvent');}),it('drops\x20ProgressEvent\x20when\x20the\x20owning\x20goal\x20is\x20not\x20purchase_service',async()=>{const {deps:a,added:b}=depsOf(goalOf('monitoring','fulfill_order')),c=await bridgeMonitorSuggestions({'network':NET,'events':[ev('ProgressEvent',{'progress':PROGRESS})],'annotations':[annotation('1',PROGRESS)],'scope':scopeWithFocus(PROGRESS)},a);expect(c)['toBe'](0x0),expect(b)['toHaveLength'](0x0);}),it('bridges\x20DemandPresentEvent\x20via\x20the\x20demand\x20focus\x20field',async()=>{const {deps:a,added:b}=depsOf(goalOf('acting','publish_demand')),c=await bridgeMonitorSuggestions({'network':NET,'events':[ev('DemandPresentEvent',{'demand':DEMAND,'service':SERVICE})],'annotations':[annotation('1',DEMAND)],'scope':scopeWithFocus(DEMAND)},a);expect(c)['toBe'](0x1),expect(b[0x0]?.['object'])['toBe'](DEMAND);}),it('idempotency:\x20the\x20same\x20event\x20never\x20bridges\x20twice',async()=>{const {deps:a}=depsOf(goalOf('monitoring','purchase_service')),b={'network':NET,'events':[ev('ProgressEvent',{'progress':PROGRESS})],'annotations':[annotation('1',PROGRESS)],'scope':scopeWithFocus(PROGRESS)};expect(await bridgeMonitorSuggestions(b,a))['toBe'](0x1),expect(await bridgeMonitorSuggestions(b,a))['toBe'](0x0);}),it('relevance\x20gate:\x20un-annotated\x20events\x20never\x20bridge',async()=>{const {deps:a}=depsOf(goalOf('monitoring','purchase_service')),b=await bridgeMonitorSuggestions({'network':NET,'events':[ev('ProgressEvent',{'progress':PROGRESS})],'annotations':[],'scope':scopeWithFocus(PROGRESS)},a);expect(b)['toBe'](0x0);});});
|
package/dist/monitor/types.d.ts
CHANGED
|
@@ -86,4 +86,3 @@ export declare const LOOP_MIN: {
|
|
|
86
86
|
export declare const DEFAULT_EVENT_SWITCHES: Record<string, boolean>;
|
|
87
87
|
export declare function defaultSubscriptionConfig(): SubscriptionConfig;
|
|
88
88
|
export declare function normalizeAddr(addr?: string | null): string;
|
|
89
|
-
export declare function shortId(addr?: string | null): string;
|
package/dist/monitor/types.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const MONITOR_EVENT_MODULES=['order','arb','demand','progress','treasury','reward','service','entity','payment'];export const LOOP_DEFAULTS={'poll_interval_ms':0x3a98,'scope_refresh_ms':0x493e0,'backfill_days':0x7};export const LOOP_MIN={'poll_interval_ms':0x1388,'scope_refresh_ms':0xea60,'backfill_days':0x0};export const DEFAULT_EVENT_SWITCHES={'NewOrderEvent':!![],'ProgressEvent':!![],'ArbEvent':!![],'VoteEvent':!![],'TreasuryEvent':!![],'RewardFundEvent':!![],'RewardClaimEvent':!![],'AllocationEvent':!![],'FeedbackEvent':![],'NewPaymentEvent':![],'DemandChangedEvent':![],'DemandPresentEvent':![],'DemandFeedbackEvent':![],'ServiceEvent':![],'NewEntityEvent':![]};export function defaultSubscriptionConfig(){return{'version':0x2,'enabled':!![],'scope':{'accounts':'local-all','rules':{'managed_objects':!![],'merchant_orders':!![],'my_orders':!![],'order_children':!![],'favor_objects':!![]},'focus_objects':[]},'events':{...DEFAULT_EVENT_SWITCHES},'filters':[],'loop':{...LOOP_DEFAULTS}};}export function normalizeAddr(a){if(!a)return'';const b=a['startsWith']('0x')?a['slice'](0x2):a;return b['toLowerCase']();}
|
|
1
|
+
export const MONITOR_EVENT_MODULES=['order','arb','demand','progress','treasury','reward','service','entity','payment'];export const LOOP_DEFAULTS={'poll_interval_ms':0x3a98,'scope_refresh_ms':0x493e0,'backfill_days':0x7};export const LOOP_MIN={'poll_interval_ms':0x1388,'scope_refresh_ms':0xea60,'backfill_days':0x0};export const DEFAULT_EVENT_SWITCHES={'NewOrderEvent':!![],'ProgressEvent':!![],'ArbEvent':!![],'VoteEvent':!![],'TreasuryEvent':!![],'RewardFundEvent':!![],'RewardClaimEvent':!![],'AllocationEvent':!![],'FeedbackEvent':![],'NewPaymentEvent':![],'DemandChangedEvent':![],'DemandPresentEvent':![],'DemandFeedbackEvent':![],'ServiceEvent':![],'NewEntityEvent':![]};export function defaultSubscriptionConfig(){return{'version':0x2,'enabled':!![],'scope':{'accounts':'local-all','rules':{'managed_objects':!![],'merchant_orders':!![],'my_orders':!![],'order_children':!![],'favor_objects':!![]},'focus_objects':[]},'events':{...DEFAULT_EVENT_SWITCHES},'filters':[],'loop':{...LOOP_DEFAULTS}};}export function normalizeAddr(a){if(!a)return'';const b=a['startsWith']('0x')?a['slice'](0x2):a;return b['toLowerCase']();}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface ArbitratorInterestInput {
|
|
2
|
+
account: string;
|
|
3
|
+
arbitration: string;
|
|
4
|
+
vote_weight?: number;
|
|
5
|
+
open_disputes: Array<{
|
|
6
|
+
arb: string;
|
|
7
|
+
order?: string;
|
|
8
|
+
voting_deadline?: number;
|
|
9
|
+
current_time?: number;
|
|
10
|
+
}>;
|
|
11
|
+
resolved_indemnities?: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface ArbitratorInterestAnalysis {
|
|
14
|
+
fund_flow: string[];
|
|
15
|
+
responsibility: string[];
|
|
16
|
+
leverage: string[];
|
|
17
|
+
stakes: string[];
|
|
18
|
+
summary: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function analyzeArbitratorInterest(input: ArbitratorInterestInput): ArbitratorInterestAnalysis;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function analyzeArbitratorInterest(a){const b=[],c=[],e=[],f=[];b['push']('Arbitration\x20fee\x20is\x20escrowed\x20per\x20dispute\x20(arb.move)\x20—\x20collected\x20when\x20the\x20verdict\x20lands,\x20forfeited\x20if\x20you\x20never\x20vote.');a['vote_weight']!==undefined&&b['push']('Your\x20vote\x20carries\x20weight\x20'+a['vote_weight']+'\x20—\x20weighted\x20voting,\x20not\x20majority\x20count:\x20a\x20high-weight\x20vote\x20can\x20decide\x20a\x20case\x20alone.');if(a['open_disputes']['length']>0x0){c['push'](a['open_disputes']['length']+'\x20open\x20dispute(s)\x20await\x20your\x20proposition/vote\x20—\x20you\x20hold\x20arbitration\x20power\x20over\x20funds\x20that\x20are\x20already\x20escrowed.');for(const h of a['open_disputes']){if(h['voting_deadline']!==undefined&&h['current_time']!==undefined){const i=Math['round']((h['voting_deadline']-h['current_time'])/0x36ee80);c['push']('Arb\x20'+h['arb']+':\x20'+(i>=0x0?i+'h\x20left\x20to\x20the\x20voting\x20deadline':'voting\x20deadline\x20PASSED')+(h['order']?'\x20(order\x20'+h['order']+')':'')+'.');}}}c['push']('Verdicts\x20must\x20be\x20defensible\x20from\x20on-chain\x20evidence\x20(progress\x20records,\x20WIP\x20hashes,\x20Messenger\x20records)\x20—\x20every\x20Voted\x20entry\x20is\x20permanent\x20and\x20queryable.'),e['push']('Pull\x20the\x20order\x27s\x20full\x20record\x20before\x20voting:\x20Progress\x20holders\x20show\x20WHO\x20advanced\x20WHAT\x20and\x20WHEN\x20—\x20the\x20liability\x20question\x20usually\x20answers\x20itself\x20from\x20the\x20timestamps.');a['open_disputes']['length']>0x0&&e['push']('Request\x20missing\x20evidence\x20via\x20Messenger\x20—\x20the\x20conversation\x20record\x20becomes\x20part\x20of\x20the\x20dispute\x20record.');f['push']('Deadline\x20miss:\x20a\x20case\x20you\x20hold\x20weight\x20in\x20resolves\x20without\x20you\x20—\x20fee\x20forfeited\x20and\x20your\x20arbitration\x20reputation\x20degrades\x20(registrar\x20votes\x20are\x20queryable\x20by\x20future\x20disputants).');a['resolved_indemnities']?.['length']&&f['push']('You\x20resolved\x20'+a['resolved_indemnities']['length']+'\x20case(s)\x20recently\x20—\x20a\x20verdict\x20overturned\x20by\x20evidence\x20later\x20discovered\x20is\x20a\x20permanent\x20reputation\x20mark.');f['push']('Separation\x20of\x20powers:\x20you\x20must\x20NOT\x20hold\x20power\x20in\x20the\x20disputing\x20service\x27s\x20own\x20permission\x20(service.move\x20rejects\x20such\x20bindings)\x20—\x20avoid\x20any\x20position\x20that\x20re-creates\x20that\x20conflict.');const g='As\x20an\x20arbitrator\x20of\x20'+a['arbitration']+(a['vote_weight']!==undefined?'\x20(weight\x20'+a['vote_weight']+')':'')+(',\x20'+a['open_disputes']['length']+'\x20open\x20dispute(s)')+(a['open_disputes']['length']>0x0?'\x20await\x20your\x20vote':'\x20are\x20pending')+'.\x20Your\x20income\x20is\x20the\x20fee;\x20your\x20asset\x20is\x20a\x20defensible\x20verdict\x20record;\x20your\x20exposure\x20is\x20the\x20deadline.';return{'fund_flow':b,'responsibility':c,'leverage':e,'stakes':f,'summary':g};}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface DemanderInterestInput {
|
|
2
|
+
account: string;
|
|
3
|
+
demand: string;
|
|
4
|
+
presenters: Array<{
|
|
5
|
+
address: string;
|
|
6
|
+
service?: string;
|
|
7
|
+
acceptance_score?: number;
|
|
8
|
+
}>;
|
|
9
|
+
rewards: Array<{
|
|
10
|
+
address: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
}>;
|
|
13
|
+
guards: string[];
|
|
14
|
+
open: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface DemanderInterestAnalysis {
|
|
17
|
+
fund_flow: string[];
|
|
18
|
+
responsibility: string[];
|
|
19
|
+
leverage: string[];
|
|
20
|
+
stakes: string[];
|
|
21
|
+
summary: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function analyzeDemanderInterest(input: DemanderInterestInput): DemanderInterestAnalysis;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function analyzeDemanderInterest(a){const b=[],c=[],d=[],e=[];a['rewards']['length']>0x0?b['push'](a['rewards']['length']+'\x20reward\x20object(s)\x20escrowed\x20on\x20the\x20demand\x20—\x20claimable\x20ONLY\x20by\x20the\x20presenter\x20you\x20select\x20'+'(the\x20claim\x20guard\x20passes\x20for\x20the\x20winner\x27s\x20claim\x20alone).\x20Nothing\x20is\x20paid\x20for\x20presenting\x20itself.'):b['push']('No\x20reward\x20attached\x20—\x20presenters\x20see\x20a\x20non-paying\x20demand;\x20expect\x20fewer\x20or\x20weaker\x20presentations.');c['push']('Selection\x20is\x20yours\x20alone:\x20the\x20on-chain\x20feedback\x20you\x20write\x20(acceptance_score)\x20becomes\x20the\x20presenter\x27s\x20permanent,\x20queryable\x20reputation.');a['presenters']['length']>0x0&&c['push'](a['presenters']['length']+'\x20presenter(s)\x20are\x20waiting\x20on\x20your\x20selection\x20—\x20each\x20present\x20is\x20visible\x20with\x20its\x20service\x20and\x20history.');a['open']?(d['push']('Keep\x20the\x20demand\x20open\x20and\x20compare\x20presenters\x20via\x20their\x20services\x27\x20trust\x20data\x20(registrar\x20votes,\x20past\x20orders,\x20arbitration\x20bindings)\x20before\x20selecting.'),a['guards']['length']>0x0&&d['push']('Demand\x20guards\x20('+a['guards']['join'](',\x20')+')\x20filter\x20who\x20may\x20present\x20—\x20tighten\x20them\x20if\x20low-quality\x20presentations\x20arrive.')):d['push']('Demand\x20closed\x20—\x20leave\x20on-chain\x20feedback\x20(acceptance_score)\x20to\x20finish\x20the\x20evaluation\x20loop.');d['push']('Negotiate\x20pre-commitment\x20terms\x20via\x20Messenger:\x20the\x20conversation\x20record\x20is\x20evidence\x20if\x20a\x20dispute\x20later\x20arises.');a['presenters']['length']===0x0&&e['push']('No\x20presenters\x20yet\x20—\x20the\x20demand\x20may\x20be\x20over-narrow\x20or\x20under-rewarded;\x20consider\x20adjusting\x20the\x20reward\x20or\x20guards.');a['rewards']['length']>0x0&&a['presenters']['length']===0x0&&e['push']('Escrowed\x20reward\x20sits\x20idle\x20while\x20no\x20one\x20presents\x20—\x20value\x20overhang\x20with\x20no\x20delivery.');e['push']('Selecting\x20without\x20evidence\x20review:\x20acceptance_score\x20and\x20service\x20trust\x20data\x20are\x20your\x20only\x20pre-commitment\x20protection\x20—\x20there\x20is\x20NO\x20platform\x20intermediary\x20to\x20reverse\x20a\x20bad\x20selection.');const f='As\x20the\x20demander\x20of\x20'+a['demand']+',\x20'+(a['presenters']['length']>0x0?a['presenters']['length']+'\x20presenter(s)\x20compete\x20for\x20your\x20selection':'no\x20presenter\x20has\x20come\x20forward\x20yet')+(a['rewards']['length']>0x0?';\x20'+a['rewards']['length']+'\x20escrowed\x20reward(s)\x20back\x20the\x20selection.':';\x20no\x20reward\x20is\x20attached.')+'\x20Your\x20leverage\x20is\x20comparison\x20and\x20evidence;\x20your\x20exposure\x20is\x20selection\x20risk.';return{'fund_flow':b,'responsibility':c,'leverage':d,'stakes':e,'summary':f};}
|