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
package/bin/xytara-run.js
CHANGED
|
@@ -1,186 +1,186 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
|
|
4
|
-
const crypto = require("crypto");
|
|
5
|
-
|
|
6
|
-
function parseArgs(argv) {
|
|
7
|
-
const args = {};
|
|
8
|
-
for (let index = 0; index < argv.length; index += 1) {
|
|
9
|
-
const token = argv[index];
|
|
10
|
-
if (!token.startsWith("--")) continue;
|
|
11
|
-
const key = token.slice(2);
|
|
12
|
-
const next = argv[index + 1];
|
|
13
|
-
if (!next || next.startsWith("--")) {
|
|
14
|
-
args[key] = true;
|
|
15
|
-
continue;
|
|
16
|
-
}
|
|
17
|
-
args[key] = next;
|
|
18
|
-
index += 1;
|
|
19
|
-
}
|
|
20
|
-
return args;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function printUsage() {
|
|
24
|
-
process.stdout.write([
|
|
25
|
-
"Usage: xytara-run --url <service_url> --account <account_id> --command <intent> --task <task_ref> [options]",
|
|
26
|
-
"",
|
|
27
|
-
"Options:",
|
|
28
|
-
" --body-json <json> JSON body for the task payload",
|
|
29
|
-
" --wallet-id <id> Wallet id for local_signed x402 payment",
|
|
30
|
-
" --wallet-secret <secret> Shared secret for local_signed payment",
|
|
31
|
-
" --txid <txid> Existing BSV txid for bsv_teranode settlement",
|
|
32
|
-
" --raw-tx <hex> Raw BSV transaction for arc submission flows",
|
|
33
|
-
" --quote-only Stop after returning the payment challenge",
|
|
34
|
-
" --pretty Pretty-print JSON output",
|
|
35
|
-
" --help Show this help message"
|
|
36
|
-
].join("\n"));
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function parseJson(value, label) {
|
|
40
|
-
if (value == null || value === "") return {};
|
|
41
|
-
try {
|
|
42
|
-
return JSON.parse(value);
|
|
43
|
-
} catch (error) {
|
|
44
|
-
throw new Error(`${label}_must_be_valid_json`);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
async function postJson(url, payload, headers = {}) {
|
|
49
|
-
const response = await fetch(url, {
|
|
50
|
-
method: "POST",
|
|
51
|
-
headers: {
|
|
52
|
-
"content-type": "application/json",
|
|
53
|
-
...headers
|
|
54
|
-
},
|
|
55
|
-
body: JSON.stringify(payload)
|
|
56
|
-
});
|
|
57
|
-
const text = await response.text();
|
|
58
|
-
let json = null;
|
|
59
|
-
try {
|
|
60
|
-
json = text ? JSON.parse(text) : null;
|
|
61
|
-
} catch (_) {
|
|
62
|
-
json = null;
|
|
63
|
-
}
|
|
64
|
-
return {
|
|
65
|
-
status: response.status,
|
|
66
|
-
ok: response.ok,
|
|
67
|
-
json,
|
|
68
|
-
text
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
function buildLocalSignedPaymentSignature({ quote, accountId, walletId, walletSecret, txid, rawTx }) {
|
|
73
|
-
const payment = {
|
|
74
|
-
account_id: accountId,
|
|
75
|
-
wallet_id: walletId,
|
|
76
|
-
quote_id: quote.quote_id,
|
|
77
|
-
amount_minor: quote.amount_minor,
|
|
78
|
-
currency: quote.currency,
|
|
79
|
-
settlement_mode: quote.settlement.mode,
|
|
80
|
-
settlement_binding_hash: quote.settlement_binding_hash
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
if (quote.settlement && quote.settlement.mode === "bsv_teranode") {
|
|
84
|
-
payment.bsv_teranode = {
|
|
85
|
-
network: quote.settlement.hints && quote.settlement.hints.network ? quote.settlement.hints.network : null,
|
|
86
|
-
merchant_address: quote.settlement.hints && quote.settlement.hints.merchant_address ? quote.settlement.hints.merchant_address : null,
|
|
87
|
-
amount_satoshis: quote.settlement.hints && quote.settlement.hints.amount_satoshis != null ? quote.settlement.hints.amount_satoshis : null,
|
|
88
|
-
settlement_reference: quote.settlement.hints && quote.settlement.hints.settlement_reference ? quote.settlement.hints.settlement_reference : null
|
|
89
|
-
};
|
|
90
|
-
if (txid) payment.bsv_teranode.txid = txid;
|
|
91
|
-
if (rawTx) payment.bsv_teranode.raw_tx = rawTx;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
payment.issued_at_iso = new Date().toISOString();
|
|
95
|
-
payment.nonce = `xytara-cli-${Date.now()}`;
|
|
96
|
-
|
|
97
|
-
const encoded = Buffer.from(JSON.stringify(payment), "utf8").toString("base64url");
|
|
98
|
-
const signature = crypto.createHmac("sha256", walletSecret).update(encoded).digest("hex");
|
|
99
|
-
return Buffer.from(JSON.stringify({
|
|
100
|
-
scheme: "exact",
|
|
101
|
-
wallet_id: walletId,
|
|
102
|
-
payload: encoded,
|
|
103
|
-
signature
|
|
104
|
-
}), "utf8").toString("base64url");
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
function writeOutput(payload, pretty) {
|
|
108
|
-
process.stdout.write(JSON.stringify(payload, null, pretty ? 2 : 0));
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
async function main() {
|
|
112
|
-
const args = parseArgs(process.argv.slice(2));
|
|
113
|
-
if (args.help) {
|
|
114
|
-
printUsage();
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
const serviceUrl = String(args.url || "").replace(/\/$/, "");
|
|
119
|
-
const accountId = String(args.account || "").trim();
|
|
120
|
-
const command = String(args.command || "").trim();
|
|
121
|
-
const taskRef = String(args.task || args["task-ref"] || "").trim();
|
|
122
|
-
const body = parseJson(args["body-json"], "body_json");
|
|
123
|
-
const walletId = String(args["wallet-id"] || "").trim();
|
|
124
|
-
const walletSecret = String(args["wallet-secret"] || "").trim();
|
|
125
|
-
const txid = String(args.txid || "").trim() || null;
|
|
126
|
-
const rawTx = String(args["raw-tx"] || "").trim() || null;
|
|
127
|
-
const pretty = args.pretty === true;
|
|
128
|
-
|
|
129
|
-
if (!serviceUrl || !accountId || !command || !taskRef) {
|
|
130
|
-
printUsage();
|
|
131
|
-
process.exitCode = 1;
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
const executeUrl = `${serviceUrl}/x402/commands/execute`;
|
|
136
|
-
const payload = {
|
|
137
|
-
account_id: accountId,
|
|
138
|
-
command,
|
|
139
|
-
task_ref: taskRef,
|
|
140
|
-
body
|
|
141
|
-
};
|
|
142
|
-
|
|
143
|
-
const challengeResult = await postJson(executeUrl, payload);
|
|
144
|
-
if (challengeResult.ok) {
|
|
145
|
-
writeOutput(challengeResult.json || { ok: true }, pretty);
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
if (challengeResult.status !== 402 || !challengeResult.json || !challengeResult.json.payment_required) {
|
|
149
|
-
writeOutput(challengeResult.json || { ok: false, status: challengeResult.status, body: challengeResult.text || null }, pretty);
|
|
150
|
-
process.exitCode = 1;
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
if (args["quote-only"] === true || !walletId || !walletSecret) {
|
|
155
|
-
writeOutput(challengeResult.json, pretty);
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
const quote = challengeResult.json.payment_required.quote;
|
|
160
|
-
const paymentSignature = buildLocalSignedPaymentSignature({
|
|
161
|
-
quote,
|
|
162
|
-
accountId,
|
|
163
|
-
walletId,
|
|
164
|
-
walletSecret,
|
|
165
|
-
txid,
|
|
166
|
-
rawTx
|
|
167
|
-
});
|
|
168
|
-
const paidPayload = {
|
|
169
|
-
...payload,
|
|
170
|
-
quote_id: quote.quote_id
|
|
171
|
-
};
|
|
172
|
-
const paidResult = await postJson(executeUrl, paidPayload, {
|
|
173
|
-
"payment-signature": paymentSignature
|
|
174
|
-
});
|
|
175
|
-
if (!paidResult.ok) {
|
|
176
|
-
writeOutput(paidResult.json || { ok: false, status: paidResult.status, body: paidResult.text || null }, pretty);
|
|
177
|
-
process.exitCode = 1;
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
writeOutput(paidResult.json || { ok: true }, pretty);
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
main().catch((error) => {
|
|
184
|
-
process.stderr.write(`${error.message}\n`);
|
|
185
|
-
process.exitCode = 1;
|
|
186
|
-
});
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
const crypto = require("crypto");
|
|
5
|
+
|
|
6
|
+
function parseArgs(argv) {
|
|
7
|
+
const args = {};
|
|
8
|
+
for (let index = 0; index < argv.length; index += 1) {
|
|
9
|
+
const token = argv[index];
|
|
10
|
+
if (!token.startsWith("--")) continue;
|
|
11
|
+
const key = token.slice(2);
|
|
12
|
+
const next = argv[index + 1];
|
|
13
|
+
if (!next || next.startsWith("--")) {
|
|
14
|
+
args[key] = true;
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
args[key] = next;
|
|
18
|
+
index += 1;
|
|
19
|
+
}
|
|
20
|
+
return args;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function printUsage() {
|
|
24
|
+
process.stdout.write([
|
|
25
|
+
"Usage: xytara-run --url <service_url> --account <account_id> --command <intent> --task <task_ref> [options]",
|
|
26
|
+
"",
|
|
27
|
+
"Options:",
|
|
28
|
+
" --body-json <json> JSON body for the task payload",
|
|
29
|
+
" --wallet-id <id> Wallet id for local_signed x402 payment",
|
|
30
|
+
" --wallet-secret <secret> Shared secret for local_signed payment",
|
|
31
|
+
" --txid <txid> Existing BSV txid for bsv_teranode settlement",
|
|
32
|
+
" --raw-tx <hex> Raw BSV transaction for arc submission flows",
|
|
33
|
+
" --quote-only Stop after returning the payment challenge",
|
|
34
|
+
" --pretty Pretty-print JSON output",
|
|
35
|
+
" --help Show this help message"
|
|
36
|
+
].join("\n"));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function parseJson(value, label) {
|
|
40
|
+
if (value == null || value === "") return {};
|
|
41
|
+
try {
|
|
42
|
+
return JSON.parse(value);
|
|
43
|
+
} catch (error) {
|
|
44
|
+
throw new Error(`${label}_must_be_valid_json`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async function postJson(url, payload, headers = {}) {
|
|
49
|
+
const response = await fetch(url, {
|
|
50
|
+
method: "POST",
|
|
51
|
+
headers: {
|
|
52
|
+
"content-type": "application/json",
|
|
53
|
+
...headers
|
|
54
|
+
},
|
|
55
|
+
body: JSON.stringify(payload)
|
|
56
|
+
});
|
|
57
|
+
const text = await response.text();
|
|
58
|
+
let json = null;
|
|
59
|
+
try {
|
|
60
|
+
json = text ? JSON.parse(text) : null;
|
|
61
|
+
} catch (_) {
|
|
62
|
+
json = null;
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
status: response.status,
|
|
66
|
+
ok: response.ok,
|
|
67
|
+
json,
|
|
68
|
+
text
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function buildLocalSignedPaymentSignature({ quote, accountId, walletId, walletSecret, txid, rawTx }) {
|
|
73
|
+
const payment = {
|
|
74
|
+
account_id: accountId,
|
|
75
|
+
wallet_id: walletId,
|
|
76
|
+
quote_id: quote.quote_id,
|
|
77
|
+
amount_minor: quote.amount_minor,
|
|
78
|
+
currency: quote.currency,
|
|
79
|
+
settlement_mode: quote.settlement.mode,
|
|
80
|
+
settlement_binding_hash: quote.settlement_binding_hash
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
if (quote.settlement && quote.settlement.mode === "bsv_teranode") {
|
|
84
|
+
payment.bsv_teranode = {
|
|
85
|
+
network: quote.settlement.hints && quote.settlement.hints.network ? quote.settlement.hints.network : null,
|
|
86
|
+
merchant_address: quote.settlement.hints && quote.settlement.hints.merchant_address ? quote.settlement.hints.merchant_address : null,
|
|
87
|
+
amount_satoshis: quote.settlement.hints && quote.settlement.hints.amount_satoshis != null ? quote.settlement.hints.amount_satoshis : null,
|
|
88
|
+
settlement_reference: quote.settlement.hints && quote.settlement.hints.settlement_reference ? quote.settlement.hints.settlement_reference : null
|
|
89
|
+
};
|
|
90
|
+
if (txid) payment.bsv_teranode.txid = txid;
|
|
91
|
+
if (rawTx) payment.bsv_teranode.raw_tx = rawTx;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
payment.issued_at_iso = new Date().toISOString();
|
|
95
|
+
payment.nonce = `xytara-cli-${Date.now()}`;
|
|
96
|
+
|
|
97
|
+
const encoded = Buffer.from(JSON.stringify(payment), "utf8").toString("base64url");
|
|
98
|
+
const signature = crypto.createHmac("sha256", walletSecret).update(encoded).digest("hex");
|
|
99
|
+
return Buffer.from(JSON.stringify({
|
|
100
|
+
scheme: "exact",
|
|
101
|
+
wallet_id: walletId,
|
|
102
|
+
payload: encoded,
|
|
103
|
+
signature
|
|
104
|
+
}), "utf8").toString("base64url");
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function writeOutput(payload, pretty) {
|
|
108
|
+
process.stdout.write(JSON.stringify(payload, null, pretty ? 2 : 0));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
async function main() {
|
|
112
|
+
const args = parseArgs(process.argv.slice(2));
|
|
113
|
+
if (args.help) {
|
|
114
|
+
printUsage();
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const serviceUrl = String(args.url || "").replace(/\/$/, "");
|
|
119
|
+
const accountId = String(args.account || "").trim();
|
|
120
|
+
const command = String(args.command || "").trim();
|
|
121
|
+
const taskRef = String(args.task || args["task-ref"] || "").trim();
|
|
122
|
+
const body = parseJson(args["body-json"], "body_json");
|
|
123
|
+
const walletId = String(args["wallet-id"] || "").trim();
|
|
124
|
+
const walletSecret = String(args["wallet-secret"] || "").trim();
|
|
125
|
+
const txid = String(args.txid || "").trim() || null;
|
|
126
|
+
const rawTx = String(args["raw-tx"] || "").trim() || null;
|
|
127
|
+
const pretty = args.pretty === true;
|
|
128
|
+
|
|
129
|
+
if (!serviceUrl || !accountId || !command || !taskRef) {
|
|
130
|
+
printUsage();
|
|
131
|
+
process.exitCode = 1;
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const executeUrl = `${serviceUrl}/x402/commands/execute`;
|
|
136
|
+
const payload = {
|
|
137
|
+
account_id: accountId,
|
|
138
|
+
command,
|
|
139
|
+
task_ref: taskRef,
|
|
140
|
+
body
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const challengeResult = await postJson(executeUrl, payload);
|
|
144
|
+
if (challengeResult.ok) {
|
|
145
|
+
writeOutput(challengeResult.json || { ok: true }, pretty);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (challengeResult.status !== 402 || !challengeResult.json || !challengeResult.json.payment_required) {
|
|
149
|
+
writeOutput(challengeResult.json || { ok: false, status: challengeResult.status, body: challengeResult.text || null }, pretty);
|
|
150
|
+
process.exitCode = 1;
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (args["quote-only"] === true || !walletId || !walletSecret) {
|
|
155
|
+
writeOutput(challengeResult.json, pretty);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const quote = challengeResult.json.payment_required.quote;
|
|
160
|
+
const paymentSignature = buildLocalSignedPaymentSignature({
|
|
161
|
+
quote,
|
|
162
|
+
accountId,
|
|
163
|
+
walletId,
|
|
164
|
+
walletSecret,
|
|
165
|
+
txid,
|
|
166
|
+
rawTx
|
|
167
|
+
});
|
|
168
|
+
const paidPayload = {
|
|
169
|
+
...payload,
|
|
170
|
+
quote_id: quote.quote_id
|
|
171
|
+
};
|
|
172
|
+
const paidResult = await postJson(executeUrl, paidPayload, {
|
|
173
|
+
"payment-signature": paymentSignature
|
|
174
|
+
});
|
|
175
|
+
if (!paidResult.ok) {
|
|
176
|
+
writeOutput(paidResult.json || { ok: false, status: paidResult.status, body: paidResult.text || null }, pretty);
|
|
177
|
+
process.exitCode = 1;
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
writeOutput(paidResult.json || { ok: true }, pretty);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
main().catch((error) => {
|
|
184
|
+
process.stderr.write(`${error.message}\n`);
|
|
185
|
+
process.exitCode = 1;
|
|
186
|
+
});
|
package/bin/xytara.js
CHANGED
|
@@ -1,80 +1,80 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
|
|
4
|
-
const path = require("path");
|
|
5
|
-
const { spawnSync } = require("child_process");
|
|
6
|
-
|
|
7
|
-
function printUsage() {
|
|
8
|
-
process.stdout.write([
|
|
9
|
-
"Usage: xytara <command> [options]",
|
|
10
|
-
"",
|
|
11
|
-
"Commands:",
|
|
12
|
-
" release [args] Open the release/adoption/reporting surface",
|
|
13
|
-
" run [args] Execute the paid runtime command path",
|
|
14
|
-
" first-run [args] Guide or run the safe public quote-first path",
|
|
15
|
-
" start-here Print the shortest first-run path",
|
|
16
|
-
" help Show this help message",
|
|
17
|
-
"",
|
|
18
|
-
"Fastest first run:",
|
|
19
|
-
" xytara start-here",
|
|
20
|
-
" xytara first-run",
|
|
21
|
-
" xytara first-run --run-quote --account ACCOUNT_REF --pretty",
|
|
22
|
-
" xytara first-run --execute-with-credits --account ACCOUNT_REF --pretty",
|
|
23
|
-
" xytara release --summary",
|
|
24
|
-
" xytara run --help"
|
|
25
|
-
].join("\n"));
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function printStartHere() {
|
|
29
|
-
process.stdout.write([
|
|
30
|
-
"xytara start-here",
|
|
31
|
-
"",
|
|
32
|
-
"Public first-run spine:",
|
|
33
|
-
" quote -> pay/credits -> execute -> prove",
|
|
34
|
-
"",
|
|
35
|
-
"Guided CLI:",
|
|
36
|
-
" xytara first-run",
|
|
37
|
-
" xytara first-run --run-quote --account ACCOUNT_REF --pretty",
|
|
38
|
-
" xytara first-run --execute-with-credits --account ACCOUNT_REF --pretty",
|
|
39
|
-
"",
|
|
40
|
-
"1. Open https://www.naxytra.com/v1/first-run-path",
|
|
41
|
-
"2. Open https://www.naxytra.com/v1/first-run-kit for copyable commands.",
|
|
42
|
-
"3. Quote safely first:",
|
|
43
|
-
" xytara-run --url https://xytara.onrender.com --account ACCOUNT_REF --task adapter.mcp.invoke --command mcp.invoke:summarize --body-json \"{\\\"tool_name\\\":\\\"summarize\\\",\\\"arguments\\\":{\\\"text\\\":\\\"Summarize the naxytra first-run path in one sentence.\\\"}}\" --quote-only --pretty",
|
|
44
|
-
"4. Execute with direct signed payment or credits-first on a funded account.",
|
|
45
|
-
"5. Hand the result into xoonya for proof review and verification.",
|
|
46
|
-
"",
|
|
47
|
-
"Boundaries:",
|
|
48
|
-
" quote-only mode needs no wallet secret",
|
|
49
|
-
" funded execution needs direct payment material or reusable credits",
|
|
50
|
-
" proof stays in xoonya; runtime payment state stays in xytara",
|
|
51
|
-
"",
|
|
52
|
-
"Local package confidence:",
|
|
53
|
-
" node examples/quickstart.js",
|
|
54
|
-
" npm run verify:all",
|
|
55
|
-
" xytara release --summary"
|
|
56
|
-
].join("\n"));
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
function delegate(scriptName, args) {
|
|
60
|
-
const scriptPath = path.join(__dirname, scriptName);
|
|
61
|
-
const result = spawnSync(process.execPath, [scriptPath, ...args], { stdio: "inherit" });
|
|
62
|
-
process.exitCode = typeof result.status === "number" ? result.status : 1;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const [command, ...rest] = process.argv.slice(2);
|
|
66
|
-
|
|
67
|
-
if (!command || command === "help" || command === "--help" || command === "-h") {
|
|
68
|
-
printUsage();
|
|
69
|
-
} else if (command === "start-here" || command === "--start-here") {
|
|
70
|
-
printStartHere();
|
|
71
|
-
} else if (command === "release") {
|
|
72
|
-
delegate("xytara-release.js", rest);
|
|
73
|
-
} else if (command === "run") {
|
|
74
|
-
delegate("xytara-run.js", rest);
|
|
75
|
-
} else if (command === "first-run" || command === "firstrun") {
|
|
76
|
-
delegate("xytara-first-run.js", rest);
|
|
77
|
-
} else {
|
|
78
|
-
printUsage();
|
|
79
|
-
process.exitCode = 1;
|
|
80
|
-
}
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
const path = require("path");
|
|
5
|
+
const { spawnSync } = require("child_process");
|
|
6
|
+
|
|
7
|
+
function printUsage() {
|
|
8
|
+
process.stdout.write([
|
|
9
|
+
"Usage: xytara <command> [options]",
|
|
10
|
+
"",
|
|
11
|
+
"Commands:",
|
|
12
|
+
" release [args] Open the release/adoption/reporting surface",
|
|
13
|
+
" run [args] Execute the paid runtime command path",
|
|
14
|
+
" first-run [args] Guide or run the safe public quote-first path",
|
|
15
|
+
" start-here Print the shortest first-run path",
|
|
16
|
+
" help Show this help message",
|
|
17
|
+
"",
|
|
18
|
+
"Fastest first run:",
|
|
19
|
+
" xytara start-here",
|
|
20
|
+
" xytara first-run",
|
|
21
|
+
" xytara first-run --run-quote --account ACCOUNT_REF --pretty",
|
|
22
|
+
" xytara first-run --execute-with-credits --account ACCOUNT_REF --pretty",
|
|
23
|
+
" xytara release --summary",
|
|
24
|
+
" xytara run --help"
|
|
25
|
+
].join("\n"));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function printStartHere() {
|
|
29
|
+
process.stdout.write([
|
|
30
|
+
"xytara start-here",
|
|
31
|
+
"",
|
|
32
|
+
"Public first-run spine:",
|
|
33
|
+
" quote -> pay/credits -> execute -> prove",
|
|
34
|
+
"",
|
|
35
|
+
"Guided CLI:",
|
|
36
|
+
" xytara first-run",
|
|
37
|
+
" xytara first-run --run-quote --account ACCOUNT_REF --pretty",
|
|
38
|
+
" xytara first-run --execute-with-credits --account ACCOUNT_REF --pretty",
|
|
39
|
+
"",
|
|
40
|
+
"1. Open https://www.naxytra.com/v1/first-run-path",
|
|
41
|
+
"2. Open https://www.naxytra.com/v1/first-run-kit for copyable commands.",
|
|
42
|
+
"3. Quote safely first:",
|
|
43
|
+
" xytara-run --url https://xytara.onrender.com --account ACCOUNT_REF --task adapter.mcp.invoke --command mcp.invoke:summarize --body-json \"{\\\"tool_name\\\":\\\"summarize\\\",\\\"arguments\\\":{\\\"text\\\":\\\"Summarize the naxytra first-run path in one sentence.\\\"}}\" --quote-only --pretty",
|
|
44
|
+
"4. Execute with direct signed payment or credits-first on a funded account.",
|
|
45
|
+
"5. Hand the result into xoonya for proof review and verification.",
|
|
46
|
+
"",
|
|
47
|
+
"Boundaries:",
|
|
48
|
+
" quote-only mode needs no wallet secret",
|
|
49
|
+
" funded execution needs direct payment material or reusable credits",
|
|
50
|
+
" proof stays in xoonya; runtime payment state stays in xytara",
|
|
51
|
+
"",
|
|
52
|
+
"Local package confidence:",
|
|
53
|
+
" node examples/quickstart.js",
|
|
54
|
+
" npm run verify:all",
|
|
55
|
+
" xytara release --summary"
|
|
56
|
+
].join("\n"));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function delegate(scriptName, args) {
|
|
60
|
+
const scriptPath = path.join(__dirname, scriptName);
|
|
61
|
+
const result = spawnSync(process.execPath, [scriptPath, ...args], { stdio: "inherit" });
|
|
62
|
+
process.exitCode = typeof result.status === "number" ? result.status : 1;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const [command, ...rest] = process.argv.slice(2);
|
|
66
|
+
|
|
67
|
+
if (!command || command === "help" || command === "--help" || command === "-h") {
|
|
68
|
+
printUsage();
|
|
69
|
+
} else if (command === "start-here" || command === "--start-here") {
|
|
70
|
+
printStartHere();
|
|
71
|
+
} else if (command === "release") {
|
|
72
|
+
delegate("xytara-release.js", rest);
|
|
73
|
+
} else if (command === "run") {
|
|
74
|
+
delegate("xytara-run.js", rest);
|
|
75
|
+
} else if (command === "first-run" || command === "firstrun") {
|
|
76
|
+
delegate("xytara-first-run.js", rest);
|
|
77
|
+
} else {
|
|
78
|
+
printUsage();
|
|
79
|
+
process.exitCode = 1;
|
|
80
|
+
}
|
package/client.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
module.exports = require("./lib/commerce_client");
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
module.exports = require("./lib/commerce_client");
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// Local demo environment for the bundled examples.
|
|
4
|
+
//
|
|
5
|
+
// The runtime is fail-closed by default: signed payment acceptance (`local_signed`) and
|
|
6
|
+
// operator write surfaces that require bearer tokens. The examples therefore register a
|
|
7
|
+
// demo wallet and demo operator tokens before the in-process server is created. Every value
|
|
8
|
+
// here is only applied when the corresponding variable is not already set, so a real
|
|
9
|
+
// configuration always wins.
|
|
10
|
+
|
|
11
|
+
function setDefault(name, value) {
|
|
12
|
+
if (typeof process.env[name] !== "string" || !process.env[name].trim()) {
|
|
13
|
+
process.env[name] = value;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
setDefault("XYTARA_PAYMENT_VERIFICATION_MODE", "local_signed");
|
|
18
|
+
setDefault(
|
|
19
|
+
"XYTARA_WALLET_REGISTRY_JSON",
|
|
20
|
+
JSON.stringify([
|
|
21
|
+
{
|
|
22
|
+
wallet_id: "demo-wallet",
|
|
23
|
+
secret: "demo-wallet-secret",
|
|
24
|
+
account_id: "acct_demo",
|
|
25
|
+
enabled: true
|
|
26
|
+
}
|
|
27
|
+
])
|
|
28
|
+
);
|
|
29
|
+
setDefault("XYTARA_CREDIT_BRIDGE_BEARER_TOKEN", "demo-credit-bridge-token");
|
|
30
|
+
setDefault("XYTARA_ACCOUNT_AUTH_BEARER_TOKEN", "demo-account-auth-token");
|
|
31
|
+
setDefault("XYTARA_BSV_TERANODE_MERCHANT_ADDRESS", "1MerchantBsvAddressExample");
|
|
32
|
+
setDefault("XYTARA_BSV_TERANODE_SETTLEMENT_RUNTIME_MODE", "mock");
|
|
33
|
+
|
|
34
|
+
module.exports = {
|
|
35
|
+
demoWalletId: "demo-wallet",
|
|
36
|
+
demoWalletSecret: "demo-wallet-secret",
|
|
37
|
+
demoAccountId: "acct_demo",
|
|
38
|
+
demoCreditBridgeToken: process.env.XYTARA_CREDIT_BRIDGE_BEARER_TOKEN,
|
|
39
|
+
demoAccountAuthToken: process.env.XYTARA_ACCOUNT_AUTH_BEARER_TOKEN
|
|
40
|
+
};
|