diff --git a/mobile/src/worktree/workspace-list-ordering.ts b/mobile/src/worktree/workspace-list-ordering.ts index 26e3011956c..f323d02b8a8 100644 --- a/mobile/src/worktree/workspace-list-ordering.ts +++ b/mobile/src/worktree/workspace-list-ordering.ts @@ -6,7 +6,11 @@ import { } from '../../../src/shared/workspace-view/workspace-row-sort' import { compareCodePoints, compareSidebarText } from '../../../src/shared/sidebar-list/text-order' import { getWorktreeRowIdentity } from './worktree-host-row-identity' -import { compareSmartStamps, recentStamp } from '../../../src/shared/sidebar-list/stamp-order' +import { + compareSmartStamps, + recentStamp, + type StampOrderRow +} from '../../../src/shared/sidebar-list/stamp-order' function finiteOr(value: number | undefined, fallback: number): number { return value !== undefined && Number.isFinite(value) ? value : fallback @@ -17,6 +21,16 @@ function getManualSortRank(worktree: Worktree): number | null { return typeof rank === 'number' && Number.isFinite(rank) ? rank : null } +// The phone's row names the unread flag `unread`. +function stampRow(worktree: Worktree): StampOrderRow { + return { + lastActivityAt: worktree.lastActivityAt, + smartTier: worktree.smartTier, + smartAt: worktree.smartAt, + isUnread: worktree.unread + } +} + export function hostSortsByStamps(worktrees: readonly Worktree[]): boolean { return worktrees.some((worktree) => worktree.sortedByStamps) } @@ -39,7 +53,7 @@ export function sortWorktrees( repoLabel: (w) => w.repo, recentActivity: recentStamp, manualRank: getManualSortRank, - compareSmart: compareSmartStamps + compareSmart: (a, b) => compareSmartStamps(stampRow(a), stampRow(b)) }) ) } diff --git a/mobile/src/worktree/workspace-list-stamp-order.test.ts b/mobile/src/worktree/workspace-list-stamp-order.test.ts index a5b3b451a36..77c0667dfd2 100644 --- a/mobile/src/worktree/workspace-list-stamp-order.test.ts +++ b/mobile/src/worktree/workspace-list-stamp-order.test.ts @@ -40,6 +40,7 @@ describe('sortWorktrees with host stamps', () => { lastActivityAt: 10, smartTier: 'done', smartAt: 20, + unread: true, sortedByStamps: true }) const needsYou = worktree({ @@ -86,4 +87,28 @@ describe('sortWorktrees with host stamps', () => { 'quiet' ]) }) + + it('a Done the user has seen rests by Recent (owner decision Q1)', () => { + const seen = worktree({ + worktreeId: 'seen', + displayName: 'A', + lastActivityAt: 30, + smartTier: 'done', + smartAt: 30, + unread: false, + sortedByStamps: true + }) + const working = worktree({ + worktreeId: 'working', + displayName: 'B', + lastActivityAt: 1, + smartTier: 'working', + smartAt: 1, + sortedByStamps: true + }) + expect(sortWorktrees([seen, working], 'smart').map((item) => item.worktreeId)).toEqual([ + 'working', + 'seen' + ]) + }) }) diff --git a/src/renderer/src/components/sidebar/__goldens__/sidebar-list-stamp-order/scenario-stamp-tiers.txt b/src/renderer/src/components/sidebar/__goldens__/sidebar-list-stamp-order/scenario-stamp-tiers.txt index a53212f6bc8..b8eb11369c7 100644 --- a/src/renderer/src/components/sidebar/__goldens__/sidebar-list-stamp-order/scenario-stamp-tiers.txt +++ b/src/renderer/src/components/sidebar/__goldens__/sidebar-list-stamp-order/scenario-stamp-tiers.txt @@ -1,5 +1,5 @@ === sort=smart groupBy=none pinnedInGroups=false === -visible: orca::/w/Zeta api::/w/api-y orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same +visible: orca::/w/Zeta orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr api::/w/api-y orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same PENDING key=pending:creation-1 creation=creation-1 repo=api HEADER key=pinned label="Pinned" count=6 tone="text-foreground" icon=Pin hostCounts={local:4 ssh:gpu-vm:2} hostIds={local:[orca::/w/feat-a,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c] ssh:gpu-vm:[orca-ssh::/w/remote-x,shared::/w/same]} ids=[orca::/w/feat-a,orca-ssh::/w/remote-x,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c,shared::/w/same] ITEM rowKey=pinned:|orca::/w/feat-a depth=0 groupDepth=0 children=2 lineageKey=lineage:orca::/w/feat-a hostLabel="Local Linux" placement=pinned owning=project:p-orca @@ -27,7 +27,7 @@ cmd1-9 mounted: 1=orca::/w/feat-a#lineage:orca::/w/feat-a 2=lab::/w/gitlab-mr 3= cmd1-9 unmounted: 1=orca::/w/feat-a 2=lab::/w/gitlab-mr 3=orca::/w/feat-b 4=orca::/w/feat-c 5=orca-ssh::/w/remote-x@ssh:gpu-vm 6=shared::/w/same@ssh:gpu-vm 7=shared::/w/same@local 8=orca::/w/Zeta 9=api::/w/api-y@runtime:env-1 cmd ids unmounted: orca::/w/feat-a lab::/w/gitlab-mr orca::/w/feat-b orca::/w/feat-c orca-ssh::/w/remote-x shared::/w/same orca::/w/Zeta api::/w/api-y orca::/orca api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh folder:fw-review folder:fw-notes folder:fw-remote -- collapsed: pinned lineage:orca::/w/feat-a -- -visible: orca::/w/Zeta api::/w/api-y orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same +visible: orca::/w/Zeta orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr api::/w/api-y orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same PENDING key=pending:creation-1 creation=creation-1 repo=api HEADER key=pinned label="Pinned" count=6 tone="text-foreground" icon=Pin hostCounts={local:4 ssh:gpu-vm:2} hostIds={local:[orca::/w/feat-a,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c] ssh:gpu-vm:[orca-ssh::/w/remote-x,shared::/w/same]} ids=[orca::/w/feat-a,orca-ssh::/w/remote-x,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c,shared::/w/same] HEADER key=all label="All" count=11 tone="text-foreground" icon=List hostCounts={local:7 runtime:env-1:2 ssh:gpu-vm:2} hostIds={local:[orca::/w/Zeta,orca::/orca,ext::/ext,lab::/lab,shared::/w/same] runtime:env-1:[api::/w/api-y,api::/api] ssh:gpu-vm:[orca-ssh::/orca-ssh]} ids=[orca::/w/Zeta,api::/w/api-y,orca::/orca,api::/api,ext::/ext,lab::/lab,orca-ssh::/orca-ssh,shared::/w/same] @@ -50,7 +50,7 @@ cmd1-9 mounted: 1=orca::/w/Zeta 2=api::/w/api-y@runtime:env-1 3=orca::/orca 4=ap cmd1-9 unmounted: 1=orca::/w/Zeta 2=api::/w/api-y@runtime:env-1 3=orca::/orca 4=api::/api@runtime:env-1 5=ext::/ext 6=lab::/lab 7=orca-ssh::/orca-ssh 8=shared::/w/same@local 9=folder:fw-review@local cmd ids unmounted: orca::/w/Zeta api::/w/api-y orca::/orca api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same folder:fw-review folder:fw-notes folder:fw-remote === sort=smart groupBy=none pinnedInGroups=true === -visible: orca::/w/Zeta api::/w/api-y orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same +visible: orca::/w/Zeta orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr api::/w/api-y orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same PENDING key=pending:creation-1 creation=creation-1 repo=api HEADER key=pinned label="Pinned" count=6 tone="text-foreground" icon=Pin hostCounts={local:4 ssh:gpu-vm:2} hostIds={local:[orca::/w/feat-a,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c] ssh:gpu-vm:[orca-ssh::/w/remote-x,shared::/w/same]} ids=[orca::/w/feat-a,orca-ssh::/w/remote-x,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c,shared::/w/same] ITEM rowKey=pinned:|orca::/w/feat-a depth=0 groupDepth=0 children=2 lineageKey=lineage:orca::/w/feat-a hostLabel="Local Linux" placement=pinned owning=project:p-orca @@ -59,14 +59,14 @@ ITEM rowKey=pinned:|orca::/w/feat-b depth=1 groupDepth=0 lastChild=true children ITEM rowKey=pinned:|orca::/w/feat-c depth=2 groupDepth=0 lastChild=true children=0 hostLabel="Local Linux" placement=pinned owning=project:p-orca parent=pinned:|orca::/w/feat-b ITEM rowKey=pinned:ssh:gpu-vm|orca-ssh::/w/remote-x depth=0 groupDepth=0 children=0 hostLabel="GPU VM" placement=pinned owning=project:p-orca ITEM rowKey=pinned:ssh:gpu-vm|shared::/w/same depth=0 groupDepth=0 lastChild=true children=0 hostLabel="GPU VM" placement=pinned owning=project:repo:shared -HEADER key=all label="All" count=17 tone="text-foreground" icon=List hostCounts={local:11 runtime:env-1:2 ssh:gpu-vm:4} hostIds={local:[orca::/w/Zeta,orca::/w/feat-a,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/orca,orca::/w/feat-c,ext::/ext,lab::/lab,shared::/w/same] runtime:env-1:[api::/w/api-y,api::/api] ssh:gpu-vm:[orca-ssh::/w/remote-x,orca-ssh::/orca-ssh,shared::/w/same]} ids=[orca::/w/Zeta,api::/w/api-y,orca::/w/feat-a,orca-ssh::/w/remote-x,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/orca,orca::/w/feat-c,api::/api,ext::/ext,lab::/lab,orca-ssh::/orca-ssh,shared::/w/same,shared::/w/same] +HEADER key=all label="All" count=17 tone="text-foreground" icon=List hostCounts={local:11 ssh:gpu-vm:4 runtime:env-1:2} hostIds={local:[orca::/w/Zeta,orca::/w/feat-a,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/orca,orca::/w/feat-c,ext::/ext,lab::/lab,shared::/w/same] ssh:gpu-vm:[orca-ssh::/w/remote-x,orca-ssh::/orca-ssh,shared::/w/same] runtime:env-1:[api::/w/api-y,api::/api]} ids=[orca::/w/Zeta,orca::/w/feat-a,orca-ssh::/w/remote-x,lab::/w/gitlab-mr,api::/w/api-y,orca::/w/feat-b,orca::/orca,orca::/w/feat-c,api::/api,ext::/ext,lab::/lab,orca-ssh::/orca-ssh,shared::/w/same,shared::/w/same] ITEM rowKey=all:|orca::/w/Zeta depth=0 groupDepth=0 children=0 hostLabel="Local Linux" placement=natural owning=project:p-orca -ITEM rowKey=all:runtime:env-1|api::/w/api-y depth=0 groupDepth=0 children=0 hostLabel="env-1" placement=natural owning=project:repo:api ITEM rowKey=all:|orca::/w/feat-a depth=0 groupDepth=0 children=2 lineageKey=lineage:orca::/w/feat-a hostLabel="Local Linux" placement=natural owning=project:p-orca ITEM rowKey=all:|lab::/w/gitlab-mr depth=1 groupDepth=0 children=0 hostLabel="Local Linux" showProject=true placement=natural owning=project:repo:lab parent=all:|orca::/w/feat-a ITEM rowKey=all:|orca::/w/feat-b depth=1 groupDepth=0 lastChild=true children=1 lineageKey=lineage:orca::/w/feat-b hostLabel="Local Linux" placement=natural owning=project:p-orca parent=all:|orca::/w/feat-a ITEM rowKey=all:|orca::/w/feat-c depth=2 groupDepth=0 lastChild=true children=0 hostLabel="Local Linux" placement=natural owning=project:p-orca parent=all:|orca::/w/feat-b ITEM rowKey=all:ssh:gpu-vm|orca-ssh::/w/remote-x depth=0 groupDepth=0 children=0 hostLabel="GPU VM" placement=natural owning=project:p-orca +ITEM rowKey=all:runtime:env-1|api::/w/api-y depth=0 groupDepth=0 children=0 hostLabel="env-1" placement=natural owning=project:repo:api ITEM rowKey=all:|orca::/orca depth=0 groupDepth=0 children=0 hostLabel="Local Linux" placement=natural owning=project:p-orca ITEM rowKey=all:runtime:env-1|api::/api depth=0 groupDepth=0 children=0 hostLabel="env-1" placement=natural owning=project:repo:api ITEM rowKey=all:|ext::/ext depth=0 groupDepth=0 children=0 hostLabel="Local Linux" placement=natural owning=project:repo:ext @@ -85,19 +85,19 @@ PREFERRED ssh:gpu-vm|orca-ssh::/w/remote-x -> all:ssh:gpu-vm|orca-ssh::/w/remote PREFERRED ssh:gpu-vm|shared::/w/same -> all:ssh:gpu-vm|shared::/w/same renderedKeys: 29 placeholders: - -selectionOrder: |orca::/w/Zeta runtime:env-1|api::/w/api-y |orca::/w/feat-a |lab::/w/gitlab-mr |orca::/w/feat-b |orca::/w/feat-c ssh:gpu-vm|orca-ssh::/w/remote-x |orca::/orca runtime:env-1|api::/api |ext::/ext |lab::/lab |orca-ssh::/orca-ssh local|shared::/w/same ssh:gpu-vm|shared::/w/same local|folder:fw-review local|folder:fw-notes ssh:gpu-vm|folder:fw-remote -cmd1-9 mounted: 1=orca::/w/Zeta 2=api::/w/api-y@runtime:env-1 3=orca::/w/feat-a#lineage:orca::/w/feat-a 4=lab::/w/gitlab-mr 5=orca::/w/feat-b#lineage:orca::/w/feat-b 6=orca::/w/feat-c 7=orca-ssh::/w/remote-x@ssh:gpu-vm 8=orca::/orca 9=api::/api@runtime:env-1 -cmd1-9 unmounted: 1=orca::/w/Zeta 2=api::/w/api-y@runtime:env-1 3=orca::/w/feat-a 4=lab::/w/gitlab-mr 5=orca::/w/feat-b 6=orca::/w/feat-c 7=orca-ssh::/w/remote-x@ssh:gpu-vm 8=orca::/orca 9=api::/api@runtime:env-1 -cmd ids unmounted: orca::/w/Zeta api::/w/api-y orca::/w/feat-a lab::/w/gitlab-mr orca::/w/feat-b orca::/w/feat-c orca-ssh::/w/remote-x orca::/orca api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same folder:fw-review folder:fw-notes folder:fw-remote +selectionOrder: |orca::/w/Zeta |orca::/w/feat-a |lab::/w/gitlab-mr |orca::/w/feat-b |orca::/w/feat-c ssh:gpu-vm|orca-ssh::/w/remote-x runtime:env-1|api::/w/api-y |orca::/orca runtime:env-1|api::/api |ext::/ext |lab::/lab |orca-ssh::/orca-ssh local|shared::/w/same ssh:gpu-vm|shared::/w/same local|folder:fw-review local|folder:fw-notes ssh:gpu-vm|folder:fw-remote +cmd1-9 mounted: 1=orca::/w/Zeta 2=orca::/w/feat-a#lineage:orca::/w/feat-a 3=lab::/w/gitlab-mr 4=orca::/w/feat-b#lineage:orca::/w/feat-b 5=orca::/w/feat-c 6=orca-ssh::/w/remote-x@ssh:gpu-vm 7=api::/w/api-y@runtime:env-1 8=orca::/orca 9=api::/api@runtime:env-1 +cmd1-9 unmounted: 1=orca::/w/Zeta 2=orca::/w/feat-a 3=lab::/w/gitlab-mr 4=orca::/w/feat-b 5=orca::/w/feat-c 6=orca-ssh::/w/remote-x@ssh:gpu-vm 7=api::/w/api-y@runtime:env-1 8=orca::/orca 9=api::/api@runtime:env-1 +cmd ids unmounted: orca::/w/Zeta orca::/w/feat-a lab::/w/gitlab-mr orca::/w/feat-b orca::/w/feat-c orca-ssh::/w/remote-x api::/w/api-y orca::/orca api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same folder:fw-review folder:fw-notes folder:fw-remote -- collapsed: pinned lineage:orca::/w/feat-a -- -visible: orca::/w/Zeta api::/w/api-y orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same +visible: orca::/w/Zeta orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr api::/w/api-y orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same PENDING key=pending:creation-1 creation=creation-1 repo=api HEADER key=pinned label="Pinned" count=6 tone="text-foreground" icon=Pin hostCounts={local:4 ssh:gpu-vm:2} hostIds={local:[orca::/w/feat-a,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c] ssh:gpu-vm:[orca-ssh::/w/remote-x,shared::/w/same]} ids=[orca::/w/feat-a,orca-ssh::/w/remote-x,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c,shared::/w/same] -HEADER key=all label="All" count=17 tone="text-foreground" icon=List hostCounts={local:11 runtime:env-1:2 ssh:gpu-vm:4} hostIds={local:[orca::/w/Zeta,orca::/w/feat-a,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/orca,orca::/w/feat-c,ext::/ext,lab::/lab,shared::/w/same] runtime:env-1:[api::/w/api-y,api::/api] ssh:gpu-vm:[orca-ssh::/w/remote-x,orca-ssh::/orca-ssh,shared::/w/same]} ids=[orca::/w/Zeta,api::/w/api-y,orca::/w/feat-a,orca-ssh::/w/remote-x,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/orca,orca::/w/feat-c,api::/api,ext::/ext,lab::/lab,orca-ssh::/orca-ssh,shared::/w/same,shared::/w/same] +HEADER key=all label="All" count=17 tone="text-foreground" icon=List hostCounts={local:11 ssh:gpu-vm:4 runtime:env-1:2} hostIds={local:[orca::/w/Zeta,orca::/w/feat-a,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/orca,orca::/w/feat-c,ext::/ext,lab::/lab,shared::/w/same] ssh:gpu-vm:[orca-ssh::/w/remote-x,orca-ssh::/orca-ssh,shared::/w/same] runtime:env-1:[api::/w/api-y,api::/api]} ids=[orca::/w/Zeta,orca::/w/feat-a,orca-ssh::/w/remote-x,lab::/w/gitlab-mr,api::/w/api-y,orca::/w/feat-b,orca::/orca,orca::/w/feat-c,api::/api,ext::/ext,lab::/lab,orca-ssh::/orca-ssh,shared::/w/same,shared::/w/same] ITEM rowKey=all:|orca::/w/Zeta depth=0 groupDepth=0 children=0 hostLabel="Local Linux" placement=natural owning=project:p-orca -ITEM rowKey=all:runtime:env-1|api::/w/api-y depth=0 groupDepth=0 children=0 hostLabel="env-1" placement=natural owning=project:repo:api ITEM rowKey=all:|orca::/w/feat-a depth=0 groupDepth=0 children=2 lineageKey=lineage:orca::/w/feat-a lineageCollapsed=true hostLabel="Local Linux" placement=natural owning=project:p-orca ITEM rowKey=all:ssh:gpu-vm|orca-ssh::/w/remote-x depth=0 groupDepth=0 children=0 hostLabel="GPU VM" placement=natural owning=project:p-orca +ITEM rowKey=all:runtime:env-1|api::/w/api-y depth=0 groupDepth=0 children=0 hostLabel="env-1" placement=natural owning=project:repo:api ITEM rowKey=all:|orca::/orca depth=0 groupDepth=0 children=0 hostLabel="Local Linux" placement=natural owning=project:p-orca ITEM rowKey=all:runtime:env-1|api::/api depth=0 groupDepth=0 children=0 hostLabel="env-1" placement=natural owning=project:repo:api ITEM rowKey=all:|ext::/ext depth=0 groupDepth=0 children=0 hostLabel="Local Linux" placement=natural owning=project:repo:ext @@ -109,7 +109,7 @@ FOLDER key=folder-workspace:fw-review projectGroup=pg-folders depth=0 groupDepth FOLDER key=folder-workspace:fw-notes projectGroup=pg-folders depth=0 groupDepth=0 FOLDER key=folder-workspace:fw-remote projectGroup=pg-remote-folders depth=0 groupDepth=0 SECTION pinned: pinned:|orca::/w/feat-a pinned:|lab::/w/gitlab-mr pinned:|orca::/w/feat-b pinned:|orca::/w/feat-c pinned:ssh:gpu-vm|orca-ssh::/w/remote-x pinned:ssh:gpu-vm|shared::/w/same -SECTION all: all:|orca::/w/Zeta all:runtime:env-1|api::/w/api-y all:|orca::/w/feat-a all:|lab::/w/gitlab-mr all:|orca::/w/feat-b all:|orca::/w/feat-c all:ssh:gpu-vm|orca-ssh::/w/remote-x all:|orca::/orca all:runtime:env-1|api::/api all:|ext::/ext all:|lab::/lab all:|orca-ssh::/orca-ssh all:local|shared::/w/same all:ssh:gpu-vm|shared::/w/same +SECTION all: all:|orca::/w/Zeta all:|orca::/w/feat-a all:|lab::/w/gitlab-mr all:|orca::/w/feat-b all:|orca::/w/feat-c all:ssh:gpu-vm|orca-ssh::/w/remote-x all:runtime:env-1|api::/w/api-y all:|orca::/orca all:runtime:env-1|api::/api all:|ext::/ext all:|lab::/lab all:|orca-ssh::/orca-ssh all:local|shared::/w/same all:ssh:gpu-vm|shared::/w/same PREFERRED |orca::/w/feat-a -> all:|orca::/w/feat-a PREFERRED |lab::/w/gitlab-mr -> all:|lab::/w/gitlab-mr PREFERRED |orca::/w/feat-b -> all:|orca::/w/feat-b @@ -118,12 +118,12 @@ PREFERRED ssh:gpu-vm|orca-ssh::/w/remote-x -> all:ssh:gpu-vm|orca-ssh::/w/remote PREFERRED ssh:gpu-vm|shared::/w/same -> all:ssh:gpu-vm|shared::/w/same renderedKeys: 20 placeholders: - -selectionOrder: |orca::/w/Zeta runtime:env-1|api::/w/api-y |orca::/w/feat-a ssh:gpu-vm|orca-ssh::/w/remote-x |orca::/orca runtime:env-1|api::/api |ext::/ext |lab::/lab |orca-ssh::/orca-ssh local|shared::/w/same ssh:gpu-vm|shared::/w/same local|folder:fw-review local|folder:fw-notes ssh:gpu-vm|folder:fw-remote -cmd1-9 mounted: 1=orca::/w/Zeta 2=api::/w/api-y@runtime:env-1 3=orca::/w/feat-a#lineage:orca::/w/feat-a 4=orca-ssh::/w/remote-x@ssh:gpu-vm 5=orca::/orca 6=api::/api@runtime:env-1 7=ext::/ext 8=lab::/lab 9=orca-ssh::/orca-ssh -cmd1-9 unmounted: 1=orca::/w/Zeta 2=api::/w/api-y@runtime:env-1 3=orca::/w/feat-a 4=orca-ssh::/w/remote-x@ssh:gpu-vm 5=orca::/orca 6=api::/api@runtime:env-1 7=ext::/ext 8=lab::/lab 9=orca-ssh::/orca-ssh -cmd ids unmounted: orca::/w/Zeta api::/w/api-y orca::/w/feat-a orca-ssh::/w/remote-x orca::/orca api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same folder:fw-review folder:fw-notes folder:fw-remote +selectionOrder: |orca::/w/Zeta |orca::/w/feat-a ssh:gpu-vm|orca-ssh::/w/remote-x runtime:env-1|api::/w/api-y |orca::/orca runtime:env-1|api::/api |ext::/ext |lab::/lab |orca-ssh::/orca-ssh local|shared::/w/same ssh:gpu-vm|shared::/w/same local|folder:fw-review local|folder:fw-notes ssh:gpu-vm|folder:fw-remote +cmd1-9 mounted: 1=orca::/w/Zeta 2=orca::/w/feat-a#lineage:orca::/w/feat-a 3=orca-ssh::/w/remote-x@ssh:gpu-vm 4=api::/w/api-y@runtime:env-1 5=orca::/orca 6=api::/api@runtime:env-1 7=ext::/ext 8=lab::/lab 9=orca-ssh::/orca-ssh +cmd1-9 unmounted: 1=orca::/w/Zeta 2=orca::/w/feat-a 3=orca-ssh::/w/remote-x@ssh:gpu-vm 4=api::/w/api-y@runtime:env-1 5=orca::/orca 6=api::/api@runtime:env-1 7=ext::/ext 8=lab::/lab 9=orca-ssh::/orca-ssh +cmd ids unmounted: orca::/w/Zeta orca::/w/feat-a orca-ssh::/w/remote-x api::/w/api-y orca::/orca api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same folder:fw-review folder:fw-notes folder:fw-remote === sort=smart groupBy=repo pinnedInGroups=false === -visible: orca::/w/Zeta api::/w/api-y orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same +visible: orca::/w/Zeta orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr api::/w/api-y orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same HEADER key=pinned label="Pinned" count=6 tone="text-foreground" icon=Pin hostCounts={local:4 ssh:gpu-vm:2} hostIds={local:[orca::/w/feat-a,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c] ssh:gpu-vm:[orca-ssh::/w/remote-x,shared::/w/same]} ids=[orca::/w/feat-a,orca-ssh::/w/remote-x,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c,shared::/w/same] ITEM rowKey=pinned:|orca::/w/feat-a depth=0 groupDepth=0 children=2 lineageKey=lineage:orca::/w/feat-a hostLabel="Local Linux" placement=pinned owning=project:p-orca ITEM rowKey=pinned:|lab::/w/gitlab-mr depth=1 groupDepth=0 children=0 hostLabel="Local Linux" showProject=true placement=pinned owning=project:repo:lab parent=pinned:|orca::/w/feat-a @@ -162,7 +162,7 @@ cmd1-9 mounted: 1=orca::/w/feat-a#lineage:orca::/w/feat-a 2=lab::/w/gitlab-mr 3= cmd1-9 unmounted: 1=orca::/w/feat-a 2=lab::/w/gitlab-mr 3=orca::/w/feat-b 4=orca::/w/feat-c 5=orca-ssh::/w/remote-x@ssh:gpu-vm 6=shared::/w/same@ssh:gpu-vm 7=orca::/orca 8=orca-ssh::/orca-ssh 9=orca::/w/Zeta cmd ids unmounted: orca::/w/feat-a lab::/w/gitlab-mr orca::/w/feat-b orca::/w/feat-c orca-ssh::/w/remote-x shared::/w/same orca::/orca orca-ssh::/orca-ssh orca::/w/Zeta lab::/lab folder:fw-review folder:fw-notes folder:fw-remote api::/api api::/w/api-y ext::/ext -- collapsed: pinned project:p-orca project:repo:lab project-group:pg-remote-folders project:repo:shared project:repo:empty lineage:orca::/w/feat-a -- -visible: orca::/w/Zeta api::/w/api-y orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same +visible: orca::/w/Zeta orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr api::/w/api-y orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same HEADER key=pinned label="Pinned" count=6 tone="text-foreground" icon=Pin hostCounts={local:4 ssh:gpu-vm:2} hostIds={local:[orca::/w/feat-a,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c] ssh:gpu-vm:[orca-ssh::/w/remote-x,shared::/w/same]} ids=[orca::/w/feat-a,orca-ssh::/w/remote-x,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c,shared::/w/same] HEADER key=project-group:pg-work label="Work" count=2 tone="text-foreground" icon=FolderTree projectGroup=pg-work projectGroupDepth=0 HEADER key=project:p-orca label="orca" count=3 tone="text-foreground" icon=FolderTree repo=orca projectGroupDepth=1 @@ -193,7 +193,7 @@ cmd1-9 mounted: 1=folder:fw-review@local 2=folder:fw-notes@local 3=api::/api@run cmd1-9 unmounted: 1=folder:fw-review@local 2=folder:fw-notes@local 3=api::/api@runtime:env-1 4=api::/w/api-y@runtime:env-1 5=ext::/ext cmd ids unmounted: folder:fw-review folder:fw-notes api::/api api::/w/api-y ext::/ext === sort=smart groupBy=repo pinnedInGroups=true === -visible: orca::/w/Zeta api::/w/api-y orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same +visible: orca::/w/Zeta orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr api::/w/api-y orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same HEADER key=pinned label="Pinned" count=6 tone="text-foreground" icon=Pin hostCounts={local:4 ssh:gpu-vm:2} hostIds={local:[orca::/w/feat-a,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c] ssh:gpu-vm:[orca-ssh::/w/remote-x,shared::/w/same]} ids=[orca::/w/feat-a,orca-ssh::/w/remote-x,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c,shared::/w/same] ITEM rowKey=pinned:|orca::/w/feat-a depth=0 groupDepth=0 children=2 lineageKey=lineage:orca::/w/feat-a hostLabel="Local Linux" placement=pinned owning=project:p-orca ITEM rowKey=pinned:|lab::/w/gitlab-mr depth=1 groupDepth=0 children=0 hostLabel="Local Linux" showProject=true placement=pinned owning=project:repo:lab parent=pinned:|orca::/w/feat-a @@ -244,7 +244,7 @@ cmd1-9 mounted: 1=orca::/orca 2=orca-ssh::/orca-ssh 3=orca::/w/Zeta 4=orca::/w/f cmd1-9 unmounted: 1=orca::/orca 2=orca-ssh::/orca-ssh 3=orca::/w/Zeta 4=orca::/w/feat-a 5=lab::/w/gitlab-mr 6=orca::/w/feat-b 7=orca::/w/feat-c 8=orca-ssh::/w/remote-x@ssh:gpu-vm 9=lab::/lab cmd ids unmounted: orca::/orca orca-ssh::/orca-ssh orca::/w/Zeta orca::/w/feat-a lab::/w/gitlab-mr orca::/w/feat-b orca::/w/feat-c orca-ssh::/w/remote-x lab::/lab folder:fw-review folder:fw-notes folder:fw-remote api::/api api::/w/api-y shared::/w/same ext::/ext -- collapsed: pinned project:p-orca project:repo:lab project-group:pg-remote-folders project:repo:shared project:repo:empty lineage:orca::/w/feat-a -- -visible: orca::/w/Zeta api::/w/api-y orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same +visible: orca::/w/Zeta orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr api::/w/api-y orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same HEADER key=pinned label="Pinned" count=6 tone="text-foreground" icon=Pin hostCounts={local:4 ssh:gpu-vm:2} hostIds={local:[orca::/w/feat-a,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c] ssh:gpu-vm:[orca-ssh::/w/remote-x,shared::/w/same]} ids=[orca::/w/feat-a,orca-ssh::/w/remote-x,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c,shared::/w/same] HEADER key=project-group:pg-work label="Work" count=2 tone="text-foreground" icon=FolderTree projectGroup=pg-work projectGroupDepth=0 HEADER key=project:p-orca label="orca" count=8 tone="text-foreground" icon=FolderTree repo=orca projectGroupDepth=1 @@ -281,7 +281,7 @@ cmd1-9 mounted: 1=folder:fw-review@local 2=folder:fw-notes@local 3=api::/api@run cmd1-9 unmounted: 1=folder:fw-review@local 2=folder:fw-notes@local 3=api::/api@runtime:env-1 4=api::/w/api-y@runtime:env-1 5=ext::/ext cmd ids unmounted: folder:fw-review folder:fw-notes api::/api api::/w/api-y ext::/ext === sort=smart groupBy=workspace-status pinnedInGroups=false === -visible: orca::/w/Zeta api::/w/api-y orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same +visible: orca::/w/Zeta orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr api::/w/api-y orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same PENDING key=pending:creation-1 creation=creation-1 repo=api HEADER key=pinned label="Pinned" count=6 tone="text-foreground" icon=Pin hostCounts={local:4 ssh:gpu-vm:2} hostIds={local:[orca::/w/feat-a,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c] ssh:gpu-vm:[orca-ssh::/w/remote-x,shared::/w/same]} ids=[orca::/w/feat-a,orca-ssh::/w/remote-x,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c,shared::/w/same] ITEM rowKey=pinned:|orca::/w/feat-a depth=0 groupDepth=0 children=2 lineageKey=lineage:orca::/w/feat-a hostLabel="Local Linux" placement=pinned owning=project:p-orca @@ -312,7 +312,7 @@ cmd1-9 mounted: 1=orca::/w/feat-a#lineage:orca::/w/feat-a 2=lab::/w/gitlab-mr 3= cmd1-9 unmounted: 1=orca::/w/feat-a 2=lab::/w/gitlab-mr 3=orca::/w/feat-b 4=orca::/w/feat-c 5=orca-ssh::/w/remote-x@ssh:gpu-vm 6=shared::/w/same@ssh:gpu-vm 7=shared::/w/same@local 8=orca::/orca 9=api::/api@runtime:env-1 cmd ids unmounted: orca::/w/feat-a lab::/w/gitlab-mr orca::/w/feat-b orca::/w/feat-c orca-ssh::/w/remote-x shared::/w/same orca::/orca api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh folder:fw-notes folder:fw-remote folder:fw-review orca::/w/Zeta api::/w/api-y -- collapsed: pinned workspace-status:in-review lineage:orca::/w/feat-a -- -visible: orca::/w/Zeta api::/w/api-y orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same +visible: orca::/w/Zeta orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr api::/w/api-y orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same PENDING key=pending:creation-1 creation=creation-1 repo=api HEADER key=pinned label="Pinned" count=6 tone="text-foreground" icon=Pin hostCounts={local:4 ssh:gpu-vm:2} hostIds={local:[orca::/w/feat-a,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c] ssh:gpu-vm:[orca-ssh::/w/remote-x,shared::/w/same]} ids=[orca::/w/feat-a,orca-ssh::/w/remote-x,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c,shared::/w/same] HEADER key=workspace-status:in-progress label="In progress" count=8 tone="text-[#d4a300]" icon=ConductorProgressIcon hostCounts={local:5 runtime:env-1:1 ssh:gpu-vm:2} hostIds={local:[orca::/orca,ext::/ext,lab::/lab,shared::/w/same] runtime:env-1:[api::/api] ssh:gpu-vm:[orca-ssh::/orca-ssh]} ids=[orca::/orca,api::/api,ext::/ext,lab::/lab,orca-ssh::/orca-ssh,shared::/w/same] @@ -337,7 +337,7 @@ cmd1-9 mounted: 1=orca::/orca 2=api::/api@runtime:env-1 3=ext::/ext 4=lab::/lab cmd1-9 unmounted: 1=orca::/orca 2=api::/api@runtime:env-1 3=ext::/ext 4=lab::/lab 5=orca-ssh::/orca-ssh 6=shared::/w/same@local 7=folder:fw-notes@local 8=folder:fw-remote@ssh:gpu-vm 9=orca::/w/Zeta cmd ids unmounted: orca::/orca api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same folder:fw-notes folder:fw-remote orca::/w/Zeta api::/w/api-y === sort=smart groupBy=workspace-status pinnedInGroups=true === -visible: orca::/w/Zeta api::/w/api-y orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same +visible: orca::/w/Zeta orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr api::/w/api-y orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same PENDING key=pending:creation-1 creation=creation-1 repo=api HEADER key=pinned label="Pinned" count=6 tone="text-foreground" icon=Pin hostCounts={local:4 ssh:gpu-vm:2} hostIds={local:[orca::/w/feat-a,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c] ssh:gpu-vm:[orca-ssh::/w/remote-x,shared::/w/same]} ids=[orca::/w/feat-a,orca-ssh::/w/remote-x,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c,shared::/w/same] ITEM rowKey=pinned:|orca::/w/feat-a depth=0 groupDepth=0 children=2 lineageKey=lineage:orca::/w/feat-a hostLabel="Local Linux" placement=pinned owning=project:p-orca @@ -379,7 +379,7 @@ cmd1-9 mounted: 1=orca::/w/feat-a#lineage:orca::/w/feat-a 2=lab::/w/gitlab-mr 3= cmd1-9 unmounted: 1=orca::/w/feat-a 2=lab::/w/gitlab-mr 3=orca-ssh::/w/remote-x@ssh:gpu-vm 4=orca::/orca 5=orca::/w/feat-c 6=api::/api@runtime:env-1 7=ext::/ext 8=lab::/lab 9=orca-ssh::/orca-ssh cmd ids unmounted: orca::/w/feat-a lab::/w/gitlab-mr orca-ssh::/w/remote-x orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same folder:fw-notes folder:fw-remote orca::/w/feat-b folder:fw-review orca::/w/Zeta api::/w/api-y -- collapsed: pinned workspace-status:in-review lineage:orca::/w/feat-a -- -visible: orca::/w/Zeta api::/w/api-y orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same +visible: orca::/w/Zeta orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr api::/w/api-y orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same PENDING key=pending:creation-1 creation=creation-1 repo=api HEADER key=pinned label="Pinned" count=6 tone="text-foreground" icon=Pin hostCounts={local:4 ssh:gpu-vm:2} hostIds={local:[orca::/w/feat-a,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c] ssh:gpu-vm:[orca-ssh::/w/remote-x,shared::/w/same]} ids=[orca::/w/feat-a,orca-ssh::/w/remote-x,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c,shared::/w/same] HEADER key=workspace-status:in-progress label="In progress" count=13 tone="text-[#d4a300]" icon=ConductorProgressIcon hostCounts={local:8 ssh:gpu-vm:4 runtime:env-1:1} hostIds={local:[orca::/w/feat-a,lab::/w/gitlab-mr,orca::/orca,orca::/w/feat-c,ext::/ext,lab::/lab,shared::/w/same] ssh:gpu-vm:[orca-ssh::/w/remote-x,orca-ssh::/orca-ssh,shared::/w/same] runtime:env-1:[api::/api]} ids=[orca::/w/feat-a,orca-ssh::/w/remote-x,lab::/w/gitlab-mr,orca::/orca,orca::/w/feat-c,api::/api,ext::/ext,lab::/lab,orca-ssh::/orca-ssh,shared::/w/same,shared::/w/same] @@ -415,7 +415,7 @@ cmd1-9 mounted: 1=orca::/w/feat-a#lineage:orca::/w/feat-a 2=orca-ssh::/w/remote- cmd1-9 unmounted: 1=orca::/w/feat-a 2=orca-ssh::/w/remote-x@ssh:gpu-vm 3=orca::/orca 4=orca::/w/feat-c 5=api::/api@runtime:env-1 6=ext::/ext 7=lab::/lab 8=orca-ssh::/orca-ssh 9=shared::/w/same@local cmd ids unmounted: orca::/w/feat-a orca-ssh::/w/remote-x orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same folder:fw-notes folder:fw-remote orca::/w/Zeta api::/w/api-y === sort=smart groupBy=pr-status pinnedInGroups=false === -visible: orca::/w/Zeta api::/w/api-y orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same +visible: orca::/w/Zeta orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr api::/w/api-y orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same PENDING key=pending:creation-1 creation=creation-1 repo=api HEADER key=pinned label="Pinned" count=6 tone="text-foreground" icon=Pin hostCounts={local:4 ssh:gpu-vm:2} hostIds={local:[orca::/w/feat-a,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c] ssh:gpu-vm:[orca-ssh::/w/remote-x,shared::/w/same]} ids=[orca::/w/feat-a,orca-ssh::/w/remote-x,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c,shared::/w/same] ITEM rowKey=pinned:|orca::/w/feat-a depth=0 groupDepth=0 children=2 lineageKey=lineage:orca::/w/feat-a hostLabel="Local Linux" placement=pinned owning=project:p-orca @@ -445,7 +445,7 @@ cmd1-9 mounted: 1=orca::/w/feat-a#lineage:orca::/w/feat-a 2=lab::/w/gitlab-mr 3= cmd1-9 unmounted: 1=orca::/w/feat-a 2=lab::/w/gitlab-mr 3=orca::/w/feat-b 4=orca::/w/feat-c 5=orca-ssh::/w/remote-x@ssh:gpu-vm 6=shared::/w/same@ssh:gpu-vm 7=api::/w/api-y@runtime:env-1 8=shared::/w/same@local 9=orca::/orca cmd ids unmounted: orca::/w/feat-a lab::/w/gitlab-mr orca::/w/feat-b orca::/w/feat-c orca-ssh::/w/remote-x shared::/w/same api::/w/api-y orca::/orca api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh folder:fw-review folder:fw-notes folder:fw-remote orca::/w/Zeta -- collapsed: pinned pr:in-progress lineage:orca::/w/feat-a -- -visible: orca::/w/Zeta api::/w/api-y orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same +visible: orca::/w/Zeta orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr api::/w/api-y orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same PENDING key=pending:creation-1 creation=creation-1 repo=api HEADER key=pinned label="Pinned" count=6 tone="text-foreground" icon=Pin hostCounts={local:4 ssh:gpu-vm:2} hostIds={local:[orca::/w/feat-a,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c] ssh:gpu-vm:[orca-ssh::/w/remote-x,shared::/w/same]} ids=[orca::/w/feat-a,orca-ssh::/w/remote-x,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c,shared::/w/same] HEADER key=pr:in-review label="In review" count=1 tone="text-workspace-status-review" icon=ConductorReviewIcon hostCounts={runtime:env-1:1} hostIds={runtime:env-1:[api::/w/api-y]} ids=[api::/w/api-y] @@ -462,7 +462,7 @@ cmd1-9 mounted: 1=api::/w/api-y@runtime:env-1 2=orca::/w/Zeta cmd1-9 unmounted: 1=api::/w/api-y@runtime:env-1 2=orca::/w/Zeta cmd ids unmounted: api::/w/api-y orca::/w/Zeta === sort=smart groupBy=pr-status pinnedInGroups=true === -visible: orca::/w/Zeta api::/w/api-y orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same +visible: orca::/w/Zeta orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr api::/w/api-y orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same PENDING key=pending:creation-1 creation=creation-1 repo=api HEADER key=pinned label="Pinned" count=6 tone="text-foreground" icon=Pin hostCounts={local:4 ssh:gpu-vm:2} hostIds={local:[orca::/w/feat-a,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c] ssh:gpu-vm:[orca-ssh::/w/remote-x,shared::/w/same]} ids=[orca::/w/feat-a,orca-ssh::/w/remote-x,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c,shared::/w/same] ITEM rowKey=pinned:|orca::/w/feat-a depth=0 groupDepth=0 children=2 lineageKey=lineage:orca::/w/feat-a hostLabel="Local Linux" placement=pinned owning=project:p-orca @@ -473,9 +473,9 @@ ITEM rowKey=pinned:ssh:gpu-vm|orca-ssh::/w/remote-x depth=0 groupDepth=0 childre ITEM rowKey=pinned:ssh:gpu-vm|shared::/w/same depth=0 groupDepth=0 lastChild=true children=0 hostLabel="GPU VM" placement=pinned owning=project:repo:shared HEADER key=pr:done label="Done" count=1 tone="text-workspace-status-done" icon=ConductorDoneIcon hostCounts={local:1} hostIds={local:[orca::/w/feat-b]} ids=[orca::/w/feat-b] ITEM rowKey=pr:done:|orca::/w/feat-b depth=0 groupDepth=0 lastChild=true children=0 hostLabel="Local Linux" placement=natural owning=project:p-orca -HEADER key=pr:in-review label="In review" count=2 tone="text-workspace-status-review" icon=ConductorReviewIcon hostCounts={runtime:env-1:1 local:1} hostIds={runtime:env-1:[api::/w/api-y] local:[orca::/w/feat-a]} ids=[api::/w/api-y,orca::/w/feat-a] -ITEM rowKey=pr:in-review:runtime:env-1|api::/w/api-y depth=0 groupDepth=0 children=0 hostLabel="env-1" placement=natural owning=project:repo:api -ITEM rowKey=pr:in-review:|orca::/w/feat-a depth=0 groupDepth=0 lastChild=true children=0 hostLabel="Local Linux" placement=natural owning=project:p-orca +HEADER key=pr:in-review label="In review" count=2 tone="text-workspace-status-review" icon=ConductorReviewIcon hostCounts={local:1 runtime:env-1:1} hostIds={local:[orca::/w/feat-a] runtime:env-1:[api::/w/api-y]} ids=[orca::/w/feat-a,api::/w/api-y] +ITEM rowKey=pr:in-review:|orca::/w/feat-a depth=0 groupDepth=0 children=0 hostLabel="Local Linux" placement=natural owning=project:p-orca +ITEM rowKey=pr:in-review:runtime:env-1|api::/w/api-y depth=0 groupDepth=0 lastChild=true children=0 hostLabel="env-1" placement=natural owning=project:repo:api HEADER key=pr:in-progress label="In progress" count=13 tone="text-workspace-status-progress" icon=ConductorProgressIcon hostCounts={ssh:gpu-vm:4 local:8 runtime:env-1:1} hostIds={ssh:gpu-vm:[orca-ssh::/w/remote-x,orca-ssh::/orca-ssh,shared::/w/same] local:[lab::/w/gitlab-mr,orca::/orca,orca::/w/feat-c,ext::/ext,lab::/lab,shared::/w/same] runtime:env-1:[api::/api]} ids=[orca-ssh::/w/remote-x,lab::/w/gitlab-mr,orca::/orca,orca::/w/feat-c,api::/api,ext::/ext,lab::/lab,orca-ssh::/orca-ssh,shared::/w/same,shared::/w/same] ITEM rowKey=pr:in-progress:ssh:gpu-vm|orca-ssh::/w/remote-x depth=0 groupDepth=0 children=0 hostLabel="GPU VM" placement=natural owning=project:p-orca ITEM rowKey=pr:in-progress:|lab::/w/gitlab-mr depth=0 groupDepth=0 children=0 hostLabel="Local Linux" placement=natural owning=project:repo:lab @@ -500,17 +500,17 @@ PREFERRED ssh:gpu-vm|orca-ssh::/w/remote-x -> pr:in-progress:ssh:gpu-vm|orca-ssh PREFERRED ssh:gpu-vm|shared::/w/same -> pr:in-progress:ssh:gpu-vm|shared::/w/same renderedKeys: 32 placeholders: - -selectionOrder: |orca::/w/feat-b runtime:env-1|api::/w/api-y |orca::/w/feat-a ssh:gpu-vm|orca-ssh::/w/remote-x |lab::/w/gitlab-mr |orca::/orca |orca::/w/feat-c runtime:env-1|api::/api |ext::/ext |lab::/lab |orca-ssh::/orca-ssh local|shared::/w/same ssh:gpu-vm|shared::/w/same local|folder:fw-review local|folder:fw-notes ssh:gpu-vm|folder:fw-remote |orca::/w/Zeta -cmd1-9 mounted: 1=orca::/w/feat-b#lineage:orca::/w/feat-b 2=api::/w/api-y@runtime:env-1 3=orca::/w/feat-a#lineage:orca::/w/feat-a 4=orca-ssh::/w/remote-x@ssh:gpu-vm 5=lab::/w/gitlab-mr 6=orca::/orca 7=orca::/w/feat-c 8=api::/api@runtime:env-1 9=ext::/ext -cmd1-9 unmounted: 1=orca::/w/feat-b 2=api::/w/api-y@runtime:env-1 3=orca::/w/feat-a 4=orca-ssh::/w/remote-x@ssh:gpu-vm 5=lab::/w/gitlab-mr 6=orca::/orca 7=orca::/w/feat-c 8=api::/api@runtime:env-1 9=ext::/ext -cmd ids unmounted: orca::/w/feat-b api::/w/api-y orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same folder:fw-review folder:fw-notes folder:fw-remote orca::/w/Zeta +selectionOrder: |orca::/w/feat-b |orca::/w/feat-a runtime:env-1|api::/w/api-y ssh:gpu-vm|orca-ssh::/w/remote-x |lab::/w/gitlab-mr |orca::/orca |orca::/w/feat-c runtime:env-1|api::/api |ext::/ext |lab::/lab |orca-ssh::/orca-ssh local|shared::/w/same ssh:gpu-vm|shared::/w/same local|folder:fw-review local|folder:fw-notes ssh:gpu-vm|folder:fw-remote |orca::/w/Zeta +cmd1-9 mounted: 1=orca::/w/feat-b#lineage:orca::/w/feat-b 2=orca::/w/feat-a#lineage:orca::/w/feat-a 3=api::/w/api-y@runtime:env-1 4=orca-ssh::/w/remote-x@ssh:gpu-vm 5=lab::/w/gitlab-mr 6=orca::/orca 7=orca::/w/feat-c 8=api::/api@runtime:env-1 9=ext::/ext +cmd1-9 unmounted: 1=orca::/w/feat-b 2=orca::/w/feat-a 3=api::/w/api-y@runtime:env-1 4=orca-ssh::/w/remote-x@ssh:gpu-vm 5=lab::/w/gitlab-mr 6=orca::/orca 7=orca::/w/feat-c 8=api::/api@runtime:env-1 9=ext::/ext +cmd ids unmounted: orca::/w/feat-b orca::/w/feat-a api::/w/api-y orca-ssh::/w/remote-x lab::/w/gitlab-mr orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same folder:fw-review folder:fw-notes folder:fw-remote orca::/w/Zeta -- collapsed: pinned pr:in-review pr:closed lineage:orca::/w/feat-a -- -visible: orca::/w/Zeta api::/w/api-y orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same +visible: orca::/w/Zeta orca::/w/feat-a orca-ssh::/w/remote-x lab::/w/gitlab-mr api::/w/api-y orca::/w/feat-b orca::/orca orca::/w/feat-c api::/api ext::/ext lab::/lab orca-ssh::/orca-ssh shared::/w/same shared::/w/same PENDING key=pending:creation-1 creation=creation-1 repo=api HEADER key=pinned label="Pinned" count=6 tone="text-foreground" icon=Pin hostCounts={local:4 ssh:gpu-vm:2} hostIds={local:[orca::/w/feat-a,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c] ssh:gpu-vm:[orca-ssh::/w/remote-x,shared::/w/same]} ids=[orca::/w/feat-a,orca-ssh::/w/remote-x,lab::/w/gitlab-mr,orca::/w/feat-b,orca::/w/feat-c,shared::/w/same] HEADER key=pr:done label="Done" count=1 tone="text-workspace-status-done" icon=ConductorDoneIcon hostCounts={local:1} hostIds={local:[orca::/w/feat-b]} ids=[orca::/w/feat-b] ITEM rowKey=pr:done:|orca::/w/feat-b depth=0 groupDepth=0 lastChild=true children=0 hostLabel="Local Linux" placement=natural owning=project:p-orca -HEADER key=pr:in-review label="In review" count=2 tone="text-workspace-status-review" icon=ConductorReviewIcon hostCounts={runtime:env-1:1 local:1} hostIds={runtime:env-1:[api::/w/api-y] local:[orca::/w/feat-a]} ids=[api::/w/api-y,orca::/w/feat-a] +HEADER key=pr:in-review label="In review" count=2 tone="text-workspace-status-review" icon=ConductorReviewIcon hostCounts={local:1 runtime:env-1:1} hostIds={local:[orca::/w/feat-a] runtime:env-1:[api::/w/api-y]} ids=[orca::/w/feat-a,api::/w/api-y] HEADER key=pr:in-progress label="In progress" count=13 tone="text-workspace-status-progress" icon=ConductorProgressIcon hostCounts={ssh:gpu-vm:4 local:8 runtime:env-1:1} hostIds={ssh:gpu-vm:[orca-ssh::/w/remote-x,orca-ssh::/orca-ssh,shared::/w/same] local:[lab::/w/gitlab-mr,orca::/orca,orca::/w/feat-c,ext::/ext,lab::/lab,shared::/w/same] runtime:env-1:[api::/api]} ids=[orca-ssh::/w/remote-x,lab::/w/gitlab-mr,orca::/orca,orca::/w/feat-c,api::/api,ext::/ext,lab::/lab,orca-ssh::/orca-ssh,shared::/w/same,shared::/w/same] ITEM rowKey=pr:in-progress:ssh:gpu-vm|orca-ssh::/w/remote-x depth=0 groupDepth=0 children=0 hostLabel="GPU VM" placement=natural owning=project:p-orca ITEM rowKey=pr:in-progress:|lab::/w/gitlab-mr depth=0 groupDepth=0 children=0 hostLabel="Local Linux" placement=natural owning=project:repo:lab @@ -527,7 +527,7 @@ FOLDER key=folder-workspace:fw-notes projectGroup=pg-folders depth=0 groupDepth= FOLDER key=folder-workspace:fw-remote projectGroup=pg-remote-folders depth=0 groupDepth=0 HEADER key=pr:closed label="Closed" count=1 tone="text-zinc-600 dark:text-zinc-300" icon=CircleX hostCounts={local:1} hostIds={local:[orca::/w/Zeta]} ids=[orca::/w/Zeta] SECTION pinned: pinned:|orca::/w/feat-a pinned:|lab::/w/gitlab-mr pinned:|orca::/w/feat-b pinned:|orca::/w/feat-c pinned:ssh:gpu-vm|orca-ssh::/w/remote-x pinned:ssh:gpu-vm|shared::/w/same -SECTION pr:in-review: pr:in-review:runtime:env-1|api::/w/api-y pr:in-review:|orca::/w/feat-a +SECTION pr:in-review: pr:in-review:|orca::/w/feat-a pr:in-review:runtime:env-1|api::/w/api-y SECTION pr:closed: pr:closed:|orca::/w/Zeta PREFERRED |orca::/w/feat-a -> pr:in-review:|orca::/w/feat-a PREFERRED |lab::/w/gitlab-mr -> pr:in-progress:|lab::/w/gitlab-mr diff --git a/src/renderer/src/components/sidebar/sidebar-list-goldens-stamp-order.test.tsx b/src/renderer/src/components/sidebar/sidebar-list-goldens-stamp-order.test.tsx index 7cf8fd0a335..f85c3e88e2a 100644 --- a/src/renderer/src/components/sidebar/sidebar-list-goldens-stamp-order.test.tsx +++ b/src/renderer/src/components/sidebar/sidebar-list-goldens-stamp-order.test.tsx @@ -27,12 +27,12 @@ const GOLDEN_DIR = './__goldens__/sidebar-list-stamp-order' defineSidebarListGoldens(GOLDEN_DIR) -// One row per tier and tie: two Done rows a second apart, two Working rows (the older one resumed -// after an approval keeps the ask's time), and Rest rows that only Recent orders. -const TIERS: Record = { +// One row per tier and tie: an unread Done and a seen one (which rests), two Working rows (the +// older one resumed after an approval keeps the ask's time), and Rest rows that only Recent orders. +const TIERS: Record = { Zeta: { smartTier: 'needs-you', smartAt: GOLDEN_NOW - 600_000 }, - 'feat-a': { smartTier: 'done', smartAt: GOLDEN_NOW - 60_000 }, - 'api-y': { smartTier: 'done', smartAt: GOLDEN_NOW - 59_000 }, + 'feat-a': { smartTier: 'done', smartAt: GOLDEN_NOW - 60_000, isUnread: true }, + 'api-y': { smartTier: 'done', smartAt: GOLDEN_NOW - 59_000, isUnread: false }, 'remote-x': { smartTier: 'working', smartAt: GOLDEN_NOW - 30_000 }, 'gitlab-mr': { smartTier: 'working', smartAt: GOLDEN_NOW - 900_000 } } diff --git a/src/renderer/src/components/sidebar/worktree-list/listing/use-sort-order-stamps.test.tsx b/src/renderer/src/components/sidebar/worktree-list/listing/use-sort-order-stamps.test.tsx index f5cebb189a3..f016c6d94d4 100644 --- a/src/renderer/src/components/sidebar/worktree-list/listing/use-sort-order-stamps.test.tsx +++ b/src/renderer/src/components/sidebar/worktree-list/listing/use-sort-order-stamps.test.tsx @@ -86,4 +86,25 @@ describe('useSidebarWorktreeSortOrder with the switch on', () => { rerender({ map: maps.after }) expect(result.current).toEqual([z.id, a.id]) }) + + it('a Done row drops to the rest once its workspace is read', () => { + const done = makeWorktree(`${repo.id}::/done`, 'done', { + repoId: repo.id, + lastActivityAt: 5, + smartTier: 'done', + smartAt: 5, + isUnread: true + }) + const working = makeWorktree(`${repo.id}::/working`, 'working', { + repoId: repo.id, + lastActivityAt: 1, + smartTier: 'working', + smartAt: 1 + }) + useAppStore.setState({ worktreesByRepo: { [repo.id]: [done, working] } }) + const { result } = renderHook(() => useSidebarWorktreeSortOrder({ repoMap, sortBy: 'smart' })) + expect(result.current).toEqual([done.id, working.id]) + setRows([{ ...done, isUnread: false }, working]) + expect(result.current).toEqual([working.id, done.id]) + }) }) diff --git a/src/shared/sidebar-list/stamp-order-scenarios.test.ts b/src/shared/sidebar-list/stamp-order-scenarios.test.ts index 00a33d00a5a..39477deacb3 100644 --- a/src/shared/sidebar-list/stamp-order-scenarios.test.ts +++ b/src/shared/sidebar-list/stamp-order-scenarios.test.ts @@ -17,18 +17,25 @@ import { compareSmartStamps, recentStamp } from './stamp-order' * Every row of the before/after table in the sort-stamps design note, replayed through the host's * classifier and the stamp order every client sorts by. */ -type Row = { id: string; stamps: SortStamps; pane: AgentPaneState } +type Row = { id: string; stamps: SortStamps; pane: AgentPaneState; unread: boolean } const T0 = 10_000_000 class Host { readonly rows = new Map() now = T0 + /** The workspace on screen: a finish there is seen, so it raises no unread flag. */ + openId: string | null = null constructor(ids: string[]) { // Older rows were touched earlier: b before a, c before b, ... ids.forEach((id, index) => { - this.rows.set(id, { id, stamps: { recentAt: T0 - (index + 1) * 60_000 }, pane: REST_PANE }) + this.rows.set(id, { + id, + stamps: { recentAt: T0 - (index + 1) * 60_000 }, + pane: REST_PANE, + unread: false + }) }) } @@ -44,6 +51,15 @@ class Host { } this.apply(row, { kind: 'agent', from: row.pane.phase, to: pane.phase, panes: [pane] }) row.pane = pane + if (pane.phase === 'done' && id !== this.openId) { + row.unread = true + } + } + + /** Opening a workspace clears its unread flag, as the window does. */ + open(id: string): void { + this.openId = id + this.rows.get(id)!.unread = false } bell(id: string): void { @@ -52,7 +68,7 @@ class Host { create(id: string): void { // Creation writes the first Recent stamp on the new record. - this.rows.set(id, { id, stamps: { recentAt: this.now }, pane: REST_PANE }) + this.rows.set(id, { id, stamps: { recentAt: this.now }, pane: REST_PANE, unread: false }) } order(sortBy: WorkspaceSortBy): string[] { @@ -76,7 +92,8 @@ function view(row: Row) { return { lastActivityAt: row.stamps.recentAt, smartTier: row.stamps.smartTier, - smartAt: row.stamps.smartAt + smartAt: row.stamps.smartAt, + isUnread: row.unread } } @@ -97,25 +114,55 @@ describe('sort stamps: the design note’s before/after table', () => { expect(both(host)).toEqual(before) }) - it('an agent finishing a turn tops Recent and Done at once, and stays until the next prompt', () => { + it('a finish tops Recent and Done at once; Done holds while unread, with no fade', () => { const host = new Host(['a', 'b', 'c']) + host.agent('a', 'working') + host.advance(20_000) host.agent('c', 'working') host.advance(20_000) host.agent('c', 'done') expect(both(host)).toEqual({ recent: ['c', 'a', 'b'], smart: ['c', 'a', 'b'] }) - // No fade: Done holds after any time without an event (owner decision Q1). + // No fade: an unread Done holds after any time without an event. host.advance(3 * 60 * 60_000) expect(host.order('smart')).toEqual(['c', 'a', 'b']) }) - it('a finish in the open workspace moves it the same way; opening never stamps', () => { + it('opening the finished workspace ends Done; it rests by Recent (owner decision Q1)', () => { + const host = new Host(['a', 'b', 'c']) + host.agent('a', 'working') + host.advance(20_000) + host.agent('c', 'working') + host.advance(20_000) + host.agent('c', 'done') + host.open('c') + // Working a now outranks c, which leads the rest by its Recent stamp. + expect(both(host)).toEqual({ recent: ['c', 'a', 'b'], smart: ['a', 'c', 'b'] }) + }) + + it('the next prompt ends Done: the row moves to Working', () => { + const host = new Host(['a', 'b', 'c']) + host.agent('a', 'working') + host.advance(20_000) + host.agent('c', 'working') + host.advance(20_000) + host.agent('c', 'done') + host.advance(20_000) + host.agent('c', 'working') + expect(host.rows.get('c')!.stamps.smartTier).toBe('working') + expect(host.order('smart')).toEqual(['c', 'a', 'b']) + }) + + it('a finish in the open workspace is seen: top of Recent, never Done; opening never stamps', () => { const host = new Host(['a', 'b']) + host.agent('a', 'working') + host.open('b') // Opening b is not an event, so nothing changes until its agent finishes. expect(both(host)).toEqual({ recent: ['a', 'b'], smart: ['a', 'b'] }) + host.advance(20_000) host.agent('b', 'working') host.advance(20_000) host.agent('b', 'done') - expect(both(host)).toEqual({ recent: ['b', 'a'], smart: ['b', 'a'] }) + expect(both(host)).toEqual({ recent: ['b', 'a'], smart: ['a', 'b'] }) }) it('an agent asking for approval tops Needs you at once', () => { diff --git a/src/shared/sidebar-list/stamp-order.test.ts b/src/shared/sidebar-list/stamp-order.test.ts index 5d46911662c..7053f8f8432 100644 --- a/src/shared/sidebar-list/stamp-order.test.ts +++ b/src/shared/sidebar-list/stamp-order.test.ts @@ -8,13 +8,13 @@ function sortSmart(rows: Record): string[] { } describe('stamp order', () => { - it('ranks Needs you, Done, Working, then Rest, each newest first', () => { + it('ranks Needs you, unread Done, Working, then Rest, each newest first', () => { expect( sortSmart({ rest: { lastActivityAt: 900 }, working: { lastActivityAt: 1, smartTier: 'working', smartAt: 50 }, - doneOld: { lastActivityAt: 1, smartTier: 'done', smartAt: 10 }, - doneNew: { lastActivityAt: 1, smartTier: 'done', smartAt: 20 }, + doneOld: { lastActivityAt: 1, smartTier: 'done', smartAt: 10, isUnread: true }, + doneNew: { lastActivityAt: 1, smartTier: 'done', smartAt: 20, isUnread: true }, needsYou: { lastActivityAt: 1, smartTier: 'needs-you', smartAt: 5 }, restOld: { lastActivityAt: 100 } }) @@ -40,9 +40,21 @@ describe('stamp order', () => { it('ties within a tier fall to Recent', () => { expect( sortSmart({ - older: { lastActivityAt: 1, smartTier: 'done', smartAt: 5 }, - newer: { lastActivityAt: 2, smartTier: 'done', smartAt: 5 } + older: { lastActivityAt: 1, smartTier: 'done', smartAt: 5, isUnread: true }, + newer: { lastActivityAt: 2, smartTier: 'done', smartAt: 5, isUnread: true } }) ).toEqual(['newer', 'older']) }) + + it('a Done you have seen rests by Recent, below Working (owner decision Q1)', () => { + expect( + sortSmart({ + seen: { lastActivityAt: 30, smartTier: 'done', smartAt: 30, isUnread: false }, + working: { lastActivityAt: 1, smartTier: 'working', smartAt: 1 }, + quiet: { lastActivityAt: 20 }, + // An older row without the flag reads as seen. + noFlag: { lastActivityAt: 10, smartTier: 'done', smartAt: 40 } + }) + ).toEqual(['working', 'seen', 'quiet', 'noFlag']) + }) }) diff --git a/src/shared/sidebar-list/stamp-order.ts b/src/shared/sidebar-list/stamp-order.ts index 8d3adba89e8..9c1445eddb9 100644 --- a/src/shared/sidebar-list/stamp-order.ts +++ b/src/shared/sidebar-list/stamp-order.ts @@ -5,6 +5,8 @@ export type StampOrderRow = { lastActivityAt?: number smartTier?: SmartTier smartAt?: number + /** The workspace unread flag: an agent finished while you were not looking. */ + isUnread?: boolean } const TIER_RANK: Record = { 'needs-you': 0, done: 1, working: 2 } @@ -19,12 +21,16 @@ export function recentStamp(row: StampOrderRow): number { return finiteOr0(row.lastActivityAt) } -// A tier a newer host knows and this client does not reads as Rest. +// A tier a newer host knows and this client does not reads as Rest. Done holds only while unread: +// opening the workspace clears the flag, and the next prompt moves the tier to Working. function tierRank(row: StampOrderRow): number { - return isSmartTier(row.smartTier) ? TIER_RANK[row.smartTier] : REST_RANK + if (!isSmartTier(row.smartTier) || (row.smartTier === 'done' && row.isUnread !== true)) { + return REST_RANK + } + return TIER_RANK[row.smartTier] } -/** Smart by stamps: Needs you, Done, Working, each newest first; then Rest by Recent. */ +/** Smart by stamps: Needs you, unread Done, Working, each newest first; then Rest by Recent. */ export function compareSmartStamps(a: StampOrderRow, b: StampOrderRow): number { const rankA = tierRank(a) const rankB = tierRank(b)