codeep 1.2.51 → 1.2.53

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');
@@ -1,6 +1,7 @@
1
1
  // src/acp/server.ts
2
2
  // Codeep ACP adapter — started via `codeep acp` CLI subcommand
3
3
  import { randomUUID } from 'crypto';
4
+ import { basename as pathBasename } from 'path';
4
5
  import { StdioTransport } from './transport.js';
5
6
  import { runAgentSession } from './session.js';
6
7
  import { initWorkspace, loadWorkspace, handleCommand } from './commands.js';
@@ -174,6 +175,21 @@ export function startAcpServer() {
174
175
  };
175
176
  transport.respond(msg.id, result);
176
177
  }
178
+ // ── helpers ──────────────────────────────────────────────────────────────────
179
+ function sendSessionTitle(sessionId, history, fallback) {
180
+ const firstUserMsg = history.find(m => m.role === 'user');
181
+ const title = firstUserMsg
182
+ ? firstUserMsg.content.replace(/\n/g, ' ').trim().slice(0, 60)
183
+ : (fallback ?? 'Codeep session');
184
+ transport.notify('session/update', {
185
+ sessionId,
186
+ update: {
187
+ sessionUpdate: 'session_info_update',
188
+ title,
189
+ updatedAt: new Date().toISOString(),
190
+ },
191
+ });
192
+ }
177
193
  // ── session/new ─────────────────────────────────────────────────────────────
178
194
  function handleSessionNew(msg) {
179
195
  const params = msg.params;
@@ -203,6 +219,8 @@ export function startAcpServer() {
203
219
  availableCommands: AVAILABLE_COMMANDS,
204
220
  },
205
221
  });
222
+ // Send title immediately so Zed "Recent" panel shows something useful
223
+ sendSessionTitle(acpSessionId, history, pathBasename(params.cwd));
206
224
  // Send welcome message
207
225
  transport.notify('session/update', {
208
226
  sessionId: acpSessionId,
@@ -244,6 +262,8 @@ export function startAcpServer() {
244
262
  configOptions: buildConfigOptions(),
245
263
  };
246
264
  transport.respond(msg.id, result);
265
+ // Send title immediately so Zed "Recent" panel shows something useful
266
+ sendSessionTitle(params.sessionId, history, pathBasename(params.cwd));
247
267
  // Send restored session welcome
248
268
  transport.notify('session/update', {
249
269
  sessionId: params.sessionId,
@@ -329,7 +349,7 @@ export function startAcpServer() {
329
349
  const acpSessions = merged.map(s => ({
330
350
  sessionId: s.name,
331
351
  cwd: params.cwd ?? '',
332
- title: s.name,
352
+ title: s.title,
333
353
  updatedAt: s.createdAt,
334
354
  }));
335
355
  const result = { sessions: acpSessions };
@@ -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.51",
3
+ "version": "1.2.53",
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",