@bike4mind/cli 0.2.25-recent-changes-tool.18528 → 0.2.25-recent-changes-tool.18533

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.
Files changed (2) hide show
  1. package/dist/index.js +55 -17
  2. package/package.json +6 -6
package/dist/index.js CHANGED
@@ -976,7 +976,7 @@ function InputPrompt({
976
976
  setFileSelectedIndex(0);
977
977
  }, [filteredFiles]);
978
978
  useInput2(
979
- (_input, key) => {
979
+ (input, key) => {
980
980
  if (fileAutocomplete?.active && filteredFiles.length > 0) {
981
981
  if (key.upArrow) {
982
982
  setFileSelectedIndex((prev) => prev > 0 ? prev - 1 : filteredFiles.length - 1);
@@ -1981,7 +1981,7 @@ import SelectInput4 from "ink-select-input";
1981
1981
  function SessionSelector({ sessions, currentSession, onSelect, onCancel }) {
1982
1982
  const [step, setStep] = useState6("selection");
1983
1983
  const [selectedSession, setSelectedSession] = useState6(null);
1984
- useInput7((input, key) => {
1984
+ useInput7((_input, key) => {
1985
1985
  if (key.escape) {
1986
1986
  if (step === "confirmation") {
1987
1987
  setStep("selection");
@@ -1992,12 +1992,29 @@ function SessionSelector({ sessions, currentSession, onSelect, onCancel }) {
1992
1992
  }
1993
1993
  });
1994
1994
  const hasUnsavedWork = currentSession && currentSession.messages.length > 0;
1995
+ const formatTimeAgo = (timestamp) => {
1996
+ const now = /* @__PURE__ */ new Date();
1997
+ const then = new Date(timestamp);
1998
+ const diffMs = now.getTime() - then.getTime();
1999
+ const diffMins = Math.floor(diffMs / 6e4);
2000
+ const diffHours = Math.floor(diffMs / 36e5);
2001
+ const diffDays = Math.floor(diffMs / 864e5);
2002
+ if (diffMins < 60) {
2003
+ return `${diffMins}m`;
2004
+ } else if (diffHours < 24) {
2005
+ return `${diffHours}h`;
2006
+ } else {
2007
+ return `${diffDays}d`;
2008
+ }
2009
+ };
1995
2010
  const items = sessions.map((session, index) => {
1996
- const messageCount = session.messages.length;
1997
- const lastUpdated = new Date(session.updatedAt).toLocaleString();
2011
+ const userMessages = session.messages.filter((msg) => msg.role === "user");
2012
+ const lastUserMessage = userMessages[userMessages.length - 1];
2013
+ const preview = lastUserMessage ? lastUserMessage.content.slice(0, 50).replace(/\n/g, " ") + (lastUserMessage.content.length > 50 ? "..." : "") : "No messages";
2014
+ const timeAgo = formatTimeAgo(session.updatedAt);
1998
2015
  return {
1999
- label: `[${index + 1}] ${session.name} (${messageCount} msg, ${session.model})
2000
- Last updated: ${lastUpdated}`,
2016
+ key: session.id,
2017
+ label: `[${index + 1}] ${preview} (${timeAgo})`,
2001
2018
  value: session
2002
2019
  };
2003
2020
  });
@@ -2237,6 +2254,9 @@ var SessionStore = class {
2237
2254
  * Save a session to disk
2238
2255
  */
2239
2256
  async save(session) {
2257
+ if (session.messages.length === 0) {
2258
+ throw new Error("Cannot save session with no messages");
2259
+ }
2240
2260
  await this.init();
2241
2261
  const filePath = path3.join(this.basePath, `${session.id}.json`);
2242
2262
  try {
@@ -2279,13 +2299,14 @@ var SessionStore = class {
2279
2299
  }
2280
2300
  /**
2281
2301
  * List all saved sessions
2302
+ * @param limit - Optional limit on number of sessions to return (returns most recent)
2282
2303
  */
2283
- async list() {
2304
+ async list(limit) {
2284
2305
  await this.init();
2285
2306
  try {
2286
2307
  const files = await fs3.readdir(this.basePath);
2287
2308
  const jsonFiles = files.filter((f) => f.endsWith(".json"));
2288
- const sessions = await Promise.all(
2309
+ const sessionsWithFiles = await Promise.all(
2289
2310
  jsonFiles.map(async (file) => {
2290
2311
  const filePath = path3.join(this.basePath, file);
2291
2312
  const data = await fs3.readFile(filePath, "utf-8");
@@ -2296,10 +2317,23 @@ var SessionStore = class {
2296
2317
  }
2297
2318
  return msg;
2298
2319
  });
2299
- return session;
2320
+ return { session, filePath };
2300
2321
  })
2301
2322
  );
2302
- return sessions.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
2323
+ const validSessions = [];
2324
+ for (const { session, filePath } of sessionsWithFiles) {
2325
+ if (session.messages.length === 0) {
2326
+ try {
2327
+ await fs3.unlink(filePath);
2328
+ } catch (error) {
2329
+ console.error(`Failed to delete empty session ${session.id}:`, error);
2330
+ }
2331
+ } else {
2332
+ validSessions.push(session);
2333
+ }
2334
+ }
2335
+ const sorted = validSessions.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
2336
+ return limit ? sorted.slice(0, limit) : sorted;
2303
2337
  } catch (error) {
2304
2338
  console.error("Failed to list sessions:", error);
2305
2339
  return [];
@@ -12977,7 +13011,7 @@ import { isAxiosError as isAxiosError2 } from "axios";
12977
13011
  // package.json
12978
13012
  var package_default = {
12979
13013
  name: "@bike4mind/cli",
12980
- version: "0.2.25-recent-changes-tool.18528+003e9436e",
13014
+ version: "0.2.25-recent-changes-tool.18533+5b2e7f35e",
12981
13015
  type: "module",
12982
13016
  description: "Interactive CLI tool for Bike4Mind with ReAct agents",
12983
13017
  license: "UNLICENSED",
@@ -13085,10 +13119,10 @@ var package_default = {
13085
13119
  },
13086
13120
  devDependencies: {
13087
13121
  "@bike4mind/agents": "0.1.0",
13088
- "@bike4mind/common": "2.47.2-recent-changes-tool.18528+003e9436e",
13089
- "@bike4mind/mcp": "1.28.1-recent-changes-tool.18528+003e9436e",
13090
- "@bike4mind/services": "2.45.2-recent-changes-tool.18528+003e9436e",
13091
- "@bike4mind/utils": "2.3.4-recent-changes-tool.18528+003e9436e",
13122
+ "@bike4mind/common": "2.47.2-recent-changes-tool.18533+5b2e7f35e",
13123
+ "@bike4mind/mcp": "1.28.1-recent-changes-tool.18533+5b2e7f35e",
13124
+ "@bike4mind/services": "2.45.2-recent-changes-tool.18533+5b2e7f35e",
13125
+ "@bike4mind/utils": "2.3.4-recent-changes-tool.18533+5b2e7f35e",
13092
13126
  "@types/better-sqlite3": "^7.6.13",
13093
13127
  "@types/diff": "^5.0.9",
13094
13128
  "@types/jsonwebtoken": "^9.0.4",
@@ -13105,7 +13139,7 @@ var package_default = {
13105
13139
  optionalDependencies: {
13106
13140
  "@vscode/ripgrep": "^1.17.0"
13107
13141
  },
13108
- gitHead: "003e9436e6495eda7a75bfdd1da35927871852a4"
13142
+ gitHead: "5b2e7f35edd2523761a9aba67656a9a6df9c04f1"
13109
13143
  };
13110
13144
 
13111
13145
  // src/config/constants.ts
@@ -15137,13 +15171,17 @@ Custom Commands:
15137
15171
  console.log("No active session to save");
15138
15172
  return;
15139
15173
  }
15174
+ if (state.session.messages.length === 0) {
15175
+ console.log("\u274C Cannot save session with no messages");
15176
+ return;
15177
+ }
15140
15178
  const sessionName = args.join(" ") || state.session.name;
15141
15179
  state.session.name = sessionName;
15142
15180
  await state.sessionStore.save(state.session);
15143
15181
  console.log(`\u2705 Session saved as "${sessionName}"`);
15144
15182
  break;
15145
15183
  case "sessions": {
15146
- const sessions = await state.sessionStore.list();
15184
+ const sessions = await state.sessionStore.list(20);
15147
15185
  if (sessions.length === 0) {
15148
15186
  console.log("\n\u{1F4DA} No saved sessions found.");
15149
15187
  console.log("\u{1F4A1} Use /save <name> to save your current session.\n");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bike4mind/cli",
3
- "version": "0.2.25-recent-changes-tool.18528+003e9436e",
3
+ "version": "0.2.25-recent-changes-tool.18533+5b2e7f35e",
4
4
  "type": "module",
5
5
  "description": "Interactive CLI tool for Bike4Mind with ReAct agents",
6
6
  "license": "UNLICENSED",
@@ -108,10 +108,10 @@
108
108
  },
109
109
  "devDependencies": {
110
110
  "@bike4mind/agents": "0.1.0",
111
- "@bike4mind/common": "2.47.2-recent-changes-tool.18528+003e9436e",
112
- "@bike4mind/mcp": "1.28.1-recent-changes-tool.18528+003e9436e",
113
- "@bike4mind/services": "2.45.2-recent-changes-tool.18528+003e9436e",
114
- "@bike4mind/utils": "2.3.4-recent-changes-tool.18528+003e9436e",
111
+ "@bike4mind/common": "2.47.2-recent-changes-tool.18533+5b2e7f35e",
112
+ "@bike4mind/mcp": "1.28.1-recent-changes-tool.18533+5b2e7f35e",
113
+ "@bike4mind/services": "2.45.2-recent-changes-tool.18533+5b2e7f35e",
114
+ "@bike4mind/utils": "2.3.4-recent-changes-tool.18533+5b2e7f35e",
115
115
  "@types/better-sqlite3": "^7.6.13",
116
116
  "@types/diff": "^5.0.9",
117
117
  "@types/jsonwebtoken": "^9.0.4",
@@ -128,5 +128,5 @@
128
128
  "optionalDependencies": {
129
129
  "@vscode/ripgrep": "^1.17.0"
130
130
  },
131
- "gitHead": "003e9436e6495eda7a75bfdd1da35927871852a4"
131
+ "gitHead": "5b2e7f35edd2523761a9aba67656a9a6df9c04f1"
132
132
  }