@tom2012/cc-web 2026.4.26-a → 2026.4.26-b
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/backend/dist/adapters/claude/scheduled.d.ts +26 -21
- package/backend/dist/adapters/claude/scheduled.d.ts.map +1 -1
- package/backend/dist/adapters/claude/scheduled.js +175 -46
- package/backend/dist/adapters/claude/scheduled.js.map +1 -1
- package/frontend/dist/assets/{AssistantMessageContent-D4Wm1DYe.js → AssistantMessageContent-BBXSX58q.js} +1 -1
- package/frontend/dist/assets/{GraphPreview-BHFhL4fV.js → GraphPreview-BAnpFmtm.js} +1 -1
- package/frontend/dist/assets/{MobilePage-BbMYb_fT.js → MobilePage-BR1R_xht.js} +3 -3
- package/frontend/dist/assets/{OfficePreview-Dah62nhN.js → OfficePreview-C6EJB80i.js} +2 -2
- package/frontend/dist/assets/{ProjectPage-Bs5psd0R.js → ProjectPage-fWJrKu-y.js} +5 -5
- package/frontend/dist/assets/{SettingsPage-C6aUa7yV.js → SettingsPage-BxT6q4Fq.js} +1 -1
- package/frontend/dist/assets/{SkillHubPage-olcv0_pc.js → SkillHubPage-DJzYMG0j.js} +1 -1
- package/frontend/dist/assets/{chevron-down-CD91RjkB.js → chevron-down-CxmD4ySz.js} +1 -1
- package/frontend/dist/assets/{chevron-up-Dm_1T3Ta.js → chevron-up-BznxDhNi.js} +1 -1
- package/frontend/dist/assets/index-Big9FXD0.css +1 -0
- package/frontend/dist/assets/{index-BzIwL5mK.js → index-BptnURrX.js} +1 -1
- package/frontend/dist/assets/{index-CHdNhmuD.js → index-CxHOCf_s.js} +2 -2
- package/frontend/dist/assets/{index-BAXK8jaU.js → index-DwNsYVM3.js} +1 -1
- package/frontend/dist/assets/{jszip.min-COWU92WI.js → jszip.min-CfribT02.js} +1 -1
- package/frontend/dist/assets/{search-BxWnQMGo.js → search-BPzU-LtZ.js} +1 -1
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/frontend/dist/assets/index-ChWqp_e7.css +0 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
A self-hosted web application (distributed as npm package) that provides a browser-based interface for [Claude Code](https://docs.anthropic.com/en/docs/claude-code) CLI sessions. Create projects, each with a persistent terminal running Claude Code, and interact with them through a real-time terminal UI.
|
|
4
4
|
|
|
5
|
-
**Current version**: v2026.4.26-
|
|
5
|
+
**Current version**: v2026.4.26-b | [GitHub](https://github.com/zbc0315/cc-web) | MIT License
|
|
6
6
|
|
|
7
7
|
## Features
|
|
8
8
|
|
|
@@ -1,33 +1,38 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Claude Code CLI scheduled-tasks reader.
|
|
2
|
+
* Claude Code CLI scheduled-tasks reader (best-effort reconstruction).
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Claude Code provides NO official query API for active scheduled tasks
|
|
5
|
+
* (`ScheduleWakeup` / `CronCreate`). They live in CLI process memory unless
|
|
6
|
+
* created with `durable:true` (which is rare in practice). To give the user
|
|
7
|
+
* any visibility, we reconstruct the timeline by scanning the project's
|
|
8
|
+
* session JSONL files at `~/.claude/projects/<encoded>/<sessionId>.jsonl`,
|
|
9
|
+
* which record every `tool_use` Claude emits — including ScheduleWakeup
|
|
10
|
+
* and CronCreate.
|
|
6
11
|
*
|
|
7
|
-
*
|
|
8
|
-
* "
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
+
* Caveats this reconstruction cannot resolve:
|
|
13
|
+
* - We see "task created" events but cannot directly observe "task fired"
|
|
14
|
+
* or "task deleted/cancelled". For one-shot ScheduleWakeup we hide
|
|
15
|
+
* records whose `createdAt + delaySeconds` is already past (must have
|
|
16
|
+
* fired or been cancelled). For recurring CronCreate we keep entries
|
|
17
|
+
* created within the last 7 days (Claude's own auto-expiry window).
|
|
18
|
+
* - Same prompt scheduled across multiple sessions appears multiple
|
|
19
|
+
* times by design — that preserves provenance.
|
|
12
20
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* `~/.claude/scheduled_tasks.json` — that was wrong.
|
|
21
|
+
* The UI must label this list as "best-effort reconstruction", not the
|
|
22
|
+
* authoritative live state.
|
|
16
23
|
*/
|
|
17
|
-
export interface
|
|
24
|
+
export interface ScheduledTask {
|
|
18
25
|
id: string;
|
|
19
|
-
|
|
26
|
+
type: 'ScheduleWakeup' | 'CronCreate';
|
|
27
|
+
cron: string | null;
|
|
28
|
+
delaySeconds: number | null;
|
|
29
|
+
recurring: boolean;
|
|
20
30
|
prompt: string;
|
|
31
|
+
reason: string | null;
|
|
21
32
|
createdAt: number;
|
|
22
|
-
recurring?: boolean;
|
|
23
|
-
agentId?: string;
|
|
24
|
-
createdBySessionId?: string;
|
|
25
|
-
createdByPid?: number;
|
|
26
|
-
lastFiredAt?: number;
|
|
27
|
-
}
|
|
28
|
-
export interface ScheduledTask extends RawScheduledTask {
|
|
29
33
|
nextFireAt: string | null;
|
|
34
|
+
sessionId: string;
|
|
35
|
+
durable: boolean;
|
|
30
36
|
}
|
|
31
|
-
export declare function loadScheduledTasks(folderPath: string): RawScheduledTask[];
|
|
32
37
|
export declare function tasksForProject(folderPath: string): ScheduledTask[];
|
|
33
38
|
//# sourceMappingURL=scheduled.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduled.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude/scheduled.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"scheduled.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude/scheduled.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAaH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,gBAAgB,GAAG,YAAY,CAAC;IACtC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB;AA+HD,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,EAAE,CA6CnE"}
|
|
@@ -1,19 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Claude Code CLI scheduled-tasks reader.
|
|
3
|
+
* Claude Code CLI scheduled-tasks reader (best-effort reconstruction).
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* Claude Code provides NO official query API for active scheduled tasks
|
|
6
|
+
* (`ScheduleWakeup` / `CronCreate`). They live in CLI process memory unless
|
|
7
|
+
* created with `durable:true` (which is rare in practice). To give the user
|
|
8
|
+
* any visibility, we reconstruct the timeline by scanning the project's
|
|
9
|
+
* session JSONL files at `~/.claude/projects/<encoded>/<sessionId>.jsonl`,
|
|
10
|
+
* which record every `tool_use` Claude emits — including ScheduleWakeup
|
|
11
|
+
* and CronCreate.
|
|
7
12
|
*
|
|
8
|
-
*
|
|
9
|
-
* "
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
+
* Caveats this reconstruction cannot resolve:
|
|
14
|
+
* - We see "task created" events but cannot directly observe "task fired"
|
|
15
|
+
* or "task deleted/cancelled". For one-shot ScheduleWakeup we hide
|
|
16
|
+
* records whose `createdAt + delaySeconds` is already past (must have
|
|
17
|
+
* fired or been cancelled). For recurring CronCreate we keep entries
|
|
18
|
+
* created within the last 7 days (Claude's own auto-expiry window).
|
|
19
|
+
* - Same prompt scheduled across multiple sessions appears multiple
|
|
20
|
+
* times by design — that preserves provenance.
|
|
13
21
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* `~/.claude/scheduled_tasks.json` — that was wrong.
|
|
22
|
+
* The UI must label this list as "best-effort reconstruction", not the
|
|
23
|
+
* authoritative live state.
|
|
17
24
|
*/
|
|
18
25
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
19
26
|
if (k2 === undefined) k2 = k;
|
|
@@ -49,58 +56,180 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
49
56
|
};
|
|
50
57
|
})();
|
|
51
58
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
52
|
-
exports.loadScheduledTasks = loadScheduledTasks;
|
|
53
59
|
exports.tasksForProject = tasksForProject;
|
|
54
60
|
const fs = __importStar(require("fs"));
|
|
55
61
|
const path = __importStar(require("path"));
|
|
62
|
+
const os = __importStar(require("os"));
|
|
56
63
|
const cron_parser_1 = require("cron-parser");
|
|
57
64
|
const logger_1 = require("../../logger");
|
|
58
65
|
const log = (0, logger_1.modLogger)('scheduled');
|
|
59
|
-
|
|
60
|
-
|
|
66
|
+
const SEVEN_DAYS_MS = 7 * 86400 * 1000;
|
|
67
|
+
const PROMPT_PREVIEW_MAX = 4000;
|
|
68
|
+
function encodeProjectPath(folderPath) {
|
|
69
|
+
// Match Claude CLI's encoding (see claude-adapter.ts encodeProjectPath).
|
|
70
|
+
return folderPath.replace(/[\/ _]/g, '-');
|
|
61
71
|
}
|
|
62
|
-
function
|
|
63
|
-
|
|
72
|
+
function projectSessionsDir(folderPath) {
|
|
73
|
+
return path.join(os.homedir(), '.claude', 'projects', encodeProjectPath(folderPath));
|
|
74
|
+
}
|
|
75
|
+
function clamp(s, max) {
|
|
76
|
+
if (s.length <= max)
|
|
77
|
+
return s;
|
|
78
|
+
return s.slice(0, max) + `…[+${s.length - max}]`;
|
|
79
|
+
}
|
|
80
|
+
function extractFromLine(line, sessionFile) {
|
|
81
|
+
let rec;
|
|
64
82
|
try {
|
|
65
|
-
|
|
66
|
-
return [];
|
|
67
|
-
const raw = fs.readFileSync(file, 'utf-8');
|
|
68
|
-
const parsed = JSON.parse(raw);
|
|
69
|
-
if (!Array.isArray(parsed)) {
|
|
70
|
-
log.warn({ file }, 'scheduled_tasks.json is not an array');
|
|
71
|
-
return [];
|
|
72
|
-
}
|
|
73
|
-
return parsed.filter((t) => !!t && typeof t === 'object' && typeof t.id === 'string' &&
|
|
74
|
-
typeof t.cron === 'string' &&
|
|
75
|
-
typeof t.prompt === 'string' &&
|
|
76
|
-
typeof t.createdAt === 'number');
|
|
83
|
+
rec = JSON.parse(line);
|
|
77
84
|
}
|
|
78
|
-
catch
|
|
79
|
-
log.warn({ err, file }, 'failed to read scheduled_tasks.json');
|
|
85
|
+
catch {
|
|
80
86
|
return [];
|
|
81
87
|
}
|
|
88
|
+
if (rec.type !== 'assistant' || rec.message?.role !== 'assistant')
|
|
89
|
+
return [];
|
|
90
|
+
const content = rec.message?.content;
|
|
91
|
+
if (!Array.isArray(content))
|
|
92
|
+
return [];
|
|
93
|
+
const ts = rec.timestamp ? Date.parse(rec.timestamp) : NaN;
|
|
94
|
+
if (!Number.isFinite(ts))
|
|
95
|
+
return [];
|
|
96
|
+
const sessionId = rec.sessionId ?? path.basename(sessionFile, '.jsonl');
|
|
97
|
+
const out = [];
|
|
98
|
+
for (const block of content) {
|
|
99
|
+
if (!block || block.type !== 'tool_use')
|
|
100
|
+
continue;
|
|
101
|
+
const name = block.name;
|
|
102
|
+
if (name !== 'ScheduleWakeup' && name !== 'CronCreate')
|
|
103
|
+
continue;
|
|
104
|
+
const input = (block.input ?? {});
|
|
105
|
+
const id = typeof block.id === 'string' ? block.id : '';
|
|
106
|
+
const promptRaw = typeof input.prompt === 'string' ? input.prompt : '';
|
|
107
|
+
const prompt = clamp(promptRaw, PROMPT_PREVIEW_MAX);
|
|
108
|
+
if (name === 'ScheduleWakeup') {
|
|
109
|
+
const delaySeconds = typeof input.delaySeconds === 'number' && Number.isFinite(input.delaySeconds)
|
|
110
|
+
? input.delaySeconds
|
|
111
|
+
: null;
|
|
112
|
+
const reason = typeof input.reason === 'string' ? input.reason : null;
|
|
113
|
+
const fireMs = delaySeconds !== null ? ts + delaySeconds * 1000 : null;
|
|
114
|
+
out.push({
|
|
115
|
+
id,
|
|
116
|
+
type: 'ScheduleWakeup',
|
|
117
|
+
cron: null,
|
|
118
|
+
delaySeconds,
|
|
119
|
+
recurring: false,
|
|
120
|
+
prompt,
|
|
121
|
+
reason,
|
|
122
|
+
createdAt: ts,
|
|
123
|
+
nextFireAt: fireMs !== null ? new Date(fireMs).toISOString() : null,
|
|
124
|
+
sessionId,
|
|
125
|
+
durable: false,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
const cron = typeof input.cron === 'string' ? input.cron : null;
|
|
130
|
+
const durable = input.durable === true;
|
|
131
|
+
const recurring = input.recurring === true;
|
|
132
|
+
let nextFireAt = null;
|
|
133
|
+
if (cron) {
|
|
134
|
+
try {
|
|
135
|
+
const start = Math.max(ts, Date.now());
|
|
136
|
+
const it = cron_parser_1.CronExpressionParser.parse(cron, { currentDate: new Date(start) });
|
|
137
|
+
nextFireAt = it.next().toDate().toISOString();
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// unparseable cron — leave nextFireAt null, keep the record so
|
|
141
|
+
// the UI can flag it
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
out.push({
|
|
145
|
+
id,
|
|
146
|
+
type: 'CronCreate',
|
|
147
|
+
cron,
|
|
148
|
+
delaySeconds: null,
|
|
149
|
+
recurring,
|
|
150
|
+
prompt,
|
|
151
|
+
reason: null,
|
|
152
|
+
createdAt: ts,
|
|
153
|
+
nextFireAt,
|
|
154
|
+
sessionId,
|
|
155
|
+
durable,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return out;
|
|
82
160
|
}
|
|
83
|
-
function
|
|
84
|
-
|
|
85
|
-
// in the past (because the creator process died or the file is stale),
|
|
86
|
-
// starting cron-parser from it would return an already-past date. Clamp
|
|
87
|
-
// to now so we always show a forward-looking timestamp.
|
|
88
|
-
const start = Math.max(fromHint, Date.now());
|
|
161
|
+
function readSessionFile(file) {
|
|
162
|
+
let raw;
|
|
89
163
|
try {
|
|
90
|
-
|
|
91
|
-
return it.next().toDate().toISOString();
|
|
164
|
+
raw = fs.readFileSync(file, 'utf-8');
|
|
92
165
|
}
|
|
93
|
-
catch {
|
|
94
|
-
|
|
166
|
+
catch (err) {
|
|
167
|
+
log.warn({ err, file }, 'failed to read session jsonl');
|
|
168
|
+
return [];
|
|
169
|
+
}
|
|
170
|
+
const out = [];
|
|
171
|
+
// Process line-by-line; final line may be a partial write — JSON.parse
|
|
172
|
+
// failures inside extractFromLine are swallowed quietly per line.
|
|
173
|
+
for (const line of raw.split('\n')) {
|
|
174
|
+
const trimmed = line.trim();
|
|
175
|
+
if (!trimmed)
|
|
176
|
+
continue;
|
|
177
|
+
try {
|
|
178
|
+
out.push(...extractFromLine(trimmed, file));
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
log.debug({ err, file }, 'unexpected error parsing jsonl line');
|
|
182
|
+
}
|
|
95
183
|
}
|
|
184
|
+
return out;
|
|
96
185
|
}
|
|
97
186
|
function tasksForProject(folderPath) {
|
|
98
|
-
const
|
|
99
|
-
|
|
187
|
+
const dir = projectSessionsDir(folderPath);
|
|
188
|
+
let entries;
|
|
189
|
+
try {
|
|
190
|
+
entries = fs.readdirSync(dir);
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
// No session dir — Claude was never run for this project.
|
|
100
194
|
return [];
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
195
|
+
}
|
|
196
|
+
const cutoffMs = Date.now() - SEVEN_DAYS_MS;
|
|
197
|
+
const sessionFiles = [];
|
|
198
|
+
for (const name of entries) {
|
|
199
|
+
if (!name.endsWith('.jsonl'))
|
|
200
|
+
continue;
|
|
201
|
+
const full = path.join(dir, name);
|
|
202
|
+
let stat;
|
|
203
|
+
try {
|
|
204
|
+
stat = fs.statSync(full);
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
continue; // racing with rotation/deletion
|
|
208
|
+
}
|
|
209
|
+
if (!stat.isFile())
|
|
210
|
+
continue;
|
|
211
|
+
if (stat.mtimeMs < cutoffMs)
|
|
212
|
+
continue; // untouched >7d, skip
|
|
213
|
+
sessionFiles.push(full);
|
|
214
|
+
}
|
|
215
|
+
const all = [];
|
|
216
|
+
for (const f of sessionFiles)
|
|
217
|
+
all.push(...readSessionFile(f));
|
|
218
|
+
const now = Date.now();
|
|
219
|
+
const filtered = all.filter((t) => {
|
|
220
|
+
if (t.type === 'ScheduleWakeup') {
|
|
221
|
+
// One-shot: only show records whose fire time is still in the future.
|
|
222
|
+
// Past-fire-time means it has either already fired or been cancelled
|
|
223
|
+
// by user input — keeping them is noise.
|
|
224
|
+
if (t.delaySeconds === null)
|
|
225
|
+
return false;
|
|
226
|
+
return t.createdAt + t.delaySeconds * 1000 > now;
|
|
227
|
+
}
|
|
228
|
+
// CronCreate (recurring or one-shot): keep entries within Claude's 7-day
|
|
229
|
+
// auto-expiry window.
|
|
230
|
+
return t.createdAt > cutoffMs;
|
|
231
|
+
});
|
|
232
|
+
filtered.sort((a, b) => b.createdAt - a.createdAt);
|
|
233
|
+
return filtered;
|
|
105
234
|
}
|
|
106
235
|
//# sourceMappingURL=scheduled.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduled.js","sourceRoot":"","sources":["../../../src/adapters/claude/scheduled.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"scheduled.js","sourceRoot":"","sources":["../../../src/adapters/claude/scheduled.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwJH,0CA6CC;AAnMD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AACzB,6CAAmD;AACnD,yCAAyC;AAEzC,MAAM,GAAG,GAAG,IAAA,kBAAS,EAAC,WAAW,CAAC,CAAC;AAEnC,MAAM,aAAa,GAAG,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC;AACvC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAgBhC,SAAS,iBAAiB,CAAC,UAAkB;IAC3C,yEAAyE;IACzE,OAAO,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,kBAAkB,CAAC,UAAkB;IAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;AACvF,CAAC;AAiBD,SAAS,KAAK,CAAC,CAAS,EAAE,GAAW;IACnC,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,GAAG,GAAG,GAAG,CAAC;AACnD,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,WAAmB;IACxD,IAAI,GAAiB,CAAC;IACtB,IAAI,CAAC;QAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;IACpE,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,KAAK,WAAW;QAAE,OAAO,EAAE,CAAC;IAC7E,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC;IACrC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACxE,MAAM,GAAG,GAAoB,EAAE,CAAC;IAEhC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;YAAE,SAAS;QAClD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACxB,IAAI,IAAI,KAAK,gBAAgB,IAAI,IAAI,KAAK,YAAY;YAAE,SAAS;QACjE,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAA4B,CAAC;QAC7D,MAAM,EAAE,GAAG,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,MAAM,SAAS,GAAG,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;QAEpD,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;YAC9B,MAAM,YAAY,GAChB,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC;gBAC3E,CAAC,CAAC,KAAK,CAAC,YAAY;gBACpB,CAAC,CAAC,IAAI,CAAC;YACX,MAAM,MAAM,GAAG,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YACtE,MAAM,MAAM,GAAG,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACvE,GAAG,CAAC,IAAI,CAAC;gBACP,EAAE;gBACF,IAAI,EAAE,gBAAgB;gBACtB,IAAI,EAAE,IAAI;gBACV,YAAY;gBACZ,SAAS,EAAE,KAAK;gBAChB,MAAM;gBACN,MAAM;gBACN,SAAS,EAAE,EAAE;gBACb,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;gBACnE,SAAS;gBACT,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAChE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC;YACvC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;YAC3C,IAAI,UAAU,GAAkB,IAAI,CAAC;YACrC,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;oBACvC,MAAM,EAAE,GAAG,kCAAoB,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAC9E,UAAU,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;gBAChD,CAAC;gBAAC,MAAM,CAAC;oBACP,+DAA+D;oBAC/D,qBAAqB;gBACvB,CAAC;YACH,CAAC;YACD,GAAG,CAAC,IAAI,CAAC;gBACP,EAAE;gBACF,IAAI,EAAE,YAAY;gBAClB,IAAI;gBACJ,YAAY,EAAE,IAAI;gBAClB,SAAS;gBACT,MAAM;gBACN,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,EAAE;gBACb,UAAU;gBACV,SAAS;gBACT,OAAO;aACR,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,8BAA8B,CAAC,CAAC;QACxD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,GAAG,GAAoB,EAAE,CAAC;IAChC,uEAAuE;IACvE,kEAAkE;IAClE,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,qCAAqC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAgB,eAAe,CAAC,UAAkB;IAChD,MAAM,GAAG,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAC3C,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,0DAA0D;QAC1D,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC;IAC5C,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,SAAS;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAClC,IAAI,IAAc,CAAC;QACnB,IAAI,CAAC;YACH,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,gCAAgC;QAC5C,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE,SAAS;QAC7B,IAAI,IAAI,CAAC,OAAO,GAAG,QAAQ;YAAE,SAAS,CAAC,sBAAsB;QAC7D,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,GAAG,GAAoB,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,YAAY;QAAE,GAAG,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAChC,IAAI,CAAC,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;YAChC,sEAAsE;YACtE,qEAAqE;YACrE,yCAAyC;YACzC,IAAI,CAAC,CAAC,YAAY,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;YAC1C,OAAO,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,YAAY,GAAG,IAAI,GAAG,GAAG,CAAC;QACnD,CAAC;QACD,yEAAyE;QACzE,sBAAsB;QACtB,OAAO,CAAC,CAAC,SAAS,GAAG,QAAQ,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IACnD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{bB as e,bC as t,r as n,bD as r,c as a,f as i,bE as o,bF as s,j as l,R as c,d as u,aK as d,bG as p,t as m,A as g,p as h,b2 as f,bH as b,a as y}from"./index-
|
|
1
|
+
import{bB as e,bC as t,r as n,bD as r,c as a,f as i,bE as o,bF as s,j as l,R as c,d as u,aK as d,bG as p,t as m,A as g,p as h,b2 as f,bH as b,a as y}from"./index-CxHOCf_s.js";import{C as E}from"./chevron-down-CxmD4ySz.js";import{C as S,a as v}from"./chevron-up-BznxDhNi.js";function w(){!e.current&&t();const[a]=n.useState(r.current);return a}
|
|
2
2
|
/**
|
|
3
3
|
* @license lucide-react v0.309.0 - ISC
|
|
4
4
|
*
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as e,r as t,b as n,j as i,aK as r,B as o,l as a}from"./index-
|
|
1
|
+
import{c as e,r as t,b as n,j as i,aK as r,B as o,l as a}from"./index-CxHOCf_s.js";import{Z as s,a as l}from"./ProjectPage-fWJrKu-y.js";import"./purify.es-CgRAQgUo.js";import"./AssistantMessageContent-BBXSX58q.js";import"./chevron-down-CxmD4ySz.js";import"./chevron-up-BznxDhNi.js";import"./index-DwNsYVM3.js";import"./search-BPzU-LtZ.js";
|
|
2
2
|
/**
|
|
3
3
|
* @license lucide-react v0.309.0 - ISC
|
|
4
4
|
*
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/OfficePreview-
|
|
2
|
-
import{c as e,aE as t,b1 as s,r as a,bt as n,bu as r,j as l,bv as o,l as c,d as i,bw as d,bx as x,aS as u,aT as m,ab as h,aa as p,by as f,a9 as g,aG as j,aK as b,a_ as v,a as y,b as N,g as w,D as k,f as C,R as S,_ as I,k as z,X as M,o as P,bz as U,bA as T,C as $,A,p as D}from"./index-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/OfficePreview-C6EJB80i.js","assets/index-CxHOCf_s.js","assets/index-Big9FXD0.css","assets/purify.es-CgRAQgUo.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{c as e,aE as t,b1 as s,r as a,bt as n,bu as r,j as l,bv as o,l as c,d as i,bw as d,bx as x,aS as u,aT as m,ab as h,aa as p,by as f,a9 as g,aG as j,aK as b,a_ as v,a as y,b as N,g as w,D as k,f as C,R as S,_ as I,k as z,X as M,o as P,bz as U,bA as T,C as $,A,p as D}from"./index-CxHOCf_s.js";import{A as E,f as L,T as R,G as _,M as H,r as O,a as F,b as q,c as B,e as W,h as K,o as V,d as G,I as J,F as Q}from"./AssistantMessageContent-BBXSX58q.js";import{C as X}from"./chevron-up-BznxDhNi.js";import{C as Y}from"./chevron-down-CxmD4ySz.js";
|
|
3
3
|
/**
|
|
4
4
|
* @license lucide-react v0.309.0 - ISC
|
|
5
5
|
*
|
|
@@ -11,4 +11,4 @@ import{c as e,aE as t,b1 as s,r as a,bt as n,bu as r,j as l,bv as o,l as c,d as
|
|
|
11
11
|
*
|
|
12
12
|
* This source code is licensed under the ISC license.
|
|
13
13
|
* See the LICENSE file in the root directory of this source tree.
|
|
14
|
-
*/function ne({onSelectProject:e}){const x=t(),{projects:u,fetchProjects:m,hasFetched:h,loading:p}=s(),[f,g]=a.useState(new Map),[j,b]=a.useState(new Set),[v,y]=a.useState(!1);a.useEffect(()=>{m()},[m]);const N=a.useCallback(e=>{e.status&&g(t=>{const s=new Map(t);return s.set(e.projectId,e.status),s}),void 0!==e.active&&b(t=>{const s=new Set(t);return e.active?s.add(e.projectId):s.delete(e.projectId),s})},[]);n({onActivityUpdate:N});const{applyOrder:w}=r(),k=w(u.filter(e=>!e.archived));return l.jsxs("div",{className:"flex flex-col h-full",children:[l.jsxs("div",{className:"flex items-center gap-3 px-4 h-12 border-b border-border shrink-0",children:[l.jsx("span",{className:"font-semibold text-base flex-1",children:"CC Web"}),l.jsx(o,{}),l.jsx("button",{onClick:()=>{(async()=>{y(!0);try{await m()}finally{y(!1)}})()},className:"text-muted-foreground active:text-foreground",disabled:v,children:l.jsx(c,{className:i("h-4 w-4",v&&"animate-spin")})}),!ae&&l.jsx("button",{onClick:()=>x("/"),className:"text-muted-foreground active:text-foreground",title:"桌面模式",children:l.jsx(d,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"flex-1 overflow-y-auto px-3 py-3",children:[p&&!h&&l.jsx("div",{className:"text-center text-muted-foreground text-sm py-12",children:"加载中..."}),h&&0===k.length&&l.jsx("div",{className:"text-center text-muted-foreground text-sm py-12",children:"暂无项目"}),l.jsx("div",{className:"grid grid-cols-2 gap-2",children:k.map(t=>{var s;const a="running"===(s=t,f.get(s.id)??s.status??"stopped"),n=j.has(t.id),r=l.jsxs("button",{onClick:()=>e(t.id),className:i("w-full text-left rounded-xl border bg-card p-2.5 active:bg-accent transition-colors",n?"border-transparent":"border-border"),children:[l.jsxs("div",{className:"flex items-center gap-1.5 mb-1",children:[l.jsx("span",{className:i("w-2 h-2 rounded-full shrink-0",a?"bg-green-500":"bg-zinc-400")}),l.jsx("span",{className:"font-medium text-sm truncate flex-1",children:t.name})]}),l.jsx("div",{className:"text-[10px] text-muted-foreground font-mono truncate",children:t.cliTool??"claude"})]});return l.jsx("div",{className:n?"card-active-glow rounded-xl":void 0,children:r},t.id)})})]})]})}function re(e){if(!e.phase)return null;if("thinking"===e.phase)return"思考中";if("tool_result"===e.phase)return"处理结果";if("tool_use"===e.phase){const t=(e.detail||"").toLowerCase();return"bash"===t?"执行命令":"read"===t?"读取文件":"edit"===t||"multiedit"===t?"编辑文件":"write"===t?"写入文件":"grep"===t?"搜索内容":"glob"===t?"匹配文件":"webfetch"===t||"websearch"===t?"访问网络":"task"===t?"调度子任务":"todowrite"===t?"更新任务列表":"notebookedit"===t?"编辑 Notebook":e.detail?`调用 ${e.detail}`:"调用工具"}return null}function le({project:e,onBack:t,onOpenPanel:s,onContextUpdate:n}){const[r,o]=a.useState(""),c=a.useRef(null),d=a.useRef(null),[y,N]=a.useState([]),w=a.useCallback(e=>{N(t=>{const s=[...t,e];return s.length>200?s.slice(-200):s})},[]),k=a.useRef(null),C=a.useCallback(e=>{var t;"stopped"===e&&(null==(t=k.current)||t.call(k,"stopped"))},[]),[S,I]=a.useState([]),z=a.useRef(new Set),M=a.useCallback(e=>{z.current.has(e.toolUseId)||I(t=>t.some(t=>t.toolUseId===e.toolUseId)?t:[...t,{projectId:e.projectId,toolUseId:e.toolUseId,toolName:e.toolName,toolInput:e.toolInput,sessionId:e.sessionId,createdAt:e.createdAt}])},[]),P=a.useCallback(e=>{z.current.add(e.toolUseId),I(t=>t.filter(t=>t.toolUseId!==e.toolUseId))},[]),U=a.useCallback(e=>{z.current.add(e),I(t=>t.filter(t=>t.toolUseId!==e))},[]),[T,$]=a.useState(null),A=a.useRef(0),D=a.useCallback(e=>{var t,s,a;if(!e.active)return void $(null);if("text"===(null==(t=e.semantic)?void 0:t.phase))return void $(null);const n=null==(s=e.semantic)?void 0:s.phase,r=null==(a=e.semantic)?void 0:a.detail;$(e=>e?e.phase===n&&e.detail===r?e:{...e,phase:n,detail:r}:{id:"mab"+ ++A.current,phase:n,detail:r})},[]),{sendInput:H,connected:O}=x({projectId:e.id,enabled:!0,onChatMessage:w,onStatusChange:C,onContextUpdate:n,onApprovalRequest:M,onApprovalResolved:P,onSemanticUpdate:D});a.useEffect(()=>{if(!O)return;if("claude"!==e.cliTool)return;let t=!1;return u(e.id).then(e=>{if(t)return;const s=e.pending.filter(e=>!z.current.has(e.toolUseId));I(e=>{const t=new Map;for(const a of s)t.set(a.toolUseId,a);for(const s of e)t.has(s.toolUseId)||z.current.has(s.toolUseId)||t.set(s.toolUseId,s);return[...t.values()]})}).catch(()=>{}),()=>{t=!0}},[e.id,e.cliTool,O]);const{state:F,setState:q,messages:B,hasMoreHistory:W,loadMoreHistory:K,sendMessage:V,isWaking:G}=m({project:e,liveMessages:y,ws:{send:H,connected:O},historyLimit:20});k.current=q;const J=a.useRef(O);a.useEffect(()=>{!J.current&&O&&N([]),J.current=O},[O]);const Q=(()=>{for(let e=B.length-1;e>=0;e--)if("assistant"===B[e].role)return e;return-1})(),[ee,te]=a.useState([]),[ae,ne]=a.useState([]),[le,oe]=a.useState(null);a.useEffect(()=>{h().then(te).catch(()=>{}),p(e.id).then(ne).catch(()=>{})},[e.id]);const ce=a.useCallback(async()=>{const e=c.current,t=(null==e?void 0:e.scrollHeight)??0;await K(),requestAnimationFrame(()=>{e&&(e.scrollTop+=e.scrollHeight-t)})},[K]),ie=a.useRef(0);a.useEffect(()=>{const e=c.current;if(!e)return;const t=B.length>ie.current,s=0===ie.current&&B.length>0;ie.current=B.length,s?e.scrollTo({top:e.scrollHeight}):t&&e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},[B,S.length]);const[de,xe]=a.useState(!1),ue=a.useCallback(async()=>{const e=r.trim();if(!e||de)return;xe(!0);const t=await V(e);xe(!1),"delivered"===t&&(o(""),d.current&&(d.current.style.height="auto"))},[r,de,V]),me=f(ue,"shift"),he=a.useCallback((t,s)=>{oe(null),V(t.command),"project"===s&&g(e.id,t.id,!0).catch(e=>{console.error("Failed to mark shortcut used:",e)})},[V,e.id]),pe="live"===F;return l.jsxs("div",{className:"flex flex-col h-full bg-background",children:[l.jsxs("div",{className:"flex items-center gap-2 px-3 h-12 border-b border-border shrink-0",children:[l.jsx("button",{onClick:t,className:"text-muted-foreground active:text-foreground p-1",children:l.jsx(j,{className:"h-5 w-5"})}),l.jsxs("div",{className:"flex items-center gap-1.5 flex-1 min-w-0",children:[l.jsx("span",{className:"font-medium text-sm truncate",children:e.name}),l.jsx("span",{className:i("w-2 h-2 rounded-full shrink-0",pe?"bg-green-500":G?"bg-yellow-400 animate-pulse":"bg-zinc-400")})]}),l.jsx("button",{onClick:s,className:"text-muted-foreground active:text-foreground p-1",children:l.jsx(se,{className:"h-5 w-5"})})]}),l.jsxs("div",{ref:c,className:"flex-1 overflow-y-auto px-3 py-3 space-y-3 min-h-0",children:[W&&l.jsx("div",{className:"flex justify-center pb-1",children:l.jsxs("button",{onClick:()=>{ce()},className:"flex items-center gap-1 px-3 py-1.5 rounded-full text-xs text-muted-foreground border border-border active:bg-accent transition-colors",children:[l.jsx(X,{className:"h-3 w-3"}),"加载更早消息"]})}),B.map((e,t)=>{const s="user"===e.role;return l.jsx("div",{className:i("flex",s?"justify-end":"justify-start"),children:l.jsx("div",{className:i("max-w-[85%] rounded-xl px-3 py-2 break-words text-sm leading-relaxed",s?"bg-blue-500/15 text-foreground border border-blue-500/20 rounded-br-sm whitespace-pre-wrap":"bg-secondary text-secondary-foreground border border-border rounded-bl-sm"),children:s?e.content:l.jsx(E,{content:e.content,blocks:e.blocks,isLatest:t===Q})})},e.id)}),S.map(e=>l.jsx(L,{approval:e,onResolved:U},e.toolUseId)),T&&0===S.length&&l.jsx("div",{className:"flex justify-start",children:l.jsxs("div",{className:"rounded-2xl rounded-bl-md px-3 py-1.5 bg-black/5 dark:bg-white/10 border border-black/10 dark:border-white/15 flex items-center gap-2 text-xs text-muted-foreground",children:[l.jsx(R,{}),re(T)&&l.jsx("span",{children:re(T)})]})},T.id),0===B.length&&0===S.length&&!T&&"stopped"===F&&l.jsx("div",{className:"flex items-center justify-center h-full text-muted-foreground/40 text-sm",children:"暂无对话记录"}),G&&l.jsx("div",{className:"flex items-center justify-center py-4 text-yellow-400 text-sm animate-pulse",children:"启动中..."})]}),le&&l.jsx("div",{className:"border-t border-border max-h-48 overflow-y-auto shrink-0",children:l.jsxs("div",{className:"px-3 py-2 space-y-1",children:[("global"===le?ee:ae).map(e=>l.jsxs("button",{onClick:()=>he(e,le),disabled:G,className:i("w-full text-left rounded-md px-2.5 py-2 text-sm active:bg-accent transition-colors border border-border/50",G&&"opacity-50 cursor-not-allowed"),children:[l.jsx("div",{className:"font-medium text-xs",children:e.label}),l.jsx("div",{className:"text-[11px] text-muted-foreground font-mono truncate",children:e.command})]},e.id)),0===("global"===le?ee:ae).length&&l.jsx("div",{className:"text-center text-muted-foreground text-xs py-3",children:"暂无快捷 Prompts"})]})}),(ee.length>0||ae.length>0)&&l.jsxs("div",{className:"flex items-center gap-1.5 px-3 py-1.5 border-t border-border shrink-0",children:[l.jsxs("button",{onClick:()=>oe(e=>"global"===e?null:"global"),className:i("flex items-center gap-1 px-2 py-1 rounded-md text-xs transition-colors","global"===le?"bg-blue-500/15 text-blue-500":"text-muted-foreground active:bg-accent"),children:[l.jsx(_,{className:"h-3 w-3"}),"全局","global"===le&&l.jsx(Y,{className:"h-3 w-3"})]}),l.jsxs("button",{onClick:()=>oe(e=>"project"===e?null:"project"),className:i("flex items-center gap-1 px-2 py-1 rounded-md text-xs transition-colors","project"===le?"bg-blue-500/15 text-blue-500":"text-muted-foreground active:bg-accent"),children:[l.jsx(Z,{className:"h-3 w-3"}),"项目","project"===le&&l.jsx(Y,{className:"h-3 w-3"})]})]}),l.jsx("div",{className:"border-t border-border px-3 py-2 shrink-0",style:{paddingBottom:"max(0.5rem, env(safe-area-inset-bottom))"},children:l.jsxs("div",{className:"flex items-end gap-2",children:[l.jsx("textarea",{ref:d,value:r,onChange:e=>o(e.target.value),onKeyDown:me,disabled:G||de,placeholder:G?"启动中...":de?"发送中…":"stopped"===F?"输入消息(自动启动)...":"输入消息...",rows:1,className:i("flex-1 resize-none rounded-md border border-input bg-transparent px-3 py-2 text-sm outline-none","focus:ring-1 focus:ring-ring placeholder:text-muted-foreground/50","max-h-32 overflow-y-auto",(G||de)&&"opacity-50 cursor-not-allowed"),style:{minHeight:"2.5rem"},onInput:e=>{const t=e.currentTarget;t.style.height="auto",t.style.height=Math.min(t.scrollHeight,128)+"px"}}),l.jsx("button",{onClick:ue,disabled:G||de||!r.trim(),className:i("shrink-0 p-2 rounded-md transition-colors",r.trim()&&!de?"text-blue-500 active:bg-blue-500/10":"text-muted-foreground/30"),children:de?l.jsx(b,{className:"h-5 w-5 animate-spin"}):l.jsx(v,{className:"h-5 w-5"})})]})})]})}const oe=S.lazy(()=>I(()=>import("./OfficePreview-Dah62nhN.js"),__vite__mapDeps([0,1,2,3])).then(e=>({default:e.OfficePreview}))),ce=new Set(["png","jpg","jpeg","gif","webp","svg","bmp","ico","avif"]),ie=new Set(["docx","xlsx","xls","pptx"]),de={js:"javascript",jsx:"jsx",ts:"typescript",tsx:"tsx",py:"python",rb:"ruby",go:"go",rs:"rust",java:"java",kt:"kotlin",swift:"swift",c:"c",cpp:"cpp",h:"c",cs:"csharp",php:"php",sh:"bash",bash:"bash",zsh:"bash",yaml:"yaml",yml:"yaml",json:"json",toml:"toml",html:"html",htm:"html",xml:"xml",svg:"xml",css:"css",scss:"scss",less:"less",sql:"sql",graphql:"graphql",gql:"graphql",dockerfile:"docker",makefile:"makefile",r:"r",lua:"lua",dart:"dart",zig:"zig"};function xe(e){return e.split("/").pop()??e}function ue({filePath:e,onBack:t}){const[s,n]=a.useState(null),[r,o]=a.useState(!0),[c,i]=a.useState(null),{resolved:d}=y(),x=function(e){const t=e.split("/").pop()??"",s=t.toLowerCase();if("dockerfile"===s)return"dockerfile";if("makefile"===s)return"makefile";const a=t.lastIndexOf(".");return a>=0?t.slice(a+1).toLowerCase():""}(e),u=ce.has(x),m=ie.has(x),h=de[x],p="dark"===d;a.useEffect(()=>{u||m?o(!1):(o(!0),i(null),N(e).then(n).catch(e=>i(e instanceof Error?e.message:"Failed to load")).finally(()=>o(!1)))},[e,u,m]);const f=C(e),g=a.useMemo(()=>{const e=w();return e?`${f}&token=${encodeURIComponent(e)}`:f},[f]),v=a.useMemo(()=>u?`${g}&t=${Date.now()}`:"",[g,u]);return l.jsxs("div",{className:"flex flex-col h-full",children:[l.jsxs("div",{className:"flex items-center gap-2 px-3 h-12 border-b border-border shrink-0",children:[l.jsx("button",{onClick:t,className:"text-muted-foreground active:text-foreground p-1",children:l.jsx(j,{className:"h-5 w-5"})}),l.jsx("span",{className:"flex-1 text-sm font-medium truncate",children:xe(e)}),l.jsx("a",{href:g,download:!0,className:"text-muted-foreground active:text-foreground p-1",onClick:e=>e.stopPropagation(),children:l.jsx(k,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"flex-1 overflow-auto min-h-0",children:[r&&l.jsx("div",{className:"flex items-center justify-center py-12",children:l.jsx(b,{className:"h-5 w-5 animate-spin text-muted-foreground"})}),c&&l.jsx("div",{className:"text-center text-destructive text-sm py-12 px-4",children:c}),u&&l.jsx("div",{className:"flex items-center justify-center p-4 h-full",children:l.jsx("img",{src:v,alt:xe(e),className:"max-w-full max-h-full object-contain rounded",style:{touchAction:"pinch-zoom"}})}),m&&l.jsx(a.Suspense,{fallback:l.jsx("div",{className:"flex items-center justify-center py-12",children:l.jsx(b,{className:"h-5 w-5 animate-spin text-muted-foreground"})}),children:l.jsx(oe,{filePath:e,ext:x,zoom:100})}),s&&(s.binary||s.tooLarge)&&l.jsxs("div",{className:"text-center py-12 px-4 space-y-3",children:[l.jsxs("p",{className:"text-muted-foreground text-sm",children:[s.binary?"二进制文件":"文件过大",s.size>0&&` (${S=s.size,S<1024?`${S} B`:S<1048576?`${(S/1024).toFixed(1)} KB`:`${(S/1048576).toFixed(1)} MB`})`]}),l.jsxs("a",{href:g,download:!0,className:"inline-flex items-center gap-1.5 text-sm text-blue-500 active:text-blue-400",children:[l.jsx(k,{className:"h-4 w-4"}),"下载文件"]})]}),s&&!s.binary&&!s.tooLarge&&null!=s.content&&l.jsxs(l.Fragment,{children:["md"===x&&l.jsx("div",{className:"prose prose-sm dark:prose-invert max-w-none px-4 py-3",children:l.jsx(H,{remarkPlugins:[F,q],rehypePlugins:[O],urlTransform:(e,t,s)=>"src"===t&&"img"===s.tagName?e:W(e),components:{img:({src:t,alt:s,...a})=>l.jsx("img",{...a,src:B(e,t,w()),alt:s??"",loading:"lazy",style:{maxWidth:"100%",height:"auto"}})},children:s.content})}),"md"!==x&&h&&l.jsx(K,{language:h,style:p?V:G,customStyle:{margin:0,fontSize:"12px",borderRadius:0},showLineNumbers:!0,children:s.content}),"md"!==x&&!h&&l.jsx("pre",{className:"p-4 text-xs font-mono whitespace-pre-wrap break-words",children:s.content})]})]})]});var S}const me=new Set(["png","jpg","jpeg","gif","webp","svg","bmp","ico","avif"]),he=new Set(["js","jsx","ts","tsx","py","rb","go","rs","java","c","cpp","h","swift","kt","cs","php","sh","bash","zsh","r","lua","dart","zig","css","scss","less","html","htm","xml","sql"]),pe=new Set(["json","yaml","yml","toml","csv","tsv"]);function fe({entry:e}){if("dir"===e.type)return l.jsx(P,{className:"h-8 w-8 text-blue-400"});const t=function(e){const t=e.lastIndexOf(".");return t>=0?e.slice(t+1).toLowerCase():""}(e.name);return me.has(t)?l.jsx(J,{className:"h-8 w-8 text-emerald-400"}):he.has(t)?l.jsx(ee,{className:"h-8 w-8 text-orange-400"}):pe.has(t)?l.jsx(te,{className:"h-8 w-8 text-yellow-400"}):"md"===t?l.jsx(Q,{className:"h-8 w-8 text-sky-400"}):l.jsx(U,{className:"h-8 w-8 text-muted-foreground"})}function ge({rootPath:e,onClose:t}){const[s,n]=a.useState(e),[r,o]=a.useState([]),[c,i]=a.useState(!0),[d,x]=a.useState(null),u=a.useCallback(async e=>{i(!0);try{const t=[...(await z(e)).entries].sort((e,t)=>e.type!==t.type?"dir"===e.type?-1:1:e.name.localeCompare(t.name));o(t),n(e)}catch{o([])}finally{i(!1)}},[]);a.useEffect(()=>{u(e)},[e,u]);const m=s!==e,h=s.startsWith(e)?s.slice(e.length)||"/":s;return d?l.jsx(ue,{filePath:d,onBack:()=>x(null)}):l.jsxs("div",{className:"flex flex-col h-full",children:[l.jsxs("div",{className:"flex items-center gap-2 px-3 h-12 border-b border-border shrink-0",children:[l.jsx("button",{onClick:t,className:"text-muted-foreground active:text-foreground p-1",children:l.jsx(M,{className:"h-5 w-5"})}),l.jsxs("div",{className:"flex items-center gap-1 flex-1 min-w-0 text-sm",children:[m&&l.jsx("button",{onClick:()=>{if(s===e)return;const t=s.replace(/\/[^/]+$/,"")||"/";t.startsWith(e)&&u(t)},className:"text-muted-foreground active:text-foreground p-0.5 shrink-0",children:l.jsx(j,{className:"h-4 w-4"})}),l.jsx("span",{className:"truncate text-muted-foreground font-mono text-xs",children:h})]})]}),l.jsxs("div",{className:"flex-1 overflow-y-auto px-3 py-3",children:[c&&l.jsx("div",{className:"flex items-center justify-center py-12",children:l.jsx(b,{className:"h-5 w-5 animate-spin text-muted-foreground"})}),!c&&0===r.length&&l.jsx("div",{className:"text-center text-muted-foreground text-sm py-12",children:"空目录"}),!c&&l.jsx("div",{className:"grid grid-cols-3 gap-1",children:r.map(e=>l.jsxs("button",{onClick:()=>(e=>{"dir"===e.type?u(e.path):x(e.path)})(e),className:"flex flex-col items-center gap-1 p-2 rounded-md active:bg-accent transition-colors",children:[l.jsx(fe,{entry:e}),l.jsx("span",{className:"text-[11px] text-center leading-tight w-full line-clamp-2 break-all",children:e.name})]},e.path))})]})]})}function je(e){return e<50?"text-green-400":e<80?"text-yellow-400":"text-red-400"}function be(e){return e<50?"bg-green-500":e<80?"bg-yellow-500":"bg-red-500"}function ve({projectName:e,cliTool:t,folderPath:s,contextData:n,onClose:r}){const[o,d]=a.useState(new Set(["context","usage","files"])),[x,u]=a.useState(null),[m,h]=a.useState(!1),p=e=>{d(t=>{const s=new Set(t);return s.has(e)?s.delete(e):s.add(e),s})};a.useEffect(()=>{h(!0),T(t).then(u).catch(()=>u(null)).finally(()=>h(!1))},[t]);const f=n?Math.round(n.usedPercentage):null;return l.jsxs("div",{className:"flex flex-col h-full",children:[l.jsxs("div",{className:"flex items-center gap-2 px-3 h-12 border-b border-border shrink-0",children:[l.jsx("button",{onClick:r,className:"text-muted-foreground active:text-foreground p-1",children:l.jsx(M,{className:"h-5 w-5"})}),l.jsx("span",{className:"flex-1 font-medium text-sm truncate",children:e})]}),l.jsxs("div",{className:"flex-1 overflow-y-auto",children:[l.jsxs("button",{onClick:()=>p("context"),className:"w-full flex items-center gap-2 px-4 py-2.5 border-b border-border/50 active:bg-accent",children:[o.has("context")?l.jsx(Y,{className:"h-3.5 w-3.5 text-muted-foreground"}):l.jsx($,{className:"h-3.5 w-3.5 text-muted-foreground"}),l.jsx("span",{className:"text-sm font-medium",children:"上下文"}),null!==f&&l.jsxs("span",{className:i("text-xs font-mono ml-auto",je(f)),children:[f,"%"]})]}),o.has("context")&&l.jsx("div",{className:"px-4 py-3 border-b border-border/50",children:null!==f&&n?l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx("div",{className:"flex-1 h-2 bg-secondary rounded-full overflow-hidden",children:l.jsx("div",{className:i("h-full rounded-full transition-all",be(f)),style:{width:`${Math.min(f,100)}%`}})}),l.jsxs("span",{className:i("text-xs font-mono w-10 text-right",je(f)),children:[f,"%"]})]}),l.jsxs("div",{className:"grid grid-cols-2 gap-x-4 gap-y-1 text-[11px] text-muted-foreground",children:[l.jsx("span",{children:"窗口大小"}),l.jsx("span",{className:"text-right font-mono",children:n.contextWindowSize>=1e6?`${(n.contextWindowSize/1e6).toFixed(1)}M`:`${Math.round(n.contextWindowSize/1e3)}K`}),l.jsx("span",{children:"输入 tokens"}),l.jsx("span",{className:"text-right font-mono",children:n.inputTokens.toLocaleString()}),l.jsx("span",{children:"输出 tokens"}),l.jsx("span",{className:"text-right font-mono",children:n.outputTokens.toLocaleString()})]})]}):l.jsx("div",{className:"text-xs text-muted-foreground/50 text-center py-2",children:"暂无数据"})}),l.jsxs("div",{className:"w-full flex items-center gap-2 px-4 py-2.5 border-b border-border/50 cursor-pointer",role:"button",tabIndex:0,onClick:()=>p("usage"),onKeyDown:e=>{"Enter"!==e.key&&" "!==e.key||p("usage")},children:[o.has("usage")?l.jsx(Y,{className:"h-3.5 w-3.5 text-muted-foreground"}):l.jsx($,{className:"h-3.5 w-3.5 text-muted-foreground"}),l.jsx("span",{className:"text-sm font-medium",children:"用量"}),l.jsx("button",{onClick:e=>{e.stopPropagation(),(async()=>{h(!0);try{const{refreshUsage:e}=await I(async()=>{const{refreshUsage:e}=await import("./index-CHdNhmuD.js").then(e=>e.bJ);return{refreshUsage:e}},__vite__mapDeps([1,2]));u(await e(t))}catch{}finally{h(!1)}})()},className:"ml-auto text-muted-foreground active:text-foreground",children:l.jsx(c,{className:i("h-3 w-3",m&&"animate-spin")})})]}),o.has("usage")&&l.jsx("div",{className:"px-4 py-3 border-b border-border/50",children:x?l.jsxs("div",{className:"space-y-2",children:[x.planName&&l.jsxs("div",{className:"text-[11px] text-muted-foreground",children:["Plan: ",l.jsx("span",{className:"font-medium text-foreground",children:x.planName})]}),l.jsx(ye,{label:"5h",bucket:x.fiveHour}),l.jsx(ye,{label:"7d",bucket:x.sevenDay}),x.sevenDaySonnet&&l.jsx(ye,{label:"7d Sonnet",bucket:x.sevenDaySonnet}),x.sevenDayOpus&&l.jsx(ye,{label:"7d Opus",bucket:x.sevenDayOpus}),!x.fiveHour&&!x.sevenDay&&l.jsx("div",{className:"text-xs text-muted-foreground/50 text-center",children:"暂无数据"})]}):l.jsx("div",{className:"text-xs text-muted-foreground/50 text-center py-2",children:m?"加载中...":"暂无数据"})}),l.jsxs("button",{onClick:()=>p("files"),className:"w-full flex items-center gap-2 px-4 py-2.5 border-b border-border/50 active:bg-accent",children:[o.has("files")?l.jsx(Y,{className:"h-3.5 w-3.5 text-muted-foreground"}):l.jsx($,{className:"h-3.5 w-3.5 text-muted-foreground"}),l.jsx("span",{className:"text-sm font-medium",children:"文件"})]}),o.has("files")&&l.jsx("div",{className:"h-[60vh]",children:l.jsx(ge,{rootPath:s,onClose:()=>p("files")})})]})]})}function ye({label:e,bucket:t}){if(!t||void 0===t.utilization)return null;const s=t.utilization,a=function(e){if(!e)return"";const t=new Date(e).getTime()-Date.now();if(t<=0)return"即将重置";const s=Math.floor(t/36e5),a=Math.floor(t%36e5/6e4);return s>0?`${s}h${a}m`:`${a}m`}(t.resetAt);return l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx("span",{className:"text-xs text-muted-foreground w-16",children:e}),l.jsx("div",{className:"flex-1 h-1.5 bg-secondary rounded-full overflow-hidden",children:l.jsx("div",{className:i("h-full rounded-full",be(s)),style:{width:`${Math.min(s,100)}%`}})}),l.jsxs("span",{className:i("text-xs font-mono w-8 text-right",je(s)),children:[s,"%"]}),a&&l.jsx("span",{className:"text-[10px] text-muted-foreground/60",children:a})]})}function Ne(){a.useEffect(()=>{const e=document.querySelector('meta[name="viewport"]');if(!e)return;const t=e.getAttribute("content")??"";return e.setAttribute("content","width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover"),()=>{e.setAttribute("content",t)}},[]);const[e,t]=a.useState({screen:"list"}),[n,r]=a.useState(null),o=s(e=>e.projects),c=a.useCallback(e=>{t({screen:"chat",projectId:e}),r(null)},[]),i=a.useCallback(e=>{t({screen:"panel",projectId:e})},[]),d=a.useCallback(()=>{t(e=>"panel"===e.screen?{screen:"chat",projectId:e.projectId}:{screen:"list"})},[]),x="list"!==e.screen?o.find(t=>t.id===e.projectId):void 0;return l.jsxs("div",{className:"fixed inset-0 bg-background overflow-hidden",children:[l.jsxs(A,{mode:"wait",children:["list"===e.screen&&l.jsx(D.div,{className:"absolute inset-0",initial:{opacity:0},animate:{opacity:1},exit:{x:"-30%",opacity:0},transition:{duration:.2},style:{paddingTop:"env(safe-area-inset-top)"},children:l.jsx(ne,{onSelectProject:c})},"list"),"chat"===e.screen&&x&&l.jsx(D.div,{className:"absolute inset-0",initial:{x:"100%"},animate:{x:0},exit:{x:"100%"},transition:{type:"tween",duration:.25},style:{paddingTop:"env(safe-area-inset-top)"},children:l.jsx(le,{project:x,onBack:d,onOpenPanel:()=>i(e.projectId),onContextUpdate:r})},`chat-${e.projectId}`)]}),l.jsx(A,{children:"panel"===e.screen&&x&&l.jsx(D.div,{className:"absolute inset-0 z-50 bg-background",initial:{x:"100%"},animate:{x:0},exit:{x:"100%"},transition:{type:"tween",duration:.25},style:{paddingTop:"env(safe-area-inset-top)"},children:l.jsx(ve,{projectName:x.name,cliTool:x.cliTool??"claude",folderPath:x.folderPath,contextData:n,onClose:d})},"panel")})]})}export{Ne as MobilePage};
|
|
14
|
+
*/function ne({onSelectProject:e}){const x=t(),{projects:u,fetchProjects:m,hasFetched:h,loading:p}=s(),[f,g]=a.useState(new Map),[j,b]=a.useState(new Set),[v,y]=a.useState(!1);a.useEffect(()=>{m()},[m]);const N=a.useCallback(e=>{e.status&&g(t=>{const s=new Map(t);return s.set(e.projectId,e.status),s}),void 0!==e.active&&b(t=>{const s=new Set(t);return e.active?s.add(e.projectId):s.delete(e.projectId),s})},[]);n({onActivityUpdate:N});const{applyOrder:w}=r(),k=w(u.filter(e=>!e.archived));return l.jsxs("div",{className:"flex flex-col h-full",children:[l.jsxs("div",{className:"flex items-center gap-3 px-4 h-12 border-b border-border shrink-0",children:[l.jsx("span",{className:"font-semibold text-base flex-1",children:"CC Web"}),l.jsx(o,{}),l.jsx("button",{onClick:()=>{(async()=>{y(!0);try{await m()}finally{y(!1)}})()},className:"text-muted-foreground active:text-foreground",disabled:v,children:l.jsx(c,{className:i("h-4 w-4",v&&"animate-spin")})}),!ae&&l.jsx("button",{onClick:()=>x("/"),className:"text-muted-foreground active:text-foreground",title:"桌面模式",children:l.jsx(d,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"flex-1 overflow-y-auto px-3 py-3",children:[p&&!h&&l.jsx("div",{className:"text-center text-muted-foreground text-sm py-12",children:"加载中..."}),h&&0===k.length&&l.jsx("div",{className:"text-center text-muted-foreground text-sm py-12",children:"暂无项目"}),l.jsx("div",{className:"grid grid-cols-2 gap-2",children:k.map(t=>{var s;const a="running"===(s=t,f.get(s.id)??s.status??"stopped"),n=j.has(t.id),r=l.jsxs("button",{onClick:()=>e(t.id),className:i("w-full text-left rounded-xl border bg-card p-2.5 active:bg-accent transition-colors",n?"border-transparent":"border-border"),children:[l.jsxs("div",{className:"flex items-center gap-1.5 mb-1",children:[l.jsx("span",{className:i("w-2 h-2 rounded-full shrink-0",a?"bg-green-500":"bg-zinc-400")}),l.jsx("span",{className:"font-medium text-sm truncate flex-1",children:t.name})]}),l.jsx("div",{className:"text-[10px] text-muted-foreground font-mono truncate",children:t.cliTool??"claude"})]});return l.jsx("div",{className:n?"card-active-glow rounded-xl":void 0,children:r},t.id)})})]})]})}function re(e){if(!e.phase)return null;if("thinking"===e.phase)return"思考中";if("tool_result"===e.phase)return"处理结果";if("tool_use"===e.phase){const t=(e.detail||"").toLowerCase();return"bash"===t?"执行命令":"read"===t?"读取文件":"edit"===t||"multiedit"===t?"编辑文件":"write"===t?"写入文件":"grep"===t?"搜索内容":"glob"===t?"匹配文件":"webfetch"===t||"websearch"===t?"访问网络":"task"===t?"调度子任务":"todowrite"===t?"更新任务列表":"notebookedit"===t?"编辑 Notebook":e.detail?`调用 ${e.detail}`:"调用工具"}return null}function le({project:e,onBack:t,onOpenPanel:s,onContextUpdate:n}){const[r,o]=a.useState(""),c=a.useRef(null),d=a.useRef(null),[y,N]=a.useState([]),w=a.useCallback(e=>{N(t=>{const s=[...t,e];return s.length>200?s.slice(-200):s})},[]),k=a.useRef(null),C=a.useCallback(e=>{var t;"stopped"===e&&(null==(t=k.current)||t.call(k,"stopped"))},[]),[S,I]=a.useState([]),z=a.useRef(new Set),M=a.useCallback(e=>{z.current.has(e.toolUseId)||I(t=>t.some(t=>t.toolUseId===e.toolUseId)?t:[...t,{projectId:e.projectId,toolUseId:e.toolUseId,toolName:e.toolName,toolInput:e.toolInput,sessionId:e.sessionId,createdAt:e.createdAt}])},[]),P=a.useCallback(e=>{z.current.add(e.toolUseId),I(t=>t.filter(t=>t.toolUseId!==e.toolUseId))},[]),U=a.useCallback(e=>{z.current.add(e),I(t=>t.filter(t=>t.toolUseId!==e))},[]),[T,$]=a.useState(null),A=a.useRef(0),D=a.useCallback(e=>{var t,s,a;if(!e.active)return void $(null);if("text"===(null==(t=e.semantic)?void 0:t.phase))return void $(null);const n=null==(s=e.semantic)?void 0:s.phase,r=null==(a=e.semantic)?void 0:a.detail;$(e=>e?e.phase===n&&e.detail===r?e:{...e,phase:n,detail:r}:{id:"mab"+ ++A.current,phase:n,detail:r})},[]),{sendInput:H,connected:O}=x({projectId:e.id,enabled:!0,onChatMessage:w,onStatusChange:C,onContextUpdate:n,onApprovalRequest:M,onApprovalResolved:P,onSemanticUpdate:D});a.useEffect(()=>{if(!O)return;if("claude"!==e.cliTool)return;let t=!1;return u(e.id).then(e=>{if(t)return;const s=e.pending.filter(e=>!z.current.has(e.toolUseId));I(e=>{const t=new Map;for(const a of s)t.set(a.toolUseId,a);for(const s of e)t.has(s.toolUseId)||z.current.has(s.toolUseId)||t.set(s.toolUseId,s);return[...t.values()]})}).catch(()=>{}),()=>{t=!0}},[e.id,e.cliTool,O]);const{state:F,setState:q,messages:B,hasMoreHistory:W,loadMoreHistory:K,sendMessage:V,isWaking:G}=m({project:e,liveMessages:y,ws:{send:H,connected:O},historyLimit:20});k.current=q;const J=a.useRef(O);a.useEffect(()=>{!J.current&&O&&N([]),J.current=O},[O]);const Q=(()=>{for(let e=B.length-1;e>=0;e--)if("assistant"===B[e].role)return e;return-1})(),[ee,te]=a.useState([]),[ae,ne]=a.useState([]),[le,oe]=a.useState(null);a.useEffect(()=>{h().then(te).catch(()=>{}),p(e.id).then(ne).catch(()=>{})},[e.id]);const ce=a.useCallback(async()=>{const e=c.current,t=(null==e?void 0:e.scrollHeight)??0;await K(),requestAnimationFrame(()=>{e&&(e.scrollTop+=e.scrollHeight-t)})},[K]),ie=a.useRef(0);a.useEffect(()=>{const e=c.current;if(!e)return;const t=B.length>ie.current,s=0===ie.current&&B.length>0;ie.current=B.length,s?e.scrollTo({top:e.scrollHeight}):t&&e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},[B,S.length]);const[de,xe]=a.useState(!1),ue=a.useCallback(async()=>{const e=r.trim();if(!e||de)return;xe(!0);const t=await V(e);xe(!1),"delivered"===t&&(o(""),d.current&&(d.current.style.height="auto"))},[r,de,V]),me=f(ue,"shift"),he=a.useCallback((t,s)=>{oe(null),V(t.command),"project"===s&&g(e.id,t.id,!0).catch(e=>{console.error("Failed to mark shortcut used:",e)})},[V,e.id]),pe="live"===F;return l.jsxs("div",{className:"flex flex-col h-full bg-background",children:[l.jsxs("div",{className:"flex items-center gap-2 px-3 h-12 border-b border-border shrink-0",children:[l.jsx("button",{onClick:t,className:"text-muted-foreground active:text-foreground p-1",children:l.jsx(j,{className:"h-5 w-5"})}),l.jsxs("div",{className:"flex items-center gap-1.5 flex-1 min-w-0",children:[l.jsx("span",{className:"font-medium text-sm truncate",children:e.name}),l.jsx("span",{className:i("w-2 h-2 rounded-full shrink-0",pe?"bg-green-500":G?"bg-yellow-400 animate-pulse":"bg-zinc-400")})]}),l.jsx("button",{onClick:s,className:"text-muted-foreground active:text-foreground p-1",children:l.jsx(se,{className:"h-5 w-5"})})]}),l.jsxs("div",{ref:c,className:"flex-1 overflow-y-auto px-3 py-3 space-y-3 min-h-0",children:[W&&l.jsx("div",{className:"flex justify-center pb-1",children:l.jsxs("button",{onClick:()=>{ce()},className:"flex items-center gap-1 px-3 py-1.5 rounded-full text-xs text-muted-foreground border border-border active:bg-accent transition-colors",children:[l.jsx(X,{className:"h-3 w-3"}),"加载更早消息"]})}),B.map((e,t)=>{const s="user"===e.role;return l.jsx("div",{className:i("flex",s?"justify-end":"justify-start"),children:l.jsx("div",{className:i("max-w-[85%] rounded-xl px-3 py-2 break-words text-sm leading-relaxed",s?"bg-blue-500/15 text-foreground border border-blue-500/20 rounded-br-sm whitespace-pre-wrap":"bg-secondary text-secondary-foreground border border-border rounded-bl-sm"),children:s?e.content:l.jsx(E,{content:e.content,blocks:e.blocks,isLatest:t===Q})})},e.id)}),S.map(e=>l.jsx(L,{approval:e,onResolved:U},e.toolUseId)),T&&0===S.length&&l.jsx("div",{className:"flex justify-start",children:l.jsxs("div",{className:"rounded-2xl rounded-bl-md px-3 py-1.5 bg-black/5 dark:bg-white/10 border border-black/10 dark:border-white/15 flex items-center gap-2 text-xs text-muted-foreground",children:[l.jsx(R,{}),re(T)&&l.jsx("span",{children:re(T)})]})},T.id),0===B.length&&0===S.length&&!T&&"stopped"===F&&l.jsx("div",{className:"flex items-center justify-center h-full text-muted-foreground/40 text-sm",children:"暂无对话记录"}),G&&l.jsx("div",{className:"flex items-center justify-center py-4 text-yellow-400 text-sm animate-pulse",children:"启动中..."})]}),le&&l.jsx("div",{className:"border-t border-border max-h-48 overflow-y-auto shrink-0",children:l.jsxs("div",{className:"px-3 py-2 space-y-1",children:[("global"===le?ee:ae).map(e=>l.jsxs("button",{onClick:()=>he(e,le),disabled:G,className:i("w-full text-left rounded-md px-2.5 py-2 text-sm active:bg-accent transition-colors border border-border/50",G&&"opacity-50 cursor-not-allowed"),children:[l.jsx("div",{className:"font-medium text-xs",children:e.label}),l.jsx("div",{className:"text-[11px] text-muted-foreground font-mono truncate",children:e.command})]},e.id)),0===("global"===le?ee:ae).length&&l.jsx("div",{className:"text-center text-muted-foreground text-xs py-3",children:"暂无快捷 Prompts"})]})}),(ee.length>0||ae.length>0)&&l.jsxs("div",{className:"flex items-center gap-1.5 px-3 py-1.5 border-t border-border shrink-0",children:[l.jsxs("button",{onClick:()=>oe(e=>"global"===e?null:"global"),className:i("flex items-center gap-1 px-2 py-1 rounded-md text-xs transition-colors","global"===le?"bg-blue-500/15 text-blue-500":"text-muted-foreground active:bg-accent"),children:[l.jsx(_,{className:"h-3 w-3"}),"全局","global"===le&&l.jsx(Y,{className:"h-3 w-3"})]}),l.jsxs("button",{onClick:()=>oe(e=>"project"===e?null:"project"),className:i("flex items-center gap-1 px-2 py-1 rounded-md text-xs transition-colors","project"===le?"bg-blue-500/15 text-blue-500":"text-muted-foreground active:bg-accent"),children:[l.jsx(Z,{className:"h-3 w-3"}),"项目","project"===le&&l.jsx(Y,{className:"h-3 w-3"})]})]}),l.jsx("div",{className:"border-t border-border px-3 py-2 shrink-0",style:{paddingBottom:"max(0.5rem, env(safe-area-inset-bottom))"},children:l.jsxs("div",{className:"flex items-end gap-2",children:[l.jsx("textarea",{ref:d,value:r,onChange:e=>o(e.target.value),onKeyDown:me,disabled:G||de,placeholder:G?"启动中...":de?"发送中…":"stopped"===F?"输入消息(自动启动)...":"输入消息...",rows:1,className:i("flex-1 resize-none rounded-md border border-input bg-transparent px-3 py-2 text-sm outline-none","focus:ring-1 focus:ring-ring placeholder:text-muted-foreground/50","max-h-32 overflow-y-auto",(G||de)&&"opacity-50 cursor-not-allowed"),style:{minHeight:"2.5rem"},onInput:e=>{const t=e.currentTarget;t.style.height="auto",t.style.height=Math.min(t.scrollHeight,128)+"px"}}),l.jsx("button",{onClick:ue,disabled:G||de||!r.trim(),className:i("shrink-0 p-2 rounded-md transition-colors",r.trim()&&!de?"text-blue-500 active:bg-blue-500/10":"text-muted-foreground/30"),children:de?l.jsx(b,{className:"h-5 w-5 animate-spin"}):l.jsx(v,{className:"h-5 w-5"})})]})})]})}const oe=S.lazy(()=>I(()=>import("./OfficePreview-C6EJB80i.js"),__vite__mapDeps([0,1,2,3])).then(e=>({default:e.OfficePreview}))),ce=new Set(["png","jpg","jpeg","gif","webp","svg","bmp","ico","avif"]),ie=new Set(["docx","xlsx","xls","pptx"]),de={js:"javascript",jsx:"jsx",ts:"typescript",tsx:"tsx",py:"python",rb:"ruby",go:"go",rs:"rust",java:"java",kt:"kotlin",swift:"swift",c:"c",cpp:"cpp",h:"c",cs:"csharp",php:"php",sh:"bash",bash:"bash",zsh:"bash",yaml:"yaml",yml:"yaml",json:"json",toml:"toml",html:"html",htm:"html",xml:"xml",svg:"xml",css:"css",scss:"scss",less:"less",sql:"sql",graphql:"graphql",gql:"graphql",dockerfile:"docker",makefile:"makefile",r:"r",lua:"lua",dart:"dart",zig:"zig"};function xe(e){return e.split("/").pop()??e}function ue({filePath:e,onBack:t}){const[s,n]=a.useState(null),[r,o]=a.useState(!0),[c,i]=a.useState(null),{resolved:d}=y(),x=function(e){const t=e.split("/").pop()??"",s=t.toLowerCase();if("dockerfile"===s)return"dockerfile";if("makefile"===s)return"makefile";const a=t.lastIndexOf(".");return a>=0?t.slice(a+1).toLowerCase():""}(e),u=ce.has(x),m=ie.has(x),h=de[x],p="dark"===d;a.useEffect(()=>{u||m?o(!1):(o(!0),i(null),N(e).then(n).catch(e=>i(e instanceof Error?e.message:"Failed to load")).finally(()=>o(!1)))},[e,u,m]);const f=C(e),g=a.useMemo(()=>{const e=w();return e?`${f}&token=${encodeURIComponent(e)}`:f},[f]),v=a.useMemo(()=>u?`${g}&t=${Date.now()}`:"",[g,u]);return l.jsxs("div",{className:"flex flex-col h-full",children:[l.jsxs("div",{className:"flex items-center gap-2 px-3 h-12 border-b border-border shrink-0",children:[l.jsx("button",{onClick:t,className:"text-muted-foreground active:text-foreground p-1",children:l.jsx(j,{className:"h-5 w-5"})}),l.jsx("span",{className:"flex-1 text-sm font-medium truncate",children:xe(e)}),l.jsx("a",{href:g,download:!0,className:"text-muted-foreground active:text-foreground p-1",onClick:e=>e.stopPropagation(),children:l.jsx(k,{className:"h-4 w-4"})})]}),l.jsxs("div",{className:"flex-1 overflow-auto min-h-0",children:[r&&l.jsx("div",{className:"flex items-center justify-center py-12",children:l.jsx(b,{className:"h-5 w-5 animate-spin text-muted-foreground"})}),c&&l.jsx("div",{className:"text-center text-destructive text-sm py-12 px-4",children:c}),u&&l.jsx("div",{className:"flex items-center justify-center p-4 h-full",children:l.jsx("img",{src:v,alt:xe(e),className:"max-w-full max-h-full object-contain rounded",style:{touchAction:"pinch-zoom"}})}),m&&l.jsx(a.Suspense,{fallback:l.jsx("div",{className:"flex items-center justify-center py-12",children:l.jsx(b,{className:"h-5 w-5 animate-spin text-muted-foreground"})}),children:l.jsx(oe,{filePath:e,ext:x,zoom:100})}),s&&(s.binary||s.tooLarge)&&l.jsxs("div",{className:"text-center py-12 px-4 space-y-3",children:[l.jsxs("p",{className:"text-muted-foreground text-sm",children:[s.binary?"二进制文件":"文件过大",s.size>0&&` (${S=s.size,S<1024?`${S} B`:S<1048576?`${(S/1024).toFixed(1)} KB`:`${(S/1048576).toFixed(1)} MB`})`]}),l.jsxs("a",{href:g,download:!0,className:"inline-flex items-center gap-1.5 text-sm text-blue-500 active:text-blue-400",children:[l.jsx(k,{className:"h-4 w-4"}),"下载文件"]})]}),s&&!s.binary&&!s.tooLarge&&null!=s.content&&l.jsxs(l.Fragment,{children:["md"===x&&l.jsx("div",{className:"prose prose-sm dark:prose-invert max-w-none px-4 py-3",children:l.jsx(H,{remarkPlugins:[F,q],rehypePlugins:[O],urlTransform:(e,t,s)=>"src"===t&&"img"===s.tagName?e:W(e),components:{img:({src:t,alt:s,...a})=>l.jsx("img",{...a,src:B(e,t,w()),alt:s??"",loading:"lazy",style:{maxWidth:"100%",height:"auto"}})},children:s.content})}),"md"!==x&&h&&l.jsx(K,{language:h,style:p?V:G,customStyle:{margin:0,fontSize:"12px",borderRadius:0},showLineNumbers:!0,children:s.content}),"md"!==x&&!h&&l.jsx("pre",{className:"p-4 text-xs font-mono whitespace-pre-wrap break-words",children:s.content})]})]})]});var S}const me=new Set(["png","jpg","jpeg","gif","webp","svg","bmp","ico","avif"]),he=new Set(["js","jsx","ts","tsx","py","rb","go","rs","java","c","cpp","h","swift","kt","cs","php","sh","bash","zsh","r","lua","dart","zig","css","scss","less","html","htm","xml","sql"]),pe=new Set(["json","yaml","yml","toml","csv","tsv"]);function fe({entry:e}){if("dir"===e.type)return l.jsx(P,{className:"h-8 w-8 text-blue-400"});const t=function(e){const t=e.lastIndexOf(".");return t>=0?e.slice(t+1).toLowerCase():""}(e.name);return me.has(t)?l.jsx(J,{className:"h-8 w-8 text-emerald-400"}):he.has(t)?l.jsx(ee,{className:"h-8 w-8 text-orange-400"}):pe.has(t)?l.jsx(te,{className:"h-8 w-8 text-yellow-400"}):"md"===t?l.jsx(Q,{className:"h-8 w-8 text-sky-400"}):l.jsx(U,{className:"h-8 w-8 text-muted-foreground"})}function ge({rootPath:e,onClose:t}){const[s,n]=a.useState(e),[r,o]=a.useState([]),[c,i]=a.useState(!0),[d,x]=a.useState(null),u=a.useCallback(async e=>{i(!0);try{const t=[...(await z(e)).entries].sort((e,t)=>e.type!==t.type?"dir"===e.type?-1:1:e.name.localeCompare(t.name));o(t),n(e)}catch{o([])}finally{i(!1)}},[]);a.useEffect(()=>{u(e)},[e,u]);const m=s!==e,h=s.startsWith(e)?s.slice(e.length)||"/":s;return d?l.jsx(ue,{filePath:d,onBack:()=>x(null)}):l.jsxs("div",{className:"flex flex-col h-full",children:[l.jsxs("div",{className:"flex items-center gap-2 px-3 h-12 border-b border-border shrink-0",children:[l.jsx("button",{onClick:t,className:"text-muted-foreground active:text-foreground p-1",children:l.jsx(M,{className:"h-5 w-5"})}),l.jsxs("div",{className:"flex items-center gap-1 flex-1 min-w-0 text-sm",children:[m&&l.jsx("button",{onClick:()=>{if(s===e)return;const t=s.replace(/\/[^/]+$/,"")||"/";t.startsWith(e)&&u(t)},className:"text-muted-foreground active:text-foreground p-0.5 shrink-0",children:l.jsx(j,{className:"h-4 w-4"})}),l.jsx("span",{className:"truncate text-muted-foreground font-mono text-xs",children:h})]})]}),l.jsxs("div",{className:"flex-1 overflow-y-auto px-3 py-3",children:[c&&l.jsx("div",{className:"flex items-center justify-center py-12",children:l.jsx(b,{className:"h-5 w-5 animate-spin text-muted-foreground"})}),!c&&0===r.length&&l.jsx("div",{className:"text-center text-muted-foreground text-sm py-12",children:"空目录"}),!c&&l.jsx("div",{className:"grid grid-cols-3 gap-1",children:r.map(e=>l.jsxs("button",{onClick:()=>(e=>{"dir"===e.type?u(e.path):x(e.path)})(e),className:"flex flex-col items-center gap-1 p-2 rounded-md active:bg-accent transition-colors",children:[l.jsx(fe,{entry:e}),l.jsx("span",{className:"text-[11px] text-center leading-tight w-full line-clamp-2 break-all",children:e.name})]},e.path))})]})]})}function je(e){return e<50?"text-green-400":e<80?"text-yellow-400":"text-red-400"}function be(e){return e<50?"bg-green-500":e<80?"bg-yellow-500":"bg-red-500"}function ve({projectName:e,cliTool:t,folderPath:s,contextData:n,onClose:r}){const[o,d]=a.useState(new Set(["context","usage","files"])),[x,u]=a.useState(null),[m,h]=a.useState(!1),p=e=>{d(t=>{const s=new Set(t);return s.has(e)?s.delete(e):s.add(e),s})};a.useEffect(()=>{h(!0),T(t).then(u).catch(()=>u(null)).finally(()=>h(!1))},[t]);const f=n?Math.round(n.usedPercentage):null;return l.jsxs("div",{className:"flex flex-col h-full",children:[l.jsxs("div",{className:"flex items-center gap-2 px-3 h-12 border-b border-border shrink-0",children:[l.jsx("button",{onClick:r,className:"text-muted-foreground active:text-foreground p-1",children:l.jsx(M,{className:"h-5 w-5"})}),l.jsx("span",{className:"flex-1 font-medium text-sm truncate",children:e})]}),l.jsxs("div",{className:"flex-1 overflow-y-auto",children:[l.jsxs("button",{onClick:()=>p("context"),className:"w-full flex items-center gap-2 px-4 py-2.5 border-b border-border/50 active:bg-accent",children:[o.has("context")?l.jsx(Y,{className:"h-3.5 w-3.5 text-muted-foreground"}):l.jsx($,{className:"h-3.5 w-3.5 text-muted-foreground"}),l.jsx("span",{className:"text-sm font-medium",children:"上下文"}),null!==f&&l.jsxs("span",{className:i("text-xs font-mono ml-auto",je(f)),children:[f,"%"]})]}),o.has("context")&&l.jsx("div",{className:"px-4 py-3 border-b border-border/50",children:null!==f&&n?l.jsxs("div",{className:"space-y-2",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx("div",{className:"flex-1 h-2 bg-secondary rounded-full overflow-hidden",children:l.jsx("div",{className:i("h-full rounded-full transition-all",be(f)),style:{width:`${Math.min(f,100)}%`}})}),l.jsxs("span",{className:i("text-xs font-mono w-10 text-right",je(f)),children:[f,"%"]})]}),l.jsxs("div",{className:"grid grid-cols-2 gap-x-4 gap-y-1 text-[11px] text-muted-foreground",children:[l.jsx("span",{children:"窗口大小"}),l.jsx("span",{className:"text-right font-mono",children:n.contextWindowSize>=1e6?`${(n.contextWindowSize/1e6).toFixed(1)}M`:`${Math.round(n.contextWindowSize/1e3)}K`}),l.jsx("span",{children:"输入 tokens"}),l.jsx("span",{className:"text-right font-mono",children:n.inputTokens.toLocaleString()}),l.jsx("span",{children:"输出 tokens"}),l.jsx("span",{className:"text-right font-mono",children:n.outputTokens.toLocaleString()})]})]}):l.jsx("div",{className:"text-xs text-muted-foreground/50 text-center py-2",children:"暂无数据"})}),l.jsxs("div",{className:"w-full flex items-center gap-2 px-4 py-2.5 border-b border-border/50 cursor-pointer",role:"button",tabIndex:0,onClick:()=>p("usage"),onKeyDown:e=>{"Enter"!==e.key&&" "!==e.key||p("usage")},children:[o.has("usage")?l.jsx(Y,{className:"h-3.5 w-3.5 text-muted-foreground"}):l.jsx($,{className:"h-3.5 w-3.5 text-muted-foreground"}),l.jsx("span",{className:"text-sm font-medium",children:"用量"}),l.jsx("button",{onClick:e=>{e.stopPropagation(),(async()=>{h(!0);try{const{refreshUsage:e}=await I(async()=>{const{refreshUsage:e}=await import("./index-CxHOCf_s.js").then(e=>e.bJ);return{refreshUsage:e}},__vite__mapDeps([1,2]));u(await e(t))}catch{}finally{h(!1)}})()},className:"ml-auto text-muted-foreground active:text-foreground",children:l.jsx(c,{className:i("h-3 w-3",m&&"animate-spin")})})]}),o.has("usage")&&l.jsx("div",{className:"px-4 py-3 border-b border-border/50",children:x?l.jsxs("div",{className:"space-y-2",children:[x.planName&&l.jsxs("div",{className:"text-[11px] text-muted-foreground",children:["Plan: ",l.jsx("span",{className:"font-medium text-foreground",children:x.planName})]}),l.jsx(ye,{label:"5h",bucket:x.fiveHour}),l.jsx(ye,{label:"7d",bucket:x.sevenDay}),x.sevenDaySonnet&&l.jsx(ye,{label:"7d Sonnet",bucket:x.sevenDaySonnet}),x.sevenDayOpus&&l.jsx(ye,{label:"7d Opus",bucket:x.sevenDayOpus}),!x.fiveHour&&!x.sevenDay&&l.jsx("div",{className:"text-xs text-muted-foreground/50 text-center",children:"暂无数据"})]}):l.jsx("div",{className:"text-xs text-muted-foreground/50 text-center py-2",children:m?"加载中...":"暂无数据"})}),l.jsxs("button",{onClick:()=>p("files"),className:"w-full flex items-center gap-2 px-4 py-2.5 border-b border-border/50 active:bg-accent",children:[o.has("files")?l.jsx(Y,{className:"h-3.5 w-3.5 text-muted-foreground"}):l.jsx($,{className:"h-3.5 w-3.5 text-muted-foreground"}),l.jsx("span",{className:"text-sm font-medium",children:"文件"})]}),o.has("files")&&l.jsx("div",{className:"h-[60vh]",children:l.jsx(ge,{rootPath:s,onClose:()=>p("files")})})]})]})}function ye({label:e,bucket:t}){if(!t||void 0===t.utilization)return null;const s=t.utilization,a=function(e){if(!e)return"";const t=new Date(e).getTime()-Date.now();if(t<=0)return"即将重置";const s=Math.floor(t/36e5),a=Math.floor(t%36e5/6e4);return s>0?`${s}h${a}m`:`${a}m`}(t.resetAt);return l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx("span",{className:"text-xs text-muted-foreground w-16",children:e}),l.jsx("div",{className:"flex-1 h-1.5 bg-secondary rounded-full overflow-hidden",children:l.jsx("div",{className:i("h-full rounded-full",be(s)),style:{width:`${Math.min(s,100)}%`}})}),l.jsxs("span",{className:i("text-xs font-mono w-8 text-right",je(s)),children:[s,"%"]}),a&&l.jsx("span",{className:"text-[10px] text-muted-foreground/60",children:a})]})}function Ne(){a.useEffect(()=>{const e=document.querySelector('meta[name="viewport"]');if(!e)return;const t=e.getAttribute("content")??"";return e.setAttribute("content","width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover"),()=>{e.setAttribute("content",t)}},[]);const[e,t]=a.useState({screen:"list"}),[n,r]=a.useState(null),o=s(e=>e.projects),c=a.useCallback(e=>{t({screen:"chat",projectId:e}),r(null)},[]),i=a.useCallback(e=>{t({screen:"panel",projectId:e})},[]),d=a.useCallback(()=>{t(e=>"panel"===e.screen?{screen:"chat",projectId:e.projectId}:{screen:"list"})},[]),x="list"!==e.screen?o.find(t=>t.id===e.projectId):void 0;return l.jsxs("div",{className:"fixed inset-0 bg-background overflow-hidden",children:[l.jsxs(A,{mode:"wait",children:["list"===e.screen&&l.jsx(D.div,{className:"absolute inset-0",initial:{opacity:0},animate:{opacity:1},exit:{x:"-30%",opacity:0},transition:{duration:.2},style:{paddingTop:"env(safe-area-inset-top)"},children:l.jsx(ne,{onSelectProject:c})},"list"),"chat"===e.screen&&x&&l.jsx(D.div,{className:"absolute inset-0",initial:{x:"100%"},animate:{x:0},exit:{x:"100%"},transition:{type:"tween",duration:.25},style:{paddingTop:"env(safe-area-inset-top)"},children:l.jsx(le,{project:x,onBack:d,onOpenPanel:()=>i(e.projectId),onContextUpdate:r})},`chat-${e.projectId}`)]}),l.jsx(A,{children:"panel"===e.screen&&x&&l.jsx(D.div,{className:"absolute inset-0 z-50 bg-background",initial:{x:"100%"},animate:{x:0},exit:{x:"100%"},transition:{type:"tween",duration:.25},style:{paddingTop:"env(safe-area-inset-top)"},children:l.jsx(ve,{projectName:x.name,cliTool:x.cliTool??"claude",folderPath:x.folderPath,contextData:n,onClose:d})},"panel")})]})}export{Ne as MobilePage};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-
|
|
2
|
-
import{j as e,r as t,_ as s,g as r,f as a}from"./index-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-BptnURrX.js","assets/index-CxHOCf_s.js","assets/index-Big9FXD0.css","assets/jszip.min-CfribT02.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{j as e,r as t,_ as s,g as r,f as a}from"./index-CxHOCf_s.js";import{p as n}from"./purify.es-CgRAQgUo.js";async function l(e){let t=a(e);const s=r();s&&(t+=`${t.includes("?")?"&":"?"}token=${encodeURIComponent(s)}`);const n=await fetch(t);if(!n.ok)throw new Error(`Failed to fetch file: ${n.status}`);return n.arrayBuffer()}function o({filePath:r,zoom:a}){const[o,i]=t.useState(""),[d,c]=t.useState(null),[x,u]=t.useState(!0);return t.useEffect(()=>{let e=!1;return u(!0),c(null),(async()=>{try{const t=await s(()=>import("./index-BptnURrX.js").then(e=>e.i),__vite__mapDeps([0,1,2,3])),a=await l(r),n=await t.convertToHtml({arrayBuffer:a});e||i(n.value)}catch(t){e||c(t instanceof Error?t.message:"Failed to render docx")}finally{e||u(!1)}})(),()=>{e=!0}},[r]),x?e.jsx("p",{className:"text-sm text-muted-foreground p-4",children:"加载 Word 文档中..."}):d?e.jsx("p",{className:"text-sm text-destructive p-4",children:d}):e.jsx("div",{className:"p-6 prose dark:prose-invert max-w-none",style:{fontSize:12*a/100+"px"},dangerouslySetInnerHTML:{__html:n.sanitize(o)}})}function i({filePath:r,zoom:a}){var o;const[i,d]=t.useState([]),[c,x]=t.useState(0),[u,p]=t.useState(null),[m,f]=t.useState(!0);return t.useEffect(()=>{let e=!1;return f(!0),p(null),(async()=>{try{const t=await s(()=>import("./xlsx-DfDjAMCE.js"),[]),a=await l(r),n=t.read(a,{type:"array"}),o=n.SheetNames.map(e=>({name:e,html:t.utils.sheet_to_html(n.Sheets[e],{editable:!1})}));e||(d(o),x(0))}catch(t){e||p(t instanceof Error?t.message:"Failed to render xlsx")}finally{e||f(!1)}})(),()=>{e=!0}},[r]),m?e.jsx("p",{className:"text-sm text-muted-foreground p-4",children:"加载 Excel 文件中..."}):u?e.jsx("p",{className:"text-sm text-destructive p-4",children:u}):0===i.length?e.jsx("p",{className:"text-sm text-muted-foreground p-4",children:"空文件"}):e.jsxs("div",{className:"flex flex-col h-full",children:[i.length>1&&e.jsx("div",{className:"flex gap-0.5 px-3 py-1.5 border-b border-border bg-muted/30 flex-shrink-0 overflow-x-auto",children:i.map((t,s)=>e.jsx("button",{onClick:()=>x(s),className:"px-3 py-1 text-xs rounded-t transition-colors whitespace-nowrap "+(s===c?"bg-background text-foreground border border-b-0 border-border":"text-muted-foreground hover:text-foreground"),children:t.name},s))}),e.jsx("div",{className:"flex-1 overflow-auto p-2 xlsx-preview",style:{fontSize:12*a/100+"px"},dangerouslySetInnerHTML:{__html:n.sanitize((null==(o=i[c])?void 0:o.html)??"")}}),e.jsx("style",{children:"\n .xlsx-preview table { border-collapse: collapse; width: auto; min-width: 100%; }\n .xlsx-preview td, .xlsx-preview th {\n border: 1px solid hsl(var(--border));\n padding: 4px 8px;\n text-align: left;\n white-space: nowrap;\n font-size: inherit;\n }\n .xlsx-preview th { background: hsl(var(--muted)); font-weight: 600; }\n .xlsx-preview tr:hover td { background: hsl(var(--accent) / 0.3); }\n "})]})}function d({filePath:r,zoom:a}){const[n,o]=t.useState([]),[i,d]=t.useState(null),[c,x]=t.useState(!0);return t.useEffect(()=>{let e=!1;return x(!0),d(null),(async()=>{try{const t=await l(r),a=await async function(e){const{default:t}=await s(async()=>{const{default:e}=await import("./jszip.min-CfribT02.js").then(e=>e.j);return{default:e}},__vite__mapDeps([3,1,2])),r=await t.loadAsync(e),a=[],n=Object.keys(r.files).filter(e=>/^ppt\/slides\/slide\d+\.xml$/i.test(e)).sort((e,t)=>{var s,r;return parseInt((null==(s=e.match(/slide(\d+)/))?void 0:s[1])??"0")-parseInt((null==(r=t.match(/slide(\d+)/))?void 0:r[1])??"0")});for(let s=0;s<n.length;s++){const e=await r.file(n[s]).async("text"),t=[],l=/<a:t[^>]*>([\s\S]*?)<\/a:t>/g;let o;for(;null!==(o=l.exec(e));){const e=o[1].replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').trim();e&&t.push(e)}a.push({index:s+1,texts:t})}return a}(t);e||o(a)}catch(t){e||d(t instanceof Error?t.message:"Failed to render pptx")}finally{e||x(!1)}})(),()=>{e=!0}},[r]),c?e.jsx("p",{className:"text-sm text-muted-foreground p-4",children:"加载 PPT 文件中..."}):i?e.jsx("p",{className:"text-sm text-destructive p-4",children:i}):0===n.length?e.jsx("p",{className:"text-sm text-muted-foreground p-4",children:"空文件"}):e.jsx("div",{className:"p-4 space-y-4",style:{fontSize:12*a/100+"px"},children:n.map(t=>e.jsxs("div",{className:"border border-border rounded-xl p-5 bg-muted/20",children:[e.jsxs("div",{className:"text-xs text-muted-foreground mb-2 font-medium",children:["Slide ",t.index]}),t.texts.length>0?e.jsx("div",{className:"space-y-1.5",children:t.texts.map((t,s)=>e.jsx("p",{className:"text-foreground leading-relaxed",style:{fontSize:"inherit"},children:t},s))}):e.jsx("p",{className:"text-muted-foreground text-sm italic",children:"(无文本内容)"})]},t.index))})}const c=new Set(["docx","xlsx","xls","pptx"]);function x({filePath:t,ext:s,zoom:r}){return"docx"===s?e.jsx(o,{filePath:t,zoom:r}):"xlsx"===s||"xls"===s?e.jsx(i,{filePath:t,zoom:r}):"pptx"===s?e.jsx(d,{filePath:t,zoom:r}):null}export{c as OFFICE_EXTS,x as OfficePreview};
|