feat: add note mode and workflow config

This commit is contained in:
shiyue
2026-06-12 16:39:44 +08:00
parent 5308a10b52
commit 8b2173be8f
93 changed files with 15292 additions and 50 deletions

View File

@@ -881,6 +881,16 @@ function safeFilename(name) {
.slice(0, 120) || 'image';
}
function contentDispositionInline(filename) {
const raw = safeFilename(filename || 'image');
const fallback = raw
.replace(/[^\x20-\x7E]/g, '_')
.replace(/["\\;]/g, '_')
.trim()
.slice(0, 120) || 'image';
return `inline; filename="${fallback}"; filename*=UTF-8''${encodeURIComponent(raw)}`;
}
function extFromMime(mime) {
switch (mime) {
case 'image/png': return '.png';
@@ -1839,26 +1849,26 @@ function handleProcessComplete(sessionId, exitCode, signal) {
if (autoRetryRequested) {
if (contextLimitExceeded) {
pendingCompactRetries.delete(sessionId);
wsSend(entry.ws, { type: 'system_message', message: '已尝试执行 /compact但仍未成功解除上下文超限。请手动缩小输入范围后重试。' });
wsSend(entry.ws, { type: 'system_message', sessionId, message: '已尝试执行 /compact但仍未成功解除上下文超限。请手动缩小输入范围后重试。' });
} else {
wsSend(entry.ws, { type: 'system_message', message: compactDoneMessage(entry.agent || 'claude') });
wsSend(entry.ws, { type: 'system_message', message: compactAutoResumeMessage(entry.agent || 'claude') });
wsSend(entry.ws, { type: 'system_message', sessionId, message: compactDoneMessage(entry.agent || 'claude') });
wsSend(entry.ws, { type: 'system_message', sessionId, message: compactAutoResumeMessage(entry.agent || 'claude') });
shouldReturnForFollowup = true;
}
} else {
wsSend(entry.ws, { type: 'system_message', message: compactDoneMessage(entry.agent || 'claude') });
wsSend(entry.ws, { type: 'system_message', sessionId, message: compactDoneMessage(entry.agent || 'claude') });
}
}
if (contextLimitExceeded && !pendingSlash && session && getRuntimeSessionId(session)) {
pendingCompactRetries.set(sessionId, { text: pendingRetry?.text || '', mode: pendingRetry?.mode || session.permissionMode || 'yolo', reason: 'auto' });
wsSend(entry.ws, { type: 'system_message', message: compactAutoStartMessage(entry.agent || 'claude') });
wsSend(entry.ws, { type: 'system_message', sessionId, message: compactAutoStartMessage(entry.agent || 'claude') });
shouldAutoCompact = true;
}
if (completionError && !entry.errorSent && !shouldAutoCompact) {
entry.errorSent = true;
wsSend(entry.ws, { type: 'error', message: completionError });
wsSend(entry.ws, { type: 'error', sessionId, message: completionError });
}
wsSend(entry.ws, { type: 'done', sessionId, costUsd: entry.lastCost || null });
@@ -2100,7 +2110,7 @@ const server = http.createServer((req, res) => {
res.writeHead(200, {
'Content-Type': meta.mime || 'application/octet-stream',
'Content-Length': stat.size,
'Content-Disposition': `inline; filename="${(meta.filename || 'image').replace(/"/g, '\\"')}"`,
'Content-Disposition': contentDispositionInline(meta.filename || 'image'),
'Cache-Control': 'private, no-store, max-age=0',
});
fs.createReadStream(meta.path).pipe(res);
@@ -2765,6 +2775,9 @@ function handleNewSession(ws, msg) {
cwd: resolvedCwd,
};
saveSession(session);
for (const [, entry] of activeProcesses) {
if (entry.ws === ws) entry.ws = null;
}
wsSessionMap.set(ws, id);
wsSend(ws, {
type: 'session_info',