Skip to content
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
56246d8
feat(dashboards): add table-backed dashboard resources behind rollout…
TheodoreSpeaks Sep 25, 2026
90bbd59
refactor(files): separate discovery from storage context
TheodoreSpeaks Sep 25, 2026
a6e0941
fix(charts): keep pie labels readable and separate neutral colors
TheodoreSpeaks Sep 25, 2026
f894b9e
feat(dashboards): compute percentages from row conditions
TheodoreSpeaks Sep 25, 2026
743b0e3
refactor(dashboards): store dashboards as workspace files
TheodoreSpeaks Sep 26, 2026
0dc3b9d
Merge origin/staging into codex/research-sim-dashboards
TheodoreSpeaks Sep 26, 2026
26a9dd2
fix(dashboards): address review findings on chart layout and precision
TheodoreSpeaks Sep 26, 2026
6c58c01
fix(charts): size grouped bar rows and keep the row highlight through…
TheodoreSpeaks Sep 26, 2026
3d630db
Merge remote-tracking branch 'origin/staging' into codex/research-sim…
TheodoreSpeaks Sep 26, 2026
af21484
fix(charts): keep authored tooltip arrays and drop the v2 chat mode o…
TheodoreSpeaks Sep 26, 2026
bf3243c
fix(charts): reserve the authored bar gap between grouped bars
TheodoreSpeaks Sep 26, 2026
4f1b0e0
fix(charts): format index-encoded pie tooltips and test dashboard ref…
TheodoreSpeaks Sep 26, 2026
d736526
Merge remote-tracking branch 'origin/staging' into codex/research-sim…
TheodoreSpeaks Sep 26, 2026
8e34901
fix(charts): format bar tooltip values with each series' own value axis
TheodoreSpeaks Sep 26, 2026
bb59bdf
test(dashboards): drop mock-call and rendered-text assertions
TheodoreSpeaks Sep 26, 2026
dd4b207
Merge remote-tracking branch 'origin/staging' into codex/research-sim…
TheodoreSpeaks Sep 26, 2026
0958aab
test(dashboards): drop redundant mock resets and default environment …
TheodoreSpeaks Sep 26, 2026
a3e287e
refactor(dashboards): move authoring guidance to Mothership like Sim …
TheodoreSpeaks Sep 27, 2026
c2207cf
Merge remote-tracking branch 'origin/staging' into codex/research-sim…
TheodoreSpeaks Sep 27, 2026
54dfd1b
refactor(dashboards): give DashboardFeatureGate a props interface
TheodoreSpeaks Sep 27, 2026
4cc80af
feat(dashboards): report dashboard parse errors on file writes
TheodoreSpeaks Sep 27, 2026
5d0e7e4
fix(dashboards): split diagnostics, switch panel query modes, return …
TheodoreSpeaks Sep 27, 2026
68e8448
fix(dashboards): drop inherited ordering on query-mode switches and c…
TheodoreSpeaks Sep 27, 2026
470b450
feat(playground): org-level project view prototype
TheodoreSpeaks Sep 29, 2026
301c682
feat(playground): Supabase-style full view, settings in the sidebar, …
TheodoreSpeaks Sep 29, 2026
e4cd049
feat(playground): minimal black-and-white issues list, underline tabs…
TheodoreSpeaks Sep 30, 2026
6ab84c0
feat(playground): chat with the resource panel on the right; new tab …
TheodoreSpeaks Sep 30, 2026
11af0da
feat(playground): resource header is the full path, actions fold into…
TheodoreSpeaks Sep 30, 2026
8dc50fa
feat(resource): compact header keeps parent + current crumb so a narr…
TheodoreSpeaks Sep 30, 2026
ab81f6a
feat(resource): compact header is the current crumb alone, path on hover
TheodoreSpeaks Sep 30, 2026
912f0b2
feat(playground): + opens a New tab; browsing from it turns it into t…
TheodoreSpeaks Sep 30, 2026
2c9efe8
feat(playground): resource actions trail the tab strip; browser and t…
TheodoreSpeaks Sep 30, 2026
e342e50
feat(playground): chats are not scoped to projects
TheodoreSpeaks Sep 30, 2026
95dc82d
feat(playground): one project page with every section as a tab; full …
TheodoreSpeaks Sep 30, 2026
4e7607b
feat(playground): Resources tab lists every other kind under the proj…
TheodoreSpeaks Sep 30, 2026
092bde3
feat(playground): Chat about this opens a new chat with the thing in …
TheodoreSpeaks Sep 30, 2026
00a48d8
feat(playground): chat docks on the left of any project page from the…
TheodoreSpeaks Sep 30, 2026
ab38337
feat(playground): floating chat button starts a real chat with the pa…
TheodoreSpeaks Sep 30, 2026
eb297db
feat(playground): chat trigger is an icon at the top right of the pro…
TheodoreSpeaks Sep 30, 2026
828d23c
feat(playground): chats on the left, the workspace on the right
TheodoreSpeaks Sep 30, 2026
ffc8eef
feat(playground): home lists the projects under the composer; one cli…
TheodoreSpeaks Sep 30, 2026
f214bbf
feat(playground): Projects back in the sidebar; a project opens in th…
TheodoreSpeaks Oct 1, 2026
b225cbd
feat(playground): a project link goes Home with that project open; th…
TheodoreSpeaks Oct 1, 2026
6b4cf4a
feat(playground): home suggests what to do next under the composer
TheodoreSpeaks Oct 1, 2026
4d1df5d
feat(playground): a new tab starts on the pane's project; the browser…
TheodoreSpeaks Oct 1, 2026
5aa7077
feat(playground): Home and a second click on the active project desel…
TheodoreSpeaks Oct 1, 2026
edace95
feat(playground): Resources opens a browsing tab; bare workspace ref …
TheodoreSpeaks Oct 1, 2026
e8d3f69
feat(playground): browsing tab gets a search bar over the project's r…
TheodoreSpeaks Oct 1, 2026
9063f80
feat(playground): project rows in the browsing tab carry their tile
TheodoreSpeaks Oct 1, 2026
e0f0024
feat(playground): the search bar sits under the Browse section's label
TheodoreSpeaks Oct 1, 2026
f944167
feat(playground): Resources is the in-tab directory with real lists a…
TheodoreSpeaks Oct 1, 2026
e202859
feat(playground): the resource header bar stays on the Resources dire…
TheodoreSpeaks Oct 1, 2026
a09dc35
feat(playground): the project is a black profile chip at the head of …
TheodoreSpeaks Oct 1, 2026
e044127
feat(playground): quieter workspace tab
TheodoreSpeaks Oct 1, 2026
9280653
feat(playground): outlined project chip, title block back, no header …
TheodoreSpeaks Oct 1, 2026
cc58ff8
feat(playground): the dashboard is only the workspace tab's main view…
TheodoreSpeaks Oct 1, 2026
a614f67
feat(playground): the project tile in the strip is the switcher
TheodoreSpeaks Oct 1, 2026
7f8d6d5
feat(playground): the project switcher is one tile, filled edge to ed…
TheodoreSpeaks Oct 1, 2026
764c146
feat(playground): split profile control at the strip's right end
TheodoreSpeaks Oct 1, 2026
ef69716
feat(playground): resource actions sit in the resource's own header, …
TheodoreSpeaks Oct 1, 2026
4c016c0
feat(playground): expand toggle hides the chat; no divider on the pre…
TheodoreSpeaks Oct 1, 2026
685e1ce
feat(identity-tile): md size, the 24px toolbar mark
TheodoreSpeaks Oct 1, 2026
00383a1
feat(playground): new tab leads with Browse and search; Mentioned fol…
TheodoreSpeaks Oct 1, 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
Prev Previous commit
Next Next commit
feat(playground): home lists the projects under the composer; one cli…
…ck opens it in the pane

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DeA8zbNdZMuB1MSNbcH6p6
  • Loading branch information
