From 0a6b18743f06f200620af83de2cc14010bce191b Mon Sep 17 00:00:00 2001 From: hugocasa Date: Fri, 9 Oct 2026 19:27:30 +0200 Subject: [PATCH] fix: refresh resource type names and the resources tab after the chat creates a type Co-Authored-By: Claude Opus 5.5 --- frontend/src/lib/components/copilot/chat/global/core.test.ts | 3 +++ frontend/src/lib/components/copilot/chat/global/core.ts | 4 ++++ frontend/src/lib/components/sessions/previewReload.test.ts | 1 + frontend/src/lib/components/sessions/previewReload.ts | 2 ++ 4 files changed, 10 insertions(+) diff --git a/frontend/src/lib/components/copilot/chat/global/core.test.ts b/frontend/src/lib/components/copilot/chat/global/core.test.ts index 0bf7b09df2..69dfbcc265 100644 --- a/frontend/src/lib/components/copilot/chat/global/core.test.ts +++ b/frontend/src/lib/components/copilot/chat/global/core.test.ts @@ -416,6 +416,7 @@ import { import { devopsRole, superadmin, userStore, usersWorkspaceStore } from '$lib/stores' import { processSecretArgs } from '$lib/components/secretArgUtils' import { clearWorkspaceRoleCache } from '$lib/user' +import { resourceTypesStore } from '$lib/components/resourceTypesStore' import { get } from 'svelte/store' import type { Tool, ToolCallbacks } from '../shared' @@ -8157,6 +8158,7 @@ describe('create_resource_type', () => { ['c_acme_billing', 'c_acme_billing'] ])('creates %s as %s', async (given, created) => { vi.mocked(ResourceService.createResourceType).mockClear() + resourceTypesStore.set(['postgresql']) const result = await callGlobalTool('create_resource_type', { name: given, @@ -8168,5 +8170,6 @@ describe('create_resource_type', () => { created ) expect(result).toContain(created) + expect(get(resourceTypesStore)).toBeUndefined() }) }) diff --git a/frontend/src/lib/components/copilot/chat/global/core.ts b/frontend/src/lib/components/copilot/chat/global/core.ts index b560e27d4e..951d8a01ca 100644 --- a/frontend/src/lib/components/copilot/chat/global/core.ts +++ b/frontend/src/lib/components/copilot/chat/global/core.ts @@ -199,6 +199,7 @@ import { } from '$lib/stores' import { getWorkspaceRole, type RoleLookup } from '$lib/user' import { refreshSuperadmin } from '$lib/refreshUser' +import { resourceTypesStore } from '$lib/components/resourceTypesStore' import { get } from 'svelte/store' import { canonicalDraftSideValue, @@ -4454,6 +4455,9 @@ export const globalTools: SessionTool<{}>[] = [ schema: parsed.schema } }) + // Forms show a resource picker only for a type in this cached list, so a script + // written against the new type would otherwise get a plain object input. + resourceTypesStore.set(undefined) toolCallbacks.setToolStatus(toolId, { content: `Created resource type ${name}` }) return JSON.stringify({ success: true, diff --git a/frontend/src/lib/components/sessions/previewReload.test.ts b/frontend/src/lib/components/sessions/previewReload.test.ts index e7924a1813..2cc40cd3cc 100644 --- a/frontend/src/lib/components/sessions/previewReload.test.ts +++ b/frontend/src/lib/components/sessions/previewReload.test.ts @@ -9,6 +9,7 @@ describe('toolReloadEffect', () => { expect(toolReloadEffect('write_resource', {}).pages).toEqual(['/resources']) expect(toolReloadEffect('write_variable', {}).pages).toEqual(['/variables']) expect(toolReloadEffect('create_folder', { name: 'f' }).pages).toEqual(['/folders']) + expect(toolReloadEffect('create_resource_type', { name: 'c_x' }).pages).toEqual(['/resources']) }) it('maps a trigger write to its kind-specific page', () => { diff --git a/frontend/src/lib/components/sessions/previewReload.ts b/frontend/src/lib/components/sessions/previewReload.ts index d9259c900d..af27147457 100644 --- a/frontend/src/lib/components/sessions/previewReload.ts +++ b/frontend/src/lib/components/sessions/previewReload.ts @@ -49,6 +49,8 @@ export function toolReloadEffect(name: string, args: any): ToolReloadEffect { return withItem(['/variables'], itemRef('variable', args)) case 'create_folder': return { pages: ['/folders'], items: [], deployed: [] } + case 'create_resource_type': + return { pages: ['/resources'], items: [], deployed: [] } // These two change what is deployed at a path, so a tab on that item's View side // is showing a version that no longer exists. case 'delete_workspace_item':