@wowok/agent-mcp 2.7.1 → 2.7.2
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/config/index.js +1 -1
- package/dist/config/runtime.js +1 -238
- package/dist/customer/customer-advice.js +1 -130
- package/dist/customer/index.js +1 -11
- package/dist/customer/industry-risks.js +1 -438
- package/dist/customer/info-puzzle.js +1 -681
- package/dist/customer/order-monitor.js +1 -328
- package/dist/customer/order-strategy.js +1 -373
- package/dist/customer/post-purchase.js +1 -351
- package/dist/customer/preorder-compare.js +1 -34
- package/dist/customer/reminder-system.js +1 -316
- package/dist/customer/risk-assessment.js +1 -397
- package/dist/customer/types.js +1 -13
- package/dist/customer/user-preferences.js +1 -460
- package/dist/evaluation/arbitration-game.d.ts +9 -2
- package/dist/evaluation/arbitration-game.js +1 -48
- package/dist/evaluation/builtins/demand-match.js +1 -153
- package/dist/evaluation/builtins/index.js +1 -10
- package/dist/evaluation/builtins/service-risk.js +1 -55
- package/dist/evaluation/capability.js +1 -13
- package/dist/evaluation/composer.js +1 -40
- package/dist/evaluation/engine.js +1 -175
- package/dist/evaluation/extract.js +1 -115
- package/dist/evaluation/game-strategy.d.ts +27 -0
- package/dist/evaluation/game-strategy.js +1 -0
- package/dist/evaluation/gap.js +1 -100
- package/dist/evaluation/index.d.ts +1 -0
- package/dist/evaluation/index.js +1 -11
- package/dist/evaluation/node-game.d.ts +31 -3
- package/dist/evaluation/node-game.js +1 -57
- package/dist/evaluation/region.js +1 -36
- package/dist/evaluation/types.d.ts +1 -0
- package/dist/evaluation/types.js +1 -1
- package/dist/evaluation/user-injection.js +1 -27
- package/dist/experience/experience-reuse.js +1 -103
- package/dist/experience/index.js +1 -5
- package/dist/experience/intent-distill.js +1 -83
- package/dist/experience/realtime-feedback.js +1 -94
- package/dist/experience/types.js +1 -1
- package/dist/experience/user-profile.js +1 -171
- package/dist/extensions/business-modules.js +1 -287
- package/dist/extensions/capability-manifest.js +1 -781
- package/dist/extensions/constraint-registry.js +1 -198
- package/dist/extensions/index.js +1 -6
- package/dist/extensions/metric-registry.js +1 -257
- package/dist/extensions/mode-evaluator.js +1 -170
- package/dist/extensions/modes.js +1 -499
- package/dist/extensions/registry.js +1 -717
- package/dist/extensions/types.js +1 -1
- package/dist/harness/auto-escalation.js +1 -68
- package/dist/harness/checkpoint.js +1 -129
- package/dist/harness/index.js +1 -78
- package/dist/harness/plan.js +1 -315
- package/dist/harness/recover.js +1 -139
- package/dist/harness/types.js +1 -1
- package/dist/harness/verify.js +1 -237
- package/dist/index.js +1 -273
- package/dist/intent/enrich.js +1 -67
- package/dist/intent/index.js +1 -60
- package/dist/intent/matcher.js +1 -81
- package/dist/intent/store.js +1 -55
- package/dist/intent/types.js +1 -10
- package/dist/knowledge/acquisition-flywheel.js +1 -192
- package/dist/knowledge/allocation-confirm.js +1 -534
- package/dist/knowledge/allocation-context.js +1 -249
- package/dist/knowledge/allocation-ledger.js +1 -463
- package/dist/knowledge/allocation-puzzle.js +1 -298
- package/dist/knowledge/allocation-risk.js +1 -568
- package/dist/knowledge/allocation-templates.js +1 -970
- package/dist/knowledge/allocation-translation.js +1 -585
- package/dist/knowledge/arb-risk.js +1 -210
- package/dist/knowledge/arbitration-confirm.js +1 -559
- package/dist/knowledge/arbitration-context.js +1 -505
- package/dist/knowledge/arbitration-ledger.js +1 -521
- package/dist/knowledge/arbitration-puzzle.js +1 -304
- package/dist/knowledge/arbitration-risk.js +1 -423
- package/dist/knowledge/arbitration-templates.js +1 -276
- package/dist/knowledge/arbitration-translation.js +1 -487
- package/dist/knowledge/arbitration-trust.js +1 -117
- package/dist/knowledge/audit-rules.js +1 -141
- package/dist/knowledge/bridge-risk.js +1 -263
- package/dist/knowledge/contact-risk.js +1 -200
- package/dist/knowledge/contact-templates.js +1 -60
- package/dist/knowledge/demand-confirm.js +1 -206
- package/dist/knowledge/demand-matching.js +1 -132
- package/dist/knowledge/demand-risk.js +1 -240
- package/dist/knowledge/demand-translation.js +1 -354
- package/dist/knowledge/deployment-scanner.js +1 -823
- package/dist/knowledge/dynamic-pricing.js +1 -87
- package/dist/knowledge/examples-scanner-cli.js +1 -26
- package/dist/knowledge/examples-scanner.js +1 -843
- package/dist/knowledge/flywheel-loop.js +1 -404
- package/dist/knowledge/fund-layer.js +1 -973
- package/dist/knowledge/glossary.js +1 -211
- package/dist/knowledge/guard-confirm.js +1 -406
- package/dist/knowledge/guard-context.js +1 -287
- package/dist/knowledge/guard-design-patterns.js +1 -360
- package/dist/knowledge/guard-ledger.js +1 -260
- package/dist/knowledge/guard-lint.js +1 -670
- package/dist/knowledge/guard-migration.js +1 -228
- package/dist/knowledge/guard-puzzle.js +1 -805
- package/dist/knowledge/guard-render.js +1 -700
- package/dist/knowledge/guard-risk.js +1 -1879
- package/dist/knowledge/guard-submission-prompt.js +1 -171
- package/dist/knowledge/guard-templates.js +1 -1105
- package/dist/knowledge/guard-translation.js +1 -1119
- package/dist/knowledge/index.js +1 -436
- package/dist/knowledge/industry-evolution.js +1 -323
- package/dist/knowledge/industry-generalizer.js +1 -381
- package/dist/knowledge/industry-registry.js +1 -174
- package/dist/knowledge/intent-metrics.d.ts +4 -3
- package/dist/knowledge/intent-metrics.js +1 -566
- package/dist/knowledge/machine-confirm.js +1 -559
- package/dist/knowledge/machine-context.js +1 -833
- package/dist/knowledge/machine-ledger.js +1 -338
- package/dist/knowledge/machine-puzzle.js +1 -494
- package/dist/knowledge/machine-render.js +1 -565
- package/dist/knowledge/machine-risk.js +1 -669
- package/dist/knowledge/machine-templates.js +1 -1597
- package/dist/knowledge/machine-topology.js +1 -234
- package/dist/knowledge/machine-translation.js +1 -513
- package/dist/knowledge/mcp-schema-audit-cli.js +1 -45
- package/dist/knowledge/mcp-schema-audit.js +1 -777
- package/dist/knowledge/onchain-constants.js +1 -35
- package/dist/knowledge/order-confirm.js +1 -573
- package/dist/knowledge/order-context.js +1 -390
- package/dist/knowledge/order-ledger.js +1 -341
- package/dist/knowledge/order-puzzle.js +1 -255
- package/dist/knowledge/order-risk.js +1 -653
- package/dist/knowledge/order-templates.js +1 -368
- package/dist/knowledge/order-translation.js +1 -550
- package/dist/knowledge/overrides-loader.js +1 -65
- package/dist/knowledge/passport-confirm.js +1 -531
- package/dist/knowledge/passport-context.js +1 -306
- package/dist/knowledge/passport-ledger.js +1 -282
- package/dist/knowledge/passport-puzzle.js +1 -333
- package/dist/knowledge/passport-risk.js +1 -450
- package/dist/knowledge/passport-templates.js +1 -568
- package/dist/knowledge/passport-translation.js +1 -516
- package/dist/knowledge/payment-risk.js +1 -249
- package/dist/knowledge/permission-confirm.js +1 -426
- package/dist/knowledge/permission-context.js +1 -224
- package/dist/knowledge/permission-ledger.js +1 -403
- package/dist/knowledge/permission-puzzle.js +1 -173
- package/dist/knowledge/permission-risk.js +1 -411
- package/dist/knowledge/permission-templates.js +1 -234
- package/dist/knowledge/permission-translation.js +1 -350
- package/dist/knowledge/personal-risk.js +1 -212
- package/dist/knowledge/process-model.js +1 -160
- package/dist/knowledge/progress-confirm.js +1 -456
- package/dist/knowledge/progress-context.js +1 -452
- package/dist/knowledge/progress-ledger.js +1 -330
- package/dist/knowledge/progress-puzzle.js +1 -219
- package/dist/knowledge/progress-risk.js +1 -461
- package/dist/knowledge/progress-templates.js +1 -228
- package/dist/knowledge/progress-translation.js +1 -405
- package/dist/knowledge/proof-confirm.js +1 -187
- package/dist/knowledge/proof-risk.js +1 -207
- package/dist/knowledge/proof-translation.js +1 -283
- package/dist/knowledge/registrar-risk.js +1 -217
- package/dist/knowledge/repository-confirm.js +1 -286
- package/dist/knowledge/repository-risk.js +1 -373
- package/dist/knowledge/repository-translation.js +1 -445
- package/dist/knowledge/reputation-rules.js +1 -99
- package/dist/knowledge/resource-risk.js +1 -157
- package/dist/knowledge/reward-confirm.js +1 -526
- package/dist/knowledge/reward-context.js +1 -504
- package/dist/knowledge/reward-ledger.js +1 -502
- package/dist/knowledge/reward-puzzle.js +1 -300
- package/dist/knowledge/reward-risk.js +1 -627
- package/dist/knowledge/reward-templates.js +1 -197
- package/dist/knowledge/reward-translation.js +1 -501
- package/dist/knowledge/safety-rules.js +1 -404
- package/dist/knowledge/scenario-modes.js +1 -321
- package/dist/knowledge/service-confirm.js +1 -807
- package/dist/knowledge/service-context.js +1 -403
- package/dist/knowledge/service-ledger.js +1 -609
- package/dist/knowledge/service-puzzle.js +1 -236
- package/dist/knowledge/service-risk.js +1 -651
- package/dist/knowledge/service-templates.js +1 -456
- package/dist/knowledge/service-translation.js +1 -622
- package/dist/knowledge/template-registry.js +1 -353
- package/dist/knowledge/tool-constraints.js +1 -195
- package/dist/knowledge/tools-reference.js +1 -178
- package/dist/knowledge/treasury-confirm.js +1 -512
- package/dist/knowledge/treasury-context.js +1 -363
- package/dist/knowledge/treasury-ledger.js +1 -300
- package/dist/knowledge/treasury-puzzle.js +1 -216
- package/dist/knowledge/treasury-risk.js +1 -440
- package/dist/knowledge/treasury-templates.js +1 -358
- package/dist/knowledge/treasury-translation.js +1 -498
- package/dist/knowledge/trust-metrics.js +1 -198
- package/dist/knowledge/util-risk.js +1 -135
- package/dist/loop-engineering/aggregate.js +1 -132
- package/dist/loop-engineering/context-collect.js +1 -83
- package/dist/loop-engineering/diagnose.js +1 -273
- package/dist/loop-engineering/improve.js +1 -405
- package/dist/loop-engineering/index.js +1 -4
- package/dist/loop-engineering/pipeline.js +1 -56
- package/dist/mode-market/index.js +1 -3
- package/dist/mode-market/registry.js +1 -124
- package/dist/mode-market/review.js +1 -214
- package/dist/mode-market/submission.js +1 -85
- package/dist/participation/collaborator-interest.d.ts +23 -0
- package/dist/participation/collaborator-interest.js +1 -0
- package/dist/participation/customer-interest.d.ts +25 -0
- package/dist/participation/customer-interest.js +1 -0
- package/dist/participation/merchant-interest.js +1 -100
- package/dist/participation/radar-core.d.ts +13 -3
- package/dist/participation/radar-core.js +1 -269
- package/dist/participation/supplier-interest.d.ts +25 -0
- package/dist/participation/supplier-interest.js +1 -0
- package/dist/persona/analyzer.js +1 -66
- package/dist/persona/bridge.js +1 -86
- package/dist/persona/defaults.js +1 -195
- package/dist/persona/experience-bridge.js +1 -23
- package/dist/persona/index.js +1 -71
- package/dist/persona/model.js +1 -111
- package/dist/persona/store.js +1 -62
- package/dist/persona/types.d.ts +3 -1
- package/dist/persona/types.js +1 -5
- package/dist/project/business-puzzle.js +1 -383
- package/dist/project/context-assembly.js +1 -254
- package/dist/project/deployment-bridge.js +1 -120
- package/dist/project/deployment-doc.js +1 -1126
- package/dist/project/edit-planner.js +1 -1342
- package/dist/project/evaluation.js +1 -2011
- package/dist/project/game-theory.js +1 -177
- package/dist/project/graph-builder.js +1 -656
- package/dist/project/graph.js +1 -340
- package/dist/project/handlers.js +1 -1784
- package/dist/project/index.d.ts +1 -0
- package/dist/project/index.js +1 -301
- package/dist/project/intent-analyzer.js +1 -149
- package/dist/project/machine-nodes.js +1 -36
- package/dist/project/merchant-guide.js +1 -264
- package/dist/project/migration.js +1 -125
- package/dist/project/mode-actions.js +1 -309
- package/dist/project/namespace.js +1 -206
- package/dist/project/participation-radar.js +1 -428
- package/dist/project/pipeline-actions.js +1 -109
- package/dist/project/project-store.js +1 -422
- package/dist/project/query.js +1 -153
- package/dist/project/reverse-mapping.d.ts +34 -0
- package/dist/project/reverse-mapping.js +1 -0
- package/dist/project/risk-aggregator.js +1 -295
- package/dist/project/rollback-policy.js +1 -290
- package/dist/project/semantic-assembler.js +1 -345
- package/dist/project/semantic-graph.js +1 -292
- package/dist/project/stage-gate.js +1 -369
- package/dist/project/substep-trace.js +1 -332
- package/dist/project/task-tracker.js +1 -78
- package/dist/role/derivation.d.ts +18 -0
- package/dist/role/derivation.js +1 -0
- package/dist/role/index.d.ts +5 -0
- package/dist/role/index.js +1 -0
- package/dist/role/model.d.ts +8 -0
- package/dist/role/model.js +1 -0
- package/dist/role/resolution.d.ts +11 -0
- package/dist/role/resolution.js +1 -0
- package/dist/role/types.d.ts +11 -0
- package/dist/role/types.js +1 -0
- package/dist/rules.js +1 -52
- package/dist/safety/confirm-gate.js +1 -88
- package/dist/safety/index.js +1 -3
- package/dist/safety/preview.js +1 -52
- package/dist/schema/call/allocation.js +1 -34
- package/dist/schema/call/arbitration.js +1 -113
- package/dist/schema/call/base.d.ts +15 -15
- package/dist/schema/call/base.js +1 -370
- package/dist/schema/call/bridge-handler.js +1 -265
- package/dist/schema/call/bridge.d.ts +7 -7
- package/dist/schema/call/bridge.js +1 -458
- package/dist/schema/call/contact.js +1 -37
- package/dist/schema/call/demand.js +1 -47
- package/dist/schema/call/guard.js +1 -161
- package/dist/schema/call/handler.js +1 -322
- package/dist/schema/call/index.js +1 -20
- package/dist/schema/call/machine.js +1 -193
- package/dist/schema/call/order.js +1 -35
- package/dist/schema/call/payment.js +1 -37
- package/dist/schema/call/permission-handler.js +1 -54
- package/dist/schema/call/permission.js +1 -105
- package/dist/schema/call/personal.js +1 -78
- package/dist/schema/call/progress.js +1 -47
- package/dist/schema/call/proof.js +1 -33
- package/dist/schema/call/repository.js +1 -77
- package/dist/schema/call/reward.js +1 -30
- package/dist/schema/call/semantic.js +1 -1679
- package/dist/schema/call/service.js +1 -184
- package/dist/schema/call/treasury.js +1 -71
- package/dist/schema/common/index.js +1 -407
- package/dist/schema/config/index.js +1 -68
- package/dist/schema/evaluation/index.d.ts +213 -16
- package/dist/schema/evaluation/index.js +1 -356
- package/dist/schema/index.js +1 -17
- package/dist/schema/intent-radar/index.d.ts +13 -13
- package/dist/schema/intent-radar/index.js +1 -89
- package/dist/schema/local/index.d.ts +21 -21
- package/dist/schema/local/index.js +1 -927
- package/dist/schema/local/wip.js +1 -187
- package/dist/schema/messenger/index.d.ts +7 -7
- package/dist/schema/messenger/index.js +1 -475
- package/dist/schema/operations.d.ts +7 -7
- package/dist/schema/operations.js +1 -520
- package/dist/schema/persona/index.d.ts +54 -54
- package/dist/schema/persona/index.js +1 -148
- package/dist/schema/project/index.d.ts +94 -48
- package/dist/schema/project/index.js +1 -2057
- package/dist/schema/query/index.d.ts +423 -7
- package/dist/schema/query/index.js +1 -1646
- package/dist/schema/schema-query/index.js +1 -104
- package/dist/schema/schema-version.js +1 -76
- package/dist/schema/sync-layer4.js +1 -286
- package/dist/schema/task-status.js +1 -36
- package/dist/schema/trust/index.js +1 -314
- package/dist/schema/utils/guard-parser.js +1 -419
- package/dist/schema/utils/guard-query-utils.js +1 -46
- package/dist/schema/utils/node-parser.js +1 -369
- package/dist/schema/utils/object-type-utils.js +1 -35
- package/dist/schema/utils/permission-index-utils.js +1 -7
- package/dist/schema/utils/permission-machine-check.js +1 -121
- package/dist/schema/utils/skills-recommendation.js +1 -77
- package/dist/schema-query/index.js +1 -810
- package/dist/schemas/account_operation.output.json +5 -2
- package/dist/schemas/bridge_operation.output.json +5 -2
- package/dist/schemas/evaluation_operation.output.json +112 -7
- package/dist/schemas/evaluation_operation.schema.json +93 -6
- package/dist/schemas/index.json +1 -1
- package/dist/schemas/intent_radar.output.json +4 -1
- package/dist/schemas/intent_radar.schema.json +4 -1
- package/dist/schemas/local_info_operation.output.json +5 -2
- package/dist/schemas/local_mark_operation.output.json +5 -2
- package/dist/schemas/messenger_operation.output.json +5 -2
- package/dist/schemas/onchain_events.output.json +5 -2
- package/dist/schemas/onchain_operations.output.json +5 -2
- package/dist/schemas/onchain_operations.schema.json +4 -4
- package/dist/schemas/onchain_operations_allocation.schema.json +1 -1
- package/dist/schemas/onchain_operations_machine.schema.json +2 -2
- package/dist/schemas/onchain_operations_service.schema.json +1 -1
- package/dist/schemas/onchain_table_data.output.json +6 -3
- package/dist/schemas/persona_operation.output.json +4 -1
- package/dist/schemas/persona_operation.schema.json +4 -1
- package/dist/schemas/project_operation.output.json +28 -8
- package/dist/schemas/query_toolkit.output.json +8 -5
- package/dist/schemas/wowok_buildin_info.output.json +132 -0
- package/dist/schemas/wowok_buildin_info.schema.json +14 -0
- package/dist/telemetry/index.js +1 -112
- package/dist/telemetry/redact.js +1 -23
- package/dist/telemetry/storage.js +1 -80
- package/dist/tools/handlers/bridge.js +1 -1
- package/dist/tools/handlers/config.js +1 -74
- package/dist/tools/handlers/evaluation.js +1 -123
- package/dist/tools/handlers/file-export.js +1 -90
- package/dist/tools/handlers/intent-radar.js +1 -76
- package/dist/tools/handlers/local.js +1 -53
- package/dist/tools/handlers/messenger.js +1 -188
- package/dist/tools/handlers/onchain.js +1 -1180
- package/dist/tools/handlers/persona.js +1 -89
- package/dist/tools/handlers/project.js +1 -211
- package/dist/tools/handlers/query.js +1 -434
- package/dist/tools/handlers/schema-query.js +1 -176
- package/dist/tools/handlers/task-status.js +1 -26
- package/dist/tools/handlers/trust.js +1 -380
- package/dist/tools/handlers/wip.js +1 -90
- package/dist/tools/index.js +1 -1382
- package/dist/tools/retry.js +1 -85
- package/dist/tools/rules-hook.js +1 -23
- package/dist/tools/shared.js +1 -130
- package/dist/tools/types.js +1 -1
- package/dist/tools/upgrade-check.d.ts +19 -0
- package/dist/tools/upgrade-check.js +1 -0
- package/dist/tools/wip-deploy-assist.js +1 -306
- package/dist/tools/wrap.js +1 -500
- package/package.json +4 -2
|
@@ -1,381 +1 @@
|
|
|
1
|
-
import { getIndustryProfile, listIndustries, registerIndustry, } from "./industry-registry.js";
|
|
2
|
-
const TRAIT_INFERENCE_RULES = [
|
|
3
|
-
{ keywords: ["logistics", "shipping", "delivery", "express", "shipment", "ship"],
|
|
4
|
-
trait: "has_logistics", value: true, weight: 0.85 },
|
|
5
|
-
{ keywords: ["digital", "online", "cloud", "virtual"],
|
|
6
|
-
trait: "has_logistics", value: false, weight: 0.7 },
|
|
7
|
-
{ keywords: ["consulting", "communication", "requirement-confirmation", "revision-rounds", "negotiate", "consult"],
|
|
8
|
-
trait: "communication_heavy", value: true, weight: 0.8 },
|
|
9
|
-
{ keywords: ["standard-product", "in-stock", "one-click-order", "standard", "instant"],
|
|
10
|
-
trait: "communication_heavy", value: false, weight: 0.7 },
|
|
11
|
-
{ keywords: ["digital", "file", "code", "design-draft", "electronic", "online", "software", "source"],
|
|
12
|
-
trait: "pure_digital", value: true, weight: 0.8 },
|
|
13
|
-
{ keywords: ["physical", "hardware", "equipment"],
|
|
14
|
-
trait: "pure_digital", value: false, weight: 0.75 },
|
|
15
|
-
{ keywords: ["course", "semester", "long-cycle", "long-term", "project-based", "project"],
|
|
16
|
-
trait: "long_cycle", value: true, weight: 0.75 },
|
|
17
|
-
{ keywords: ["instant", "in-stock", "same-day", "immediate"],
|
|
18
|
-
trait: "long_cycle", value: false, weight: 0.8 },
|
|
19
|
-
{ keywords: ["rental", "rent", "deposit", "lease"],
|
|
20
|
-
trait: "deposit_required", value: true, weight: 0.9 },
|
|
21
|
-
{ keywords: ["purchase", "buyout", "buy"],
|
|
22
|
-
trait: "deposit_required", value: false, weight: 0.6 },
|
|
23
|
-
{ keywords: ["multi-party", "segmented", "multi-stage", "multi-vendor", "itinerary", "segment"],
|
|
24
|
-
trait: "multi_tier_allocation", value: true, weight: 0.75 },
|
|
25
|
-
{ keywords: ["medical", "legal", "financial", "insurance", "pharmaceutical", "pharma"],
|
|
26
|
-
trait: "regulatory_intensity", value: "high", weight: 0.9 },
|
|
27
|
-
{ keywords: ["education", "food", "construction"],
|
|
28
|
-
trait: "regulatory_intensity", value: "medium", weight: 0.7 },
|
|
29
|
-
{ keywords: ["entertainment", "gaming", "digital", "game"],
|
|
30
|
-
trait: "regulatory_intensity", value: "low", weight: 0.6 },
|
|
31
|
-
{ keywords: ["custom", "high-value", "customized", "bespoke"],
|
|
32
|
-
trait: "trust_sensitivity", value: "high", weight: 0.8 },
|
|
33
|
-
{ keywords: ["standard-product", "small-ticket", "standard", "low-value"],
|
|
34
|
-
trait: "trust_sensitivity", value: "low", weight: 0.7 },
|
|
35
|
-
{ keywords: ["subscription", "membership", "recurring"],
|
|
36
|
-
trait: "consumption_frequency", value: "frequent", weight: 0.85 },
|
|
37
|
-
{ keywords: ["course", "semester", "education"],
|
|
38
|
-
trait: "consumption_frequency", value: "one_time", weight: 0.75 },
|
|
39
|
-
{ keywords: ["daily", "frequent", "common"],
|
|
40
|
-
trait: "consumption_frequency", value: "frequent", weight: 0.75 },
|
|
41
|
-
{ keywords: ["small-ticket", "daily", "convenience-store", "micro"],
|
|
42
|
-
trait: "avg_ticket_size", value: "micro", weight: 0.7 },
|
|
43
|
-
{ keywords: ["retail", "commodity", "standard-product"],
|
|
44
|
-
trait: "avg_ticket_size", value: "small", weight: 0.7 },
|
|
45
|
-
{ keywords: ["custom", "project", "outsourcing"],
|
|
46
|
-
trait: "avg_ticket_size", value: "medium", weight: 0.7 },
|
|
47
|
-
{ keywords: ["real-estate", "automobile", "high-value", "luxury", "realestate", "car"],
|
|
48
|
-
trait: "avg_ticket_size", value: "large", weight: 0.85 },
|
|
49
|
-
];
|
|
50
|
-
export const DEFAULT_TRAITS = {
|
|
51
|
-
has_logistics: false,
|
|
52
|
-
communication_heavy: false,
|
|
53
|
-
pure_digital: false,
|
|
54
|
-
long_cycle: false,
|
|
55
|
-
deposit_required: false,
|
|
56
|
-
multi_tier_allocation: false,
|
|
57
|
-
regulatory_intensity: "low",
|
|
58
|
-
trust_sensitivity: "medium",
|
|
59
|
-
consumption_frequency: "occasional",
|
|
60
|
-
avg_ticket_size: "small",
|
|
61
|
-
};
|
|
62
|
-
export function inferTraitsFromDescription(description) {
|
|
63
|
-
const text = (description ?? "").toLowerCase();
|
|
64
|
-
const matched = [];
|
|
65
|
-
const traitConfidence = new Map();
|
|
66
|
-
const traitValue = new Map();
|
|
67
|
-
for (const rule of TRAIT_INFERENCE_RULES) {
|
|
68
|
-
const hit = rule.keywords.find((k) => text.includes(k.toLowerCase()));
|
|
69
|
-
if (hit) {
|
|
70
|
-
matched.push(hit);
|
|
71
|
-
const prev = traitConfidence.get(rule.trait) ?? 0;
|
|
72
|
-
if (rule.weight > prev) {
|
|
73
|
-
traitConfidence.set(rule.trait, rule.weight);
|
|
74
|
-
traitValue.set(rule.trait, rule.value);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
const traits = { ...DEFAULT_TRAITS };
|
|
79
|
-
for (const [k, v] of traitValue.entries()) {
|
|
80
|
-
traits[k] = v;
|
|
81
|
-
}
|
|
82
|
-
const hitCount = traitConfidence.size;
|
|
83
|
-
const confidence = Math.min(1, hitCount / 10);
|
|
84
|
-
return {
|
|
85
|
-
traits,
|
|
86
|
-
confidence,
|
|
87
|
-
matched_keywords: Array.from(new Set(matched)),
|
|
88
|
-
trait_confidence: Object.fromEntries(traitConfidence),
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
export function findSimilarIndustries(traits, limit) {
|
|
92
|
-
const all = listIndustries({ source: "builtin" });
|
|
93
|
-
const results = [];
|
|
94
|
-
for (const profile of all) {
|
|
95
|
-
const other = profile.traits;
|
|
96
|
-
let score = 0;
|
|
97
|
-
const matched = [];
|
|
98
|
-
const booleanKeys = [
|
|
99
|
-
"has_logistics", "communication_heavy", "pure_digital",
|
|
100
|
-
"long_cycle", "deposit_required", "multi_tier_allocation",
|
|
101
|
-
];
|
|
102
|
-
for (const k of booleanKeys) {
|
|
103
|
-
if (traits[k] === other[k]) {
|
|
104
|
-
score += 1;
|
|
105
|
-
matched.push(k);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
const enumKeys = [
|
|
109
|
-
"regulatory_intensity", "trust_sensitivity",
|
|
110
|
-
"consumption_frequency", "avg_ticket_size",
|
|
111
|
-
];
|
|
112
|
-
for (const k of enumKeys) {
|
|
113
|
-
if (traits[k] === other[k]) {
|
|
114
|
-
score += 1;
|
|
115
|
-
matched.push(k);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
results.push({
|
|
119
|
-
industry: profile.name,
|
|
120
|
-
similarity: score / 10,
|
|
121
|
-
matched_traits: matched,
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
results.sort((a, b) => b.similarity - a.similarity);
|
|
125
|
-
return typeof limit === "number" ? results.slice(0, Math.max(0, limit)) : results;
|
|
126
|
-
}
|
|
127
|
-
const FALLBACK_RISK_CHECK_RULES = [
|
|
128
|
-
{
|
|
129
|
-
trait_key: "deposit_required", trait_value: true,
|
|
130
|
-
check: {
|
|
131
|
-
id: "fb_deposit_lock", description: "Deposit lock-period safety (deposit cannot be withdrawn by merchant at any time)",
|
|
132
|
-
weight: 30,
|
|
133
|
-
passed: (p) => p?.fund_safety?.lock_duration_safe ?? false,
|
|
134
|
-
advice: "⚠️ Lock period unsafe: deposit may be withdrawn at any time; recommend requiring a lock period ≥ 7 days.",
|
|
135
|
-
},
|
|
136
|
-
need: {
|
|
137
|
-
id: "need_deposit_lock", tier: "personalized",
|
|
138
|
-
description: "Deposit lock-period safety",
|
|
139
|
-
satisfied: (p) => p?.fund_safety?.lock_duration_safe ?? false,
|
|
140
|
-
advice: "Deposit lock-period unsafe.",
|
|
141
|
-
},
|
|
142
|
-
},
|
|
143
|
-
{
|
|
144
|
-
trait_key: "has_logistics", trait_value: true,
|
|
145
|
-
check: {
|
|
146
|
-
id: "fb_logistics_track", description: "Logistics Guard configuration (shipping/receipt verification)",
|
|
147
|
-
weight: 25,
|
|
148
|
-
passed: (p) => p?.workflow_analysis?.has_milestone_nodes ?? false,
|
|
149
|
-
advice: "⚠️ No logistics Guard: shipping and receipt status are not verified by a third party.",
|
|
150
|
-
},
|
|
151
|
-
},
|
|
152
|
-
{
|
|
153
|
-
trait_key: "pure_digital", trait_value: true,
|
|
154
|
-
check: {
|
|
155
|
-
id: "fb_wip_verified", description: "WIP hash verification (digital deliverables traceable)",
|
|
156
|
-
weight: 25,
|
|
157
|
-
passed: (p) => p?.service_basics?.wip_verified === true,
|
|
158
|
-
advice: "⚠️ WIP not verified: digital deliverables cannot be traced.",
|
|
159
|
-
},
|
|
160
|
-
},
|
|
161
|
-
{
|
|
162
|
-
trait_key: "long_cycle", trait_value: true,
|
|
163
|
-
check: {
|
|
164
|
-
id: "fb_milestone", description: "Milestone nodes (phased acceptance)",
|
|
165
|
-
weight: 25,
|
|
166
|
-
passed: (p) => p?.workflow_analysis?.has_milestone_nodes ?? false,
|
|
167
|
-
advice: "⚠️ No milestone nodes: long-cycle projects lack phased acceptance.",
|
|
168
|
-
},
|
|
169
|
-
},
|
|
170
|
-
{
|
|
171
|
-
trait_key: "regulatory_intensity", trait_value: "high",
|
|
172
|
-
check: {
|
|
173
|
-
id: "fb_compliance", description: "Compliance configuration (arbitration + compensation fund)",
|
|
174
|
-
weight: 30,
|
|
175
|
-
passed: (p) => (p?.workflow_analysis?.has_arbitration_path ?? false) &&
|
|
176
|
-
(p?.service_basics?.compensation_fund_balance ?? 0n) > 0n,
|
|
177
|
-
advice: "🔴 Compliance requirement not met: highly regulated industries must configure arbitration and a compensation fund.",
|
|
178
|
-
},
|
|
179
|
-
},
|
|
180
|
-
{
|
|
181
|
-
trait_key: "multi_tier_allocation", trait_value: true,
|
|
182
|
-
check: {
|
|
183
|
-
id: "fb_multi_tier_fair", description: "Multi-tier allocation fairness (each segment has a corresponding Allocator)",
|
|
184
|
-
weight: 20,
|
|
185
|
-
passed: (p) => (p?.workflow_analysis?.total_nodes ?? 0) >= 3,
|
|
186
|
-
advice: "⚠️ Multi-tier allocation requires corresponding nodes and Allocators, otherwise fund distribution is opaque.",
|
|
187
|
-
},
|
|
188
|
-
},
|
|
189
|
-
];
|
|
190
|
-
function buildFallbackFlywheel(name, traits) {
|
|
191
|
-
const sellingPoints = ["Fund escrow + process transparency"];
|
|
192
|
-
if (traits.deposit_required)
|
|
193
|
-
sellingPoints.push("Deposit escrow + lock-period guarantee");
|
|
194
|
-
if (traits.has_logistics)
|
|
195
|
-
sellingPoints.push("Logistics Guard verification");
|
|
196
|
-
if (traits.pure_digital)
|
|
197
|
-
sellingPoints.push("WIP digital deliverable traceability");
|
|
198
|
-
if (traits.regulatory_intensity === "high")
|
|
199
|
-
sellingPoints.push("Compliant arbitration + compensation fund guarantee");
|
|
200
|
-
const keyActions = [
|
|
201
|
-
{ action: "Set first-order Reward", purpose: "Attract new customers", mutableField: "rewards", metricToWatch: "New customer order rate" },
|
|
202
|
-
{ action: "Configure compensation_fund", purpose: "Improve trust score", mutableField: "compensation_fund", metricToWatch: "Trust score" },
|
|
203
|
-
];
|
|
204
|
-
if (traits.long_cycle) {
|
|
205
|
-
keyActions.push({ action: "Milestone Reward", purpose: "Incentivize completion of long-cycle projects", mutableField: "rewards", metricToWatch: "Completion rate" });
|
|
206
|
-
}
|
|
207
|
-
if (traits.consumption_frequency === "frequent") {
|
|
208
|
-
keyActions.push({ action: "Loyalty Reward", purpose: "Improve repurchase", mutableField: "rewards", metricToWatch: "Repurchase rate" });
|
|
209
|
-
}
|
|
210
|
-
return {
|
|
211
|
-
industry: name,
|
|
212
|
-
trustSellingPoints: sellingPoints,
|
|
213
|
-
keyActions,
|
|
214
|
-
rewardStrategy: "First-order reward + referral cashback" + (traits.consumption_frequency === "frequent" ? " + loyalty reward" : ""),
|
|
215
|
-
discountStrategy: traits.long_cycle ? "Long-term cooperation discount + tiered discount" : "First-order discount + spend-threshold discount",
|
|
216
|
-
trustDescription: sellingPoints.join(" + "),
|
|
217
|
-
};
|
|
218
|
-
}
|
|
219
|
-
function buildFallbackPreferenceTemplate(traits) {
|
|
220
|
-
return {
|
|
221
|
-
max_acceptable_cycle: traits.long_cycle ? 90 : 14,
|
|
222
|
-
response_time_expectation: traits.communication_heavy ? 4 : 12,
|
|
223
|
-
require_arbitration: traits.regulatory_intensity !== "low" || traits.trust_sensitivity === "high",
|
|
224
|
-
require_compensation_fund: traits.trust_sensitivity === "high" || traits.deposit_required,
|
|
225
|
-
risk_appetite: traits.trust_sensitivity === "high" ? "conservative" : "balanced",
|
|
226
|
-
delivery_speed_priority: traits.has_logistics && traits.consumption_frequency === "frequent" ? "urgent" : "normal",
|
|
227
|
-
after_sales_expectation: traits.trust_sensitivity === "high" ? "full" : "basic",
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
export function synthesizeProfile(traits, name) {
|
|
231
|
-
const similar = findSimilarIndustries(traits, 1);
|
|
232
|
-
const bestMatch = similar[0];
|
|
233
|
-
const reuseBasis = bestMatch && bestMatch.similarity >= 0.6
|
|
234
|
-
? getIndustryProfile(bestMatch.industry)
|
|
235
|
-
: undefined;
|
|
236
|
-
const industryName = name ?? `custom_${Date.now().toString(36)}`;
|
|
237
|
-
const displayName = name ?? `Custom Industry`;
|
|
238
|
-
const flywheel = reuseBasis
|
|
239
|
-
? { ...reuseBasis.flywheel, industry: industryName }
|
|
240
|
-
: buildFallbackFlywheel(industryName, traits);
|
|
241
|
-
const preferenceTemplate = reuseBasis
|
|
242
|
-
? {
|
|
243
|
-
...reuseBasis.preference_template,
|
|
244
|
-
max_acceptable_cycle: traits.long_cycle
|
|
245
|
-
? Math.max(reuseBasis.preference_template.max_acceptable_cycle, 90)
|
|
246
|
-
: reuseBasis.preference_template.max_acceptable_cycle,
|
|
247
|
-
require_compensation_fund: traits.trust_sensitivity === "high"
|
|
248
|
-
? true
|
|
249
|
-
: reuseBasis.preference_template.require_compensation_fund,
|
|
250
|
-
}
|
|
251
|
-
: buildFallbackPreferenceTemplate(traits);
|
|
252
|
-
const riskChecks = [];
|
|
253
|
-
const needs = [];
|
|
254
|
-
for (const rule of FALLBACK_RISK_CHECK_RULES) {
|
|
255
|
-
if (traits[rule.trait_key] === rule.trait_value) {
|
|
256
|
-
riskChecks.push({ ...rule.check, industry: industryName });
|
|
257
|
-
if (rule.need) {
|
|
258
|
-
needs.push({ ...rule.need });
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
if (riskChecks.length === 0) {
|
|
263
|
-
riskChecks.push({
|
|
264
|
-
id: "fb_basic_arbitration",
|
|
265
|
-
industry: industryName,
|
|
266
|
-
description: "Configure arbitration (basic dispute resolution)",
|
|
267
|
-
weight: 100,
|
|
268
|
-
passed: (p) => p?.workflow_analysis?.has_arbitration_path ?? false,
|
|
269
|
-
advice: "⚠️ No arbitration configured: basic disputes have no resolution channel.",
|
|
270
|
-
});
|
|
271
|
-
}
|
|
272
|
-
return {
|
|
273
|
-
name: industryName,
|
|
274
|
-
display_name: displayName,
|
|
275
|
-
traits,
|
|
276
|
-
source: "inferred",
|
|
277
|
-
version: "v1",
|
|
278
|
-
flywheel,
|
|
279
|
-
risk_checks: riskChecks,
|
|
280
|
-
preference_template: preferenceTemplate,
|
|
281
|
-
needs,
|
|
282
|
-
confidence: bestMatch?.similarity ?? 0.3,
|
|
283
|
-
evolution: {
|
|
284
|
-
version: 1,
|
|
285
|
-
last_updated: Date.now(),
|
|
286
|
-
signal_count: 0,
|
|
287
|
-
pending_suggestions: 0,
|
|
288
|
-
},
|
|
289
|
-
};
|
|
290
|
-
}
|
|
291
|
-
export function composeIndustries(names, newName) {
|
|
292
|
-
if (!names || names.length === 0)
|
|
293
|
-
return undefined;
|
|
294
|
-
const profiles = [];
|
|
295
|
-
for (const n of names) {
|
|
296
|
-
const p = getIndustryProfile(n);
|
|
297
|
-
if (!p)
|
|
298
|
-
return undefined;
|
|
299
|
-
profiles.push(p);
|
|
300
|
-
}
|
|
301
|
-
const composedTraits = {
|
|
302
|
-
has_logistics: profiles.some((p) => p.traits.has_logistics),
|
|
303
|
-
communication_heavy: profiles.some((p) => p.traits.communication_heavy),
|
|
304
|
-
pure_digital: profiles.every((p) => p.traits.pure_digital),
|
|
305
|
-
long_cycle: profiles.some((p) => p.traits.long_cycle),
|
|
306
|
-
deposit_required: profiles.some((p) => p.traits.deposit_required),
|
|
307
|
-
multi_tier_allocation: profiles.some((p) => p.traits.multi_tier_allocation),
|
|
308
|
-
regulatory_intensity: pickStrictest(profiles.map((p) => p.traits.regulatory_intensity), ["low", "medium", "high"]),
|
|
309
|
-
trust_sensitivity: pickStrictest(profiles.map((p) => p.traits.trust_sensitivity), ["low", "medium", "high"]),
|
|
310
|
-
consumption_frequency: pickStrictest(profiles.map((p) => p.traits.consumption_frequency), ["one_time", "occasional", "frequent"]),
|
|
311
|
-
avg_ticket_size: pickStrictest(profiles.map((p) => p.traits.avg_ticket_size), ["micro", "small", "medium", "large"]),
|
|
312
|
-
};
|
|
313
|
-
const newNameResolved = newName ?? `composed_${names.join("_and_")}`;
|
|
314
|
-
const sellingPoints = Array.from(new Set(profiles.flatMap((p) => p.flywheel.trustSellingPoints)));
|
|
315
|
-
const keyActions = Array.from(new Set(profiles.flatMap((p) => p.flywheel.keyActions)));
|
|
316
|
-
const flywheel = {
|
|
317
|
-
industry: newNameResolved,
|
|
318
|
-
trustSellingPoints: sellingPoints,
|
|
319
|
-
keyActions,
|
|
320
|
-
rewardStrategy: profiles.map((p) => p.flywheel.rewardStrategy).join(" + "),
|
|
321
|
-
discountStrategy: profiles.map((p) => p.flywheel.discountStrategy).join(" + "),
|
|
322
|
-
trustDescription: profiles.map((p) => p.flywheel.trustDescription).join(" + "),
|
|
323
|
-
};
|
|
324
|
-
const riskCheckMap = new Map();
|
|
325
|
-
for (const p of profiles) {
|
|
326
|
-
for (const c of p.risk_checks) {
|
|
327
|
-
if (!riskCheckMap.has(c.id)) {
|
|
328
|
-
riskCheckMap.set(c.id, { ...c, industry: newNameResolved });
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
const needMap = new Map();
|
|
333
|
-
for (const p of profiles) {
|
|
334
|
-
for (const n of p.needs) {
|
|
335
|
-
if (!needMap.has(n.id)) {
|
|
336
|
-
needMap.set(n.id, { ...n });
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
const prefTpl = {
|
|
341
|
-
max_acceptable_cycle: Math.max(...profiles.map((p) => p.preference_template.max_acceptable_cycle)),
|
|
342
|
-
response_time_expectation: Math.min(...profiles.map((p) => p.preference_template.response_time_expectation)),
|
|
343
|
-
require_arbitration: profiles.some((p) => p.preference_template.require_arbitration),
|
|
344
|
-
require_compensation_fund: profiles.some((p) => p.preference_template.require_compensation_fund),
|
|
345
|
-
risk_appetite: pickStrictest(profiles.map((p) => p.preference_template.risk_appetite), ["aggressive", "balanced", "conservative"]),
|
|
346
|
-
delivery_speed_priority: pickStrictest(profiles.map((p) => p.preference_template.delivery_speed_priority), ["flexible", "normal", "urgent"]),
|
|
347
|
-
after_sales_expectation: pickStrictest(profiles.map((p) => p.preference_template.after_sales_expectation), ["minimal", "basic", "full"]),
|
|
348
|
-
};
|
|
349
|
-
const composed = {
|
|
350
|
-
name: newNameResolved,
|
|
351
|
-
display_name: newName ?? `Composed Industry (${names.join("+")})`,
|
|
352
|
-
traits: composedTraits,
|
|
353
|
-
source: "composed",
|
|
354
|
-
version: "v1",
|
|
355
|
-
flywheel,
|
|
356
|
-
risk_checks: Array.from(riskCheckMap.values()),
|
|
357
|
-
preference_template: prefTpl,
|
|
358
|
-
needs: Array.from(needMap.values()),
|
|
359
|
-
parent_industries: [...names],
|
|
360
|
-
evolution: {
|
|
361
|
-
version: 1,
|
|
362
|
-
last_updated: Date.now(),
|
|
363
|
-
signal_count: 0,
|
|
364
|
-
pending_suggestions: 0,
|
|
365
|
-
},
|
|
366
|
-
};
|
|
367
|
-
registerIndustry(composed);
|
|
368
|
-
return composed;
|
|
369
|
-
}
|
|
370
|
-
function pickStrictest(values, strictness) {
|
|
371
|
-
let maxIdx = 0;
|
|
372
|
-
let result = values[0] ?? strictness[0];
|
|
373
|
-
for (const v of values) {
|
|
374
|
-
const idx = strictness.indexOf(v);
|
|
375
|
-
if (idx >= 0 && idx > maxIdx) {
|
|
376
|
-
maxIdx = idx;
|
|
377
|
-
result = v;
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
return result;
|
|
381
|
-
}
|
|
1
|
+
import{getIndustryProfile,listIndustries,registerIndustry}from'./industry-registry.js';const TRAIT_INFERENCE_RULES=[{'keywords':['logistics','shipping','delivery','express','shipment','ship'],'trait':'has_logistics','value':!![],'weight':0.85},{'keywords':['digital','online','cloud','virtual'],'trait':'has_logistics','value':![],'weight':0.7},{'keywords':['consulting','communication','requirement-confirmation','revision-rounds','negotiate','consult'],'trait':'communication_heavy','value':!![],'weight':0.8},{'keywords':['standard-product','in-stock','one-click-order','standard','instant'],'trait':'communication_heavy','value':![],'weight':0.7},{'keywords':['digital','file','code','design-draft','electronic','online','software','source'],'trait':'pure_digital','value':!![],'weight':0.8},{'keywords':['physical','hardware','equipment'],'trait':'pure_digital','value':![],'weight':0.75},{'keywords':['course','semester','long-cycle','long-term','project-based','project'],'trait':'long_cycle','value':!![],'weight':0.75},{'keywords':['instant','in-stock','same-day','immediate'],'trait':'long_cycle','value':![],'weight':0.8},{'keywords':['rental','rent','deposit','lease'],'trait':'deposit_required','value':!![],'weight':0.9},{'keywords':['purchase','buyout','buy'],'trait':'deposit_required','value':![],'weight':0.6},{'keywords':['multi-party','segmented','multi-stage','multi-vendor','itinerary','segment'],'trait':'multi_tier_allocation','value':!![],'weight':0.75},{'keywords':['medical','legal','financial','insurance','pharmaceutical','pharma'],'trait':'regulatory_intensity','value':'high','weight':0.9},{'keywords':['education','food','construction'],'trait':'regulatory_intensity','value':'medium','weight':0.7},{'keywords':['entertainment','gaming','digital','game'],'trait':'regulatory_intensity','value':'low','weight':0.6},{'keywords':['custom','high-value','customized','bespoke'],'trait':'trust_sensitivity','value':'high','weight':0.8},{'keywords':['standard-product','small-ticket','standard','low-value'],'trait':'trust_sensitivity','value':'low','weight':0.7},{'keywords':['subscription','membership','recurring'],'trait':'consumption_frequency','value':'frequent','weight':0.85},{'keywords':['course','semester','education'],'trait':'consumption_frequency','value':'one_time','weight':0.75},{'keywords':['daily','frequent','common'],'trait':'consumption_frequency','value':'frequent','weight':0.75},{'keywords':['small-ticket','daily','convenience-store','micro'],'trait':'avg_ticket_size','value':'micro','weight':0.7},{'keywords':['retail','commodity','standard-product'],'trait':'avg_ticket_size','value':'small','weight':0.7},{'keywords':['custom','project','outsourcing'],'trait':'avg_ticket_size','value':'medium','weight':0.7},{'keywords':['real-estate','automobile','high-value','luxury','realestate','car'],'trait':'avg_ticket_size','value':'large','weight':0.85}];export const DEFAULT_TRAITS={'has_logistics':![],'communication_heavy':![],'pure_digital':![],'long_cycle':![],'deposit_required':![],'multi_tier_allocation':![],'regulatory_intensity':'low','trust_sensitivity':'medium','consumption_frequency':'occasional','avg_ticket_size':'small'};export function inferTraitsFromDescription(a){const b=(a??'')['toLowerCase'](),c=[],d=new Map(),e=new Map();for(const i of TRAIT_INFERENCE_RULES){const j=i['keywords']['find'](l=>b['includes'](l['toLowerCase']()));if(j){c['push'](j);const l=d['get'](i['trait'])??0x0;i['weight']>l&&(d['set'](i['trait'],i['weight']),e['set'](i['trait'],i['value']));}}const f={...DEFAULT_TRAITS};for(const [m,n]of e['entries']()){f[m]=n;}const g=d['size'],h=Math['min'](0x1,g/0xa);return{'traits':f,'confidence':h,'matched_keywords':Array['from'](new Set(c)),'trait_confidence':Object['fromEntries'](d)};}export function findSimilarIndustries(a,b){const c=listIndustries({'source':'builtin'}),d=[];for(const e of c){const f=e['traits'];let g=0x0;const h=[],i=['has_logistics','communication_heavy','pure_digital','long_cycle','deposit_required','multi_tier_allocation'];for(const l of i){a[l]===f[l]&&(g+=0x1,h['push'](l));}const j=['regulatory_intensity','trust_sensitivity','consumption_frequency','avg_ticket_size'];for(const m of j){a[m]===f[m]&&(g+=0x1,h['push'](m));}d['push']({'industry':e['name'],'similarity':g/0xa,'matched_traits':h});}return d['sort']((n,o)=>o['similarity']-n['similarity']),typeof b==='number'?d['slice'](0x0,Math['max'](0x0,b)):d;}const FALLBACK_RISK_CHECK_RULES=[{'trait_key':'deposit_required','trait_value':!![],'check':{'id':'fb_deposit_lock','description':'Deposit\x20lock-period\x20safety\x20(deposit\x20cannot\x20be\x20withdrawn\x20by\x20merchant\x20at\x20any\x20time)','weight':0x1e,'passed':a=>a?.['fund_safety']?.['lock_duration_safe']??![],'advice':'⚠️\x20Lock\x20period\x20unsafe:\x20deposit\x20may\x20be\x20withdrawn\x20at\x20any\x20time;\x20recommend\x20requiring\x20a\x20lock\x20period\x20≥\x207\x20days.'},'need':{'id':'need_deposit_lock','tier':'personalized','description':'Deposit\x20lock-period\x20safety','satisfied':a=>a?.['fund_safety']?.['lock_duration_safe']??![],'advice':'Deposit\x20lock-period\x20unsafe.'}},{'trait_key':'has_logistics','trait_value':!![],'check':{'id':'fb_logistics_track','description':'Logistics\x20Guard\x20configuration\x20(shipping/receipt\x20verification)','weight':0x19,'passed':a=>a?.['workflow_analysis']?.['has_milestone_nodes']??![],'advice':'⚠️\x20No\x20logistics\x20Guard:\x20shipping\x20and\x20receipt\x20status\x20are\x20not\x20verified\x20by\x20a\x20third\x20party.'}},{'trait_key':'pure_digital','trait_value':!![],'check':{'id':'fb_wip_verified','description':'WIP\x20hash\x20verification\x20(digital\x20deliverables\x20traceable)','weight':0x19,'passed':a=>a?.['service_basics']?.['wip_verified']===!![],'advice':'⚠️\x20WIP\x20not\x20verified:\x20digital\x20deliverables\x20cannot\x20be\x20traced.'}},{'trait_key':'long_cycle','trait_value':!![],'check':{'id':'fb_milestone','description':'Milestone\x20nodes\x20(phased\x20acceptance)','weight':0x19,'passed':a=>a?.['workflow_analysis']?.['has_milestone_nodes']??![],'advice':'⚠️\x20No\x20milestone\x20nodes:\x20long-cycle\x20projects\x20lack\x20phased\x20acceptance.'}},{'trait_key':'regulatory_intensity','trait_value':'high','check':{'id':'fb_compliance','description':'Compliance\x20configuration\x20(arbitration\x20+\x20compensation\x20fund)','weight':0x1e,'passed':a=>(a?.['workflow_analysis']?.['has_arbitration_path']??![])&&(a?.['service_basics']?.['compensation_fund_balance']??0x0n)>0x0n,'advice':'🔴\x20Compliance\x20requirement\x20not\x20met:\x20highly\x20regulated\x20industries\x20must\x20configure\x20arbitration\x20and\x20a\x20compensation\x20fund.'}},{'trait_key':'multi_tier_allocation','trait_value':!![],'check':{'id':'fb_multi_tier_fair','description':'Multi-tier\x20allocation\x20fairness\x20(each\x20segment\x20has\x20a\x20corresponding\x20Allocator)','weight':0x14,'passed':a=>(a?.['workflow_analysis']?.['total_nodes']??0x0)>=0x3,'advice':'⚠️\x20Multi-tier\x20allocation\x20requires\x20corresponding\x20nodes\x20and\x20Allocators,\x20otherwise\x20fund\x20distribution\x20is\x20opaque.'}}];function buildFallbackFlywheel(a,b){const c=['Fund\x20escrow\x20+\x20process\x20transparency'];if(b['deposit_required'])c['push']('Deposit\x20escrow\x20+\x20lock-period\x20guarantee');if(b['has_logistics'])c['push']('Logistics\x20Guard\x20verification');if(b['pure_digital'])c['push']('WIP\x20digital\x20deliverable\x20traceability');if(b['regulatory_intensity']==='high')c['push']('Compliant\x20arbitration\x20+\x20compensation\x20fund\x20guarantee');const d=[{'action':'Set\x20first-order\x20Reward','purpose':'Attract\x20new\x20customers','mutableField':'rewards','metricToWatch':'New\x20customer\x20order\x20rate'},{'action':'Configure\x20compensation_fund','purpose':'Improve\x20trust\x20score','mutableField':'compensation_fund','metricToWatch':'Trust\x20score'}];return b['long_cycle']&&d['push']({'action':'Milestone\x20Reward','purpose':'Incentivize\x20completion\x20of\x20long-cycle\x20projects','mutableField':'rewards','metricToWatch':'Completion\x20rate'}),b['consumption_frequency']==='frequent'&&d['push']({'action':'Loyalty\x20Reward','purpose':'Improve\x20repurchase','mutableField':'rewards','metricToWatch':'Repurchase\x20rate'}),{'industry':a,'trustSellingPoints':c,'keyActions':d,'rewardStrategy':'First-order\x20reward\x20+\x20referral\x20cashback'+(b['consumption_frequency']==='frequent'?'\x20+\x20loyalty\x20reward':''),'discountStrategy':b['long_cycle']?'Long-term\x20cooperation\x20discount\x20+\x20tiered\x20discount':'First-order\x20discount\x20+\x20spend-threshold\x20discount','trustDescription':c['join']('\x20+\x20')};}function buildFallbackPreferenceTemplate(a){return{'max_acceptable_cycle':a['long_cycle']?0x5a:0xe,'response_time_expectation':a['communication_heavy']?0x4:0xc,'require_arbitration':a['regulatory_intensity']!=='low'||a['trust_sensitivity']==='high','require_compensation_fund':a['trust_sensitivity']==='high'||a['deposit_required'],'risk_appetite':a['trust_sensitivity']==='high'?'conservative':'balanced','delivery_speed_priority':a['has_logistics']&&a['consumption_frequency']==='frequent'?'urgent':'normal','after_sales_expectation':a['trust_sensitivity']==='high'?'full':'basic'};}export function synthesizeProfile(a,b){const c=findSimilarIndustries(a,0x1),d=c[0x0],e=d&&d['similarity']>=0.6?getIndustryProfile(d['industry']):undefined,f=b??'custom_'+Date['now']()['toString'](0x24),g=b??'Custom\x20Industry',h=e?{...e['flywheel'],'industry':f}:buildFallbackFlywheel(f,a),i=e?{...e['preference_template'],'max_acceptable_cycle':a['long_cycle']?Math['max'](e['preference_template']['max_acceptable_cycle'],0x5a):e['preference_template']['max_acceptable_cycle'],'require_compensation_fund':a['trust_sensitivity']==='high'?!![]:e['preference_template']['require_compensation_fund']}:buildFallbackPreferenceTemplate(a),j=[],k=[];for(const l of FALLBACK_RISK_CHECK_RULES){a[l['trait_key']]===l['trait_value']&&(j['push']({...l['check'],'industry':f}),l['need']&&k['push']({...l['need']}));}return j['length']===0x0&&j['push']({'id':'fb_basic_arbitration','industry':f,'description':'Configure\x20arbitration\x20(basic\x20dispute\x20resolution)','weight':0x64,'passed':m=>m?.['workflow_analysis']?.['has_arbitration_path']??![],'advice':'⚠️\x20No\x20arbitration\x20configured:\x20basic\x20disputes\x20have\x20no\x20resolution\x20channel.'}),{'name':f,'display_name':g,'traits':a,'source':'inferred','version':'v1','flywheel':h,'risk_checks':j,'preference_template':i,'needs':k,'confidence':d?.['similarity']??0.3,'evolution':{'version':0x1,'last_updated':Date['now'](),'signal_count':0x0,'pending_suggestions':0x0}};}export function composeIndustries(a,b){if(!a||a['length']===0x0)return undefined;const d=[];for(const o of a){const q=getIndustryProfile(o);if(!q)return undefined;d['push'](q);}const e={'has_logistics':d['some'](r=>r['traits']['has_logistics']),'communication_heavy':d['some'](r=>r['traits']['communication_heavy']),'pure_digital':d['every'](r=>r['traits']['pure_digital']),'long_cycle':d['some'](r=>r['traits']['long_cycle']),'deposit_required':d['some'](r=>r['traits']['deposit_required']),'multi_tier_allocation':d['some'](r=>r['traits']['multi_tier_allocation']),'regulatory_intensity':pickStrictest(d['map'](r=>r['traits']['regulatory_intensity']),['low','medium','high']),'trust_sensitivity':pickStrictest(d['map'](r=>r['traits']['trust_sensitivity']),['low','medium','high']),'consumption_frequency':pickStrictest(d['map'](r=>r['traits']['consumption_frequency']),['one_time','occasional','frequent']),'avg_ticket_size':pickStrictest(d['map'](r=>r['traits']['avg_ticket_size']),['micro','small','medium','large'])},f=b??'composed_'+a['join']('_and_'),g=Array['from'](new Set(d['flatMap'](r=>r['flywheel']['trustSellingPoints']))),h=Array['from'](new Set(d['flatMap'](r=>r['flywheel']['keyActions']))),i={'industry':f,'trustSellingPoints':g,'keyActions':h,'rewardStrategy':d['map'](r=>r['flywheel']['rewardStrategy'])['join']('\x20+\x20'),'discountStrategy':d['map'](r=>r['flywheel']['discountStrategy'])['join']('\x20+\x20'),'trustDescription':d['map'](r=>r['flywheel']['trustDescription'])['join']('\x20+\x20')},j=new Map();for(const r of d){for(const s of r['risk_checks']){!j['has'](s['id'])&&j['set'](s['id'],{...s,'industry':f});}}const k=new Map();for(const t of d){for(const u of t['needs']){!k['has'](u['id'])&&k['set'](u['id'],{...u});}}const l={'max_acceptable_cycle':Math['max'](...d['map'](v=>v['preference_template']['max_acceptable_cycle'])),'response_time_expectation':Math['min'](...d['map'](v=>v['preference_template']['response_time_expectation'])),'require_arbitration':d['some'](v=>v['preference_template']['require_arbitration']),'require_compensation_fund':d['some'](v=>v['preference_template']['require_compensation_fund']),'risk_appetite':pickStrictest(d['map'](v=>v['preference_template']['risk_appetite']),['aggressive','balanced','conservative']),'delivery_speed_priority':pickStrictest(d['map'](v=>v['preference_template']['delivery_speed_priority']),['flexible','normal','urgent']),'after_sales_expectation':pickStrictest(d['map'](v=>v['preference_template']['after_sales_expectation']),['minimal','basic','full'])},m={'name':f,'display_name':b??'Composed\x20Industry\x20('+a['join']('+')+')','traits':e,'source':'composed','version':'v1','flywheel':i,'risk_checks':Array['from'](j['values']()),'preference_template':l,'needs':Array['from'](k['values']()),'parent_industries':[...a],'evolution':{'version':0x1,'last_updated':Date['now'](),'signal_count':0x0,'pending_suggestions':0x0}};return registerIndustry(m),m;}function pickStrictest(a,b){let c=0x0,d=a[0x0]??b[0x0];for(const e of a){const f=b['indexOf'](e);f>=0x0&&f>c&&(c=f,d=e);}return d;}
|
|
@@ -1,174 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { getIndustryRiskChecks, getIndustryNeeds, getIndustryTemplate, SUPPORTED_INDUSTRIES } from "../customer/index.js";
|
|
3
|
-
import { _setRegistryLookup as setRisksLookup } from "../customer/industry-risks.js";
|
|
4
|
-
import { _setRegistryLookup as setPreferencesLookup } from "../customer/user-preferences.js";
|
|
5
|
-
const BUILTIN_TRAITS = {
|
|
6
|
-
freelance: {
|
|
7
|
-
has_logistics: false, communication_heavy: true, pure_digital: true,
|
|
8
|
-
long_cycle: false, deposit_required: false, multi_tier_allocation: false,
|
|
9
|
-
regulatory_intensity: "low", trust_sensitivity: "high",
|
|
10
|
-
consumption_frequency: "occasional", avg_ticket_size: "medium",
|
|
11
|
-
},
|
|
12
|
-
rental: {
|
|
13
|
-
has_logistics: true, communication_heavy: false, pure_digital: false,
|
|
14
|
-
long_cycle: false, deposit_required: true, multi_tier_allocation: false,
|
|
15
|
-
regulatory_intensity: "low", trust_sensitivity: "high",
|
|
16
|
-
consumption_frequency: "occasional", avg_ticket_size: "medium",
|
|
17
|
-
},
|
|
18
|
-
education: {
|
|
19
|
-
has_logistics: false, communication_heavy: true, pure_digital: false,
|
|
20
|
-
long_cycle: true, deposit_required: false, multi_tier_allocation: false,
|
|
21
|
-
regulatory_intensity: "medium", trust_sensitivity: "high",
|
|
22
|
-
consumption_frequency: "one_time", avg_ticket_size: "large",
|
|
23
|
-
},
|
|
24
|
-
travel: {
|
|
25
|
-
has_logistics: true, communication_heavy: true, pure_digital: false,
|
|
26
|
-
long_cycle: false, deposit_required: false, multi_tier_allocation: true,
|
|
27
|
-
regulatory_intensity: "medium", trust_sensitivity: "high",
|
|
28
|
-
consumption_frequency: "one_time", avg_ticket_size: "large",
|
|
29
|
-
},
|
|
30
|
-
subscription: {
|
|
31
|
-
has_logistics: false, communication_heavy: false, pure_digital: true,
|
|
32
|
-
long_cycle: false, deposit_required: false, multi_tier_allocation: false,
|
|
33
|
-
regulatory_intensity: "low", trust_sensitivity: "medium",
|
|
34
|
-
consumption_frequency: "frequent", avg_ticket_size: "small",
|
|
35
|
-
},
|
|
36
|
-
retail: {
|
|
37
|
-
has_logistics: true, communication_heavy: false, pure_digital: false,
|
|
38
|
-
long_cycle: false, deposit_required: false, multi_tier_allocation: false,
|
|
39
|
-
regulatory_intensity: "low", trust_sensitivity: "medium",
|
|
40
|
-
consumption_frequency: "frequent", avg_ticket_size: "small",
|
|
41
|
-
},
|
|
42
|
-
};
|
|
43
|
-
const BUILTIN_DISPLAY_NAMES = {
|
|
44
|
-
freelance: "Freelance",
|
|
45
|
-
rental: "Rental",
|
|
46
|
-
education: "Education",
|
|
47
|
-
travel: "Travel",
|
|
48
|
-
subscription: "Subscription",
|
|
49
|
-
retail: "Retail",
|
|
50
|
-
general: "General",
|
|
51
|
-
custom: "Custom",
|
|
52
|
-
};
|
|
53
|
-
const INDUSTRY_ALIASES = {
|
|
54
|
-
"outsourcing": "freelance",
|
|
55
|
-
"design": "freelance",
|
|
56
|
-
"development": "freelance",
|
|
57
|
-
"consulting": "freelance",
|
|
58
|
-
"rent": "rental",
|
|
59
|
-
"lease": "rental",
|
|
60
|
-
"course": "education",
|
|
61
|
-
"training": "education",
|
|
62
|
-
"tourism": "travel",
|
|
63
|
-
"itinerary": "travel",
|
|
64
|
-
"membership": "subscription",
|
|
65
|
-
"ecommerce": "retail",
|
|
66
|
-
"goods": "retail",
|
|
67
|
-
"freelancer": "freelance",
|
|
68
|
-
"gig": "freelance",
|
|
69
|
-
"edu": "education",
|
|
70
|
-
"trip": "travel",
|
|
71
|
-
"tour": "travel",
|
|
72
|
-
"subscribe": "subscription",
|
|
73
|
-
"shop": "retail",
|
|
74
|
-
"general_industry": "general",
|
|
75
|
-
};
|
|
76
|
-
export const INDUSTRY_REGISTRY_VERSION = 1;
|
|
77
|
-
const registry = new Map();
|
|
78
|
-
function seedBuiltinProfile(name) {
|
|
79
|
-
const traits = BUILTIN_TRAITS[name];
|
|
80
|
-
if (!traits)
|
|
81
|
-
return undefined;
|
|
82
|
-
const flywheel = getFlywheelForIndustry(name);
|
|
83
|
-
if (!flywheel)
|
|
84
|
-
return undefined;
|
|
85
|
-
const riskChecks = getIndustryRiskChecks(name);
|
|
86
|
-
const needs = getIndustryNeeds(name);
|
|
87
|
-
const preferenceTemplate = getIndustryTemplate(name);
|
|
88
|
-
return {
|
|
89
|
-
name,
|
|
90
|
-
display_name: BUILTIN_DISPLAY_NAMES[name] ?? name,
|
|
91
|
-
traits,
|
|
92
|
-
source: "builtin",
|
|
93
|
-
version: "v1",
|
|
94
|
-
flywheel,
|
|
95
|
-
risk_checks: riskChecks,
|
|
96
|
-
preference_template: preferenceTemplate,
|
|
97
|
-
needs,
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
function seedBuiltinIndustries() {
|
|
101
|
-
for (const name of SUPPORTED_INDUSTRIES) {
|
|
102
|
-
const profile = seedBuiltinProfile(name);
|
|
103
|
-
if (profile) {
|
|
104
|
-
registry.set(name, profile);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
seedBuiltinIndustries();
|
|
109
|
-
injectRegistryLookup();
|
|
110
|
-
function injectRegistryLookup() {
|
|
111
|
-
setFlywheelLookup((industry) => {
|
|
112
|
-
const p = registry.get(industry);
|
|
113
|
-
return p ? { flywheel: p.flywheel } : undefined;
|
|
114
|
-
});
|
|
115
|
-
setRisksLookup((industry) => {
|
|
116
|
-
const p = registry.get(industry);
|
|
117
|
-
return p ? { risk_checks: p.risk_checks, needs: p.needs } : undefined;
|
|
118
|
-
});
|
|
119
|
-
setPreferencesLookup((industry) => {
|
|
120
|
-
const p = registry.get(industry);
|
|
121
|
-
return p ? { preference_template: p.preference_template } : undefined;
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
export function getIndustryProfile(name) {
|
|
125
|
-
const p = registry.get(name);
|
|
126
|
-
return p ? JSON.parse(JSON.stringify(p)) : undefined;
|
|
127
|
-
}
|
|
128
|
-
export function listIndustries(filter) {
|
|
129
|
-
const all = Array.from(registry.values());
|
|
130
|
-
if (filter?.source) {
|
|
131
|
-
return all.filter((p) => p.source === filter.source);
|
|
132
|
-
}
|
|
133
|
-
return all;
|
|
134
|
-
}
|
|
135
|
-
export function registerIndustry(profile) {
|
|
136
|
-
if (!profile.name || !profile.traits || !profile.flywheel)
|
|
137
|
-
return false;
|
|
138
|
-
registry.set(profile.name, profile);
|
|
139
|
-
return true;
|
|
140
|
-
}
|
|
141
|
-
export function getIndustryTraits(name) {
|
|
142
|
-
return registry.get(name)?.traits;
|
|
143
|
-
}
|
|
144
|
-
export function resolveIndustryName(alias) {
|
|
145
|
-
if (!alias || typeof alias !== "string")
|
|
146
|
-
return undefined;
|
|
147
|
-
const trimmed = alias.trim();
|
|
148
|
-
if (!trimmed)
|
|
149
|
-
return undefined;
|
|
150
|
-
const lower = trimmed.toLowerCase();
|
|
151
|
-
if (INDUSTRY_ALIASES[trimmed])
|
|
152
|
-
return INDUSTRY_ALIASES[trimmed];
|
|
153
|
-
if (INDUSTRY_ALIASES[lower])
|
|
154
|
-
return INDUSTRY_ALIASES[lower];
|
|
155
|
-
if (registry.has(trimmed))
|
|
156
|
-
return trimmed;
|
|
157
|
-
if (registry.has(lower))
|
|
158
|
-
return lower;
|
|
159
|
-
return undefined;
|
|
160
|
-
}
|
|
161
|
-
export function getRegistrySize() {
|
|
162
|
-
return registry.size;
|
|
163
|
-
}
|
|
164
|
-
export function _resetRegistryForTest() {
|
|
165
|
-
registry.clear();
|
|
166
|
-
setFlywheelLookup(null);
|
|
167
|
-
setRisksLookup(null);
|
|
168
|
-
setPreferencesLookup(null);
|
|
169
|
-
seedBuiltinIndustries();
|
|
170
|
-
injectRegistryLookup();
|
|
171
|
-
}
|
|
172
|
-
export function listBuiltinIndustryNames() {
|
|
173
|
-
return listFlywheelIndustries();
|
|
174
|
-
}
|
|
1
|
+
import{getFlywheelForIndustry,listIndustries as a104a,_setRegistryLookup as a104b}from'./acquisition-flywheel.js';import{getIndustryRiskChecks,getIndustryNeeds,getIndustryTemplate,SUPPORTED_INDUSTRIES}from'../customer/index.js';import{_setRegistryLookup as a104c}from'../customer/industry-risks.js';import{_setRegistryLookup as a104d}from'../customer/user-preferences.js';const BUILTIN_TRAITS={'freelance':{'has_logistics':![],'communication_heavy':!![],'pure_digital':!![],'long_cycle':![],'deposit_required':![],'multi_tier_allocation':![],'regulatory_intensity':'low','trust_sensitivity':'high','consumption_frequency':'occasional','avg_ticket_size':'medium'},'rental':{'has_logistics':!![],'communication_heavy':![],'pure_digital':![],'long_cycle':![],'deposit_required':!![],'multi_tier_allocation':![],'regulatory_intensity':'low','trust_sensitivity':'high','consumption_frequency':'occasional','avg_ticket_size':'medium'},'education':{'has_logistics':![],'communication_heavy':!![],'pure_digital':![],'long_cycle':!![],'deposit_required':![],'multi_tier_allocation':![],'regulatory_intensity':'medium','trust_sensitivity':'high','consumption_frequency':'one_time','avg_ticket_size':'large'},'travel':{'has_logistics':!![],'communication_heavy':!![],'pure_digital':![],'long_cycle':![],'deposit_required':![],'multi_tier_allocation':!![],'regulatory_intensity':'medium','trust_sensitivity':'high','consumption_frequency':'one_time','avg_ticket_size':'large'},'subscription':{'has_logistics':![],'communication_heavy':![],'pure_digital':!![],'long_cycle':![],'deposit_required':![],'multi_tier_allocation':![],'regulatory_intensity':'low','trust_sensitivity':'medium','consumption_frequency':'frequent','avg_ticket_size':'small'},'retail':{'has_logistics':!![],'communication_heavy':![],'pure_digital':![],'long_cycle':![],'deposit_required':![],'multi_tier_allocation':![],'regulatory_intensity':'low','trust_sensitivity':'medium','consumption_frequency':'frequent','avg_ticket_size':'small'}},BUILTIN_DISPLAY_NAMES={'freelance':'Freelance','rental':'Rental','education':'Education','travel':'Travel','subscription':'Subscription','retail':'Retail','general':'General','custom':'Custom'},INDUSTRY_ALIASES={'outsourcing':'freelance','design':'freelance','development':'freelance','consulting':'freelance','rent':'rental','lease':'rental','course':'education','training':'education','tourism':'travel','itinerary':'travel','membership':'subscription','ecommerce':'retail','goods':'retail','freelancer':'freelance','gig':'freelance','edu':'education','trip':'travel','tour':'travel','subscribe':'subscription','shop':'retail','general_industry':'general'};export const INDUSTRY_REGISTRY_VERSION=0x1;const registry=new Map();function seedBuiltinProfile(a){const b=BUILTIN_TRAITS[a];if(!b)return undefined;const c=getFlywheelForIndustry(a);if(!c)return undefined;const d=getIndustryRiskChecks(a),e=getIndustryNeeds(a),f=getIndustryTemplate(a);return{'name':a,'display_name':BUILTIN_DISPLAY_NAMES[a]??a,'traits':b,'source':'builtin','version':'v1','flywheel':c,'risk_checks':d,'preference_template':f,'needs':e};}function seedBuiltinIndustries(){for(const a of SUPPORTED_INDUSTRIES){const b=seedBuiltinProfile(a);b&®istry['set'](a,b);}}seedBuiltinIndustries(),injectRegistryLookup();function injectRegistryLookup(){a104b(a=>{const b=registry['get'](a);return b?{'flywheel':b['flywheel']}:undefined;}),a104c(a=>{const b=registry['get'](a);return b?{'risk_checks':b['risk_checks'],'needs':b['needs']}:undefined;}),a104d(a=>{const b=registry['get'](a);return b?{'preference_template':b['preference_template']}:undefined;});}export function getIndustryProfile(a){const b=registry['get'](a);return b?JSON['parse'](JSON['stringify'](b)):undefined;}export function listIndustries(a){const b=Array['from'](registry['values']());if(a?.['source'])return b['filter'](c=>c['source']===a['source']);return b;}export function registerIndustry(a){if(!a['name']||!a['traits']||!a['flywheel'])return![];return registry['set'](a['name'],a),!![];}export function getIndustryTraits(a){return registry['get'](a)?.['traits'];}export function resolveIndustryName(a){if(!a||typeof a!=='string')return undefined;const b=a['trim']();if(!b)return undefined;const c=b['toLowerCase']();if(INDUSTRY_ALIASES[b])return INDUSTRY_ALIASES[b];if(INDUSTRY_ALIASES[c])return INDUSTRY_ALIASES[c];if(registry['has'](b))return b;if(registry['has'](c))return c;return undefined;}export function getRegistrySize(){return registry['size'];}export function _resetRegistryForTest(){registry['clear'](),a104b(null),a104c(null),a104d(null),seedBuiltinIndustries(),injectRegistryLookup();}export function listBuiltinIndustryNames(){return a104a();}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { IndustryMetrics, IndustryHealthReport, IndustryUpdateSuggestion } from "./industry-evolution.js";
|
|
2
|
+
import type { CommercialRole } from "../role/types.js";
|
|
2
3
|
export type BusinessIntent = "default" | "growth" | "retention" | "compliance" | "efficiency" | "trust_building" | "custom";
|
|
3
4
|
export type MetricDimension = "completed_rate" | "dispute_rate" | "refund_rate" | "repeat_buyer_rate" | "cycle_efficiency" | "arbitration_coverage" | "compensation_coverage" | "milestone_adoption" | "review_openness";
|
|
4
5
|
export interface IntentMetricSpec {
|
|
@@ -12,7 +13,7 @@ export interface IntentMetricSpec {
|
|
|
12
13
|
healthy?: number;
|
|
13
14
|
stressed?: number;
|
|
14
15
|
};
|
|
15
|
-
role_advice_routing?: Record<
|
|
16
|
+
role_advice_routing?: Partial<Record<AdviceRole, string[]>>;
|
|
16
17
|
}
|
|
17
18
|
export interface IntentSuggestionTrigger {
|
|
18
19
|
metric: MetricDimension;
|
|
@@ -24,7 +25,7 @@ export interface IntentSuggestionTrigger {
|
|
|
24
25
|
evidence_template: string;
|
|
25
26
|
confidence: number;
|
|
26
27
|
priority: IndustryUpdateSuggestion["priority"];
|
|
27
|
-
target_roles?: Array<
|
|
28
|
+
target_roles?: Array<AdviceRole>;
|
|
28
29
|
}
|
|
29
30
|
export declare const BUILTIN_INTENT_SPECS: Record<BusinessIntent, IntentMetricSpec>;
|
|
30
31
|
export declare function registerIntentProfile(spec: IntentMetricSpec): boolean;
|
|
@@ -37,6 +38,6 @@ export declare function evaluateIndustryHealthMultiIntent(industry: string, metr
|
|
|
37
38
|
intent: BusinessIntent;
|
|
38
39
|
weight: number;
|
|
39
40
|
}>): IndustryHealthReport;
|
|
40
|
-
export type AdviceRole =
|
|
41
|
+
export type AdviceRole = Exclude<CommercialRole, "system">;
|
|
41
42
|
export declare function getRoleAdvice(intent: BusinessIntent, role: AdviceRole): string[];
|
|
42
43
|
export declare function filterSuggestionsByRole(suggestions: IndustryUpdateSuggestion[], role: AdviceRole, triggers?: IntentSuggestionTrigger[]): IndustryUpdateSuggestion[];
|