v0.9.31: mothership activity headers, deploy reliability by waleedlatif1 · Pull Request #9292 · simstudioai/sim · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
daf2379
fix(gemini): send the lowest thinking level when thinking is 'none' o…
waleedlatif1 Oct 21, 2026
6819ce1
docs(library): update langgraph-alternatives (#9279)
waleedlatif1 Oct 21, 2026
7f21cd2
feat(library): 5 Best Claude Cowork Alternatives in 2026 for Shared a…
waleedlatif1 Oct 21, 2026
16fb6e5
feat(library): 6 Best Lindy Alternatives in 2026 for AI Agents and Au…
waleedlatif1 Oct 21, 2026
4e47da1
feat(library): 6 Best OpenClaw Alternatives for Teams in 2026 (#9281)
waleedlatif1 Oct 21, 2026
c287577
fix(deps): pin patched xmldom, axios, follow-redirects, qs, proxy-add…
waleedlatif1 Oct 21, 2026
3544f9f
feat(library): 6 Best Workato Alternatives for AI Agents in 2026 (#9282)
waleedlatif1 Oct 21, 2026
b1168ac
fix(mothership): keep display activity out of integration and mcp too…
waleedlatif1 Oct 21, 2026
71044e8
improvement(mothership): calmer activity header: wait wording until a…
waleedlatif1 Oct 21, 2026
5e4339f
improvement(docs): reduce navigation payload and build work (#9285)
waleedlatif1 Oct 21, 2026
20b9461
fix(mothership): let the agent copy files between workspaces without …
waleedlatif1 Oct 21, 2026
6e6243b
improvement(emails): refresh the platform update broadcast (#9291)
waleedlatif1 Oct 21, 2026
04f524c
feat(chat): recall sent messages from composer (#9289)
waleedlatif1 Oct 21, 2026
75f2960
fix(mothership): report a Copilot workflow tool whose paused run sett…
waleedlatif1 Oct 21, 2026
044805a
fix(mothership): report a paused Copilot workflow whose cancel lost t…
waleedlatif1 Oct 21, 2026
cb5027a
fix(chat): validate restored contexts against send schema (#9294)
waleedlatif1 Oct 21, 2026
b8be2f0
fix(docs): preserve clipboard activation and validate copied content …
waleedlatif1 Oct 21, 2026
6381473
fix(mothership): hold a tool call's display grouping beside its argum…
waleedlatif1 Oct 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .github/workflows/docs-negotiation.yml
2 changes: 2 additions & 0 deletions apps/docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,5 @@ Use the owner and generation commands listed in the editorial guide. Do not hand
## Validate

From the repository root, run the required lint, type, audit, and test gates in the development guidelines. From this directory, `bun run type-check` compiles MDX and checks the docs workspace, and `bun run build` validates the production site. Inspect affected page types on desktop and a narrow viewport, and check internal links and existing anchors after heading changes.

The docs HTTP workflow also checks sidebar navigation, API language switching, and copying Markdown on desktop and mobile layouts. It uploads screenshots and a JSON report with the HTTP regression artifacts. These checks run against the built site in CI; no visitor telemetry is collected. Use Vercel's build logs and usage reports to compare deployment cost and duration.
24 changes: 12 additions & 12 deletions apps/docs/app/[[...slug]]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import { CodeBlock } from '@/components/ui/code-block'
import { Heading } from '@/components/ui/heading'
import { IntegrationIcon } from '@/components/ui/integration-icon'
import { ResponseSection } from '@/components/ui/response-section'
import { getApiSpecContent, getAuthenticatedCodeSamples, openapi } from '@/lib/openapi'
import { getAuthenticatedCodeSamples, openapi } from '@/lib/openapi'
import { simShikiOptions } from '@/lib/shiki-theme'
import { type PageData, source } from '@/lib/source'
import { DOCS_BASE_URL } from '@/lib/urls'
Expand Down Expand Up @@ -266,11 +266,6 @@ export default async function Page(props: { params: Promise<{ slug?: string[] }>

if (isOpenAPI && data.getAPIPageProps) {
const apiProps = data.getAPIPageProps()
const apiPageContent = getApiSpecContent(
data.title,
data.description,
apiProps.operations ?? []
)

return (
<>
Expand Down Expand Up @@ -306,7 +301,10 @@ export default async function Page(props: { params: Promise<{ slug?: string[] }>
>
<PageHeader title={data.title} className='api-page-header'>
<div className='hidden sm:flex'>
<LLMCopyButton content={apiPageContent} />
<LLMCopyButton
key={page.url}
markdownUrl={`/llms.mdx${page.url === '/' ? '' : page.url}`}
/>
</div>
<PageNavigationArrows previous={neighbours?.previous} next={neighbours?.next} />
</PageHeader>
Expand All @@ -318,23 +316,22 @@ export default async function Page(props: { params: Promise<{ slug?: string[] }>
)
}

const MDX = data.body
const markdownContent = await data.getText('processed')
const { body: MDX, toc, lastModified } = await data.load()

return (
<>
<StructuredData
title={data.title}
description={data.description || ''}
url={`${BASE_URL}${page.url}`}
dateModified={data.lastModified?.toISOString()}
dateModified={lastModified?.toISOString()}
breadcrumb={breadcrumbs}
/>
<DocsPage
className={DOCS_PAGE_CLASS_NAME}
role='main'
tabIndex={-1}
toc={data.toc.filter(
toc={toc.filter(
(item) => isContentHeading(item) && (slug?.[0] !== 'integrations' || item.depth <= 3)
)}
full={data.full}
Expand All @@ -359,7 +356,10 @@ export default async function Page(props: { params: Promise<{ slug?: string[] }>
className='max-sm:[&>h1]:basis-0 max-sm:[&_a]:size-10'
>
<div className='hidden sm:flex'>
<LLMCopyButton content={markdownContent} />
<LLMCopyButton
key={page.url}
markdownUrl={`/llms.mdx${page.url === '/' ? '' : page.url}`}
/>
</div>
<PageNavigationArrows previous={neighbours?.previous} next={neighbours?.next} />
</PageHeader>
Expand Down
17 changes: 10 additions & 7 deletions apps/docs/app/sitemap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,16 @@ import { DOCS_BASE_URL } from '@/lib/urls'

export const revalidate = 3600

export default function sitemap(): MetadataRoute.Sitemap {
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
// The docs root redirects to /introduction, which is listed on its own.
return source
.getPages()
.filter((page) => page.url !== '/')
.map((page) => ({
const entries: MetadataRoute.Sitemap = []
for (const page of source.getPages()) {
if (page.url === '/') continue
const data = page.data.type === 'docs' ? await page.data.load() : undefined
entries.push({
url: `${DOCS_BASE_URL}${page.url}`,
lastModified: 'lastModified' in page.data ? page.data.lastModified : undefined,
}))
lastModified: data?.lastModified,
})
}
return entries
}
2 changes: 1 addition & 1 deletion apps/docs/components/docs-layout/sidebar-components.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ export function SidebarFolder({ item, children }: SidebarFolderProps) {
)}
{hasChildren && (
<div id={contentId} hidden={!open}>
<div className='mt-px ml-4 flex flex-col gap-px'>{children}</div>
{open && <div className='mt-px ml-4 flex flex-col gap-px'>{children}</div>}
</div>
)}
</div>
Expand Down
71 changes: 60 additions & 11 deletions apps/docs/components/page-actions.tsx
Original file line number Diff line number Diff line change
@@ -1,19 +1,68 @@
'use client'

import { Chip } from '@sim/emcn'
import { useRef, useState } from 'react'
import { Chip, useCopyToClipboard } from '@sim/emcn'
import { Check, Duplicate } from '@sim/emcn/icons'
import { useCopyButton } from 'fumadocs-ui/utils/use-copy-button'

export function LLMCopyButton({ content }: { content: string }) {
const [checked, onClick] = useCopyButton(() => navigator.clipboard.writeText(content))
interface LLMCopyButtonProps {
markdownUrl: string
}

export function LLMCopyButton({ markdownUrl }: LLMCopyButtonProps) {
const { copied, copy } = useCopyToClipboard()
const [status, setStatus] = useState<'idle' | 'pending' | 'ready' | 'failed'>('idle')
const preparedMarkdown = useRef<string | null>(null)
const pending = status === 'pending'
const checked = copied && status === 'idle'

async function onClick() {
setStatus('pending')
const prepare = async () => {
const response = await fetch(markdownUrl, {
signal: typeof AbortSignal.timeout === 'function' ? AbortSignal.timeout(10000) : undefined,
})
if (!response.ok) throw new Error('Could not load page Markdown')
const markdown = await response.text()
if (!markdown.trim()) throw new Error('Page Markdown is empty')
return markdown
}
try {
// Promise-backed writes preserve Safari's transient user activation during the fetch.
if (typeof ClipboardItem !== 'undefined' && typeof navigator.clipboard.write === 'function') {
const success = await copy({ prepare, fallback: '' })
setStatus(success ? 'idle' : 'failed')
return
}
if (preparedMarkdown.current === null) {
preparedMarkdown.current = await prepare()
setStatus('ready')
return
}
const success = await copy(preparedMarkdown.current)
setStatus(success ? 'idle' : 'failed')
} catch {
setStatus('failed')
}
}

return (
<Chip
onClick={onClick}
leftIcon={checked ? Check : Duplicate}
aria-label={checked ? 'Copied to clipboard' : 'Copy page content'}
>
{checked ? 'Copied' : 'Copy page'}
</Chip>
<div className='relative'>
<Chip
onClick={onClick}
disabled={pending}
aria-busy={pending}
leftIcon={checked ? Check : Duplicate}
aria-label={checked ? 'Copied to clipboard' : 'Copy page content'}
>
{checked ? 'Copied' : pending ? 'Copying…' : 'Copy page'}
</Chip>
<span role='status' className='absolute top-full right-0 whitespace-nowrap text-caption'>
{status === 'failed'
? 'Could not copy. Try again.'
: status === 'ready'
? 'Click again to copy.'
: ''}
</span>
</div>
)
}
1 change: 1 addition & 0 deletions apps/docs/lib/source.ts
Original file line number Diff line number Diff line change
Expand Up @@ -129,4 +129,5 @@ export type PageData = DocData &
description?: string
full?: boolean
integration?: { type: string; color: string }
load: () => Promise<DocData & { lastModified?: Date }>
}
1 change: 0 additions & 1 deletion apps/docs/next.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ const withMDX = createMDX()

const config: NextConfig = {
reactStrictMode: true,
productionBrowserSourceMaps: true,
transpilePackages: ['@sim/emcn', '@sim/workflow-renderer'],
images: {
unoptimized: true,
Expand Down
4 changes: 3 additions & 1 deletion apps/docs/package.json
Loading
Loading