chore(release): v0.8.33 — sub-agent and RLM renovation with persistent sessions

- Persistent RLM sessions (rlm_open/rlm_eval/rlm_close) with bounded REPL helpers
- Fork-aware sub-agent sessions (agent_open/agent_eval/agent_close) with handle_read
- Shared handle_read storage with slice/range/count/JSONPath projections
- Slash-command routing: /rlm, /agent, /relay (/接力) for handoff prompts
- Sidebar renamed to "Work" tab, consistent across Plan/Agent/YOLO modes
- Tool papercuts: file_search excludes, grep_files strings, fetch_url JSON,
  edit_file fuzz, exec_shell merged stdout/stderr, revert_turn no-op reject
- CLI reasoning-effort honoured on non-auto exec routes (#1511 @h3c-hexin)
- Edit-file replacement boundaries clarified (#1516)
- Pandoc output validated before probing (#1523)
- Running turns steerable/repaintable (#1533, #1537)
- Tasks/Activity Detail calmer under load
- npm retry timeout hint (#1538 @reidliu41)
- Issue templates improved (#1525 @reidliu41)
- Shell: kill process group to prevent UI freeze (#828 @CrepuscularIRIS)
- TUI: ignore leaked SGR mouse reports in composer (#1421 @reidliu41)
- Footer: keep chips within available width (#1417 @Wenjunyun123)
- Session picker: scope Ctrl+R to current workspace (#1395 @LinQ)
- Removed stale competitive-analysis doc
- Prompts/docs teach only new tool names
This commit is contained in:
Hunter Bown
2026-05-12 19:54:08 -05:00
parent 503551ddec
commit 99c6b22e83
80 changed files with 6158 additions and 2084 deletions
+25 -4
View File
@@ -1,6 +1,6 @@
import { fetchFeed, fetchRepoStats } from "@/lib/github";
import { curate } from "@/lib/deepseek";
import { putDispatch } from "@/lib/kv";
import { putDispatchWithKv } from "@/lib/kv";
import {
agentChat,
TRIAGE_PROMPT,
@@ -32,6 +32,8 @@ export interface AgentEnv {
MAINTAINER_GITHUB_PAT?: string;
}
const CRON_STATUS_TTL = 60 * 60 * 24 * 14;
function dsEnv(env: AgentEnv): DeepSeekEnv {
return {
baseUrl: env.DEEPSEEK_BASE_URL ?? process.env.DEEPSEEK_BASE_URL,
@@ -49,10 +51,29 @@ export async function runCurate(env: AgentEnv): Promise<Record<string, unknown>>
fetchFeed(env.GITHUB_TOKEN, 30),
]);
const dispatch = await curate(env.DEEPSEEK_API_KEY, stats, feed, dsEnv(env));
await putDispatch(dispatch);
return { ok: true, headline: dispatch.headline };
await putDispatchWithKv(env.CURATED_KV, dispatch);
await env.CURATED_KV?.put(
"cron:curate:last",
JSON.stringify({
ok: true,
generatedAt: dispatch.generatedAt,
headline: dispatch.headline,
}),
{ expirationTtl: CRON_STATUS_TTL }
);
return { ok: true, headline: dispatch.headline, stored: env.CURATED_KV ? "kv" : "memory" };
} catch (e) {
return { ok: false, error: String(e) };
const error = String(e);
await env.CURATED_KV?.put(
"cron:curate:last",
JSON.stringify({
ok: false,
generatedAt: new Date().toISOString(),
error,
}),
{ expirationTtl: CRON_STATUS_TTL }
);
return { ok: false, error };
}
}
+3 -3
View File
@@ -18,8 +18,8 @@ export interface RepoFacts {
}
export const FACTS: RepoFacts = {
"generatedAt": "2026-05-12T19:02:49.213Z",
"version": "0.8.32",
"generatedAt": "2026-05-12T22:56:03.599Z",
"version": "0.8.33",
"crates": [
"agent",
"app-server",
@@ -90,7 +90,7 @@ export const FACTS: RepoFacts = {
],
"defaultModel": "deepseek-v4-pro",
"nodeEngines": ">=18",
"toolCount": 64,
"toolCount": 68,
"license": "MIT",
"latestRelease": null
};
+7 -3
View File
@@ -6,7 +6,7 @@ import type { CuratedDispatch } from "./types";
const MEM = new Map<string, string>();
interface KVNamespace {
export interface KVNamespace {
get(key: string): Promise<string | null>;
put(key: string, value: string, opts?: { expirationTtl?: number }): Promise<void>;
list(opts?: { prefix?: string; limit?: number }): Promise<{ keys: { name: string }[] }>;
@@ -53,9 +53,13 @@ export async function getDispatch(): Promise<CuratedDispatch | null> {
export async function putDispatch(d: CuratedDispatch): Promise<void> {
const env = await getEnv();
await putDispatchWithKv(env.CURATED_KV, d);
}
export async function putDispatchWithKv(kv: KVNamespace | undefined, d: CuratedDispatch): Promise<void> {
const value = JSON.stringify(d);
if (env.CURATED_KV) {
await env.CURATED_KV.put("dispatch:latest", value, { expirationTtl: 60 * 60 * 24 * 7 });
if (kv) {
await kv.put("dispatch:latest", value, { expirationTtl: 60 * 60 * 24 * 7 });
} else {
MEM.set("dispatch:latest", value);
}