Skip to content

Commit 821ad5d

Browse files
fix: 修复服务器的路径问题
1 parent 0f86c66 commit 821ad5d

13 files changed

Lines changed: 729 additions & 11 deletions

File tree

packages/remote-control-server/src/__tests__/routes.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,7 @@ describe("Web Session Routes", () => {
506506
expect(res.status).toBe(401);
507507
});
508508

509-
test("GET /web/sessions/all — lists all sessions", async () => {
509+
test("GET /web/sessions/all — lists only sessions owned by requesting UUID", async () => {
510510
// Create 2 sessions via different users
511511
await app.request("/web/sessions?uuid=user-1", {
512512
method: "POST",
@@ -522,7 +522,7 @@ describe("Web Session Routes", () => {
522522
const allRes = await app.request("/web/sessions/all?uuid=user-1");
523523
expect(allRes.status).toBe(200);
524524
const sessions = await allRes.json();
525-
expect(sessions).toHaveLength(2);
525+
expect(sessions).toHaveLength(1); // only user-1's session, not user-2's
526526
});
527527

528528
test("GET /web/sessions/:id — returns owned session", async () => {

packages/remote-control-server/src/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,9 @@ app.route("/v1/environments", v1EnvironmentsWork);
5353
// v1 Session routes
5454
app.route("/v1/sessions", v1Sessions);
5555

56-
// v1 Session Ingress (WebSocket)
56+
// Session Ingress (WebSocket) — mounted at both /v1 and /v2 so the bridge
57+
// client's buildSdkUrl works with or without an Envoy proxy rewriting /v1→/v2.
58+
app.route("/v1/session_ingress", v1SessionIngress);
5759
app.route("/v2/session_ingress", v1SessionIngress);
5860

5961
// v2 Code Sessions routes

packages/remote-control-server/src/routes/web/sessions.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { Hono } from "hono";
22
import { uuidAuth } from "../../auth/middleware";
3-
import { listSessionSummaries, getSession, createSession } from "../../services/session";
3+
import { getSession, createSession } from "../../services/session";
44
import { storeListSessionsByOwnerUuid, storeIsSessionOwner, storeBindSession } from "../../store";
55
import { createWorkItem } from "../../services/work-dispatch";
6+
import { listSessionSummariesByOwnerUuid } from "../../services/session";
67
import { createSSEStream } from "../../transport/sse-writer";
78
import { getEventBus } from "../../transport/event-bus";
89

@@ -41,9 +42,10 @@ app.get("/sessions", uuidAuth, async (c) => {
4142
return c.json(sessions, 200);
4243
});
4344

44-
/** GET /web/sessions/all — List ALL sessions (for dashboard discovery, no UUID filter) */
45+
/** GET /web/sessions/all — List sessions owned by the requesting UUID (unowned sessions excluded) */
4546
app.get("/sessions/all", uuidAuth, async (c) => {
46-
const sessions = listSessionSummaries();
47+
const uuid = c.get("uuid");
48+
const sessions = listSessionSummariesByOwnerUuid(uuid);
4749
return c.json(sessions, 200);
4850
});
4951

packages/remote-control-server/src/services/session.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
storeListSessions,
66
storeListSessionsByUsername,
77
storeListSessionsByEnvironment,
8+
storeListSessionsByOwnerUuid,
89
} from "../store";
910
import { removeEventBus } from "../transport/event-bus";
1011
import type { CreateSessionRequest, CreateCodeSessionRequest, SessionResponse, SessionSummaryResponse } from "../types/api";
@@ -89,6 +90,10 @@ export function listSessionSummaries(): SessionSummaryResponse[] {
8990
return storeListSessions().map(toSummaryResponse);
9091
}
9192

93+
export function listSessionSummariesByOwnerUuid(uuid: string): SessionSummaryResponse[] {
94+
return storeListSessionsByOwnerUuid(uuid).map(toSummaryResponse);
95+
}
96+
9297
export function listSessionSummariesByUsername(username: string): SessionSummaryResponse[] {
9398
return storeListSessionsByUsername(username).map(toSummaryResponse);
9499
}

packages/remote-control-server/web/app.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import { getUuid, setUuid, apiBind, apiFetchSessions, apiFetchAllSessions, apiFetchEnvironments, apiFetchSession, apiFetchSessionHistory, apiSendEvent, apiSendControl, apiInterrupt, apiCreateSession } from "./api.js";
66
import { connectSSE, disconnectSSE } from "./sse.js";
77
import { appendEvent, renderPermissionRequest, showLoading, isLoading, resetReplayState, renderReplayPendingRequests } from "./render.js";
8+
import { initTaskPanel, toggleTaskPanel, resetTaskState } from "./task-panel.js";
89
import { esc, formatTime, statusClass } from "./utils.js";
910

1011
// ============================================================
@@ -159,6 +160,12 @@ function stopDashboardRefresh() {
159160

160161
async function renderSessionDetail(id) {
161162
currentSessionId = id;
163+
164+
// Reset task state for new session and init panel
165+
resetTaskState();
166+
const taskPanelEl = document.getElementById("task-panel");
167+
if (taskPanelEl) initTaskPanel(taskPanelEl);
168+
162169
try {
163170
const session = await apiFetchSession(id);
164171
document.getElementById("session-title").textContent = session.title || session.id;
@@ -586,6 +593,18 @@ function setupIdentityPanel() {
586593
});
587594
}
588595

596+
// ============================================================
597+
// Task Panel Toggle
598+
// ============================================================
599+
600+
function setupTaskPanelToggle() {
601+
window.__toggleTaskPanel = toggleTaskPanel;
602+
const toggleBtn = document.getElementById("task-panel-toggle");
603+
if (toggleBtn) {
604+
toggleBtn.addEventListener("click", () => toggleTaskPanel());
605+
}
606+
}
607+
589608
// ============================================================
590609
// Init
591610
// ============================================================
@@ -594,5 +613,6 @@ document.addEventListener("DOMContentLoaded", () => {
594613
setupControlBar();
595614
setupNewSessionDialog();
596615
setupIdentityPanel();
616+
setupTaskPanelToggle();
597617
handleRoute();
598618
});

packages/remote-control-server/web/index.html

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ <h2 id="session-title" class="session-detail-title">Session</h2>
8383
<span id="session-status" class="status-badge"></span>
8484
<span id="session-env" class="meta-item"></span>
8585
<span id="session-time" class="meta-item"></span>
86+
<button id="task-panel-toggle" class="nav-link btn-text" title="Tasks & Todos">
87+
Tasks <span id="task-badge" class="task-count-badge hidden">0</span>
88+
</button>
8689
</div>
8790
</div>
8891
</div>
@@ -105,6 +108,9 @@ <h2 id="session-title" class="session-detail-title">Session</h2>
105108
</div>
106109
</section>
107110

111+
<!-- Task Panel -->
112+
<div id="task-panel" class="task-panel hidden"></div>
113+
108114
<!-- Identity Panel (QR display + scan) -->
109115
<div id="identity-panel" class="identity-panel hidden">
110116
<div class="identity-panel-inner">

packages/remote-control-server/web/render.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66

77
import { esc } from "./utils.js";
8+
import { processAssistantEvent } from "./task-panel.js";
89

910
// ============================================================
1011
// Replay state — tracks unresolved permission requests during history replay
@@ -111,6 +112,7 @@ export function appendEvent(data, { replay = false } = {}) {
111112
{
112113
const text = extractText(payload);
113114
if (text && text.trim()) histEl = renderAssistantMessage(payload);
115+
processAssistantEvent(payload);
114116
}
115117
break;
116118
case "tool_use":
@@ -170,11 +172,10 @@ export function appendEvent(data, { replay = false } = {}) {
170172
return;
171173
case "assistant":
172174
removeLoading();
173-
// Skip empty assistant messages
174175
{
175176
const text = extractText(payload);
176-
if (!text || !text.trim()) return;
177-
el = renderAssistantMessage(payload);
177+
if (text && text.trim()) el = renderAssistantMessage(payload);
178+
processAssistantEvent(payload);
178179
}
179180
break;
180181
case "result":

packages/remote-control-server/web/style.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
@import url('./components.css');
44
@import url('./pages.css');
55
@import url('./messages.css');
6+
@import url('./task-panel.css');

0 commit comments

Comments
 (0)