diff --git a/packages/plugins/plugin-llm-wiki/src/wiki.ts b/packages/plugins/plugin-llm-wiki/src/wiki.ts index 77fcc997798..bbdeb7bb3e5 100644 --- a/packages/plugins/plugin-llm-wiki/src/wiki.ts +++ b/packages/plugins/plugin-llm-wiki/src/wiki.ts @@ -1465,6 +1465,17 @@ export async function updateSpace(ctx: PluginContext, input: UpdateSpaceInput): nextStatus ?? null, ], ); + if (nextStatus === "archived") { + return { + status: "ok", + space: { + ...space, + displayName: nextDisplayName ?? space.displayName, + settings: input.settings ? { ...space.settings, ...input.settings } : space.settings, + status: "archived", + }, + }; + } return { status: "ok", space: await resolveSpace(ctx, { companyId: input.companyId, wikiId: space.wikiId, spaceSlug: space.slug }) }; } diff --git a/packages/plugins/plugin-llm-wiki/tests/plugin.spec.ts b/packages/plugins/plugin-llm-wiki/tests/plugin.spec.ts index 297776b3fcd..fbe32a969ac 100644 --- a/packages/plugins/plugin-llm-wiki/tests/plugin.spec.ts +++ b/packages/plugins/plugin-llm-wiki/tests/plugin.spec.ts @@ -2821,6 +2821,53 @@ Duplicate headings receive stable suffixes. execute.params?.includes("archived"))).toBe(false); }); + it("archives a non-default space through update-space without re-resolving it as active", async () => { + const harness = createTestHarness({ manifest }); + const spaceRow = wikiSpaceRow({ + id: "77777777-7777-4777-8777-7777777777b1", + slug: "qa-space", + displayName: "QA Space", + pathPrefix: "spaces/qa-space", + status: "active", + settings: { owner: "qa" }, + }); + let archived = false; + const originalQuery = harness.ctx.db.query.bind(harness.ctx.db); + harness.ctx.db.query = async (sql: string, params?: unknown[]) => { + harness.dbQueries.push({ sql, params }); + if (sql.includes("wiki_spaces") && params?.[2] === "qa-space") { + return archived && sql.includes("status <> 'archived'") ? [] as T[] : [spaceRow] as T[]; + } + return originalQuery(sql, params); + }; + const originalExecute = harness.ctx.db.execute.bind(harness.ctx.db); + harness.ctx.db.execute = async (sql: string, params?: unknown[]) => { + if (sql.includes("UPDATE") && sql.includes("wiki_spaces") && params?.includes("archived")) archived = true; + return originalExecute(sql, params); + }; + + await plugin.definition.setup(harness.ctx); + const updated = await harness.performAction<{ + status: string; + space: { slug: string; displayName: string; status: string; settings: Record }; + }>("update-space", { + companyId: COMPANY_ID, + spaceSlug: "qa-space", + displayName: "Archived QA", + settings: { archivedBy: "test" }, + status: "archived", + }); + + expect(updated.status).toBe("ok"); + expect(updated.space).toMatchObject({ + slug: "qa-space", + displayName: "Archived QA", + status: "archived", + settings: { owner: "qa", archivedBy: "test" }, + }); + expect(archived).toBe(true); + }); + it("rejects unknown space statuses through update-space", async () => { const harness = createTestHarness({ manifest }); await plugin.definition.setup(harness.ctx);