xytara 2.3.0 → 2.5.0

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 (44) hide show
  1. package/OPERATIONS_RUNBOOK.md +1 -0
  2. package/README.md +16 -0
  3. package/RELEASE_NOTES.md +18 -14
  4. package/SERVICE_CONTRACT.md +75 -0
  5. package/START_HERE.md +40 -0
  6. package/bin/xytara.js +55 -0
  7. package/index.js +1 -1
  8. package/lib/a2a_lane_contract.js +104 -0
  9. package/lib/a2c_lane_contract.js +111 -0
  10. package/lib/account_auth.js +347 -1
  11. package/lib/artifact_distribution_lane_contract.js +54 -0
  12. package/lib/asyncapi_contract.js +150 -0
  13. package/lib/auth_interop_contract.js +80 -0
  14. package/lib/capability_registry.js +572 -0
  15. package/lib/cloudevents_contract.js +80 -0
  16. package/lib/command_flow.js +20 -1
  17. package/lib/commerce_authority.js +449 -0
  18. package/lib/commerce_client.js +32 -0
  19. package/lib/commerce_economics.js +2168 -2
  20. package/lib/commerce_identity.js +578 -0
  21. package/lib/commerce_runtime.js +4 -0
  22. package/lib/erc8004_lane_contract.js +65 -0
  23. package/lib/event_system_lane_contract.js +75 -0
  24. package/lib/feature_control_lane_contract.js +54 -0
  25. package/lib/framework_lane_contract.js +89 -0
  26. package/lib/identity_auth.js +175 -0
  27. package/lib/identity_interop_contract.js +82 -0
  28. package/lib/integration_matrix_contract.js +93 -0
  29. package/lib/major_rails_lane_contract.js +90 -0
  30. package/lib/mcp_lane_contract.js +110 -0
  31. package/lib/openapi_contract.js +296 -0
  32. package/lib/protocol_lane_contract.js +114 -0
  33. package/lib/provenance_lane_contract.js +54 -0
  34. package/lib/provider_lane_contract.js +72 -0
  35. package/lib/release_history.js +16 -0
  36. package/lib/settlement_lane_contract.js +111 -0
  37. package/lib/shared_signals_lane_contract.js +54 -0
  38. package/lib/stablecoin_lane_contract.js +76 -0
  39. package/lib/stripe_mpp_lane_contract.js +93 -0
  40. package/lib/telemetry_lane_contract.js +54 -0
  41. package/lib/treasury_lane_contract.js +84 -0
  42. package/lib/x402_lane_contract.js +118 -0
  43. package/package.json +5 -3
  44. package/server.js +1544 -0
