@tom2012/cc-web 2026.4.25-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.
Files changed (23) hide show
  1. package/README.md +1 -1
  2. package/backend/dist/adapters/claude/scheduled.d.ts +27 -23
  3. package/backend/dist/adapters/claude/scheduled.d.ts.map +1 -1
  4. package/backend/dist/adapters/claude/scheduled.js +169 -95
  5. package/backend/dist/adapters/claude/scheduled.js.map +1 -1
  6. package/frontend/dist/assets/{AssistantMessageContent-C4lyyfDm.js → AssistantMessageContent-BBXSX58q.js} +1 -1
  7. package/frontend/dist/assets/{GraphPreview-BRdkqlmD.js → GraphPreview-BAnpFmtm.js} +1 -1
  8. package/frontend/dist/assets/{MobilePage-qi0dfILy.js → MobilePage-BR1R_xht.js} +3 -3
  9. package/frontend/dist/assets/{OfficePreview-BzBMiH_d.js → OfficePreview-C6EJB80i.js} +2 -2
  10. package/frontend/dist/assets/{ProjectPage-BqLfh1iX.js → ProjectPage-fWJrKu-y.js} +5 -5
  11. package/frontend/dist/assets/{SettingsPage-BzQIJxGE.js → SettingsPage-BxT6q4Fq.js} +1 -1
  12. package/frontend/dist/assets/{SkillHubPage-CqPvzIcM.js → SkillHubPage-DJzYMG0j.js} +1 -1
  13. package/frontend/dist/assets/{chevron-down-B_nhBlPg.js → chevron-down-CxmD4ySz.js} +1 -1
  14. package/frontend/dist/assets/{chevron-up-Bod9VZ9-.js → chevron-up-BznxDhNi.js} +1 -1
  15. package/frontend/dist/assets/index-Big9FXD0.css +1 -0
  16. package/frontend/dist/assets/{index-Ok4Og1hF.js → index-BptnURrX.js} +1 -1
  17. package/frontend/dist/assets/{index-CS2kkdD8.js → index-CxHOCf_s.js} +2 -2
  18. package/frontend/dist/assets/{index-SO3nb-2m.js → index-DwNsYVM3.js} +1 -1
  19. package/frontend/dist/assets/{jszip.min-D2NE_gdV.js → jszip.min-CfribT02.js} +1 -1
  20. package/frontend/dist/assets/{search-6b8P41jh.js → search-BPzU-LtZ.js} +1 -1
  21. package/frontend/dist/index.html +2 -2
  22. package/package.json +1 -1
  23. 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.25-a | [GitHub](https://github.com/zbc0315/cc-web) | MIT License
5
+ **Current version**: v2026.4.26-b | [GitHub](https://github.com/zbc0315/cc-web) | MIT License
6
6
 
7
7
  ## Features
8
8
 
@@ -1,34 +1,38 @@
1
1
  /**
2
- * Claude Code CLI scheduled-tasks reader.
2
+ * Claude Code CLI scheduled-tasks reader (best-effort reconstruction).
3
3
  *
4
- * Reads `~/.claude/scheduled_tasks.json` (durable /loop tasks Claude wrote
5
- * via CronCreate / ScheduleWakeup with `durable: true`) and filters to the
6
- * tasks whose originating session's cwd matches a given project folderPath.
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.
7
11
  *
8
- * Claude CLI path / schema reverse-engineered from v2.1.117 Mach-O binary
9
- * (see research/scheduled-wakeup-panel-plan.md). Session-only tasks are
10
- * invisible here they live in CLI process memory, never hit disk.
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.
20
+ *
21
+ * The UI must label this list as "best-effort reconstruction", not the
22
+ * authoritative live state.
11
23
  */
12
- export interface RawScheduledTask {
24
+ export interface ScheduledTask {
13
25
  id: string;
14
- cron: string;
26
+ type: 'ScheduleWakeup' | 'CronCreate';
27
+ cron: string | null;
28
+ delaySeconds: number | null;
29
+ recurring: boolean;
15
30
  prompt: string;
31
+ reason: string | null;
16
32
  createdAt: number;
17
- recurring?: boolean;
18
- agentId?: string;
19
- createdBySessionId?: string;
20
- createdByPid?: number;
21
- lastFiredAt?: number;
22
- }
23
- export interface ScheduledTask extends RawScheduledTask {
24
33
  nextFireAt: string | null;
34
+ sessionId: string;
35
+ durable: boolean;
25
36
  }
26
- export declare function loadScheduledTasks(): RawScheduledTask[];
27
- /**
28
- * Return scheduled tasks whose originating session's cwd === folderPath.
29
- * Tasks without `createdBySessionId` (agent/headless-created, rare) are
30
- * excluded — we can't attribute them. Tasks whose session has exited
31
- * (stale sessions file cleanup) are also excluded, by design.
32
- */
33
37
  export declare function tasksForProject(folderPath: string): ScheduledTask[];
34
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;;;;;;;;;;GAUG;AAaH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAc,SAAQ,gBAAgB;IACrD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAgB,kBAAkB,IAAI,gBAAgB,EAAE,CAmBvD;AA8DD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,EAAE,CAgBnE"}
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,14 +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
- * Reads `~/.claude/scheduled_tasks.json` (durable /loop tasks Claude wrote
6
- * via CronCreate / ScheduleWakeup with `durable: true`) and filters to the
7
- * tasks whose originating session's cwd matches a given project folderPath.
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.
8
12
  *
9
- * Claude CLI path / schema reverse-engineered from v2.1.117 Mach-O binary
10
- * (see research/scheduled-wakeup-panel-plan.md). Session-only tasks are
11
- * invisible here they live in CLI process memory, never hit disk.
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.
21
+ *
22
+ * The UI must label this list as "best-effort reconstruction", not the
23
+ * authoritative live state.
12
24
  */
13
25
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
26
  if (k2 === undefined) k2 = k;
@@ -44,7 +56,6 @@ var __importStar = (this && this.__importStar) || (function () {
44
56
  };
45
57
  })();
46
58
  Object.defineProperty(exports, "__esModule", { value: true });
47
- exports.loadScheduledTasks = loadScheduledTasks;
48
59
  exports.tasksForProject = tasksForProject;
49
60
  const fs = __importStar(require("fs"));
50
61
  const path = __importStar(require("path"));
@@ -52,110 +63,173 @@ const os = __importStar(require("os"));
52
63
  const cron_parser_1 = require("cron-parser");
53
64
  const logger_1 = require("../../logger");
54
65
  const log = (0, logger_1.modLogger)('scheduled');
55
- const SCHEDULED_FILE = path.join(os.homedir(), '.claude', 'scheduled_tasks.json');
56
- const SESSIONS_DIR = path.join(os.homedir(), '.claude', 'sessions');
57
- function loadScheduledTasks() {
58
- try {
59
- if (!fs.existsSync(SCHEDULED_FILE))
60
- return [];
61
- const raw = fs.readFileSync(SCHEDULED_FILE, 'utf-8');
62
- const parsed = JSON.parse(raw);
63
- if (!Array.isArray(parsed)) {
64
- log.warn({ file: SCHEDULED_FILE }, 'scheduled_tasks.json is not an array');
65
- return [];
66
- }
67
- return parsed.filter((t) => !!t && typeof t === 'object' && typeof t.id === 'string' &&
68
- typeof t.cron === 'string' &&
69
- typeof t.prompt === 'string');
70
- }
71
- catch (err) {
72
- log.warn({ err, file: SCHEDULED_FILE }, 'failed to read scheduled_tasks.json');
73
- return [];
74
- }
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, '-');
75
71
  }
76
- /**
77
- * Canonicalize an on-disk path for equality comparison: resolve symlinks +
78
- * normalize. Falls back to `path.resolve` if realpath fails (e.g., the path
79
- * no longer exists because the session's cwd was deleted). Without this
80
- * `Project.folderPath` (stored raw at create-time) and the CLI's captured
81
- * `cwd` can differ by trailing slash / symlink even when semantically equal.
82
- */
83
- function canonicalizePath(p) {
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;
84
82
  try {
85
- return fs.realpathSync(p);
83
+ rec = JSON.parse(line);
86
84
  }
87
85
  catch {
88
- return path.resolve(p);
86
+ return [];
89
87
  }
90
- }
91
- /**
92
- * Build a sessionId → canonical-cwd index by scanning `~/.claude/sessions/*.json`.
93
- * Files are named by PID, so we have to open each one. Cheap in practice
94
- * (O(few dozen), small JSON), and this is called at most once per request.
95
- */
96
- function buildSessionCwdIndex() {
97
- const index = new Map();
98
- try {
99
- if (!fs.existsSync(SESSIONS_DIR))
100
- return index;
101
- const files = fs.readdirSync(SESSIONS_DIR);
102
- for (const f of files) {
103
- if (!f.endsWith('.json'))
104
- continue;
105
- try {
106
- const raw = fs.readFileSync(path.join(SESSIONS_DIR, f), 'utf-8');
107
- const meta = JSON.parse(raw);
108
- if (meta.sessionId && meta.cwd)
109
- index.set(meta.sessionId, canonicalizePath(meta.cwd));
110
- }
111
- catch {
112
- // per-file parse failure is non-fatal; skip
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
+ }
113
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
+ });
114
157
  }
115
158
  }
