xytara 2.3.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.
@@ -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
+ };