xytara 2.2.0 → 2.4.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.
- package/RELEASE_NOTES.md +16 -10
- package/lib/account_auth.js +347 -1
- package/lib/capability_registry.js +572 -0
- package/lib/command_flow.js +20 -1
- package/lib/commerce_authority.js +449 -0
- package/lib/commerce_client.js +38 -0
- package/lib/commerce_economics.js +2471 -1
- package/lib/commerce_identity.js +578 -0
- package/lib/commerce_runtime.js +4 -0
- package/lib/identity_auth.js +175 -0
- package/lib/operator_intelligence.js +90 -0
- package/lib/partner_intelligence.js +105 -0
- package/package.json +1 -1
- package/server.js +1308 -59
|
@@ -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
|
+
};
|
package/lib/commerce_client.js
CHANGED
|
@@ -3776,6 +3776,30 @@ class CommerceClient {
|
|
|
3776
3776
|
return result && result.data ? result.data : null;
|
|
3777
3777
|
}
|
|
3778
3778
|
|
|
3779
|
+
async getPartnerIntelligenceSummary() {
|
|
3780
|
+
const result = await this.getJson("/v1/partner-intelligence/summary");
|
|
3781
|
+
return result && result.data ? result.data : null;
|
|
3782
|
+
}
|
|
3783
|
+
|
|
3784
|
+
async getPartnerIntelligencePack() {
|
|
3785
|
+
const result = await this.getJson("/v1/partner-intelligence");
|
|
3786
|
+
return result && result.data ? result.data : null;
|
|
3787
|
+
}
|
|
3788
|
+
|
|
3789
|
+
async getOperatorIntelligenceSummary(accountId) {
|
|
3790
|
+
const resolvedAccountId = String(accountId || this.accountId || "").trim();
|
|
3791
|
+
const suffix = resolvedAccountId ? `?account_id=${encodeURIComponent(resolvedAccountId)}` : "";
|
|
3792
|
+
const result = await this.getJson(`/v1/operator-intelligence/summary${suffix}`);
|
|
3793
|
+
return result && result.data ? result.data : null;
|
|
3794
|
+
}
|
|
3795
|
+
|
|
3796
|
+
async getOperatorIntelligencePack(accountId) {
|
|
3797
|
+
const resolvedAccountId = String(accountId || this.accountId || "").trim();
|
|
3798
|
+
const suffix = resolvedAccountId ? `?account_id=${encodeURIComponent(resolvedAccountId)}` : "";
|
|
3799
|
+
const result = await this.getJson(`/v1/operator-intelligence${suffix}`);
|
|
3800
|
+
return result && result.data ? result.data : null;
|
|
3801
|
+
}
|
|
3802
|
+
|
|
3779
3803
|
async getCreditBalance(accountId) {
|
|
3780
3804
|
const resolvedAccountId = String(accountId || this.accountId || "").trim();
|
|
3781
3805
|
if (!resolvedAccountId) throw new Error("getCreditBalance requires accountId");
|
|
@@ -3783,6 +3807,20 @@ class CommerceClient {
|
|
|
3783
3807
|
return result && result.data ? result.data : null;
|
|
3784
3808
|
}
|
|
3785
3809
|
|
|
3810
|
+
async getEconomicsIntelligenceSummary(accountId) {
|
|
3811
|
+
const resolvedAccountId = String(accountId || this.accountId || "").trim();
|
|
3812
|
+
if (!resolvedAccountId) throw new Error("getEconomicsIntelligenceSummary requires accountId");
|
|
3813
|
+
const result = await this.getJson(`/v1/economics/accounts/${encodeURIComponent(resolvedAccountId)}/intelligence-summary`);
|
|
3814
|
+
return result && result.data ? result.data : null;
|
|
3815
|
+
}
|
|
3816
|
+
|
|
3817
|
+
async getTreasuryIntelligenceSummary(accountId) {
|
|
3818
|
+
const resolvedAccountId = String(accountId || this.accountId || "").trim();
|
|
3819
|
+
if (!resolvedAccountId) throw new Error("getTreasuryIntelligenceSummary requires accountId");
|
|
3820
|
+
const result = await this.getJson(`/v1/economics/accounts/${encodeURIComponent(resolvedAccountId)}/treasury-intelligence-summary`);
|
|
3821
|
+
return result && result.data ? result.data : null;
|
|
3822
|
+
}
|
|
3823
|
+
|
|
3786
3824
|
async getUsageMeteringSummary(accountId) {
|
|
3787
3825
|
const resolvedAccountId = String(accountId || this.accountId || "").trim();
|
|
3788
3826
|
if (!resolvedAccountId) throw new Error("getUsageMeteringSummary requires accountId");
|