116
- catch (err) {
117
- log.warn({ err, dir: SESSIONS_DIR }, 'failed to scan sessions dir');
118
- }
119
- return index;
159
+ return out;
120
160
  }
121
- function computeNextFire(cron, fromHint) {
122
- // We want the next FUTURE fire. If the hint (lastFiredAt or createdAt) is
123
- // in the past (because the creator process died or the file is stale),
124
- // starting cron-parser from it would return an already-past date. Clamp
125
- // to now so we always show a forward-looking timestamp.
126
- const start = Math.max(fromHint, Date.now());
161
+ function readSessionFile(file) {
162
+ let raw;
127
163
  try {
128
- const it = cron_parser_1.CronExpressionParser.parse(cron, { currentDate: new Date(start) });
129
- return it.next().toDate().toISOString();
164
+ raw = fs.readFileSync(file, 'utf-8');
130
165
  }
131
- catch {
132
- return null;
166
+ catch (err) {
167
+ log.warn({ err, file }, 'failed to read session jsonl');
168
+ return [];
133
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
+ }
183
+ }
184
+ return out;
134
185
  }
135
- /**
136
- * Return scheduled tasks whose originating session's cwd === folderPath.
137
- * Tasks without `createdBySessionId` (agent/headless-created, rare) are
138
- * excluded — we can't attribute them. Tasks whose session has exited
139
- * (stale sessions file cleanup) are also excluded, by design.
140
- */
141
186
  function tasksForProject(folderPath) {
142
- const all = loadScheduledTasks();
143
- if (all.length === 0)
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.
144
194
  return [];
145
- const idx = buildSessionCwdIndex();
146
- const targetCwd = canonicalizePath(folderPath);
147
- const out = [];
148
- for (const t of all) {
149
- if (!t.createdBySessionId)
195
+ }
196
+ const cutoffMs = Date.now() - SEVEN_DAYS_MS;
197
+ const sessionFiles = [];
198
+ for (const name of entries) {
199
+ if (!name.endsWith('.jsonl'))
150
200
  continue;
151
- const cwd = idx.get(t.createdBySessionId);
152
- if (cwd !== targetCwd)
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())
153
210
  continue;
154
- out.push({
155
- ...t,
156
- nextFireAt: computeNextFire(t.cron, t.lastFiredAt ?? t.createdAt),
157
- });
211
+ if (stat.mtimeMs < cutoffMs)
212
+ continue; // untouched >7d, skip
213
+ sessionFiles.push(full);
158
214
  }
159
- return out;
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;
160
234
  }
