@tom2012/cc-web 1.5.38 → 1.5.40
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 +5 -1
- package/backend/dist/chat-process-manager.d.ts +43 -0
- package/backend/dist/chat-process-manager.d.ts.map +1 -0
- package/backend/dist/chat-process-manager.js +240 -0
- package/backend/dist/chat-process-manager.js.map +1 -0
- package/backend/dist/config.d.ts +2 -1
- package/backend/dist/config.d.ts.map +1 -1
- package/backend/dist/config.js +1 -0
- package/backend/dist/config.js.map +1 -1
- package/backend/dist/hooks-manager.d.ts +20 -0
- package/backend/dist/hooks-manager.d.ts.map +1 -0
- package/backend/dist/hooks-manager.js +139 -0
- package/backend/dist/hooks-manager.js.map +1 -0
- package/backend/dist/index.d.ts.map +1 -1
- package/backend/dist/index.js +216 -6
- package/backend/dist/index.js.map +1 -1
- package/backend/dist/routes/hooks.d.ts +14 -0
- package/backend/dist/routes/hooks.d.ts.map +1 -0
- package/backend/dist/routes/hooks.js +62 -0
- package/backend/dist/routes/hooks.js.map +1 -0
- package/backend/dist/routes/projects.d.ts.map +1 -1
- package/backend/dist/routes/projects.js +46 -0
- package/backend/dist/routes/projects.js.map +1 -1
- package/backend/dist/routes/update.d.ts.map +1 -1
- package/backend/dist/routes/update.js +22 -13
- package/backend/dist/routes/update.js.map +1 -1
- package/backend/dist/session-manager.d.ts +12 -2
- package/backend/dist/session-manager.d.ts.map +1 -1
- package/backend/dist/session-manager.js +45 -15
- package/backend/dist/session-manager.js.map +1 -1
- package/backend/dist/terminal-manager.d.ts +5 -1
- package/backend/dist/terminal-manager.d.ts.map +1 -1
- package/backend/dist/terminal-manager.js +13 -2
- package/backend/dist/terminal-manager.js.map +1 -1
- package/backend/dist/types.d.ts +2 -0
- package/backend/dist/types.d.ts.map +1 -1
- package/frontend/dist/assets/ChatView-CmGXAs2a.js +11 -0
- package/frontend/dist/assets/GraphPreview-0UgP3AnJ.js +22 -0
- package/frontend/dist/assets/OfficePreview-DhY6Py9Y.js +13 -0
- package/frontend/dist/assets/ProjectPage-9CEnUXvW.css +32 -0
- package/frontend/dist/assets/ProjectPage-Ckxkh4Nr.js +169 -0
- package/frontend/dist/assets/SettingsPage-Dmb7V9a0.js +36 -0
- package/frontend/dist/assets/SkillHubPage-C5zcxERj.js +11 -0
- package/frontend/dist/assets/chevron-down-BEvQLdWD.js +6 -0
- package/frontend/dist/assets/index-C9_Mp1hE.js +275 -0
- package/frontend/dist/assets/{index-lRhMzYm_.js → index-DEta9t2M.js} +1 -1
- package/frontend/dist/assets/index-DjgiG4hc.css +1 -0
- package/frontend/dist/assets/{jszip.min-JFbhTBvU.js → jszip.min-s-54SERU.js} +1 -1
- package/frontend/dist/assets/select-Cfjj__BG.js +11 -0
- package/frontend/dist/assets/user-_adqQY3y.js +11 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/frontend/dist/assets/index-BTxKTqXV.js +0 -554
- package/frontend/dist/assets/index-DpzQcaS6.css +0 -32
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**: v1.5.
|
|
5
|
+
**Current version**: v1.5.40 | [GitHub](https://github.com/zbc0315/cc-web) | MIT License
|
|
6
6
|
|
|
7
7
|
## Features
|
|
8
8
|
|
|
@@ -24,6 +24,10 @@ A self-hosted web application (distributed as npm package) that provides a brows
|
|
|
24
24
|
- **SkillHub**: Browse, search, and download community-shared shortcut commands from GitHub; share your own with one click
|
|
25
25
|
- **Ambient Sound**: Background sounds (singing bowl, rain, wind, stream, etc.) that play when LLM is active, with custom upload support
|
|
26
26
|
- **Dark/Light Theme**: Toggle between themes
|
|
27
|
+
- **Real-time Activity Push**: Dashboard receives project activity updates via WebSocket (no polling), with semantic status badges (Thinking/Writing/Tool)
|
|
28
|
+
- **Code Splitting**: Lazy-loaded routes and heavy components (Office preview, Graph, Chat) — only loaded on demand
|
|
29
|
+
- **Global State (Zustand)**: Auth and project state shared across pages without prop drilling
|
|
30
|
+
- **Error Boundaries**: Graceful error handling with toast notifications instead of alerts
|
|
27
31
|
|
|
28
32
|
## Prerequisites
|
|
29
33
|
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChatProcessManager — manages claude --print SDK subprocess per project.
|
|
3
|
+
*
|
|
4
|
+
* Key design notes:
|
|
5
|
+
* - sessionManager.startSession() is called AFTER system.init is received,
|
|
6
|
+
* not immediately after spawn (JSONL file doesn't exist yet at spawn time).
|
|
7
|
+
* - tool_result blocks appear in USER-role messages in SDK output, not assistant.
|
|
8
|
+
* - hasTerminal() is the public API name (mirrors TerminalManager.hasTerminal).
|
|
9
|
+
* - Crash restart uses 3s delay; interrupt restart is immediate (500ms).
|
|
10
|
+
*/
|
|
11
|
+
import { EventEmitter } from 'events';
|
|
12
|
+
import { Project } from './types';
|
|
13
|
+
export interface ChatStreamEvent {
|
|
14
|
+
projectId: string;
|
|
15
|
+
type: 'stream' | 'tool_start' | 'tool_end' | 'turn_end' | 'rate_limit' | 'status';
|
|
16
|
+
delta?: string;
|
|
17
|
+
contentType?: 'text' | 'thinking';
|
|
18
|
+
toolName?: string;
|
|
19
|
+
toolInput?: unknown;
|
|
20
|
+
toolOutput?: string;
|
|
21
|
+
costUsd?: number;
|
|
22
|
+
resetsAt?: number;
|
|
23
|
+
status?: string;
|
|
24
|
+
}
|
|
25
|
+
declare class ChatProcessManager extends EventEmitter {
|
|
26
|
+
private instances;
|
|
27
|
+
private restartTimers;
|
|
28
|
+
start(project: Project, continueSession?: boolean): void;
|
|
29
|
+
stop(projectId: string): void;
|
|
30
|
+
/** Interrupt current generation and immediately restart with --continue */
|
|
31
|
+
interrupt(projectId: string): void;
|
|
32
|
+
sendMessage(projectId: string, text: string): boolean;
|
|
33
|
+
/** Named hasTerminal for API consistency with TerminalManager */
|
|
34
|
+
hasTerminal(projectId: string): boolean;
|
|
35
|
+
getLastActivityAt(projectId: string): number | null;
|
|
36
|
+
private stopInternal;
|
|
37
|
+
private buildArgs;
|
|
38
|
+
private parseLine;
|
|
39
|
+
private handleExit;
|
|
40
|
+
}
|
|
41
|
+
export declare const chatProcessManager: ChatProcessManager;
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=chat-process-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-process-manager.d.ts","sourceRoot":"","sources":["../src/chat-process-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAIlC,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,GAAG,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,QAAQ,CAAC;IAClF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAYD,cAAM,kBAAmB,SAAQ,YAAY;IAC3C,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,aAAa,CAAoD;IAEzE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,UAAQ,GAAG,IAAI;IAkDtD,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI7B,2EAA2E;IAC3E,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAgBlC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAerD,iEAAiE;IACjE,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIvC,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAInD,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,SAAS;IAcjB,OAAO,CAAC,SAAS;IAyEjB,OAAO,CAAC,UAAU;CAqBnB;AAED,eAAO,MAAM,kBAAkB,oBAA2B,CAAC"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ChatProcessManager — manages claude --print SDK subprocess per project.
|
|
4
|
+
*
|
|
5
|
+
* Key design notes:
|
|
6
|
+
* - sessionManager.startSession() is called AFTER system.init is received,
|
|
7
|
+
* not immediately after spawn (JSONL file doesn't exist yet at spawn time).
|
|
8
|
+
* - tool_result blocks appear in USER-role messages in SDK output, not assistant.
|
|
9
|
+
* - hasTerminal() is the public API name (mirrors TerminalManager.hasTerminal).
|
|
10
|
+
* - Crash restart uses 3s delay; interrupt restart is immediate (500ms).
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.chatProcessManager = void 0;
|
|
14
|
+
const child_process_1 = require("child_process");
|
|
15
|
+
const events_1 = require("events");
|
|
16
|
+
const config_1 = require("./config");
|
|
17
|
+
const session_manager_1 = require("./session-manager");
|
|
18
|
+
class ChatProcessManager extends events_1.EventEmitter {
|
|
19
|
+
constructor() {
|
|
20
|
+
super(...arguments);
|
|
21
|
+
this.instances = new Map();
|
|
22
|
+
this.restartTimers = new Map();
|
|
23
|
+
}
|
|
24
|
+
start(project, continueSession = false) {
|
|
25
|
+
this.stopInternal(project.id, false);
|
|
26
|
+
const args = this.buildArgs(project, continueSession);
|
|
27
|
+
const userShell = process.env.SHELL || '/bin/zsh';
|
|
28
|
+
const proc = (0, child_process_1.spawn)(userShell, ['-ilc', args.join(' ')], {
|
|
29
|
+
cwd: project.folderPath,
|
|
30
|
+
env: { ...process.env },
|
|
31
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
32
|
+
});
|
|
33
|
+
const instance = {
|
|
34
|
+
process: proc,
|
|
35
|
+
project,
|
|
36
|
+
intentionalStop: false,
|
|
37
|
+
lastActivityAt: null,
|
|
38
|
+
sessionId: null,
|
|
39
|
+
pendingToolName: null,
|
|
40
|
+
lineBuffer: '',
|
|
41
|
+
};
|
|
42
|
+
this.instances.set(project.id, instance);
|
|
43
|
+
project.status = 'running';
|
|
44
|
+
(0, config_1.saveProject)(project);
|
|
45
|
+
// NOTE: sessionManager.startSession() is called later, when system.init arrives
|
|
46
|
+
proc.stdout?.on('data', (chunk) => {
|
|
47
|
+
instance.lastActivityAt = Date.now();
|
|
48
|
+
instance.lineBuffer += chunk.toString('utf-8');
|
|
49
|
+
const lines = instance.lineBuffer.split('\n');
|
|
50
|
+
instance.lineBuffer = lines.pop() ?? '';
|
|
51
|
+
for (const line of lines) {
|
|
52
|
+
const trimmed = line.trim();
|
|
53
|
+
if (trimmed)
|
|
54
|
+
this.parseLine(project.id, instance, trimmed);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
proc.stderr?.on('data', (data) => {
|
|
58
|
+
console.error(`[ChatProcess ${project.id}] stderr:`, data.toString().slice(0, 200));
|
|
59
|
+
});
|
|
60
|
+
proc.on('exit', (code) => {
|
|
61
|
+
console.log(`[ChatProcess] Exit for ${project.id}, code: ${code}`);
|
|
62
|
+
this.handleExit(project.id);
|
|
63
|
+
});
|
|
64
|
+
console.log(`[ChatProcessManager] Started for project ${project.id}`);
|
|
65
|
+
}
|
|
66
|
+
stop(projectId) {
|
|
67
|
+
this.stopInternal(projectId, true);
|
|
68
|
+
}
|
|
69
|
+
/** Interrupt current generation and immediately restart with --continue */
|
|
70
|
+
interrupt(projectId) {
|
|
71
|
+
const instance = this.instances.get(projectId);
|
|
72
|
+
if (!instance)
|
|
73
|
+
return;
|
|
74
|
+
// Mark intentionalStop so handleExit doesn't trigger crash-restart
|
|
75
|
+
instance.intentionalStop = true;
|
|
76
|
+
try {
|
|
77
|
+
instance.process.kill('SIGINT');
|
|
78
|
+
}
|
|
79
|
+
catch { /**/ }
|
|
80
|
+
this.instances.delete(projectId);
|
|
81
|
+
this.emit('event', { projectId, type: 'status', status: 'restarting' });
|
|
82
|
+
// Immediate restart (no 3s delay — user-initiated, not a crash)
|
|
83
|
+
setTimeout(() => {
|
|
84
|
+
this.start(instance.project, true);
|
|
85
|
+
}, 500);
|
|
86
|
+
}
|
|
87
|
+
sendMessage(projectId, text) {
|
|
88
|
+
const instance = this.instances.get(projectId);
|
|
89
|
+
if (!instance?.process.stdin)
|
|
90
|
+
return false;
|
|
91
|
+
const msg = JSON.stringify({
|
|
92
|
+
type: 'user',
|
|
93
|
+
message: { role: 'user', content: text },
|
|
94
|
+
}) + '\n';
|
|
95
|
+
try {
|
|
96
|
+
instance.process.stdin.write(msg);
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/** Named hasTerminal for API consistency with TerminalManager */
|
|
104
|
+
hasTerminal(projectId) {
|
|
105
|
+
return this.instances.has(projectId);
|
|
106
|
+
}
|
|
107
|
+
getLastActivityAt(projectId) {
|
|
108
|
+
return this.instances.get(projectId)?.lastActivityAt ?? null;
|
|
109
|
+
}
|
|
110
|
+
stopInternal(projectId, updateStatus) {
|
|
111
|
+
const timer = this.restartTimers.get(projectId);
|
|
112
|
+
if (timer) {
|
|
113
|
+
clearTimeout(timer);
|
|
114
|
+
this.restartTimers.delete(projectId);
|
|
115
|
+
}
|
|
116
|
+
const instance = this.instances.get(projectId);
|
|
117
|
+
if (!instance)
|
|
118
|
+
return;
|
|
119
|
+
instance.intentionalStop = true;
|
|
120
|
+
try {
|
|
121
|
+
instance.process.kill('SIGTERM');
|
|
122
|
+
}
|
|
123
|
+
catch { /**/ }
|
|
124
|
+
this.instances.delete(projectId);
|
|
125
|
+
session_manager_1.sessionManager.stopWatcherForProject(projectId);
|
|
126
|
+
if (updateStatus) {
|
|
127
|
+
instance.project.status = 'stopped';
|
|
128
|
+
(0, config_1.saveProject)(instance.project);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
buildArgs(project, continueSession) {
|
|
132
|
+
const args = [
|
|
133
|
+
'claude',
|
|
134
|
+
'--print',
|
|
135
|
+
'--output-format', 'stream-json',
|
|
136
|
+
'--input-format', 'stream-json',
|
|
137
|
+
'--include-partial-messages',
|
|
138
|
+
'--verbose',
|
|
139
|
+
];
|
|
140
|
+
if (continueSession)
|
|
141
|
+
args.push('--continue');
|
|
142
|
+
if (project.permissionMode === 'unlimited')
|
|
143
|
+
args.push('--dangerously-skip-permissions');
|
|
144
|
+
return args;
|
|
145
|
+
}
|
|
146
|
+
parseLine(projectId, instance, line) {
|
|
147
|
+
let record;
|
|
148
|
+
try {
|
|
149
|
+
record = JSON.parse(line);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const type = record.type;
|
|
155
|
+
// ── system.init: call startSession now (JSONL file is about to be created) ──
|
|
156
|
+
if (type === 'system' && record.subtype === 'init') {
|
|
157
|
+
instance.sessionId = record.session_id ?? null;
|
|
158
|
+
session_manager_1.sessionManager.startSession(instance.project.id, instance.project.folderPath);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
// ── assistant messages: text, thinking, tool_use blocks ──
|
|
162
|
+
if (type === 'assistant') {
|
|
163
|
+
const msg = record.message;
|
|
164
|
+
for (const block of (msg?.content ?? [])) {
|
|
165
|
+
const btype = block.type;
|
|
166
|
+
if (btype === 'text') {
|
|
167
|
+
const text = block.text ?? '';
|
|
168
|
+
if (text) {
|
|
169
|
+
this.emit('event', { projectId, type: 'stream', delta: text, contentType: 'text' });
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
else if (btype === 'thinking') {
|
|
173
|
+
const thinking = block.thinking ?? '';
|
|
174
|
+
if (thinking) {
|
|
175
|
+
this.emit('event', { projectId, type: 'stream', delta: thinking, contentType: 'thinking' });
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
else if (btype === 'tool_use') {
|
|
179
|
+
const name = block.name ?? 'tool';
|
|
180
|
+
instance.pendingToolName = name;
|
|
181
|
+
this.emit('event', { projectId, type: 'tool_start', toolName: name, toolInput: block.input });
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
// ── user messages: tool_result blocks (SDK returns tool results as user-role messages) ──
|
|
187
|
+
if (type === 'user') {
|
|
188
|
+
const msg = record.message;
|
|
189
|
+
if (msg?.role !== 'tool')
|
|
190
|
+
return; // only process tool result messages
|
|
191
|
+
for (const block of (msg?.content ?? [])) {
|
|
192
|
+
if (block.type === 'tool_result') {
|
|
193
|
+
const content = block.content;
|
|
194
|
+
const output = typeof content === 'string' ? content : JSON.stringify(content).slice(0, 500);
|
|
195
|
+
this.emit('event', {
|
|
196
|
+
projectId,
|
|
197
|
+
type: 'tool_end',
|
|
198
|
+
toolName: instance.pendingToolName ?? 'tool',
|
|
199
|
+
toolOutput: output,
|
|
200
|
+
});
|
|
201
|
+
instance.pendingToolName = null;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
// ── result: turn complete ──
|
|
207
|
+
if (type === 'result') {
|
|
208
|
+
this.emit('event', { projectId, type: 'turn_end', costUsd: record.total_cost_usd ?? 0 });
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
// ── rate_limit_event ──
|
|
212
|
+
if (type === 'rate_limit_event') {
|
|
213
|
+
const info = record.rate_limit_info;
|
|
214
|
+
if (info?.resetsAt) {
|
|
215
|
+
this.emit('event', { projectId, type: 'rate_limit', resetsAt: info.resetsAt });
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
handleExit(projectId) {
|
|
220
|
+
const instance = this.instances.get(projectId);
|
|
221
|
+
if (!instance || instance.intentionalStop) {
|
|
222
|
+
this.instances.delete(projectId);
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
const { project } = instance;
|
|
226
|
+
this.instances.delete(projectId);
|
|
227
|
+
project.status = 'restarting';
|
|
228
|
+
(0, config_1.saveProject)(project);
|
|
229
|
+
this.emit('event', { projectId, type: 'status', status: 'restarting' });
|
|
230
|
+
console.log(`[ChatProcessManager] Auto-restarting ${projectId} with --continue in 3s...`);
|
|
231
|
+
const timer = setTimeout(() => {
|
|
232
|
+
this.restartTimers.delete(projectId);
|
|
233
|
+
if (!this.instances.has(projectId))
|
|
234
|
+
this.start(project, true);
|
|
235
|
+
}, 3000);
|
|
236
|
+
this.restartTimers.set(projectId, timer);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
exports.chatProcessManager = new ChatProcessManager();
|
|
240
|
+
//# sourceMappingURL=chat-process-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-process-manager.js","sourceRoot":"","sources":["../src/chat-process-manager.ts"],"names":[],"mappings":"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"}
|
package/backend/dist/config.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Project, Config, CliTool } from './types';
|
|
1
|
+
import { Project, Config, CliTool, ProjectMode } from './types';
|
|
2
2
|
export interface GlobalShortcut {
|
|
3
3
|
id: string;
|
|
4
4
|
label: string;
|
|
@@ -32,6 +32,7 @@ export interface ProjectConfig {
|
|
|
32
32
|
permissionMode: 'limited' | 'unlimited';
|
|
33
33
|
cliTool: CliTool;
|
|
34
34
|
createdAt: string;
|
|
35
|
+
mode?: ProjectMode;
|
|
35
36
|
}
|
|
36
37
|
export declare function ccwebDir(folderPath: string): string;
|
|
37
38
|
export declare function ccwebSessionsDir(folderPath: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEhE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,QAAQ,QAAmE,CAAC;AAYzF,wBAAgB,YAAY,IAAI,IAAI,CAOnC;AAMD,wBAAgB,SAAS,IAAI,MAAM,CAUlC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAErD;AAED,wBAAgB,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAGtD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAI3E;AAED,kGAAkG;AAClG,wBAAgB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAI1D;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAID,iDAAiD;AACjD,wBAAgB,kBAAkB,IAAI,SAAS,EAAE,CAOhD;AAED,wBAAgB,WAAW,IAAI,OAAO,EAAE,CAIvC;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,CAEtD;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAE1D;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CASlD;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAE9C;AAQD,wBAAgB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE,CAItE;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,cAAc,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAGxF;AAOD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,SAAS,GAAG,WAAW,CAAC;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wDAAwD;AACxD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAY7E;AAED,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAQ1E;AAID,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,EAAE,CAQ1E;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,IAAI,CAI3F;AAED,kDAAkD;AAClD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAM7F"}
|
package/backend/dist/config.js
CHANGED
|
@@ -191,6 +191,7 @@ function writeProjectConfig(folderPath, project) {
|
|
|
191
191
|
permissionMode: project.permissionMode,
|
|
192
192
|
cliTool: project.cliTool,
|
|
193
193
|
createdAt: project.createdAt,
|
|
194
|
+
mode: project.mode,
|
|
194
195
|
};
|
|
195
196
|
atomicWriteSync(path.join(dir, PROJECT_CONFIG_FILE), JSON.stringify(config, null, 2));
|
|
196
197
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,oCAOC;AAMD,8BAUC;AAED,4CAEC;AAED,kCAGC;AAED,wCAIC;AAGD,4CAIC;AAUD,gDAOC;AAED,kCAIC;AAED,oCAEC;AAED,gCAEC;AAED,kCASC;AAED,sCAEC;AAQD,gDAIC;AAED,kDAGC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HooksManager — manages ccweb entries in ~/.claude/settings.json
|
|
3
|
+
*
|
|
4
|
+
* install() is idempotent: always calls uninstall() first, then adds fresh hooks.
|
|
5
|
+
* This handles the crash-without-cleanup scenario correctly.
|
|
6
|
+
*
|
|
7
|
+
* Hook commands include "# ccweb-hook" marker at the end so uninstall()
|
|
8
|
+
* can precisely identify and remove them without touching user-defined hooks.
|
|
9
|
+
*/
|
|
10
|
+
declare class HooksManager {
|
|
11
|
+
private portFile;
|
|
12
|
+
constructor(portFile: string);
|
|
13
|
+
/** Remove all ccweb hook entries (identified by CCWEB_MARKER) */
|
|
14
|
+
uninstall(): void;
|
|
15
|
+
/** Idempotent install: remove stale entries first, then add fresh hooks */
|
|
16
|
+
install(): void;
|
|
17
|
+
isInstalled(): boolean;
|
|
18
|
+
}
|
|
19
|
+
export { HooksManager };
|
|
20
|
+
//# sourceMappingURL=hooks-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks-manager.d.ts","sourceRoot":"","sources":["../src/hooks-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAsDH,cAAM,YAAY;IAChB,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,EAAE,MAAM;IAI5B,iEAAiE;IACjE,SAAS,IAAI,IAAI;IA2BjB,2EAA2E;IAC3E,OAAO,IAAI,IAAI;IAiBf,WAAW,IAAI,OAAO;CAMvB;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* HooksManager — manages ccweb entries in ~/.claude/settings.json
|
|
4
|
+
*
|
|
5
|
+
* install() is idempotent: always calls uninstall() first, then adds fresh hooks.
|
|
6
|
+
* This handles the crash-without-cleanup scenario correctly.
|
|
7
|
+
*
|
|
8
|
+
* Hook commands include "# ccweb-hook" marker at the end so uninstall()
|
|
9
|
+
* can precisely identify and remove them without touching user-defined hooks.
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.HooksManager = void 0;
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
const os = __importStar(require("os"));
|
|
49
|
+
const CLAUDE_SETTINGS_FILE = path.join(os.homedir(), '.claude', 'settings.json');
|
|
50
|
+
const CCWEB_MARKER = '# ccweb-hook';
|
|
51
|
+
const HOOK_EVENTS = ['PreToolUse', 'PostToolUse', 'Stop'];
|
|
52
|
+
/**
|
|
53
|
+
* Build the curl command for each hook event.
|
|
54
|
+
* Note: Stop event does NOT have CLAUDE_SESSION_ID available, so we omit it.
|
|
55
|
+
*/
|
|
56
|
+
function buildCommand(event, portFile) {
|
|
57
|
+
const baseBody = [
|
|
58
|
+
`\\"event\\":\\"${event}\\"`,
|
|
59
|
+
`\\"dir\\":\\"$CLAUDE_PROJECT_DIR\\"`,
|
|
60
|
+
];
|
|
61
|
+
// PreToolUse and PostToolUse have CLAUDE_TOOL_NAME and CLAUDE_SESSION_ID
|
|
62
|
+
if (event === 'PreToolUse' || event === 'PostToolUse') {
|
|
63
|
+
baseBody.push(`\\"tool\\":\\"$CLAUDE_TOOL_NAME\\"`);
|
|
64
|
+
baseBody.push(`\\"session\\":\\"$CLAUDE_SESSION_ID\\"`);
|
|
65
|
+
}
|
|
66
|
+
const body = baseBody.join(',');
|
|
67
|
+
return (`curl -sf -X POST "http://localhost:$(cat ${portFile})/api/hooks"` +
|
|
68
|
+
` -H "Content-Type: application/json"` +
|
|
69
|
+
` -d "{${body}}" || true ${CCWEB_MARKER}`);
|
|
70
|
+
}
|
|
71
|
+
function readSettings() {
|
|
72
|
+
if (!fs.existsSync(CLAUDE_SETTINGS_FILE))
|
|
73
|
+
return {};
|
|
74
|
+
try {
|
|
75
|
+
return JSON.parse(fs.readFileSync(CLAUDE_SETTINGS_FILE, 'utf-8'));
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return {};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function atomicWrite(data) {
|
|
82
|
+
const dir = path.dirname(CLAUDE_SETTINGS_FILE);
|
|
83
|
+
if (!fs.existsSync(dir))
|
|
84
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
85
|
+
const tmp = CLAUDE_SETTINGS_FILE + `.tmp.${process.pid}`;
|
|
86
|
+
fs.writeFileSync(tmp, JSON.stringify(data, null, 2), 'utf-8');
|
|
87
|
+
fs.renameSync(tmp, CLAUDE_SETTINGS_FILE);
|
|
88
|
+
}
|
|
89
|
+
class HooksManager {
|
|
90
|
+
constructor(portFile) {
|
|
91
|
+
this.portFile = portFile;
|
|
92
|
+
}
|
|
93
|
+
/** Remove all ccweb hook entries (identified by CCWEB_MARKER) */
|
|
94
|
+
uninstall() {
|
|
95
|
+
const settings = readSettings();
|
|
96
|
+
const hooks = (settings.hooks ?? {});
|
|
97
|
+
let changed = false;
|
|
98
|
+
for (const event of HOOK_EVENTS) {
|
|
99
|
+
const list = (hooks[event] ?? []);
|
|
100
|
+
const cleaned = list
|
|
101
|
+
.map((group) => ({
|
|
102
|
+
...group,
|
|
103
|
+
hooks: (group.hooks ?? []).filter((h) => !h.command?.includes(CCWEB_MARKER)),
|
|
104
|
+
}))
|
|
105
|
+
.filter((group) => (group.hooks?.length ?? 0) > 0);
|
|
106
|
+
if (JSON.stringify(cleaned) !== JSON.stringify(list)) {
|
|
107
|
+
hooks[event] = cleaned;
|
|
108
|
+
changed = true;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (changed) {
|
|
112
|
+
settings.hooks = hooks;
|
|
113
|
+
atomicWrite(settings);
|
|
114
|
+
console.log('[HooksManager] Uninstalled ccweb hooks');
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** Idempotent install: remove stale entries first, then add fresh hooks */
|
|
118
|
+
install() {
|
|
119
|
+
this.uninstall(); // always clean first — handles crash-without-cleanup
|
|
120
|
+
const settings = readSettings();
|
|
121
|
+
const hooks = (settings.hooks ?? {});
|
|
122
|
+
for (const event of HOOK_EVENTS) {
|
|
123
|
+
const list = (hooks[event] ?? []);
|
|
124
|
+
list.push({ hooks: [{ type: 'command', command: buildCommand(event, this.portFile) }] });
|
|
125
|
+
hooks[event] = list;
|
|
126
|
+
}
|
|
127
|
+
settings.hooks = hooks;
|
|
128
|
+
atomicWrite(settings);
|
|
129
|
+
console.log('[HooksManager] Installed ccweb hooks');
|
|
130
|
+
}
|
|
131
|
+
isInstalled() {
|
|
132
|
+
const settings = readSettings();
|
|
133
|
+
const hooks = (settings.hooks ?? {});
|
|
134
|
+
const list = (hooks['PreToolUse'] ?? []);
|
|
135
|
+
return list.some((g) => g.hooks?.some((h) => h.command?.includes(CCWEB_MARKER)));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
exports.HooksManager = HooksManager;
|
|
139
|
+
//# sourceMappingURL=hooks-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks-manager.js","sourceRoot":"","sources":["../src/hooks-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA2OA,QAAA,MAAM,GAAG,6CAAY,CAAC;AAsiBtB,eAAe,GAAG,CAAC"}
|