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.
@@ -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
- lines.push(`- \`${s.name}\` ${s.messageCount} messages ${new Date(s.createdAt).toLocaleString()}`);
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');
@@ -169,7 +169,12 @@ export interface SessionUpdateConfigOption {
169
169
  sessionUpdate: 'config_option_update';
170
170
  configOptions: SessionConfigOption[];
171
171
  }
172
- export type SessionUpdateInner = SessionUpdateAgentMessageChunk | SessionUpdateAgentThoughtChunk | SessionUpdateToolCall | SessionUpdateToolCallUpdate | SessionUpdateAvailableCommands | SessionUpdateCurrentMode | SessionUpdateConfigOption;
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;
@@ -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
- const sessionInfos = listSessionsWithInfo(params.cwd);
315
- const acpSessions = sessionInfos.map(s => ({
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.name,
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') {
@@ -113,6 +113,7 @@ export declare function getSessionInfo(name: string, projectPath?: string): {
113
113
  } | null;
114
114
  export interface SessionInfo {
115
115
  name: string;
116
+ title: string;
116
117
  createdAt: string;
117
118
  messageCount: number;
118
119
  fileSize: number;
@@ -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: data.name || file.replace('.json', ''),
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.50",
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",