@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.
- package/dist/index.js +55 -17
- 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
|
-
(
|
|
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((
|
|
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
|
|
1997
|
-
const
|
|
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
|
-
|
|
2000
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
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.
|
|
13089
|
-
"@bike4mind/mcp": "1.28.1-recent-changes-tool.
|
|
13090
|
-
"@bike4mind/services": "2.45.2-recent-changes-tool.
|
|
13091
|
-
"@bike4mind/utils": "2.3.4-recent-changes-tool.
|
|
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: "
|
|
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.
|
|
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.
|
|
112
|
-
"@bike4mind/mcp": "1.28.1-recent-changes-tool.
|
|
113
|
-
"@bike4mind/services": "2.45.2-recent-changes-tool.
|
|
114
|
-
"@bike4mind/utils": "2.3.4-recent-changes-tool.
|
|
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": "
|
|
131
|
+
"gitHead": "5b2e7f35edd2523761a9aba67656a9a6df9c04f1"
|
|
132
132
|
}
|