@@ -0,0 +1,449 @@
1
+ "use strict";
2
+
3
+ function normalizeString(value, fallback = null) {
4
+ const trimmed = typeof value === "string" ? value.trim() : "";
5
+ return trimmed || fallback;
6
+ }
7
+
8
+ function ensureArray(value) {
9
+ return Array.isArray(value) ? value : [];
10
+ }
11
+
12
+ function nowIso() {
13
+ return new Date().toISOString();
14
+ }
15
+
16
+ function listMapValuesByAccount(map, accountId) {
17
+ return Array.from(map.values()).filter((item) => item && item.account_id === accountId);
18
+ }
19
+
20
+ function listExternalCreditGrantsForAccount(state, accountId) {
21
+ return Array.from(state.externalCreditGrants.values()).filter((item) => item && item.account_id === accountId);
22
+ }
23
+
24
+ function listSpendCredentialsForAccount(state, accountId) {
25
+ return Array.from(state.accountSpendCredentials.values()).filter((item) => item && item.account_id === accountId);
26
+ }
27
+
28
+ function listAuthorityBindingsForAccount(state, accountId) {
29
+ return Array.from(state.accountAuthorityBindings.values()).filter((item) => item && item.account_id === accountId);
30
+ }
31
+
32
+ function listDelegatedTransactionsForCredential(state, credentialId) {
33
+ return Array.from(state.transactions.values())
34
+ .map((entry) => entry && entry.transaction)
35
+ .filter((transaction) =>
36
+ transaction &&
37
+ transaction.payment &&
38
+ transaction.payment.verification_mode === "delegated_spend_credential" &&
39
+ transaction.payment.wallet_id === credentialId
40
+ );
41
+ }
42
+
43
+ function buildAuthoritySummary(state, accountId) {
44
+ const bindings = listAuthorityBindingsForAccount(state, accountId);
45
+ const credentials = listSpendCredentialsForAccount(state, accountId);
46
+ const grants = listExternalCreditGrantsForAccount(state, accountId);
47
+ const entitlements = listMapValuesByAccount(state.economicsEntitlements, accountId);
48
+ const agents = listMapValuesByAccount(state.economicsAgents, accountId);
49
+ const budgets = listMapValuesByAccount(state.economicsBudgets, accountId);
50
+
51
+ const activeCredentials = credentials.filter((entry) => entry.status === "active");
52
+ const activeBindings = bindings.filter((entry) => entry.status === "active");
53
+ const revokedCredentials = credentials.filter((entry) => entry.status === "revoked");
54
+ const boundedCredentials = activeCredentials.filter((entry) => entry.spend_posture === "bounded_spend");
55
+ const openCredentials = activeCredentials.filter((entry) => entry.spend_posture === "open_spend");
56
+ const entitlementBoundCredentials = activeCredentials.filter((entry) => entry.entitlement_id);
57
+ const packBoundCredentials = activeCredentials.filter((entry) => !entry.entitlement_id && entry.pack_id);
58
+ const activeEntitlements = entitlements.filter((entry) => entry.status === "active" && Number(entry.remaining_units || 0) > 0);
59
+ const activeAgents = agents.filter((entry) => entry.status === "active");
60
+ const activeBudgets = budgets.filter((entry) => entry.status === "active");
61
+
62
+ let delegatedSpendState = "no_delegated_spend";
63
+ if (activeBindings.length > 0 || activeCredentials.length > 0) {
64
+ delegatedSpendState = boundedCredentials.length > 0 ? "bounded_delegated_spend_available" : "open_delegated_spend_available";
65
+ }
66
+
67
+ let authorityState = "unbound";
68
+ if (activeEntitlements.length > 0 || grants.length > 0) authorityState = "funded";
69
+ if (activeAgents.length > 0 || activeBudgets.length > 0 || activeBindings.length > 0 || activeCredentials.length > 0) authorityState = "governed";
70
+
71
+ return {
72
+ summary_version: "xytara-authority-summary-v1",
73
+ account_id: accountId,
74
+ authority_state: authorityState,
75
+ delegated_spend_state: delegatedSpendState,
76
+ entitlement_binding_state: entitlementBoundCredentials.length > 0
77
+ ? "entitlement_bound_delegation_present"
78
+ : packBoundCredentials.length > 0
79
+ ? "pack_bound_delegation_present"
80
+ : activeEntitlements.length > 0
81
+ ? "funded_without_bound_delegation"
82
+ : "no_entitlement_binding",
83
+ bounded_policy_state: activeAgents.length > 0 || activeBudgets.length > 0
84
+ ? "bounded_policy_present"
85
+ : "no_bounded_policy",
86
+ external_funding_state: grants.length > 0 ? "external_funding_present" : "no_external_funding_recorded",
87
+ counts: {
88
+ spend_credential_count: credentials.length,
89
+ authority_binding_count: bindings.length,
90
+ active_authority_binding_count: activeBindings.length,
91
+ active_spend_credential_count: activeCredentials.length,
92
+ revoked_spend_credential_count: revokedCredentials.length,
93
+ bounded_spend_credential_count: boundedCredentials.length,
94
+ open_spend_credential_count: openCredentials.length,
95
+ external_credit_grant_count: grants.length,
96
+ entitlement_count: entitlements.length,
97
+ active_entitlement_count: activeEntitlements.length,
98
+ economics_agent_count: agents.length,
99
+ active_economics_agent_count: activeAgents.length,
100
+ economics_budget_count: budgets.length,
101
+ active_economics_budget_count: activeBudgets.length
102
+ },
103
+ authority_units: {
104
+ granted_units: grants.reduce((sum, entry) => sum + Number(entry.units || 0), 0),
105
+ entitled_remaining_units: entitlements.reduce((sum, entry) => sum + Number(entry.remaining_units || 0), 0)
106
+ },
107
+ linked_surfaces: {
108
+ spend_credentials_ref: `/v1/spend-credentials?account_id=${encodeURIComponent(accountId)}`,
109
+ external_credit_grants_ref: `/v1/credit-bridge/grants?account_id=${encodeURIComponent(accountId)}`,
110
+ entitlements_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/entitlements`,
111
+ policy_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/policy-summary`,
112
+ authority_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/authority-bundle`
113
+ },
114
+ generated_at_iso: nowIso()
115
+ };
116
+ }
117
+
118
+ function buildAuthorityBundle(state, accountId) {
119
+ const summary = buildAuthoritySummary(state, accountId);
120
+ const bindings = listAuthorityBindingsForAccount(state, accountId).map((entry) => ({
121
+ binding_id: entry.binding_id,
122
+ status: entry.status,
123
+ authority_kind: entry.authority_kind,
124
+ spend_posture: entry.spend_posture,
125
+ scope: entry.scope,
126
+ authority_scope: ensureArray(entry.authority_scope),
127
+ allowed_consequence_families: ensureArray(entry.allowed_consequence_families),
128
+ consequence_bounds: entry.consequence_bounds || {
129
+ max_commit_units: null,
130
+ max_reserve_units: null,
131
+ max_reversal_units: null
132
+ },
133
+ credential_id: entry.credential_id || null,
134
+ agent_id: entry.agent_id || null,
135
+ budget_id: entry.budget_id || null,
136
+ pack_id: entry.pack_id || null,
137
+ entitlement_id: entry.entitlement_id || null,
138
+ issued_by: entry.issued_by || null,
139
+ expires_at_iso: entry.expires_at_iso || null
140
+ }));
141
+ const credentials = listSpendCredentialsForAccount(state, accountId).map((entry) => ({
142
+ credential_id: entry.credential_id,
143
+ status: entry.status,
144
+ spend_posture: entry.spend_posture,
145
+ scope: entry.scope,
146
+ agent_id: entry.agent_id || null,
147
+ budget_id: entry.budget_id || null,
148
+ pack_id: entry.pack_id || null,
149
+ entitlement_id: entry.entitlement_id || null,
150
+ issued_by: entry.issued_by || null,
151
+ expires_at_iso: entry.expires_at_iso || null,
152
+ labels: ensureArray(entry.labels)
153
+ }));
154
+ const grants = listExternalCreditGrantsForAccount(state, accountId).map((entry) => ({
155
+ grant_id: entry.grant_id,
156
+ status: entry.status,
157
+ source: entry.source || null,
158
+ pack_id: entry.pack_id || null,
159
+ entitlement_id: entry.entitlement_id || null,
160
+ units: Number(entry.units || 0),
161
+ provider_reference: entry.provider_reference || null,
162
+ created_at_iso: entry.created_at_iso || null
163
+ }));
164
+ const entitlements = listMapValuesByAccount(state.economicsEntitlements, accountId).map((entry) => ({
165
+ entitlement_id: entry.entitlement_id,
166
+ status: entry.status,
167
+ pack_id: entry.pack_id || null,
168
+ issued_units: Number(entry.issued_units || 0),
169
+ consumed_units: Number(entry.consumed_units || 0),
170
+ remaining_units: Number(entry.remaining_units || 0),
171
+ preferred_replacement_pack_id: entry.preferred_replacement_pack_id || null
172
+ }));
173
+ const agents = listMapValuesByAccount(state.economicsAgents, accountId).map((entry) => ({
174
+ agent_id: entry.agent_id,
175
+ status: entry.status,
176
+ default_budget_id: entry.default_budget_id || null,
177
+ allowed_job_domains: ensureArray(entry.allowed_job_domains)
178
+ }));
179
+ const budgets = listMapValuesByAccount(state.economicsBudgets, accountId).map((entry) => ({
180
+ budget_id: entry.budget_id,
181
+ status: entry.status,
182
+ max_reserve_units: entry.max_reserve_units,
183
+ policy_ref: entry.policy_ref || null,
184
+ allowed_job_domains: ensureArray(entry.allowed_job_domains)
185
+ }));
186
+
187
+ return {
188
+ bundle_version: "xytara-authority-bundle-v1",
189
+ account_id: accountId,
190
+ authority_summary: summary,
191
+ authority_bindings: bindings,
192
+ delegated_spend_credentials: credentials,
193
+ external_credit_grants: grants,
194
+ entitlements,
195
+ economics_agents: agents,
196
+ economics_budgets: budgets,
197
+ authority_tracks: {
198
+ funding_track: grants.length > 0 ? "external_grant_backed" : "direct_credit_only",
199
+ delegation_track: bindings.length > 0 ? "authority_binding_available" : credentials.length > 0 ? "delegated_spend_available" : "operator_only_spend",
200
+ governance_track: agents.length > 0 || budgets.length > 0 ? "policy_bounded" : "unbounded"
201
+ },
202
+ linked_surfaces: {
203
+ authority_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/authority-summary`,
204
+ operator_shell_summary_ref: "/v1/operator-shell/summary"
205
+ },
206
+ generated_at_iso: nowIso()
207
+ };
208
+ }
209
+
210
+ function buildAuthorityUsageSummary(state, accountId) {
211
+ const bindings = listAuthorityBindingsForAccount(state, accountId);
212
+ const bindingUsage = bindings.map((binding) => {
213
+ const delegatedTransactions = listDelegatedTransactionsForCredential(state, binding.credential_id);
214
+ const usageCount = delegatedTransactions.length;
215
+ const latestUsedAtIso = delegatedTransactions
216
+ .map((entry) => entry.created_at_iso || null)
217
+ .filter(Boolean)
218
+ .sort()
219
+ .slice(-1)[0] || null;
220
+ return {
221
+ binding_id: binding.binding_id,
222
+ credential_id: binding.credential_id || null,
223
+ status: binding.status,
224
+ authority_scope: ensureArray(binding.authority_scope),
225
+ delegated_transaction_count: usageCount,
226
+ latest_used_at_iso: latestUsedAtIso
227
+ };
228
+ });
229
+
230
+ return {
231
+ summary_version: "xytara-authority-usage-summary-v1",
232
+ account_id: accountId,
233
+ authority_binding_count: bindings.length,
234
+ active_authority_binding_count: bindings.filter((entry) => entry.status === "active").length,
235
+ used_authority_binding_count: bindingUsage.filter((entry) => entry.delegated_transaction_count > 0).length,
236
+ total_delegated_transaction_count: bindingUsage.reduce((sum, entry) => sum + entry.delegated_transaction_count, 0),
237
+ bindings: bindingUsage,
238
+ linked_surfaces: {
239
+ authority_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/authority-summary`,
240
+ authority_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/authority-bundle`,
241
+ authority_review_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/authority-review-bundle`
242
+ },
243
+ generated_at_iso: nowIso()
244
+ };
245
+ }
246
+
247
+ function buildAuthorityReviewBundle(state, accountId) {
248
+ const summary = buildAuthoritySummary(state, accountId);
249
+ const usage = buildAuthorityUsageSummary(state, accountId);
250
+ const reviewRows = usage.bindings.map((bindingUsage) => {
251
+ const matchingBinding = listAuthorityBindingsForAccount(state, accountId).find((entry) => entry.binding_id === bindingUsage.binding_id) || null;
252
+ const scopeCount = bindingUsage.authority_scope.length;
253
+ const consequenceBounds = matchingBinding && matchingBinding.consequence_bounds ? matchingBinding.consequence_bounds : {};
254
+ const broadOpenSpend = matchingBinding && matchingBinding.spend_posture === "open_spend" && scopeCount > 1;
255
+ const quietBinding = bindingUsage.delegated_transaction_count === 0;
256
+ const missingBounds = !Number.isFinite(Number(consequenceBounds.max_commit_units));
257
+ const reviewState = broadOpenSpend || missingBounds ? "tighten_candidate" : quietBinding ? "rotate_or_revoke_candidate" : "healthy";
258
+ return {
259
+ binding_id: bindingUsage.binding_id,
260
+ credential_id: bindingUsage.credential_id,
261
+ review_state: reviewState,
262
+ delegated_transaction_count: bindingUsage.delegated_transaction_count,
263
+ authority_scope_count: scopeCount,
264
+ latest_used_at_iso: bindingUsage.latest_used_at_iso,
265
+ recommended_action: reviewState === "tighten_candidate"
266
+ ? "tighten_scope_or_bounds"
267
+ : reviewState === "rotate_or_revoke_candidate"
268
+ ? "review_for_rotation_or_revocation"
269
+ : "keep_active"
270
+ };
271
+ });
272
+
273
+ return {
274
+ bundle_version: "xytara-authority-review-bundle-v1",
275
+ account_id: accountId,
276
+ authority_summary: summary,
277
+ authority_usage_summary: usage,
278
+ review_rows: reviewRows,
279
+ review_counts: {
280
+ tighten_candidate_count: reviewRows.filter((entry) => entry.review_state === "tighten_candidate").length,
281
+ rotate_or_revoke_candidate_count: reviewRows.filter((entry) => entry.review_state === "rotate_or_revoke_candidate").length,
282
+ healthy_count: reviewRows.filter((entry) => entry.review_state === "healthy").length
283
+ },
284
+ linked_surfaces: {
285
+ authority_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/authority-summary`,
286
+ authority_usage_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/authority-usage-summary`
287
+ },
288
+ generated_at_iso: nowIso()
289
+ };
290
+ }
291
+
292
+ function buildAuthorityAttentionSummary(state, accountId) {
293
+ const reviewBundle = buildAuthorityReviewBundle(state, accountId);
294
+ const attentionRows = reviewBundle.review_rows
295
+ .filter((entry) => entry.review_state !== "healthy")
296
+ .map((entry) => ({
297
+ binding_id: entry.binding_id,
298
+ credential_id: entry.credential_id,
299
+ review_state: entry.review_state,
300
+ delegated_transaction_count: entry.delegated_transaction_count,
301
+ latest_used_at_iso: entry.latest_used_at_iso,
302
+ recommended_action: entry.recommended_action
303
+ }));
304
+
305
+ return {
306
+ summary_version: "xytara-authority-attention-summary-v1",
307
+ account_id: accountId,
308
+ overall_attention_state: attentionRows.length > 0 ? "attention_required" : "healthy",
309
+ attention_binding_count: attentionRows.length,
310
+ review_counts: reviewBundle.review_counts,
311
+ attention_rows: attentionRows,
312
+ linked_surfaces: {
313
+ authority_review_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/authority-review-bundle`,
314
+ authority_usage_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/authority-usage-summary`
315
+ },
316
+ generated_at_iso: nowIso()
317
+ };
318
+ }
319
+
320
+ function buildAuthorityLineageSummary(state, accountId) {
321
+ const bindings = listAuthorityBindingsForAccount(state, accountId);
322
+ const bindingIds = new Set(bindings.map((entry) => entry.binding_id));
323
+ const lineageRows = bindings.map((entry) => {
324
+ const predecessorId = normalizeString(entry.rotated_from_binding_id, null);
325
+ const successorId = normalizeString(entry.replaced_by_binding_id, null);
326
+ return {
327
+ binding_id: entry.binding_id,
328
+ status: entry.status,
329
+ credential_id: entry.credential_id || null,
330
+ predecessor_binding_id: predecessorId,
331
+ successor_binding_id: successorId,
332
+ lineage_position: predecessorId ? successorId ? "middle" : "leaf" : successorId ? "root" : "standalone",
333
+ predecessor_known: predecessorId ? bindingIds.has(predecessorId) : false,
334
+ successor_known: successorId ? bindingIds.has(successorId) : false,
335
+ rotated_at_iso: entry.revoked_at_iso || null,
336
+ created_at_iso: entry.created_at_iso || null,
337
+ updated_at_iso: entry.updated_at_iso || null
338
+ };
339
+ });
340
+
341
+ const roots = lineageRows.filter((entry) => entry.lineage_position === "root" || entry.lineage_position === "standalone");
342
+ const leaves = lineageRows.filter((entry) => entry.lineage_position === "leaf" || entry.lineage_position === "standalone");
343
+
344
+ return {
345
+ summary_version: "xytara-authority-lineage-summary-v1",
346
+ account_id: accountId,
347
+ authority_binding_count: bindings.length,
348
+ rotated_binding_count: lineageRows.filter((entry) => entry.predecessor_binding_id || entry.successor_binding_id).length,
349
+ root_binding_count: roots.length,
350
+ leaf_binding_count: leaves.length,
351
+ lineage_rows: lineageRows,
352
+ linked_surfaces: {
353
+ authority_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/authority-bundle`,
354
+ authority_review_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/authority-review-bundle`,
355
+ authority_attention_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/authority-attention-summary`
356
+ },
357
+ generated_at_iso: nowIso()
358
+ };
359
+ }
360
+
361
+ function buildAuthorityPolicyPack(state, accountId) {
362
+ const summary = buildAuthoritySummary(state, accountId);
363
+ const review = buildAuthorityReviewBundle(state, accountId);
364
+ const attention = buildAuthorityAttentionSummary(state, accountId);
365
+ const lineage = buildAuthorityLineageSummary(state, accountId);
366
+ const templates = [
367
+ {
368
+ template_id: "runtime_builder_default",
369
+ authority_scope: ["runtime.execute", "economics.consume"],
370
+ allowed_consequence_families: ["commit", "meter"],
371
+ consequence_bounds: {
372
+ max_commit_units: 25,
373
+ max_reserve_units: null,
374
+ max_reversal_units: 0
375
+ },
376
+ recommended_for: "runtime-first delegated execution"
377
+ },
378
+ {
379
+ template_id: "reserve_operator_bounded",
380
+ authority_scope: ["economics.reserve", "economics.release"],
381
+ allowed_consequence_families: ["reserve", "release"],
382
+ consequence_bounds: {
383
+ max_commit_units: 0,
384
+ max_reserve_units: 40,
385
+ max_reversal_units: 0
386
+ },
387
+ recommended_for: "bounded treasury-hold operations"
388
+ },
389
+ {
390
+ template_id: "reversal_operator_limited",
391
+ authority_scope: ["economics.reverse"],
392
+ allowed_consequence_families: ["reverse"],
393
+ consequence_bounds: {
394
+ max_commit_units: 0,
395
+ max_reserve_units: 0,
396
+ max_reversal_units: 5
397
+ },
398
+ recommended_for: "corrective operator handling"
399
+ }
400
+ ];
401
+
402
+ return {
403
+ pack_version: "xytara-authority-policy-pack-v1",
404
+ account_id: accountId,
405
+ authority_summary: summary,
406
+ review_counts: review.review_counts,
407
+ overall_attention_state: attention.overall_attention_state,
408
+ lineage_overview: {
409
+ authority_binding_count: lineage.authority_binding_count,
410
+ rotated_binding_count: lineage.rotated_binding_count,
411
+ root_binding_count: lineage.root_binding_count,
412
+ leaf_binding_count: lineage.leaf_binding_count
413
+ },
414
+ recommended_policy_motion: attention.attention_binding_count > 0 ? "tighten_or_rotate_existing_bindings" : "issue_from_template",
415
+ policy_templates: templates,
416
+ linked_surfaces: {
417
+ authority_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/authority-bundle`,
418
+ authority_review_bundle_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/authority-review-bundle`,
419
+ authority_attention_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/authority-attention-summary`,
420
+ authority_lineage_summary_ref: `/v1/economics/accounts/${encodeURIComponent(accountId)}/authority-lineage-summary`
421
+ },
422
+ generated_at_iso: nowIso()
423
+ };
424
+ }
425
+
426
+ function buildAuthorityPolicyPackSummary(state, accountId) {
427
+ const pack = buildAuthorityPolicyPack(state, accountId);
428
+ return {
429
+ summary_version: "xytara-authority-policy-pack-summary-v1",
430
+ account_id: accountId,
431
+ recommended_policy_motion: pack.recommended_policy_motion,
432
+ template_count: Array.isArray(pack.policy_templates) ? pack.policy_templates.length : 0,
433
+ overall_attention_state: pack.overall_attention_state,
434
+ rotated_binding_count: pack.lineage_overview.rotated_binding_count,
435
+ linked_surfaces: pack.linked_surfaces,
436
+ generated_at_iso: pack.generated_at_iso
437
+ };
438
+ }
439
+
440
+ module.exports = {
441
+ buildAuthoritySummary,
442
+ buildAuthorityBundle,
443
+ buildAuthorityUsageSummary,
444
+ buildAuthorityReviewBundle,
445
+ buildAuthorityAttentionSummary,
446
+ buildAuthorityLineageSummary,
447
+ buildAuthorityPolicyPack,
448
+ buildAuthorityPolicyPackSummary
449
+ };
@@ -2003,6 +2003,38 @@ class CommerceClient {
2003
2003
  return result && result.data ? result.data : { ok: false, reason: "invalid_promotion_action_request" };
2004
2004
  }
2005
2005
 
2006
+ async getProviderLane() {
2007
+ return this.getJson("/v1/providers");
2008
+ }
2009
+
2010
+ async getProviderLaneSummary() {
2011
+ return this.getJson("/v1/providers/summary");
2012
+ }
2013
+
2014
+ async getFrameworkLane() {
2015
+ return this.getJson("/v1/frameworks");
2016
+ }
2017
+
2018
+ async getFrameworkLaneSummary() {
2019
+ return this.getJson("/v1/frameworks/summary");
2020
+ }
2021
+
2022
+ async getProtocolLane() {
2023
+ return this.getJson("/v1/protocols");
2024
+ }
2025
+
2026
+ async getProtocolLaneSummary() {
2027
+ return this.getJson("/v1/protocols/summary");
2028
+ }
2029
+
2030
+ async getIntegrationMatrix() {
2031
+ return this.getJson("/v1/integration-matrix");
2032
+ }
2033
+
2034
+ async getIntegrationMatrixSummary() {
2035
+ return this.getJson("/v1/integration-matrix/summary");
2036
+ }
2037
+
2006
2038
  async getTaskExecutionModeSummaries(forceRefresh) {
2007
2039
  const tasks = await this.listTasks(forceRefresh);
2008
2040
  return summarizeFacetCounts(