Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
77a2c5e
UI polish batch: import-dialog cleanup, settings toast placement, tab…
wangchenglong0001 Jul 24, 2026
1f17151
Update reminder: simulate in-place download progress instead of linki…
wangchenglong0001 Jul 27, 2026
b13ed2e
test(web): retire AvatarMenu account-row suites after the popover sim…
wangchenglong0001 Jul 27, 2026
84aaff0
Design-systems toast: anchor to the pane's top edge, pill radius
wangchenglong0001 Jul 27, 2026
2472330
Update reminder strip: progress ring on the button, percent face
wangchenglong0001 Jul 27, 2026
3ea8e11
Merge origin/feat/workspace-team: keep the simplified avatar popover …
wangchenglong0001 Jul 28, 2026
cb147d3
Merge remote-tracking branch 'origin/feat/workspace-team' into feat/w…
wangchenglong0001 Jul 28, 2026
51610f3
Home shell productization batch: message center in the account menu, …
wangchenglong0001 Jul 28, 2026
a02f74b
Merge origin/feat/workspace-team into the productization sync branch
wangchenglong0001 Jul 28, 2026
b06e989
Restyle the updater ready popup to the update-reminder dialog language
wangchenglong0001 Jul 28, 2026
6bd3c42
Merge remote-tracking branch 'origin/feat/workspace-team' into feat/w…
wangchenglong0001 Jul 28, 2026
c0aa880
Merge remote-tracking branch 'origin/feat/workspace-team' into feat/w…
wangchenglong0001 Jul 28, 2026
588350b
Signed-out rail: message-center entry under 设置
wangchenglong0001 Jul 28, 2026
b088238
Composer row: pin chip glyphs against flex shrink
wangchenglong0001 Jul 28, 2026
9c428cc
Bind Community Remix projects to the current workspace
lefarcen Jul 28, 2026
a01d93e
Cover the refused-prompt-seed branch of the Community Remix fix
lefarcen Jul 28, 2026
9a7be27
Re-anchor three style specs on the dogfooded UI
lefarcen Jul 28, 2026
68f1036
Return message-center focus to the rail opener that owns it
lefarcen Jul 28, 2026
3287032
Merge remote-tracking branch 'origin/feat/workspace-team' into wcl/up…
lefarcen Jul 28, 2026
6c16990
Merge feat/workspace-team: keep the restyle, drop the placeholder upd…
lefarcen Jul 28, 2026
e48b871
Merge remote-tracking branch 'origin/feat/workspace-team' into wcl/up…
lefarcen Jul 28, 2026
31a12c9
Carry the menu popup contract onto the composer quick pills
lefarcen Jul 28, 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
61 changes: 48 additions & 13 deletions apps/web/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ import {
listProjects,
listTemplates,
deleteTemplate,
duplicatePluginAsProject,
patchProject,
resolvedWorkspaceContextForWrite,
} from './state/projects';
Expand Down Expand Up @@ -3266,19 +3267,53 @@ function AppInner() {
} else if (route.kind === 'community') {
appMain = (
<CommunityView
onRemixTemplate={({ prompt }) => {
// Remix drops the user straight into a running project instead of
// just prefilling Home's composer: create a project seeded with
// this template's prompt (the same auto-send-on-mount path Home's
// own submit uses) and navigate into it (keep in sync with the
// EntryShell-embedded community tab).
void handleCreateProject({
name: summarizeProjectNameFromPrompt(prompt) || t('common.untitled'),
skillId: null,
designSystemId: null,
metadata: { kind: 'other', nameSource: 'prompt' },
pendingPrompt: prompt,
});
onRemixTemplate={({ templateId, prompt }) => {
// Remix carries the template's PROJECT along, not just its prompt:
// duplicate the plugin's example artifact into a fresh project,
// seed the composer with the template prompt, then open it on the
// copied entry file (keep in sync with the EntryShell-embedded
// community tab). Templates without a duplicable artifact fall
// back to the old prompt-only project.
void (async () => {
const name = summarizeProjectNameFromPrompt(prompt) || t('common.untitled');
try {
// One resolved authority for BOTH requests: the create binds the
// copied project to this workspace, and the seed patch is then
// authorized against that same binding. A headerless create is
// read by the daemon as a legacy caller and leaves the project
// bound to no workspace at all, which is what kept remixed
// projects out of the member's own 草稿 list.
const writeContext = resolvedWorkspaceContextForWrite(workspaceContextState);
const result = await duplicatePluginAsProject(templateId, { name }, writeContext);
const seeded = await patchProject(
result.projectId,
{ pendingPrompt: prompt },
writeContext,
);
if (!seeded) {
// The project itself exists and is bound — only the prompt seed
// was refused. Keep the user on it (retrying through the catch
// below would leave the copy orphaned and create a second,
// empty project) and surface the dropped seed instead of
// discarding it silently.
console.error('Community remix: could not seed the template prompt.');
}
navigate({
kind: 'project',
projectId: result.projectId,
conversationId: result.conversationId,
fileName: result.relPath,
});
} catch {
await handleCreateProject({
name,
skillId: null,
designSystemId: null,
metadata: { kind: 'other', nameSource: 'prompt' },
pendingPrompt: prompt,
});
}
})();
}}
onUsePrompt={(prompt) => {
// Seed the Home composer with the template's starting prompt, then hand
Expand Down
Loading
Loading