feat(agent): 支持持久化 /btw 旁路提问

This commit is contained in:
ji ruo committed 2026-09-10 21:42:25 +08:00
1 parent 8dae851b9b
commit 555539bc8e
34 files changed
+3744 -314

No files matched your search

+1 -1
View File
@@ -91,7 +91,7 @@ function getToken(): string | null {
return localStorage.getItem("artex_token");
}
async function http<T>(path: string, init?: RequestInit): Promise<T> {
export async function http<T>(path: string, init?: RequestInit): Promise<T> {
if (MOCK) return mockHandle<T>(init?.method ?? "GET", path, init?.body ?? null);
const token = getToken();
const r = await fetch(`/api${path}`, {
+43
View File
@@ -0,0 +1,43 @@
import { http } from "@/lib/api";
export interface SideModel {
model: string;
name: string;
format: string;
profile_id: number;
}
export interface SideExchange {
id: string;
ordinal: number;
client_request_id: string;
question: string;
answer: string;
status: "running" | "completed" | "failed" | "cancelled" | "interrupted";
error?: string;
model: SideModel;
snapshot_at: string;
created_at: string;
sequence: number;
}
export interface SideHistory {
items: SideExchange[];
current: SideExchange | null;
next_cursor: number;
snapshot: { captured_at: string; model: SideModel; available: boolean; reason: string } | null;
}
async function request<T>(path: string, method = "GET", body?: unknown): Promise<T> {
return http<T>(path.replace(/^\/api/, ""), { method, body: body === undefined ? undefined : JSON.stringify(body) });
}
export const sideAPI = {
history: (parent: string, before = 0) => request<SideHistory>(`${parent}/side-questions?before=${before}`),
ask: (parent: string, question: string, client_request_id: string) =>
request<SideExchange>(`${parent}/side-questions`, "POST", { question, client_request_id }),
clear: (parent: string) => request(`${parent}/side-questions`, "DELETE"),
cancel: (id: string) => request(`/api/side-questions/${id}/cancel`, "POST"),
};
export function isBtwCommand(text: string) {
return /^\/btw(?:\s|$)/.test(text.trim());
}