AI 长篇小说写作平台。monorepo: packages/core(运行时)、packages/cli(TUI)、packages/studio(Web UI / Hono + Vite)。
pnpm dev # 从根目录启动!core tsc --watch + studio Vite HMR + API server
pnpm build # 全量构建
pnpm test # vitest 全仓测试
pnpm --filter @actalk/inkos-core build # 改了 core 后必须重建(或用 pnpm dev 自动 watch)
| 文档 | 范围 | 何时读 |
|---|---|---|
docs/infra/studio-state-management.md |
Studio Zustand store 架构、slice 约定、目录结构 | 修改 packages/studio/src/store/ 时 |
docs/infra/studio-routing-and-session.md |
URL hash 路由 + 消息隔离 + pi-ai/pi-agent 集成 | 修改路由、session、LLM provider 时 |
docs/infra/studio-service-management.md |
服务商管理页设计 | 修改 ConfigView / 服务商配置时 |
docs/plans/2026-04-15-sub-agent-params-alignment.md |
sub_agent 工具参数对齐设计 | 修改 agent-tools.ts / sub_agent 工具时 |
pnpm test 全量通过,不能攒到最后才跑修改 packages/core/src/agent/agent-tools.ts 时必须遵守:
description 直接传给 LLM,模型靠它理解参数含义;每个字段的 description 必须标注适用的 agent(如 "reviser only: revision mode")Type.Union([Type.Literal("a"), Type.Literal("b")]) 而非 Type.String(),模型能在 JSON Schema 里看到 const 约束,不会传错Type.String({ description: "..." })Type.Optional(...) 标记非必填参数genre: "general")core/src/agent/agent-tools.ts → SubAgentParams schema → createSubAgentTool → 调用 PipelineRunner 方法core/interaction/project-tools.ts → CREATE_BOOK_TOOL + chatWithTools → Studio ChatPage → BookFormCardstudio/src/App.tsx → route 驱动页面切换studio/src/store/chat/ — 对话消息、创建流程、侧边栏状态studio/src/store/service/ — 服务商连接状态、模型列表缓存、model picker 三态(loading/no-models/ready).filter() / .map() 等产生新数组的派生,用组件内 useMemo 而不是 store selector — 否则会造成无限渲染循环studio/src/hooks/use-sse.ts(共享 buffer)+ 组件内直连 EventSource(流式渲染)core/src/llm/service-presets.ts → baseUrl/api/knownModels/modelsBaseUrl;Anthropic 兼容端点用于 MiniMax 和百炼