@yeshwanthyk/coding-agent 0.3.21 → 0.3.24
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/mmem.d.ts +28 -0
- package/dist/mmem.d.ts.map +1 -0
- package/dist/mmem.js +77 -0
- package/dist/mmem.js.map +1 -0
- package/dist/session-picker.d.ts +1 -1
- package/dist/session-picker.d.ts.map +1 -1
- package/dist/session-picker.js +129 -24
- package/dist/session-picker.jsx.map +1 -1
- package/package.json +1 -1
package/dist/mmem.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mmem client for full-text session search
|
|
3
|
+
* Gracefully falls back when mmem unavailable
|
|
4
|
+
*/
|
|
5
|
+
export interface MmemSession {
|
|
6
|
+
path: string;
|
|
7
|
+
title: string;
|
|
8
|
+
lastActivity: number;
|
|
9
|
+
score: number;
|
|
10
|
+
}
|
|
11
|
+
export type MmemSearchResult = {
|
|
12
|
+
ok: true;
|
|
13
|
+
sessions: MmemSession[];
|
|
14
|
+
} | {
|
|
15
|
+
ok: false;
|
|
16
|
+
reason: "not-installed" | "not-indexed" | "exec-error" | "parse-error";
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Search sessions via mmem with full-text search
|
|
20
|
+
* Filters to marvin sessions in the specified cwd
|
|
21
|
+
*/
|
|
22
|
+
export declare function searchSessions(query: string, cwd: string, limit?: number): MmemSearchResult;
|
|
23
|
+
/**
|
|
24
|
+
* Trigger mmem index in background (non-blocking)
|
|
25
|
+
* Call after session ends or when picker opens
|
|
26
|
+
*/
|
|
27
|
+
export declare function triggerBackgroundIndex(): void;
|
|
28
|
+
//# sourceMappingURL=mmem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mmem.d.ts","sourceRoot":"","sources":["../src/mmem.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,WAAW,EAAE,CAAA;CAAE,GACrC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,GAAG,aAAa,GAAG,YAAY,GAAG,aAAa,CAAA;CAAE,CAAC;AAiB1F;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,gBAAgB,CAgDvF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAS7C"}
|
package/dist/mmem.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mmem client for full-text session search
|
|
3
|
+
* Gracefully falls back when mmem unavailable
|
|
4
|
+
*/
|
|
5
|
+
import { spawnSync, spawn } from "bun";
|
|
6
|
+
/**
|
|
7
|
+
* Encode cwd to match marvin's session directory naming
|
|
8
|
+
* e.g., /Users/foo/bar -> --Users--foo--bar--
|
|
9
|
+
*/
|
|
10
|
+
function encodeCwd(cwd) {
|
|
11
|
+
return `--${cwd.replace(/\//g, "--")}--`;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Search sessions via mmem with full-text search
|
|
15
|
+
* Filters to marvin sessions in the specified cwd
|
|
16
|
+
*/
|
|
17
|
+
export function searchSessions(query, cwd, limit = 30) {
|
|
18
|
+
// Check if mmem exists
|
|
19
|
+
const which = spawnSync(["which", "mmem"]);
|
|
20
|
+
if (which.exitCode !== 0) {
|
|
21
|
+
return { ok: false, reason: "not-installed" };
|
|
22
|
+
}
|
|
23
|
+
// Run search
|
|
24
|
+
const result = spawnSync([
|
|
25
|
+
"mmem", "find", query,
|
|
26
|
+
"--agent", "marvin",
|
|
27
|
+
"--scope", "session",
|
|
28
|
+
"--limit", String(limit),
|
|
29
|
+
"--json",
|
|
30
|
+
]);
|
|
31
|
+
if (result.exitCode !== 0) {
|
|
32
|
+
const stderr = result.stderr.toString();
|
|
33
|
+
if (stderr.includes("no such table") || stderr.includes("no index")) {
|
|
34
|
+
return { ok: false, reason: "not-indexed" };
|
|
35
|
+
}
|
|
36
|
+
return { ok: false, reason: "exec-error" };
|
|
37
|
+
}
|
|
38
|
+
// Parse JSON
|
|
39
|
+
let data;
|
|
40
|
+
try {
|
|
41
|
+
const stdout = result.stdout.toString().trim();
|
|
42
|
+
if (!stdout) {
|
|
43
|
+
return { ok: true, sessions: [] };
|
|
44
|
+
}
|
|
45
|
+
data = JSON.parse(stdout);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return { ok: false, reason: "parse-error" };
|
|
49
|
+
}
|
|
50
|
+
// Filter to current cwd and transform
|
|
51
|
+
const encodedCwd = encodeCwd(cwd);
|
|
52
|
+
const sessions = data
|
|
53
|
+
.filter((r) => r.path.includes(encodedCwd))
|
|
54
|
+
.map((r) => ({
|
|
55
|
+
path: r.path,
|
|
56
|
+
title: r.title,
|
|
57
|
+
lastActivity: parseInt(r.last_message_at, 10),
|
|
58
|
+
score: r.score,
|
|
59
|
+
}));
|
|
60
|
+
return { ok: true, sessions };
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Trigger mmem index in background (non-blocking)
|
|
64
|
+
* Call after session ends or when picker opens
|
|
65
|
+
*/
|
|
66
|
+
export function triggerBackgroundIndex() {
|
|
67
|
+
try {
|
|
68
|
+
spawn(["mmem", "index"], {
|
|
69
|
+
detached: true,
|
|
70
|
+
stdio: ["ignore", "ignore", "ignore"],
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Silently ignore - mmem may not be installed
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=mmem.js.map
|
package/dist/mmem.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mmem.js","sourceRoot":"","sources":["../src/mmem.ts"],"names":[],"mappings":"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"}
|
package/dist/session-picker.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-picker.d.ts","sourceRoot":"","sources":["../src/session-picker.tsx"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"session-picker.d.ts","sourceRoot":"","sources":["../src/session-picker.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAcH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAwM3D,wBAAsB,aAAa,CAClC,cAAc,EAAE,cAAc,GAC5B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA6CxB"}
|
package/dist/session-picker.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { effect as _$effect } from "@opentui/solid";
|
|
2
|
+
import { memo as _$memo } from "@opentui/solid";
|
|
2
3
|
import { insert as _$insert } from "@opentui/solid";
|
|
3
4
|
import { createComponent as _$createComponent } from "@opentui/solid";
|
|
4
5
|
import { createTextNode as _$createTextNode } from "@opentui/solid";
|
|
@@ -6,10 +7,12 @@ import { insertNode as _$insertNode } from "@opentui/solid";
|
|
|
6
7
|
import { setProp as _$setProp } from "@opentui/solid";
|
|
7
8
|
import { createElement as _$createElement } from "@opentui/solid";
|
|
8
9
|
/**
|
|
9
|
-
* OpenTUI-based session picker
|
|
10
|
+
* OpenTUI-based session picker with full-text search
|
|
10
11
|
*/
|
|
11
|
-
import { render,
|
|
12
|
-
import { SelectList, ThemeProvider, useTheme } from "@yeshwanthyk/open-tui";
|
|
12
|
+
import { render, useKeyboard, useTerminalDimensions } from "@opentui/solid";
|
|
13
|
+
import { Input, SelectList, ThemeProvider, useTheme } from "@yeshwanthyk/open-tui";
|
|
14
|
+
import { createMemo, createSignal, onMount, Show } from "solid-js";
|
|
15
|
+
import { searchSessions, triggerBackgroundIndex } from "./mmem.js";
|
|
13
16
|
/** Detect system dark/light mode (macOS only, defaults to dark) */
|
|
14
17
|
function detectThemeMode() {
|
|
15
18
|
try {
|
|
@@ -25,42 +28,116 @@ function SessionPickerApp(props) {
|
|
|
25
28
|
} = useTheme();
|
|
26
29
|
const dimensions = useTerminalDimensions();
|
|
27
30
|
let listRef;
|
|
28
|
-
const
|
|
31
|
+
const [query, setQuery] = createSignal("");
|
|
32
|
+
const [searchFocused, setSearchFocused] = createSignal(true);
|
|
33
|
+
const [usingFallback, setUsingFallback] = createSignal(false);
|
|
34
|
+
// Trigger background index on mount
|
|
35
|
+
onMount(() => {
|
|
36
|
+
triggerBackgroundIndex();
|
|
37
|
+
});
|
|
38
|
+
// Convert loaded sessions to display format
|
|
39
|
+
const loadedSessions = createMemo(() => props.sessions.map(s => ({
|
|
40
|
+
path: s.path,
|
|
41
|
+
title: s.firstMessage,
|
|
42
|
+
lastActivity: s.lastActivity,
|
|
43
|
+
messageCount: s.messageCount,
|
|
44
|
+
modelId: s.modelId
|
|
45
|
+
})));
|
|
46
|
+
// Search results (mmem or fallback)
|
|
47
|
+
const searchResults = createMemo(() => {
|
|
48
|
+
const q = query().trim();
|
|
49
|
+
if (!q) return null;
|
|
50
|
+
// Try mmem search
|
|
51
|
+
const result = searchSessions(q, props.cwd);
|
|
52
|
+
if (result.ok) {
|
|
53
|
+
setUsingFallback(false);
|
|
54
|
+
return result.sessions;
|
|
55
|
+
}
|
|
56
|
+
// Fallback to title filter
|
|
57
|
+
setUsingFallback(true);
|
|
58
|
+
const lowerQ = q.toLowerCase();
|
|
59
|
+
return loadedSessions().filter(s => s.title.toLowerCase().includes(lowerQ));
|
|
60
|
+
});
|
|
61
|
+
// Final display list
|
|
62
|
+
const displaySessions = createMemo(() => searchResults() ?? loadedSessions());
|
|
63
|
+
// Flat items for SelectList
|
|
64
|
+
const items = createMemo(() => displaySessions().map(s => ({
|
|
29
65
|
value: s.path,
|
|
30
|
-
label: formatFirstMessage(s.
|
|
31
|
-
description: formatMeta(s.
|
|
32
|
-
}));
|
|
66
|
+
label: formatFirstMessage(s.title),
|
|
67
|
+
description: formatMeta(s.lastActivity, s.messageCount, s.modelId)
|
|
68
|
+
})));
|
|
33
69
|
useKeyboard(e => {
|
|
34
|
-
if (e.name === "
|
|
70
|
+
if (e.name === "tab" || (e.name === "down" || e.ctrl && e.name === "n") && searchFocused()) {
|
|
71
|
+
// Tab or down arrow exits search and focuses list
|
|
72
|
+
setSearchFocused(false);
|
|
73
|
+
} else if (e.name === "up" || e.ctrl && e.name === "p") {
|
|
35
74
|
listRef?.moveUp();
|
|
36
75
|
} else if (e.name === "down" || e.ctrl && e.name === "n") {
|
|
37
76
|
listRef?.moveDown();
|
|
38
|
-
} else if (e.name === "return") {
|
|
77
|
+
} else if (e.name === "return" && !searchFocused()) {
|
|
39
78
|
listRef?.select();
|
|
40
79
|
} else if (e.name === "escape" || e.ctrl && e.name === "c") {
|
|
41
|
-
|
|
80
|
+
if (query()) {
|
|
81
|
+
setQuery("");
|
|
82
|
+
} else {
|
|
83
|
+
props.onCancel();
|
|
84
|
+
}
|
|
42
85
|
}
|
|
43
86
|
});
|
|
87
|
+
const maxVisible = () => Math.min(10, dimensions().height - 6);
|
|
44
88
|
return (() => {
|
|
45
89
|
var _el$ = _$createElement("box"),
|
|
46
90
|
_el$2 = _$createElement("text"),
|
|
47
91
|
_el$4 = _$createElement("box"),
|
|
48
92
|
_el$5 = _$createElement("box"),
|
|
49
|
-
_el$6 = _$createElement("text")
|
|
93
|
+
_el$6 = _$createElement("text"),
|
|
94
|
+
_el$8 = _$createElement("box"),
|
|
95
|
+
_el$9 = _$createElement("box"),
|
|
96
|
+
_el$0 = _$createElement("box"),
|
|
97
|
+
_el$1 = _$createElement("text");
|
|
50
98
|
_$insertNode(_el$, _el$2);
|
|
51
99
|
_$insertNode(_el$, _el$4);
|
|
52
100
|
_$insertNode(_el$, _el$5);
|
|
53
|
-
_$insertNode(_el$, _el$
|
|
101
|
+
_$insertNode(_el$, _el$8);
|
|
102
|
+
_$insertNode(_el$, _el$9);
|
|
103
|
+
_$insertNode(_el$, _el$0);
|
|
54
104
|
_$setProp(_el$, "flexDirection", "column");
|
|
55
105
|
_$insertNode(_el$2, _$createTextNode(`Resume Session`));
|
|
56
106
|
_$setProp(_el$4, "height", 1);
|
|
107
|
+
_$insertNode(_el$5, _el$6);
|
|
108
|
+
_$setProp(_el$5, "flexDirection", "row");
|
|
109
|
+
_$insertNode(_el$6, _$createTextNode(`Search: `));
|
|
110
|
+
_$insert(_el$5, _$createComponent(Input, {
|
|
111
|
+
get value() {
|
|
112
|
+
return query();
|
|
113
|
+
},
|
|
114
|
+
placeholder: "search sessions...",
|
|
115
|
+
get focused() {
|
|
116
|
+
return searchFocused();
|
|
117
|
+
},
|
|
118
|
+
get width() {
|
|
119
|
+
return dimensions().width - 12;
|
|
120
|
+
},
|
|
121
|
+
onChange: v => setQuery(v),
|
|
122
|
+
onSubmit: () => setSearchFocused(false),
|
|
123
|
+
onEscape: () => {
|
|
124
|
+
if (query()) {
|
|
125
|
+
setQuery("");
|
|
126
|
+
} else {
|
|
127
|
+
props.onCancel();
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}), null);
|
|
131
|
+
_$setProp(_el$8, "height", 1);
|
|
57
132
|
_$insert(_el$, _$createComponent(SelectList, {
|
|
58
133
|
ref: r => {
|
|
59
134
|
listRef = r;
|
|
60
135
|
},
|
|
61
|
-
items
|
|
136
|
+
get items() {
|
|
137
|
+
return items();
|
|
138
|
+
},
|
|
62
139
|
get maxVisible() {
|
|
63
|
-
return
|
|
140
|
+
return maxVisible();
|
|
64
141
|
},
|
|
65
142
|
get width() {
|
|
66
143
|
return dimensions().width - 2;
|
|
@@ -69,24 +146,47 @@ function SessionPickerApp(props) {
|
|
|
69
146
|
get onCancel() {
|
|
70
147
|
return props.onCancel;
|
|
71
148
|
}
|
|
72
|
-
}), _el$
|
|
73
|
-
_$setProp(_el$
|
|
74
|
-
_$insertNode(_el$
|
|
149
|
+
}), _el$9);
|
|
150
|
+
_$setProp(_el$9, "flexGrow", 1);
|
|
151
|
+
_$insertNode(_el$0, _el$1);
|
|
152
|
+
_$setProp(_el$0, "flexDirection", "row");
|
|
153
|
+
_$setProp(_el$0, "justifyContent", "space-between");
|
|
154
|
+
_$insertNode(_el$1, _$createTextNode(`↑/↓ navigate · Enter select · Esc cancel`));
|
|
155
|
+
_$insert(_el$0, _$createComponent(Show, {
|
|
156
|
+
get when() {
|
|
157
|
+
return _$memo(() => !!usingFallback())() && query();
|
|
158
|
+
},
|
|
159
|
+
get children() {
|
|
160
|
+
var _el$11 = _$createElement("text");
|
|
161
|
+
_$insertNode(_el$11, _$createTextNode(`[title only]`));
|
|
162
|
+
_$effect(_$p => _$setProp(_el$11, "fg", theme.textMuted, _$p));
|
|
163
|
+
return _el$11;
|
|
164
|
+
}
|
|
165
|
+
}), null);
|
|
75
166
|
_$effect(_p$ => {
|
|
76
167
|
var _v$ = dimensions().width,
|
|
77
168
|
_v$2 = dimensions().height,
|
|
78
|
-
_v$3 = theme.
|
|
79
|
-
_v$4 =
|
|
169
|
+
_v$3 = theme.text,
|
|
170
|
+
_v$4 = dimensions().width - 2,
|
|
171
|
+
_v$5 = theme.textMuted,
|
|
172
|
+
_v$6 = dimensions().width - 2,
|
|
173
|
+
_v$7 = theme.textMuted;
|
|
80
174
|
_v$ !== _p$.e && (_p$.e = _$setProp(_el$, "width", _v$, _p$.e));
|
|
81
175
|
_v$2 !== _p$.t && (_p$.t = _$setProp(_el$, "height", _v$2, _p$.t));
|
|
82
176
|
_v$3 !== _p$.a && (_p$.a = _$setProp(_el$2, "fg", _v$3, _p$.a));
|
|
83
|
-
_v$4 !== _p$.o && (_p$.o = _$setProp(_el$
|
|
177
|
+
_v$4 !== _p$.o && (_p$.o = _$setProp(_el$5, "width", _v$4, _p$.o));
|
|
178
|
+
_v$5 !== _p$.i && (_p$.i = _$setProp(_el$6, "fg", _v$5, _p$.i));
|
|
179
|
+
_v$6 !== _p$.n && (_p$.n = _$setProp(_el$0, "width", _v$6, _p$.n));
|
|
180
|
+
_v$7 !== _p$.s && (_p$.s = _$setProp(_el$1, "fg", _v$7, _p$.s));
|
|
84
181
|
return _p$;
|
|
85
182
|
}, {
|
|
86
183
|
e: undefined,
|
|
87
184
|
t: undefined,
|
|
88
185
|
a: undefined,
|
|
89
|
-
o: undefined
|
|
186
|
+
o: undefined,
|
|
187
|
+
i: undefined,
|
|
188
|
+
n: undefined,
|
|
189
|
+
s: undefined
|
|
90
190
|
});
|
|
91
191
|
return _el$;
|
|
92
192
|
})();
|
|
@@ -94,9 +194,12 @@ function SessionPickerApp(props) {
|
|
|
94
194
|
function formatFirstMessage(msg) {
|
|
95
195
|
return msg.replace(/\n/g, " ").slice(0, 60);
|
|
96
196
|
}
|
|
97
|
-
function formatMeta(
|
|
98
|
-
const ago = formatRelativeTime(
|
|
99
|
-
|
|
197
|
+
function formatMeta(lastActivity, count, model) {
|
|
198
|
+
const ago = formatRelativeTime(lastActivity);
|
|
199
|
+
const parts = [ago];
|
|
200
|
+
if (count !== undefined) parts.push(`${count} msgs`);
|
|
201
|
+
if (model) parts.push(model);
|
|
202
|
+
return parts.join(" · ");
|
|
100
203
|
}
|
|
101
204
|
function formatRelativeTime(ts) {
|
|
102
205
|
const seconds = Math.floor((Date.now() - ts) / 1000);
|
|
@@ -114,6 +217,7 @@ export async function selectSession(sessionManager) {
|
|
|
114
217
|
const sessions = allSessions.filter(s => s.messageCount > 0 && !s.firstMessage.startsWith("System context:"));
|
|
115
218
|
if (sessions.length === 0) return null;
|
|
116
219
|
if (sessions.length === 1) return sessions[0].path;
|
|
220
|
+
const cwd = process.cwd();
|
|
117
221
|
return new Promise(resolve => {
|
|
118
222
|
let resolved = false;
|
|
119
223
|
const doResolve = value => {
|
|
@@ -132,6 +236,7 @@ export async function selectSession(sessionManager) {
|
|
|
132
236
|
get children() {
|
|
133
237
|
return _$createComponent(SessionPickerApp, {
|
|
134
238
|
sessions: sessions,
|
|
239
|
+
cwd: cwd,
|
|
135
240
|
onSelect: path => doResolve(path),
|
|
136
241
|
onCancel: () => doResolve(null)
|
|
137
242
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-picker.jsx","sourceRoot":"","sources":["../src/session-picker.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"session-picker.jsx","sourceRoot":"","sources":["../src/session-picker.tsx"],"names":[],"mappings":"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"}
|