TheodoreSpeaks and claude committed Sep 30, 2026
commit ffc8eef5e40ba05a3cee89cda99249dbc828d8ff
30 changes: 16 additions & 14 deletions apps/sim/app/playground/org/components/chat-surface.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import {
} from '@/app/playground/org/components/chat-resource-panel'
import { type ChatMessage, ChatThread } from '@/app/playground/org/components/chat-thread'
import { RunningDot } from '@/app/playground/org/components/glyphs'
import { HomeView } from '@/app/playground/org/components/home-view'
import {
isPanelKind,
mentionedIn,
Expand All @@ -33,7 +34,7 @@ import {
resolvePanelResource,
} from '@/app/playground/org/lib/chat-resources'
import { useProtoChats } from '@/app/playground/org/lib/chat-store'
import { type Chat, PEOPLE, WORKSPACES, workspaceById } from '@/app/playground/org/lib/mock-data'
import { type Chat, WORKSPACES, workspaceById } from '@/app/playground/org/lib/mock-data'
import type { ProjectSection } from '@/app/playground/org/lib/routes'
import { WORKSPACE_SECTIONS } from '@/app/playground/org/lib/routes'
import { protoParsers } from '@/app/playground/org/lib/search-params'
Expand Down Expand Up @@ -289,19 +290,20 @@ export function ChatSurface({ chat, fresh = false }: ChatSurfaceProps) {
</span>
{chat.id === 'c15' && <RunningDot />}
</header>
<ChatThread
placeholder={fresh ? 'Do anything' : 'Reply to Sim…'}
seed={fresh ? NO_MESSAGES : chat.id === 'c15' ? SEED : undefined}
emptyTitle={
fresh ? `What should we get done, ${PEOPLE.teddy.name.split(' ')[0]}?` : undefined
}
onSend={
fresh && chat.title === 'New chat'
? (text) => renameChat(chat.id, truncate(text, 48))
: undefined
}
className='mx-auto w-full max-w-[760px]'
/>
{chat.id === 'new' ? (
<HomeView />
) : (
<ChatThread
placeholder={fresh ? 'Do anything' : 'Reply to Sim…'}
seed={fresh ? NO_MESSAGES : chat.id === 'c15' ? SEED : undefined}
onSend={
fresh && chat.title === 'New chat'
? (text) => renameChat(chat.id, truncate(text, 48))
: undefined
}
className='mx-auto w-full max-w-[760px]'
/>
)}
</div>
</ChatPanelLayout>
)
Expand Down
8 changes: 0 additions & 8 deletions apps/sim/app/playground/org/components/chat-thread.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@ interface ChatThreadProps {
attachments?: React.ReactNode
/** Called with each message the person sends. */
onSend?: (text: string) => void
/** Shown in place of messages while there are none. */
emptyTitle?: string
className?: string
}

Expand All @@ -34,18 +32,12 @@ export function ChatThread({
seed = SEED,
attachments,
onSend,
emptyTitle,
className,
}: ChatThreadProps) {
const [messages, setMessages] = useState<ChatMessage[]>(seed)
return (
<div className={cn('flex min-h-0 flex-1 flex-col', className)}>
<div className='flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto px-4 py-4'>
{messages.length === 0 && emptyTitle && (
<h1 className='m-auto max-w-chat text-balance text-center font-season text-[26px] text-[var(--text-primary)] leading-[1.15] tracking-[-0.01em]'>
{emptyTitle}
</h1>
)}
{messages.map((message, index) =>
message.role === 'user' ? (
<div
Expand Down
48 changes: 48 additions & 0 deletions apps/sim/app/playground/org/components/home-view.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
'use client'

import { ChipTag } from '@sim/emcn'
import { generateShortId } from '@sim/utils/id'
import { truncate } from '@sim/utils/string'
import { useRouter } from 'next/navigation'
import { IdentityTile } from '@/components/identity-tile/identity-tile'
import { BrowseRow, BrowseSection } from '@/app/playground/org/components/browse-rows'
import { MockComposer } from '@/app/playground/org/components/mock-composer'
import { useProtoChats } from '@/app/playground/org/lib/chat-store'
import { PEOPLE, WORKSPACES } from '@/app/playground/org/lib/mock-data'
import { protoRoutes } from '@/app/playground/org/lib/routes'

/** Home: ask, or pick a project to open in the workspace pane. Asking starts a chat. */
export function HomeView() {
const router = useRouter()
const createChat = useProtoChats((state) => state.createChat)
const firstName = PEOPLE.teddy.name.split(' ')[0]
return (
<div className='flex h-full min-h-0 flex-col items-center justify-center overflow-y-auto px-6 py-8'>
<div className='flex w-full max-w-chat flex-col gap-8'>
<h1 className='text-balance text-center font-season text-[26px] text-[var(--text-primary)] leading-[1.15] tracking-[-0.01em] sm:text-[28px]'>
What should we get done, {firstName}?
</h1>
<MockComposer
placeholder='Do anything'
onSubmit={(text) => {
const id = `c-${generateShortId(8)}`
createChat({ id, title: truncate(text, 48), age: 'now' })
router.push(protoRoutes.chat(id))
}}
/>
<BrowseSection label='Projects'>
{WORKSPACES.map((workspace) => (
<BrowseRow key={workspace.id} href={protoRoutes.workspace(workspace.id)}>
<IdentityTile initial={workspace.name[0]} />
<span className='shrink-0 text-[var(--text-body)]'>{workspace.name}</span>
<span className='min-w-0 flex-1 truncate text-[var(--text-muted)]'>
{workspace.description}
</span>
{workspace.needsYou > 0 && <ChipTag variant='gray'>{workspace.needsYou}</ChipTag>}
</BrowseRow>
))}
</BrowseSection>
</div>
</div>
)
}