@jxtools/promptline 1.3.2 → 1.3.4
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/package.json +1 -1
- package/src/api/client.ts +3 -0
- package/src/backend/queue-store.ts +4 -1
- package/src/components/SessionSection.tsx +16 -14
- package/vite-plugin-api.ts +16 -0
package/package.json
CHANGED
package/src/api/client.ts
CHANGED
|
@@ -30,6 +30,9 @@ export const api = {
|
|
|
30
30
|
deleteSession: (project: string, sessionId: string) =>
|
|
31
31
|
request<{ deleted: string }>(sessionUrl(project, sessionId), { method: 'DELETE' }),
|
|
32
32
|
|
|
33
|
+
clearPrompts: (project: string, sessionId: string) =>
|
|
34
|
+
request<{ cleared: number }>(`${sessionUrl(project, sessionId)}/prompts`, { method: 'DELETE' }),
|
|
35
|
+
|
|
33
36
|
addPrompt: (project: string, sessionId: string, text: string) =>
|
|
34
37
|
request<Prompt>(`${sessionUrl(project, sessionId)}/prompts`, {
|
|
35
38
|
method: 'POST',
|
|
@@ -52,7 +52,6 @@ export function withComputedStatus(session: SessionQueue): SessionQueue & { stat
|
|
|
52
52
|
export function isSessionVisible(session: SessionQueue, now: number = Date.now()): boolean {
|
|
53
53
|
if (hasPendingWork(session)) return true;
|
|
54
54
|
if (session.closedAt != null) return false;
|
|
55
|
-
if (!session.sessionName) return false;
|
|
56
55
|
const msSinceStart = now - new Date(session.startedAt).getTime();
|
|
57
56
|
return msSinceStart <= SESSION_ABANDONED_TIMEOUT_MS;
|
|
58
57
|
}
|
|
@@ -150,6 +149,10 @@ export function deletePrompt(session: SessionQueue, promptId: string): Prompt |
|
|
|
150
149
|
return session.prompts.splice(idx, 1)[0];
|
|
151
150
|
}
|
|
152
151
|
|
|
152
|
+
export function clearPrompts(session: SessionQueue): Prompt[] {
|
|
153
|
+
return session.prompts.splice(0);
|
|
154
|
+
}
|
|
155
|
+
|
|
153
156
|
export function reorderPrompts(session: SessionQueue, order: string[]): string | null {
|
|
154
157
|
const promptMap = new Map(session.prompts.map(p => [p.id, p]));
|
|
155
158
|
for (const id of order) {
|
|
@@ -35,10 +35,10 @@ export function SessionSection({ session, project, onMutate, defaultExpanded = t
|
|
|
35
35
|
const [draggingId, setDraggingId] = useState<string | null>(null);
|
|
36
36
|
const dragSourceRef = useRef<string | null>(null);
|
|
37
37
|
|
|
38
|
-
async function
|
|
38
|
+
async function handleClearPrompts(e: React.MouseEvent) {
|
|
39
39
|
e.stopPropagation();
|
|
40
40
|
try {
|
|
41
|
-
await api.
|
|
41
|
+
await api.clearPrompts(project, session.sessionId);
|
|
42
42
|
onMutate();
|
|
43
43
|
} catch {
|
|
44
44
|
// Silent fail
|
|
@@ -148,18 +148,20 @@ export function SessionSection({ session, project, onMutate, defaultExpanded = t
|
|
|
148
148
|
▶
|
|
149
149
|
</span>
|
|
150
150
|
</button>
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
151
|
+
{session.prompts.length > 0 && (
|
|
152
|
+
<button
|
|
153
|
+
type="button"
|
|
154
|
+
onClick={handleClearPrompts}
|
|
155
|
+
className={[
|
|
156
|
+
'absolute right-2 top-1/2 -translate-y-1/2 p-1.5 rounded cursor-pointer',
|
|
157
|
+
'text-[var(--color-muted)]/40 hover:text-red-400 hover:bg-red-400/10',
|
|
158
|
+
'transition-all duration-100 focus:outline-none',
|
|
159
|
+
].join(' ')}
|
|
160
|
+
aria-label="Clear prompts"
|
|
161
|
+
>
|
|
162
|
+
<TrashIcon />
|
|
163
|
+
</button>
|
|
164
|
+
)}
|
|
163
165
|
</div>
|
|
164
166
|
|
|
165
167
|
{/* Session content */}
|
package/vite-plugin-api.ts
CHANGED
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
addPrompt,
|
|
18
18
|
updatePrompt,
|
|
19
19
|
deletePrompt,
|
|
20
|
+
clearPrompts,
|
|
20
21
|
reorderPrompts,
|
|
21
22
|
} from './src/backend/queue-store.ts';
|
|
22
23
|
|
|
@@ -283,6 +284,21 @@ async function handleApi(
|
|
|
283
284
|
return jsonError(res, 405, `Method ${method} not allowed`);
|
|
284
285
|
}
|
|
285
286
|
|
|
287
|
+
// DELETE /api/projects/:project/sessions/:sessionId/prompts
|
|
288
|
+
if (
|
|
289
|
+
segments[0] === 'projects' && segments[2] === 'sessions' &&
|
|
290
|
+
segments[4] === 'prompts' && segments.length === 5 && method === 'DELETE'
|
|
291
|
+
) {
|
|
292
|
+
const project = segments[1];
|
|
293
|
+
const sessionId = segments[3];
|
|
294
|
+
const session = readSession(QUEUES_DIR, project, sessionId);
|
|
295
|
+
if (!session) return jsonError(res, 404, 'Session not found');
|
|
296
|
+
|
|
297
|
+
const removed = clearPrompts(session);
|
|
298
|
+
writeSession(QUEUES_DIR, project, session);
|
|
299
|
+
return json(res, 200, { cleared: removed.length });
|
|
300
|
+
}
|
|
301
|
+
|
|
286
302
|
// /api/projects/:project/sessions/:sessionId/prompts
|
|
287
303
|
if (
|
|
288
304
|
segments[0] === 'projects' && segments[2] === 'sessions' &&
|