@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,104 +1 @@
|
|
|
1
|
-
import { z
|
|
2
|
-
export const SchemaQueryInputSchema = z
|
|
3
|
-
.object({
|
|
4
|
-
action: z
|
|
5
|
-
.enum([
|
|
6
|
-
"list",
|
|
7
|
-
"get",
|
|
8
|
-
"get_output",
|
|
9
|
-
"search",
|
|
10
|
-
"list_operations",
|
|
11
|
-
"get_guard_templates",
|
|
12
|
-
"get_field",
|
|
13
|
-
"search_examples",
|
|
14
|
-
"get_tool_reference",
|
|
15
|
-
"get_guard_design_patterns",
|
|
16
|
-
"get_safety_rules",
|
|
17
|
-
"get_templates",
|
|
18
|
-
])
|
|
19
|
-
.describe("Action to perform: 'list' (all schemas), 'get' (specific input schema), 'get_output' (tool output schema), 'get_field' (field-path query e.g. field_path='data.node'), 'search' (by keyword), 'list_operations' (on-chain operations), 'get_guard_templates' (Guard creation templates + best practices), 'search_examples' (search verified example files by keyword — matches title, description, tags, operation_type, industry), 'get_tool_reference' (MCP tool usage reference: summaries, actions, prerequisites, notes — sunk from wowok-tools skill), 'get_guard_design_patterns' (curated Guard design pattern catalog: business requirement → logic tree template — sunk from wowok-guard skill), 'get_safety_rules' (object reuse/immutability/operation-classification/naming rules — sunk from wowok-safety skill), 'get_templates' (unified template registry: ~90 parameterized templates across 11 object types — guard/machine/service/order/progress/arbitration/treasury/permission/passport/allocation/reward; omit 'template' to list metadata, provide 'template' for full detail, provide 'template' + 'params' to instantiate into executable JSON)."),
|
|
20
|
-
name: z
|
|
21
|
-
.string()
|
|
22
|
-
.optional()
|
|
23
|
-
.describe("Schema/tool name for 'get'/'get_output'/'get_field'/'get_tool_reference' action (e.g., 'onchain_operations', 'onchain_operations_machine'), or pattern id for 'get_guard_design_patterns' (e.g., 'pattern.identity_check_allowlist')."),
|
|
24
|
-
query: z
|
|
25
|
-
.string()
|
|
26
|
-
.optional()
|
|
27
|
-
.describe("Search query for 'search' action, keyword filter for 'get_tool_reference', or host filter for 'get_guard_design_patterns' (e.g. 'service_buy_guard', 'machine_forward', 'reward_claim')."),
|
|
28
|
-
field_path: z
|
|
29
|
-
.string()
|
|
30
|
-
.optional()
|
|
31
|
-
.describe("Dot-separated field path for 'get_field' action (e.g. 'data.node', 'data.node.nodes.0.pairs'). Navigates schema.properties.* and schema.items.*."),
|
|
32
|
-
template: z
|
|
33
|
-
.string()
|
|
34
|
-
.optional()
|
|
35
|
-
.describe("Guard template name for 'get_guard_templates' action. Omit to list all available templates. Available: signer_verification, progress_node_check, order_owner_verification, service_belonging_check, reward_not_claimed, combined_reward_guard. For 'get_templates': unified template id (e.g. 'tpl_buy_guard_whitelist', 'tpl_machine_ecommerce_standard', 'T-S-01', 'T-O-01', 'first_order')."),
|
|
36
|
-
object_type: z
|
|
37
|
-
.enum([
|
|
38
|
-
"guard",
|
|
39
|
-
"machine",
|
|
40
|
-
"service",
|
|
41
|
-
"order",
|
|
42
|
-
"progress",
|
|
43
|
-
"arbitration",
|
|
44
|
-
"treasury",
|
|
45
|
-
"permission",
|
|
46
|
-
"passport",
|
|
47
|
-
"allocation",
|
|
48
|
-
"reward",
|
|
49
|
-
])
|
|
50
|
-
.optional()
|
|
51
|
-
.describe("Object-type filter for 'get_templates' list mode (e.g. 'guard' lists only Guard templates)."),
|
|
52
|
-
params: z
|
|
53
|
-
.string()
|
|
54
|
-
.optional()
|
|
55
|
-
.describe("JSON-encoded parameter object for 'get_templates' instantiation mode (e.g. '{\"whitelist\":[\"0xabc\"]}'). Required params are declared in each template's 'parameters' list (see detail mode)."),
|
|
56
|
-
output_file: z
|
|
57
|
-
.string()
|
|
58
|
-
.optional()
|
|
59
|
-
.describe("When set, writes the response data to this file path (relative to cwd) and returns the path instead of inline data. Use for large schemas that would be truncated. Prefer workspace paths like '.trae/tmp/schema.json' so the Read tool can access them."),
|
|
60
|
-
})
|
|
61
|
-
.strict();
|
|
62
|
-
const SchemaListItemSchema = z
|
|
63
|
-
.object({
|
|
64
|
-
name: z.string().describe("Schema/tool identifier (e.g. 'onchain_operations')."),
|
|
65
|
-
title: z.string().optional().describe("Human-readable title, if known."),
|
|
66
|
-
description: z.string().optional().describe("Short description, if known."),
|
|
67
|
-
})
|
|
68
|
-
.strict();
|
|
69
|
-
const ExampleSearchResultSchema = z
|
|
70
|
-
.object({
|
|
71
|
-
file: z.string().describe("Example file name (e.g. 'rental-ziroom-service-create.json')."),
|
|
72
|
-
title: z.string().describe("Human-readable title from the example metadata."),
|
|
73
|
-
description: z.string().describe("Longer description from the example metadata."),
|
|
74
|
-
tags: z.array(z.string()).describe("Tags from the example metadata."),
|
|
75
|
-
industry: z.string().describe("Industry category (e.g. 'rental', 'retail', 'general')."),
|
|
76
|
-
operation_type: z.string().describe("Operation type (e.g. 'service', 'machine', 'guard', 'permission')."),
|
|
77
|
-
verified: z.boolean().describe("Whether the example is marked as verified."),
|
|
78
|
-
score: z.number().describe("Relevance score — number of fields that matched the query (0-5)."),
|
|
79
|
-
matched_fields: z.array(z.string()).describe("List of fields that matched the query."),
|
|
80
|
-
})
|
|
81
|
-
.strict();
|
|
82
|
-
export const SchemaQueryOutputSchema = z
|
|
83
|
-
.object({
|
|
84
|
-
success: z.boolean().describe("Whether the request was successful"),
|
|
85
|
-
action: z.string().describe("The action that was performed"),
|
|
86
|
-
data: z
|
|
87
|
-
.union([
|
|
88
|
-
z.array(SchemaListItemSchema).describe("List of schema summaries (list/search/list_operations)."),
|
|
89
|
-
z.array(ExampleSearchResultSchema).describe("List of matching examples (search_examples)."),
|
|
90
|
-
z.record(z.unknown()).describe("JSON Schema object (get/get_output/get_field), Guard template data, tool reference data (get_tool_reference), Guard design pattern catalog (get_guard_design_patterns), or safety rules tables (get_safety_rules)."),
|
|
91
|
-
z.null().describe("No data — lookup failed or returned nothing, or data was written to output_file."),
|
|
92
|
-
])
|
|
93
|
-
.describe("Response data — array of schema summaries for list-like actions, array of example results for search_examples, JSON Schema object for get/get_output/get_field, Guard template data for get_guard_templates, null on failure or when output_file is used."),
|
|
94
|
-
message: z.string().describe("Human-readable message describing the result"),
|
|
95
|
-
suggestions: z
|
|
96
|
-
.array(z.string())
|
|
97
|
-
.optional()
|
|
98
|
-
.describe("Suggested next steps or alternatives"),
|
|
99
|
-
output_file_path: z
|
|
100
|
-
.string()
|
|
101
|
-
.optional()
|
|
102
|
-
.describe("When output_file is used, contains the absolute file path where data was written."),
|
|
103
|
-
})
|
|
104
|
-
.strict();
|
|
1
|
+
import{z}from'zod';export const SchemaQueryInputSchema=z['object']({'action':z['enum'](['list','get','get_output','search','list_operations','get_guard_templates','get_field','search_examples','get_tool_reference','get_guard_design_patterns','get_safety_rules','get_templates'])['describe']('Action\x20to\x20perform:\x20\x27list\x27\x20(all\x20schemas),\x20\x27get\x27\x20(specific\x20input\x20schema),\x20\x27get_output\x27\x20(tool\x20output\x20schema),\x20\x27get_field\x27\x20(field-path\x20query\x20e.g.\x20field_path=\x27data.node\x27),\x20\x27search\x27\x20(by\x20keyword),\x20\x27list_operations\x27\x20(on-chain\x20operations),\x20\x27get_guard_templates\x27\x20(Guard\x20creation\x20templates\x20+\x20best\x20practices),\x20\x27search_examples\x27\x20(search\x20verified\x20example\x20files\x20by\x20keyword\x20—\x20matches\x20title,\x20description,\x20tags,\x20operation_type,\x20industry),\x20\x27get_tool_reference\x27\x20(MCP\x20tool\x20usage\x20reference:\x20summaries,\x20actions,\x20prerequisites,\x20notes\x20—\x20sunk\x20from\x20wowok-tools\x20skill),\x20\x27get_guard_design_patterns\x27\x20(curated\x20Guard\x20design\x20pattern\x20catalog:\x20business\x20requirement\x20→\x20logic\x20tree\x20template\x20—\x20sunk\x20from\x20wowok-guard\x20skill),\x20\x27get_safety_rules\x27\x20(object\x20reuse/immutability/operation-classification/naming\x20rules\x20—\x20sunk\x20from\x20wowok-safety\x20skill),\x20\x27get_templates\x27\x20(unified\x20template\x20registry:\x20~90\x20parameterized\x20templates\x20across\x2011\x20object\x20types\x20—\x20guard/machine/service/order/progress/arbitration/treasury/permission/passport/allocation/reward;\x20omit\x20\x27template\x27\x20to\x20list\x20metadata,\x20provide\x20\x27template\x27\x20for\x20full\x20detail,\x20provide\x20\x27template\x27\x20+\x20\x27params\x27\x20to\x20instantiate\x20into\x20executable\x20JSON).'),'name':z['string']()['optional']()['describe']('Schema/tool\x20name\x20for\x20\x27get\x27/\x27get_output\x27/\x27get_field\x27/\x27get_tool_reference\x27\x20action\x20(e.g.,\x20\x27onchain_operations\x27,\x20\x27onchain_operations_machine\x27),\x20or\x20pattern\x20id\x20for\x20\x27get_guard_design_patterns\x27\x20(e.g.,\x20\x27pattern.identity_check_allowlist\x27).'),'query':z['string']()['optional']()['describe']('Search\x20query\x20for\x20\x27search\x27\x20action,\x20keyword\x20filter\x20for\x20\x27get_tool_reference\x27,\x20or\x20host\x20filter\x20for\x20\x27get_guard_design_patterns\x27\x20(e.g.\x20\x27service_buy_guard\x27,\x20\x27machine_forward\x27,\x20\x27reward_claim\x27).'),'field_path':z['string']()['optional']()['describe']('Dot-separated\x20field\x20path\x20for\x20\x27get_field\x27\x20action\x20(e.g.\x20\x27data.node\x27,\x20\x27data.node.nodes.0.pairs\x27).\x20Navigates\x20schema.properties.*\x20and\x20schema.items.*.'),'template':z['string']()['optional']()['describe']('Guard\x20template\x20name\x20for\x20\x27get_guard_templates\x27\x20action.\x20Omit\x20to\x20list\x20all\x20available\x20templates.\x20Available:\x20signer_verification,\x20progress_node_check,\x20order_owner_verification,\x20service_belonging_check,\x20reward_not_claimed,\x20combined_reward_guard.\x20For\x20\x27get_templates\x27:\x20unified\x20template\x20id\x20(e.g.\x20\x27tpl_buy_guard_whitelist\x27,\x20\x27tpl_machine_ecommerce_standard\x27,\x20\x27T-S-01\x27,\x20\x27T-O-01\x27,\x20\x27first_order\x27).'),'object_type':z['enum'](['guard','machine','service','order','progress','arbitration','treasury','permission','passport','allocation','reward'])['optional']()['describe']('Object-type\x20filter\x20for\x20\x27get_templates\x27\x20list\x20mode\x20(e.g.\x20\x27guard\x27\x20lists\x20only\x20Guard\x20templates).'),'params':z['string']()['optional']()['describe']('JSON-encoded\x20parameter\x20object\x20for\x20\x27get_templates\x27\x20instantiation\x20mode\x20(e.g.\x20\x27{\x22whitelist\x22:[\x220xabc\x22]}\x27).\x20Required\x20params\x20are\x20declared\x20in\x20each\x20template\x27s\x20\x27parameters\x27\x20list\x20(see\x20detail\x20mode).'),'output_file':z['string']()['optional']()['describe']('When\x20set,\x20writes\x20the\x20response\x20data\x20to\x20this\x20file\x20path\x20(relative\x20to\x20cwd)\x20and\x20returns\x20the\x20path\x20instead\x20of\x20inline\x20data.\x20Use\x20for\x20large\x20schemas\x20that\x20would\x20be\x20truncated.\x20Prefer\x20workspace\x20paths\x20like\x20\x27.trae/tmp/schema.json\x27\x20so\x20the\x20Read\x20tool\x20can\x20access\x20them.')})['strict']();const SchemaListItemSchema=z['object']({'name':z['string']()['describe']('Schema/tool\x20identifier\x20(e.g.\x20\x27onchain_operations\x27).'),'title':z['string']()['optional']()['describe']('Human-readable\x20title,\x20if\x20known.'),'description':z['string']()['optional']()['describe']('Short\x20description,\x20if\x20known.')})['strict'](),ExampleSearchResultSchema=z['object']({'file':z['string']()['describe']('Example\x20file\x20name\x20(e.g.\x20\x27rental-ziroom-service-create.json\x27).'),'title':z['string']()['describe']('Human-readable\x20title\x20from\x20the\x20example\x20metadata.'),'description':z['string']()['describe']('Longer\x20description\x20from\x20the\x20example\x20metadata.'),'tags':z['array'](z['string']())['describe']('Tags\x20from\x20the\x20example\x20metadata.'),'industry':z['string']()['describe']('Industry\x20category\x20(e.g.\x20\x27rental\x27,\x20\x27retail\x27,\x20\x27general\x27).'),'operation_type':z['string']()['describe']('Operation\x20type\x20(e.g.\x20\x27service\x27,\x20\x27machine\x27,\x20\x27guard\x27,\x20\x27permission\x27).'),'verified':z['boolean']()['describe']('Whether\x20the\x20example\x20is\x20marked\x20as\x20verified.'),'score':z['number']()['describe']('Relevance\x20score\x20—\x20number\x20of\x20fields\x20that\x20matched\x20the\x20query\x20(0-5).'),'matched_fields':z['array'](z['string']())['describe']('List\x20of\x20fields\x20that\x20matched\x20the\x20query.')})['strict']();export const SchemaQueryOutputSchema=z['object']({'success':z['boolean']()['describe']('Whether\x20the\x20request\x20was\x20successful'),'action':z['string']()['describe']('The\x20action\x20that\x20was\x20performed'),'data':z['union']([z['array'](SchemaListItemSchema)['describe']('List\x20of\x20schema\x20summaries\x20(list/search/list_operations).'),z['array'](ExampleSearchResultSchema)['describe']('List\x20of\x20matching\x20examples\x20(search_examples).'),z['record'](z['unknown']())['describe']('JSON\x20Schema\x20object\x20(get/get_output/get_field),\x20Guard\x20template\x20data,\x20tool\x20reference\x20data\x20(get_tool_reference),\x20Guard\x20design\x20pattern\x20catalog\x20(get_guard_design_patterns),\x20or\x20safety\x20rules\x20tables\x20(get_safety_rules).'),z['null']()['describe']('No\x20data\x20—\x20lookup\x20failed\x20or\x20returned\x20nothing,\x20or\x20data\x20was\x20written\x20to\x20output_file.')])['describe']('Response\x20data\x20—\x20array\x20of\x20schema\x20summaries\x20for\x20list-like\x20actions,\x20array\x20of\x20example\x20results\x20for\x20search_examples,\x20JSON\x20Schema\x20object\x20for\x20get/get_output/get_field,\x20Guard\x20template\x20data\x20for\x20get_guard_templates,\x20null\x20on\x20failure\x20or\x20when\x20output_file\x20is\x20used.'),'message':z['string']()['describe']('Human-readable\x20message\x20describing\x20the\x20result'),'suggestions':z['array'](z['string']())['optional']()['describe']('Suggested\x20next\x20steps\x20or\x20alternatives'),'output_file_path':z['string']()['optional']()['describe']('When\x20output_file\x20is\x20used,\x20contains\x20the\x20absolute\x20file\x20path\x20where\x20data\x20was\x20written.')})['strict']();
|
|
@@ -1,76 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
const SDK_SCHEMA_VERSION = wowok.SCHEMA_VERSION ?? "1.0.0";
|
|
3
|
-
const checkSchemaCompatibility = wowok
|
|
4
|
-
.checkSchemaCompatibility ??
|
|
5
|
-
((_client, _server) => ({ compatible: true }));
|
|
6
|
-
export const MCP_SCHEMA_VERSION = "1.0.0";
|
|
7
|
-
export function getSchemaVersions() {
|
|
8
|
-
return {
|
|
9
|
-
sdk: SDK_SCHEMA_VERSION,
|
|
10
|
-
mcp: MCP_SCHEMA_VERSION,
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
export function checkClientSchemaCompatibility(clientSchemaVersion, options = {}) {
|
|
14
|
-
const versions = getSchemaVersions();
|
|
15
|
-
const result = {
|
|
16
|
-
compatible: true,
|
|
17
|
-
warnings: [],
|
|
18
|
-
errors: [],
|
|
19
|
-
versions,
|
|
20
|
-
client_version: clientSchemaVersion,
|
|
21
|
-
};
|
|
22
|
-
if (!clientSchemaVersion) {
|
|
23
|
-
return result;
|
|
24
|
-
}
|
|
25
|
-
const sdkCheck = checkSchemaCompatibility(clientSchemaVersion, versions.sdk);
|
|
26
|
-
if (!sdkCheck.compatible) {
|
|
27
|
-
result.compatible = false;
|
|
28
|
-
const message = `SDK schema incompatibility: ${sdkCheck.reason}`;
|
|
29
|
-
if (options.mode === "strict") {
|
|
30
|
-
result.errors.push(message);
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
result.warnings.push(message);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
const mcpCheck = checkSchemaCompatibility(clientSchemaVersion, versions.mcp);
|
|
37
|
-
if (!mcpCheck.compatible) {
|
|
38
|
-
result.compatible = false;
|
|
39
|
-
const message = `MCP schema incompatibility: ${mcpCheck.reason}`;
|
|
40
|
-
if (options.mode === "strict") {
|
|
41
|
-
result.errors.push(message);
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
result.warnings.push(message);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return result;
|
|
48
|
-
}
|
|
49
|
-
export function attachSchemaWarning(output, schemaCheck) {
|
|
50
|
-
if (schemaCheck.warnings.length === 0 && schemaCheck.errors.length === 0) {
|
|
51
|
-
return output;
|
|
52
|
-
}
|
|
53
|
-
const warnings = [];
|
|
54
|
-
if (schemaCheck.warnings.length > 0) {
|
|
55
|
-
warnings.push(...schemaCheck.warnings);
|
|
56
|
-
}
|
|
57
|
-
if (schemaCheck.errors.length > 0) {
|
|
58
|
-
warnings.push(...schemaCheck.errors);
|
|
59
|
-
}
|
|
60
|
-
const semantic = output.semantic
|
|
61
|
-
? {
|
|
62
|
-
...output.semantic,
|
|
63
|
-
warnings: [...(output.semantic.warnings || []), ...warnings],
|
|
64
|
-
}
|
|
65
|
-
: undefined;
|
|
66
|
-
return {
|
|
67
|
-
...output,
|
|
68
|
-
semantic,
|
|
69
|
-
schema_warning: {
|
|
70
|
-
compatible: schemaCheck.compatible,
|
|
71
|
-
warnings,
|
|
72
|
-
client_version: schemaCheck.client_version,
|
|
73
|
-
server_versions: schemaCheck.versions,
|
|
74
|
-
},
|
|
75
|
-
};
|
|
76
|
-
}
|
|
1
|
+
import*as a284a from'@wowok/wowok';const SDK_SCHEMA_VERSION=a284a['SCHEMA_VERSION']??'1.0.0',checkSchemaCompatibility=a284a['checkSchemaCompatibility']??((a,b)=>({'compatible':!![]}));export const MCP_SCHEMA_VERSION='1.0.0';export function getSchemaVersions(){return{'sdk':SDK_SCHEMA_VERSION,'mcp':MCP_SCHEMA_VERSION};}export function checkClientSchemaCompatibility(a,b={}){const c=getSchemaVersions(),d={'compatible':!![],'warnings':[],'errors':[],'versions':c,'client_version':a};if(!a)return d;const e=checkSchemaCompatibility(a,c['sdk']);if(!e['compatible']){d['compatible']=![];const g='SDK\x20schema\x20incompatibility:\x20'+e['reason'];b['mode']==='strict'?d['errors']['push'](g):d['warnings']['push'](g);}const f=checkSchemaCompatibility(a,c['mcp']);if(!f['compatible']){d['compatible']=![];const h='MCP\x20schema\x20incompatibility:\x20'+f['reason'];b['mode']==='strict'?d['errors']['push'](h):d['warnings']['push'](h);}return d;}export function attachSchemaWarning(a,b){if(b['warnings']['length']===0x0&&b['errors']['length']===0x0)return a;const c=[];b['warnings']['length']>0x0&&c['push'](...b['warnings']);b['errors']['length']>0x0&&c['push'](...b['errors']);const d=a['semantic']?{...a['semantic'],'warnings':[...a['semantic']['warnings']||[],...c]}:undefined;return{...a,'semantic':d,'schema_warning':{'compatible':b['compatible'],'warnings':c,'client_version':b['client_version'],'server_versions':b['versions']}};}
|
|
@@ -1,286 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import * as path from 'path';
|
|
3
|
-
export const LAYER3_DIR = path.resolve('d:/wowok/agent/mcp/dist/schemas');
|
|
4
|
-
export const LAYER4_DIR = path.resolve('c:/Users/zhou/.trae-cn/mcps/s_wowok-7838e181/solo_agent/mcp_wagent/tools');
|
|
5
|
-
export const ALL_TOOLS = [
|
|
6
|
-
'onchain_operations',
|
|
7
|
-
'account_operation',
|
|
8
|
-
'local_mark_operation',
|
|
9
|
-
'local_info_operation',
|
|
10
|
-
'wip_file',
|
|
11
|
-
'messenger_operation',
|
|
12
|
-
'guard2file',
|
|
13
|
-
'machineNode2file',
|
|
14
|
-
'query_toolkit',
|
|
15
|
-
'onchain_table_data',
|
|
16
|
-
'onchain_events',
|
|
17
|
-
'wowok_buildin_info',
|
|
18
|
-
'schema_query',
|
|
19
|
-
'bridge_operation',
|
|
20
|
-
'project_operation',
|
|
21
|
-
'config_operation',
|
|
22
|
-
'trust_score',
|
|
23
|
-
'query_task_status',
|
|
24
|
-
'evaluation_operation',
|
|
25
|
-
'persona_operation',
|
|
26
|
-
'intent_radar',
|
|
27
|
-
];
|
|
28
|
-
const JSON_SCHEMA_DRAFT7 = 'http://json-schema.org/draft-07/schema#';
|
|
29
|
-
const RECURSIVE_EXTERNAL_FILES = new Set(['guard-node-schema.json']);
|
|
30
|
-
function createExternalFileCache() {
|
|
31
|
-
return new Map();
|
|
32
|
-
}
|
|
33
|
-
function loadExternalFile(filePath, layer3Dir, cache) {
|
|
34
|
-
if (cache.has(filePath)) {
|
|
35
|
-
return cache.get(filePath);
|
|
36
|
-
}
|
|
37
|
-
const fullPath = path.resolve(layer3Dir, filePath);
|
|
38
|
-
if (!fs.existsSync(fullPath)) {
|
|
39
|
-
throw new Error(`External $ref file not found: ${fullPath}`);
|
|
40
|
-
}
|
|
41
|
-
const parsed = JSON.parse(fs.readFileSync(fullPath, 'utf-8'));
|
|
42
|
-
cache.set(filePath, parsed);
|
|
43
|
-
return parsed;
|
|
44
|
-
}
|
|
45
|
-
function resolveRefTarget(ref, root, layer3Dir, cache) {
|
|
46
|
-
if (!ref.startsWith('#')) {
|
|
47
|
-
const [filePath, innerPath] = ref.split('#', 2);
|
|
48
|
-
const external = loadExternalFile(filePath, layer3Dir, cache);
|
|
49
|
-
if (!innerPath || innerPath === '/') {
|
|
50
|
-
return external;
|
|
51
|
-
}
|
|
52
|
-
if (!innerPath.startsWith('/')) {
|
|
53
|
-
throw new Error(`Unsupported external $ref format: ${ref}`);
|
|
54
|
-
}
|
|
55
|
-
const parts = innerPath.slice(1).split('/');
|
|
56
|
-
let target = external;
|
|
57
|
-
for (const part of parts) {
|
|
58
|
-
if (target === null || typeof target !== 'object') {
|
|
59
|
-
throw new Error(`Cannot resolve $ref part "${part}" in ${ref}`);
|
|
60
|
-
}
|
|
61
|
-
target = target[part];
|
|
62
|
-
}
|
|
63
|
-
return target;
|
|
64
|
-
}
|
|
65
|
-
if (!ref.startsWith('#/')) {
|
|
66
|
-
throw new Error(`Unsupported $ref (must start with "#/" or be external file): ${ref}`);
|
|
67
|
-
}
|
|
68
|
-
const parts = ref.slice(2).split('/');
|
|
69
|
-
let target = root;
|
|
70
|
-
for (const part of parts) {
|
|
71
|
-
if (target === null || typeof target !== 'object') {
|
|
72
|
-
return undefined;
|
|
73
|
-
}
|
|
74
|
-
target = target[part];
|
|
75
|
-
}
|
|
76
|
-
return target;
|
|
77
|
-
}
|
|
78
|
-
function resolveRefs(node, root, layer3Dir, cache, seen = new Set(), memo = new Map()) {
|
|
79
|
-
if (node === null || typeof node !== 'object') {
|
|
80
|
-
return node;
|
|
81
|
-
}
|
|
82
|
-
if (Array.isArray(node)) {
|
|
83
|
-
return node.map((item) => resolveRefs(item, root, layer3Dir, cache, seen, memo));
|
|
84
|
-
}
|
|
85
|
-
if (typeof node.$ref === 'string') {
|
|
86
|
-
const ref = node.$ref;
|
|
87
|
-
if (!ref.startsWith('#') && RECURSIVE_EXTERNAL_FILES.has(ref.split('#', 2)[0])) {
|
|
88
|
-
return {
|
|
89
|
-
type: 'object',
|
|
90
|
-
additionalProperties: true,
|
|
91
|
-
description: 'Recursive GuardNode computational tree (55 self-referential node types). ' +
|
|
92
|
-
'NOT inlined here to avoid exponential schema bloat. ' +
|
|
93
|
-
"Use schema_query (e.g. action='get' name='onchain_operations_guard') or read guard-node-schema.json " +
|
|
94
|
-
'for the complete node definitions. Key node families: identifier / query / context / ' +
|
|
95
|
-
'logic_* / calc_* / convert_* / vec_* / query_progress_* / query_reward_*.',
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
if (seen.has(ref)) {
|
|
99
|
-
return { $ref: ref, description: node.description };
|
|
100
|
-
}
|
|
101
|
-
if (memo.has(ref)) {
|
|
102
|
-
const cached = memo.get(ref);
|
|
103
|
-
const copy = JSON.parse(JSON.stringify(cached));
|
|
104
|
-
if (node.description && !copy.description) {
|
|
105
|
-
copy.description = node.description;
|
|
106
|
-
}
|
|
107
|
-
return copy;
|
|
108
|
-
}
|
|
109
|
-
const target = resolveRefTarget(ref, root, layer3Dir, cache);
|
|
110
|
-
if (target === undefined || target === null) {
|
|
111
|
-
throw new Error(`Cannot resolve $ref target: ${ref}`);
|
|
112
|
-
}
|
|
113
|
-
const nextSeen = new Set(seen);
|
|
114
|
-
nextSeen.add(ref);
|
|
115
|
-
const externalRoot = ref.startsWith('#')
|
|
116
|
-
? root
|
|
117
|
-
: loadExternalFile(ref.split('#', 2)[0], layer3Dir, cache);
|
|
118
|
-
const resolved = resolveRefs(target, externalRoot, layer3Dir, cache, nextSeen, memo);
|
|
119
|
-
if (node.description && !resolved.description) {
|
|
120
|
-
resolved.description = node.description;
|
|
121
|
-
}
|
|
122
|
-
memo.set(ref, resolved);
|
|
123
|
-
return resolved;
|
|
124
|
-
}
|
|
125
|
-
const result = {};
|
|
126
|
-
for (const [key, value] of Object.entries(node)) {
|
|
127
|
-
result[key] = resolveRefs(value, root, layer3Dir, cache, seen, memo);
|
|
128
|
-
}
|
|
129
|
-
return result;
|
|
130
|
-
}
|
|
131
|
-
function extractSchemaBody(layer3, layer3Dir, cache) {
|
|
132
|
-
const rootForResolution = {
|
|
133
|
-
...layer3,
|
|
134
|
-
definitions: layer3.definitions,
|
|
135
|
-
};
|
|
136
|
-
let body;
|
|
137
|
-
if (layer3.$ref) {
|
|
138
|
-
const ref = layer3.$ref;
|
|
139
|
-
const target = resolveRefTarget(ref, rootForResolution, layer3Dir, cache);
|
|
140
|
-
if (target === undefined || target === null) {
|
|
141
|
-
throw new Error(`Top-level $ref cannot be resolved: ${ref}`);
|
|
142
|
-
}
|
|
143
|
-
const innerRoot = ref.startsWith('#')
|
|
144
|
-
? rootForResolution
|
|
145
|
-
: loadExternalFile(ref.split('#', 2)[0], layer3Dir, cache);
|
|
146
|
-
body = resolveRefs(target, innerRoot, layer3Dir, cache);
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
const { $schema, $id, title, definitions, description, ...rest } = layer3;
|
|
150
|
-
body = resolveRefs(rest, rootForResolution, layer3Dir, cache);
|
|
151
|
-
}
|
|
152
|
-
return body;
|
|
153
|
-
}
|
|
154
|
-
function buildDeployedFile(toolName, layer3Dir, layer4Dir, cache) {
|
|
155
|
-
const l3Path = path.join(layer3Dir, `${toolName}.schema.json`);
|
|
156
|
-
const l4Path = path.join(layer4Dir, `${toolName}.json`);
|
|
157
|
-
if (!fs.existsSync(l3Path)) {
|
|
158
|
-
throw new Error(`Layer 3 schema not found: ${l3Path}`);
|
|
159
|
-
}
|
|
160
|
-
const layer3 = JSON.parse(fs.readFileSync(l3Path, 'utf-8'));
|
|
161
|
-
const body = extractSchemaBody(layer3, layer3Dir, cache);
|
|
162
|
-
const argsObj = {
|
|
163
|
-
type: body.type ?? 'object',
|
|
164
|
-
properties: body.properties ?? {},
|
|
165
|
-
required: body.required ?? [],
|
|
166
|
-
$schema: JSON_SCHEMA_DRAFT7,
|
|
167
|
-
};
|
|
168
|
-
if (body.additionalProperties !== undefined) {
|
|
169
|
-
argsObj.additionalProperties = body.additionalProperties;
|
|
170
|
-
}
|
|
171
|
-
if (body.description) {
|
|
172
|
-
argsObj.description = body.description;
|
|
173
|
-
}
|
|
174
|
-
if (body.oneOf) {
|
|
175
|
-
argsObj.oneOf = body.oneOf;
|
|
176
|
-
}
|
|
177
|
-
if (body.anyOf) {
|
|
178
|
-
argsObj.anyOf = body.anyOf;
|
|
179
|
-
}
|
|
180
|
-
if (body.allOf) {
|
|
181
|
-
argsObj.allOf = body.allOf;
|
|
182
|
-
}
|
|
183
|
-
let description = layer3.description ?? `${toolName} operation`;
|
|
184
|
-
if (fs.existsSync(l4Path)) {
|
|
185
|
-
try {
|
|
186
|
-
const existing = JSON.parse(fs.readFileSync(l4Path, 'utf-8'));
|
|
187
|
-
if (existing.description && existing.description.length > 0) {
|
|
188
|
-
description = existing.description;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
catch {
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
if (!description.includes('schema_query')) {
|
|
195
|
-
const hint = `\n\n💡 Schema hint: Use schema_query with action='get' and name='${toolName}' ` +
|
|
196
|
-
`to retrieve the exact parameter schema before calling.`;
|
|
197
|
-
description = description + hint;
|
|
198
|
-
}
|
|
199
|
-
return {
|
|
200
|
-
name: toolName,
|
|
201
|
-
description,
|
|
202
|
-
arguments: argsObj,
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
export function syncDeployedToolDescriptors(options = {}) {
|
|
206
|
-
const silent = options.silent ?? false;
|
|
207
|
-
const layer3Dir = options.layer3Dir ?? LAYER3_DIR;
|
|
208
|
-
const layer4Dir = options.layer4Dir ?? LAYER4_DIR;
|
|
209
|
-
const log = (msg) => {
|
|
210
|
-
if (!silent)
|
|
211
|
-
console.log(msg);
|
|
212
|
-
};
|
|
213
|
-
const logErr = (msg) => {
|
|
214
|
-
if (!silent)
|
|
215
|
-
console.error(msg);
|
|
216
|
-
};
|
|
217
|
-
log('🔄 Syncing Layer 4 deployed tool descriptors from Layer 3 ...\n');
|
|
218
|
-
log(`Layer 3 source: ${layer3Dir}`);
|
|
219
|
-
log(`Layer 4 target: ${layer4Dir}\n`);
|
|
220
|
-
if (!fs.existsSync(layer3Dir)) {
|
|
221
|
-
const msg = `Layer 3 directory does not exist: ${layer3Dir}`;
|
|
222
|
-
logErr(`✗ ${msg}`);
|
|
223
|
-
throw new Error(`${msg} (run 'pnpm generate:schemas' first)`);
|
|
224
|
-
}
|
|
225
|
-
if (!fs.existsSync(layer4Dir)) {
|
|
226
|
-
const msg = `Layer 4 directory does not exist: ${layer4Dir}`;
|
|
227
|
-
logErr(`✗ ${msg}`);
|
|
228
|
-
throw new Error(msg);
|
|
229
|
-
}
|
|
230
|
-
const cache = createExternalFileCache();
|
|
231
|
-
let succeeded = 0;
|
|
232
|
-
let failed = 0;
|
|
233
|
-
const failures = [];
|
|
234
|
-
for (const tool of ALL_TOOLS) {
|
|
235
|
-
try {
|
|
236
|
-
const deployed = buildDeployedFile(tool, layer3Dir, layer4Dir, cache);
|
|
237
|
-
const outputPath = path.join(layer4Dir, `${tool}.json`);
|
|
238
|
-
fs.writeFileSync(outputPath, JSON.stringify(deployed, null, 2) + '\n', 'utf-8');
|
|
239
|
-
const argCount = Object.keys(deployed.arguments.properties).length;
|
|
240
|
-
const requiredCount = deployed.arguments.required.length;
|
|
241
|
-
const unionType = deployed.arguments.oneOf
|
|
242
|
-
? 'oneOf'
|
|
243
|
-
: deployed.arguments.anyOf
|
|
244
|
-
? 'anyOf'
|
|
245
|
-
: deployed.arguments.allOf
|
|
246
|
-
? 'allOf'
|
|
247
|
-
: '';
|
|
248
|
-
const unionInfo = unionType
|
|
249
|
-
? ` [${unionType}=${deployed.arguments[unionType].length}]`
|
|
250
|
-
: '';
|
|
251
|
-
log(` ✓ ${tool.padEnd(28)} props=${String(argCount).padStart(2)} required=${String(requiredCount).padStart(2)}${unionInfo}`);
|
|
252
|
-
succeeded++;
|
|
253
|
-
}
|
|
254
|
-
catch (e) {
|
|
255
|
-
logErr(` ✗ ${tool}: ${e.message}`);
|
|
256
|
-
failures.push({ tool, error: e.message });
|
|
257
|
-
failed++;
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
log(`\n✅ Succeeded: ${succeeded}/${ALL_TOOLS.length}`);
|
|
261
|
-
if (failed > 0) {
|
|
262
|
-
logErr(`❌ Failed: ${failed}`);
|
|
263
|
-
for (const f of failures) {
|
|
264
|
-
logErr(` - ${f.tool}: ${f.error}`);
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
else {
|
|
268
|
-
log(`All ${ALL_TOOLS.length} Layer 4 deployed files are now FULL schemas (no stubs remain).`);
|
|
269
|
-
}
|
|
270
|
-
return {
|
|
271
|
-
ok: succeeded,
|
|
272
|
-
failed,
|
|
273
|
-
errors: failures,
|
|
274
|
-
layer3Dir,
|
|
275
|
-
layer4Dir,
|
|
276
|
-
total: ALL_TOOLS.length,
|
|
277
|
-
};
|
|
278
|
-
}
|
|
279
|
-
export function shouldAutoSyncAtStartup() {
|
|
280
|
-
const v = process.env.WOWOK_SYNC_LAYER4;
|
|
281
|
-
if (v === undefined || v === '' || v === 'auto')
|
|
282
|
-
return true;
|
|
283
|
-
if (v === 'never' || v === '0' || v === 'false')
|
|
284
|
-
return false;
|
|
285
|
-
return true;
|
|
286
|
-
}
|
|
1
|
+
import*as a285a from'fs';import*as a285b from'path';export const LAYER3_DIR=a285b['resolve']('d:/wowok/agent/mcp/dist/schemas');export const LAYER4_DIR=a285b['resolve']('c:/Users/zhou/.trae-cn/mcps/s_wowok-7838e181/solo_agent/mcp_wagent/tools');export const ALL_TOOLS=['onchain_operations','account_operation','local_mark_operation','local_info_operation','wip_file','messenger_operation','guard2file','machineNode2file','query_toolkit','onchain_table_data','onchain_events','wowok_buildin_info','schema_query','bridge_operation','project_operation','config_operation','trust_score','query_task_status','evaluation_operation','persona_operation','intent_radar'];const JSON_SCHEMA_DRAFT7='http://json-schema.org/draft-07/schema#',RECURSIVE_EXTERNAL_FILES=new Set(['guard-node-schema.json']);function createExternalFileCache(){return new Map();}function loadExternalFile(a,b,c){if(c['has'](a))return c['get'](a);const d=a285b['resolve'](b,a);if(!a285a['existsSync'](d))throw new Error('External\x20$ref\x20file\x20not\x20found:\x20'+d);const e=JSON['parse'](a285a['readFileSync'](d,'utf-8'));return c['set'](a,e),e;}function resolveRefTarget(a,b,c,d){if(!a['startsWith']('#')){const [g,h]=a['split']('#',0x2),i=loadExternalFile(g,c,d);if(!h||h==='/')return i;if(!h['startsWith']('/'))throw new Error('Unsupported\x20external\x20$ref\x20format:\x20'+a);const j=h['slice'](0x1)['split']('/');let k=i;for(const l of j){if(k===null||typeof k!=='object')throw new Error('Cannot\x20resolve\x20$ref\x20part\x20\x22'+l+'\x22\x20in\x20'+a);k=k[l];}return k;}if(!a['startsWith']('#/'))throw new Error('Unsupported\x20$ref\x20(must\x20start\x20with\x20\x22#/\x22\x20or\x20be\x20external\x20file):\x20'+a);const e=a['slice'](0x2)['split']('/');let f=b;for(const m of e){if(f===null||typeof f!=='object')return undefined;f=f[m];}return f;}function resolveRefs(a,b,c,d,e=new Set(),f=new Map()){if(a===null||typeof a!=='object')return a;if(Array['isArray'](a))return a['map'](h=>resolveRefs(h,b,c,d,e,f));if(typeof a['$ref']==='string'){const h=a['$ref'];if(!h['startsWith']('#')&&RECURSIVE_EXTERNAL_FILES['has'](h['split']('#',0x2)[0x0]))return{'type':'object','additionalProperties':!![],'description':'Recursive\x20GuardNode\x20computational\x20tree\x20(55\x20self-referential\x20node\x20types).\x20'+'NOT\x20inlined\x20here\x20to\x20avoid\x20exponential\x20schema\x20bloat.\x20'+'Use\x20schema_query\x20(e.g.\x20action=\x27get\x27\x20name=\x27onchain_operations_guard\x27)\x20or\x20read\x20guard-node-schema.json\x20'+'for\x20the\x20complete\x20node\x20definitions.\x20Key\x20node\x20families:\x20identifier\x20/\x20query\x20/\x20context\x20/\x20'+'logic_*\x20/\x20calc_*\x20/\x20convert_*\x20/\x20vec_*\x20/\x20query_progress_*\x20/\x20query_reward_*.'};if(e['has'](h))return{'$ref':h,'description':a['description']};if(f['has'](h)){const m=f['get'](h),n=JSON['parse'](JSON['stringify'](m));return a['description']&&!n['description']&&(n['description']=a['description']),n;}const i=resolveRefTarget(h,b,c,d);if(i===undefined||i===null)throw new Error('Cannot\x20resolve\x20$ref\x20target:\x20'+h);const j=new Set(e);j['add'](h);const k=h['startsWith']('#')?b:loadExternalFile(h['split']('#',0x2)[0x0],c,d),l=resolveRefs(i,k,c,d,j,f);return a['description']&&!l['description']&&(l['description']=a['description']),f['set'](h,l),l;}const g={};for(const [o,p]of Object['entries'](a)){g[o]=resolveRefs(p,b,c,d,e,f);}return g;}function extractSchemaBody(a,b,c){const d={...a,'definitions':a['definitions']};let e;if(a['$ref']){const f=a['$ref'],g=resolveRefTarget(f,d,b,c);if(g===undefined||g===null)throw new Error('Top-level\x20$ref\x20cannot\x20be\x20resolved:\x20'+f);const h=f['startsWith']('#')?d:loadExternalFile(f['split']('#',0x2)[0x0],b,c);e=resolveRefs(g,h,b,c);}else{const {$schema:i,$id:j,title:k,definitions:l,description:m,...n}=a;e=resolveRefs(n,d,b,c);}return e;}function buildDeployedFile(a,b,c,d){const e=a285b['join'](b,a+'.schema.json'),f=a285b['join'](c,a+'.json');if(!a285a['existsSync'](e))throw new Error('Layer\x203\x20schema\x20not\x20found:\x20'+e);const g=JSON['parse'](a285a['readFileSync'](e,'utf-8')),h=extractSchemaBody(g,b,d),i={'type':h['type']??'object','properties':h['properties']??{},'required':h['required']??[],'$schema':JSON_SCHEMA_DRAFT7};h['additionalProperties']!==undefined&&(i['additionalProperties']=h['additionalProperties']);h['description']&&(i['description']=h['description']);h['oneOf']&&(i['oneOf']=h['oneOf']);h['anyOf']&&(i['anyOf']=h['anyOf']);h['allOf']&&(i['allOf']=h['allOf']);let j=g['description']??a+'\x20operation';if(a285a['existsSync'](f))try{const k=JSON['parse'](a285a['readFileSync'](f,'utf-8'));k['description']&&k['description']['length']>0x0&&(j=k['description']);}catch{}if(!j['includes']('schema_query')){const l='\x0a\x0a💡\x20Schema\x20hint:\x20Use\x20schema_query\x20with\x20action=\x27get\x27\x20and\x20name=\x27'+a+'\x27\x20'+'to\x20retrieve\x20the\x20exact\x20parameter\x20schema\x20before\x20calling.';j=j+l;}return{'name':a,'description':j,'arguments':i};}export function syncDeployedToolDescriptors(a={}){const b=a['silent']??![],c=a['layer3Dir']??LAYER3_DIR,d=a['layer4Dir']??LAYER4_DIR,g=m=>{if(!b)console['log'](m);},h=m=>{if(!b)console['error'](m);};g('🔄\x20Syncing\x20Layer\x204\x20deployed\x20tool\x20descriptors\x20from\x20Layer\x203\x20...\x0a'),g('Layer\x203\x20source:\x20'+c),g('Layer\x204\x20target:\x20\x20'+d+'\x0a');if(!a285a['existsSync'](c)){const m='Layer\x203\x20directory\x20does\x20not\x20exist:\x20'+c;h('✗\x20'+m);throw new Error(m+'\x20(run\x20\x27pnpm\x20generate:schemas\x27\x20first)');}if(!a285a['existsSync'](d)){const n='Layer\x204\x20directory\x20does\x20not\x20exist:\x20'+d;h('✗\x20'+n);throw new Error(n);}const i=createExternalFileCache();let j=0x0,k=0x0;const l=[];for(const o of ALL_TOOLS){try{const p=buildDeployedFile(o,c,d,i),q=a285b['join'](d,o+'.json');a285a['writeFileSync'](q,JSON['stringify'](p,null,0x2)+'\x0a','utf-8');const r=Object['keys'](p['arguments']['properties'])['length'],s=p['arguments']['required']['length'],t=p['arguments']['oneOf']?'oneOf':p['arguments']['anyOf']?'anyOf':p['arguments']['allOf']?'allOf':'',u=t?'\x20['+t+'='+p['arguments'][t]['length']+']':'';g('\x20\x20✓\x20'+o['padEnd'](0x1c)+'\x20props='+String(r)['padStart'](0x2)+'\x20\x20required='+String(s)['padStart'](0x2)+u),j++;}catch(v){h('\x20\x20✗\x20'+o+':\x20'+v['message']),l['push']({'tool':o,'error':v['message']}),k++;}}g('\x0a✅\x20Succeeded:\x20'+j+'/'+ALL_TOOLS['length']);if(k>0x0){h('❌\x20Failed:\x20'+k);for(const w of l){h('\x20\x20\x20-\x20'+w['tool']+':\x20'+w['error']);}}else g('All\x20'+ALL_TOOLS['length']+'\x20Layer\x204\x20deployed\x20files\x20are\x20now\x20FULL\x20schemas\x20(no\x20stubs\x20remain).');return{'ok':j,'failed':k,'errors':l,'layer3Dir':c,'layer4Dir':d,'total':ALL_TOOLS['length']};}export function shouldAutoSyncAtStartup(){const a=process['env']['WOWOK_SYNC_LAYER4'];if(a===undefined||a===''||a==='auto')return!![];if(a==='never'||a==='0'||a==='false')return![];return!![];}
|
|
@@ -1,36 +1 @@
|
|
|
1
|
-
import { z
|
|
2
|
-
export const QueryTaskStatusInputSchema = z
|
|
3
|
-
.object({
|
|
4
|
-
task_id: z
|
|
5
|
-
.string()
|
|
6
|
-
.optional()
|
|
7
|
-
.describe("The task ID to query (returned by a prior async operation). " +
|
|
8
|
-
"If omitted, lists all recent tasks (most recent first, max 50)."),
|
|
9
|
-
project_id: z
|
|
10
|
-
.string()
|
|
11
|
-
.optional()
|
|
12
|
-
.describe("Optional filter — when listing tasks (task_id omitted), only return tasks for this project."),
|
|
13
|
-
})
|
|
14
|
-
.strict()
|
|
15
|
-
.describe("Query the status of an async task, or list all recent tasks when task_id is omitted.");
|
|
16
|
-
export const TaskStateSchema = z
|
|
17
|
-
.object({
|
|
18
|
-
task_id: z.string().describe("Unique task identifier."),
|
|
19
|
-
operation: z.string().describe("Operation type that created this task (e.g. 'build_graph')."),
|
|
20
|
-
status: z.enum(["pending", "running", "completed", "failed", "cancelled"]).describe("Current task status."),
|
|
21
|
-
progress: z.number().describe("Progress percentage 0-100."),
|
|
22
|
-
message: z.string().describe("Human-readable progress message."),
|
|
23
|
-
result: z.unknown().nullable().describe("Result payload (set when status='completed'). null otherwise."),
|
|
24
|
-
error: z.string().nullable().describe("Error message (set when status='failed'). null otherwise."),
|
|
25
|
-
started_at: z.number().describe("Timestamp (ms) when the task was created."),
|
|
26
|
-
completed_at: z.number().nullable().describe("Timestamp (ms) when the task reached a terminal state. null if still running."),
|
|
27
|
-
project_id: z.string().nullable().describe("Project ID associated with this task, if any."),
|
|
28
|
-
})
|
|
29
|
-
.strict();
|
|
30
|
-
export const QueryTaskStatusOutputSchema = z
|
|
31
|
-
.object({
|
|
32
|
-
task_id: z.string().optional().describe("The queried task ID (present when a single task was queried)."),
|
|
33
|
-
task: TaskStateSchema.nullable().describe("The task state. null if task_id not found or when listing."),
|
|
34
|
-
tasks: z.array(TaskStateSchema).optional().describe("List of tasks (present when task_id was omitted)."),
|
|
35
|
-
})
|
|
36
|
-
.strict();
|
|
1
|
+
import{z}from'zod';export const QueryTaskStatusInputSchema=z['object']({'task_id':z['string']()['optional']()['describe']('The\x20task\x20ID\x20to\x20query\x20(returned\x20by\x20a\x20prior\x20async\x20operation).\x20'+'If\x20omitted,\x20lists\x20all\x20recent\x20tasks\x20(most\x20recent\x20first,\x20max\x2050).'),'project_id':z['string']()['optional']()['describe']('Optional\x20filter\x20—\x20when\x20listing\x20tasks\x20(task_id\x20omitted),\x20only\x20return\x20tasks\x20for\x20this\x20project.')})['strict']()['describe']('Query\x20the\x20status\x20of\x20an\x20async\x20task,\x20or\x20list\x20all\x20recent\x20tasks\x20when\x20task_id\x20is\x20omitted.');export const TaskStateSchema=z['object']({'task_id':z['string']()['describe']('Unique\x20task\x20identifier.'),'operation':z['string']()['describe']('Operation\x20type\x20that\x20created\x20this\x20task\x20(e.g.\x20\x27build_graph\x27).'),'status':z['enum'](['pending','running','completed','failed','cancelled'])['describe']('Current\x20task\x20status.'),'progress':z['number']()['describe']('Progress\x20percentage\x200-100.'),'message':z['string']()['describe']('Human-readable\x20progress\x20message.'),'result':z['unknown']()['nullable']()['describe']('Result\x20payload\x20(set\x20when\x20status=\x27completed\x27).\x20null\x20otherwise.'),'error':z['string']()['nullable']()['describe']('Error\x20message\x20(set\x20when\x20status=\x27failed\x27).\x20null\x20otherwise.'),'started_at':z['number']()['describe']('Timestamp\x20(ms)\x20when\x20the\x20task\x20was\x20created.'),'completed_at':z['number']()['nullable']()['describe']('Timestamp\x20(ms)\x20when\x20the\x20task\x20reached\x20a\x20terminal\x20state.\x20null\x20if\x20still\x20running.'),'project_id':z['string']()['nullable']()['describe']('Project\x20ID\x20associated\x20with\x20this\x20task,\x20if\x20any.')})['strict']();export const QueryTaskStatusOutputSchema=z['object']({'task_id':z['string']()['optional']()['describe']('The\x20queried\x20task\x20ID\x20(present\x20when\x20a\x20single\x20task\x20was\x20queried).'),'task':TaskStateSchema['nullable']()['describe']('The\x20task\x20state.\x20null\x20if\x20task_id\x20not\x20found\x20or\x20when\x20listing.'),'tasks':z['array'](TaskStateSchema)['optional']()['describe']('List\x20of\x20tasks\x20(present\x20when\x20task_id\x20was\x20omitted).')})['strict']();
|