mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-22 00:05:51 +00:00
Squashed merge of: 1. fix/mcp-tsc-errors — 修复上游 MCP 重构后的 tsc 错误和测试失败 2. feat/pipe-mute-disconnect — Pipe IPC 逻辑断开、/lang 命令、mute 状态机 3. feat/stub-recovery-all — 实现全部 stub 恢复 (task 001-012) 4. feat/kairos-activation — KAIROS 激活解除阻塞 + 工具实现 5. codex/openclaw-autonomy-pr — 自治权限系统、运行记录、managed flows Additional: 6. daemon/job 命令层级化重构 (subcommand 架构) 7. 跨平台后台引擎抽象 (detached/tmux engines) 8. 修复 src/ 中 43 个预存在的 TypeScript 类型错误 9. 修复 langfuse isolated test mock 完整性 10. 修复 CodeRabbit 审查的 Critical/Major/Minor 问题 11. remote-control-server logger 抽象 (测试 stderr 静默化) 12. /simplify 审查修复 (代码复用、质量、效率)
87 lines
2.6 KiB
TypeScript
87 lines
2.6 KiB
TypeScript
import { log, error as logError } from "../../logger";
|
|
import { Hono } from "hono";
|
|
import {
|
|
createSession,
|
|
getSession,
|
|
updateSessionTitle,
|
|
archiveSession,
|
|
} from "../../services/session";
|
|
import { createWorkItem } from "../../services/work-dispatch";
|
|
import { apiKeyAuth, acceptCliHeaders } from "../../auth/middleware";
|
|
import { publishSessionEvent } from "../../services/transport";
|
|
|
|
const app = new Hono();
|
|
|
|
/** POST /v1/sessions — Create session */
|
|
app.post("/", acceptCliHeaders, apiKeyAuth, async (c) => {
|
|
const body = await c.req.json();
|
|
const username = c.get("username");
|
|
const session = createSession({ ...body, username });
|
|
|
|
// Create work item if environment is specified
|
|
if (body.environment_id) {
|
|
try {
|
|
await createWorkItem(body.environment_id, session.id);
|
|
} catch (err) {
|
|
logError(`[RCS] Failed to create work item: ${(err as Error).message}`);
|
|
}
|
|
}
|
|
|
|
// Publish initial events if provided
|
|
if (body.events && Array.isArray(body.events)) {
|
|
for (const evt of body.events) {
|
|
publishSessionEvent(session.id, evt.type || "init", evt, "outbound");
|
|
}
|
|
}
|
|
|
|
return c.json(session, 200);
|
|
});
|
|
|
|
/** GET /v1/sessions/:id — Get session */
|
|
app.get("/:id", acceptCliHeaders, apiKeyAuth, async (c) => {
|
|
const session = getSession(c.req.param("id"));
|
|
if (!session) {
|
|
return c.json({ error: { type: "not_found", message: "Session not found" } }, 404);
|
|
}
|
|
return c.json(session, 200);
|
|
});
|
|
|
|
/** PATCH /v1/sessions/:id — Update session title */
|
|
app.patch("/:id", acceptCliHeaders, apiKeyAuth, async (c) => {
|
|
const body = await c.req.json();
|
|
if (body.title) {
|
|
updateSessionTitle(c.req.param("id"), body.title);
|
|
}
|
|
const session = getSession(c.req.param("id"));
|
|
return c.json(session, 200);
|
|
});
|
|
|
|
/** POST /v1/sessions/:id/archive — Archive session */
|
|
app.post("/:id/archive", acceptCliHeaders, apiKeyAuth, async (c) => {
|
|
try {
|
|
archiveSession(c.req.param("id"));
|
|
} catch {
|
|
return c.json({ status: "ok" }, 409);
|
|
}
|
|
return c.json({ status: "ok" }, 200);
|
|
});
|
|
|
|
/** POST /v1/sessions/:id/events — Send event to session */
|
|
app.post("/:id/events", acceptCliHeaders, apiKeyAuth, async (c) => {
|
|
const sessionId = c.req.param("id");
|
|
const body = await c.req.json();
|
|
|
|
const events = body.events
|
|
? Array.isArray(body.events) ? body.events : [body.events]
|
|
: Array.isArray(body) ? body : [body];
|
|
const published = [];
|
|
for (const evt of events) {
|
|
const result = publishSessionEvent(sessionId, evt.type || "message", evt, "inbound");
|
|
published.push(result);
|
|
}
|
|
|
|
return c.json({ status: "ok", events: published.length }, 200);
|
|
});
|
|
|
|
export default app;
|