@knowttl/mg-axi 0.1.1 → 0.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 (40) hide show
  1. package/README.md +149 -38
  2. package/dist/api.js +134 -8
  3. package/dist/bin/mg-axi-hook.js +31 -0
  4. package/dist/catalogue.js +390 -2
  5. package/dist/cli.js +116 -8
  6. package/dist/docs.js +45 -5
  7. package/dist/doctor.js +2 -2
  8. package/dist/entra-access-reviews.js +11 -4
  9. package/dist/entra-apps.js +13 -8
  10. package/dist/entra-audit-logs.js +8 -4
  11. package/dist/entra-auth-methods.js +8 -4
  12. package/dist/entra-certificate-auth.js +12 -8
  13. package/dist/entra-conditional-access.js +9 -4
  14. package/dist/entra-contacts.js +19 -12
  15. package/dist/entra-contracts.js +7 -4
  16. package/dist/entra-custom-security-attributes.js +19 -12
  17. package/dist/entra-data-policy-operations.js +7 -4
  18. package/dist/entra-delegated-admin.js +55 -6
  19. package/dist/entra-deleted-items.js +6 -4
  20. package/dist/entra-directory-objects.js +6 -4
  21. package/dist/entra-directory.js +19 -12
  22. package/dist/entra-domains.js +13 -8
  23. package/dist/entra-entitlement-management.js +12 -4
  24. package/dist/entra-group-pim.js +431 -0
  25. package/dist/entra-groups.js +13 -8
  26. package/dist/entra-lifecycle-workflows.js +136 -9
  27. package/dist/entra-organization.js +13 -8
  28. package/dist/entra-risk-prevention.js +436 -0
  29. package/dist/entra-risk.js +213 -5
  30. package/dist/entra-roles.js +10 -4
  31. package/dist/entra-subscriptions.js +6 -4
  32. package/dist/entra-users.js +7 -4
  33. package/dist/graph-session.js +29 -5
  34. package/dist/hook.js +84 -0
  35. package/dist/list-totals.js +52 -0
  36. package/dist/setup.js +5 -0
  37. package/docs/coverage.md +79 -13
  38. package/inventory/operations.json +2 -2
  39. package/package.json +4 -3
  40. package/skills/mg-axi/SKILL.md +56 -1
package/dist/catalogue.js CHANGED
@@ -99,6 +99,22 @@ const roleRead = {
99
99
  cursor: { value: "opaque-cursor", description: "Resume a capped collection losslessly; repeat the original query flags or omit them" },
100
100
  scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to the operation's least-privileged read scope" },
101
101
  };
