@lamalibre/create-lamaste 4.2.0 → 4.3.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 (123) hide show
  1. package/package.json +2 -2
  2. package/scripts/lamaste-priv +205 -2
  3. package/src/index.js +4 -4
  4. package/src/lib/node-version.js +114 -0
  5. package/src/lib/relay-services.js +15 -1
  6. package/src/lib/service-config.js +113 -0
  7. package/src/tasks/gatekeeper.js +8 -3
  8. package/src/tasks/node.js +34 -75
  9. package/src/tasks/redeploy.js +36 -0
  10. package/vendor/docs/00-introduction/how-it-works.md +2 -2
  11. package/vendor/docs/00-introduction/quickstart.md +5 -5
  12. package/vendor/docs/00-introduction/what-is-lamaste.md +5 -5
  13. package/vendor/docs/01-concepts/authentication.md +6 -3
  14. package/vendor/docs/01-concepts/authorization.md +29 -17
  15. package/vendor/docs/01-concepts/certificates.md +3 -3
  16. package/vendor/docs/01-concepts/mtls.md +2 -2
  17. package/vendor/docs/01-concepts/nginx-reverse-proxy.md +8 -3
  18. package/vendor/docs/01-concepts/security-model.md +98 -34
  19. package/vendor/docs/01-concepts/tickets.md +2 -2
  20. package/vendor/docs/01-concepts/tunneling.md +4 -4
  21. package/vendor/docs/02-guides/agent-setup.md +34 -16
  22. package/vendor/docs/02-guides/certificate-management.md +2 -2
  23. package/vendor/docs/02-guides/cloud-provisioning.md +3 -3
  24. package/vendor/docs/02-guides/desktop-app-setup.md +10 -10
  25. package/vendor/docs/02-guides/installation.md +3 -3
  26. package/vendor/docs/02-guides/onboarding.md +2 -2
  27. package/vendor/docs/02-guides/standalone-plugin-with-tickets.md +2 -2
  28. package/vendor/docs/03-architecture/installer-flow.md +2 -2
  29. package/vendor/docs/03-architecture/installer.md +4 -4
  30. package/vendor/docs/03-architecture/management-flow.md +1 -1
  31. package/vendor/docs/03-architecture/nginx-configuration.md +91 -26
  32. package/vendor/docs/03-architecture/overview.md +8 -8
  33. package/vendor/docs/03-architecture/panel-client.md +6 -6
  34. package/vendor/docs/03-architecture/panel-server.md +2 -2
  35. package/vendor/docs/03-architecture/state-management.md +2 -2
  36. package/vendor/docs/03-architecture/system-overview.md +1 -1
  37. package/vendor/docs/04-api-reference/agent-hosted-plugins.md +407 -0
  38. package/vendor/docs/04-api-reference/app-host.md +360 -0
  39. package/vendor/docs/04-api-reference/audit-and-notifications.md +57 -0
  40. package/vendor/docs/04-api-reference/certificates.md +95 -38
  41. package/vendor/docs/04-api-reference/gatekeeper.md +5 -3
  42. package/vendor/docs/04-api-reference/lifecycle-hooks.md +333 -0
  43. package/vendor/docs/04-api-reference/onboarding.md +1 -1
  44. package/vendor/docs/04-api-reference/overview.md +137 -111
  45. package/vendor/docs/04-api-reference/registry-and-oidc.md +7 -3
  46. package/vendor/docs/04-api-reference/tunnels.md +15 -13
  47. package/vendor/docs/05-operations/backup-and-restore.md +1 -1
  48. package/vendor/docs/05-operations/uninstalling.md +1 -1
  49. package/vendor/docs/05-operations/upgrades.md +25 -20
  50. package/vendor/docs/06-reference/config-files.md +190 -97
  51. package/vendor/docs/06-reference/glossary.md +3 -3
  52. package/vendor/docs/06-reference/installer-flags.md +13 -13
  53. package/vendor/docs/06-reference/ports-and-services.md +1 -1
  54. package/vendor/docs/06-reference/troubleshooting.md +33 -8
  55. package/vendor/docs/_index.json +20 -0
  56. package/vendor/docs/gatekeeper-design.md +22 -19
  57. package/vendor/docs/identity-directory-design.md +57 -56
  58. package/vendor/docs/package.json +1 -1
  59. package/vendor/docs/todo/lib-cli-desktop-refactor.md +27 -27
  60. package/vendor/gatekeeper/dist/lib/types.d.ts +12 -0
  61. package/vendor/gatekeeper/dist/lib/types.d.ts.map +1 -1
  62. package/vendor/gatekeeper/dist/server/index.d.ts +2 -0
  63. package/vendor/gatekeeper/dist/server/index.d.ts.map +1 -1
  64. package/vendor/gatekeeper/dist/server/index.js +47 -8
  65. package/vendor/gatekeeper/dist/server/index.js.map +1 -1
  66. package/vendor/gatekeeper/dist/server/routes/authz.d.ts.map +1 -1
  67. package/vendor/gatekeeper/dist/server/routes/authz.js +233 -141
  68. package/vendor/gatekeeper/dist/server/routes/authz.js.map +1 -1
  69. package/vendor/gatekeeper/package.json +4 -3
  70. package/vendor/server/bin/lamaste-server.js +18 -1
  71. package/vendor/server/package.json +2 -2
  72. package/vendor/server/src/commands/audit.js +60 -0
  73. package/vendor/server/src/commands/plugins.js +963 -12
  74. package/vendor/server/src/commands/push-install.js +317 -0
  75. package/vendor/server/src/commands/registry-credential.js +2 -1
  76. package/vendor/server/src/commands/uninstall.js +28 -1
  77. package/vendor/server/src/ndjson.js +4 -2
  78. package/vendor/server/src/panel-api.js +32 -4
  79. package/vendor/server-ui/dist/assets/index-Bc5NCMSv.css +1 -0
  80. package/vendor/server-ui/dist/assets/index-DBp3cmaU.js +84 -0
  81. package/vendor/server-ui/dist/index.html +2 -2
  82. package/vendor/serverd/package.json +2 -2
  83. package/vendor/serverd/src/index.js +56 -4
  84. package/vendor/serverd/src/lib/actor.js +24 -0
  85. package/vendor/serverd/src/lib/agent-jobs.js +330 -0
  86. package/vendor/serverd/src/lib/app-error.js +10 -0
  87. package/vendor/serverd/src/lib/audit.js +145 -0
  88. package/vendor/serverd/src/lib/hook-effects.js +123 -0
  89. package/vendor/serverd/src/lib/hook-pipelines.js +902 -0
  90. package/vendor/serverd/src/lib/migrations/state/0006_plugin_agent.sql +4 -0
  91. package/vendor/serverd/src/lib/migrations/state/0007_audit_and_notifications.sql +29 -0
  92. package/vendor/serverd/src/lib/migrations/state/0008_plugin_hooks.sql +70 -0
  93. package/vendor/serverd/src/lib/migrations/state/0009_plugin_agent_half.sql +53 -0
  94. package/vendor/serverd/src/lib/migrations/state/0010_plugin_routes_and_retained_data.sql +47 -0
  95. package/vendor/serverd/src/lib/migrations/state/0011_agent_job_signature.sql +14 -0
  96. package/vendor/serverd/src/lib/mtls.js +89 -8
  97. package/vendor/serverd/src/lib/nginx.js +298 -44
  98. package/vendor/serverd/src/lib/notifications.js +107 -0
  99. package/vendor/serverd/src/lib/plugin-hooks.js +560 -0
  100. package/vendor/serverd/src/lib/plugin-hosting.js +688 -0
  101. package/vendor/serverd/src/lib/plugin-lifecycle.js +603 -0
  102. package/vendor/serverd/src/lib/plugin-operations.js +295 -0
  103. package/vendor/serverd/src/lib/plugin-packages.js +249 -0
  104. package/vendor/serverd/src/lib/plugins.js +298 -68
  105. package/vendor/serverd/src/lib/push-install.js +88 -2
  106. package/vendor/serverd/src/lib/relay-hooks.js +100 -0
  107. package/vendor/serverd/src/lib/relay-signing.js +43 -0
  108. package/vendor/serverd/src/lib/request-hooks.js +79 -0
  109. package/vendor/serverd/src/lib/retained-data.js +99 -0
  110. package/vendor/serverd/src/lib/trust-proxy.js +34 -0
  111. package/vendor/serverd/src/lib/tunnel-hooks.js +88 -0
  112. package/vendor/serverd/src/lib/vhost-reconcile.js +260 -0
  113. package/vendor/serverd/src/middleware/twofa-session.js +11 -1
  114. package/vendor/serverd/src/routes/agent-forwarder.js +37 -0
  115. package/vendor/serverd/src/routes/management/agent-panel-authz.js +97 -0
  116. package/vendor/serverd/src/routes/management/agents.js +262 -1
  117. package/vendor/serverd/src/routes/management/audit.js +81 -0
  118. package/vendor/serverd/src/routes/management/certs.js +1 -15
  119. package/vendor/serverd/src/routes/management/plugins.js +569 -54
  120. package/vendor/serverd/src/routes/management/tunnels.js +26 -0
  121. package/vendor/serverd/src/routes/management.js +4 -0
  122. package/vendor/server-ui/dist/assets/index-B5Wp8lu-.js +0 -257
  123. package/vendor/server-ui/dist/assets/index-BqWWFlTU.css +0 -1