161
235
  //# sourceMappingURL=scheduled.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scheduled.js","sourceRoot":"","sources":["../../../src/adapters/claude/scheduled.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scheduled.js","sourceRoot":"","sources":["../../../src/adapters/claude/scheduled.ts"],"names":[],"mappings":"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"}
@@ -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-CS2kkdD8.js";import{C as E}from"./chevron-down-B_nhBlPg.js";import{C as S,a as v}from"./chevron-up-Bod9VZ9-.js";function w(){!e.current&&t();const[a]=n.useState(r.current);return a}
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-CS2kkdD8.js";import{Z as s,a as l}from"./ProjectPage-BqLfh1iX.js";import"./purify.es-CgRAQgUo.js";import"./AssistantMessageContent-C4lyyfDm.js";import"./chevron-down-B_nhBlPg.js";import"./chevron-up-Bod9VZ9-.js";import"./index-SO3nb-2m.js";import"./search-6b8P41jh.js";
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-BzBMiH_d.js","assets/index-CS2kkdD8.js","assets/index-ChWqp_e7.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-CS2kkdD8.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-C4lyyfDm.js";import{C as X}from"./chevron-up-Bod9VZ9-.js";import{C as Y}from"./chevron-down-B_nhBlPg.js";
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-BzBMiH_d.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-CS2kkdD8.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};