Pulse/pkg/licensing
rcourtman 185c6ac80b Let a provider-hosted platform buy and renew its own licence
A provider could stand the MSP bundle up and evaluate it without asking
anyone, but paying still meant emailing its public key to Pulse and
copying a licence file onto the host by hand. With the licence server's
self-serve purchase path (pulse-pro license-server/provider_msp_purchase),
the control plane can do the whole thing itself.

The control plane now signs a challenge with its lease signing key to
fetch the licence its subscription entitles, validates it exactly as
startup does, requires it to bind this platform's key, and keeps it in
the data directory, because the host licence is a read-only secret
mount. Startup prefers that renewed licence while it validates, so a
paying provider keeps starting after the self-issued evaluation on the
host expires. A changed licence restarts the control plane through the
existing graceful shutdown, since the plan version is read at load by
every workspace-limit, backup and status path; client workspaces keep
running. Preflight, proof, recovery and backup accept either signed
source.

The portal gains owner and admin routes for plan state, checkout, the
Stripe billing portal and an immediate licence refresh, and the plan list
comes from the licence server so it shows only what can be bought, at
Stripe's price. Adds the msp_solo plan: 3 client workspaces, the first
paid step above the 2-workspace evaluation.
2026-09-23 23:30:34 +01:00
..
testsupport Move license test signers to testsupport 2026-04-28 19:12:21 +01:00
activation_store.go Harden scanned request and storage boundaries 2026-07-09 17:22:29 +01:00
activation_store_test.go Enforce installation-scoped license invalidation 2026-07-14 16:18:21 +01:00
activation_test_helpers_test.go Remove 198 unreachable Go functions 2026-06-03 12:29:37 +01:00
activation_types.go Classify license server transport failures as retryable 2026-08-02 00:04:40 +01:00
activation_types_coverage_test.go test(coverage): agentexec codecs and licensing service branch coverage 2026-07-14 14:45:55 +01:00
activation_types_test.go Classify license server transport failures as retryable 2026-08-02 00:04:40 +01:00
billing_state_normalization.go Remove monitored-system volume caps 2026-05-05 12:59:59 +01:00
billing_state_normalization_test.go Remove monitored-system volume caps 2026-05-05 12:59:59 +01:00
billing_store.go Retire hosted AI quickstart runtime 2026-04-28 16:11:27 +01:00
capability_aliases.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
capability_aliases_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
cloud_paid_guardrails_test.go Remove monitored-system volume caps 2026-05-05 12:59:59 +01:00
commercial_migration.go Clarify v5 migration recovery states 2026-07-07 21:46:07 +01:00
commercial_migration_load.go fix(licensing): surface unreadable persisted v5 licenses and retry failed startup exchanges 2026-06-11 08:44:35 +01:00
commercial_migration_load_test.go fix(licensing): surface unreadable persisted v5 licenses and retry failed startup exchanges 2026-06-11 08:44:35 +01:00
commercial_migration_test.go Clarify v5 migration recovery states 2026-07-07 21:46:07 +01:00
contracts.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
database_source.go Remove monitored-system volume caps 2026-05-05 12:59:59 +01:00
database_source_test.go Remove monitored-system volume caps 2026-05-05 12:59:59 +01:00
dev_mode_dev.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
dev_mode_features.go Remove 198 unreachable Go functions 2026-06-03 12:29:37 +01:00
dev_mode_release.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
dev_mode_release_test.go Prevent mock license migration warnings 2026-08-04 14:19:47 +01:00
entitlement_lease.go Make provider-MSP client runtimes verifiably licensed via chained entitlement leases 2026-06-10 13:58:52 +01:00
entitlement_lease_test.go Remove monitored-system volume caps 2026-05-05 12:59:59 +01:00
entitlement_payload.go Remove unreachable exported functions from pkg/ 2026-07-10 00:27:35 +01:00
entitlement_payload_test.go test(licensing): preserve community multi-tenant entitlement boundary 2026-09-09 10:51:06 +01:00
entitlement_source.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
entitlements.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
evaluator.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
evaluator_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
feature_map.go Register the external_probe Pro entitlement 2026-07-27 11:13:04 +01:00
feature_map_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
features.go Let a provider-hosted platform buy and renew its own licence 2026-09-23 23:30:34 +01:00
features_test.go Let a provider-hosted platform buy and renew its own licence 2026-09-23 23:30:34 +01:00
grant_claims_contract_test.go Fix activation fingerprint and license period status 2026-07-09 11:30:26 +01:00
grant_refresh.go Enforce installation-scoped license invalidation 2026-07-14 16:18:21 +01:00
grant_refresh_test.go Enforce installation-scoped license invalidation 2026-07-14 16:18:21 +01:00
grant_verification_test.go Remove monitored-system volume caps 2026-05-05 12:59:59 +01:00
host_lifecycle.go Remove monitored-system volume caps 2026-05-05 12:59:59 +01:00
host_lifecycle_test.go Remove monitored-system volume caps 2026-05-05 12:59:59 +01:00
hosted_entitlement_test_helpers_test.go Fix release-mode licensing test expectations 2026-04-28 18:58:35 +01:00
hosted_subscription.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
hosted_subscription_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
http.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
http_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
installation_status_poll.go Enforce installation-scoped license invalidation 2026-07-14 16:18:21 +01:00
installation_status_poll_test.go Wait for completed license status synchronization 2026-08-28 00:44:11 +01:00
legacy_v5_monitored_system_limit_aliases.go Remove unreachable exported functions from pkg/ 2026-07-10 00:27:35 +01:00
license_server_client.go revert(commercial): restore self-hosted opt-in posture 2026-08-08 16:48:19 +01:00
license_server_client_test.go revert(commercial): restore self-hosted opt-in posture 2026-08-08 16:48:19 +01:00
licensing_features_pure_branchcov0716_test.go Add Go branch-coverage tests for alerts monitoring model-resolution ai and licensing helpers 2026-07-16 15:17:45 +01:00
models.go Enforce installation-scoped license invalidation 2026-07-14 16:18:21 +01:00
models_test.go Carry the max_users grant claim into instance license limits 2026-07-08 16:56:07 +01:00
monitored_system_limit.go Remove 198 unreachable Go functions 2026-06-03 12:29:37 +01:00
monitored_system_limit_test.go Remove monitored-system volume caps 2026-05-05 12:59:59 +01:00
overflow_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
persistence.go fix(licensing): decrypt v5.0.0-era license.enc sealed with raw machine-id material 2026-06-11 08:36:11 +01:00
persistence_test.go fix(licensing): decrypt v5.0.0-era license.enc sealed with raw machine-id material 2026-06-11 08:36:11 +01:00
provider_chain_test.go Make provider-MSP client runtimes verifiably licensed via chained entitlement leases 2026-06-10 13:58:52 +01:00
public_key.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
public_key_test.go Fix release-mode licensing test expectations 2026-04-28 18:58:35 +01:00
purchase_return.go Restrict purchase return HTTP callbacks to loopback 2026-04-22 09:49:36 +01:00
purchase_return_test.go Add self-hosted commercial continuity proof 2026-05-13 16:44:26 +01:00
quickstart_credits.go Retire hosted AI quickstart runtime 2026-04-28 16:11:27 +01:00
quickstart_credits_test.go Retire hosted AI quickstart runtime 2026-04-28 16:11:27 +01:00
self_hosted_feature_catalog.go Describe External Probes server-side alerting accurately 2026-08-11 16:37:37 +01:00
service.go Prevent mock license migration warnings 2026-08-04 14:19:47 +01:00
service_activate_test.go Prevent mock license migration warnings 2026-08-04 14:19:47 +01:00
service_coverage_test.go test(coverage): agentexec codecs and licensing service branch coverage 2026-07-14 14:45:55 +01:00
service_state_branchcov0718_test.go Add Go branch-coverage tests for twelve pure backend helpers 2026-07-19 15:10:09 +01:00
stripe_subscription.go Let providers evaluate MSP without asking permission first 2026-08-03 16:31:24 +01:00
stripe_subscription_test.go Let providers evaluate MSP without asking permission first 2026-08-03 16:31:24 +01:00
subscription_state.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
subscription_test.go Preserve customer data across plan downgrades 2026-07-14 11:47:25 +01:00
subscription_transitions.go Preserve customer data across plan downgrades 2026-07-14 11:47:25 +01:00
testing_helpers.go Gate licensing test helpers out of release builds 2026-04-22 06:18:40 +01:00
token_source.go Remove monitored-system volume caps 2026-05-05 12:59:59 +01:00
token_source_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
trial_activation.go Clarify hosted entitlement signing compatibility 2026-04-28 18:47:19 +01:00
trial_activation_public_key_override_dev.go Compile out release env guardrail bypasses 2026-04-22 00:05:57 +01:00
trial_activation_public_key_override_release.go Compile out release env guardrail bypasses 2026-04-22 00:05:57 +01:00
trial_activation_release_test.go Compile out release env guardrail bypasses 2026-04-22 00:05:57 +01:00
trial_activation_test.go Clarify hosted entitlement signing compatibility 2026-04-28 18:47:19 +01:00
trial_start.go Retire self-hosted trial posture prompts 2026-04-28 17:39:09 +01:00
trial_start_test.go Retire self-hosted trial posture prompts 2026-04-28 17:39:09 +01:00
types.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
upgrade.go Register the external_probe Pro entitlement 2026-07-27 11:13:04 +01:00
upgrade_reasons.go Encode canonical self-hosted feature metadata 2026-04-23 15:30:42 +01:00
upgrade_test.go Describe External Probes server-side alerting accurately 2026-08-11 16:37:37 +01:00
user_limit.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00
user_limit_test.go feat: Pulse v6 release 2026-03-18 16:06:30 +00:00