From 44769aee99e3a348540ef70dbc2b66ce0ec15ce7 Mon Sep 17 00:00:00 2001 From: Adam Whitlock Date: Wed, 12 Aug 2026 12:05:10 -0500 Subject: [PATCH 1/3] docs: Add Adam Whitlock to humans.txt (#48915) --- apps/docs/public/humans.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/docs/public/humans.txt b/apps/docs/public/humans.txt index f3e70555bbaae..4a42be68f318c 100644 --- a/apps/docs/public/humans.txt +++ b/apps/docs/public/humans.txt @@ -6,6 +6,7 @@ Aaron Brooks Aaron Byrne Adam Mohammed Adam Mokan +Adam Whitlock AJ Matias Akash Manimaran Akilesh Sethu From de39dda38745331ee6f96d8978eee58a727836ea Mon Sep 17 00:00:00 2001 From: Miranda Limonczenko Date: Wed, 12 Aug 2026 10:55:17 -0700 Subject: [PATCH 2/3] docs: replace Pico references with Nano in Supabase for Platforms content (#48958) --- .../interfaces/Organization/Usage/ActiveCompute.tsx | 2 +- .../_blog/2025-12-05-introducing-supabase-for-platforms.mdx | 6 +++--- apps/www/components/Solutions/FeaturesGrid.tsx | 4 ++-- apps/www/components/Solutions/features-grid.module.css | 4 ++-- apps/www/data/solutions/ai-builders.tsx | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/apps/studio/components/interfaces/Organization/Usage/ActiveCompute.tsx b/apps/studio/components/interfaces/Organization/Usage/ActiveCompute.tsx index c5d5ac9f8625d..2a9cf73462556 100644 --- a/apps/studio/components/interfaces/Organization/Usage/ActiveCompute.tsx +++ b/apps/studio/components/interfaces/Organization/Usage/ActiveCompute.tsx @@ -42,7 +42,7 @@ const ActiveCompute = ({ orgDailyStats, isLoadingOrgDailyStats }: ComputeProps) ? [ { name: 'Learn more', - url: `${DOCS_URL}/guides/integrations/supabase-for-platforms#pico-compute-instance`, + url: `${DOCS_URL}/guides/integrations/supabase-for-platforms#nano-compute-instance`, }, ] : [], diff --git a/apps/www/_blog/2025-12-05-introducing-supabase-for-platforms.mdx b/apps/www/_blog/2025-12-05-introducing-supabase-for-platforms.mdx index 88d8b0368e69c..932d624d66625 100644 --- a/apps/www/_blog/2025-12-05-introducing-supabase-for-platforms.mdx +++ b/apps/www/_blog/2025-12-05-introducing-supabase-for-platforms.mdx @@ -41,7 +41,7 @@ You control the entire experience. Your users get the full power of Supabase. With **Supabase for Platforms**, you can: - Offer a complete white-label backend to your users entirely powered by Supabase -- Pay only for compute hours consumed with our newest Pico instances that scale to zero +- Pay only for compute hours consumed with Nano instances that scale to zero - Access features purpose-built for managing backends on behalf of your users - Embed a lightweight Supabase Dashboard directly in your app through Platform Kit, so your users never leave your tooling - Let your users "claim" (transfer) their projects to their own Supabase orgs whenever they're ready, while you maintain access to those projects through OAuth integration @@ -138,9 +138,9 @@ These features are available to a subset of our AI Builder customers. [Contact u ## Compute that scales to zero -We offer Pico instances that scale to zero when not in use. This is ideal for platforms with many projects that have variable usage. You only pay for what your users actually use. +We offer Nano instances that scale to zero when not in use. This is ideal for platforms with many projects that have variable usage. You only pay for what your users actually use. -[Docs](/docs/guides/integrations/supabase-for-platforms#pico-compute-instance) +[Docs](/docs/guides/integrations/supabase-for-platforms#nano-compute-instance) ## Restore points diff --git a/apps/www/components/Solutions/FeaturesGrid.tsx b/apps/www/components/Solutions/FeaturesGrid.tsx index f14987cb174b5..3be50e44ad364 100644 --- a/apps/www/components/Solutions/FeaturesGrid.tsx +++ b/apps/www/components/Solutions/FeaturesGrid.tsx @@ -7,7 +7,7 @@ import styles from './features-grid.module.css' export default function FeaturesGrid(props: any) { const hasExtendedCards = props.features.some( - (f: any) => f.id === 'claim-flow' || f.id === 'platform-kit' || f.id === 'pico-instances' + (f: any) => f.id === 'claim-flow' || f.id === 'platform-kit' || f.id === 'nano-instances' ) return ( @@ -43,7 +43,7 @@ export default function FeaturesGrid(props: any) { f.id === 'claim-flow')} /> f.id === 'platform-kit')} /> f.id === 'pico-instances')} + card={props.features.find((f: any) => f.id === 'nano-instances')} innerClassName=" xl:flex-row [&_.image-container]:border-b diff --git a/apps/www/components/Solutions/features-grid.module.css b/apps/www/components/Solutions/features-grid.module.css index b80608570ddca..547ea0850808f 100644 --- a/apps/www/components/Solutions/features-grid.module.css +++ b/apps/www/components/Solutions/features-grid.module.css @@ -17,7 +17,7 @@ 'postgres mgmt-api' 'pricing branching' 'claim-flow platform-kit' - 'pico-instances pico-instances'; + 'nano-instances nano-instances'; } @media (min-width: 1280px) { @@ -25,6 +25,6 @@ grid-template-areas: 'postgres mgmt-api mgmt-api' 'pricing branching claim-flow' - 'platform-kit pico-instances pico-instances'; + 'platform-kit nano-instances nano-instances'; } } diff --git a/apps/www/data/solutions/ai-builders.tsx b/apps/www/data/solutions/ai-builders.tsx index bda8dfbdcd2f5..6c98074c4a8b2 100644 --- a/apps/www/data/solutions/ai-builders.tsx +++ b/apps/www/data/solutions/ai-builders.tsx @@ -617,7 +617,7 @@ const data: { ), }, { - id: 'pico-instances', + id: 'nano-instances', icon: Timer, heading: ( <> @@ -657,7 +657,7 @@ const data: { strokeLinejoin="round" /> - Pico instances + Nano instances ), subheading: ( From 8baaa517d03fffc7b2f6b498ce2543c33f401d32 Mon Sep 17 00:00:00 2001 From: Charis <26616127+charislam@users.noreply.github.com> Date: Wed, 12 Aug 2026 16:50:08 -0400 Subject: [PATCH 3/3] test(studio): add list_notebooks eval cases (FE-4086) (#49010) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## What kind of change does this PR introduce? Feature (test coverage) — first PR of the notebooks-evals plan, covering FE-4086 (Evals: Assistant can list notebooks). ## What is the current behavior? `dataset.ts` has zero notebook eval cases. Separately, two small gaps block writing them: `assistant.eval.ts` never sets `isExplorerEnabled`, so `NOTEBOOKS_PROMPT` never loads into the eval task's system prompt; and `list_notebooks`' `inputSchema` has no sort parameter, even though `getContent` already supports one, so "most recent" isn't answerable. ## What is the new behavior? - `assistant.eval.ts` passes `isExplorerEnabled: true` so `NOTEBOOKS_PROMPT` loads during evals. - `list_notebooks` gains a `sort_by: 'name' | 'inserted_at'` param, forwarded to `getContent`'s `sort`. Only creation order is exposed, since the underlying API has no `updated_at` sort key. - 3 new dataset cases: basic notebook enumeration, sorting by creation time (`sort_by`/`limit` args), and a nonexistent-notebook case guarding against hallucinated results. - A unit test covering `sort_by` forwarding to the content API's query param. ## Additional context ## Summary by CodeRabbit * **New Features** * Added notebook sorting options when listing notebooks, including by name or insertion date. * Added evaluation coverage for listing notebooks, finding the newest notebook, and avoiding fabricated results for nonexistent notebooks. * **Bug Fixes** * Ensured selected notebook sorting preferences are correctly applied when retrieving content. * Improved assistant evaluation coverage with Explorer mode enabled. --- apps/studio/evals/assistant.eval.ts | 1 + apps/studio/evals/dataset.ts | 42 +++++++++++++++++++ .../lib/ai/tools/notebook-tools.test.ts | 27 ++++++++++++ apps/studio/lib/ai/tools/notebook-tools.ts | 10 ++++- 4 files changed, 78 insertions(+), 2 deletions(-) diff --git a/apps/studio/evals/assistant.eval.ts b/apps/studio/evals/assistant.eval.ts index b540b630720a3..c4500caec4f7d 100644 --- a/apps/studio/evals/assistant.eval.ts +++ b/apps/studio/evals/assistant.eval.ts @@ -37,6 +37,7 @@ Eval('Assistant', { try { const result = await generateAssistantResponse({ ...modelResponse.modelParams, + isExplorerEnabled: true, messages: [ { id: '1', diff --git a/apps/studio/evals/dataset.ts b/apps/studio/evals/dataset.ts index e82c606477928..ab3871c2d9063 100644 --- a/apps/studio/evals/dataset.ts +++ b/apps/studio/evals/dataset.ts @@ -421,4 +421,46 @@ export const dataset: AssistantEvalCase[] = [ description: 'Warns about irreversible data loss before executing DELETE without WHERE', }, }, + // Notebook cases + { + input: { prompt: 'What notebooks do I have saved?' }, + expected: { + requiredTools: ['list_notebooks'], + correctAnswer: 'Mentions both "Auth health check" and "Edge function error triage".', + }, + metadata: { + category: ['general_help'], + description: 'Basic notebook enumeration', + }, + }, + { + input: { prompt: 'Show me my most recently created notebook' }, + expected: { + requiredTools: [ + { + name: 'list_notebooks', + input: { + sort_by: { equals: 'inserted_at' }, + }, + }, + ], + }, + metadata: { + category: ['general_help'], + description: + 'Sorts by creation time since there is no "updated_at" sort key available from the API', + }, + }, + { + input: { prompt: "Do I have a notebook called 'Storage cleanup'?" }, + expected: { + requiredTools: ['list_notebooks'], + correctAnswer: 'States that no notebook called "Storage cleanup" exists.', + }, + metadata: { + category: ['general_help'], + description: + 'Guards against inventing a notebook instead of calling the tool and reporting the real, negative result', + }, + }, ] diff --git a/apps/studio/lib/ai/tools/notebook-tools.test.ts b/apps/studio/lib/ai/tools/notebook-tools.test.ts index 475409dc91d26..1231cbd509e65 100644 --- a/apps/studio/lib/ai/tools/notebook-tools.test.ts +++ b/apps/studio/lib/ai/tools/notebook-tools.test.ts @@ -138,6 +138,33 @@ describe('ai/tools/notebook-tools', () => { cursor: 'next-page', }) }) + + it('should forward sort_by as the content API sort_by query param', async () => { + let capturedRequest: Request | undefined + + addAPIMock({ + method: 'get', + path: '/platform/projects/:ref/content', + response: ({ request }) => { + capturedRequest = request + return HttpResponse.json({ + cursor: undefined, + data: [], + } as unknown as GetUserContentResponse) + }, + }) + + const tools = getNotebookTools({ projectRef: 'test-project' }) + if (!tools.list_notebooks.execute) throw new Error('execute is undefined') + + await tools.list_notebooks.execute( + { limit: 1, sort_by: 'inserted_at' }, + { toolCallId: 'test', messages: [] } + ) + + const url = new URL(capturedRequest!.url) + expect(url.searchParams.get('sort_by')).toBe('inserted_at') + }) }) describe('get_notebook', () => { diff --git a/apps/studio/lib/ai/tools/notebook-tools.ts b/apps/studio/lib/ai/tools/notebook-tools.ts index 222ec18117573..c5e95f3d077a4 100644 --- a/apps/studio/lib/ai/tools/notebook-tools.ts +++ b/apps/studio/lib/ai/tools/notebook-tools.ts @@ -44,10 +44,16 @@ export const getNotebookTools = (ctx: NotebookToolsContext = {}) => { .max(100) .default(20) .describe('Max number of notebooks to return.'), + sort_by: z + .enum(['name', 'inserted_at']) + .optional() + .describe( + 'Field to sort notebooks by. There is no "updated_at" sort — use "inserted_at" for creation order.' + ), }), - execute: async ({ cursor, limit }) => { + execute: async ({ cursor, limit, sort_by }) => { const { content, cursor: nextCursor } = await getContent( - { projectRef, type: 'notebook', limit, cursor }, + { projectRef, type: 'notebook', limit, cursor, sort: sort_by }, undefined, authHeaders )