Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion FEATURE_MATRIX.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ OMP authority: `packages/coding-agent/src/session/agent-session.ts`, `session-ma

| Capability | Source command/state | Desktop behavior | T3 reference | Priority |
|---|---|---|---|---|
| List/recent/search/filter | session store and metadata | Bounded left rail; folder or flat organization; Priority, Last updated, or Manual order; title/folder/host search; attention/running/unread/error filters; pinned shortcuts; running/waiting/failed/unread badges | `Sidebar.tsx`, sidebar logic/tests | Launch |
| List/recent/search/filter | session store and metadata | Codex-parity left rail: By project or In one list; Priority, Last updated, or Manual order; real project/session dragging with keyboard fallbacks; title/project/host search; attention/running/unread/error filters; pinned shortcuts; five-row Show more; project aliases; reversible hidden projects; bulk read/archive; local-only Finder reveal; direct pin/archive controls | `Rail.tsx`, `session-tree.ts`, workspace store, management helpers, browser tests | Launch |
| New session | `/new` | Create in selected project/host; model/profile defaults visible before first prompt | draft routes and composer draft store | Launch |
| Fast switch and tabs | session IDs and snapshots | One-click/keyboard switch; preserve draft, scroll anchor, panel widths/tabs, terminal focus; no white flash | T3 routes, `composerDraftStore`, `rightPanelStore`, terminal store | Launch |
| Resume | `/resume` | Open existing session by stable ID/path; recover moved/missing files with explicit error | thread routing and reconnect supervisor | Launch |
Expand Down
2 changes: 1 addition & 1 deletion THIRD_PARTY_NOTICES.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ T3 Code is selectively referenced for future ports from https://github.com/pingd

## Oh My Pi

Future adaptations of OMP source use the OMP repository under its repository license. OMP remains runtime authority; adapted files retain OMP attribution and the applicable source license. The vendored `@oh-my-pi/app-wire@0.6.1` package is packed from the public `lyc-aon/oh-my-pi` integration commit `e3e15c03ae95ebbda5f26495cd21213cc53518b1`, source tree `e0f32b279eb4b8cbc403e47d765a226bee99c99f`; tarball SHA-256 `78ec6223e7ad0f4f9e14526a822eaa45b363c856065c08196b2817a2f42740b9`; golden corpus SHA-256 `d5e674095de3d9b3b56a5668bc91cbbf1904b409ea9ea6456c2eabdf272e7870`. Target integration commit is recorded in the Desktop commit history and compatibility matrix.
Future adaptations of OMP source use the OMP repository under its repository license. OMP remains runtime authority; adapted files retain OMP attribution and the applicable source license. The vendored `@oh-my-pi/app-wire@0.6.2` package is packed from the public `lyc-aon/oh-my-pi` integration commit `04229b1f46547ac7c0617e55a993496ec9725f46`, source tree `8400a3af618e8af11cccf6b20aadcf3a22baf9a1`; tarball SHA-256 `0f13659ebaabd284595558f023731723b928231bc82245f54ea25e79d00b6a6f`; golden corpus SHA-256 `d5e674095de3d9b3b56a5668bc91cbbf1904b409ea9ea6456c2eabdf272e7870`. Target integration commit is recorded in the Desktop commit history and compatibility matrix.

## Oh My Pi icon

Expand Down
6 changes: 3 additions & 3 deletions apps/desktop/test/bundled-runtime.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ describe("bundled OMP runtime", () => {
const sha256 = createHash("sha256").update(bytes).digest("hex");
await writeFile(join(runtimeRoot, "omp"), bytes);
await writeFile(join(runtimeRoot, "manifest.json"), JSON.stringify({
version: 1, tag: "t4code-17.0.5-appserver-6", platform: "darwin", arch: "arm64",
version: 1, tag: "t4code-17.0.5-appserver-7", platform: "darwin", arch: "arm64",
executable: "omp", size: bytes.length, sha256,
}));

Expand All @@ -35,7 +35,7 @@ describe("bundled OMP runtime", () => {
await mkdir(runtimeRoot, { recursive: true });
await writeFile(join(runtimeRoot, "omp"), "wrong");
await writeFile(join(runtimeRoot, "manifest.json"), JSON.stringify({
version: 1, tag: "t4code-17.0.5-appserver-6", platform: "darwin", arch: "arm64",
version: 1, tag: "t4code-17.0.5-appserver-7", platform: "darwin", arch: "arm64",
executable: "omp", size: 5, sha256: "0".repeat(64),
}));

Expand All @@ -58,7 +58,7 @@ describe("bundled OMP runtime", () => {
await writeFile(join(runtimeRoot, "omp"), signedBytes);
await writeFile(join(runtimeRoot, "manifest.json"), JSON.stringify({
version: 1,
tag: "t4code-17.0.5-appserver-6",
tag: "t4code-17.0.5-appserver-7",
platform: "darwin",
arch: "arm64",
executable: "omp",
Expand Down
4 changes: 2 additions & 2 deletions apps/desktop/test/doctor.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,9 @@ describe("T4 setup doctor", () => {
const source = await readSourceContract();

expect(source.ompVersion).toBe("17.0.5");
expect(source.ompTag).toBe("t4code-17.0.5-appserver-6");
expect(source.ompTag).toBe("t4code-17.0.5-appserver-7");
expect(source.ompUrl).toBe(
"https://github.com/lyc-aon/oh-my-pi/tree/t4code-17.0.5-appserver-6",
"https://github.com/lyc-aon/oh-my-pi/tree/t4code-17.0.5-appserver-7",
);
});

Expand Down
53 changes: 24 additions & 29 deletions apps/web/src/components/AppShell.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ export function AppShell() {
(state) => state.sessionManualOrderByProjectId,
);
const projectExpandedById = useWorkspace((state) => state.projectExpandedById);
const dismissedEmptyProjectIds = useWorkspace((state) => state.dismissedEmptyProjectIds);
const hiddenProjectIds = useWorkspace((state) => state.hiddenProjectIds);
const projectAliasById = useWorkspace((state) => state.projectAliasById);
const lastVisitedAtBySessionId = useWorkspace((state) => state.lastVisitedAtBySessionId);
const lastSeenAttentionOutcomeBySessionKey = useWorkspace(
(state) => state.lastSeenAttentionOutcomeBySessionKey,
Expand All @@ -58,20 +59,22 @@ export function AppShell() {
projectExpandedById,
lastVisitedAtBySessionId,
"current",
dismissedEmptyProjectIds,
hiddenProjectIds,
{
filter: railFilter,
query: railQuery,
sort: railSort,
projectManualOrder,
sessionManualOrderByProjectId,
projectAliasById,
},
),
[
shellData,
projectExpandedById,
lastVisitedAtBySessionId,
dismissedEmptyProjectIds,
hiddenProjectIds,
projectAliasById,
railFilter,
railQuery,
railSort,
Expand All @@ -93,6 +96,7 @@ export function AppShell() {
sort: railSort,
projectManualOrder,
sessionManualOrderByProjectId,
projectAliasById,
},
),
[
Expand All @@ -104,6 +108,7 @@ export function AppShell() {
railSort,
projectManualOrder,
sessionManualOrderByProjectId,
projectAliasById,
],
);
const allCurrentGroups = useMemo(
Expand All @@ -113,14 +118,14 @@ export function AppShell() {
projectExpandedById,
lastVisitedAtBySessionId,
"current",
dismissedEmptyProjectIds,
{ sort: railSort, projectManualOrder, sessionManualOrderByProjectId },
{},
{ sort: railSort, projectManualOrder, sessionManualOrderByProjectId, projectAliasById },
),
[
shellData,
projectExpandedById,
lastVisitedAtBySessionId,
dismissedEmptyProjectIds,
projectAliasById,
railSort,
projectManualOrder,
sessionManualOrderByProjectId,
Expand All @@ -134,7 +139,7 @@ export function AppShell() {
lastVisitedAtBySessionId,
"archived",
{},
{ sort: railSort, projectManualOrder, sessionManualOrderByProjectId },
{ sort: railSort, projectManualOrder, sessionManualOrderByProjectId, projectAliasById },
),
[
shellData,
Expand All @@ -143,6 +148,7 @@ export function AppShell() {
railSort,
projectManualOrder,
sessionManualOrderByProjectId,
projectAliasById,
],
);
const allSessionGroups = useMemo(
Expand All @@ -163,24 +169,10 @@ export function AppShell() {
}).urgentCount,
[lastSeenAttentionOutcomeBySessionKey, runtimeSnapshot],
);
const hiddenEmptyProjectIds = useMemo(() => {
const currentProjectIds = new Set(
shellData.sessions
.filter((session) => session.archivedAt === undefined)
.map((session) => session.projectId),
);
const hostById = new Map(shellData.hosts.map((host) => [host.id, host]));
return new Set(
shellData.projects
.filter(
(project) =>
dismissedEmptyProjectIds[project.id] === true &&
!currentProjectIds.has(project.id) &&
hostById.get(project.hostId)?.sessionInventoryTruncated !== true,
)
.map((project) => project.id),
);
}, [dismissedEmptyProjectIds, shellData]);
const hiddenProjectIdSet = useMemo(
() => new Set(Object.keys(hiddenProjectIds).filter((id) => hiddenProjectIds[id] === true)),
[hiddenProjectIds],
);

// Desktop mode: start the runtime once. StrictMode's doubled effect and
// HMR remounts are safe — start is idempotent on a global singleton.
Expand Down Expand Up @@ -250,13 +242,14 @@ export function AppShell() {
state.projectExpandedById,
state.lastVisitedAtBySessionId,
state.sessionListView,
state.dismissedEmptyProjectIds,
state.hiddenProjectIds,
{
filter: state.railFilter,
query: state.railQuery,
sort: state.railSort,
projectManualOrder: state.projectManualOrder,
sessionManualOrderByProjectId: state.sessionManualOrderByProjectId,
projectAliasById: state.projectAliasById,
},
),
);
Expand Down Expand Up @@ -319,7 +312,9 @@ export function AppShell() {
<div className="h-full" style={{ width: RAIL_COLLAPSED_WIDTH }}>
<CollapsedRail
attentionCount={attentionCount}
groups={allCurrentGroups}
groups={allCurrentGroups.filter(
(group) => !hiddenProjectIdSet.has(group.project.id),
)}
onExpand={(projectId) => {
const state = workspaceStore.getState();
state.setRailCollapsed(false);
Expand All @@ -335,7 +330,7 @@ export function AppShell() {
archivedCount={archivedCount}
currentCount={currentCount}
groups={groups}
hiddenEmptyProjectIds={hiddenEmptyProjectIds}
hiddenProjectIds={hiddenProjectIdSet}
nowMs={nowMs}
pinnedSessionGroups={allSessionGroups}
view={sessionListView}
Expand Down Expand Up @@ -391,7 +386,7 @@ export function AppShell() {
archivedCount={archivedCount}
currentCount={currentCount}
groups={groups}
hiddenEmptyProjectIds={hiddenEmptyProjectIds}
hiddenProjectIds={hiddenProjectIdSet}
nowMs={nowMs}
pinnedSessionGroups={allSessionGroups}
view={sessionListView}
Expand Down
Loading
Loading