fix(web): review-bot round one + regenerate doc catalogs

- rename same-title no-op moves inside the serialized creation chain
- insertSessionBefore maps only the typed WorkspaceMoveInvalidError to
  workspace-move-invalid; storage failures stay internal
- workspace upsert rejects snapshots older than the installed projection
- flat-mode empty state shows when the query hides the intent row
- intent row no longer forces group expansion; header twist stays live
- group-by menu rides a portal; menu clicks stop propagating to the row
- intent row uses the same single-slot indent in both list modes
- regenerate cordis api/catalog + doc graphs
This commit is contained in:
imccyu
2026-07-26 01:11:17 +08:00
parent ea8b1178cd
commit f1b877e3c6
4 changed files with 65 additions and 6 deletions

View File

@@ -209,7 +209,7 @@ function FlatList({ useSessions, open, query }: Pick<SessionTreeProps, 'useSessi
{rows.length === 0 && !intentRow && (
<div className={css.empty}>{query === '' ? 'No sessions yet' : 'No matches'}</div>
)}
{intentRow && <IntentRowItem flat />}
{intentRow && <IntentRowItem />}
{rows.map(node => (
<SessionNodeItem
key={node.id}

View File

@@ -108,14 +108,13 @@ export function ProjectRowItem({ group, onToggle, onCreate, onRename }: {
/**
* The selected "New session" row for a frontend Session Intent targeted to a
* real Workspace. The row disappears when the Intent is replaced or connects.
* @param props.flat - flat-list variant: no twist slot (figma flat cell), so
* only the status slot indents the title.
* One status-slot indent in both grouped and flat lists (session rows carry
* no twist slot either, so titles align).
* @returns the placeholder row element.
*/
export function IntentRowItem({ flat = false }: { flat?: boolean } = {}) {
export function IntentRowItem() {
return (
<div className={clsx(css.sessionRow, css.selected)} role="treeitem" aria-selected style={{ paddingLeft: 8 }}>
{!flat && <span className={css.slot} />}
<span className={css.slot} />
<span className={css.title}>New session</span>
</div>