@@ -17,14 +17,18 @@ import {
17
17
  } from '@lamalibre/lamaste/server';
18
18
  import {
19
19
  AGENT_LABEL_REGEX,
20
+ INTERNAL_PLUGIN_PORT_RANGE,
20
21
  PLUGIN_AGENT_CN_PREFIX,
21
22
  RESERVED_TUNNEL_PORTS,
23
+ isInternalPluginPort,
22
24
  } from '@lamalibre/lamaste';
23
25
  import { getConfig } from '../../lib/config.js';
24
26
  import { readTunnels, readSites } from '../../lib/state.js';
25
27
  import { loadAgentRegistry } from '../../lib/mtls.js';
26
28
  import { getChiselCredentialIssuedAt } from '../../lib/chisel-users.js';
27
29
  import { buildChiselArgs } from '../../lib/chisel-args.js';
30
+ import { listAgentPluginAssignments } from '../../lib/plugin-hosting.js';
31
+ import { pendingAgentJobs } from '../../lib/agent-jobs.js';
28
32
  import {
29
33
  tunnelNginxDeps,
30
34
  tunnelCertbotDeps,
@@ -41,6 +45,9 @@ const TunnelPortSchema = z
41
45
  .max(65535, 'Port must be at most 65535')
42
46
  .refine((p) => !RESERVED_TUNNEL_PORTS.includes(p), {
43
47
  message: `Ports ${RESERVED_TUNNEL_PORTS.join(', ')} belong to Lamaste services on the relay`,
48
+ })
49
+ .refine((p) => !isInternalPluginPort(p), {
50
+ message: `Ports ${INTERNAL_PLUGIN_PORT_RANGE.min}–${INTERNAL_PLUGIN_PORT_RANGE.max} are reserved for the internal tunnels of agent-hosted plugins`,
44
51
  });
45
52
 
46
53
  const AgentLabelSchema = z.string().regex(AGENT_LABEL_REGEX, 'Invalid agent label format');
@@ -155,6 +162,15 @@ function authorizeFor(request, action) {
155
162
  if (!mayActOn(request, tunnel)) {
156
163
  throw new TunnelError('Tunnel not found', 'NOT_FOUND');
157
164
  }
165
+ // An internal plugin tunnel belongs to the plugin's hosting: it is
166
+ // created and removed with it (DELETE /api/plugins/:name/hosting).
167
+ if (tunnel.exposure === 'internal') {
168
+ throw new TunnelError(
169
+ `Cannot ${action} an internal plugin tunnel here — it belongs to the hosting of plugin ` +
170
+ `"${tunnel.pluginRoute ?? tunnel.pluginName ?? '?'}"`,
171
+ 'FORBIDDEN',
172
+ );
173
+ }
158
174
  if (tunnel.type === 'panel' && request.certRole !== 'admin') {
159
175
  const caps = request.certCapabilities || [];
160
176
  if (!caps.includes('panel:expose')) {
@@ -259,6 +275,16 @@ export default async function tunnelRoutes(fastify, _opts) {
259
275
  port: t.port,
260
276
  subdomain: t.subdomain,
261
277
  })),
278
+ // The agent-hosted plugins this agent hosts: the agent fetches a
279
+ // plugin's config when it does not hold the secret issued at
280
+ // `secretIssuedAt`, and acknowledges it (see converge).
281
+ appPlugins: AGENT_LABEL_REGEX.test(label) ? await listAgentPluginAssignments(label) : [],
282
+ // Work for the agent's sync, reported to /agents/me/jobs/:id/result:
283
+ // lifecycle hook calls to its agent halves on its own loopback
284
+ // (`hook`), and installing, switching or removing an agent half
285
+ // through its app host helper (`app-install`, `app-activate`,
286
+ // `app-remove`) — see lib/agent-jobs.js for each job's fields.
287
+ agentJobs: AGENT_LABEL_REGEX.test(label) ? await pendingAgentJobs(label) : [],
262
288
  };
263
289
  } catch (err) {
264
290
  request.log.error(err, 'Failed to generate agent config');
@@ -15,6 +15,8 @@ import storageRoutes from './management/storage.js';
15
15
  import gatekeeperProxyRoutes from './management/gatekeeper-proxy.js';
16
16
  import agentsRoutes from './management/agents.js';
17
17
  import registryCredentialRoutes from './management/registry-credential.js';
18
+ import auditRoutes from './management/audit.js';
19
+ import agentPanelAuthzRoutes from './management/agent-panel-authz.js';
18
20
 
19
21
  export default async function managementRoutes(fastify, _opts) {
20
22
  fastify.addHook('onRequest', managementOnly());
@@ -35,4 +37,6 @@ export default async function managementRoutes(fastify, _opts) {
35
37
  await fastify.register(gatekeeperProxyRoutes);
36
38
  await fastify.register(agentsRoutes);
37
39
  await fastify.register(registryCredentialRoutes);
40
+ await fastify.register(auditRoutes);
41
+ await fastify.register(agentPanelAuthzRoutes);
38
42
  }