102
+ const groupAssignmentRead = {
103
+ filter: { value: "odata-filter", description: "Required OData $filter with an eq clause on groupId or principalId scoping the list; unsupported combinations fail before credentials" },
104
+ select: { value: "comma-separated-properties", description: "Request server properties from the reviewed group PIM assignment set" },
105
+ fields: { value: "comma-separated-properties", description: "Project returned rows locally; every field must be fetched via the default or --select set" },
106
+ full: { description: "Show complete text values without truncation; never lifts redaction or row caps" },
107
+ cursor: { value: "opaque-cursor", description: "Resume a capped collection losslessly; repeat the original query flags or omit them" },
108
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to PrivilegedAssignmentSchedule.Read.AzureADGroup; delegated callers also need owner/member of the group or a supported directory role; PIM for Groups needs P2 or ID Governance" },
109
+ };
110
+ const groupEligibilityRead = {
111
+ filter: groupAssignmentRead.filter,
112
+ select: { value: "comma-separated-properties", description: "Request server properties from the reviewed group PIM eligibility set; request justification text rides only behind an explicit --select" },
113
+ fields: groupAssignmentRead.fields,
114
+ full: groupAssignmentRead.full,
115
+ cursor: groupAssignmentRead.cursor,
116
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to PrivilegedEligibilitySchedule.Read.AzureADGroup; delegated callers also need owner/member of the group or a supported directory role; PIM for Groups needs P2 or ID Governance" },
117
+ };
102
118
  const deviceRead = {
103
119
  filter: { value: "odata-filter", description: "OData $filter passed to Graph with ConsistencyLevel eventual; unsupported combinations fail before credentials" },
104
120
  select: { value: "comma-separated-properties", description: "Request server properties; directory-device reads need Device.Read.All" },
@@ -341,6 +357,29 @@ const dataPolicyRead = {
341
357
  cursor: { value: "opaque-cursor", description: "Resume a capped collection losslessly; repeat the original query flags or omit them" },
342
358
  scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to User.Export.All, User.Read.All" },
343
359
  };
360
+ const riskPreventionFraudRead = {
361
+ select: { value: "comma-separated-properties", description: "Request server properties from the reviewed fraud-protection-provider set; API keys, client secrets and other key material are never selectable; reads need delegated RiskPreventionProviders.Read.All plus a supported Entra role and refuse application profiles" },
362
+ fields: { value: "comma-separated-properties", description: "Project returned rows locally; every field must be fetched via the default or --select set" },
363
+ full: { description: "Show complete text values without truncation; never lifts redaction or row caps" },
364
+ cursor: { value: "opaque-cursor", description: "Resume a capped collection losslessly; repeat the original query flags or omit them" },
365
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to RiskPreventionProviders.Read.All" },
366
+ };
367
+ const riskPreventionWafRead = {
368
+ filter: { value: "odata-filter", description: "OData $filter passed to Graph as plain $filter with no $count or ConsistencyLevel contract; unsupported combinations fail before credentials" },
369
+ select: { value: "comma-separated-properties", description: "Request server properties from the reviewed WAF-provider set; API keys, client secrets and other key material are never selectable; reads need delegated RiskPreventionProviders.Read.All plus a supported Entra role and refuse application profiles" },
370
+ fields: { value: "comma-separated-properties", description: "Project returned rows locally; every field must be fetched via the default or --select set" },
371
+ full: { description: "Show complete text values without truncation; never lifts redaction or row caps" },
372
+ cursor: { value: "opaque-cursor", description: "Resume a capped collection losslessly; repeat the original query flags or omit them" },
373
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to RiskPreventionProviders.Read.All" },
374
+ };
375
+ const riskPreventionVerificationRead = {
376
+ filter: { value: "odata-filter", description: "OData $filter passed to Graph as plain $filter with no $count or ConsistencyLevel contract; unsupported combinations fail before credentials" },
377
+ select: { value: "comma-separated-properties", description: "Request server properties from the reviewed WAF-verification set; reads need delegated RiskPreventionProviders.Read.All plus a supported Entra role and refuse application profiles" },
378
+ fields: { value: "comma-separated-properties", description: "Project returned rows locally; every field must be fetched via the default or --select set" },
379
+ full: { description: "Show complete text values without truncation; never lifts redaction or row caps" },
380
+ cursor: { value: "opaque-cursor", description: "Resume a capped collection losslessly; repeat the original query flags or omit them" },
381
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to RiskPreventionProviders.Read.All" },
382
+ };
344
383
  const accessReviewRead = {
345
384
  filter: { value: "odata-filter", description: "OData $filter passed to Graph as plain $filter; on definitions only contains() over the scope query and eq on status are documented; unsupported combinations fail before credentials" },
346
385
  filterReviewer: { value: "odata-filter", description: "OData $filter passed to Graph as plain $filter with no $count or ConsistencyLevel; unsupported combinations fail before credentials" },
@@ -415,6 +454,25 @@ const lifecycleTaskReportSubRead = {
415
454
  full: lifecycleWorkflowRead.full,
416
455
  scopes: lifecycleReportsRead.scopes,
417
456
  };
457
+ const lifecycleRunReportsRead = {
458
+ workflow: { value: "workflow-id", required: true, description: "Parent lifecycle workflow ID owning the run" },
459
+ run: { value: "run-id", required: true, description: "Parent lifecycle workflow run ID owning the processing result" },
460
+ filter: lifecycleWorkflowRead.filter,
461
+ select: lifecycleReportsRead.select,
462
+ fields: lifecycleWorkflowRead.fields,
463
+ full: lifecycleWorkflowRead.full,
464
+ cursor: lifecycleWorkflowRead.cursor,
465
+ scopes: lifecycleReportsRead.scopes,
466
+ };
467
+ const lifecycleRunSubjectRead = {
468
+ workflow: { value: "workflow-id", required: true, description: "Parent lifecycle workflow ID owning the run" },
469
+ run: { value: "run-id", required: true, description: "Parent lifecycle workflow run ID owning the subject processing result" },
470
+ filter: lifecycleWorkflowRead.filter,
471
+ fields: lifecycleSubjectRead.fields,
472
+ full: lifecycleWorkflowRead.full,
473
+ cursor: lifecycleWorkflowRead.cursor,
474
+ scopes: lifecycleSubjectRead.scopes,
475
+ };
418
476
  export const LEAVES = [
419
477
  { path: "home", description: "Show local profile status without authenticating", flags: { profile: common.profile }, examples: ["mg-axi", "mg-axi home --profile soc"] },
420
478
  { path: "profile create", description: "Create a dedicated-app profile without signing in", flags: {
@@ -437,6 +495,7 @@ export const LEAVES = [
437
495
  scopes: { value: "comma-separated-Graph-scopes", required: true, description: "Explicit delegated permissions using full https://graph.microsoft.com/ scope names" },
438
496
  }, examples: ["mg-axi login --profile soc --scopes https://graph.microsoft.com/User.Read", "mg-axi login --profile soc --method device-code --scopes https://graph.microsoft.com/User.Read"] },
439
497
  { path: "setup", description: "Show installation, configuration and capability guidance without signing in or writing anything", flags: {}, examples: ["mg-axi setup", "mg-axi setup --help"] },
498
+ { path: "setup hooks", description: "Install or repair agent SessionStart hooks for mg-axi ambient context", flags: {}, examples: ["mg-axi setup hooks", "mg-axi setup hooks --help"] },
440
499
  { path: "doctor", description: "Check each selected profile with one bounded user-list read; never signs in interactively, installs nothing, enables no writes", flags: {
441
500
  profile: common.profile,
442
501
  }, examples: ["mg-axi doctor", "mg-axi doctor --profile soc", "mg-axi doctor --help"] },
@@ -593,6 +652,96 @@ export const LEAVES = [
593
652
  cursor: roleRead.cursor,
594
653
  scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to RoleAssignmentSchedule.Read.Directory; delegated callers also need a supported PIM read role; PIM needs P2 or ID Governance" },
595
654
  }, examples: ["mg-axi entra pim active list --profile soc", "mg-axi entra pim active list --profile soc --filter \"assignmentType eq 'Activated'\""] },
655
+ { path: "entra pim group-assignment-schedule list", description: "List PIM-for-Groups assignment schedules scoped to one group or principal (id, principalId, groupId, accessId, assignmentType); --filter on groupId or principalId is required", operation: "GET:/identityGovernance/privilegedAccess/group/assignmentSchedules", flags: {
656
+ ...common,
657
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
658
+ all: { description: "Follow pages within request, byte and deadline budgets" },
659
+ filter: { ...groupAssignmentRead.filter, required: true },
660
+ select: groupAssignmentRead.select,
661
+ fields: groupAssignmentRead.fields,
662
+ full: groupAssignmentRead.full,
663
+ cursor: groupAssignmentRead.cursor,
664
+ scopes: groupAssignmentRead.scopes,
665
+ }, examples: ["mg-axi entra pim group-assignment-schedule list --profile soc --filter \"groupId eq '<group-id>'\"", "mg-axi entra pim group-assignment-schedule list --profile soc --filter \"principalId eq '<principal-id>'\""] },
666
+ { path: "entra pim group-assignment-schedule show", description: "Show one PIM-for-Groups assignment schedule with the full reviewed property set", operation: "GET:/identityGovernance/privilegedAccess/group/assignmentSchedules/{privilegedAccessGroupAssignmentSchedule-id}", flags: {
667
+ ...common, id: { value: "assignment-schedule-id", required: true, description: "Assignment schedule ID" },
668
+ select: groupAssignmentRead.select,
669
+ fields: groupAssignmentRead.fields,
670
+ full: groupAssignmentRead.full,
671
+ scopes: groupAssignmentRead.scopes,
672
+ }, examples: ["mg-axi entra pim group-assignment-schedule show --id <assignment-schedule-id> --profile soc", "mg-axi entra pim group-assignment-schedule show --id <assignment-schedule-id> --profile soc --full"] },
673
+ { path: "entra pim group-assignment-instance list", description: "List provisioned PIM-for-Groups assignment windows scoped to one group or principal (id, principalId, groupId, accessId, assignmentType); --filter on groupId or principalId is required", operation: "GET:/identityGovernance/privilegedAccess/group/assignmentScheduleInstances", flags: {
674
+ ...common,
675
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
676
+ all: { description: "Follow pages within request, byte and deadline budgets" },
677
+ filter: { ...groupAssignmentRead.filter, required: true },
678
+ select: groupAssignmentRead.select,
679
+ fields: groupAssignmentRead.fields,
680
+ full: groupAssignmentRead.full,
681
+ cursor: groupAssignmentRead.cursor,
682
+ scopes: groupAssignmentRead.scopes,
683
+ }, examples: ["mg-axi entra pim group-assignment-instance list --profile soc --filter \"groupId eq '<group-id>'\"", "mg-axi entra pim group-assignment-instance list --profile soc --filter \"principalId eq '<principal-id>'\""] },
684
+ { path: "entra pim group-assignment-instance show", description: "Show one provisioned PIM-for-Groups assignment window with the full reviewed property set", operation: "GET:/identityGovernance/privilegedAccess/group/assignmentScheduleInstances/{privilegedAccessGroupAssignmentScheduleInstance-id}", flags: {
685
+ ...common, id: { value: "assignment-instance-id", required: true, description: "Assignment schedule instance ID" },
686
+ select: groupAssignmentRead.select,
687
+ fields: groupAssignmentRead.fields,
688
+ full: groupAssignmentRead.full,
689
+ scopes: groupAssignmentRead.scopes,
690
+ }, examples: ["mg-axi entra pim group-assignment-instance show --id <assignment-instance-id> --profile soc", "mg-axi entra pim group-assignment-instance show --id <assignment-instance-id> --profile soc --full"] },
691
+ { path: "entra pim group-eligibility-schedule list", description: "List PIM-for-Groups eligibility schedules scoped to one group or principal (id, principalId, groupId, accessId, memberType); --filter on groupId or principalId is required", operation: "GET:/identityGovernance/privilegedAccess/group/eligibilitySchedules", flags: {
692
+ ...common,
693
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
694
+ all: { description: "Follow pages within request, byte and deadline budgets" },
695
+ filter: { ...groupEligibilityRead.filter, required: true },
696
+ select: groupEligibilityRead.select,
697
+ fields: groupEligibilityRead.fields,
698
+ full: groupEligibilityRead.full,
699
+ cursor: groupEligibilityRead.cursor,
700
+ scopes: groupEligibilityRead.scopes,
701
+ }, examples: ["mg-axi entra pim group-eligibility-schedule list --profile soc --filter \"groupId eq '<group-id>'\"", "mg-axi entra pim group-eligibility-schedule list --profile soc --filter \"principalId eq '<principal-id>'\""] },
702
+ { path: "entra pim group-eligibility-schedule show", description: "Show one PIM-for-Groups eligibility schedule with the full reviewed property set", operation: "GET:/identityGovernance/privilegedAccess/group/eligibilitySchedules/{privilegedAccessGroupEligibilitySchedule-id}", flags: {
703
+ ...common, id: { value: "eligibility-schedule-id", required: true, description: "Eligibility schedule ID" },
704
+ select: groupEligibilityRead.select,
705
+ fields: groupEligibilityRead.fields,
706
+ full: groupEligibilityRead.full,
707
+ scopes: groupEligibilityRead.scopes,
708
+ }, examples: ["mg-axi entra pim group-eligibility-schedule show --id <eligibility-schedule-id> --profile soc", "mg-axi entra pim group-eligibility-schedule show --id <eligibility-schedule-id> --profile soc --full"] },
709
+ { path: "entra pim group-eligibility-instance list", description: "List provisioned PIM-for-Groups eligibility windows scoped to one group or principal (id, principalId, groupId, accessId, memberType); --filter on groupId or principalId is required", operation: "GET:/identityGovernance/privilegedAccess/group/eligibilityScheduleInstances", flags: {
710
+ ...common,
711
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
712
+ all: { description: "Follow pages within request, byte and deadline budgets" },
713
+ filter: { ...groupEligibilityRead.filter, required: true },
714
+ select: groupEligibilityRead.select,
715
+ fields: groupEligibilityRead.fields,
716
+ full: groupEligibilityRead.full,
717
+ cursor: groupEligibilityRead.cursor,
718
+ scopes: groupEligibilityRead.scopes,
719
+ }, examples: ["mg-axi entra pim group-eligibility-instance list --profile soc --filter \"groupId eq '<group-id>'\"", "mg-axi entra pim group-eligibility-instance list --profile soc --filter \"principalId eq '<principal-id>'\""] },
720
+ { path: "entra pim group-eligibility-instance show", description: "Show one provisioned PIM-for-Groups eligibility window with the full reviewed property set", operation: "GET:/identityGovernance/privilegedAccess/group/eligibilityScheduleInstances/{privilegedAccessGroupEligibilityScheduleInstance-id}", flags: {
721
+ ...common, id: { value: "eligibility-instance-id", required: true, description: "Eligibility schedule instance ID" },
722
+ select: groupEligibilityRead.select,
723
+ fields: groupEligibilityRead.fields,
724
+ full: groupEligibilityRead.full,
725
+ scopes: groupEligibilityRead.scopes,
726
+ }, examples: ["mg-axi entra pim group-eligibility-instance show --id <eligibility-instance-id> --profile soc", "mg-axi entra pim group-eligibility-instance show --id <eligibility-instance-id> --profile soc --full"] },
727
+ { path: "entra pim group-eligibility-request list", description: "List PIM-for-Groups eligibility requests scoped to one group or principal (id, action, status, principalId, groupId, accessId); justification text rides only behind an explicit --select; --filter on groupId or principalId is required", operation: "GET:/identityGovernance/privilegedAccess/group/eligibilityScheduleRequests", flags: {
728
+ ...common,
729
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
730
+ all: { description: "Follow pages within request, byte and deadline budgets" },
731
+ filter: { ...groupEligibilityRead.filter, required: true },
732
+ select: groupEligibilityRead.select,
733
+ fields: groupEligibilityRead.fields,
734
+ full: groupEligibilityRead.full,
735
+ cursor: groupEligibilityRead.cursor,
736
+ scopes: groupEligibilityRead.scopes,
737
+ }, examples: ["mg-axi entra pim group-eligibility-request list --profile soc --filter \"groupId eq '<group-id>'\"", "mg-axi entra pim group-eligibility-request list --profile soc --filter \"groupId eq '<group-id>'\" --select id,action,status,justification"] },
738
+ { path: "entra pim group-eligibility-request show", description: "Show one PIM-for-Groups eligibility request with the reviewed ask-plus-outcome set; justification text rides only behind an explicit --select", operation: "GET:/identityGovernance/privilegedAccess/group/eligibilityScheduleRequests/{privilegedAccessGroupEligibilityScheduleRequest-id}", flags: {
739
+ ...common, id: { value: "eligibility-request-id", required: true, description: "Eligibility schedule request ID" },
740
+ select: groupEligibilityRead.select,
741
+ fields: groupEligibilityRead.fields,
742
+ full: groupEligibilityRead.full,
743
+ scopes: groupEligibilityRead.scopes,
744
+ }, examples: ["mg-axi entra pim group-eligibility-request show --id <eligibility-request-id> --profile soc", "mg-axi entra pim group-eligibility-request show --id <eligibility-request-id> --profile soc --select id,action,status,justification --full"] },
596
745
  { path: "entra device list", description: "List directory devices with compact properties (id, displayName, operatingSystem, accountEnabled). Directory-device scope only; Intune managed devices are a separately authorized surface", operation: "GET:/devices", flags: {
597
746
  ...common,
598
747
  limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
@@ -1248,6 +1397,30 @@ export const LEAVES = [
1248
1397
  full: delegatedAdminQuerylessRead.full,
1249
1398
  scopes: delegatedAdminQuerylessRead.scopes,
1250
1399
  }, examples: ["mg-axi entra delegated-admin-customer show-service-management-detail --id <customer-id> --detail-id <detail-id> --profile soc"] },
1400
+ { path: "entra delegated-admin-customer count", description: "Count delegated-admin customers of the partner tenant as one scalar; the $count route takes no --filter, --select, --limit or --cursor", operation: "GET:/tenantRelationships/delegatedAdminCustomers/$count", flags: {
1401
+ ...common,
1402
+ scopes: delegatedAdminRead.scopes,
1403
+ }, examples: ["mg-axi entra delegated-admin-customer count --profile soc"] },
1404
+ { path: "entra delegated-admin-customer count-service-management-details", description: "Count one customer's service-management details as one scalar; the $count route takes no --filter, --select, --limit or --cursor", operation: "GET:/tenantRelationships/delegatedAdminCustomers/{delegatedAdminCustomer-id}/serviceManagementDetails/$count", flags: {
1405
+ ...common, id: { value: "customer-id", required: true, description: "Delegated-admin customer identifier" },
1406
+ scopes: delegatedAdminRead.scopes,
1407
+ }, examples: ["mg-axi entra delegated-admin-customer count-service-management-details --id <customer-id> --profile soc"] },
1408
+ { path: "entra delegated-admin-relationship count", description: "Count partner-tenant delegated-admin relationships as one scalar; the $count route takes no --filter, --select, --limit or --cursor", operation: "GET:/tenantRelationships/delegatedAdminRelationships/$count", flags: {
1409
+ ...common,
1410
+ scopes: delegatedAdminRead.scopes,
1411
+ }, examples: ["mg-axi entra delegated-admin-relationship count --profile soc"] },
1412
+ { path: "entra delegated-admin-relationship count-access-assignments", description: "Count one relationship's delegated-admin access assignments as one scalar; the $count route takes no --filter, --select, --limit or --cursor", operation: "GET:/tenantRelationships/delegatedAdminRelationships/{delegatedAdminRelationship-id}/accessAssignments/$count", flags: {
1413
+ ...common, id: { value: "relationship-id", required: true, description: "Delegated-admin relationship identifier" },
1414
+ scopes: delegatedAdminRead.scopes,
1415
+ }, examples: ["mg-axi entra delegated-admin-relationship count-access-assignments --id <relationship-id> --profile soc"] },
1416
+ { path: "entra delegated-admin-relationship count-operations", description: "Count one relationship's long-running delegated-admin operations as one scalar; the $count route takes no --filter, --select, --limit or --cursor", operation: "GET:/tenantRelationships/delegatedAdminRelationships/{delegatedAdminRelationship-id}/operations/$count", flags: {
1417
+ ...common, id: { value: "relationship-id", required: true, description: "Delegated-admin relationship identifier" },
1418
+ scopes: delegatedAdminRead.scopes,
1419
+ }, examples: ["mg-axi entra delegated-admin-relationship count-operations --id <relationship-id> --profile soc"] },
1420
+ { path: "entra delegated-admin-relationship count-requests", description: "Count one relationship's delegated-admin requests as one scalar; the $count route takes no --filter, --select, --limit or --cursor", operation: "GET:/tenantRelationships/delegatedAdminRelationships/{delegatedAdminRelationship-id}/requests/$count", flags: {
1421
+ ...common, id: { value: "relationship-id", required: true, description: "Delegated-admin relationship identifier" },
1422
+ scopes: delegatedAdminRead.scopes,
1423
+ }, examples: ["mg-axi entra delegated-admin-relationship count-requests --id <relationship-id> --profile soc"] },
1251
1424
  { path: "entra multi-tenant-organization show", description: "Show the tenant multitenant organization with the full reviewed property set (createdDateTime, description, displayName, id, state); at most one exists per tenant and state inactive means no membership", operation: "GET:/tenantRelationships/multiTenantOrganization", flags: {
1252
1425
  ...common,
1253
1426
  select: multiTenantOrganizationRead.select,
@@ -1448,6 +1621,65 @@ export const LEAVES = [
1448
1621
  full: riskRead.full,
1449
1622
  scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to IdentityRiskEvent.Read.All" },
1450
1623
  }, examples: ["mg-axi entra risk-detection show --id <risk-detection-id> --profile soc", "mg-axi entra risk-detection show --id <risk-detection-id> --profile soc --full"] },
1624
+ { path: "entra risky-service-principal list", description: "List at-risk service principals with compact risk state (IdentityRiskyServicePrincipal.Read.All; delegated callers also need Global Reader, Security Operator, Security Reader or Security Administrator; the riskyServicePrincipals API requires a Microsoft Entra Workload Identities Premium licence)", operation: "GET:/identityProtection/riskyServicePrincipals", flags: {
1625
+ ...common,
1626
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
1627
+ all: { description: "Follow pages within request, byte and deadline budgets" },
1628
+ filter: riskRead.filter,
1629
+ select: riskRead.select,
1630
+ fields: riskRead.fields,
1631
+ full: riskRead.full,
1632
+ cursor: riskRead.cursor,
1633
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to IdentityRiskyServicePrincipal.Read.All" },
1634
+ }, examples: ["mg-axi entra risky-service-principal list --profile soc", "mg-axi entra risky-service-principal list --profile soc --filter \"riskState eq 'atRisk'\" --limit 10", "mg-axi entra risky-service-principal list --profile soc --all"] },
1635
+ { path: "entra risky-service-principal show", description: "Show one at-risk service principal with the full reviewed property set and detection/history correlation guidance; this read never confirms compromise, dismisses or remediates risk", operation: "GET:/identityProtection/riskyServicePrincipals/{riskyServicePrincipal-id}", flags: {
1636
+ ...common, id: { value: "risky-service-principal-id", required: true, description: "Risky service principal object ID" },
1637
+ select: riskRead.select,
1638
+ fields: riskRead.fields,
1639
+ full: riskRead.full,
1640
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to IdentityRiskyServicePrincipal.Read.All" },
1641
+ }, examples: ["mg-axi entra risky-service-principal show --id <risky-service-principal-id> --profile soc", "mg-axi entra risky-service-principal show --id <risky-service-principal-id> --profile soc --full"] },
1642
+ { path: "entra risky-service-principal history list", description: "List one service principal's risk history with compact risk state (IdentityRiskyServicePrincipal.Read.All; same roles and Workload Identities Premium licence as the parent risky-service-principal read)", operation: "GET:/identityProtection/riskyServicePrincipals/{riskyServicePrincipal-id}/history", flags: {
1643
+ ...common,
1644
+ "service-principal": { value: "risky-service-principal-id", required: true, description: "Risky-service-principal object ID owning this history" },
1645
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
1646
+ all: { description: "Follow pages within request, byte and deadline budgets" },
1647
+ filter: riskRead.filter,
1648
+ select: riskRead.select,
1649
+ fields: riskRead.fields,
1650
+ full: riskRead.full,
1651
+ cursor: riskRead.cursor,
1652
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to IdentityRiskyServicePrincipal.Read.All" },
1653
+ }, examples: ["mg-axi entra risky-service-principal history list --service-principal <risky-service-principal-id> --profile soc"] },
1654
+ { path: "entra risky-service-principal history show", description: "Show one service-principal risk-history item with the full reviewed property set and detection correlation guidance", operation: "GET:/identityProtection/riskyServicePrincipals/{riskyServicePrincipal-id}/history/{riskyServicePrincipalHistoryItem-id}", flags: {
1655
+ ...common,
1656
+ "service-principal": { value: "risky-service-principal-id", required: true, description: "Risky-service-principal object ID owning this history" },
1657
+ id: { value: "history-item-id", required: true, description: "Risk-history item object ID" },
1658
+ select: riskRead.select,
1659
+ fields: riskRead.fields,
1660
+ full: riskRead.full,
1661
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to IdentityRiskyServicePrincipal.Read.All" },
1662
+ }, examples: ["mg-axi entra risky-service-principal history show --service-principal <risky-service-principal-id> --id <history-item-id> --profile soc"] },
1663
+ { path: "entra service-principal-risk-detection list", description: "List service-principal risk detections in a bounded time window (IdentityRiskEvent.Read.All; delegated callers also need Global Reader, Security Operator, Security Reader or Security Administrator; Workload Identities Premium, with riskDetail and riskLevel hidden without it)", operation: "GET:/identityProtection/servicePrincipalRiskDetections", flags: {
1664
+ ...common,
1665
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
1666
+ all: { description: "Follow pages within request, byte and deadline budgets" },
1667
+ since: { ...logRead.since, description: "Required for a new query (resume with --cursor instead): earliest detectedDateTime bounding the server time range" },
1668
+ until: logRead.until,
1669
+ filter: logRead.filter,
1670
+ select: riskRead.select,
1671
+ fields: riskRead.fields,
1672
+ full: riskRead.full,
1673
+ cursor: riskRead.cursor,
1674
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to IdentityRiskEvent.Read.All" },
1675
+ }, examples: ["mg-axi entra service-principal-risk-detection list --profile soc --since 2026-09-01T00:00:00Z", "mg-axi entra service-principal-risk-detection list --profile soc --since 2026-09-01T00:00:00Z --filter \"riskState eq 'atRisk'\" --limit 10", "mg-axi entra service-principal-risk-detection list --profile soc --since 2026-09-01T00:00:00Z --all"] },
1676
+ { path: "entra service-principal-risk-detection show", description: "Show one service-principal risk detection with the full reviewed property set; a null correlationId means no sign-in is associated", operation: "GET:/identityProtection/servicePrincipalRiskDetections/{servicePrincipalRiskDetection-id}", flags: {
1677
+ ...common, id: { value: "service-principal-risk-detection-id", required: true, description: "Service-principal risk detection object ID" },
1678
+ select: riskRead.select,
1679
+ fields: riskRead.fields,
1680
+ full: riskRead.full,
1681
+ scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit Graph scopes using full https://graph.microsoft.com/ names; defaults to IdentityRiskEvent.Read.All" },
1682
+ }, examples: ["mg-axi entra service-principal-risk-detection show --id <service-principal-risk-detection-id> --profile soc", "mg-axi entra service-principal-risk-detection show --id <service-principal-risk-detection-id> --profile soc --full"] },
1451
1683
  { path: "entra conditional-access policy list", description: "List Conditional Access policies with compact properties (id, displayName, state)", operation: "GET:/identity/conditionalAccess/policies", flags: {
1452
1684
  ...common,
1453
1685
  limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
@@ -1648,6 +1880,78 @@ export const LEAVES = [
1648
1880
  ...common,
1649
1881
  scopes: dataPolicyRead.scopes,
1650
1882
  }, examples: ["mg-axi entra data-policy-operation count --profile soc"] },
1883
+ { path: "entra fraud-protection-provider list", description: "List workforce fraud-protection providers with compact properties (id, displayName); rows carry @odata.type naming the provider kind; API keys, client secrets and other key material are never returned; Graph documents $select only, so no --filter", operation: "GET:/identity/riskPrevention/fraudProtectionProviders", flags: {
1884
+ ...common,
1885
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
1886
+ all: { description: "Follow pages within request, byte and deadline budgets" },
1887
+ select: riskPreventionFraudRead.select,
1888
+ fields: riskPreventionFraudRead.fields,
1889
+ full: riskPreventionFraudRead.full,
1890
+ cursor: riskPreventionFraudRead.cursor,
1891
+ scopes: riskPreventionFraudRead.scopes,
1892
+ }, examples: ["mg-axi entra fraud-protection-provider list --profile soc", "mg-axi entra fraud-protection-provider list --profile soc --limit 10"] },
1893
+ { path: "entra fraud-protection-provider show", description: "Show one workforce fraud-protection provider with the full reviewed property set; API keys, client secrets and other key material are never returned", operation: "GET:/identity/riskPrevention/fraudProtectionProviders/{fraudProtectionProvider-id}", flags: {
1894
+ ...common, id: { value: "provider-id", required: true, description: "Fraud-protection-provider ID" },
1895
+ select: riskPreventionFraudRead.select,
1896
+ fields: riskPreventionFraudRead.fields,
1897
+ full: riskPreventionFraudRead.full,
1898
+ scopes: riskPreventionFraudRead.scopes,
1899
+ }, examples: ["mg-axi entra fraud-protection-provider show --id <provider-id> --profile soc", "mg-axi entra fraud-protection-provider show --id <provider-id> --profile soc --full"] },
1900
+ { path: "entra fraud-protection-provider count", description: "Count workforce fraud-protection providers as a scalar number; the $count route takes no --filter, --select, --limit or --cursor", operation: "GET:/identity/riskPrevention/fraudProtectionProviders/$count", flags: {
1901
+ ...common,
1902
+ scopes: riskPreventionFraudRead.scopes,
1903
+ }, examples: ["mg-axi entra fraud-protection-provider count --profile soc"] },
1904
+ { path: "entra web-application-firewall-provider list", description: "List workforce web-application-firewall providers with compact properties (id, displayName); rows carry @odata.type naming the provider kind; API keys, client secrets and other key material are never returned", operation: "GET:/identity/riskPrevention/webApplicationFirewallProviders", flags: {
1905
+ ...common,
1906
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
1907
+ all: { description: "Follow pages within request, byte and deadline budgets" },
1908
+ filter: riskPreventionWafRead.filter,
1909
+ select: riskPreventionWafRead.select,
1910
+ fields: riskPreventionWafRead.fields,
1911
+ full: riskPreventionWafRead.full,
1912
+ cursor: riskPreventionWafRead.cursor,
1913
+ scopes: riskPreventionWafRead.scopes,
1914
+ }, examples: ["mg-axi entra web-application-firewall-provider list --profile soc", "mg-axi entra web-application-firewall-provider list --profile soc --limit 10", "mg-axi entra web-application-firewall-provider list --profile soc --filter \"displayName eq 'Example'\""] },
1915
+ { path: "entra web-application-firewall-provider show", description: "Show one workforce web-application-firewall provider with the full reviewed property set; API keys, client secrets and other key material are never returned", operation: "GET:/identity/riskPrevention/webApplicationFirewallProviders/{webApplicationFirewallProvider-id}", flags: {
1916
+ ...common, id: { value: "provider-id", required: true, description: "Web-application-firewall-provider ID" },
1917
+ select: riskPreventionWafRead.select,
1918
+ fields: riskPreventionWafRead.fields,
1919
+ full: riskPreventionWafRead.full,
1920
+ scopes: riskPreventionWafRead.scopes,
1921
+ }, examples: ["mg-axi entra web-application-firewall-provider show --id <provider-id> --profile soc", "mg-axi entra web-application-firewall-provider show --id <provider-id> --profile soc --full"] },
1922
+ { path: "entra web-application-firewall-provider count", description: "Count workforce web-application-firewall providers as a scalar number; the $count route takes no --filter, --select, --limit or --cursor", operation: "GET:/identity/riskPrevention/webApplicationFirewallProviders/$count", flags: {
1923
+ ...common,
1924
+ scopes: riskPreventionWafRead.scopes,
1925
+ }, examples: ["mg-axi entra web-application-firewall-provider count --profile soc"] },
1926
+ { path: "entra web-application-firewall-verification list", description: "List workforce web-application-firewall verifications with compact properties (id, verifiedHost, providerType); rows never carry provider detail, which has its own sub-read", operation: "GET:/identity/riskPrevention/webApplicationFirewallVerifications", flags: {
1927
+ ...common,
1928
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
1929
+ all: { description: "Follow pages within request, byte and deadline budgets" },
1930
+ filter: riskPreventionVerificationRead.filter,
1931
+ select: riskPreventionVerificationRead.select,
1932
+ fields: riskPreventionVerificationRead.fields,
1933
+ full: riskPreventionVerificationRead.full,
1934
+ cursor: riskPreventionVerificationRead.cursor,
1935
+ scopes: riskPreventionVerificationRead.scopes,
1936
+ }, examples: ["mg-axi entra web-application-firewall-verification list --profile soc", "mg-axi entra web-application-firewall-verification list --profile soc --limit 10", "mg-axi entra web-application-firewall-verification list --profile soc --filter \"providerType eq 'cloudflare'\""] },
1937
+ { path: "entra web-application-firewall-verification show", description: "Show one workforce web-application-firewall verification with the full reviewed property set; the row never carries provider detail, which has its own sub-read", operation: "GET:/identity/riskPrevention/webApplicationFirewallVerifications/{webApplicationFirewallVerificationModel-id}", flags: {
1938
+ ...common, id: { value: "verification-id", required: true, description: "Web-application-firewall-verification ID" },
1939
+ select: riskPreventionVerificationRead.select,
1940
+ fields: riskPreventionVerificationRead.fields,
1941
+ full: riskPreventionVerificationRead.full,
1942
+ scopes: riskPreventionVerificationRead.scopes,
1943
+ }, examples: ["mg-axi entra web-application-firewall-verification show --id <verification-id> --profile soc", "mg-axi entra web-application-firewall-verification show --id <verification-id> --profile soc --full"] },
1944
+ { path: "entra web-application-firewall-verification count", description: "Count workforce web-application-firewall verifications as a scalar number; the $count route takes no --filter, --select, --limit or --cursor", operation: "GET:/identity/riskPrevention/webApplicationFirewallVerifications/$count", flags: {
1945
+ ...common,
1946
+ scopes: riskPreventionVerificationRead.scopes,
1947
+ }, examples: ["mg-axi entra web-application-firewall-verification count --profile soc"] },
1948
+ { path: "entra web-application-firewall-verification provider show", description: "Show the web-application-firewall provider behind one verification with the full reviewed provider set; API keys, client secrets and other key material are never returned", operation: "GET:/identity/riskPrevention/webApplicationFirewallVerifications/{webApplicationFirewallVerificationModel-id}/provider", flags: {
1949
+ ...common, id: { value: "verification-id", required: true, description: "Web-application-firewall-verification ID owning the provider" },
1950
+ select: riskPreventionWafRead.select,
1951
+ fields: riskPreventionWafRead.fields,
1952
+ full: riskPreventionWafRead.full,
1953
+ scopes: riskPreventionWafRead.scopes,
1954
+ }, examples: ["mg-axi entra web-application-firewall-verification provider show --id <verification-id> --profile soc"] },
1651
1955
  { path: "entra access-review definition list", description: "List access-review definitions with compact properties (id, displayName, status); definitions are review schedules (a series), never their occurrences", operation: "GET:/identityGovernance/accessReviews/definitions", flags: {
1652
1956
  ...common,
1653
1957
  limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
@@ -2084,14 +2388,98 @@ export const LEAVES = [
2084
2388
  full: lifecycleTaskReportSubRead.full,
2085
2389
  scopes: lifecycleTaskReportSubRead.scopes,
2086
2390
  }, examples: ["mg-axi entra lifecycle task-report task-definition show --workflow <workflow-id> --report <report-id> --profile soc"] },
2087
- { path: "api get", description: "Reviewed read-only raw Graph GET (API-01, v1.0 only): users, groups, conditional access, authentication methods, audit/sign-in, risk, apps, roles/PIM, devices, administrative units, domains, domain DNS records, identity providers, organizations, branding, access reviews, entitlement catalogs and access packages, lifecycle workflows, workflow templates, task definitions, lifecycle settings, workflow runs, user/subject processing results and task reports, and partner contracts; unreviewed, secret-value, mail/file-content, beta and write routes are refused before credentials", positional: { name: "path", description: "Server-relative Graph path, e.g. /users" }, flags: {
2391
+ { path: "entra lifecycle run user-processing-result list", description: "List user processing results of one lifecycle workflow run with minimal personal-data properties (id, processingStatus, task counts); the subject link is never requested", operation: "GET:/identityGovernance/lifecycleWorkflows/workflows/{workflow-id}/runs/{run-id}/userProcessingResults", flags: {
2392
+ ...common,
2393
+ workflow: lifecycleRunReportsRead.workflow,
2394
+ run: lifecycleRunReportsRead.run,
2395
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
2396
+ all: { description: "Follow pages within request, byte and deadline budgets" },
2397
+ filter: lifecycleRunReportsRead.filter,
2398
+ select: lifecycleRunReportsRead.select,
2399
+ fields: lifecycleRunReportsRead.fields,
2400
+ full: lifecycleRunReportsRead.full,
2401
+ cursor: lifecycleRunReportsRead.cursor,
2402
+ scopes: lifecycleRunReportsRead.scopes,
2403
+ }, examples: ["mg-axi entra lifecycle run user-processing-result list --workflow <workflow-id> --run <run-id> --profile soc", "mg-axi entra lifecycle run user-processing-result list --workflow <workflow-id> --run <run-id> --profile soc --limit 10"] },
2404
+ { path: "entra lifecycle run user-processing-result show", description: "Show one run user processing result with minimal personal-data properties; the subject link stays out", operation: "GET:/identityGovernance/lifecycleWorkflows/workflows/{workflow-id}/runs/{run-id}/userProcessingResults/{userProcessingResult-id}", flags: {
2405
+ ...common,
2406
+ workflow: lifecycleRunReportsRead.workflow,
2407
+ run: lifecycleRunReportsRead.run,
2408
+ id: { value: "user-processing-result-id", required: true, description: "User processing result ID" },
2409
+ select: lifecycleRunReportsRead.select,
2410
+ fields: lifecycleRunReportsRead.fields,
2411
+ full: lifecycleRunReportsRead.full,
2412
+ scopes: lifecycleRunReportsRead.scopes,
2413
+ }, examples: ["mg-axi entra lifecycle run user-processing-result show --workflow <workflow-id> --run <run-id> --id <result-id> --profile soc"] },
2414
+ { path: "entra lifecycle run user-processing-result count", description: "Count user processing results of one lifecycle workflow run as a scalar number; the $count route takes no --filter, --select, --limit or --cursor", operation: "GET:/identityGovernance/lifecycleWorkflows/workflows/{workflow-id}/runs/{run-id}/userProcessingResults/$count", flags: {
2415
+ ...common,
2416
+ workflow: lifecycleRunReportsRead.workflow,
2417
+ run: lifecycleRunReportsRead.run,
2418
+ scopes: lifecycleRunReportsRead.scopes,
2419
+ }, examples: ["mg-axi entra lifecycle run user-processing-result count --workflow <workflow-id> --run <run-id> --profile soc"] },
2420
+ { path: "entra lifecycle run subject-processing-result list", description: "List subject processing results of one lifecycle workflow run with minimal personal-data properties; Graph documents no $select here so rows always arrive whole", operation: "GET:/identityGovernance/lifecycleWorkflows/workflows/{workflow-id}/runs/{run-id}/subjectProcessingResults", flags: {
2421
+ ...common,
2422
+ workflow: lifecycleRunSubjectRead.workflow,
2423
+ run: lifecycleRunSubjectRead.run,
2424
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
2425
+ all: { description: "Follow pages within request, byte and deadline budgets" },
2426
+ filter: lifecycleRunSubjectRead.filter,
2427
+ fields: lifecycleRunSubjectRead.fields,
2428
+ full: lifecycleRunSubjectRead.full,
2429
+ cursor: lifecycleRunSubjectRead.cursor,
2430
+ scopes: lifecycleRunSubjectRead.scopes,
2431
+ }, examples: ["mg-axi entra lifecycle run subject-processing-result list --workflow <workflow-id> --run <run-id> --profile soc", "mg-axi entra lifecycle run subject-processing-result list --workflow <workflow-id> --run <run-id> --profile soc --limit 10"] },
2432
+ { path: "entra lifecycle run subject-processing-result show", description: "Show one run subject processing result with minimal personal-data properties; the get documents $expand only so the row always arrives whole and the subject navigation stays out", operation: "GET:/identityGovernance/lifecycleWorkflows/workflows/{workflow-id}/runs/{run-id}/subjectProcessingResults/{subjectProcessingResult-id}", flags: {
2433
+ ...common,
2434
+ workflow: lifecycleRunSubjectRead.workflow,
2435
+ run: lifecycleRunSubjectRead.run,
2436
+ id: { value: "subject-processing-result-id", required: true, description: "Subject processing result ID" },
2437
+ fields: lifecycleRunSubjectRead.fields,
2438
+ full: lifecycleRunSubjectRead.full,
2439
+ scopes: lifecycleRunSubjectRead.scopes,
2440
+ }, examples: ["mg-axi entra lifecycle run subject-processing-result show --workflow <workflow-id> --run <run-id> --id <result-id> --profile soc"] },
2441
+ { path: "entra lifecycle run subject-processing-result count", description: "Count subject processing results of one lifecycle workflow run as a scalar number; the $count route takes no --filter, --select, --limit or --cursor", operation: "GET:/identityGovernance/lifecycleWorkflows/workflows/{workflow-id}/runs/{run-id}/subjectProcessingResults/$count", flags: {
2442
+ ...common,
2443
+ workflow: lifecycleRunSubjectRead.workflow,
2444
+ run: lifecycleRunSubjectRead.run,
2445
+ scopes: lifecycleRunSubjectRead.scopes,
2446
+ }, examples: ["mg-axi entra lifecycle run subject-processing-result count --workflow <workflow-id> --run <run-id> --profile soc"] },
2447
+ { path: "entra lifecycle run task-processing-result list", description: "List task processing results of one lifecycle workflow run with compact properties (id, processingStatus, failureReason); rows never carry subject, task or workflowSubject detail", operation: "GET:/identityGovernance/lifecycleWorkflows/workflows/{workflow-id}/runs/{run-id}/taskProcessingResults", flags: {
2448
+ ...common,
2449
+ workflow: lifecycleRunReportsRead.workflow,
2450
+ run: lifecycleRunReportsRead.run,
2451
+ limit: { value: "positive-integer", default: "100", description: "Cap returned rows; the remainder is buffered into an opaque cursor, never discarded; incompatible with --all" },
2452
+ all: { description: "Follow pages within request, byte and deadline budgets" },
2453
+ filter: lifecycleRunReportsRead.filter,
2454
+ select: lifecycleRunReportsRead.select,
2455
+ fields: lifecycleRunReportsRead.fields,
2456
+ full: lifecycleRunReportsRead.full,
2457
+ cursor: lifecycleRunReportsRead.cursor,
2458
+ scopes: lifecycleRunReportsRead.scopes,
2459
+ }, examples: ["mg-axi entra lifecycle run task-processing-result list --workflow <workflow-id> --run <run-id> --profile soc", "mg-axi entra lifecycle run task-processing-result list --workflow <workflow-id> --run <run-id> --profile soc --limit 10"] },
2460
+ { path: "entra lifecycle run task-processing-result show", description: "Show one run task processing result with the full reviewed scalar set including failure detail; Graph documents no query parameters here so the row always arrives whole and subject, task and workflowSubject detail belongs to later slices", operation: "GET:/identityGovernance/lifecycleWorkflows/workflows/{workflow-id}/runs/{run-id}/taskProcessingResults/{taskProcessingResult-id}", flags: {
2461
+ ...common,
2462
+ workflow: lifecycleRunReportsRead.workflow,
2463
+ run: lifecycleRunReportsRead.run,
2464
+ id: { value: "task-processing-result-id", required: true, description: "Task processing result ID" },
2465
+ fields: lifecycleRunReportsRead.fields,
2466
+ full: lifecycleRunReportsRead.full,
2467
+ scopes: lifecycleRunReportsRead.scopes,
2468
+ }, examples: ["mg-axi entra lifecycle run task-processing-result show --workflow <workflow-id> --run <run-id> --id <result-id> --profile soc"] },
2469
+ { path: "entra lifecycle run task-processing-result count", description: "Count task processing results of one lifecycle workflow run as a scalar number; the $count route takes no --filter, --select, --limit or --cursor", operation: "GET:/identityGovernance/lifecycleWorkflows/workflows/{workflow-id}/runs/{run-id}/taskProcessingResults/$count", flags: {
2470
+ ...common,
2471
+ workflow: lifecycleRunReportsRead.workflow,
2472
+ run: lifecycleRunReportsRead.run,
2473
+ scopes: lifecycleRunReportsRead.scopes,
2474
+ }, examples: ["mg-axi entra lifecycle run task-processing-result count --workflow <workflow-id> --run <run-id> --profile soc"] },
2475
+ { path: "api get", description: "Reviewed read-only raw Graph GET (API-01, v1.0 only): users, groups, conditional access, authentication methods, audit/sign-in, risk, apps, roles/PIM, devices, administrative units, domains, domain DNS records, identity providers, organizations, branding, access reviews, entitlement catalogs and access packages, lifecycle workflows, workflow templates, task definitions, lifecycle settings, workflow runs, user/subject processing results, task reports and run user/subject/task processing results, and partner contracts; unreviewed, secret-value, mail/file-content, beta and write routes are refused before credentials", positional: { name: "path", description: "Server-relative Graph path, e.g. /users" }, flags: {
2088
2476
  ...common,
2089
2477
  odata: { value: "k=v&k2=v2", description: "OData query reviewed per route ($select/$filter/$top/$orderby on collections; $select on singles); defaults to reviewed fields" },
2090
2478
  cursor: { value: "token|-", description: "Resume a partial collection; - reads the token from stdin (16 MB ceiling for either input); use the same path, profile and scopes, and omit --odata to reuse its query" },
2091
2479
  scopes: { value: "comma-separated-Graph-scopes", description: "Delegated only: explicit full https://graph.microsoft.com/ scope names; application profiles use the .default audience" },
2092
2480
  limit: { value: "positive-integer", default: "100", description: "Cap returned rows; use --all to follow pages within budget" },
2093
2481
  all: { description: "Follow @odata.nextLink pages within the request budget" },
2094
- full: { description: "Disable 4000-character string truncation; never disables redaction or row caps" },
2482
+ full: { description: "Disable 500-character string truncation; never disables redaction or row caps" },
2095
2483
  }, examples: ["mg-axi api get /users --scopes https://graph.microsoft.com/User.Read.All", "mg-axi api get /groups --odata '$filter=securityEnabled eq true&$top=5' --scopes https://graph.microsoft.com/GroupMember.Read.All", "mg-axi api get /users --cursor - --all --scopes https://graph.microsoft.com/User.Read.All < cursor.txt"] },
2096
2484
  ];
2097
2485
  export function leafHelp(leaf) {