codeep 1.2.50 → 1.2.52
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/dist/acp/commands.js +2 -1
- package/dist/acp/protocol.d.ts +6 -1
- package/dist/acp/server.js +43 -3
- package/dist/config/index.d.ts +1 -0
- package/dist/config/index.js +14 -1
- package/package.json +1 -1
package/dist/acp/commands.js
CHANGED
|
@@ -585,7 +585,8 @@ function buildSessionList(workspaceRoot) {
|
|
|
585
585
|
return 'No saved sessions. Start chatting to create one.';
|
|
586
586
|
const lines = ['## Saved Sessions', ''];
|
|
587
587
|
for (const s of sessions) {
|
|
588
|
-
|
|
588
|
+
const label = s.title !== s.name ? `**${s.title}** (\`${s.name}\`)` : `\`${s.name}\``;
|
|
589
|
+
lines.push(`- ${label} — ${s.messageCount} messages — ${new Date(s.createdAt).toLocaleString()}`);
|
|
589
590
|
}
|
|
590
591
|
lines.push('', 'Use `/session load <name>` to restore.');
|
|
591
592
|
return lines.join('\n');
|
package/dist/acp/protocol.d.ts
CHANGED
|
@@ -169,7 +169,12 @@ export interface SessionUpdateConfigOption {
|
|
|
169
169
|
sessionUpdate: 'config_option_update';
|
|
170
170
|
configOptions: SessionConfigOption[];
|
|
171
171
|
}
|
|
172
|
-
export
|
|
172
|
+
export interface SessionUpdateSessionInfo {
|
|
173
|
+
sessionUpdate: 'session_info_update';
|
|
174
|
+
title: string;
|
|
175
|
+
updatedAt?: string;
|
|
176
|
+
}
|
|
177
|
+
export type SessionUpdateInner = SessionUpdateAgentMessageChunk | SessionUpdateAgentThoughtChunk | SessionUpdateToolCall | SessionUpdateToolCallUpdate | SessionUpdateAvailableCommands | SessionUpdateCurrentMode | SessionUpdateConfigOption | SessionUpdateSessionInfo;
|
|
173
178
|
export interface SessionUpdateParams {
|
|
174
179
|
sessionId: string;
|
|
175
180
|
update: SessionUpdateInner;
|
package/dist/acp/server.js
CHANGED
|
@@ -187,6 +187,7 @@ export function startAcpServer() {
|
|
|
187
187
|
addedFiles: new Map(),
|
|
188
188
|
abortController: null,
|
|
189
189
|
currentModeId: 'auto',
|
|
190
|
+
titleSent: false,
|
|
190
191
|
});
|
|
191
192
|
const result = {
|
|
192
193
|
sessionId: acpSessionId,
|
|
@@ -235,6 +236,7 @@ export function startAcpServer() {
|
|
|
235
236
|
codeepSessionId,
|
|
236
237
|
addedFiles: new Map(),
|
|
237
238
|
abortController: null,
|
|
239
|
+
titleSent: false,
|
|
238
240
|
currentModeId: 'auto',
|
|
239
241
|
});
|
|
240
242
|
const result = {
|
|
@@ -311,11 +313,23 @@ export function startAcpServer() {
|
|
|
311
313
|
// ── session/list ─────────────────────────────────────────────────────────────
|
|
312
314
|
function handleSessionList(msg) {
|
|
313
315
|
const params = (msg.params ?? {});
|
|
314
|
-
|
|
315
|
-
const
|
|
316
|
+
// Collect local (project-scoped) sessions and global sessions, deduplicated by name
|
|
317
|
+
const seen = new Set();
|
|
318
|
+
const merged = [
|
|
319
|
+
...listSessionsWithInfo(params.cwd), // project-local first
|
|
320
|
+
...listSessionsWithInfo(), // global fallback
|
|
321
|
+
].filter(s => {
|
|
322
|
+
if (seen.has(s.name))
|
|
323
|
+
return false;
|
|
324
|
+
seen.add(s.name);
|
|
325
|
+
return true;
|
|
326
|
+
});
|
|
327
|
+
// Sort newest first
|
|
328
|
+
merged.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
|
329
|
+
const acpSessions = merged.map(s => ({
|
|
316
330
|
sessionId: s.name,
|
|
317
331
|
cwd: params.cwd ?? '',
|
|
318
|
-
title: s.
|
|
332
|
+
title: s.title,
|
|
319
333
|
updatedAt: s.createdAt,
|
|
320
334
|
}));
|
|
321
335
|
const result = { sessions: acpSessions };
|
|
@@ -372,6 +386,19 @@ export function startAcpServer() {
|
|
|
372
386
|
},
|
|
373
387
|
});
|
|
374
388
|
}
|
|
389
|
+
// Send title on first interaction (commands count too)
|
|
390
|
+
if (!session.titleSent) {
|
|
391
|
+
session.titleSent = true;
|
|
392
|
+
const title = prompt.slice(0, 60).replace(/\n/g, ' ').trim();
|
|
393
|
+
transport.notify('session/update', {
|
|
394
|
+
sessionId: params.sessionId,
|
|
395
|
+
update: {
|
|
396
|
+
sessionUpdate: 'session_info_update',
|
|
397
|
+
title,
|
|
398
|
+
updatedAt: new Date().toISOString(),
|
|
399
|
+
},
|
|
400
|
+
});
|
|
401
|
+
}
|
|
375
402
|
transport.respond(msg.id, { stopReason: 'end_turn' });
|
|
376
403
|
return;
|
|
377
404
|
}
|
|
@@ -435,6 +462,19 @@ export function startAcpServer() {
|
|
|
435
462
|
session.history.push({ role: 'assistant', content: agentResponse });
|
|
436
463
|
}
|
|
437
464
|
autoSaveSession(session.history, session.workspaceRoot);
|
|
465
|
+
// Send session title on first completed prompt (so Zed shows something useful)
|
|
466
|
+
if (!session.titleSent) {
|
|
467
|
+
session.titleSent = true;
|
|
468
|
+
const title = prompt.slice(0, 60).replace(/\n/g, ' ').trim();
|
|
469
|
+
transport.notify('session/update', {
|
|
470
|
+
sessionId: params.sessionId,
|
|
471
|
+
update: {
|
|
472
|
+
sessionUpdate: 'session_info_update',
|
|
473
|
+
title,
|
|
474
|
+
updatedAt: new Date().toISOString(),
|
|
475
|
+
},
|
|
476
|
+
});
|
|
477
|
+
}
|
|
438
478
|
transport.respond(msg.id, { stopReason: 'end_turn' });
|
|
439
479
|
}).catch((err) => {
|
|
440
480
|
if (err.name === 'AbortError') {
|
package/dist/config/index.d.ts
CHANGED
package/dist/config/index.js
CHANGED
|
@@ -495,8 +495,14 @@ export function flushAutoSave() {
|
|
|
495
495
|
// Session management
|
|
496
496
|
export function saveSession(name, history, projectPath) {
|
|
497
497
|
try {
|
|
498
|
+
// Derive a human-readable title from the first user message
|
|
499
|
+
const firstUserMsg = history.find(m => m.role === 'user');
|
|
500
|
+
const title = firstUserMsg
|
|
501
|
+
? firstUserMsg.content.replace(/\n/g, ' ').trim().slice(0, 60)
|
|
502
|
+
: name;
|
|
498
503
|
const session = {
|
|
499
504
|
name,
|
|
505
|
+
title,
|
|
500
506
|
history,
|
|
501
507
|
createdAt: new Date().toISOString(),
|
|
502
508
|
};
|
|
@@ -616,8 +622,15 @@ export function listSessionsWithInfo(projectPath) {
|
|
|
616
622
|
try {
|
|
617
623
|
const stat = statSync(filePath);
|
|
618
624
|
const data = JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
625
|
+
const sessionName = data.name || file.replace('.json', '');
|
|
626
|
+
// Derive title: use stored title, else first user message, else session name
|
|
627
|
+
const firstUserMsg = data.history?.find(m => m.role === 'user');
|
|
628
|
+
const title = data.title
|
|
629
|
+
|| (firstUserMsg ? firstUserMsg.content.replace(/\n/g, ' ').trim().slice(0, 60) : null)
|
|
630
|
+
|| sessionName;
|
|
619
631
|
sessions.push({
|
|
620
|
-
name:
|
|
632
|
+
name: sessionName,
|
|
633
|
+
title,
|
|
621
634
|
createdAt: data.createdAt || stat.mtime.toISOString(),
|
|
622
635
|
messageCount: data.history?.length || 0,
|
|
623
636
|
fileSize: stat.size,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codeep",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.52",
|
|
4
4
|
"description": "AI-powered coding assistant built for the terminal. Multiple LLM providers, project-aware context, and a seamless development workflow.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|