sayacode 3.2.0__tar.gz → 3.2.2__tar.gz
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.
- {sayacode-3.2.0 → sayacode-3.2.2}/CHANGELOG.md +12 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/PKG-INFO +3 -3
- {sayacode-3.2.0 → sayacode-3.2.2}/README.md +2 -2
- {sayacode-3.2.0 → sayacode-3.2.2}/docs/webui.md +1 -1
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/components/AgentGraph.module.css +6 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/components/AgentGraph.tsx +13 -4
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/components/Conversation.module.css +35 -60
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/components/Conversation.tsx +158 -136
- sayacode-3.2.2/frontend/src/components/ConversationProcess.module.css +176 -0
- sayacode-3.2.2/frontend/src/components/ConversationProcess.test.tsx +73 -0
- sayacode-3.2.2/frontend/src/components/ConversationProcess.tsx +183 -0
- sayacode-3.2.2/frontend/src/components/Inspector.test.tsx +46 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/components/Inspector.tsx +38 -19
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/components/Sidebar.tsx +7 -2
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/components/Trajectory.module.css +13 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/components/Trajectory.tsx +16 -3
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/i18n.tsx +11 -4
- sayacode-3.2.2/frontend/src/lib/conversationTimeline.test.ts +261 -0
- sayacode-3.2.2/frontend/src/lib/conversationTimeline.ts +215 -0
- sayacode-3.2.2/frontend/src/products/useProduct.ts +98 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/state/eventPolicy.test.ts +27 -1
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/state/eventPolicy.ts +6 -0
- sayacode-3.2.2/frontend/src/state/useWorkspace.resync.test.ts +78 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/state/useWorkspace.ts +91 -13
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/styles/shared.module.css +25 -1
- {sayacode-3.2.0 → sayacode-3.2.2}/pyproject.toml +1 -1
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/application.py +16 -13
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/audit.py +9 -8
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/cli/preferences.py +1 -1
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/host/application.py +19 -5
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/tasks/inbox.py +10 -1
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/tasks/records.py +2 -2
- sayacode-3.2.0/src/sayacode/web/static/assets/AgentGraph-BSxrS64-.css → sayacode-3.2.2/src/sayacode/web/static/assets/AgentGraph-CEriGMSJ.css +1 -1
- sayacode-3.2.0/src/sayacode/web/static/assets/AgentGraph-BEqsmGUe.js → sayacode-3.2.2/src/sayacode/web/static/assets/AgentGraph-CRRA3WQV.js +2 -2
- sayacode-3.2.2/src/sayacode/web/static/assets/ProductDialog-CkAhucsM.js +4 -0
- sayacode-3.2.2/src/sayacode/web/static/assets/Trajectory-Cafi12z-.js +1 -0
- sayacode-3.2.2/src/sayacode/web/static/assets/Trajectory-yaV4MOoU.css +1 -0
- sayacode-3.2.2/src/sayacode/web/static/assets/index-BKGwQS3l.js +50 -0
- sayacode-3.2.2/src/sayacode/web/static/assets/index-EwIvkuyc.css +1 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/web/static/index.html +2 -2
- {sayacode-3.2.0 → sayacode-3.2.2}/uv.lock +1 -1
- sayacode-3.2.0/frontend/src/components/InlineActivity.module.css +0 -85
- sayacode-3.2.0/frontend/src/components/InlineActivity.tsx +0 -103
- sayacode-3.2.0/frontend/src/products/useProduct.ts +0 -40
- sayacode-3.2.0/src/sayacode/web/static/assets/ProductDialog-CzT-U0G8.js +0 -4
- sayacode-3.2.0/src/sayacode/web/static/assets/Trajectory-DDXHFfgm.css +0 -1
- sayacode-3.2.0/src/sayacode/web/static/assets/Trajectory-qF7MedlX.js +0 -1
- sayacode-3.2.0/src/sayacode/web/static/assets/index-BwQa8f9g.js +0 -50
- sayacode-3.2.0/src/sayacode/web/static/assets/index-DIWUhX54.css +0 -1
- {sayacode-3.2.0 → sayacode-3.2.2}/.gitignore +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/LICENSE +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/assets/image1.png +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/assets/image2.png +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/assets/image3.png +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/assets/image4.png +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/docs/architecture.md +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/docs/design/memory-system.md +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/docs/research/coding-agent-memory.md +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/.prettierrc.json +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/README.md +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/index.html +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/package-lock.json +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/package.json +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/App.module.css +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/App.tsx +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/api/client.test.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/api/client.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/api/events.test.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/api/events.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/api/preloadRecovery.test.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/api/preloadRecovery.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/api/session.test.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/api/types.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/components/ApprovalDialog.module.css +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/components/ApprovalDialog.tsx +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/components/ComposerActions.module.css +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/components/ComposerActions.tsx +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/components/Conversation.test.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/components/DeleteSessionDialog.tsx +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/components/DirectoryPicker.tsx +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/components/Inspector.module.css +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/components/MarkdownContent.tsx +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/components/QueueDock.module.css +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/components/QueueDock.test.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/components/QueueDock.tsx +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/components/RecoveryScreen.tsx +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/components/Sidebar.module.css +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/components/approvalChoices.test.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/components/approvalChoices.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/i18n.test.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/lib/format.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/lib/tasks.test.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/lib/tasks.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/lib/trust.test.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/lib/trust.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/main.tsx +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/products/ProductDialog.module.css +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/products/ProductDialog.tsx +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/products/SettingsPreferences.module.css +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/products/SettingsPreferences.tsx +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/products/diagnostics.tsx +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/products/mcp.tsx +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/products/memory.tsx +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/products/modelTest.test.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/products/modelTest.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/products/models.tsx +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/products/panel.module.css +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/products/session.module.css +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/products/session.tsx +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/products/skills.tsx +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/state/activity.test.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/state/activity.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/state/liveText.test.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/state/liveText.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/state/messages.test.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/state/messages.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/state/queuedInput.test.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/state/queuedInput.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/state/snapshotOrder.test.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/state/snapshotOrder.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/src/styles/tokens.css +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/tsconfig.json +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/frontend/vite.config.ts +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/__init__.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/__main__.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/agent/__init__.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/agent/context.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/agent/events.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/agent/graph.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/agent/models.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/agent/runtime.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/approvals/__init__.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/approvals/middleware.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/approvals/policy.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/cli/__init__.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/cli/events.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/cli/headless.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/cli/main.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/cli/web.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/config.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/diagnostics.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/extensions/__init__.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/extensions/hooks.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/extensions/instructions.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/extensions/mcp.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/extensions/skills.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/host/__init__.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/host/attachments.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/host/events.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/host/products.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/host/run_actions.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/host/session_operations.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/host/views.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/host/workspaces.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/memory/__init__.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/memory/evidence.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/memory/learning.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/memory/middleware.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/memory/privacy.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/memory/processing.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/memory/records.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/memory/repository.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/memory/retrieval.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/memory/service.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/memory/tools.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/memory/turns.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/paths.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/process.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/profiles.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/prompts.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/sessions.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/tasks/__init__.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/tasks/manager.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/tasks/middleware.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/tasks/tools.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/tasks/worktree.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/tools/__init__.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/tools/analysis.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/tools/catalog.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/tools/files.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/tools/git.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/tools/shell.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/tools/web.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/web/__init__.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/web/app.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/web/attachments.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/web/contracts.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/web/products.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/web/responses.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/web/security.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/web/session_operations.py +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/web/static/assets/MarkdownContent-DmcbXhCl.js +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/web/static/assets/ProductDialog-Cq8hWItk.css +0 -0
- {sayacode-3.2.0 → sayacode-3.2.2}/src/sayacode/web/static/assets/jsx-runtime-D3jfb0Ew.js +0 -0
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# 更新日志
|
|
2
2
|
|
|
3
|
+
## 3.2.2(2026-09-27)
|
|
4
|
+
|
|
5
|
+
- 收窄本地审计记录:任务状态不再复制提示词、追问、结果和上下文快照;审批暂停只记录待批准数量,运行失败只记录异常类型,工具轨迹不再写入调用参数中的路径和搜索词。
|
|
6
|
+
- 串行化进程内并发审计追加,修复 Windows 上自动记忆的并行模型回调可能覆盖同一审计文件记录的问题。
|
|
7
|
+
- 修正工作区或查询条件切换时旧请求晚到覆盖当前设置面板的问题;新资源加载前隐藏旧数据,旧操作完成后不会刷新另一个资源。
|
|
8
|
+
- Web 构建产物随修复更新,wheel 和源码包继续直接提供界面资源。历史审计文件不会自动改写。
|
|
9
|
+
|
|
10
|
+
## 3.2.1(2026-09-25)
|
|
11
|
+
|
|
12
|
+
- 将独立的“当前运行活动”卡片替换为对话内可展开的过程行:并发工具按调用标识原位更新,长时间运行显示动态状态与耗时,完成后保留简明摘要;详细事件仍在“运行轨迹”中查看。
|
|
13
|
+
- 补齐主 Agent、子 Agent、计划和轨迹的运行反馈,修正当前会话子任务计数、停止中的耗时显示及相对时间刷新;上翻阅读时提供“回到最新”入口。
|
|
14
|
+
|
|
3
15
|
## 3.2.0(2026-09-25)
|
|
4
16
|
|
|
5
17
|
- 移除 Jev 自动审理信任档、独立审理模型配置和相关界面;现有会话的审理档由运行时归入人工询问档。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: sayacode
|
|
3
|
-
Version: 3.2.
|
|
3
|
+
Version: 3.2.2
|
|
4
4
|
Summary: A local LangChain and LangGraph coding assistant with a Web UI
|
|
5
5
|
Project-URL: Homepage, https://github.com/saya-ch/sayacode
|
|
6
6
|
Project-URL: Repository, https://github.com/saya-ch/sayacode
|
|
@@ -65,7 +65,7 @@ Description-Content-Type: text/markdown
|
|
|
65
65
|
|
|
66
66
|
<p>
|
|
67
67
|
<img src="https://img.shields.io/badge/Python-3.11%20%E2%80%93%203.13-334155" alt="Python 3.11 至 3.13">
|
|
68
|
-
<img src="https://img.shields.io/badge/Version-3.2.
|
|
68
|
+
<img src="https://img.shields.io/badge/Version-3.2.2-EF5DA8" alt="版本 3.2.2">
|
|
69
69
|
<img src="https://img.shields.io/badge/License-MIT-334155" alt="MIT 许可证">
|
|
70
70
|
</p>
|
|
71
71
|
</div>
|
|
@@ -74,7 +74,7 @@ Description-Content-Type: text/markdown
|
|
|
74
74
|
|
|
75
75
|
SAYACODE 是基于 **LangChain / LangGraph** 的本机编程助手。左侧管理工作区与会话,中间呈现对话和工具轨迹,右侧展示计划、子 Agent、审批与代码交付。Agent 由 LangChain `create_agent` 构建;LangGraph 管理消息、待办、检查点和审批中断。Web 页面只展示和操作运行结果,不另建一套 Agent 执行协议。
|
|
76
76
|
|
|
77
|
-
**3.x 的运行方式:**交互式 TUI 已由 FastAPI + React 工作台取代;适合脚本和 CI 的无头 CLI 继续保留。3.1 增加运行中消息队列、整棵子 Agent 任务树停止和会话管理;3.2
|
|
77
|
+
**3.x 的运行方式:**交互式 TUI 已由 FastAPI + React 工作台取代;适合脚本和 CI 的无头 CLI 继续保留。3.1 增加运行中消息队列、整棵子 Agent 任务树停止和会话管理;3.2 整理四档信任策略与对话内运行过程,并持续改进审计隐私和界面状态可靠性。
|
|
78
78
|
|
|
79
79
|
## 快速开始
|
|
80
80
|
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
<p>
|
|
17
17
|
<img src="https://img.shields.io/badge/Python-3.11%20%E2%80%93%203.13-334155" alt="Python 3.11 至 3.13">
|
|
18
|
-
<img src="https://img.shields.io/badge/Version-3.2.
|
|
18
|
+
<img src="https://img.shields.io/badge/Version-3.2.2-EF5DA8" alt="版本 3.2.2">
|
|
19
19
|
<img src="https://img.shields.io/badge/License-MIT-334155" alt="MIT 许可证">
|
|
20
20
|
</p>
|
|
21
21
|
</div>
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
|
|
25
25
|
SAYACODE 是基于 **LangChain / LangGraph** 的本机编程助手。左侧管理工作区与会话,中间呈现对话和工具轨迹,右侧展示计划、子 Agent、审批与代码交付。Agent 由 LangChain `create_agent` 构建;LangGraph 管理消息、待办、检查点和审批中断。Web 页面只展示和操作运行结果,不另建一套 Agent 执行协议。
|
|
26
26
|
|
|
27
|
-
**3.x 的运行方式:**交互式 TUI 已由 FastAPI + React 工作台取代;适合脚本和 CI 的无头 CLI 继续保留。3.1 增加运行中消息队列、整棵子 Agent 任务树停止和会话管理;3.2
|
|
27
|
+
**3.x 的运行方式:**交互式 TUI 已由 FastAPI + React 工作台取代;适合脚本和 CI 的无头 CLI 继续保留。3.1 增加运行中消息队列、整棵子 Agent 任务树停止和会话管理;3.2 整理四档信任策略与对话内运行过程,并持续改进审计隐私和界面状态可靠性。
|
|
28
28
|
|
|
29
29
|
## 快速开始
|
|
30
30
|
|
|
@@ -32,7 +32,7 @@ CLI 打印 `SAYACODE WebUI: http://127.0.0.1:<端口>/#token=...`,并尝试打
|
|
|
32
32
|
|
|
33
33
|
在中间输入框描述目标,按 Enter 发送;Shift+Enter 换行。输入框有内容时右下角是发送键;输入框为空且会话树仍在运行时,同一位置显示停止键;已停止时显示恢复键。若选中的子 Agent 已停止,先恢复主会话,再恢复该子 Agent。Agent 运行中仍可输入:发送后先进入输入框旁的持久队列,队列中的每条消息可编辑、删除或点“直接发送”。直接发送会把同一条消息交给下一安全模型步骤,不中止当前模型请求或工具调用。等待审批或已经停止的子 Agent 收到新消息时先保留在队列;处理审批或显式恢复后才继续投递。切换会话或关闭页面不会因为浏览器连接变化而中止宿主中的运行。
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
对话在用户输入与 Agent 回答之间显示紧凑的过程行:运行时持续显示当前操作与耗时,展开后可查看并发工具的各项状态、参数和结果;完成后过程行留在原位并折叠。上翻阅读历史时不会强制跳回底部,可用“回到最新”返回。独立的“运行轨迹”保留按轮次分组、调用起止合并及类别筛选,供详细诊断。待办区域显示 SAYA 的原生计划;选择子 Agent 时也可查看其待办。运行轨迹和任务列表按线程标识、标题与颜色区分。
|
|
36
36
|
|
|
37
37
|
输入框左下角的加号提供添加文件、压缩上下文和选择 Skill。当前附件支持 UTF-8 文本文件,由本机服务暂存,并作为当前消息的文件路径引用;文件内容不会在上传时直接发送给模型,图片、PDF 等二进制格式暂不支持。压缩和 Skill 激活作用于所选线程,运行或审批尚未完成时暂不可执行。底部模型与信任控件也只作用于当前线程;新会话创建时采用全局默认模型,之后可随时切换。子 Agent 创建时采用父线程派发时的模型,之后也可单独切换。
|
|
38
38
|
|
|
@@ -19,6 +19,12 @@
|
|
|
19
19
|
box-shadow: 0 3px 12px #17171712;
|
|
20
20
|
color: var(--text);
|
|
21
21
|
}
|
|
22
|
+
.tile[data-status="running"] {
|
|
23
|
+
border-color: var(--agent-color);
|
|
24
|
+
}
|
|
25
|
+
.tile[data-status="stopping"] {
|
|
26
|
+
border-color: var(--warning-border);
|
|
27
|
+
}
|
|
22
28
|
.selectedTile {
|
|
23
29
|
border-color: var(--agent-color);
|
|
24
30
|
box-shadow: 0 0 0 2px #19191922;
|
|
@@ -16,13 +16,17 @@ import shared from "../styles/shared.module.css";
|
|
|
16
16
|
import styles from "./AgentGraph.module.css";
|
|
17
17
|
import { useI18n } from "../i18n";
|
|
18
18
|
|
|
19
|
-
type AgentNode = Node<
|
|
19
|
+
type AgentNode = Node<
|
|
20
|
+
{ title: string; subtitle: string; status: string | null; color: string },
|
|
21
|
+
"agent"
|
|
22
|
+
>;
|
|
20
23
|
|
|
21
24
|
function AgentTile({ data, selected }: NodeProps<AgentNode>) {
|
|
22
25
|
const { t } = useI18n();
|
|
23
26
|
return (
|
|
24
27
|
<div
|
|
25
28
|
className={`${styles.tile} ${selected ? styles.selectedTile : ""}`}
|
|
29
|
+
data-status={data.status ?? undefined}
|
|
26
30
|
style={{ "--agent-color": data.color } as React.CSSProperties}
|
|
27
31
|
>
|
|
28
32
|
<Handle type="target" position={Position.Left} className={styles.handle} />
|
|
@@ -30,10 +34,15 @@ function AgentTile({ data, selected }: NodeProps<AgentNode>) {
|
|
|
30
34
|
<span className={styles.tileContent}>
|
|
31
35
|
<strong>{data.title}</strong>
|
|
32
36
|
<small>
|
|
33
|
-
{data.subtitle}
|
|
37
|
+
{data.subtitle}
|
|
38
|
+
{data.status && ` · ${statusLabel(data.status, t)}`}
|
|
34
39
|
</small>
|
|
35
40
|
</span>
|
|
36
|
-
<span
|
|
41
|
+
<span
|
|
42
|
+
className={shared.statusDot}
|
|
43
|
+
data-status={data.status ?? undefined}
|
|
44
|
+
aria-hidden="true"
|
|
45
|
+
/>
|
|
37
46
|
<Handle type="source" position={Position.Right} className={styles.handle} />
|
|
38
47
|
</div>
|
|
39
48
|
);
|
|
@@ -44,7 +53,7 @@ const nodeTypes = { agent: AgentTile };
|
|
|
44
53
|
interface AgentGraphProps {
|
|
45
54
|
rootThreadId: string;
|
|
46
55
|
tasks: Task[];
|
|
47
|
-
rootStatus: string;
|
|
56
|
+
rootStatus: string | null;
|
|
48
57
|
selectedThreadId: string | null;
|
|
49
58
|
onSelect: (threadId: string) => void;
|
|
50
59
|
}
|
|
@@ -136,12 +136,34 @@
|
|
|
136
136
|
flex: 1;
|
|
137
137
|
min-height: 0;
|
|
138
138
|
}
|
|
139
|
+
.chatPane {
|
|
140
|
+
position: relative;
|
|
141
|
+
width: 100%;
|
|
142
|
+
height: 100%;
|
|
143
|
+
}
|
|
139
144
|
.chatScroll {
|
|
140
145
|
width: 100%;
|
|
141
146
|
height: 100%;
|
|
142
147
|
overflow-y: auto;
|
|
143
148
|
overscroll-behavior: contain;
|
|
144
149
|
}
|
|
150
|
+
.jumpToLatest {
|
|
151
|
+
position: absolute;
|
|
152
|
+
right: 22px;
|
|
153
|
+
bottom: 16px;
|
|
154
|
+
z-index: 2;
|
|
155
|
+
display: inline-flex;
|
|
156
|
+
align-items: center;
|
|
157
|
+
gap: 6px;
|
|
158
|
+
min-height: 32px;
|
|
159
|
+
padding: 5px 10px;
|
|
160
|
+
border: 1px solid var(--text);
|
|
161
|
+
border-radius: 18px;
|
|
162
|
+
background: var(--text);
|
|
163
|
+
color: var(--surface-main);
|
|
164
|
+
box-shadow: 0 2px 8px #00000014;
|
|
165
|
+
font-size: 11px;
|
|
166
|
+
}
|
|
145
167
|
.chatContent {
|
|
146
168
|
width: min(100%, 915px);
|
|
147
169
|
min-height: 100%;
|
|
@@ -225,66 +247,6 @@
|
|
|
225
247
|
border-color: var(--border-strong);
|
|
226
248
|
background: var(--surface-elevated);
|
|
227
249
|
}
|
|
228
|
-
.toolInline {
|
|
229
|
-
margin: 0 0 9px 42px;
|
|
230
|
-
border: 1px solid var(--border);
|
|
231
|
-
border-radius: 8px;
|
|
232
|
-
background: var(--surface-panel);
|
|
233
|
-
}
|
|
234
|
-
.toolInline[data-status="failed"] {
|
|
235
|
-
border-color: var(--danger-border);
|
|
236
|
-
background: var(--danger-surface);
|
|
237
|
-
}
|
|
238
|
-
.toolInline summary {
|
|
239
|
-
display: flex;
|
|
240
|
-
align-items: center;
|
|
241
|
-
gap: 8px;
|
|
242
|
-
min-height: 35px;
|
|
243
|
-
padding: 6px 10px;
|
|
244
|
-
cursor: pointer;
|
|
245
|
-
list-style: none;
|
|
246
|
-
font-size: 12px;
|
|
247
|
-
}
|
|
248
|
-
.toolInline summary::-webkit-details-marker {
|
|
249
|
-
display: none;
|
|
250
|
-
}
|
|
251
|
-
.toolInline summary span {
|
|
252
|
-
color: var(--success);
|
|
253
|
-
}
|
|
254
|
-
.toolInline[data-status="failed"] summary span {
|
|
255
|
-
color: var(--danger);
|
|
256
|
-
}
|
|
257
|
-
.toolInline summary code {
|
|
258
|
-
min-width: 0;
|
|
259
|
-
overflow: hidden;
|
|
260
|
-
color: var(--text-faint);
|
|
261
|
-
font: 11px var(--mono);
|
|
262
|
-
text-overflow: ellipsis;
|
|
263
|
-
white-space: nowrap;
|
|
264
|
-
}
|
|
265
|
-
.toolInline summary svg {
|
|
266
|
-
flex: none;
|
|
267
|
-
margin-left: auto;
|
|
268
|
-
transition: transform 0.15s ease;
|
|
269
|
-
}
|
|
270
|
-
.toolInline details[open] summary svg {
|
|
271
|
-
transform: rotate(90deg);
|
|
272
|
-
}
|
|
273
|
-
.toolDetail {
|
|
274
|
-
padding: 8px 10px;
|
|
275
|
-
border-top: 1px solid var(--border);
|
|
276
|
-
}
|
|
277
|
-
.toolDetail small {
|
|
278
|
-
color: var(--text-muted);
|
|
279
|
-
}
|
|
280
|
-
.toolDetail pre {
|
|
281
|
-
max-height: 280px;
|
|
282
|
-
margin: 5px 0 0;
|
|
283
|
-
overflow: auto;
|
|
284
|
-
white-space: pre-wrap;
|
|
285
|
-
word-break: break-word;
|
|
286
|
-
font: 11px/1.5 var(--mono);
|
|
287
|
-
}
|
|
288
250
|
.inboxMessage {
|
|
289
251
|
padding: 12px;
|
|
290
252
|
background: var(--success-surface);
|
|
@@ -556,6 +518,19 @@
|
|
|
556
518
|
margin-top: 1px;
|
|
557
519
|
color: var(--accent);
|
|
558
520
|
}
|
|
521
|
+
.todoActiveIcon {
|
|
522
|
+
animation: todoSpin 3s linear infinite;
|
|
523
|
+
}
|
|
524
|
+
@keyframes todoSpin {
|
|
525
|
+
to {
|
|
526
|
+
transform: rotate(360deg);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
@media (prefers-reduced-motion: reduce) {
|
|
530
|
+
.todoActiveIcon {
|
|
531
|
+
animation: none !important;
|
|
532
|
+
}
|
|
533
|
+
}
|
|
559
534
|
.composerFrame {
|
|
560
535
|
flex: none;
|
|
561
536
|
width: min(calc(100% - 32px), 820px);
|