xytara 3.1.0 → 3.1.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/.env.example +67 -58
- package/ADAPTER_START_HERE.md +56 -56
- package/CARRIED_HANDOFF_DEMO.md +60 -60
- package/EXAMPLE_PATHS.md +53 -53
- package/FINAL_CONTRACT.md +498 -498
- package/LICENSE +201 -201
- package/NOTICE +3 -3
- package/PARTNER_READY_PATH.md +71 -71
- package/PUBLIC_DEMO_SCRIPT.md +78 -78
- package/README.md +6 -1
- package/REAL_PAYMENT_SETUP.md +32 -3
- package/RELEASE_NOTES.md +14 -14
- package/SERVICE_CONTRACT.md +419 -419
- package/START_HERE.md +1 -1
- package/SUPABASE_RUNTIME_STATE_SETUP.md +61 -61
- package/TERMINOLOGY.md +50 -50
- package/WHY_XYTARA_XOONYA.md +63 -63
- package/XT1_EXECUTION_TRUTH_STANDARD.md +78 -78
- package/XYTARA_ADAPTER_PROTOCOL_TRUTH_MODEL.md +75 -75
- package/XYTARA_AUTONOMOUS_ENTRY_MODEL.md +124 -124
- package/XYTARA_DEFAULT_PATH_MODEL.md +84 -84
- package/XYTARA_EXECUTION_TRUTH_MODEL.md +171 -171
- package/XYTARA_PAYMENT_RAIL_TRUTH_MODEL.md +68 -68
- package/adapters/AUTHORING_GUIDE.md +243 -243
- package/adapters/ONBOARDING_POSTURE.md +61 -61
- package/adapters/THIRD_PARTY_SUBMISSION_PROCESS.md +84 -84
- package/adapters/adapter-manifest.schema.json +283 -283
- package/adapters/examples/example-execution-adapter.js +61 -61
- package/adapters/examples/example-execution-adapter.manifest.json +81 -81
- package/adapters/examples/example-settlement-adapter.js +55 -55
- package/adapters/examples/example-settlement-adapter.manifest.json +78 -78
- package/adapters/examples/example-third-party-acp-registration.submission-bundle.json +124 -124
- package/adapters/examples/example-third-party-erc8004-registration.submission-bundle.json +121 -121
- package/adapters/examples/example-third-party-identity-registration.certification-pack.json +22 -22
- package/adapters/examples/example-third-party-identity-registration.record.json +26 -26
- package/adapters/examples/example-third-party-identity-registration.submission-bundle.json +126 -126
- package/adapters/examples/example-third-party-langchain-registration.submission-bundle.json +124 -124
- package/adapters/examples/example-third-party-mpp-registration.submission-bundle.json +120 -120
- package/adapters/examples/example-third-party-registration.certification-pack.json +22 -22
- package/adapters/examples/example-third-party-registration.record.json +28 -28
- package/adapters/examples/example-third-party-registration.submission-bundle.json +126 -126
- package/adapters/examples/example-third-party-settlement-registration.certification-pack.json +22 -22
- package/adapters/examples/example-third-party-settlement-registration.record.json +26 -26
- package/adapters/examples/example-third-party-settlement-registration.submission-bundle.json +127 -127
- package/adapters/examples/langchain-reference-execution-adapter.js +81 -81
- package/adapters/examples/langchain-reference-execution-adapter.manifest.json +79 -79
- package/adapters/examples/langgraph-reference-execution-adapter.js +81 -81
- package/adapters/examples/langgraph-reference-execution-adapter.manifest.json +79 -79
- package/adapters/examples/minimal-third-party-execution-adapter.js +61 -61
- package/adapters/examples/minimal-third-party-execution-adapter.manifest.json +79 -79
- package/adapters/examples/minimal-third-party-execution-registration.record.json +26 -26
- package/adapters/examples/minimal-third-party-execution.certification-pack.json +22 -22
- package/adapters/examples/minimal-third-party-execution.submission-bundle.json +126 -126
- package/adapters/integration-certification-pack.schema.json +82 -82
- package/adapters/integration-registration-record.schema.json +114 -114
- package/adapters/integration-submission-bundle-set.schema.json +39 -39
- package/adapters/integration-submission-bundle.schema.json +34 -34
- package/adapters/interfaces.js +56 -56
- package/bin/xytara-first-run.js +244 -244
- package/bin/xytara-release.js +1429 -1429
- package/bin/xytara-run.js +186 -186
- package/bin/xytara.js +80 -80
- package/client.js +3 -3
- package/examples/_demo_env.js +40 -0
- package/examples/adapter_review_walkthrough.js +54 -53
- package/examples/export_carried_handoff.js +81 -80
- package/examples/funded_runtime_walkthrough.js +71 -70
- package/examples/generated.carried-handoff.json +30 -0
- package/examples/partner_launch_walkthrough.js +44 -43
- package/examples/quickstart.js +3256 -3255
- package/fixtures/catalog.js +1134 -1134
- package/index.js +395 -395
- package/integrations/dispatch.js +276 -276
- package/integrations/registry-snapshot.schema.json +36 -36
- package/integrations/registry.js +2261 -2261
- package/integrations/views.js +28 -28
- package/lib/a2a_lane_contract.js +104 -104
- package/lib/a2c_lane_contract.js +111 -111
- package/lib/account_auth.js +518 -518
- package/lib/acp_lane_contract.js +54 -54
- package/lib/activity_audit_contract.js +322 -322
- package/lib/adapter_certification_contract.js +130 -130
- package/lib/adapter_depth_contract.js +156 -156
- package/lib/adapter_pack.js +118 -118
- package/lib/adapter_partner_pack.js +89 -89
- package/lib/adapter_promotion_pack.js +89 -89
- package/lib/adapter_protocol_truth_contract.js +229 -229
- package/lib/announcement_pack.js +61 -61
- package/lib/artifact_distribution_lane_contract.js +54 -54
- package/lib/asyncapi_contract.js +150 -150
- package/lib/auth_interop_contract.js +80 -80
- package/lib/authority_binding_lifecycle_contract.js +182 -182
- package/lib/autonomous_entry_contract.js +409 -409
- package/lib/bolt_lane_contract.js +55 -55
- package/lib/bolt_payment_front.js +172 -172
- package/lib/business_cockpit.js +378 -378
- package/lib/capability_execution_truth.js +272 -272
- package/lib/capability_registry.js +633 -633
- package/lib/catalog_contract.js +966 -966
- package/lib/catalog_family_model.js +193 -193
- package/lib/catalog_views.js +55 -55
- package/lib/checkout_event_security.js +142 -142
- package/lib/cloudevents_contract.js +80 -80
- package/lib/command_flow.js +411 -406
- package/lib/commerce_artifacts.js +503 -503
- package/lib/commerce_authority.js +449 -449
- package/lib/commerce_cases.js +317 -317
- package/lib/commerce_checkout.js +509 -509
- package/lib/commerce_client.js +7687 -7676
- package/lib/commerce_coordination.js +346 -346
- package/lib/commerce_economics.js +4017 -4016
- package/lib/commerce_identity.js +578 -578
- package/lib/commerce_quotes.js +237 -237
- package/lib/commerce_reports.js +14461 -14461
- package/lib/commerce_runtime.js +315 -315
- package/lib/commerce_shell.js +257 -257
- package/lib/crypto_agility_matrix.js +125 -125
- package/lib/default_path_contract.js +412 -412
- package/lib/delivery_summary_contract.js +95 -95
- package/lib/ecosystem_entry.js +64 -64
- package/lib/erc8004_lane_contract.js +65 -65
- package/lib/event_system_lane_contract.js +75 -75
- package/lib/execution_truth_contract.js +234 -234
- package/lib/external_credit_bridge.js +142 -142
- package/lib/external_execution_runtime.js +132 -132
- package/lib/feature_control_lane_contract.js +54 -54
- package/lib/first_run_conversion_contract.js +290 -290
- package/lib/framework_lane_contract.js +89 -89
- package/lib/framework_provider_promotion.js +235 -235
- package/lib/full_catalog_contract.js +525 -525
- package/lib/go_live_operator_pack.js +391 -391
- package/lib/http_transport.js +73 -73
- package/lib/identity_auth.js +175 -175
- package/lib/identity_interop_contract.js +82 -82
- package/lib/integration_matrix_contract.js +102 -102
- package/lib/l402_lane_contract.js +55 -55
- package/lib/l402_payment_front.js +192 -192
- package/lib/launch_narrative.js +53 -53
- package/lib/lifecycle_continuity_contract.js +115 -115
- package/lib/machine_identity_registry_contract.js +199 -199
- package/lib/major_rails_lane_contract.js +150 -150
- package/lib/market_lane_contract.js +467 -467
- package/lib/market_lane_depth_contract.js +182 -182
- package/lib/market_lane_promotion_contract.js +210 -210
- package/lib/market_lane_trace_contract.js +278 -278
- package/lib/mcp_lane_contract.js +137 -137
- package/lib/network_transport.js +110 -110
- package/lib/offline_verifiability_recovery_contract.js +155 -155
- package/lib/openapi_contract.js +296 -296
- package/lib/operational_receipt_contract.js +165 -165
- package/lib/operator_intelligence.js +407 -407
- package/lib/outreach_copy_pack.js +51 -51
- package/lib/outreach_message_pack.js +71 -71
- package/lib/outreach_proof.js +71 -71
- package/lib/outreach_target_pack.js +60 -60
- package/lib/partner_intelligence.js +105 -105
- package/lib/payment_config.js +239 -191
- package/lib/payment_front_registry.js +53 -53
- package/lib/payment_protocol_contract.js +165 -165
- package/lib/payment_rail_truth_contract.js +324 -324
- package/lib/payment_verification.js +312 -264
- package/lib/phase_10_closeout_pack.js +45 -45
- package/lib/phase_10_completion_pack.js +76 -76
- package/lib/phase_10_decision_record_pack.js +54 -54
- package/lib/phase_10_decision_resolution_pack.js +53 -53
- package/lib/phase_10_demand_signal_adapters_runtime_pack.js +74 -74
- package/lib/phase_10_ecosystem_backlog_triage_runtime_pack.js +74 -74
- package/lib/phase_10_freeze_baseline_pack.js +67 -67
- package/lib/phase_10_freeze_review_pack.js +64 -64
- package/lib/phase_10_gate_pack.js +57 -57
- package/lib/phase_10_long_tail_continuity_pack.js +80 -80
- package/lib/phase_10_long_tail_ecosystem_pack.js +66 -66
- package/lib/phase_10_niche_extension_registry_runtime_pack.js +74 -74
- package/lib/phase_1_claude_mcp_pack.js +60 -60
- package/lib/phase_1_claude_mcp_runtime_pack.js +52 -52
- package/lib/phase_1_ecosystem_pack.js +67 -67
- package/lib/phase_1_openai_codex_pack.js +60 -60
- package/lib/phase_1_openai_codex_runtime_pack.js +52 -52
- package/lib/phase_2_base_runtime_pack.js +71 -71
- package/lib/phase_2_base_usdc_runtime_pack.js +72 -72
- package/lib/phase_2_closeout_pack.js +65 -65
- package/lib/phase_2_completion_pack.js +113 -113
- package/lib/phase_2_decision_record_pack.js +66 -66
- package/lib/phase_2_decision_resolution_pack.js +69 -69
- package/lib/phase_2_eth_runtime_pack.js +70 -70
- package/lib/phase_2_evm_base_runtime_pack.js +73 -73
- package/lib/phase_2_evm_runtime_pack.js +71 -71
- package/lib/phase_2_flip_preview_pack.js +60 -60
- package/lib/phase_2_freeze_review_pack.js +99 -99
- package/lib/phase_2_gate_pack.js +77 -77
- package/lib/phase_2_payment_rails_pack.js +71 -71
- package/lib/phase_2_usdc_runtime_pack.js +71 -71
- package/lib/phase_3_brc_runtime_pack.js +81 -81
- package/lib/phase_3_bsv_teranode_runtime_pack.js +83 -83
- package/lib/phase_3_closeout_pack.js +62 -62
- package/lib/phase_3_completion_pack.js +94 -94
- package/lib/phase_3_decision_record_pack.js +64 -64
- package/lib/phase_3_decision_resolution_pack.js +69 -69
- package/lib/phase_3_freeze_baseline_pack.js +67 -67
- package/lib/phase_3_freeze_review_pack.js +80 -80
- package/lib/phase_3_gate_pack.js +76 -76
- package/lib/phase_3_metanet_runtime_pack.js +81 -81
- package/lib/phase_3_native_bsv_pack.js +91 -91
- package/lib/phase_3_native_continuity_pack.js +82 -82
- package/lib/phase_4_attestation_runtime_pack.js +75 -75
- package/lib/phase_4_closeout_pack.js +45 -45
- package/lib/phase_4_completion_pack.js +94 -94
- package/lib/phase_4_decision_record_pack.js +54 -54
- package/lib/phase_4_decision_resolution_pack.js +45 -45
- package/lib/phase_4_erc8004_runtime_pack.js +76 -76
- package/lib/phase_4_freeze_baseline_pack.js +67 -67
- package/lib/phase_4_freeze_review_pack.js +68 -68
- package/lib/phase_4_gate_pack.js +58 -58
- package/lib/phase_4_identity_registry_runtime_pack.js +75 -75
- package/lib/phase_4_identity_trust_pack.js +73 -73
- package/lib/phase_4_trust_continuity_pack.js +86 -86
- package/lib/phase_5_antelope_runtime_pack.js +76 -76
- package/lib/phase_5_closeout_pack.js +44 -44
- package/lib/phase_5_completion_pack.js +82 -82
- package/lib/phase_5_constellation_dag_runtime_pack.js +76 -76
- package/lib/phase_5_decision_record_pack.js +54 -54
- package/lib/phase_5_decision_resolution_pack.js +45 -45
- package/lib/phase_5_digibyte_dgb_runtime_pack.js +76 -76
- package/lib/phase_5_freeze_baseline_pack.js +67 -67
- package/lib/phase_5_freeze_review_pack.js +68 -68
- package/lib/phase_5_gate_pack.js +58 -58
- package/lib/phase_5_hedera_hbar_runtime_pack.js +76 -76
- package/lib/phase_5_kaspa_kas_runtime_pack.js +76 -76
- package/lib/phase_5_major_rails_continuity_pack.js +86 -86
- package/lib/phase_5_major_rails_pack.js +110 -110
- package/lib/phase_5_metal_runtime_pack.js +76 -76
- package/lib/phase_5_polkadot_dot_runtime_pack.js +76 -76
- package/lib/phase_5_proton_xpr_runtime_pack.js +76 -76
- package/lib/phase_5_solana_runtime_pack.js +76 -76
- package/lib/phase_6_autogen_runtime_pack.js +72 -72
- package/lib/phase_6_closeout_pack.js +46 -46
- package/lib/phase_6_completion_pack.js +77 -77
- package/lib/phase_6_decision_record_pack.js +54 -54
- package/lib/phase_6_decision_resolution_pack.js +53 -53
- package/lib/phase_6_framework_continuity_pack.js +81 -81
- package/lib/phase_6_framework_runtime_pack.js +68 -68
- package/lib/phase_6_freeze_baseline_pack.js +68 -68
- package/lib/phase_6_freeze_review_pack.js +65 -65
- package/lib/phase_6_gate_pack.js +59 -59
- package/lib/phase_6_langchain_runtime_pack.js +72 -72
- package/lib/phase_6_langgraph_runtime_pack.js +72 -72
- package/lib/phase_6_semantic_kernel_runtime_pack.js +72 -72
- package/lib/phase_7_closeout_pack.js +45 -45
- package/lib/phase_7_completion_pack.js +85 -85
- package/lib/phase_7_decision_record_pack.js +53 -53
- package/lib/phase_7_decision_resolution_pack.js +53 -53
- package/lib/phase_7_event_system_continuity_pack.js +89 -89
- package/lib/phase_7_event_system_pack.js +76 -76
- package/lib/phase_7_freeze_baseline_pack.js +74 -74
- package/lib/phase_7_freeze_review_pack.js +65 -65
- package/lib/phase_7_gate_pack.js +58 -58
- package/lib/phase_7_kafka_runtime_pack.js +74 -74
- package/lib/phase_7_mqtt_runtime_pack.js +74 -74
- package/lib/phase_7_nats_runtime_pack.js +74 -74
- package/lib/phase_7_webhook_event_bus_runtime_pack.js +74 -74
- package/lib/phase_8_closeout_pack.js +46 -46
- package/lib/phase_8_completion_pack.js +82 -82
- package/lib/phase_8_decision_record_pack.js +54 -54
- package/lib/phase_8_decision_resolution_pack.js +53 -53
- package/lib/phase_8_external_receipt_import_runtime_pack.js +74 -74
- package/lib/phase_8_external_result_import_runtime_pack.js +74 -74
- package/lib/phase_8_freeze_baseline_pack.js +71 -71
- package/lib/phase_8_freeze_review_pack.js +64 -64
- package/lib/phase_8_gate_pack.js +58 -58
- package/lib/phase_8_proof_bridge_continuity_pack.js +86 -86
- package/lib/phase_8_proof_bridges_pack.js +72 -72
- package/lib/phase_8_proof_bundle_normalization_runtime_pack.js +74 -74
- package/lib/phase_9_closeout_pack.js +46 -46
- package/lib/phase_9_completion_pack.js +82 -82
- package/lib/phase_9_custody_refs_runtime_pack.js +74 -74
- package/lib/phase_9_decision_record_pack.js +54 -54
- package/lib/phase_9_decision_resolution_pack.js +53 -53
- package/lib/phase_9_freeze_baseline_pack.js +71 -71
- package/lib/phase_9_freeze_review_pack.js +64 -64
- package/lib/phase_9_gate_pack.js +58 -58
- package/lib/phase_9_operator_accounting_bridges_runtime_pack.js +74 -74
- package/lib/phase_9_treasury_connectivity_pack.js +72 -72
- package/lib/phase_9_treasury_continuity_pack.js +86 -86
- package/lib/phase_9_treasury_destinations_runtime_pack.js +74 -74
- package/lib/phase_program_pack.js +120 -120
- package/lib/pricing_optimization_contract.js +775 -775
- package/lib/protocol_lane_contract.js +117 -117
- package/lib/provenance_lane_contract.js +54 -54
- package/lib/provider_lane_contract.js +240 -240
- package/lib/provider_runtime_journey_contract.js +183 -183
- package/lib/public_surface_policy_contract.js +111 -111
- package/lib/publish_plan.js +51 -51
- package/lib/record_queries.js +48 -48
- package/lib/release_candidate.js +50 -50
- package/lib/release_center.js +1093 -1093
- package/lib/release_history.js +205 -205
- package/lib/release_manifest.js +113 -113
- package/lib/release_pack.js +453 -453
- package/lib/request_rate_limit.js +144 -144
- package/lib/resource_views.js +31 -31
- package/lib/revenue_launch_path_contract.js +326 -326
- package/lib/route_matchers.js +34 -34
- package/lib/route_params.js +19 -19
- package/lib/runtime_bridge.js +124 -124
- package/lib/runtime_operations_worker.js +282 -282
- package/lib/runtime_state_store.js +354 -354
- package/lib/settlement_lane_contract.js +111 -111
- package/lib/shared_signals_lane_contract.js +54 -54
- package/lib/signed_audit_provenance_contract.js +83 -83
- package/lib/soft_launch_pack.js +78 -78
- package/lib/stablecoin_lane_contract.js +76 -76
- package/lib/stripe_mpp_lane_contract.js +96 -96
- package/lib/stripe_mpp_payment_front.js +158 -158
- package/lib/telemetry_lane_contract.js +54 -54
- package/lib/treasury_destinations_contract.js +764 -764
- package/lib/treasury_egress_policy_contract.js +91 -91
- package/lib/treasury_lane_contract.js +84 -84
- package/lib/trust_portability_boundary_contract.js +72 -72
- package/lib/x402_facilitator.js +155 -0
- package/lib/x402_lane_contract.js +118 -118
- package/package.json +106 -105
- package/scripts/registry_cli.js +275 -275
- package/scripts/verify_adapters.js +554 -554
- package/scripts/verify_all.js +4962 -4962
- package/scripts/verify_control_plane_contracts.js +34 -34
- package/scripts/verify_control_plane_routes.js +70 -70
- package/scripts/verify_delivery_summary.js +112 -112
- package/scripts/verify_examples.js +19 -19
- package/scripts/verify_first_run_conversions.js +81 -81
- package/scripts/verify_framework_provider_promotion.js +152 -152
- package/scripts/verify_full_catalog.js +174 -174
- package/scripts/verify_integrations.js +620 -620
- package/scripts/verify_lifecycle_continuity.js +96 -96
- package/scripts/verify_market_lane_depth.js +94 -94
- package/scripts/verify_market_lane_promotion.js +103 -103
- package/scripts/verify_market_lane_traces.js +98 -98
- package/scripts/verify_market_lanes.js +102 -102
- package/scripts/verify_operator_observability_boundary.js +83 -83
- package/scripts/verify_pricing_experiment_plan.js +124 -124
- package/scripts/verify_provider_runtime_breadth.js +109 -109
- package/scripts/verify_provider_runtime_journeys.js +111 -111
- package/scripts/verify_revenue_launch_paths.js +105 -105
- package/scripts/verify_runtime_durability.js +52 -52
- package/scripts/verify_service.js +15410 -15250
- package/scripts/verify_tooling.js +1412 -1412
- package/scripts/verify_treasury_public_boundary.js +97 -97
- package/scripts/verify_x402_facilitator.js +174 -0
- package/server.js +11117 -11006
- package/.env.production.checklist +0 -77
- package/.env.production.template +0 -54
- package/.github/workflows/publish-mcp-executor.yml +0 -43
- package/ADAPTER_PARTNER_PATH.md +0 -47
- package/ADAPTER_PROMOTION_START_HERE.md +0 -44
- package/BOLT_BINDINGS.production.worksheet.json +0 -31
- package/EXECUTION_TARGETS.production.worksheet.json +0 -73
- package/GO_LIVE_OPERATOR_PACK.md +0 -412
- package/L402_BINDINGS.production.worksheet.json +0 -30
- package/OPERATIONS_RUNBOOK.md +0 -115
- package/OPERATOR_START_HERE.md +0 -63
- package/OUTREACH_MESSAGES.md +0 -19
- package/OUTREACH_START_HERE.md +0 -36
- package/PRODUCTION_MANUAL_CLOSEOUT_SEQUENCE.md +0 -172
- package/PROGRAM_COMPLETE_RELEASE.md +0 -63
- package/PROGRAM_STATUS.md +0 -57
- package/PUBLISH_PLAN.md +0 -26
- package/RELEASE_CHECKLIST.md +0 -16
- package/SOFT_LAUNCH_KIT.md +0 -47
- package/services/mcp-execution-target/DISCOVERY_REGISTRY_PLAYBOOK.md +0 -141
- package/services/mcp-execution-target/README.md +0 -319
- package/services/mcp-execution-target/package.json +0 -14
- package/services/mcp-execution-target/server.js +0 -1031
- package/services/mcp-execution-target/server.json +0 -16
- package/services/mcp-execution-target/verify.js +0 -308
|
@@ -1,124 +1,124 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const assert = require("assert");
|
|
4
|
-
const {
|
|
5
|
-
buildPricingExperimentPlan,
|
|
6
|
-
summarizePricingExperimentPlan,
|
|
7
|
-
validatePricingExperimentLaunchRequest
|
|
8
|
-
} = require("../lib/pricing_optimization_contract");
|
|
9
|
-
const { createRuntimeState } = require("../lib/commerce_runtime");
|
|
10
|
-
|
|
11
|
-
function populateMaturePricingState(state) {
|
|
12
|
-
for (let index = 0; index < 100; index += 1) {
|
|
13
|
-
state.quotes.set(`quote_${index}`, {
|
|
14
|
-
quote_id: `quote_${index}`,
|
|
15
|
-
status: index < 50 ? "executed" : "expired",
|
|
16
|
-
amount_minor: 40,
|
|
17
|
-
task_refs: ["adapter.mcp.invoke"],
|
|
18
|
-
payment_protocol: "x402",
|
|
19
|
-
settlement_mode: "bsv_teranode"
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
for (let index = 0; index < 20; index += 1) {
|
|
23
|
-
state.paymentLedger.push({
|
|
24
|
-
payment_id: `payment_${index}`,
|
|
25
|
-
status: "recorded",
|
|
26
|
-
amount_minor: 40
|
|
27
|
-
});
|
|
28
|
-
state.transactions.set(`txn_${index}`, {
|
|
29
|
-
transaction: {
|
|
30
|
-
transaction_id: `txn_${index}`,
|
|
31
|
-
status: "completed"
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
function buildValidLaunchRequest(candidate) {
|
|
38
|
-
const rollback_trigger_thresholds = {};
|
|
39
|
-
for (const trigger of candidate.rollback_triggers) {
|
|
40
|
-
rollback_trigger_thresholds[trigger] = "operator_defined_threshold";
|
|
41
|
-
}
|
|
42
|
-
return {
|
|
43
|
-
experiment_id: candidate.experiment_id,
|
|
44
|
-
target_surface: candidate.target_surface,
|
|
45
|
-
operator_approval_ref: "ops.pricing.approval.2026-04-22",
|
|
46
|
-
baseline_metrics_ref: "ops.pricing.baseline.2026-04-22",
|
|
47
|
-
rollback_trigger_thresholds,
|
|
48
|
-
public_checkout_copy_review_ref: "ops.pricing.copy_review.2026-04-22",
|
|
49
|
-
post_experiment_review_window_days: 14
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function assertRejected(plan, request, expectedCode) {
|
|
54
|
-
const validation = validatePricingExperimentLaunchRequest(plan, request);
|
|
55
|
-
assert.strictEqual(validation.launch_allowed, false, `expected ${expectedCode} to block pricing experiment launch`);
|
|
56
|
-
assert.strictEqual(
|
|
57
|
-
validation.rejection_codes.includes(expectedCode),
|
|
58
|
-
true,
|
|
59
|
-
`missing deterministic rejection code ${expectedCode}`
|
|
60
|
-
);
|
|
61
|
-
return validation;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
function main() {
|
|
65
|
-
const state = createRuntimeState();
|
|
66
|
-
const plan = buildPricingExperimentPlan(state);
|
|
67
|
-
const summary = summarizePricingExperimentPlan(state);
|
|
68
|
-
|
|
69
|
-
assert.strictEqual(plan.experiment_plan_version, "xytara-pricing-experiment-plan-v1", "pricing experiment plan version mismatch");
|
|
70
|
-
assert.strictEqual(plan.allow_experiment_launch, false, "empty state must not allow pricing experiments");
|
|
71
|
-
assert.strictEqual(plan.experiment_state, "blocked_collect_more_live_data", "empty state experiment gate mismatch");
|
|
72
|
-
assert.strictEqual(plan.required_minimum_live_sample.quote_count, 100, "quote sample floor mismatch");
|
|
73
|
-
assert.strictEqual(plan.required_minimum_live_sample.payment_ledger_count, 20, "payment sample floor mismatch");
|
|
74
|
-
assert.strictEqual(plan.required_minimum_live_sample.execution_transaction_count, 20, "execution sample floor mismatch");
|
|
75
|
-
assert.strictEqual(plan.candidate_experiments.length >= 3, true, "candidate experiments missing");
|
|
76
|
-
assert.strictEqual(
|
|
77
|
-
plan.candidate_experiments.every((entry) => entry.allowed_now === false),
|
|
78
|
-
true,
|
|
79
|
-
"candidate experiments should be blocked while sparse"
|
|
80
|
-
);
|
|
81
|
-
assert.strictEqual(
|
|
82
|
-
plan.blocked_actions.includes("start_price_ab_test_from_sparse_signals"),
|
|
83
|
-
true,
|
|
84
|
-
"sparse-signal blocked action missing"
|
|
85
|
-
);
|
|
86
|
-
assert.strictEqual(summary.category, "machine-commerce-pricing-experiment-plan-summary", "summary category mismatch");
|
|
87
|
-
assert.strictEqual(summary.allow_experiment_launch, false, "summary experiment launch guard mismatch");
|
|
88
|
-
assert.strictEqual(summary.deterministic_rejection_code_count >= 9, true, "pricing rejection code count missing");
|
|
89
|
-
|
|
90
|
-
assertRejected(plan, buildValidLaunchRequest(plan.candidate_experiments[0]), "pricing_sample_too_sparse");
|
|
91
|
-
assertRejected(plan, { experiment_id: "unknown_experiment" }, "experiment_not_registered");
|
|
92
|
-
|
|
93
|
-
const matureState = createRuntimeState();
|
|
94
|
-
populateMaturePricingState(matureState);
|
|
95
|
-
const maturePlan = buildPricingExperimentPlan(matureState);
|
|
96
|
-
const matureCandidate = maturePlan.candidate_experiments[0];
|
|
97
|
-
const validLaunchRequest = buildValidLaunchRequest(matureCandidate);
|
|
98
|
-
const validLaunch = validatePricingExperimentLaunchRequest(maturePlan, validLaunchRequest);
|
|
99
|
-
assert.strictEqual(maturePlan.allow_experiment_launch, true, "mature state should allow operator-reviewed experiments");
|
|
100
|
-
assert.strictEqual(validLaunch.launch_allowed, true, "valid mature launch request should pass");
|
|
101
|
-
assert.deepStrictEqual(validLaunch.rejection_codes, [], "valid launch request must not carry rejection codes");
|
|
102
|
-
|
|
103
|
-
assertRejected(maturePlan, { ...validLaunchRequest, operator_approval_ref: null }, "operator_approval_missing");
|
|
104
|
-
assertRejected(maturePlan, { ...validLaunchRequest, baseline_metrics_ref: null }, "baseline_metrics_missing");
|
|
105
|
-
assertRejected(maturePlan, { ...validLaunchRequest, rollback_trigger_thresholds: {} }, "rollback_trigger_thresholds_missing");
|
|
106
|
-
assertRejected(maturePlan, { ...validLaunchRequest, public_checkout_copy_review_ref: null }, "public_checkout_copy_review_missing");
|
|
107
|
-
assertRejected(maturePlan, { ...validLaunchRequest, post_experiment_review_window_days: 0 }, "post_experiment_review_window_missing");
|
|
108
|
-
assertRejected(maturePlan, { ...validLaunchRequest, target_surface: "wrong_surface" }, "target_surface_mismatch");
|
|
109
|
-
|
|
110
|
-
const output = {
|
|
111
|
-
ok: true,
|
|
112
|
-
product: "xytara",
|
|
113
|
-
category: "xytara-pricing-experiment-plan-verification",
|
|
114
|
-
status: "experiment_plan_blocks_sparse_signal_and_malformed_launch_requests",
|
|
115
|
-
candidate_experiment_count: plan.candidate_experiments.length,
|
|
116
|
-
launch_requirement_count: plan.launch_requirements.length,
|
|
117
|
-
deterministic_rejection_code_count: plan.deterministic_rejection_codes.length,
|
|
118
|
-
adversarial_case_count: 8,
|
|
119
|
-
boundary: plan.boundary
|
|
120
|
-
};
|
|
121
|
-
process.stdout.write(`${JSON.stringify(output, null, 2)}\n`);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
main();
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const assert = require("assert");
|
|
4
|
+
const {
|
|
5
|
+
buildPricingExperimentPlan,
|
|
6
|
+
summarizePricingExperimentPlan,
|
|
7
|
+
validatePricingExperimentLaunchRequest
|
|
8
|
+
} = require("../lib/pricing_optimization_contract");
|
|
9
|
+
const { createRuntimeState } = require("../lib/commerce_runtime");
|
|
10
|
+
|
|
11
|
+
function populateMaturePricingState(state) {
|
|
12
|
+
for (let index = 0; index < 100; index += 1) {
|
|
13
|
+
state.quotes.set(`quote_${index}`, {
|
|
14
|
+
quote_id: `quote_${index}`,
|
|
15
|
+
status: index < 50 ? "executed" : "expired",
|
|
16
|
+
amount_minor: 40,
|
|
17
|
+
task_refs: ["adapter.mcp.invoke"],
|
|
18
|
+
payment_protocol: "x402",
|
|
19
|
+
settlement_mode: "bsv_teranode"
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
for (let index = 0; index < 20; index += 1) {
|
|
23
|
+
state.paymentLedger.push({
|
|
24
|
+
payment_id: `payment_${index}`,
|
|
25
|
+
status: "recorded",
|
|
26
|
+
amount_minor: 40
|
|
27
|
+
});
|
|
28
|
+
state.transactions.set(`txn_${index}`, {
|
|
29
|
+
transaction: {
|
|
30
|
+
transaction_id: `txn_${index}`,
|
|
31
|
+
status: "completed"
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function buildValidLaunchRequest(candidate) {
|
|
38
|
+
const rollback_trigger_thresholds = {};
|
|
39
|
+
for (const trigger of candidate.rollback_triggers) {
|
|
40
|
+
rollback_trigger_thresholds[trigger] = "operator_defined_threshold";
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
experiment_id: candidate.experiment_id,
|
|
44
|
+
target_surface: candidate.target_surface,
|
|
45
|
+
operator_approval_ref: "ops.pricing.approval.2026-04-22",
|
|
46
|
+
baseline_metrics_ref: "ops.pricing.baseline.2026-04-22",
|
|
47
|
+
rollback_trigger_thresholds,
|
|
48
|
+
public_checkout_copy_review_ref: "ops.pricing.copy_review.2026-04-22",
|
|
49
|
+
post_experiment_review_window_days: 14
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function assertRejected(plan, request, expectedCode) {
|
|
54
|
+
const validation = validatePricingExperimentLaunchRequest(plan, request);
|
|
55
|
+
assert.strictEqual(validation.launch_allowed, false, `expected ${expectedCode} to block pricing experiment launch`);
|
|
56
|
+
assert.strictEqual(
|
|
57
|
+
validation.rejection_codes.includes(expectedCode),
|
|
58
|
+
true,
|
|
59
|
+
`missing deterministic rejection code ${expectedCode}`
|
|
60
|
+
);
|
|
61
|
+
return validation;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function main() {
|
|
65
|
+
const state = createRuntimeState();
|
|
66
|
+
const plan = buildPricingExperimentPlan(state);
|
|
67
|
+
const summary = summarizePricingExperimentPlan(state);
|
|
68
|
+
|
|
69
|
+
assert.strictEqual(plan.experiment_plan_version, "xytara-pricing-experiment-plan-v1", "pricing experiment plan version mismatch");
|
|
70
|
+
assert.strictEqual(plan.allow_experiment_launch, false, "empty state must not allow pricing experiments");
|
|
71
|
+
assert.strictEqual(plan.experiment_state, "blocked_collect_more_live_data", "empty state experiment gate mismatch");
|
|
72
|
+
assert.strictEqual(plan.required_minimum_live_sample.quote_count, 100, "quote sample floor mismatch");
|
|
73
|
+
assert.strictEqual(plan.required_minimum_live_sample.payment_ledger_count, 20, "payment sample floor mismatch");
|
|
74
|
+
assert.strictEqual(plan.required_minimum_live_sample.execution_transaction_count, 20, "execution sample floor mismatch");
|
|
75
|
+
assert.strictEqual(plan.candidate_experiments.length >= 3, true, "candidate experiments missing");
|
|
76
|
+
assert.strictEqual(
|
|
77
|
+
plan.candidate_experiments.every((entry) => entry.allowed_now === false),
|
|
78
|
+
true,
|
|
79
|
+
"candidate experiments should be blocked while sparse"
|
|
80
|
+
);
|
|
81
|
+
assert.strictEqual(
|
|
82
|
+
plan.blocked_actions.includes("start_price_ab_test_from_sparse_signals"),
|
|
83
|
+
true,
|
|
84
|
+
"sparse-signal blocked action missing"
|
|
85
|
+
);
|
|
86
|
+
assert.strictEqual(summary.category, "machine-commerce-pricing-experiment-plan-summary", "summary category mismatch");
|
|
87
|
+
assert.strictEqual(summary.allow_experiment_launch, false, "summary experiment launch guard mismatch");
|
|
88
|
+
assert.strictEqual(summary.deterministic_rejection_code_count >= 9, true, "pricing rejection code count missing");
|
|
89
|
+
|
|
90
|
+
assertRejected(plan, buildValidLaunchRequest(plan.candidate_experiments[0]), "pricing_sample_too_sparse");
|
|
91
|
+
assertRejected(plan, { experiment_id: "unknown_experiment" }, "experiment_not_registered");
|
|
92
|
+
|
|
93
|
+
const matureState = createRuntimeState();
|
|
94
|
+
populateMaturePricingState(matureState);
|
|
95
|
+
const maturePlan = buildPricingExperimentPlan(matureState);
|
|
96
|
+
const matureCandidate = maturePlan.candidate_experiments[0];
|
|
97
|
+
const validLaunchRequest = buildValidLaunchRequest(matureCandidate);
|
|
98
|
+
const validLaunch = validatePricingExperimentLaunchRequest(maturePlan, validLaunchRequest);
|
|
99
|
+
assert.strictEqual(maturePlan.allow_experiment_launch, true, "mature state should allow operator-reviewed experiments");
|
|
100
|
+
assert.strictEqual(validLaunch.launch_allowed, true, "valid mature launch request should pass");
|
|
101
|
+
assert.deepStrictEqual(validLaunch.rejection_codes, [], "valid launch request must not carry rejection codes");
|
|
102
|
+
|
|
103
|
+
assertRejected(maturePlan, { ...validLaunchRequest, operator_approval_ref: null }, "operator_approval_missing");
|
|
104
|
+
assertRejected(maturePlan, { ...validLaunchRequest, baseline_metrics_ref: null }, "baseline_metrics_missing");
|
|
105
|
+
assertRejected(maturePlan, { ...validLaunchRequest, rollback_trigger_thresholds: {} }, "rollback_trigger_thresholds_missing");
|
|
106
|
+
assertRejected(maturePlan, { ...validLaunchRequest, public_checkout_copy_review_ref: null }, "public_checkout_copy_review_missing");
|
|
107
|
+
assertRejected(maturePlan, { ...validLaunchRequest, post_experiment_review_window_days: 0 }, "post_experiment_review_window_missing");
|
|
108
|
+
assertRejected(maturePlan, { ...validLaunchRequest, target_surface: "wrong_surface" }, "target_surface_mismatch");
|
|
109
|
+
|
|
110
|
+
const output = {
|
|
111
|
+
ok: true,
|
|
112
|
+
product: "xytara",
|
|
113
|
+
category: "xytara-pricing-experiment-plan-verification",
|
|
114
|
+
status: "experiment_plan_blocks_sparse_signal_and_malformed_launch_requests",
|
|
115
|
+
candidate_experiment_count: plan.candidate_experiments.length,
|
|
116
|
+
launch_requirement_count: plan.launch_requirements.length,
|
|
117
|
+
deterministic_rejection_code_count: plan.deterministic_rejection_codes.length,
|
|
118
|
+
adversarial_case_count: 8,
|
|
119
|
+
boundary: plan.boundary
|
|
120
|
+
};
|
|
121
|
+
process.stdout.write(`${JSON.stringify(output, null, 2)}\n`);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
main();
|
|
@@ -1,109 +1,109 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const assert = require("assert");
|
|
4
|
-
const { createServer } = require("../server");
|
|
5
|
-
const {
|
|
6
|
-
buildProviderLanePack,
|
|
7
|
-
getProviderProfileDetail,
|
|
8
|
-
summarizeProviderLanePack
|
|
9
|
-
} = require("../lib/provider_lane_contract");
|
|
10
|
-
|
|
11
|
-
async function getJson(baseUrl, path) {
|
|
12
|
-
const response = await fetch(`${baseUrl}${path}`);
|
|
13
|
-
return {
|
|
14
|
-
status: response.status,
|
|
15
|
-
json: await response.json()
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
async function main() {
|
|
20
|
-
const previousExecutionTargets = process.env.XYTARA_EXECUTION_TARGETS_JSON;
|
|
21
|
-
process.env.XYTARA_EXECUTION_TARGETS_JSON = JSON.stringify([
|
|
22
|
-
{
|
|
23
|
-
target_id: "verify-provider-runtime-mcp-target",
|
|
24
|
-
task_ref: "adapter.mcp.invoke",
|
|
25
|
-
endpoint_url: "http://127.0.0.1:65535/execute",
|
|
26
|
-
provider: "xytara_mcp_executor",
|
|
27
|
-
tool_name: "summarize",
|
|
28
|
-
auth_token: "verify-provider-runtime-bearer",
|
|
29
|
-
timeout_ms: 1500,
|
|
30
|
-
enabled: true
|
|
31
|
-
}
|
|
32
|
-
]);
|
|
33
|
-
|
|
34
|
-
const pack = buildProviderLanePack();
|
|
35
|
-
const summary = summarizeProviderLanePack();
|
|
36
|
-
assert.strictEqual(pack.ok, true, "provider lane pack ok flag missing");
|
|
37
|
-
assert.strictEqual(summary.ok, true, "provider lane summary ok flag missing");
|
|
38
|
-
assert.strictEqual(pack.category, "machine-commerce-provider-lane-pack", "provider lane category mismatch");
|
|
39
|
-
assert.strictEqual(pack.pack_version, "xytara-provider-lane-pack-v2", "provider lane version mismatch");
|
|
40
|
-
assert.strictEqual(summary.summary_version, "xytara-provider-lane-pack-summary-v2", "provider lane summary version mismatch");
|
|
41
|
-
assert.strictEqual(summary.provider_profile_count >= 2, true, "provider profile count missing");
|
|
42
|
-
assert.strictEqual(summary.first_party_callable_profile_count >= 2, true, "provider callable profile count missing");
|
|
43
|
-
assert.strictEqual(summary.revenue_ready_profile_count >= 2, true, "provider revenue-ready profile count missing");
|
|
44
|
-
assert.strictEqual(summary.provider_live_anchor_profile_count >= 1, true, "provider live-anchor profile count missing");
|
|
45
|
-
assert.strictEqual(summary.proof_followthrough_profile_count >= 2, true, "provider proof-followthrough profile count missing");
|
|
46
|
-
|
|
47
|
-
const openaiProfile = getProviderProfileDetail("openai_codex");
|
|
48
|
-
const claudeProfile = getProviderProfileDetail("claude_mcp");
|
|
49
|
-
assert.strictEqual(Boolean(openaiProfile), true, "openai provider profile missing");
|
|
50
|
-
assert.strictEqual(Boolean(claudeProfile), true, "claude provider profile missing");
|
|
51
|
-
assert.strictEqual(openaiProfile.revenue_ready, true, "openai provider revenue readiness missing");
|
|
52
|
-
assert.strictEqual(claudeProfile.provider_live_anchor_ready, true, "claude provider live anchor readiness missing");
|
|
53
|
-
assert.strictEqual(claudeProfile.runtime_gates.promotion_ready, true, "claude provider promotion readiness missing");
|
|
54
|
-
|
|
55
|
-
const server = createServer();
|
|
56
|
-
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
|
|
57
|
-
const address = server.address();
|
|
58
|
-
const baseUrl = `http://127.0.0.1:${address.port}`;
|
|
59
|
-
|
|
60
|
-
try {
|
|
61
|
-
const providerLane = await getJson(baseUrl, "/v1/providers");
|
|
62
|
-
assert.strictEqual(providerLane.status, 200, "provider lane route failed");
|
|
63
|
-
assert.strictEqual(providerLane.json.ok, true, "provider lane route ok flag missing");
|
|
64
|
-
assert.strictEqual(providerLane.json.provider_profile_count >= 2, true, "provider lane route profile count missing");
|
|
65
|
-
assert.strictEqual(providerLane.json.provider_live_anchor_profile_count >= 1, true, "provider lane route live-anchor count missing");
|
|
66
|
-
assert.strictEqual(providerLane.json.revenue_ready_profile_count >= 2, true, "provider lane route revenue-ready count missing");
|
|
67
|
-
|
|
68
|
-
const providerLaneSummary = await getJson(baseUrl, "/v1/providers/summary");
|
|
69
|
-
assert.strictEqual(providerLaneSummary.status, 200, "provider lane summary route failed");
|
|
70
|
-
assert.strictEqual(providerLaneSummary.json.ok, true, "provider lane summary route ok flag missing");
|
|
71
|
-
assert.strictEqual(providerLaneSummary.json.provider_profile_count >= 2, true, "provider lane summary profile count missing");
|
|
72
|
-
assert.strictEqual(providerLaneSummary.json.provider_live_anchor_profile_count >= 1, true, "provider lane summary live-anchor count missing");
|
|
73
|
-
assert.strictEqual(providerLaneSummary.json.revenue_ready_profile_count >= 2, true, "provider lane summary revenue-ready count missing");
|
|
74
|
-
|
|
75
|
-
const openaiDetail = await getJson(baseUrl, "/v1/providers/openai_codex");
|
|
76
|
-
assert.strictEqual(openaiDetail.status, 200, "openai provider detail route failed");
|
|
77
|
-
assert.strictEqual(openaiDetail.json.provider.provider_id, "openai_codex", "openai provider detail id mismatch");
|
|
78
|
-
assert.strictEqual(openaiDetail.json.provider.runtime_gates.machine_entry_ready, true, "openai provider machine-entry gate missing");
|
|
79
|
-
assert.strictEqual(openaiDetail.json.provider.runtime_gates.paid_execution_ready, true, "openai provider paid-execution gate missing");
|
|
80
|
-
|
|
81
|
-
const claudeDetail = await getJson(baseUrl, "/v1/providers/claude_mcp");
|
|
82
|
-
assert.strictEqual(claudeDetail.status, 200, "claude provider detail route failed");
|
|
83
|
-
assert.strictEqual(claudeDetail.json.provider.provider_id, "claude_mcp", "claude provider detail id mismatch");
|
|
84
|
-
assert.strictEqual(claudeDetail.json.provider.provider_live_anchor_ready, true, "claude provider live-anchor detail missing");
|
|
85
|
-
assert.strictEqual(claudeDetail.json.provider.runtime_gates.adapter_depth_ready, true, "claude provider adapter-depth gate missing");
|
|
86
|
-
assert.strictEqual(claudeDetail.json.provider.runtime_gates.trace_ready, true, "claude provider trace gate missing");
|
|
87
|
-
} finally {
|
|
88
|
-
await new Promise((resolve) => server.close(resolve));
|
|
89
|
-
if (previousExecutionTargets === undefined) delete process.env.XYTARA_EXECUTION_TARGETS_JSON;
|
|
90
|
-
else process.env.XYTARA_EXECUTION_TARGETS_JSON = previousExecutionTargets;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
process.stdout.write(`${JSON.stringify({
|
|
94
|
-
ok: true,
|
|
95
|
-
product: "xytara",
|
|
96
|
-
category: "xytara-provider-runtime-breadth-verification",
|
|
97
|
-
provider_profile_count: summary.provider_profile_count,
|
|
98
|
-
provider_live_anchor_profile_count: summary.provider_live_anchor_profile_count,
|
|
99
|
-
first_party_callable_profile_count: summary.first_party_callable_profile_count,
|
|
100
|
-
revenue_ready_profile_count: summary.revenue_ready_profile_count,
|
|
101
|
-
proof_followthrough_profile_count: summary.proof_followthrough_profile_count,
|
|
102
|
-
boundary: "provider_runtime_breadth_requires_named_provider_profiles_with_bounded_entry_surfaces_and_public_runtime_gates"
|
|
103
|
-
}, null, 2)}\n`);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
main().catch((error) => {
|
|
107
|
-
console.error(error && error.stack ? error.stack : error);
|
|
108
|
-
process.exit(1);
|
|
109
|
-
});
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const assert = require("assert");
|
|
4
|
+
const { createServer } = require("../server");
|
|
5
|
+
const {
|
|
6
|
+
buildProviderLanePack,
|
|
7
|
+
getProviderProfileDetail,
|
|
8
|
+
summarizeProviderLanePack
|
|
9
|
+
} = require("../lib/provider_lane_contract");
|
|
10
|
+
|
|
11
|
+
async function getJson(baseUrl, path) {
|
|
12
|
+
const response = await fetch(`${baseUrl}${path}`);
|
|
13
|
+
return {
|
|
14
|
+
status: response.status,
|
|
15
|
+
json: await response.json()
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async function main() {
|
|
20
|
+
const previousExecutionTargets = process.env.XYTARA_EXECUTION_TARGETS_JSON;
|
|
21
|
+
process.env.XYTARA_EXECUTION_TARGETS_JSON = JSON.stringify([
|
|
22
|
+
{
|
|
23
|
+
target_id: "verify-provider-runtime-mcp-target",
|
|
24
|
+
task_ref: "adapter.mcp.invoke",
|
|
25
|
+
endpoint_url: "http://127.0.0.1:65535/execute",
|
|
26
|
+
provider: "xytara_mcp_executor",
|
|
27
|
+
tool_name: "summarize",
|
|
28
|
+
auth_token: "verify-provider-runtime-bearer",
|
|
29
|
+
timeout_ms: 1500,
|
|
30
|
+
enabled: true
|
|
31
|
+
}
|
|
32
|
+
]);
|
|
33
|
+
|
|
34
|
+
const pack = buildProviderLanePack();
|
|
35
|
+
const summary = summarizeProviderLanePack();
|
|
36
|
+
assert.strictEqual(pack.ok, true, "provider lane pack ok flag missing");
|
|
37
|
+
assert.strictEqual(summary.ok, true, "provider lane summary ok flag missing");
|
|
38
|
+
assert.strictEqual(pack.category, "machine-commerce-provider-lane-pack", "provider lane category mismatch");
|
|
39
|
+
assert.strictEqual(pack.pack_version, "xytara-provider-lane-pack-v2", "provider lane version mismatch");
|
|
40
|
+
assert.strictEqual(summary.summary_version, "xytara-provider-lane-pack-summary-v2", "provider lane summary version mismatch");
|
|
41
|
+
assert.strictEqual(summary.provider_profile_count >= 2, true, "provider profile count missing");
|
|
42
|
+
assert.strictEqual(summary.first_party_callable_profile_count >= 2, true, "provider callable profile count missing");
|
|
43
|
+
assert.strictEqual(summary.revenue_ready_profile_count >= 2, true, "provider revenue-ready profile count missing");
|
|
44
|
+
assert.strictEqual(summary.provider_live_anchor_profile_count >= 1, true, "provider live-anchor profile count missing");
|
|
45
|
+
assert.strictEqual(summary.proof_followthrough_profile_count >= 2, true, "provider proof-followthrough profile count missing");
|
|
46
|
+
|
|
47
|
+
const openaiProfile = getProviderProfileDetail("openai_codex");
|
|
48
|
+
const claudeProfile = getProviderProfileDetail("claude_mcp");
|
|
49
|
+
assert.strictEqual(Boolean(openaiProfile), true, "openai provider profile missing");
|
|
50
|
+
assert.strictEqual(Boolean(claudeProfile), true, "claude provider profile missing");
|
|
51
|
+
assert.strictEqual(openaiProfile.revenue_ready, true, "openai provider revenue readiness missing");
|
|
52
|
+
assert.strictEqual(claudeProfile.provider_live_anchor_ready, true, "claude provider live anchor readiness missing");
|
|
53
|
+
assert.strictEqual(claudeProfile.runtime_gates.promotion_ready, true, "claude provider promotion readiness missing");
|
|
54
|
+
|
|
55
|
+
const server = createServer();
|
|
56
|
+
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
|
|
57
|
+
const address = server.address();
|
|
58
|
+
const baseUrl = `http://127.0.0.1:${address.port}`;
|
|
59
|
+
|
|
60
|
+
try {
|
|
61
|
+
const providerLane = await getJson(baseUrl, "/v1/providers");
|
|
62
|
+
assert.strictEqual(providerLane.status, 200, "provider lane route failed");
|
|
63
|
+
assert.strictEqual(providerLane.json.ok, true, "provider lane route ok flag missing");
|
|
64
|
+
assert.strictEqual(providerLane.json.provider_profile_count >= 2, true, "provider lane route profile count missing");
|
|
65
|
+
assert.strictEqual(providerLane.json.provider_live_anchor_profile_count >= 1, true, "provider lane route live-anchor count missing");
|
|
66
|
+
assert.strictEqual(providerLane.json.revenue_ready_profile_count >= 2, true, "provider lane route revenue-ready count missing");
|
|
67
|
+
|
|
68
|
+
const providerLaneSummary = await getJson(baseUrl, "/v1/providers/summary");
|
|
69
|
+
assert.strictEqual(providerLaneSummary.status, 200, "provider lane summary route failed");
|
|
70
|
+
assert.strictEqual(providerLaneSummary.json.ok, true, "provider lane summary route ok flag missing");
|
|
71
|
+
assert.strictEqual(providerLaneSummary.json.provider_profile_count >= 2, true, "provider lane summary profile count missing");
|
|
72
|
+
assert.strictEqual(providerLaneSummary.json.provider_live_anchor_profile_count >= 1, true, "provider lane summary live-anchor count missing");
|
|
73
|
+
assert.strictEqual(providerLaneSummary.json.revenue_ready_profile_count >= 2, true, "provider lane summary revenue-ready count missing");
|
|
74
|
+
|
|
75
|
+
const openaiDetail = await getJson(baseUrl, "/v1/providers/openai_codex");
|
|
76
|
+
assert.strictEqual(openaiDetail.status, 200, "openai provider detail route failed");
|
|
77
|
+
assert.strictEqual(openaiDetail.json.provider.provider_id, "openai_codex", "openai provider detail id mismatch");
|
|
78
|
+
assert.strictEqual(openaiDetail.json.provider.runtime_gates.machine_entry_ready, true, "openai provider machine-entry gate missing");
|
|
79
|
+
assert.strictEqual(openaiDetail.json.provider.runtime_gates.paid_execution_ready, true, "openai provider paid-execution gate missing");
|
|
80
|
+
|
|
81
|
+
const claudeDetail = await getJson(baseUrl, "/v1/providers/claude_mcp");
|
|
82
|
+
assert.strictEqual(claudeDetail.status, 200, "claude provider detail route failed");
|
|
83
|
+
assert.strictEqual(claudeDetail.json.provider.provider_id, "claude_mcp", "claude provider detail id mismatch");
|
|
84
|
+
assert.strictEqual(claudeDetail.json.provider.provider_live_anchor_ready, true, "claude provider live-anchor detail missing");
|
|
85
|
+
assert.strictEqual(claudeDetail.json.provider.runtime_gates.adapter_depth_ready, true, "claude provider adapter-depth gate missing");
|
|
86
|
+
assert.strictEqual(claudeDetail.json.provider.runtime_gates.trace_ready, true, "claude provider trace gate missing");
|
|
87
|
+
} finally {
|
|
88
|
+
await new Promise((resolve) => server.close(resolve));
|
|
89
|
+
if (previousExecutionTargets === undefined) delete process.env.XYTARA_EXECUTION_TARGETS_JSON;
|
|
90
|
+
else process.env.XYTARA_EXECUTION_TARGETS_JSON = previousExecutionTargets;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
process.stdout.write(`${JSON.stringify({
|
|
94
|
+
ok: true,
|
|
95
|
+
product: "xytara",
|
|
96
|
+
category: "xytara-provider-runtime-breadth-verification",
|
|
97
|
+
provider_profile_count: summary.provider_profile_count,
|
|
98
|
+
provider_live_anchor_profile_count: summary.provider_live_anchor_profile_count,
|
|
99
|
+
first_party_callable_profile_count: summary.first_party_callable_profile_count,
|
|
100
|
+
revenue_ready_profile_count: summary.revenue_ready_profile_count,
|
|
101
|
+
proof_followthrough_profile_count: summary.proof_followthrough_profile_count,
|
|
102
|
+
boundary: "provider_runtime_breadth_requires_named_provider_profiles_with_bounded_entry_surfaces_and_public_runtime_gates"
|
|
103
|
+
}, null, 2)}\n`);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
main().catch((error) => {
|
|
107
|
+
console.error(error && error.stack ? error.stack : error);
|
|
108
|
+
process.exit(1);
|
|
109
|
+
});
|