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.
Files changed (373) hide show
  1. package/.env.example +67 -58
  2. package/ADAPTER_START_HERE.md +56 -56
  3. package/CARRIED_HANDOFF_DEMO.md +60 -60
  4. package/EXAMPLE_PATHS.md +53 -53
  5. package/FINAL_CONTRACT.md +498 -498
  6. package/LICENSE +201 -201
  7. package/NOTICE +3 -3
  8. package/PARTNER_READY_PATH.md +71 -71
  9. package/PUBLIC_DEMO_SCRIPT.md +78 -78
  10. package/README.md +6 -1
  11. package/REAL_PAYMENT_SETUP.md +32 -3
  12. package/RELEASE_NOTES.md +14 -14
  13. package/SERVICE_CONTRACT.md +419 -419
  14. package/START_HERE.md +1 -1
  15. package/SUPABASE_RUNTIME_STATE_SETUP.md +61 -61
  16. package/TERMINOLOGY.md +50 -50
  17. package/WHY_XYTARA_XOONYA.md +63 -63
  18. package/XT1_EXECUTION_TRUTH_STANDARD.md +78 -78
  19. package/XYTARA_ADAPTER_PROTOCOL_TRUTH_MODEL.md +75 -75
  20. package/XYTARA_AUTONOMOUS_ENTRY_MODEL.md +124 -124
  21. package/XYTARA_DEFAULT_PATH_MODEL.md +84 -84
  22. package/XYTARA_EXECUTION_TRUTH_MODEL.md +171 -171
  23. package/XYTARA_PAYMENT_RAIL_TRUTH_MODEL.md +68 -68
  24. package/adapters/AUTHORING_GUIDE.md +243 -243
  25. package/adapters/ONBOARDING_POSTURE.md +61 -61
  26. package/adapters/THIRD_PARTY_SUBMISSION_PROCESS.md +84 -84
  27. package/adapters/adapter-manifest.schema.json +283 -283
  28. package/adapters/examples/example-execution-adapter.js +61 -61
  29. package/adapters/examples/example-execution-adapter.manifest.json +81 -81
  30. package/adapters/examples/example-settlement-adapter.js +55 -55
  31. package/adapters/examples/example-settlement-adapter.manifest.json +78 -78
  32. package/adapters/examples/example-third-party-acp-registration.submission-bundle.json +124 -124
  33. package/adapters/examples/example-third-party-erc8004-registration.submission-bundle.json +121 -121
  34. package/adapters/examples/example-third-party-identity-registration.certification-pack.json +22 -22
  35. package/adapters/examples/example-third-party-identity-registration.record.json +26 -26
  36. package/adapters/examples/example-third-party-identity-registration.submission-bundle.json +126 -126
  37. package/adapters/examples/example-third-party-langchain-registration.submission-bundle.json +124 -124
  38. package/adapters/examples/example-third-party-mpp-registration.submission-bundle.json +120 -120
  39. package/adapters/examples/example-third-party-registration.certification-pack.json +22 -22
  40. package/adapters/examples/example-third-party-registration.record.json +28 -28
  41. package/adapters/examples/example-third-party-registration.submission-bundle.json +126 -126
  42. package/adapters/examples/example-third-party-settlement-registration.certification-pack.json +22 -22
  43. package/adapters/examples/example-third-party-settlement-registration.record.json +26 -26
  44. package/adapters/examples/example-third-party-settlement-registration.submission-bundle.json +127 -127
  45. package/adapters/examples/langchain-reference-execution-adapter.js +81 -81
  46. package/adapters/examples/langchain-reference-execution-adapter.manifest.json +79 -79
  47. package/adapters/examples/langgraph-reference-execution-adapter.js +81 -81
  48. package/adapters/examples/langgraph-reference-execution-adapter.manifest.json +79 -79
  49. package/adapters/examples/minimal-third-party-execution-adapter.js +61 -61
  50. package/adapters/examples/minimal-third-party-execution-adapter.manifest.json +79 -79
  51. package/adapters/examples/minimal-third-party-execution-registration.record.json +26 -26
  52. package/adapters/examples/minimal-third-party-execution.certification-pack.json +22 -22
  53. package/adapters/examples/minimal-third-party-execution.submission-bundle.json +126 -126
  54. package/adapters/integration-certification-pack.schema.json +82 -82
  55. package/adapters/integration-registration-record.schema.json +114 -114
  56. package/adapters/integration-submission-bundle-set.schema.json +39 -39
  57. package/adapters/integration-submission-bundle.schema.json +34 -34
  58. package/adapters/interfaces.js +56 -56
  59. package/bin/xytara-first-run.js +244 -244
  60. package/bin/xytara-release.js +1429 -1429
  61. package/bin/xytara-run.js +186 -186
  62. package/bin/xytara.js +80 -80
  63. package/client.js +3 -3
  64. package/examples/_demo_env.js +40 -0
  65. package/examples/adapter_review_walkthrough.js +54 -53
  66. package/examples/export_carried_handoff.js +81 -80
  67. package/examples/funded_runtime_walkthrough.js +71 -70
  68. package/examples/generated.carried-handoff.json +30 -0
  69. package/examples/partner_launch_walkthrough.js +44 -43
  70. package/examples/quickstart.js +3256 -3255
  71. package/fixtures/catalog.js +1134 -1134
  72. package/index.js +395 -395
  73. package/integrations/dispatch.js +276 -276
  74. package/integrations/registry-snapshot.schema.json +36 -36
  75. package/integrations/registry.js +2261 -2261
  76. package/integrations/views.js +28 -28
  77. package/lib/a2a_lane_contract.js +104 -104
  78. package/lib/a2c_lane_contract.js +111 -111
  79. package/lib/account_auth.js +518 -518
  80. package/lib/acp_lane_contract.js +54 -54
  81. package/lib/activity_audit_contract.js +322 -322
  82. package/lib/adapter_certification_contract.js +130 -130
  83. package/lib/adapter_depth_contract.js +156 -156
  84. package/lib/adapter_pack.js +118 -118
  85. package/lib/adapter_partner_pack.js +89 -89
  86. package/lib/adapter_promotion_pack.js +89 -89
  87. package/lib/adapter_protocol_truth_contract.js +229 -229
  88. package/lib/announcement_pack.js +61 -61
  89. package/lib/artifact_distribution_lane_contract.js +54 -54
  90. package/lib/asyncapi_contract.js +150 -150
  91. package/lib/auth_interop_contract.js +80 -80
  92. package/lib/authority_binding_lifecycle_contract.js +182 -182
  93. package/lib/autonomous_entry_contract.js +409 -409
  94. package/lib/bolt_lane_contract.js +55 -55
  95. package/lib/bolt_payment_front.js +172 -172
  96. package/lib/business_cockpit.js +378 -378
  97. package/lib/capability_execution_truth.js +272 -272
  98. package/lib/capability_registry.js +633 -633
  99. package/lib/catalog_contract.js +966 -966
  100. package/lib/catalog_family_model.js +193 -193
  101. package/lib/catalog_views.js +55 -55
  102. package/lib/checkout_event_security.js +142 -142
  103. package/lib/cloudevents_contract.js +80 -80
  104. package/lib/command_flow.js +411 -406
  105. package/lib/commerce_artifacts.js +503 -503
  106. package/lib/commerce_authority.js +449 -449
  107. package/lib/commerce_cases.js +317 -317
  108. package/lib/commerce_checkout.js +509 -509
  109. package/lib/commerce_client.js +7687 -7676
  110. package/lib/commerce_coordination.js +346 -346
  111. package/lib/commerce_economics.js +4017 -4016
  112. package/lib/commerce_identity.js +578 -578
  113. package/lib/commerce_quotes.js +237 -237
  114. package/lib/commerce_reports.js +14461 -14461
  115. package/lib/commerce_runtime.js +315 -315
  116. package/lib/commerce_shell.js +257 -257
  117. package/lib/crypto_agility_matrix.js +125 -125
  118. package/lib/default_path_contract.js +412 -412
  119. package/lib/delivery_summary_contract.js +95 -95
  120. package/lib/ecosystem_entry.js +64 -64
  121. package/lib/erc8004_lane_contract.js +65 -65
  122. package/lib/event_system_lane_contract.js +75 -75
  123. package/lib/execution_truth_contract.js +234 -234
  124. package/lib/external_credit_bridge.js +142 -142
  125. package/lib/external_execution_runtime.js +132 -132
  126. package/lib/feature_control_lane_contract.js +54 -54
  127. package/lib/first_run_conversion_contract.js +290 -290
  128. package/lib/framework_lane_contract.js +89 -89
  129. package/lib/framework_provider_promotion.js +235 -235
  130. package/lib/full_catalog_contract.js +525 -525
  131. package/lib/go_live_operator_pack.js +391 -391
  132. package/lib/http_transport.js +73 -73
  133. package/lib/identity_auth.js +175 -175
  134. package/lib/identity_interop_contract.js +82 -82
  135. package/lib/integration_matrix_contract.js +102 -102
  136. package/lib/l402_lane_contract.js +55 -55
  137. package/lib/l402_payment_front.js +192 -192
  138. package/lib/launch_narrative.js +53 -53
  139. package/lib/lifecycle_continuity_contract.js +115 -115
  140. package/lib/machine_identity_registry_contract.js +199 -199
  141. package/lib/major_rails_lane_contract.js +150 -150
  142. package/lib/market_lane_contract.js +467 -467
  143. package/lib/market_lane_depth_contract.js +182 -182
  144. package/lib/market_lane_promotion_contract.js +210 -210
  145. package/lib/market_lane_trace_contract.js +278 -278
  146. package/lib/mcp_lane_contract.js +137 -137
  147. package/lib/network_transport.js +110 -110
  148. package/lib/offline_verifiability_recovery_contract.js +155 -155
  149. package/lib/openapi_contract.js +296 -296
  150. package/lib/operational_receipt_contract.js +165 -165
  151. package/lib/operator_intelligence.js +407 -407
  152. package/lib/outreach_copy_pack.js +51 -51
  153. package/lib/outreach_message_pack.js +71 -71
  154. package/lib/outreach_proof.js +71 -71
  155. package/lib/outreach_target_pack.js +60 -60
  156. package/lib/partner_intelligence.js +105 -105
  157. package/lib/payment_config.js +239 -191
  158. package/lib/payment_front_registry.js +53 -53
  159. package/lib/payment_protocol_contract.js +165 -165
  160. package/lib/payment_rail_truth_contract.js +324 -324
  161. package/lib/payment_verification.js +312 -264
  162. package/lib/phase_10_closeout_pack.js +45 -45
  163. package/lib/phase_10_completion_pack.js +76 -76
  164. package/lib/phase_10_decision_record_pack.js +54 -54
  165. package/lib/phase_10_decision_resolution_pack.js +53 -53
  166. package/lib/phase_10_demand_signal_adapters_runtime_pack.js +74 -74
  167. package/lib/phase_10_ecosystem_backlog_triage_runtime_pack.js +74 -74
  168. package/lib/phase_10_freeze_baseline_pack.js +67 -67
  169. package/lib/phase_10_freeze_review_pack.js +64 -64
  170. package/lib/phase_10_gate_pack.js +57 -57
  171. package/lib/phase_10_long_tail_continuity_pack.js +80 -80
  172. package/lib/phase_10_long_tail_ecosystem_pack.js +66 -66
  173. package/lib/phase_10_niche_extension_registry_runtime_pack.js +74 -74
  174. package/lib/phase_1_claude_mcp_pack.js +60 -60
  175. package/lib/phase_1_claude_mcp_runtime_pack.js +52 -52
  176. package/lib/phase_1_ecosystem_pack.js +67 -67
  177. package/lib/phase_1_openai_codex_pack.js +60 -60
  178. package/lib/phase_1_openai_codex_runtime_pack.js +52 -52
  179. package/lib/phase_2_base_runtime_pack.js +71 -71
  180. package/lib/phase_2_base_usdc_runtime_pack.js +72 -72
  181. package/lib/phase_2_closeout_pack.js +65 -65
  182. package/lib/phase_2_completion_pack.js +113 -113
  183. package/lib/phase_2_decision_record_pack.js +66 -66
  184. package/lib/phase_2_decision_resolution_pack.js +69 -69
  185. package/lib/phase_2_eth_runtime_pack.js +70 -70
  186. package/lib/phase_2_evm_base_runtime_pack.js +73 -73
  187. package/lib/phase_2_evm_runtime_pack.js +71 -71
  188. package/lib/phase_2_flip_preview_pack.js +60 -60
  189. package/lib/phase_2_freeze_review_pack.js +99 -99
  190. package/lib/phase_2_gate_pack.js +77 -77
  191. package/lib/phase_2_payment_rails_pack.js +71 -71
  192. package/lib/phase_2_usdc_runtime_pack.js +71 -71
  193. package/lib/phase_3_brc_runtime_pack.js +81 -81
  194. package/lib/phase_3_bsv_teranode_runtime_pack.js +83 -83
  195. package/lib/phase_3_closeout_pack.js +62 -62
  196. package/lib/phase_3_completion_pack.js +94 -94
  197. package/lib/phase_3_decision_record_pack.js +64 -64
  198. package/lib/phase_3_decision_resolution_pack.js +69 -69
  199. package/lib/phase_3_freeze_baseline_pack.js +67 -67
  200. package/lib/phase_3_freeze_review_pack.js +80 -80
  201. package/lib/phase_3_gate_pack.js +76 -76
  202. package/lib/phase_3_metanet_runtime_pack.js +81 -81
  203. package/lib/phase_3_native_bsv_pack.js +91 -91
  204. package/lib/phase_3_native_continuity_pack.js +82 -82
  205. package/lib/phase_4_attestation_runtime_pack.js +75 -75
  206. package/lib/phase_4_closeout_pack.js +45 -45
  207. package/lib/phase_4_completion_pack.js +94 -94
  208. package/lib/phase_4_decision_record_pack.js +54 -54
  209. package/lib/phase_4_decision_resolution_pack.js +45 -45
  210. package/lib/phase_4_erc8004_runtime_pack.js +76 -76
  211. package/lib/phase_4_freeze_baseline_pack.js +67 -67
  212. package/lib/phase_4_freeze_review_pack.js +68 -68
  213. package/lib/phase_4_gate_pack.js +58 -58
  214. package/lib/phase_4_identity_registry_runtime_pack.js +75 -75
  215. package/lib/phase_4_identity_trust_pack.js +73 -73
  216. package/lib/phase_4_trust_continuity_pack.js +86 -86
  217. package/lib/phase_5_antelope_runtime_pack.js +76 -76
  218. package/lib/phase_5_closeout_pack.js +44 -44
  219. package/lib/phase_5_completion_pack.js +82 -82
  220. package/lib/phase_5_constellation_dag_runtime_pack.js +76 -76
  221. package/lib/phase_5_decision_record_pack.js +54 -54
  222. package/lib/phase_5_decision_resolution_pack.js +45 -45
  223. package/lib/phase_5_digibyte_dgb_runtime_pack.js +76 -76
  224. package/lib/phase_5_freeze_baseline_pack.js +67 -67
  225. package/lib/phase_5_freeze_review_pack.js +68 -68
  226. package/lib/phase_5_gate_pack.js +58 -58
  227. package/lib/phase_5_hedera_hbar_runtime_pack.js +76 -76
  228. package/lib/phase_5_kaspa_kas_runtime_pack.js +76 -76
  229. package/lib/phase_5_major_rails_continuity_pack.js +86 -86
  230. package/lib/phase_5_major_rails_pack.js +110 -110
  231. package/lib/phase_5_metal_runtime_pack.js +76 -76
  232. package/lib/phase_5_polkadot_dot_runtime_pack.js +76 -76
  233. package/lib/phase_5_proton_xpr_runtime_pack.js +76 -76
  234. package/lib/phase_5_solana_runtime_pack.js +76 -76
  235. package/lib/phase_6_autogen_runtime_pack.js +72 -72
  236. package/lib/phase_6_closeout_pack.js +46 -46
  237. package/lib/phase_6_completion_pack.js +77 -77
  238. package/lib/phase_6_decision_record_pack.js +54 -54
  239. package/lib/phase_6_decision_resolution_pack.js +53 -53
  240. package/lib/phase_6_framework_continuity_pack.js +81 -81
  241. package/lib/phase_6_framework_runtime_pack.js +68 -68
  242. package/lib/phase_6_freeze_baseline_pack.js +68 -68
  243. package/lib/phase_6_freeze_review_pack.js +65 -65
  244. package/lib/phase_6_gate_pack.js +59 -59
  245. package/lib/phase_6_langchain_runtime_pack.js +72 -72
  246. package/lib/phase_6_langgraph_runtime_pack.js +72 -72
  247. package/lib/phase_6_semantic_kernel_runtime_pack.js +72 -72
  248. package/lib/phase_7_closeout_pack.js +45 -45
  249. package/lib/phase_7_completion_pack.js +85 -85
  250. package/lib/phase_7_decision_record_pack.js +53 -53
  251. package/lib/phase_7_decision_resolution_pack.js +53 -53
  252. package/lib/phase_7_event_system_continuity_pack.js +89 -89
  253. package/lib/phase_7_event_system_pack.js +76 -76
  254. package/lib/phase_7_freeze_baseline_pack.js +74 -74
  255. package/lib/phase_7_freeze_review_pack.js +65 -65
  256. package/lib/phase_7_gate_pack.js +58 -58
  257. package/lib/phase_7_kafka_runtime_pack.js +74 -74
  258. package/lib/phase_7_mqtt_runtime_pack.js +74 -74
  259. package/lib/phase_7_nats_runtime_pack.js +74 -74
  260. package/lib/phase_7_webhook_event_bus_runtime_pack.js +74 -74
  261. package/lib/phase_8_closeout_pack.js +46 -46
  262. package/lib/phase_8_completion_pack.js +82 -82
  263. package/lib/phase_8_decision_record_pack.js +54 -54
  264. package/lib/phase_8_decision_resolution_pack.js +53 -53
  265. package/lib/phase_8_external_receipt_import_runtime_pack.js +74 -74
  266. package/lib/phase_8_external_result_import_runtime_pack.js +74 -74
  267. package/lib/phase_8_freeze_baseline_pack.js +71 -71
  268. package/lib/phase_8_freeze_review_pack.js +64 -64
  269. package/lib/phase_8_gate_pack.js +58 -58
  270. package/lib/phase_8_proof_bridge_continuity_pack.js +86 -86
  271. package/lib/phase_8_proof_bridges_pack.js +72 -72
  272. package/lib/phase_8_proof_bundle_normalization_runtime_pack.js +74 -74
  273. package/lib/phase_9_closeout_pack.js +46 -46
  274. package/lib/phase_9_completion_pack.js +82 -82
  275. package/lib/phase_9_custody_refs_runtime_pack.js +74 -74
  276. package/lib/phase_9_decision_record_pack.js +54 -54
  277. package/lib/phase_9_decision_resolution_pack.js +53 -53
  278. package/lib/phase_9_freeze_baseline_pack.js +71 -71
  279. package/lib/phase_9_freeze_review_pack.js +64 -64
  280. package/lib/phase_9_gate_pack.js +58 -58
  281. package/lib/phase_9_operator_accounting_bridges_runtime_pack.js +74 -74
  282. package/lib/phase_9_treasury_connectivity_pack.js +72 -72
  283. package/lib/phase_9_treasury_continuity_pack.js +86 -86
  284. package/lib/phase_9_treasury_destinations_runtime_pack.js +74 -74
  285. package/lib/phase_program_pack.js +120 -120
  286. package/lib/pricing_optimization_contract.js +775 -775
  287. package/lib/protocol_lane_contract.js +117 -117
  288. package/lib/provenance_lane_contract.js +54 -54
  289. package/lib/provider_lane_contract.js +240 -240
  290. package/lib/provider_runtime_journey_contract.js +183 -183
  291. package/lib/public_surface_policy_contract.js +111 -111
  292. package/lib/publish_plan.js +51 -51
  293. package/lib/record_queries.js +48 -48
  294. package/lib/release_candidate.js +50 -50
  295. package/lib/release_center.js +1093 -1093
  296. package/lib/release_history.js +205 -205
  297. package/lib/release_manifest.js +113 -113
  298. package/lib/release_pack.js +453 -453
  299. package/lib/request_rate_limit.js +144 -144
  300. package/lib/resource_views.js +31 -31
  301. package/lib/revenue_launch_path_contract.js +326 -326
  302. package/lib/route_matchers.js +34 -34
  303. package/lib/route_params.js +19 -19
  304. package/lib/runtime_bridge.js +124 -124
  305. package/lib/runtime_operations_worker.js +282 -282
  306. package/lib/runtime_state_store.js +354 -354
  307. package/lib/settlement_lane_contract.js +111 -111
  308. package/lib/shared_signals_lane_contract.js +54 -54
  309. package/lib/signed_audit_provenance_contract.js +83 -83
  310. package/lib/soft_launch_pack.js +78 -78
  311. package/lib/stablecoin_lane_contract.js +76 -76
  312. package/lib/stripe_mpp_lane_contract.js +96 -96
  313. package/lib/stripe_mpp_payment_front.js +158 -158
  314. package/lib/telemetry_lane_contract.js +54 -54
  315. package/lib/treasury_destinations_contract.js +764 -764
  316. package/lib/treasury_egress_policy_contract.js +91 -91
  317. package/lib/treasury_lane_contract.js +84 -84
  318. package/lib/trust_portability_boundary_contract.js +72 -72
  319. package/lib/x402_facilitator.js +155 -0
  320. package/lib/x402_lane_contract.js +118 -118
  321. package/package.json +106 -105
  322. package/scripts/registry_cli.js +275 -275
  323. package/scripts/verify_adapters.js +554 -554
  324. package/scripts/verify_all.js +4962 -4962
  325. package/scripts/verify_control_plane_contracts.js +34 -34
  326. package/scripts/verify_control_plane_routes.js +70 -70
  327. package/scripts/verify_delivery_summary.js +112 -112
  328. package/scripts/verify_examples.js +19 -19
  329. package/scripts/verify_first_run_conversions.js +81 -81
  330. package/scripts/verify_framework_provider_promotion.js +152 -152
  331. package/scripts/verify_full_catalog.js +174 -174
  332. package/scripts/verify_integrations.js +620 -620
  333. package/scripts/verify_lifecycle_continuity.js +96 -96
  334. package/scripts/verify_market_lane_depth.js +94 -94
  335. package/scripts/verify_market_lane_promotion.js +103 -103
  336. package/scripts/verify_market_lane_traces.js +98 -98
  337. package/scripts/verify_market_lanes.js +102 -102
  338. package/scripts/verify_operator_observability_boundary.js +83 -83
  339. package/scripts/verify_pricing_experiment_plan.js +124 -124
  340. package/scripts/verify_provider_runtime_breadth.js +109 -109
  341. package/scripts/verify_provider_runtime_journeys.js +111 -111
  342. package/scripts/verify_revenue_launch_paths.js +105 -105
  343. package/scripts/verify_runtime_durability.js +52 -52
  344. package/scripts/verify_service.js +15410 -15250
  345. package/scripts/verify_tooling.js +1412 -1412
  346. package/scripts/verify_treasury_public_boundary.js +97 -97
  347. package/scripts/verify_x402_facilitator.js +174 -0
  348. package/server.js +11117 -11006
  349. package/.env.production.checklist +0 -77
  350. package/.env.production.template +0 -54
  351. package/.github/workflows/publish-mcp-executor.yml +0 -43
  352. package/ADAPTER_PARTNER_PATH.md +0 -47
  353. package/ADAPTER_PROMOTION_START_HERE.md +0 -44
  354. package/BOLT_BINDINGS.production.worksheet.json +0 -31
  355. package/EXECUTION_TARGETS.production.worksheet.json +0 -73
  356. package/GO_LIVE_OPERATOR_PACK.md +0 -412
  357. package/L402_BINDINGS.production.worksheet.json +0 -30
  358. package/OPERATIONS_RUNBOOK.md +0 -115
  359. package/OPERATOR_START_HERE.md +0 -63
  360. package/OUTREACH_MESSAGES.md +0 -19
  361. package/OUTREACH_START_HERE.md +0 -36
  362. package/PRODUCTION_MANUAL_CLOSEOUT_SEQUENCE.md +0 -172
  363. package/PROGRAM_COMPLETE_RELEASE.md +0 -63
  364. package/PROGRAM_STATUS.md +0 -57
  365. package/PUBLISH_PLAN.md +0 -26
  366. package/RELEASE_CHECKLIST.md +0 -16
  367. package/SOFT_LAUNCH_KIT.md +0 -47
  368. package/services/mcp-execution-target/DISCOVERY_REGISTRY_PLAYBOOK.md +0 -141
  369. package/services/mcp-execution-target/README.md +0 -319
  370. package/services/mcp-execution-target/package.json +0 -14
  371. package/services/mcp-execution-target/server.js +0 -1031
  372. package/services/mcp-execution-target/server.json +0 -16
  373. package/services/mcp-execution-target/verify.js +0 -308
