@lamalibre/create-lamaste 4.4.1 → 4.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/package.json +2 -2
  2. package/scripts/lamaste-priv +200 -16
  3. package/src/index.js +1 -0
  4. package/src/lib/backend-cookie.js +65 -0
  5. package/src/lib/ip-panel-vhost.js +208 -0
  6. package/src/lib/service-config.js +5 -3
  7. package/src/tasks/nginx.js +18 -135
  8. package/src/tasks/redeploy.js +39 -1
  9. package/vendor/docs/00-introduction/how-it-works.md +2 -2
  10. package/vendor/docs/00-introduction/quickstart.md +5 -5
  11. package/vendor/docs/00-introduction/what-is-lamaste.md +5 -5
  12. package/vendor/docs/01-concepts/authentication.md +1 -1
  13. package/vendor/docs/01-concepts/authorization.md +66 -48
  14. package/vendor/docs/01-concepts/certificates.md +3 -3
  15. package/vendor/docs/01-concepts/mtls.md +2 -2
  16. package/vendor/docs/01-concepts/security-model.md +70 -33
  17. package/vendor/docs/01-concepts/tickets.md +2 -2
  18. package/vendor/docs/01-concepts/tunneling.md +4 -4
  19. package/vendor/docs/02-guides/agent-setup.md +5 -5
  20. package/vendor/docs/02-guides/certificate-management.md +2 -2
  21. package/vendor/docs/02-guides/cloud-provisioning.md +3 -3
  22. package/vendor/docs/02-guides/desktop-app-setup.md +10 -10
  23. package/vendor/docs/02-guides/installation.md +3 -3
  24. package/vendor/docs/02-guides/managing-users.md +113 -25
  25. package/vendor/docs/02-guides/onboarding.md +2 -2
  26. package/vendor/docs/02-guides/standalone-plugin-with-tickets.md +2 -2
  27. package/vendor/docs/03-architecture/installer-flow.md +2 -2
  28. package/vendor/docs/03-architecture/installer.md +4 -4
  29. package/vendor/docs/03-architecture/management-flow.md +3 -1
  30. package/vendor/docs/03-architecture/nginx-configuration.md +165 -18
  31. package/vendor/docs/03-architecture/overview.md +13 -17
  32. package/vendor/docs/03-architecture/panel-client.md +6 -6
  33. package/vendor/docs/03-architecture/panel-server.md +3 -2
  34. package/vendor/docs/03-architecture/state-management.md +4 -8
  35. package/vendor/docs/03-architecture/system-overview.md +1 -1
  36. package/vendor/docs/04-api-reference/agent-hosted-plugins.md +291 -22
  37. package/vendor/docs/04-api-reference/app-host.md +3 -3
  38. package/vendor/docs/04-api-reference/gatekeeper.md +60 -5
  39. package/vendor/docs/04-api-reference/lifecycle-hooks.md +14 -12
  40. package/vendor/docs/04-api-reference/onboarding.md +1 -1
  41. package/vendor/docs/04-api-reference/registry-and-oidc.md +3 -3
  42. package/vendor/docs/04-api-reference/tunnels.md +67 -29
  43. package/vendor/docs/04-api-reference/users.md +241 -45
  44. package/vendor/docs/05-operations/backup-and-restore.md +35 -26
  45. package/vendor/docs/05-operations/monitoring.md +39 -0
  46. package/vendor/docs/05-operations/uninstalling.md +2 -1
  47. package/vendor/docs/05-operations/upgrades.md +15 -6
  48. package/vendor/docs/06-reference/config-files.md +82 -188
  49. package/vendor/docs/06-reference/glossary.md +3 -3
  50. package/vendor/docs/06-reference/installer-flags.md +13 -13
  51. package/vendor/docs/06-reference/ports-and-services.md +25 -26
  52. package/vendor/docs/06-reference/troubleshooting.md +8 -8
  53. package/vendor/docs/gatekeeper-design.md +10 -8
  54. package/vendor/docs/identity-directory-design.md +48 -14
  55. package/vendor/docs/package.json +1 -1
  56. package/vendor/docs/todo/lib-cli-desktop-refactor.md +27 -27
  57. package/vendor/gatekeeper/dist/index.d.ts +2 -1
  58. package/vendor/gatekeeper/dist/index.d.ts.map +1 -1
  59. package/vendor/gatekeeper/dist/index.js +2 -0
  60. package/vendor/gatekeeper/dist/index.js.map +1 -1
  61. package/vendor/gatekeeper/dist/lib/grants.d.ts +6 -0
  62. package/vendor/gatekeeper/dist/lib/grants.d.ts.map +1 -1
  63. package/vendor/gatekeeper/dist/lib/grants.js +6 -1
  64. package/vendor/gatekeeper/dist/lib/grants.js.map +1 -1
  65. package/vendor/gatekeeper/dist/lib/groups.d.ts +5 -0
  66. package/vendor/gatekeeper/dist/lib/groups.d.ts.map +1 -1
  67. package/vendor/gatekeeper/dist/lib/groups.js +5 -1
  68. package/vendor/gatekeeper/dist/lib/groups.js.map +1 -1
  69. package/vendor/gatekeeper/dist/lib/principals.d.ts +29 -0
  70. package/vendor/gatekeeper/dist/lib/principals.d.ts.map +1 -0
  71. package/vendor/gatekeeper/dist/lib/principals.js +67 -0
  72. package/vendor/gatekeeper/dist/lib/principals.js.map +1 -0
  73. package/vendor/gatekeeper/dist/lib/tunnels.d.ts +13 -0
  74. package/vendor/gatekeeper/dist/lib/tunnels.d.ts.map +1 -0
  75. package/vendor/gatekeeper/dist/lib/tunnels.js +68 -0
  76. package/vendor/gatekeeper/dist/lib/tunnels.js.map +1 -0
  77. package/vendor/gatekeeper/dist/lib/types.d.ts +19 -0
  78. package/vendor/gatekeeper/dist/lib/types.d.ts.map +1 -1
  79. package/vendor/gatekeeper/dist/server/index.d.ts.map +1 -1
  80. package/vendor/gatekeeper/dist/server/index.js +22 -48
  81. package/vendor/gatekeeper/dist/server/index.js.map +1 -1
  82. package/vendor/gatekeeper/dist/server/routes/authz.d.ts +15 -1
  83. package/vendor/gatekeeper/dist/server/routes/authz.d.ts.map +1 -1
  84. package/vendor/gatekeeper/dist/server/routes/authz.js +250 -103
  85. package/vendor/gatekeeper/dist/server/routes/authz.js.map +1 -1
  86. package/vendor/gatekeeper/dist/server/routes/diagnostic.d.ts.map +1 -1
  87. package/vendor/gatekeeper/dist/server/routes/diagnostic.js +61 -4
  88. package/vendor/gatekeeper/dist/server/routes/diagnostic.js.map +1 -1
  89. package/vendor/gatekeeper/dist/server/routes/principals.d.ts +3 -0
  90. package/vendor/gatekeeper/dist/server/routes/principals.d.ts.map +1 -0
  91. package/vendor/gatekeeper/dist/server/routes/principals.js +27 -0
  92. package/vendor/gatekeeper/dist/server/routes/principals.js.map +1 -0
  93. package/vendor/gatekeeper/package.json +2 -2
  94. package/vendor/server/bin/lamaste-server.js +15 -1
  95. package/vendor/server/package.json +2 -2
  96. package/vendor/server/src/commands/plugin-identity.js +335 -0
  97. package/vendor/server/src/commands/plugins.js +99 -11
  98. package/vendor/server/src/commands/registry-credential.js +2 -1
  99. package/vendor/server/src/commands/tunnels.js +102 -2
  100. package/vendor/server/src/commands/uninstall.js +3 -1
  101. package/vendor/server/src/commands/users.js +358 -0
  102. package/vendor/server/src/plugin-approval.js +107 -5
  103. package/vendor/server/src/plugin-identity.js +382 -0
  104. package/vendor/server-ui/dist/assets/index-D-fer5ef.css +1 -0
  105. package/vendor/server-ui/dist/assets/index-DSaDPJaw.js +84 -0
  106. package/vendor/server-ui/dist/index.html +2 -2
  107. package/vendor/serverd/package.json +2 -2
  108. package/vendor/serverd/src/index.js +25 -1
  109. package/vendor/serverd/src/lib/audience.js +576 -0
  110. package/vendor/serverd/src/lib/authelia.js +78 -7
  111. package/vendor/serverd/src/lib/config.js +68 -43
  112. package/vendor/serverd/src/lib/directory.js +1113 -0
  113. package/vendor/serverd/src/lib/entitlements.js +517 -0
  114. package/vendor/serverd/src/lib/gatekeeper-client.js +215 -10
  115. package/vendor/serverd/src/lib/hook-pipelines.js +13 -0
  116. package/vendor/serverd/src/lib/identity-sync.js +905 -0
  117. package/vendor/serverd/src/lib/migrations/state/0013_identity_directory.sql +158 -0
  118. package/vendor/serverd/src/lib/migrations/state/0014_identity_ledger.sql +20 -0
  119. package/vendor/serverd/src/lib/mtls.js +6 -2
  120. package/vendor/serverd/src/lib/nginx.js +279 -48
  121. package/vendor/serverd/src/lib/plugin-hooks.js +98 -45
  122. package/vendor/serverd/src/lib/plugin-hosting.js +33 -5
  123. package/vendor/serverd/src/lib/plugin-lifecycle.js +100 -9
  124. package/vendor/serverd/src/lib/plugins.js +59 -4
  125. package/vendor/serverd/src/lib/registry-credential.js +9 -6
  126. package/vendor/serverd/src/lib/request-logging.js +19 -0
  127. package/vendor/serverd/src/lib/retained-data.js +50 -4
  128. package/vendor/serverd/src/lib/state.js +18 -0
  129. package/vendor/serverd/src/lib/tunnel-hooks.js +4 -1
  130. package/vendor/serverd/src/lib/user-access-session.js +21 -11
  131. package/vendor/serverd/src/lib/user-caller.js +67 -0
  132. package/vendor/serverd/src/lib/user-surface.js +733 -0
  133. package/vendor/serverd/src/lib/vhost-reconcile.js +136 -34
  134. package/vendor/serverd/src/middleware/user-access-session.js +9 -0
  135. package/vendor/serverd/src/routes/agent-forwarder.js +4 -2
  136. package/vendor/serverd/src/routes/invite.js +53 -12
  137. package/vendor/serverd/src/routes/management/gatekeeper-proxy.js +107 -16
  138. package/vendor/serverd/src/routes/management/identity-directory.js +79 -0
  139. package/vendor/serverd/src/routes/management/invitations.js +78 -68
  140. package/vendor/serverd/src/routes/management/plugin-identity.js +221 -0
  141. package/vendor/serverd/src/routes/management/registry-credential.js +1 -1
  142. package/vendor/serverd/src/routes/management/tunnels.js +98 -2
  143. package/vendor/serverd/src/routes/management/users.js +290 -208
  144. package/vendor/serverd/src/routes/management.js +4 -0
  145. package/vendor/serverd/src/routes/onboarding/provision.js +14 -1
  146. package/vendor/serverd/src/routes/user-access.js +17 -4
  147. package/vendor/serverd/src/routes/user-surface.js +69 -0
  148. package/vendor/server-ui/dist/assets/index-25wo_8av.css +0 -1
  149. package/vendor/server-ui/dist/assets/index-roDHz3dM.js +0 -84
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostic.js","sourceRoot":"","sources":["../../../src/server/routes/diagnostic.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"diagnostic.js","sourceRoot":"","sources":["../../../src/server/routes/diagnostic.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,IAAI,gBAAgB,CAAC;AAC9E,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;AAEvD,MAAM,aAAa,GAAG,IAAI,CAAC;AAC3B,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAClC,MAAM,6BAA6B,GAAG,MAAM,CAAC;AAC7C,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAClC,0EAA0E;AAC1E,0EAA0E;AAC1E,0EAA0E;AAC1E,qBAAqB;AACrB,MAAM,2BAA2B,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEnD;;;;GAIG;AACH,MAAM,eAAe,GAAG,CAAC;KACtB,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACpC,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,KAAK,CAAC,oDAAoD,EAAE,gCAAgC,CAAC;SAC7F,QAAQ,EAAE;CACd,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAClD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACzC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAC5C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAC5C,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;IACpE,oBAAoB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC5C,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;CACpE,CAAC,CAAC;AAmBH,IAAI,KAAK,GAAoB,IAAI,CAAC;AAElC,KAAK,UAAU,QAAQ;IACrB,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;IACnC,KAAK,GAAG;QACN,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC;;;;KAIlB,CAAC;QACF,qEAAqE;QACrE,4DAA4D;QAC5D,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,oEAAoE,CAAC;QAC5F,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,8CAA8C,CAAC;QACpE,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,gCAAgC,CAAC;QACvD,eAAe,EAAE,EAAE,CAAC,OAAO,CAAC,oDAAoD,CAAC;QACjF,qEAAqE;QACrE,uEAAuE;QACvE,oCAAoC;QACpC,gBAAgB,EAAE,EAAE,CAAC,OAAO,CAAC,mDAAmD,CAAC;QACjF,sBAAsB,EAAE,EAAE,CAAC,OAAO,CAChC,qEAAqE,CACtE;QACD,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC;QACpC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC5B,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;KACjC,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC;AAeD,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,YAAY,EAAE,GAAG,CAAC,aAAa;QAC/B,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,YAAY,EAAE,GAAG,CAAC,aAAa;KAChC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,gDAAgD;AAChD,8EAA8E;AAE9E,KAAK,UAAU,cAAc,CAAC,OAA6B;IACzD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACjC,MAAM,CAAC,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC3B,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IACd,IAAI,CAAC;QACH,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;QACtF,CAAC;QACD,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;IACjB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QACjB,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,IAAI,oBAAoB,GAAG,CAAC,CAAC;AAC7B,IAAI,qBAAqB,GAAkB,IAAI,CAAC;AAEhD,SAAS,gBAAgB,CAAC,IAAmB;IAC3C,qBAAqB,GAAG,IAAI,CAAC;AAC/B,CAAC;AAED,KAAK,UAAU,mBAAmB;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,GAAG,GAAG,oBAAoB,GAAG,2BAA2B;QAAE,OAAO;IACrE,oBAAoB,GAAG,GAAG,CAAC;IAC3B,MAAM,IAAI,GAAG,qBAAqB,IAAI,sBAAsB,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACxE,MAAM,CAAC,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC3B,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAE9E,IAAI,QAAQ,GAAyB,EAAE,CAAC;AACxC,IAAI,UAAU,GAA0C,IAAI,CAAC;AAC7D,IAAI,kBAAkB,GAAG,CAAC,CAAC;AAC3B,IAAI,YAAY,GAA4B,IAAI,CAAC;AAEjD,SAAS,oBAAoB;IAC3B,IAAI,UAAU;QAAE,OAAO;IACvB,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,iEAAiE;YACjE,kDAAkD;YAClD,mBAAmB,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAClC,YAAY,EAAE,KAAK,CAAC,EAAE,GAAG,EAAG,GAAa,CAAC,OAAO,EAAE,EAAE,wBAAwB,CAAC,CAAC;YACjF,CAAC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,QAAQ,CAAC;QACvB,QAAQ,GAAG,EAAE,CAAC;QACd,cAAc,CAAC,KAAK,CAAC;aAClB,IAAI,CAAC,GAAG,EAAE,CAAC,mBAAmB,EAAE,CAAC;aACjC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,YAAY,EAAE,KAAK,CAAC,EAAE,GAAG,EAAG,GAAa,CAAC,OAAO,EAAE,EAAE,oCAAoC,CAAC,CAAC;QAC7F,CAAC,CAAC,CAAC;IACP,CAAC,EAAE,qBAAqB,CAAC,CAAC;IAC1B,6DAA6D;IAC7D,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC;AACvB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAyB;IACjD,IAAI,QAAQ,CAAC,MAAM,IAAI,aAAa,EAAE,CAAC;QACrC,yEAAyE;QACzE,8DAA8D;QAC9D,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,GAAG,GAAG,kBAAkB,IAAI,6BAA6B,EAAE,CAAC;YAC9D,kBAAkB,GAAG,GAAG,CAAC;YACzB,YAAY,EAAE,IAAI,CAChB,EAAE,QAAQ,EAAE,aAAa,EAAE,EAC3B,iDAAiD,CAClD,CAAC;QACJ,CAAC;IACH,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,oBAAoB,EAAE,CAAC;AACzB,CAAC;AAED,8EAA8E;AAC9E,qEAAqE;AACrE,8EAA8E;AAE9E,KAAK,UAAU,YAAY,CAAC,QAA4B;IACtD,MAAM,eAAe,CAAC,YAAY,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAwB;IAC7D,6DAA6D;IAC7D,YAAY,GAAG,OAAO,CAAC,GAAuB,CAAC;IAC/C,2EAA2E;IAC3E,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,sBAAsB,IAAI,IAAI,CAAC,CAAC;IACvE,oBAAoB,EAAE,CAAC;IAEvB,iDAAiD;IACjD,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,EAAE,OAAuB,EAAE,KAAmB,EAAE,EAAE;QAClF,MAAM,KAAK,GAAG,OAAO,CAAC,KAA2C,CAAC;QAClE,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACxC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QAEpC,IAAI,CAAC,QAAQ,IAAI,CAAC,YAAY,IAAI,CAAC,UAAU,EAAE,CAAC;YAC9C,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,mEAAmE;aAC3E,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;YACrE,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,8DAA8D;IAC9D,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,QAAwB,EAAE,KAAmB,EAAE,EAAE;QAClF,OAAO,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,8CAA8C;IAC9C,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,QAAwB,EAAE,MAAoB,EAAE,EAAE;QAChF,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,mDAAmD;IACnD,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,EAAE,OAAuB,EAAE,KAAmB,EAAE,EAAE;QAChF,IAAI,IAA0C,CAAC;QAC/C,IAAI,CAAC;YACH,IAAI,GAAG,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,KAAK;iBACT,IAAI,CAAC,GAAG,CAAC;iBACT,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,OAAO,EAAG,GAAkB,CAAC,MAAM,EAAE,CAAC,CAAC;QAClF,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,OAAO,GAAuB,EAAE,GAAG,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;YAC5D,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAChC,sEAAsE;YACtE,IAAI,IAAI,CAAC,sBAAsB,KAAK,SAAS,EAAE,CAAC;gBAC9C,gBAAgB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAChD,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,yEAAyE;IACzE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,OAAuB,EAAE,KAAmB,EAAE,EAAE;QAChF,MAAM,KAAK,GAAG,OAAO,CAAC,KAA2C,CAAC;QAClE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAEtD,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,QAAQ,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAmB,CAAC;YACnD,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAwB,CAAC;YACpE,OAAO;gBACL,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;gBAC7B,KAAK,EAAE,QAAQ,CAAC,CAAC;gBACjB,KAAK;gBACL,MAAM;aACP,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,uEAAuE;IACvE,yEAAyE;IACzE,0EAA0E;IAC1E,yEAAyE;IACzE,yBAAyB;IACzB,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,EAAE,OAAuB,EAAE,KAAmB,EAAE,EAAE;QACnF,IAAI,MAAM,CAAC,IAAI,CAAE,OAAO,CAAC,KAA6C,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzF,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EACH,wGAAwG;aAC3G,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,QAAQ,EAAE,CAAC;YAC3B,QAAQ,GAAG,EAAE,CAAC;YACd,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;YACjC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACvD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,sEAAsE;IACtE,0EAA0E;IAC1E,wEAAwE;IACxE,mEAAmE;IACnE,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,KAAK,EAAE,OAAuB,EAAE,KAAmB,EAAE,EAAE;QACvF,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,cAAc;gBACrB,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;aACnD,CAAC,CAAC;QACL,CAAC;QACD,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,QAAQ,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,CAAC,CAAqB,EAAE,EAAE,CACxC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC;YAC5E,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC7C,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,MAAM,GACV,MAAM,KAAK,SAAS;gBAClB,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAClC,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACrD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAyB;IACxD,gBAAgB,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ export declare function principalRoutes(fastify: FastifyInstance): Promise<void>;
3
+ //# sourceMappingURL=principals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"principals.d.ts","sourceRoot":"","sources":["../../../src/server/routes/principals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAO7E,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB7E"}
@@ -0,0 +1,27 @@
1
+ import { z } from 'zod';
2
+ import { removeUserPrincipal } from '../../lib/principals.js';
3
+ /** A username as grants and group members hold it — in the body, never in a URL. */
4
+ const RemoveUserBodySchema = z.object({ username: z.string().min(1).max(100) }).strict();
5
+ export async function principalRoutes(fastify) {
6
+ // POST /api/principals/user/remove { username } — remove a user principal
7
+ // everywhere: every grant naming the username (any resource type) and its
8
+ // membership of every group, in one transaction. The panel calls it when
9
+ // a user is removed, and before it creates one whose username an earlier
10
+ // user held, so a reused username inherits nothing. The username travels
11
+ // in the body: a URL is what request logs keep.
12
+ fastify.post('/principals/user/remove', async (request, reply) => {
13
+ const parsed = RemoveUserBodySchema.safeParse(request.body);
14
+ if (!parsed.success) {
15
+ return reply.code(400).send({ error: 'The body is { username } (1-100 characters)' });
16
+ }
17
+ try {
18
+ const removed = await removeUserPrincipal(parsed.data.username);
19
+ return { ok: true, ...removed };
20
+ }
21
+ catch (err) {
22
+ request.log.error({ err: err.message }, 'Removing a user principal failed');
23
+ return reply.code(500).send({ error: 'Removing the user principal failed' });
24
+ }
25
+ });
26
+ }
27
+ //# sourceMappingURL=principals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"principals.js","sourceRoot":"","sources":["../../../src/server/routes/principals.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,oFAAoF;AACpF,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAEzF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAwB;IAC5D,0EAA0E;IAC1E,0EAA0E;IAC1E,yEAAyE;IACzE,yEAAyE;IACzE,yEAAyE;IACzE,gDAAgD;IAChD,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE,KAAK,EAAE,OAAuB,EAAE,KAAmB,EAAE,EAAE;QAC7F,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,6CAA6C,EAAE,CAAC,CAAC;QACxF,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAG,GAAa,CAAC,OAAO,EAAE,EAAE,kCAAkC,CAAC,CAAC;YACvF,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lamalibre/lamaste-gatekeeper",
3
- "version": "4.4.1",
3
+ "version": "4.5.0",
4
4
  "description": "Authorization layer for Lamaste — groups, grants, and tunnel access control",
5
5
  "type": "module",
6
6
  "exports": {
@@ -32,7 +32,7 @@
32
32
  },
33
33
  "dependencies": {
34
34
  "@fastify/rate-limit": "^10.3.0",
35
- "@lamalibre/lamaste": "^4.4.1",
35
+ "@lamalibre/lamaste": "^4.5.0",
36
36
  "fastify": "^5.3.3",
37
37
  "undici": "^7.8.0",
38
38
  "zod": "^3.24.4"
@@ -15,6 +15,7 @@
15
15
  * restart Restart panel server (and optionally gatekeeper)
16
16
  * plugins Manage server-side plugins
17
17
  * push-install Push install: the switch, the default policy, agents' windows
18
+ * users Users and the user directory: disable, delete, erase
18
19
  * tunnels Manage tunnels
19
20
  * sites Manage static sites
20
21
  * certs Certificate status and renewal
@@ -63,7 +64,8 @@ ${b('COMMANDS')}
63
64
  ${c('plugins')} Manage plugins (list, install, enable, disable, uninstall, update, hosting, hooks, settings, …)
64
65
  ${c('push-install')} Push install: on/off, default policy, open/close an agent's window
65
66
  ${c('audit')} The panel's audit log (approvals, hostings, updates, hook events)
66
- ${c('tunnels')} Manage tunnels (list, create, delete, toggle)
67
+ ${c('users')} Users and the user directory (list, disable, enable, delete, erase, directory)
68
+ ${c('tunnels')} Manage tunnels (list, create, delete, toggle, bind a plugin's user surface)
67
69
  ${c('sites')} Manage static sites (list, create, delete)
68
70
  ${c('certs')} Certificate status, renewal, and agent cert listing
69
71
  ${c('reset-admin')} Emergency admin reset (reverts to P12, clears 2FA)
@@ -109,6 +111,13 @@ ${b('EXAMPLES')}
109
111
  ${d("# Broker agent install tokens from the registry as the panel's own Authelia client")}
110
112
  ${c('lamaste-server registry-credential set --url https://feria.example.com --oidc')}
111
113
 
114
+ ${d('# Offboard a user: they cannot sign in, plugins see them disabled')}
115
+ ${c('lamaste-server users disable alice')}
116
+
117
+ ${d("# Give a user an agent-hosted plugin's role, and serve its user surface on a tunnel")}
118
+ ${c('lamaste-server plugins entitlements market-indicators --user alice --roles viewer')}
119
+ ${c('lamaste-server tunnels bind-user-surface piyasa market-indicators')}
120
+
112
121
  ${d('# List tunnels')}
113
122
  ${c('lamaste-server tunnels list')}
114
123
 
@@ -170,6 +179,11 @@ async function main() {
170
179
  await runAudit(args.slice(1), { json });
171
180
  break;
172
181
  }
182
+ case 'users': {
183
+ const { runUsers } = await import('../src/commands/users.js');
184
+ await runUsers(args.slice(1), { json });
185
+ break;
186
+ }
173
187
  case 'tunnels': {
174
188
  const { runTunnels } = await import('../src/commands/tunnels.js');
175
189
  await runTunnels(args.slice(1), { json });
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lamalibre/lamaste-server",
3
- "version": "4.4.1",
3
+ "version": "4.5.0",
4
4
  "description": "Server operations CLI for Lamaste",
5
5
  "type": "module",
6
6
  "license": "SEE LICENSE IN LICENSE.md",
@@ -18,7 +18,7 @@
18
18
  },
19
19
  "dependencies": {
20
20
  "@clack/prompts": "^1.8.1",
21
- "@lamalibre/lamaste": "^4.4.1",
21
+ "@lamalibre/lamaste": "^4.5.0",
22
22
  "chalk": "^5.3.0",
23
23
  "execa": "^9.0.0"
24
24
  },
@@ -0,0 +1,335 @@
1
+ /**
2
+ * lamaste-server plugins identity|audience|entitlements|identity-sync — the
3
+ * people of an agent-hosted plugin that declares identity (its manifest's
4
+ * `identity` block: roles, and the attributes it receives about its users).
5
+ *
6
+ * identity <name> What its installed version declares, its approval,
7
+ * whether users reach its application (and why not),
8
+ * its audience in numbers, the feed to its agent half
9
+ * and the erasures it has not acknowledged
10
+ * audience <name> Its members — and the users who left (tombstones) —
11
+ * as its agent half is told
12
+ * entitlements <name> Who may use it, with which roles: Gatekeeper plugin
13
+ * grants with roles, to users or Lamaste groups
14
+ * entitlements <name> --user <u> | --group <g> --roles a,b
15
+ * Give exactly these roles (replacing what it held)
16
+ * entitlements <name> --revoke --user <u> | --group <g>
17
+ * Take every role away
18
+ * identity-sync <name> [--reconcile]
19
+ * Send its agent half what it has not applied now;
20
+ * --reconcile replays everything and counts what was
21
+ * out of step (as the daily reconcile does)
22
+ *
23
+ * Every subcommand goes through the running panel
24
+ * (`/api/plugins/:name/{identity,audience,entitlements,identity/sync}`,
25
+ * admin certificate). What the panel says is printed only as
26
+ * `terminalText`; `--json` emits it as it came.
27
+ */
28
+
29
+ import chalk from 'chalk';
30
+ import { panelRequest } from '../panel-api.js';
31
+ import { emit, emitComplete, emitError } from '../ndjson.js';
32
+ import { identityBlockLines } from '../plugin-approval.js';
33
+ import {
34
+ audienceRowText,
35
+ parseEntitlementsArgs,
36
+ parseIdentitySyncArgs,
37
+ readinessText,
38
+ syncRows,
39
+ warningLine,
40
+ } from '../plugin-identity.js';
41
+ import { terminalText } from '../plugin-settings.js';
42
+
43
+ /** `/api/plugins/<name>/<rest>`. */
44
+ function pluginPath(name, rest) {
45
+ return `/api/plugins/${encodeURIComponent(name)}/${rest}`;
46
+ }
47
+
48
+ /**
49
+ * Exit with a usage error or a refused request, as text or NDJSON (with
50
+ * the refusal's `code`).
51
+ *
52
+ * @param {string} message
53
+ * @param {boolean} json
54
+ * @param {{ code?: string }} [err]
55
+ * @returns {never}
56
+ */
57
+ function fail(message, json, err = {}) {
58
+ if (json) emitError(message, false, typeof err.code === 'string' ? { code: err.code } : {});
59
+ else console.error(`\n ${chalk.red(terminalText(message))}\n`);
60
+ process.exit(1);
61
+ }
62
+
63
+ /** Print a change's warnings: what the panel could not complete beside it. */
64
+ function printWarnings(warnings) {
65
+ for (const warning of warnings ?? []) {
66
+ console.log(` ${chalk.yellow('!')} ${warningLine(warning)}`);
67
+ }
68
+ }
69
+
70
+ /** `label:` padded, then the value. */
71
+ function row(label, value) {
72
+ console.log(` ${chalk.dim(`${label}:`.padEnd(16))}${value}`);
73
+ }
74
+
75
+ /**
76
+ * `plugins identity <name>`.
77
+ *
78
+ * @param {string | undefined} name
79
+ * @param {{ json: boolean }} options
80
+ */
81
+ export async function identityCmd(name, { json }) {
82
+ if (!name) fail('Usage: lamaste-server plugins identity <name>', json);
83
+ let result;
84
+ try {
85
+ result = await panelRequest('GET', pluginPath(name, 'identity'));
86
+ } catch (err) {
87
+ fail(err.message, json, err);
88
+ }
89
+ if (json) {
90
+ emit(result);
91
+ return;
92
+ }
93
+ const view = result.identity;
94
+ const now = Date.now();
95
+ const ready = readinessText(view.readiness);
96
+ console.log('');
97
+ if (!view.declared) {
98
+ console.log(` Plugin ${chalk.cyan(name)} declares no identity: no user reaches it.`);
99
+ console.log(chalk.dim(` (${ready.text})`));
100
+ console.log('');
101
+ return;
102
+ }
103
+ console.log(chalk.bold(` People of ${terminalText(name)}`));
104
+ console.log(chalk.dim(' ' + '─'.repeat(40)));
105
+ row(
106
+ 'identity',
107
+ view.approval.approved
108
+ ? chalk.green('approved')
109
+ : chalk.yellow('waits for approval — lamaste-server plugins hooks ' + terminalText(name)),
110
+ );
111
+ row('users', ready.ready ? chalk.green(ready.text) : chalk.yellow(ready.text));
112
+ for (const line of identityBlockLines(view.declared)) {
113
+ const [label, ...value] = line.split(':');
114
+ row(label.trim(), value.join(':').trim());
115
+ }
116
+ const counts = view.audience;
117
+ if (counts) {
118
+ row(
119
+ 'audience',
120
+ `${counts.active} active, ${counts.disabled} disabled` +
121
+ chalk.dim(` · left: ${counts.removed} removed, ${counts.erased} erased`),
122
+ );
123
+ }
124
+ if (view.sync) {
125
+ console.log('');
126
+ console.log(chalk.bold(' Feed to the agent half'));
127
+ for (const [label, value] of syncRows(view.sync, now)) {
128
+ row(label, label === 'last error' ? chalk.red(value) : value);
129
+ }
130
+ }
131
+ if (view.pendingErasures.length > 0) {
132
+ console.log('');
133
+ console.log(chalk.bold(' Erasures its agent half has not acknowledged'));
134
+ for (const userId of view.pendingErasures) console.log(` ${terminalText(userId)}`);
135
+ }
136
+ console.log('');
137
+ }
138
+
139
+ /**
140
+ * `plugins audience <name>`.
141
+ *
142
+ * @param {string | undefined} name
143
+ * @param {{ json: boolean }} options
144
+ */
145
+ export async function audienceCmd(name, { json }) {
146
+ if (!name) fail('Usage: lamaste-server plugins audience <name>', json);
147
+ let result;
148
+ try {
149
+ result = await panelRequest('GET', pluginPath(name, 'audience'));
150
+ } catch (err) {
151
+ fail(err.message, json, err);
152
+ }
153
+ if (json) {
154
+ emit(result);
155
+ return;
156
+ }
157
+ const rows = result.audience.map(audienceRowText);
158
+ if (rows.length === 0) {
159
+ console.log(`\n ${chalk.cyan(name)} has no members yet.\n`);
160
+ return;
161
+ }
162
+ const print = (list, title) => {
163
+ if (list.length === 0) return;
164
+ const who = Math.max('USER'.length, ...list.map((r) => r.who.length));
165
+ console.log('');
166
+ console.log(chalk.bold(` ${title}`));
167
+ console.log(chalk.dim(` ${'USER ID'.padEnd(36)} ${'USER'.padEnd(who)} STATUS ROLES`));
168
+ for (const r of list) {
169
+ const status =
170
+ r.status === 'active'
171
+ ? chalk.green(r.status.padEnd(8))
172
+ : r.status === 'disabled'
173
+ ? chalk.yellow(r.status.padEnd(8))
174
+ : chalk.dim(r.status);
175
+ console.log(
176
+ ` ${r.userId.padEnd(36)} ${r.who.padEnd(who)} ${status} ${r.roles}${chalk.dim(` (seq ${r.seq})`)}`,
177
+ );
178
+ }
179
+ };
180
+ print(
181
+ rows.filter((r) => r.member),
182
+ `Audience of ${terminalText(name)} (head seq ${result.head})`,
183
+ );
184
+ print(
185
+ rows.filter((r) => !r.member),
186
+ 'Left the audience (the plugin keeps their last known name until they are erased)',
187
+ );
188
+ console.log('');
189
+ }
190
+
191
+ /**
192
+ * `plugins entitlements <name> [--user <u> | --group <g> --roles a,b]
193
+ * [--revoke --user <u> | --group <g>]`.
194
+ *
195
+ * @param {string[]} args what follows the subcommand
196
+ * @param {{ json: boolean }} options
197
+ */
198
+ export async function entitlementsCmd(args, { json }) {
199
+ const parsed = parseEntitlementsArgs(args);
200
+ if (!parsed.ok) fail(parsed.error, json);
201
+ const { name } = parsed;
202
+ const path = pluginPath(name, 'entitlements');
203
+
204
+ if (parsed.action === 'list') {
205
+ let result;
206
+ try {
207
+ result = await panelRequest('GET', path);
208
+ } catch (err) {
209
+ fail(err.message, json, err);
210
+ }
211
+ if (json) {
212
+ emit(result);
213
+ return;
214
+ }
215
+ const { entitlements, roleless } = result;
216
+ console.log('');
217
+ if (entitlements.length === 0) {
218
+ console.log(` Nobody holds a role on ${chalk.cyan(name)} yet.`);
219
+ } else {
220
+ console.log(chalk.bold(` Entitlements on ${terminalText(name)}`));
221
+ const width = Math.max(
222
+ 'PRINCIPAL'.length,
223
+ ...entitlements.map((e) => `${e.principalType}:${e.principalId}`.length),
224
+ );
225
+ console.log(chalk.dim(` ${'PRINCIPAL'.padEnd(width)} ROLES`));
226
+ for (const e of entitlements) {
227
+ const principal = terminalText(`${e.principalType}:${e.principalId}`);
228
+ const unknown =
229
+ e.unknownRoles.length > 0
230
+ ? chalk.dim(` (no longer declared: ${terminalText(e.unknownRoles.join(', '))})`)
231
+ : '';
232
+ const userId = e.userId ? chalk.dim(` ${terminalText(e.userId)}`) : '';
233
+ console.log(
234
+ ` ${chalk.cyan(principal.padEnd(width))} ${terminalText(e.roles.join(', '))}${unknown}${userId}`,
235
+ );
236
+ }
237
+ }
238
+ if (roleless > 0) {
239
+ console.log(
240
+ chalk.dim(
241
+ `\n ${roleless} grant(s) on it carry no roles (desktop installs, migrated grants) — they never make anyone a member.`,
242
+ ),
243
+ );
244
+ }
245
+ console.log(
246
+ chalk.dim(
247
+ `\n Give roles: lamaste-server plugins entitlements ${terminalText(name)} --user <u> | --group <g> --roles a,b` +
248
+ `\n Take away: lamaste-server plugins entitlements ${terminalText(name)} --revoke --user <u> | --group <g>`,
249
+ ),
250
+ );
251
+ console.log('');
252
+ return;
253
+ }
254
+
255
+ const principal = { principalType: parsed.principalType, principalId: parsed.principalId };
256
+ const who = `${principal.principalType} ${principal.principalId}`;
257
+ if (parsed.action === 'set') {
258
+ let result;
259
+ try {
260
+ result = await panelRequest('PUT', path, { ...principal, roles: parsed.roles });
261
+ } catch (err) {
262
+ fail(err.message, json, err);
263
+ }
264
+ if (json) {
265
+ emitComplete({ name, ...result });
266
+ return;
267
+ }
268
+ console.log(
269
+ result.changed
270
+ ? `\n ${chalk.green('✓')} ${terminalText(who)} holds ${chalk.cyan(parsed.roles.join(', '))} on ${terminalText(name)}`
271
+ : `\n ${terminalText(who)} already holds exactly ${parsed.roles.join(', ')} on ${terminalText(name)}`,
272
+ );
273
+ printWarnings(result.warnings);
274
+ console.log('');
275
+ return;
276
+ }
277
+
278
+ const query = new URLSearchParams(principal).toString();
279
+ let result;
280
+ try {
281
+ result = await panelRequest('DELETE', `${path}?${query}`);
282
+ } catch (err) {
283
+ fail(err.message, json, err);
284
+ }
285
+ if (json) {
286
+ emitComplete({ name, ...principal, ...result });
287
+ return;
288
+ }
289
+ console.log(
290
+ `\n ${chalk.green('✓')} ${terminalText(who)} holds no role on ${terminalText(name)} any more` +
291
+ chalk.dim(` (${result.revoked} grant(s) revoked)`),
292
+ );
293
+ printWarnings(result.warnings);
294
+ console.log('');
295
+ }
296
+
297
+ /**
298
+ * `plugins identity-sync <name> [--reconcile]`: exits non-zero when the
299
+ * sync was skipped or failed.
300
+ *
301
+ * @param {string[]} args what follows the subcommand
302
+ * @param {{ json: boolean }} options
303
+ */
304
+ export async function identitySyncCmd(args, { json }) {
305
+ const parsed = parseIdentitySyncArgs(args);
306
+ if (!parsed.ok) fail(parsed.error, json);
307
+ const { name, reconcile } = parsed;
308
+ let response;
309
+ try {
310
+ response = await panelRequest('POST', pluginPath(name, 'identity/sync'), { reconcile });
311
+ } catch (err) {
312
+ fail(err.message, json, err);
313
+ }
314
+ if (json) {
315
+ emitComplete({ name, ...response });
316
+ } else {
317
+ const { result } = response;
318
+ if (result.status === 'synced') {
319
+ console.log(
320
+ `\n ${chalk.green('✓')} ${terminalText(name)}: ${result.replay ? 'replayed' : 'synced'} up to seq ${result.cursor}` +
321
+ (reconcile ? ` — ${result.mismatches ?? 0} out of step` : ''),
322
+ );
323
+ } else if (result.status === 'up-to-date') {
324
+ console.log(
325
+ `\n ${chalk.green('✓')} ${terminalText(name)}: its agent half is up to date (seq ${result.cursor})`,
326
+ );
327
+ } else {
328
+ console.error(
329
+ `\n ${chalk.red(`${result.status}:`)} ${terminalText(result.error ?? result.reason ?? '')}`,
330
+ );
331
+ }
332
+ console.log('');
333
+ }
334
+ if (!response.ok) process.exit(1);
335
+ }