fix: allow run context during activation

This commit is contained in:
Eva
2026-05-04 03:33:55 +07:00
committed by Josh Lehman
parent c6276769e2
commit 62905ca472
2 changed files with 41 additions and 1 deletions

View File

@@ -118,6 +118,39 @@ describe("plugin run context lifecycle", () => {
).toEqual({ restored: true });
});
it("allows run-context initialization during activating plugin registration", () => {
const { config, registry } = createPluginRegistryFixture();
const api = registry.createApi(
createPluginRecord({
id: "registration-run-context-plugin",
name: "Registration Run Context Plugin",
}),
{ config },
);
expect(
api.setRunContext({
runId: "run-registration",
namespace: "state",
value: { initialized: true },
}),
).toBe(true);
expect(
getPluginRunContext({
pluginId: "registration-run-context-plugin",
get: { runId: "run-registration", namespace: "state" },
}),
).toEqual({ initialized: true });
api.clearRunContext({ runId: "run-registration", namespace: "state" });
expect(
getPluginRunContext({
pluginId: "registration-run-context-plugin",
get: { runId: "run-registration", namespace: "state" },
}),
).toBeUndefined();
});
it("keeps restored active registry state after stale async cleanup finishes", async () => {
let releaseCleanup: (() => void) | undefined;
let markCleanupStarted: (() => void) | undefined;

View File

@@ -2194,10 +2194,17 @@ export function createPluginRegistry(registryParams: PluginRegistryParams) {
const registrationCapabilities = resolvePluginRegistrationCapabilities(registrationMode);
pluginRuntimeRecordById.set(record.id, record);
const sideEffectGuard = createPluginSideEffectGuard(record.id);
const isLoadedRecordInRegistry = () =>
registry.plugins.some((plugin) => plugin.id === record.id && plugin.status === "loaded");
const isActivatingLoadedRecord = () =>
registryParams.activateGlobalSideEffects !== false &&
record.enabled &&
record.status === "loaded" &&
!registry.plugins.some((plugin) => plugin.id === record.id);
const shouldCommitWorkflowSideEffect = () =>
sideEffectGuard.active &&
!isPluginRegistryRetired(registry) &&
registry.plugins.some((plugin) => plugin.id === record.id && plugin.status === "loaded");
(isLoadedRecordInRegistry() || isActivatingLoadedRecord());
return buildPluginApi({
id: record.id,
name: record.name,