@@ -1,578 +1,578 @@
1
- "use strict";
2
-
3
- function ensureArray(value) {
4
- return Array.isArray(value) ? value : [];
5
- }
6
-
7
- function nowIso() {
8
- return new Date().toISOString();
9
- }
10
-
11
- function listTransactionEntriesForAccount(state, accountId) {
12
- return Array.from(state.transactions.values())
13
- .filter((entry) => entry && entry.transaction && entry.transaction.account_id === accountId);
14
- }
15
-
16
- function listReceiptsForAccount(state, accountId) {
17
- return Array.from(state.receipts.values())
18
- .map((entry) => entry && entry.receipt ? entry.receipt : null)
19
- .filter((receipt) => receipt && receipt.account_id === accountId);
20
- }
21
-
22
- function listAgentAccountsForIdentity(state, accountId) {
23
- return Array.from(state.agentAccounts.values())
24
- .map((entry) => entry && entry.account ? entry.account : null)
25
- .filter((account) => account && account.account_id === accountId);
26
- }
27
-
28
- function listIdentityBindingsForAccount(state, accountId) {
29
- return Array.from(state.machineIdentityBindings.values())
30
- .filter((binding) => binding && binding.account_id === accountId);
31
- }
32
-
33
- function collectIdentityDeliverables(entry) {
34
- const deliverables = entry && entry.command && Array.isArray(entry.command.deliverables)
35
- ? entry.command.deliverables
36
- : [];
37
- const identityRefs = [];
38
- const registryRefs = [];
39
- const anchorRefs = [];
40
- for (const item of deliverables) {
41
- if (!item || typeof item !== "object") continue;
42
- if (item.identity_attestation_ref) identityRefs.push(item.identity_attestation_ref);
43
- if (item.identity_link_ref) identityRefs.push(item.identity_link_ref);
44
- if (item.registry_record_ref) registryRefs.push(item.registry_record_ref);
45
- if (item.registry_pack_ref) registryRefs.push(item.registry_pack_ref);
46
- if (item.anchor_ref) anchorRefs.push(item.anchor_ref);
47
- }
48
- return {
49
- identity_refs: identityRefs,
50
- registry_refs: registryRefs,
51
- anchor_refs: anchorRefs
52
- };
53
- }
54
-
55
- function buildMachineIdentitySummary(state, accountId) {
56
- const agentAccounts = listAgentAccountsForIdentity(state, accountId);
57
- const identityBindings = listIdentityBindingsForAccount(state, accountId);
58
- const transactionEntries = listTransactionEntriesForAccount(state, accountId);
59
- const receipts = listReceiptsForAccount(state, accountId);
60
- const identityTransactions = transactionEntries.filter((entry) =>
61
- ensureArray(entry.command && entry.command.deliverables).some((task) =>
62
- task && typeof task.task_ref === "string" && (
63
- task.task_ref === "identity.attest.preview" ||
64
- task.task_ref === "identity.registry.link" ||
65
- task.task_ref === "registry.register" ||
66
- task.task_ref === "registry.pack.bundle" ||
67
- task.task_ref === "anchoring.submit"
68
- )
69
- ) || ensureArray(entry.transaction && entry.transaction.execution && entry.transaction.execution.tasks).some((task) =>
70
- task && typeof task.task_ref === "string" && (
71
- task.task_ref === "identity.attest.preview" ||
72
- task.task_ref === "identity.registry.link" ||
73
- task.task_ref === "registry.register" ||
74
- task.task_ref === "registry.pack.bundle" ||
75
- task.task_ref === "anchoring.submit"
76
- )
77
- )
78
- );
79
- const refs = identityTransactions.reduce((acc, transaction) => {
80
- const next = collectIdentityDeliverables(transaction);
81
- acc.identity_refs.push(...next.identity_refs);
82
- acc.registry_refs.push(...next.registry_refs);
83
- acc.anchor_refs.push(...next.anchor_refs);
84
- return acc;
85
- }, {
86
- identity_refs: [],
87
- registry_refs: [],
88
- anchor_refs: []
89
- });
90
-
91
- const latestIdentityTransaction = identityTransactions
92
- .map((entry) => ({
93
- transaction_id: entry.transaction && entry.transaction.transaction_id ? entry.transaction.transaction_id : null,
94
- created_at_iso: entry.transaction && entry.transaction.created_at_iso ? entry.transaction.created_at_iso : null
95
- }))
96
- .sort((a, b) => String(a.created_at_iso || "").localeCompare(String(b.created_at_iso || "")))
97
- .slice(-1)[0] || null;
98
-
99
- let identityState = "unbound";
100
- if (agentAccounts.length > 0) identityState = "account_issued";
101
- if (identityBindings.length > 0) identityState = "identity_binding_present";
102
- if (identityTransactions.length > 0) identityState = "identity_activity_present";
103
- if (refs.registry_refs.length > 0 && refs.anchor_refs.length > 0) identityState = "registry_anchor_present";
104
-
105
- return {
106
- summary_version: "xytara-machine-identity-summary-v1",
107
- account_id: accountId,
108
- machine_identity_state: identityState,
109
- counts: {
110
- agent_account_count: agentAccounts.length,
111
- identity_binding_count: identityBindings.length,
112
- identity_transaction_count: identityTransactions.length,
113
- receipt_count: receipts.length,
114
- identity_ref_count: refs.identity_refs.length,
115
- registry_ref_count: refs.registry_refs.length,
116
- anchor_ref_count: refs.anchor_refs.length
117
- },
118
- latest_identity_transaction_id: latestIdentityTransaction ? latestIdentityTransaction.transaction_id : null,
119
- linked_surfaces: {
120
- machine_identity_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-bundle`,
121
- agent_accounts_ref: "/v1/agent-accounts",
122
- operator_shell_summary_ref: "/v1/operator-shell/summary"
123
- },
124
- generated_at_iso: nowIso()
125
- };
126
- }
127
-
128
- function buildMachineIdentityBundle(state, accountId) {
129
- const summary = buildMachineIdentitySummary(state, accountId);
130
- const agentAccounts = listAgentAccountsForIdentity(state, accountId);
131
- const identityBindings = listIdentityBindingsForAccount(state, accountId);
132
- const transactionEntries = listTransactionEntriesForAccount(state, accountId);
133
- const identityTransactions = transactionEntries
134
- .filter((entry) =>
135
- ensureArray(entry.command && entry.command.deliverables).some((task) =>
136
- task && typeof task.task_ref === "string" && (
137
- task.task_ref === "identity.attest.preview" ||
138
- task.task_ref === "identity.registry.link" ||
139
- task.task_ref === "registry.register" ||
140
- task.task_ref === "registry.pack.bundle" ||
141
- task.task_ref === "anchoring.submit"
142
- )
143
- ) || ensureArray(entry.transaction && entry.transaction.execution && entry.transaction.execution.tasks).some((task) =>
144
- task && typeof task.task_ref === "string" && (
145
- task.task_ref === "identity.attest.preview" ||
146
- task.task_ref === "identity.registry.link" ||
147
- task.task_ref === "registry.register" ||
148
- task.task_ref === "registry.pack.bundle" ||
149
- task.task_ref === "anchoring.submit"
150
- )
151
- )
152
- )
153
- .map((entry) => {
154
- const refs = collectIdentityDeliverables(entry);
155
- return {
156
- transaction_id: entry.transaction && entry.transaction.transaction_id ? entry.transaction.transaction_id : null,
157
- status: entry.transaction && entry.transaction.status ? entry.transaction.status : null,
158
- created_at_iso: entry.transaction && entry.transaction.created_at_iso ? entry.transaction.created_at_iso : null,
159
- identity_refs: refs.identity_refs,
160
- registry_refs: refs.registry_refs,
161
- anchor_refs: refs.anchor_refs
162
- };
163
- });
164
-
165
- return {
166
- bundle_version: "xytara-machine-identity-bundle-v1",
167
- account_id: accountId,
168
- machine_identity_summary: summary,
169
- agent_accounts: agentAccounts,
170
- identity_bindings: identityBindings,
171
- identity_transactions: identityTransactions,
172
- linked_surfaces: {
173
- machine_identity_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-summary`,
174
- authority_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/authority-summary`,
175
- wallet_ledger_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/wallet-ledger-bundle`
176
- },
177
- generated_at_iso: nowIso()
178
- };
179
- }
180
-
181
- function buildMachineIdentityAttachmentSummary(state, accountId) {
182
- const agentAccounts = listAgentAccountsForIdentity(state, accountId);
183
- const bundle = buildMachineIdentityBundle(state, accountId);
184
- const attachmentRows = bundle.identity_transactions.map((entry) => ({
185
- transaction_id: entry.transaction_id,
186
- identity_attachment_count: ensureArray(entry.identity_refs).length,
187
- registry_attachment_count: ensureArray(entry.registry_refs).length,
188
- anchor_attachment_count: ensureArray(entry.anchor_refs).length,
189
- has_registry_anchor_pair: ensureArray(entry.registry_refs).length > 0 && ensureArray(entry.anchor_refs).length > 0,
190
- created_at_iso: entry.created_at_iso || null
191
- }));
192
-
193
- return {
194
- summary_version: "xytara-machine-identity-attachment-summary-v1",
195
- account_id: accountId,
196
- machine_identity_attachment_state: attachmentRows.length > 0 ? "attachments_present" : agentAccounts.length > 0 ? "account_only" : "unattached",
197
- counts: {
198
- agent_account_count: agentAccounts.length,
199
- identity_binding_count: Array.isArray(bundle.identity_bindings) ? bundle.identity_bindings.length : 0,
200
- attachment_row_count: attachmentRows.length,
201
- registry_anchor_pair_count: attachmentRows.filter((entry) => entry.has_registry_anchor_pair).length
202
- },
203
- attachment_rows: attachmentRows,
204
- linked_surfaces: {
205
- machine_identity_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-bundle`,
206
- machine_identity_lineage_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-lineage-summary`
207
- },
208
- generated_at_iso: nowIso()
209
- };
210
- }
211
-
212
- function buildMachineIdentityLineageSummary(state, accountId) {
213
- const bundle = buildMachineIdentityBundle(state, accountId);
214
- const lineageRows = bundle.identity_transactions.map((entry, index) => {
215
- const predecessor = index > 0 ? bundle.identity_transactions[index - 1] : null;
216
- const successor = index < bundle.identity_transactions.length - 1 ? bundle.identity_transactions[index + 1] : null;
217
- return {
218
- transaction_id: entry.transaction_id,
219
- predecessor_transaction_id: predecessor ? predecessor.transaction_id : null,
220
- successor_transaction_id: successor ? successor.transaction_id : null,
221
- lineage_position: predecessor ? successor ? "middle" : "leaf" : successor ? "root" : "standalone",
222
- registry_ref_count: ensureArray(entry.registry_refs).length,
223
- anchor_ref_count: ensureArray(entry.anchor_refs).length,
224
- created_at_iso: entry.created_at_iso || null
225
- };
226
- });
227
-
228
- return {
229
- summary_version: "xytara-machine-identity-lineage-summary-v1",
230
- account_id: accountId,
231
- identity_transaction_count: bundle.identity_transactions.length,
232
- root_count: lineageRows.filter((entry) => entry.lineage_position === "root" || entry.lineage_position === "standalone").length,
233
- leaf_count: lineageRows.filter((entry) => entry.lineage_position === "leaf" || entry.lineage_position === "standalone").length,
234
- lineage_rows: lineageRows,
235
- linked_surfaces: {
236
- machine_identity_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-summary`,
237
- machine_identity_attachment_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-attachment-summary`
238
- },
239
- generated_at_iso: nowIso()
240
- };
241
- }
242
-
243
- function buildMachineIdentityBindingLineageSummary(state, accountId) {
244
- const identityBindings = listIdentityBindingsForAccount(state, accountId)
245
- .slice()
246
- .sort((a, b) => String(a.created_at_iso || "").localeCompare(String(b.created_at_iso || "")));
247
- const lineageRows = identityBindings.map((entry) => ({
248
- binding_id: entry.binding_id,
249
- status: entry.status,
250
- identity_kind: entry.identity_kind,
251
- predecessor_binding_id: entry.rotated_from_binding_id || null,
252
- successor_binding_id: entry.replaced_by_binding_id || null,
253
- lineage_position: entry.rotated_from_binding_id
254
- ? entry.replaced_by_binding_id
255
- ? "middle"
256
- : "leaf"
257
- : entry.replaced_by_binding_id
258
- ? "root"
259
- : "standalone",
260
- expires_at_iso: entry.expires_at_iso || null,
261
- created_at_iso: entry.created_at_iso || null,
262
- updated_at_iso: entry.updated_at_iso || null
263
- }));
264
-
265
- return {
266
- summary_version: "xytara-machine-identity-binding-lineage-summary-v1",
267
- account_id: accountId,
268
- identity_binding_count: identityBindings.length,
269
- rotated_binding_count: lineageRows.filter((entry) => entry.predecessor_binding_id || entry.successor_binding_id).length,
270
- lineage_rows: lineageRows,
271
- linked_surfaces: {
272
- machine_identity_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-summary`,
273
- machine_identity_review_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-review-bundle`,
274
- machine_identity_attention_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-attention-summary`
275
- },
276
- generated_at_iso: nowIso()
277
- };
278
- }
279
-
280
- function buildMachineIdentityProfile(state, accountId) {
281
- const summary = buildMachineIdentitySummary(state, accountId);
282
- const bundle = buildMachineIdentityBundle(state, accountId);
283
- const attachment = buildMachineIdentityAttachmentSummary(state, accountId);
284
- const lineage = buildMachineIdentityLineageSummary(state, accountId);
285
- const primaryAgentAccount = Array.isArray(bundle.agent_accounts) && bundle.agent_accounts.length > 0
286
- ? bundle.agent_accounts[0]
287
- : null;
288
- const primaryIdentityBinding = Array.isArray(bundle.identity_bindings) && bundle.identity_bindings.length > 0
289
- ? bundle.identity_bindings[0]
290
- : null;
291
-
292
- return {
293
- profile_version: "xytara-machine-identity-profile-v1",
294
- account_id: accountId,
295
- machine_identity_state: summary.machine_identity_state,
296
- primary_identity_kind: primaryIdentityBinding
297
- ? primaryIdentityBinding.identity_kind
298
- : primaryAgentAccount
299
- ? "agent_account"
300
- : "runtime_account_only",
301
- primary_agent_account_id: primaryAgentAccount ? primaryAgentAccount.account_id : null,
302
- primary_identity_binding_id: primaryIdentityBinding ? primaryIdentityBinding.binding_id : null,
303
- settlement_mode: primaryAgentAccount ? primaryAgentAccount.settlement_mode || null : null,
304
- protocol: primaryAgentAccount ? primaryAgentAccount.protocol || null : null,
305
- attachment_state: attachment.machine_identity_attachment_state,
306
- lineage_state: lineage.identity_transaction_count > 0 ? "lineage_present" : "lineage_absent",
307
- linked_surfaces: {
308
- machine_identity_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-summary`,
309
- machine_identity_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-bundle`,
310
- machine_identity_policy_pack_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-policy-pack`,
311
- machine_identity_binding_lineage_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-binding-lineage-summary`
312
- },
313
- generated_at_iso: nowIso()
314
- };
315
- }
316
-
317
- function buildMachineIdentityPolicyPack(state, accountId) {
318
- const summary = buildMachineIdentitySummary(state, accountId);
319
- const profile = buildMachineIdentityProfile(state, accountId);
320
- const attachment = buildMachineIdentityAttachmentSummary(state, accountId);
321
- const lineage = buildMachineIdentityLineageSummary(state, accountId);
322
- const bindingLineage = buildMachineIdentityBindingLineageSummary(state, accountId);
323
- const policyTemplates = [
324
- {
325
- template_id: "runtime_builder_identity",
326
- target_state: "account_issued",
327
- recommended_for: "runtime-first machine onboarding",
328
- steps: ["issue_agent_account", "confirm_protocol", "confirm_settlement_mode"],
329
- binding_defaults: {
330
- identity_kind: "runtime_builder_identity",
331
- registry_scope: null,
332
- attach_primary_agent_account: true,
333
- use_latest_identity_transaction: false
334
- }
335
- },
336
- {
337
- template_id: "registry_anchor_identity",
338
- target_state: "registry_anchor_present",
339
- recommended_for: "identity-plus-registry continuity",
340
- steps: ["identity_attest_preview", "registry_register", "identity_registry_link", "anchoring_submit"],
341
- binding_defaults: {
342
- identity_kind: "registry_anchor_identity",
343
- registry_scope: "registry.identity.default",
344
- attach_primary_agent_account: false,
345
- use_latest_identity_transaction: true
346
- }
347
- },
348
- {
349
- template_id: "continuity_repair_identity",
350
- target_state: "identity_activity_present",
351
- recommended_for: "repair partial identity attachment posture",
352
- steps: ["review_attachment_rows", "complete_registry_anchor_pair", "inspect_lineage"],
353
- binding_defaults: {
354
- identity_kind: "registry_anchor_identity",
355
- registry_scope: "registry.identity.default",
356
- attach_primary_agent_account: true,
357
- use_latest_identity_transaction: true
358
- }
359
- }
360
- ];
361
-
362
- let recommendedPolicyMotion = "issue_identity_from_template";
363
- if (summary.machine_identity_state === "registry_anchor_present") {
364
- recommendedPolicyMotion = "maintain_identity_profile";
365
- } else if (attachment.counts.registry_anchor_pair_count === 0 && attachment.counts.attachment_row_count > 0) {
366
- recommendedPolicyMotion = "complete_registry_anchor_pair";
367
- } else if (lineage.identity_transaction_count > 0) {
368
- recommendedPolicyMotion = "stabilize_identity_lineage";
369
- }
370
-
371
- return {
372
- pack_version: "xytara-machine-identity-policy-pack-v1",
373
- account_id: accountId,
374
- machine_identity_summary: summary,
375
- machine_identity_profile: profile,
376
- machine_identity_attachment_summary: attachment,
377
- machine_identity_lineage_summary: lineage,
378
- machine_identity_binding_lineage_summary: bindingLineage,
379
- recommended_policy_motion: recommendedPolicyMotion,
380
- policy_templates: policyTemplates,
381
- linked_surfaces: {
382
- machine_identity_profile_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-profile`,
383
- machine_identity_attachment_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-attachment-summary`,
384
- machine_identity_lineage_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-lineage-summary`,
385
- machine_identity_binding_lineage_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-binding-lineage-summary`
386
- },
387
- generated_at_iso: nowIso()
388
- };
389
- }
390
-
391
- function buildMachineIdentityPolicyApplicationSummary(state, accountId, templateId) {
392
- const pack = buildMachineIdentityPolicyPack(state, accountId);
393
- const selectedTemplate = ensureArray(pack.policy_templates).find((entry) => entry.template_id === templateId)
394
- || ensureArray(pack.policy_templates).find((entry) => {
395
- if (pack.recommended_policy_motion === "maintain_identity_profile") {
396
- return entry.template_id === "registry_anchor_identity";
397
- }
398
- if (pack.recommended_policy_motion === "complete_registry_anchor_pair") {
399
- return entry.template_id === "continuity_repair_identity";
400
- }
401
- if (pack.recommended_policy_motion === "stabilize_identity_lineage") {
402
- return entry.template_id === "continuity_repair_identity";
403
- }
404
- return entry.template_id === "runtime_builder_identity";
405
- })
406
- || ensureArray(pack.policy_templates)[0]
407
- || null;
408
- const bindingDefaults = selectedTemplate && selectedTemplate.binding_defaults ? selectedTemplate.binding_defaults : {};
409
- const suggestedBindingPayload = {
410
- account_id: accountId,
411
- identity_kind: bindingDefaults.identity_kind || "registry_anchor_identity",
412
- registry_scope: bindingDefaults.registry_scope || null,
413
- attached_agent_account_id: bindingDefaults.attach_primary_agent_account
414
- ? pack.machine_identity_profile.primary_agent_account_id || null
415
- : null,
416
- source_transaction_id: bindingDefaults.use_latest_identity_transaction
417
- ? pack.machine_identity_summary.latest_identity_transaction_id || null
418
- : null,
419
- issued_by: "operator",
420
- labels: selectedTemplate ? [`policy:${selectedTemplate.template_id}`] : []
421
- };
422
-
423
- return {
424
- summary_version: "xytara-machine-identity-policy-application-summary-v1",
425
- account_id: accountId,
426
- recommended_policy_motion: pack.recommended_policy_motion,
427
- selected_template_id: selectedTemplate ? selectedTemplate.template_id : null,
428
- available_template_ids: ensureArray(pack.policy_templates).map((entry) => entry.template_id),
429
- suggested_binding_payload: suggestedBindingPayload,
430
- selected_template: selectedTemplate,
431
- linked_surfaces: {
432
- machine_identity_policy_pack_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-policy-pack`,
433
- machine_identity_profile_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-profile`,
434
- machine_identity_binding_lineage_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-binding-lineage-summary`
435
- },
436
- generated_at_iso: nowIso()
437
- };
438
- }
439
-
440
- function buildMachineIdentityPolicyPackSummary(state, accountId) {
441
- const pack = buildMachineIdentityPolicyPack(state, accountId);
442
- return {
443
- summary_version: "xytara-machine-identity-policy-pack-summary-v1",
444
- account_id: accountId,
445
- machine_identity_state: pack.machine_identity_summary.machine_identity_state,
446
- recommended_policy_motion: pack.recommended_policy_motion,
447
- template_count: Array.isArray(pack.policy_templates) ? pack.policy_templates.length : 0,
448
- linked_surfaces: pack.linked_surfaces,
449
- generated_at_iso: pack.generated_at_iso
450
- };
451
- }
452
-
453
- function buildMachineIdentityReviewBundle(state, accountId) {
454
- const summary = buildMachineIdentitySummary(state, accountId);
455
- const bundle = buildMachineIdentityBundle(state, accountId);
456
- const reviewRows = ensureArray(bundle.identity_bindings).map((binding) => {
457
- const hasRegistryScope = typeof binding.registry_scope === "string" && binding.registry_scope.length > 0;
458
- const hasSourceTransaction = typeof binding.source_transaction_id === "string" && binding.source_transaction_id.length > 0;
459
- const hasAttachedAgent = typeof binding.attached_agent_account_id === "string" && binding.attached_agent_account_id.length > 0;
460
- const hasRotationLineage = Boolean(binding.rotated_from_binding_id || binding.replaced_by_binding_id);
461
- const reviewState = binding.status !== "active"
462
- ? "revoked"
463
- : hasRegistryScope && (hasSourceTransaction || hasAttachedAgent)
464
- ? "healthy"
465
- : "repair_candidate";
466
- return {
467
- binding_id: binding.binding_id,
468
- identity_kind: binding.identity_kind,
469
- review_state: reviewState,
470
- has_registry_scope: hasRegistryScope,
471
- has_source_transaction: hasSourceTransaction,
472
- has_attached_agent_account: hasAttachedAgent,
473
- has_rotation_lineage: hasRotationLineage,
474
- recommended_action: reviewState === "repair_candidate"
475
- ? "complete_identity_binding_context"
476
- : reviewState === "revoked"
477
- ? "review_for_replacement"
478
- : "keep_active"
479
- };
480
- });
481
-
482
- return {
483
- bundle_version: "xytara-machine-identity-review-bundle-v1",
484
- account_id: accountId,
485
- machine_identity_summary: summary,
486
- review_rows: reviewRows,
487
- review_counts: {
488
- healthy_count: reviewRows.filter((entry) => entry.review_state === "healthy").length,
489
- repair_candidate_count: reviewRows.filter((entry) => entry.review_state === "repair_candidate").length,
490
- revoked_count: reviewRows.filter((entry) => entry.review_state === "revoked").length
491
- },
492
- linked_surfaces: {
493
- machine_identity_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-bundle`,
494
- machine_identity_attention_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-attention-summary`,
495
- machine_identity_binding_lineage_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-binding-lineage-summary`
496
- },
497
- generated_at_iso: nowIso()
498
- };
499
- }
500
-
501
- function buildMachineIdentityAttentionSummary(state, accountId) {
502
- const reviewBundle = buildMachineIdentityReviewBundle(state, accountId);
503
- const attentionRows = reviewBundle.review_rows.filter((entry) => entry.review_state !== "healthy");
504
- return {
505
- summary_version: "xytara-machine-identity-attention-summary-v1",
506
- account_id: accountId,
507
- overall_attention_state: attentionRows.length > 0 ? "attention_required" : "healthy",
508
- attention_binding_count: attentionRows.length,
509
- attention_rows: attentionRows,
510
- review_counts: reviewBundle.review_counts,
511
- linked_surfaces: {
512
- machine_identity_review_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-review-bundle`,
513
- machine_identity_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-bundle`
514
- },
515
- generated_at_iso: nowIso()
516
- };
517
- }
518
-
519
- function buildMachineIdentityOperatorBundle(state, accountId) {
520
- const summary = buildMachineIdentitySummary(state, accountId);
521
- const bundle = buildMachineIdentityBundle(state, accountId);
522
- const attachment = buildMachineIdentityAttachmentSummary(state, accountId);
523
- const lineage = buildMachineIdentityLineageSummary(state, accountId);
524
- const bindingLineage = buildMachineIdentityBindingLineageSummary(state, accountId);
525
- const profile = buildMachineIdentityProfile(state, accountId);
526
- const policyPackSummary = buildMachineIdentityPolicyPackSummary(state, accountId);
527
- const policyApplicationSummary = buildMachineIdentityPolicyApplicationSummary(state, accountId, null);
528
- const reviewBundle = buildMachineIdentityReviewBundle(state, accountId);
529
- const attentionSummary = buildMachineIdentityAttentionSummary(state, accountId);
530
-
531
- return {
532
- bundle_version: "xytara-machine-identity-operator-bundle-v1",
533
- account_id: accountId,
534
- operator_posture: {
535
- machine_identity_state: summary.machine_identity_state,
536
- overall_attention_state: attentionSummary.overall_attention_state,
537
- recommended_policy_motion: policyPackSummary.recommended_policy_motion,
538
- identity_binding_count: summary.counts.identity_binding_count,
539
- identity_transaction_count: summary.counts.identity_transaction_count,
540
- rotated_binding_count: bindingLineage.rotated_binding_count,
541
- repair_candidate_count: reviewBundle.review_counts.repair_candidate_count,
542
- revoked_binding_count: reviewBundle.review_counts.revoked_count
543
- },
544
- machine_identity_summary: summary,
545
- machine_identity_profile: profile,
546
- machine_identity_bundle: bundle,
547
- machine_identity_attachment_summary: attachment,
548
- machine_identity_lineage_summary: lineage,
549
- machine_identity_binding_lineage_summary: bindingLineage,
550
- machine_identity_policy_pack_summary: policyPackSummary,
551
- machine_identity_policy_application_summary: policyApplicationSummary,
552
- machine_identity_review_bundle: reviewBundle,
553
- machine_identity_attention_summary: attentionSummary,
554
- linked_surfaces: {
555
- machine_identity_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-summary`,
556
- machine_identity_profile_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-profile`,
557
- machine_identity_policy_pack_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-policy-pack`,
558
- machine_identity_review_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-review-bundle`,
559
- machine_identity_attention_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-attention-summary`
560
- },
561
- generated_at_iso: nowIso()
562
- };
563
- }
564
-
565
- module.exports = {
566
- buildMachineIdentitySummary,
567
- buildMachineIdentityBundle,
568
- buildMachineIdentityAttachmentSummary,
569
- buildMachineIdentityLineageSummary,
570
- buildMachineIdentityBindingLineageSummary,
571
- buildMachineIdentityProfile,
572
- buildMachineIdentityPolicyPack,
573
- buildMachineIdentityPolicyPackSummary,
574
- buildMachineIdentityPolicyApplicationSummary,
575
- buildMachineIdentityReviewBundle,
576
- buildMachineIdentityAttentionSummary,
577
- buildMachineIdentityOperatorBundle
578
- };
1
+ "use strict";
2
+
3
+ function ensureArray(value) {
4
+ return Array.isArray(value) ? value : [];
5
+ }
6
+
7
+ function nowIso() {
8
+ return new Date().toISOString();
9
+ }
10
+
11
+ function listTransactionEntriesForAccount(state, accountId) {
12
+ return Array.from(state.transactions.values())
13
+ .filter((entry) => entry && entry.transaction && entry.transaction.account_id === accountId);
14
+ }
15
+
16
+ function listReceiptsForAccount(state, accountId) {
17
+ return Array.from(state.receipts.values())
18
+ .map((entry) => entry && entry.receipt ? entry.receipt : null)
19
+ .filter((receipt) => receipt && receipt.account_id === accountId);
20
+ }
21
+
22
+ function listAgentAccountsForIdentity(state, accountId) {
23
+ return Array.from(state.agentAccounts.values())
24
+ .map((entry) => entry && entry.account ? entry.account : null)
25
+ .filter((account) => account && account.account_id === accountId);
26
+ }
27
+
28
+ function listIdentityBindingsForAccount(state, accountId) {
29
+ return Array.from(state.machineIdentityBindings.values())
30
+ .filter((binding) => binding && binding.account_id === accountId);
31
+ }
32
+
33
+ function collectIdentityDeliverables(entry) {
34
+ const deliverables = entry && entry.command && Array.isArray(entry.command.deliverables)
35
+ ? entry.command.deliverables
36
+ : [];
37
+ const identityRefs = [];
38
+ const registryRefs = [];
39
+ const anchorRefs = [];
40
+ for (const item of deliverables) {
41
+ if (!item || typeof item !== "object") continue;
42
+ if (item.identity_attestation_ref) identityRefs.push(item.identity_attestation_ref);
43
+ if (item.identity_link_ref) identityRefs.push(item.identity_link_ref);
44
+ if (item.registry_record_ref) registryRefs.push(item.registry_record_ref);
45
+ if (item.registry_pack_ref) registryRefs.push(item.registry_pack_ref);
46
+ if (item.anchor_ref) anchorRefs.push(item.anchor_ref);
47
+ }
48
+ return {
49
+ identity_refs: identityRefs,
50
+ registry_refs: registryRefs,
51
+ anchor_refs: anchorRefs
52
+ };
53
+ }
54
+
55
+ function buildMachineIdentitySummary(state, accountId) {
56
+ const agentAccounts = listAgentAccountsForIdentity(state, accountId);
57
+ const identityBindings = listIdentityBindingsForAccount(state, accountId);
58
+ const transactionEntries = listTransactionEntriesForAccount(state, accountId);
59
+ const receipts = listReceiptsForAccount(state, accountId);
60
+ const identityTransactions = transactionEntries.filter((entry) =>
61
+ ensureArray(entry.command && entry.command.deliverables).some((task) =>
62
+ task && typeof task.task_ref === "string" && (
63
+ task.task_ref === "identity.attest.preview" ||
64
+ task.task_ref === "identity.registry.link" ||
65
+ task.task_ref === "registry.register" ||
66
+ task.task_ref === "registry.pack.bundle" ||
67
+ task.task_ref === "anchoring.submit"
68
+ )
69
+ ) || ensureArray(entry.transaction && entry.transaction.execution && entry.transaction.execution.tasks).some((task) =>
70
+ task && typeof task.task_ref === "string" && (
71
+ task.task_ref === "identity.attest.preview" ||
72
+ task.task_ref === "identity.registry.link" ||
73
+ task.task_ref === "registry.register" ||
74
+ task.task_ref === "registry.pack.bundle" ||
75
+ task.task_ref === "anchoring.submit"
76
+ )
77
+ )
78
+ );
79
+ const refs = identityTransactions.reduce((acc, transaction) => {
80
+ const next = collectIdentityDeliverables(transaction);
81
+ acc.identity_refs.push(...next.identity_refs);
82
+ acc.registry_refs.push(...next.registry_refs);
83
+ acc.anchor_refs.push(...next.anchor_refs);
84
+ return acc;
85
+ }, {
86
+ identity_refs: [],
87
+ registry_refs: [],
88
+ anchor_refs: []
89
+ });
90
+
91
+ const latestIdentityTransaction = identityTransactions
92
+ .map((entry) => ({
93
+ transaction_id: entry.transaction && entry.transaction.transaction_id ? entry.transaction.transaction_id : null,
94
+ created_at_iso: entry.transaction && entry.transaction.created_at_iso ? entry.transaction.created_at_iso : null
95
+ }))
96
+ .sort((a, b) => String(a.created_at_iso || "").localeCompare(String(b.created_at_iso || "")))
97
+ .slice(-1)[0] || null;
98
+
99
+ let identityState = "unbound";
100
+ if (agentAccounts.length > 0) identityState = "account_issued";
101
+ if (identityBindings.length > 0) identityState = "identity_binding_present";
102
+ if (identityTransactions.length > 0) identityState = "identity_activity_present";
103
+ if (refs.registry_refs.length > 0 && refs.anchor_refs.length > 0) identityState = "registry_anchor_present";
104
+
105
+ return {
106
+ summary_version: "xytara-machine-identity-summary-v1",
107
+ account_id: accountId,
108
+ machine_identity_state: identityState,
109
+ counts: {
110
+ agent_account_count: agentAccounts.length,
111
+ identity_binding_count: identityBindings.length,
112
+ identity_transaction_count: identityTransactions.length,
113
+ receipt_count: receipts.length,
114
+ identity_ref_count: refs.identity_refs.length,
115
+ registry_ref_count: refs.registry_refs.length,
116
+ anchor_ref_count: refs.anchor_refs.length
117
+ },
118
+ latest_identity_transaction_id: latestIdentityTransaction ? latestIdentityTransaction.transaction_id : null,
119
+ linked_surfaces: {
120
+ machine_identity_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-bundle`,
121
+ agent_accounts_ref: "/v1/agent-accounts",
122
+ operator_shell_summary_ref: "/v1/operator-shell/summary"
123
+ },
124
+ generated_at_iso: nowIso()
125
+ };
126
+ }
127
+
128
+ function buildMachineIdentityBundle(state, accountId) {
129
+ const summary = buildMachineIdentitySummary(state, accountId);
130
+ const agentAccounts = listAgentAccountsForIdentity(state, accountId);
131
+ const identityBindings = listIdentityBindingsForAccount(state, accountId);
132
+ const transactionEntries = listTransactionEntriesForAccount(state, accountId);
133
+ const identityTransactions = transactionEntries
134
+ .filter((entry) =>
135
+ ensureArray(entry.command && entry.command.deliverables).some((task) =>
136
+ task && typeof task.task_ref === "string" && (
137
+ task.task_ref === "identity.attest.preview" ||
138
+ task.task_ref === "identity.registry.link" ||
139
+ task.task_ref === "registry.register" ||
140
+ task.task_ref === "registry.pack.bundle" ||
141
+ task.task_ref === "anchoring.submit"
142
+ )
143
+ ) || ensureArray(entry.transaction && entry.transaction.execution && entry.transaction.execution.tasks).some((task) =>
144
+ task && typeof task.task_ref === "string" && (
145
+ task.task_ref === "identity.attest.preview" ||
146
+ task.task_ref === "identity.registry.link" ||
147
+ task.task_ref === "registry.register" ||
148
+ task.task_ref === "registry.pack.bundle" ||
149
+ task.task_ref === "anchoring.submit"
150
+ )
151
+ )
152
+ )
153
+ .map((entry) => {
154
+ const refs = collectIdentityDeliverables(entry);
155
+ return {
156
+ transaction_id: entry.transaction && entry.transaction.transaction_id ? entry.transaction.transaction_id : null,
157
+ status: entry.transaction && entry.transaction.status ? entry.transaction.status : null,
158
+ created_at_iso: entry.transaction && entry.transaction.created_at_iso ? entry.transaction.created_at_iso : null,
159
+ identity_refs: refs.identity_refs,
160
+ registry_refs: refs.registry_refs,
161
+ anchor_refs: refs.anchor_refs
162
+ };
163
+ });
164
+
165
+ return {
166
+ bundle_version: "xytara-machine-identity-bundle-v1",
167
+ account_id: accountId,
168
+ machine_identity_summary: summary,
169
+ agent_accounts: agentAccounts,
170
+ identity_bindings: identityBindings,
171
+ identity_transactions: identityTransactions,
172
+ linked_surfaces: {
173
+ machine_identity_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-summary`,
174
+ authority_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/authority-summary`,
175
+ wallet_ledger_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/wallet-ledger-bundle`
176
+ },
177
+ generated_at_iso: nowIso()
178
+ };
179
+ }
180
+
181
+ function buildMachineIdentityAttachmentSummary(state, accountId) {
182
+ const agentAccounts = listAgentAccountsForIdentity(state, accountId);
183
+ const bundle = buildMachineIdentityBundle(state, accountId);
184
+ const attachmentRows = bundle.identity_transactions.map((entry) => ({
185
+ transaction_id: entry.transaction_id,
186
+ identity_attachment_count: ensureArray(entry.identity_refs).length,
187
+ registry_attachment_count: ensureArray(entry.registry_refs).length,
188
+ anchor_attachment_count: ensureArray(entry.anchor_refs).length,
189
+ has_registry_anchor_pair: ensureArray(entry.registry_refs).length > 0 && ensureArray(entry.anchor_refs).length > 0,
190
+ created_at_iso: entry.created_at_iso || null
191
+ }));
192
+
193
+ return {
194
+ summary_version: "xytara-machine-identity-attachment-summary-v1",
195
+ account_id: accountId,
196
+ machine_identity_attachment_state: attachmentRows.length > 0 ? "attachments_present" : agentAccounts.length > 0 ? "account_only" : "unattached",
197
+ counts: {
198
+ agent_account_count: agentAccounts.length,
199
+ identity_binding_count: Array.isArray(bundle.identity_bindings) ? bundle.identity_bindings.length : 0,
200
+ attachment_row_count: attachmentRows.length,
201
+ registry_anchor_pair_count: attachmentRows.filter((entry) => entry.has_registry_anchor_pair).length
202
+ },
203
+ attachment_rows: attachmentRows,
204
+ linked_surfaces: {
205
+ machine_identity_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-bundle`,
206
+ machine_identity_lineage_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-lineage-summary`
207
+ },
208
+ generated_at_iso: nowIso()
209
+ };
210
+ }
211
+
212
+ function buildMachineIdentityLineageSummary(state, accountId) {
213
+ const bundle = buildMachineIdentityBundle(state, accountId);
214
+ const lineageRows = bundle.identity_transactions.map((entry, index) => {
215
+ const predecessor = index > 0 ? bundle.identity_transactions[index - 1] : null;
216
+ const successor = index < bundle.identity_transactions.length - 1 ? bundle.identity_transactions[index + 1] : null;
217
+ return {
218
+ transaction_id: entry.transaction_id,
219
+ predecessor_transaction_id: predecessor ? predecessor.transaction_id : null,
220
+ successor_transaction_id: successor ? successor.transaction_id : null,
221
+ lineage_position: predecessor ? successor ? "middle" : "leaf" : successor ? "root" : "standalone",
222
+ registry_ref_count: ensureArray(entry.registry_refs).length,
223
+ anchor_ref_count: ensureArray(entry.anchor_refs).length,
224
+ created_at_iso: entry.created_at_iso || null
225
+ };
226
+ });
227
+
228
+ return {
229
+ summary_version: "xytara-machine-identity-lineage-summary-v1",
230
+ account_id: accountId,
231
+ identity_transaction_count: bundle.identity_transactions.length,
232
+ root_count: lineageRows.filter((entry) => entry.lineage_position === "root" || entry.lineage_position === "standalone").length,
233
+ leaf_count: lineageRows.filter((entry) => entry.lineage_position === "leaf" || entry.lineage_position === "standalone").length,
234
+ lineage_rows: lineageRows,
235
+ linked_surfaces: {
236
+ machine_identity_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-summary`,
237
+ machine_identity_attachment_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-attachment-summary`
238
+ },
239
+ generated_at_iso: nowIso()
240
+ };
241
+ }
242
+
243
+ function buildMachineIdentityBindingLineageSummary(state, accountId) {
244
+ const identityBindings = listIdentityBindingsForAccount(state, accountId)
245
+ .slice()
246
+ .sort((a, b) => String(a.created_at_iso || "").localeCompare(String(b.created_at_iso || "")));
247
+ const lineageRows = identityBindings.map((entry) => ({
248
+ binding_id: entry.binding_id,
249
+ status: entry.status,
250
+ identity_kind: entry.identity_kind,
251
+ predecessor_binding_id: entry.rotated_from_binding_id || null,
252
+ successor_binding_id: entry.replaced_by_binding_id || null,
253
+ lineage_position: entry.rotated_from_binding_id
254
+ ? entry.replaced_by_binding_id
255
+ ? "middle"
256
+ : "leaf"
257
+ : entry.replaced_by_binding_id
258
+ ? "root"
259
+ : "standalone",
260
+ expires_at_iso: entry.expires_at_iso || null,
261
+ created_at_iso: entry.created_at_iso || null,
262
+ updated_at_iso: entry.updated_at_iso || null
263
+ }));
264
+
265
+ return {
266
+ summary_version: "xytara-machine-identity-binding-lineage-summary-v1",
267
+ account_id: accountId,
268
+ identity_binding_count: identityBindings.length,
269
+ rotated_binding_count: lineageRows.filter((entry) => entry.predecessor_binding_id || entry.successor_binding_id).length,
270
+ lineage_rows: lineageRows,
271
+ linked_surfaces: {
272
+ machine_identity_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-summary`,
273
+ machine_identity_review_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-review-bundle`,
274
+ machine_identity_attention_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-attention-summary`
275
+ },
276
+ generated_at_iso: nowIso()
277
+ };
278
+ }
279
+
280
+ function buildMachineIdentityProfile(state, accountId) {
281
+ const summary = buildMachineIdentitySummary(state, accountId);
282
+ const bundle = buildMachineIdentityBundle(state, accountId);
283
+ const attachment = buildMachineIdentityAttachmentSummary(state, accountId);
284
+ const lineage = buildMachineIdentityLineageSummary(state, accountId);
285
+ const primaryAgentAccount = Array.isArray(bundle.agent_accounts) && bundle.agent_accounts.length > 0
286
+ ? bundle.agent_accounts[0]
287
+ : null;
288
+ const primaryIdentityBinding = Array.isArray(bundle.identity_bindings) && bundle.identity_bindings.length > 0
289
+ ? bundle.identity_bindings[0]
290
+ : null;
291
+
292
+ return {
293
+ profile_version: "xytara-machine-identity-profile-v1",
294
+ account_id: accountId,
295
+ machine_identity_state: summary.machine_identity_state,
296
+ primary_identity_kind: primaryIdentityBinding
297
+ ? primaryIdentityBinding.identity_kind
298
+ : primaryAgentAccount
299
+ ? "agent_account"
300
+ : "runtime_account_only",
301
+ primary_agent_account_id: primaryAgentAccount ? primaryAgentAccount.account_id : null,
302
+ primary_identity_binding_id: primaryIdentityBinding ? primaryIdentityBinding.binding_id : null,
303
+ settlement_mode: primaryAgentAccount ? primaryAgentAccount.settlement_mode || null : null,
304
+ protocol: primaryAgentAccount ? primaryAgentAccount.protocol || null : null,
305
+ attachment_state: attachment.machine_identity_attachment_state,
306
+ lineage_state: lineage.identity_transaction_count > 0 ? "lineage_present" : "lineage_absent",
307
+ linked_surfaces: {
308
+ machine_identity_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-summary`,
309
+ machine_identity_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-bundle`,
310
+ machine_identity_policy_pack_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-policy-pack`,
311
+ machine_identity_binding_lineage_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-binding-lineage-summary`
312
+ },
313
+ generated_at_iso: nowIso()
314
+ };
315
+ }
316
+
317
+ function buildMachineIdentityPolicyPack(state, accountId) {
318
+ const summary = buildMachineIdentitySummary(state, accountId);
319
+ const profile = buildMachineIdentityProfile(state, accountId);
320
+ const attachment = buildMachineIdentityAttachmentSummary(state, accountId);
321
+ const lineage = buildMachineIdentityLineageSummary(state, accountId);
322
+ const bindingLineage = buildMachineIdentityBindingLineageSummary(state, accountId);
323
+ const policyTemplates = [
324
+ {
325
+ template_id: "runtime_builder_identity",
326
+ target_state: "account_issued",
327
+ recommended_for: "runtime-first machine onboarding",
328
+ steps: ["issue_agent_account", "confirm_protocol", "confirm_settlement_mode"],
329
+ binding_defaults: {
330
+ identity_kind: "runtime_builder_identity",
331
+ registry_scope: null,
332
+ attach_primary_agent_account: true,
333
+ use_latest_identity_transaction: false
334
+ }
335
+ },
336
+ {
337
+ template_id: "registry_anchor_identity",
338
+ target_state: "registry_anchor_present",
339
+ recommended_for: "identity-plus-registry continuity",
340
+ steps: ["identity_attest_preview", "registry_register", "identity_registry_link", "anchoring_submit"],
341
+ binding_defaults: {
342
+ identity_kind: "registry_anchor_identity",
343
+ registry_scope: "registry.identity.default",
344
+ attach_primary_agent_account: false,
345
+ use_latest_identity_transaction: true
346
+ }
347
+ },
348
+ {
349
+ template_id: "continuity_repair_identity",
350
+ target_state: "identity_activity_present",
351
+ recommended_for: "repair partial identity attachment posture",
352
+ steps: ["review_attachment_rows", "complete_registry_anchor_pair", "inspect_lineage"],
353
+ binding_defaults: {
354
+ identity_kind: "registry_anchor_identity",
355
+ registry_scope: "registry.identity.default",
356
+ attach_primary_agent_account: true,
357
+ use_latest_identity_transaction: true
358
+ }
359
+ }
360
+ ];
361
+
362
+ let recommendedPolicyMotion = "issue_identity_from_template";
363
+ if (summary.machine_identity_state === "registry_anchor_present") {
364
+ recommendedPolicyMotion = "maintain_identity_profile";
365
+ } else if (attachment.counts.registry_anchor_pair_count === 0 && attachment.counts.attachment_row_count > 0) {
366
+ recommendedPolicyMotion = "complete_registry_anchor_pair";
367
+ } else if (lineage.identity_transaction_count > 0) {
368
+ recommendedPolicyMotion = "stabilize_identity_lineage";
369
+ }
370
+
371
+ return {
372
+ pack_version: "xytara-machine-identity-policy-pack-v1",
373
+ account_id: accountId,
374
+ machine_identity_summary: summary,
375
+ machine_identity_profile: profile,
376
+ machine_identity_attachment_summary: attachment,
377
+ machine_identity_lineage_summary: lineage,
378
+ machine_identity_binding_lineage_summary: bindingLineage,
379
+ recommended_policy_motion: recommendedPolicyMotion,
380
+ policy_templates: policyTemplates,
381
+ linked_surfaces: {
382
+ machine_identity_profile_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-profile`,
383
+ machine_identity_attachment_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-attachment-summary`,
384
+ machine_identity_lineage_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-lineage-summary`,
385
+ machine_identity_binding_lineage_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-binding-lineage-summary`
386
+ },
387
+ generated_at_iso: nowIso()
388
+ };
389
+ }
390
+
391
+ function buildMachineIdentityPolicyApplicationSummary(state, accountId, templateId) {
392
+ const pack = buildMachineIdentityPolicyPack(state, accountId);
393
+ const selectedTemplate = ensureArray(pack.policy_templates).find((entry) => entry.template_id === templateId)
394
+ || ensureArray(pack.policy_templates).find((entry) => {
395
+ if (pack.recommended_policy_motion === "maintain_identity_profile") {
396
+ return entry.template_id === "registry_anchor_identity";
397
+ }
398
+ if (pack.recommended_policy_motion === "complete_registry_anchor_pair") {
399
+ return entry.template_id === "continuity_repair_identity";
400
+ }
401
+ if (pack.recommended_policy_motion === "stabilize_identity_lineage") {
402
+ return entry.template_id === "continuity_repair_identity";
403
+ }
404
+ return entry.template_id === "runtime_builder_identity";
405
+ })
406
+ || ensureArray(pack.policy_templates)[0]
407
+ || null;
408
+ const bindingDefaults = selectedTemplate && selectedTemplate.binding_defaults ? selectedTemplate.binding_defaults : {};
409
+ const suggestedBindingPayload = {
410
+ account_id: accountId,
411
+ identity_kind: bindingDefaults.identity_kind || "registry_anchor_identity",
412
+ registry_scope: bindingDefaults.registry_scope || null,
413
+ attached_agent_account_id: bindingDefaults.attach_primary_agent_account
414
+ ? pack.machine_identity_profile.primary_agent_account_id || null
415
+ : null,
416
+ source_transaction_id: bindingDefaults.use_latest_identity_transaction
417
+ ? pack.machine_identity_summary.latest_identity_transaction_id || null
418
+ : null,
419
+ issued_by: "operator",
420
+ labels: selectedTemplate ? [`policy:${selectedTemplate.template_id}`] : []
421
+ };
422
+
423
+ return {
424
+ summary_version: "xytara-machine-identity-policy-application-summary-v1",
425
+ account_id: accountId,
426
+ recommended_policy_motion: pack.recommended_policy_motion,
427
+ selected_template_id: selectedTemplate ? selectedTemplate.template_id : null,
428
+ available_template_ids: ensureArray(pack.policy_templates).map((entry) => entry.template_id),
429
+ suggested_binding_payload: suggestedBindingPayload,
430
+ selected_template: selectedTemplate,
431
+ linked_surfaces: {
432
+ machine_identity_policy_pack_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-policy-pack`,
433
+ machine_identity_profile_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-profile`,
434
+ machine_identity_binding_lineage_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-binding-lineage-summary`
435
+ },
436
+ generated_at_iso: nowIso()
437
+ };
438
+ }
439
+
440
+ function buildMachineIdentityPolicyPackSummary(state, accountId) {
441
+ const pack = buildMachineIdentityPolicyPack(state, accountId);
442
+ return {
443
+ summary_version: "xytara-machine-identity-policy-pack-summary-v1",
444
+ account_id: accountId,
445
+ machine_identity_state: pack.machine_identity_summary.machine_identity_state,
446
+ recommended_policy_motion: pack.recommended_policy_motion,
447
+ template_count: Array.isArray(pack.policy_templates) ? pack.policy_templates.length : 0,
448
+ linked_surfaces: pack.linked_surfaces,
449
+ generated_at_iso: pack.generated_at_iso
450
+ };
451
+ }
452
+
453
+ function buildMachineIdentityReviewBundle(state, accountId) {
454
+ const summary = buildMachineIdentitySummary(state, accountId);
455
+ const bundle = buildMachineIdentityBundle(state, accountId);
456
+ const reviewRows = ensureArray(bundle.identity_bindings).map((binding) => {
457
+ const hasRegistryScope = typeof binding.registry_scope === "string" && binding.registry_scope.length > 0;
458
+ const hasSourceTransaction = typeof binding.source_transaction_id === "string" && binding.source_transaction_id.length > 0;
459
+ const hasAttachedAgent = typeof binding.attached_agent_account_id === "string" && binding.attached_agent_account_id.length > 0;
460
+ const hasRotationLineage = Boolean(binding.rotated_from_binding_id || binding.replaced_by_binding_id);
461
+ const reviewState = binding.status !== "active"
462
+ ? "revoked"
463
+ : hasRegistryScope && (hasSourceTransaction || hasAttachedAgent)
464
+ ? "healthy"
465
+ : "repair_candidate";
466
+ return {
467
+ binding_id: binding.binding_id,
468
+ identity_kind: binding.identity_kind,
469
+ review_state: reviewState,
470
+ has_registry_scope: hasRegistryScope,
471
+ has_source_transaction: hasSourceTransaction,
472
+ has_attached_agent_account: hasAttachedAgent,
473
+ has_rotation_lineage: hasRotationLineage,
474
+ recommended_action: reviewState === "repair_candidate"
475
+ ? "complete_identity_binding_context"
476
+ : reviewState === "revoked"
477
+ ? "review_for_replacement"
478
+ : "keep_active"
479
+ };
480
+ });
481
+
482
+ return {
483
+ bundle_version: "xytara-machine-identity-review-bundle-v1",
484
+ account_id: accountId,
485
+ machine_identity_summary: summary,
486
+ review_rows: reviewRows,
487
+ review_counts: {
488
+ healthy_count: reviewRows.filter((entry) => entry.review_state === "healthy").length,
489
+ repair_candidate_count: reviewRows.filter((entry) => entry.review_state === "repair_candidate").length,
490
+ revoked_count: reviewRows.filter((entry) => entry.review_state === "revoked").length
491
+ },
492
+ linked_surfaces: {
493
+ machine_identity_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-bundle`,
494
+ machine_identity_attention_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-attention-summary`,
495
+ machine_identity_binding_lineage_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-binding-lineage-summary`
496
+ },
497
+ generated_at_iso: nowIso()
498
+ };
499
+ }
500
+
501
+ function buildMachineIdentityAttentionSummary(state, accountId) {
502
+ const reviewBundle = buildMachineIdentityReviewBundle(state, accountId);
503
+ const attentionRows = reviewBundle.review_rows.filter((entry) => entry.review_state !== "healthy");
504
+ return {
505
+ summary_version: "xytara-machine-identity-attention-summary-v1",
506
+ account_id: accountId,
507
+ overall_attention_state: attentionRows.length > 0 ? "attention_required" : "healthy",
508
+ attention_binding_count: attentionRows.length,
509
+ attention_rows: attentionRows,
510
+ review_counts: reviewBundle.review_counts,
511
+ linked_surfaces: {
512
+ machine_identity_review_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-review-bundle`,
513
+ machine_identity_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-bundle`
514
+ },
515
+ generated_at_iso: nowIso()
516
+ };
517
+ }
518
+
519
+ function buildMachineIdentityOperatorBundle(state, accountId) {
520
+ const summary = buildMachineIdentitySummary(state, accountId);
521
+ const bundle = buildMachineIdentityBundle(state, accountId);
522
+ const attachment = buildMachineIdentityAttachmentSummary(state, accountId);
523
+ const lineage = buildMachineIdentityLineageSummary(state, accountId);
524
+ const bindingLineage = buildMachineIdentityBindingLineageSummary(state, accountId);
525
+ const profile = buildMachineIdentityProfile(state, accountId);
526
+ const policyPackSummary = buildMachineIdentityPolicyPackSummary(state, accountId);
527
+ const policyApplicationSummary = buildMachineIdentityPolicyApplicationSummary(state, accountId, null);
528
+ const reviewBundle = buildMachineIdentityReviewBundle(state, accountId);
529
+ const attentionSummary = buildMachineIdentityAttentionSummary(state, accountId);
530
+
531
+ return {
532
+ bundle_version: "xytara-machine-identity-operator-bundle-v1",
533
+ account_id: accountId,
534
+ operator_posture: {
535
+ machine_identity_state: summary.machine_identity_state,
536
+ overall_attention_state: attentionSummary.overall_attention_state,
537
+ recommended_policy_motion: policyPackSummary.recommended_policy_motion,
538
+ identity_binding_count: summary.counts.identity_binding_count,
539
+ identity_transaction_count: summary.counts.identity_transaction_count,
540
+ rotated_binding_count: bindingLineage.rotated_binding_count,
541
+ repair_candidate_count: reviewBundle.review_counts.repair_candidate_count,
542
+ revoked_binding_count: reviewBundle.review_counts.revoked_count
543
+ },
544
+ machine_identity_summary: summary,
545
+ machine_identity_profile: profile,
546
+ machine_identity_bundle: bundle,
547
+ machine_identity_attachment_summary: attachment,
548
+ machine_identity_lineage_summary: lineage,
549
+ machine_identity_binding_lineage_summary: bindingLineage,
550
+ machine_identity_policy_pack_summary: policyPackSummary,
551
+ machine_identity_policy_application_summary: policyApplicationSummary,
552
+ machine_identity_review_bundle: reviewBundle,
553
+ machine_identity_attention_summary: attentionSummary,
554
+ linked_surfaces: {
555
+ machine_identity_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-summary`,
556
+ machine_identity_profile_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-profile`,
557
+ machine_identity_policy_pack_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-policy-pack`,
558
+ machine_identity_review_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-review-bundle`,
559
+ machine_identity_attention_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/machine-identity-attention-summary`
560
+ },
561
+ generated_at_iso: nowIso()
562
+ };
563
+ }
564
+
565
+ module.exports = {
566
+ buildMachineIdentitySummary,
567
+ buildMachineIdentityBundle,
568
+ buildMachineIdentityAttachmentSummary,
569
+ buildMachineIdentityLineageSummary,
570
+ buildMachineIdentityBindingLineageSummary,
571
+ buildMachineIdentityProfile,
572
+ buildMachineIdentityPolicyPack,
573
+ buildMachineIdentityPolicyPackSummary,
574
+ buildMachineIdentityPolicyApplicationSummary,
575
+ buildMachineIdentityReviewBundle,
576
+ buildMachineIdentityAttentionSummary,
577
+ buildMachineIdentityOperatorBundle
578
+ };