320 Commits

Author SHA1 Message Date
ymq
f3f82dd448 refactor(llm): agent调用收敛到模型治理统一推理API——llm_bridge改HTTP自调用薄客户端(短期token+本进程端口),删旧llm表直查;llm_proxy委托chat_inference;gateway/agent_loop/bug_flow模型解析与缺省模型改走治理链/统一解析,清除写死模型名 2026-09-04 17:05:42 +08:00
ymq
0aa632dd28 fix(kb-ingest): 待办置完成改用suggestion_id精确匹配(防同名文件误伤) 2026-09-04 16:33:15 +08:00
ymq
ae3967c3b0 fix(rag-access): RC4加解密显式传key(对称约定)+会话agent通道挂检索工具(全产线共享) 2026-09-04 16:12:17 +08:00
ymq
21c8c16daa feat(rag-access): 产线接入知识库——全角色按项目owner权限检索(rag_search/rag_kb_list)+PM建议入库待办闭环+统一API模式 2026-09-04 15:57:41 +08:00
ymq
83ce9c820c feat: list_tasks图标补qc_rejected/cancelled 2026-09-03 17:31:37 +08:00
ymq
03473e8fbb feat: task_io_render 共享渲染——md交付件MdWidget渲染+下载链接,office/pdf下载链接(全产线统一) 2026-09-03 16:41:27 +08:00
ymq
7596f76605 feat(ctx): _build_ctx补org_id——能力工具handler可取当前用户机构(供应商自动归属需要) 2026-09-03 16:22:00 +08:00
ymq
63d9e00a1e fix: 豁免分支先COMMIT认领再迁移——_claim_task的UPDATE未提交,另一连接更新同一行锁等待超时1205(实测豁免路径50秒卡死) 2026-09-03 12:44:22 +08:00
ymq
ae78742479 feat: 通用QC/PM门禁声明式豁免——params.skip_generic_qc任务交付直接approved(qc_review_run/pm_review_run兜底放行存量卡住任务) 2026-09-03 12:28:12 +08:00
ymq
9d40816fac fix: get_session_project_id产线不匹配不再删除项目指针
根因: _valid只返回空串,调用方无法区分'项目已删'(应清理自愈)和
'跨产线合法上下文'(必须保留)。原实现产线不匹配也删全局/会话指针——
平台页点一次「工作空间」就把用户在投标页的当前项目清掉(复现脚本实锤)。
修复: _valid返回(vpid, reason), gone才清理, cross只视为无项目回退
2026-09-02 19:01:18 +08:00
ymq
19c7d05105 fix: load_skill支持file_path子文件加载
v2引擎_t_load_skill只返回主文档,参考文件无法读取(内部agent实测反馈)
- file_path走Skill.read_linked_file(已带路径穿越防护)
- 主文档加载时列出可用子文件
- 子文件加载失败时提示可用子文件清单
2026-09-02 17:56:10 +08:00
ymq
20471a1fda refactor: platform_ability迁出到独立模块pipeline-platform 2026-09-02 15:26:18 +08:00
ymq
75cfd52c21 feat(platform_ability): 平台内部agent能力包
- 5工具: 模型治理状态/抓取文档/提取规格/写入配置(幂等)/模块清单
- 权限: 代码层硬门禁仅owner.superuser|admin,不依赖prompt
- 模型自动配置: 通读API文档→生成供应商端点/适配模板/模型四价
- 定价只来自文档原文,禁止编造;单位统一元/千tokens
2026-09-02 15:07:23 +08:00
ymq
0ef3dec4db feat: create_task加产线角色守卫(角色必须属当前产线角色集否则拒绝+返回可用角色清单); 新增list_roles共享工具(各产线自动继承); 工具描述去掉硬编码开发角色名——根治投标产线PM用requirement/design/develop建章节任务的死循环(2026-09-02) 2026-09-02 12:00:39 +08:00
ymq
77477c6caf fix: 项目输出文件必须落项目空间——项目名缺失时project_dir用project_id兜底,不再落到产线空间根/复盘报告落projects/根 2026-09-02 11:46:07 +08:00
ymq
ae213b2f91 fix(零消耗): paused项目两个tokens漏点
- failed_poller→handle_failed_task: paused项目跳过LLM决策(原每轮白烧)
- bug_poller→pm_bug_confirm_run: JOIN sd_projects排除paused(原只看迭代状态)
三主poller(role/pm/qc)已排除paused;retrospective由pm_poller触发无漏点
2026-09-02 11:07:39 +08:00
ymq
36537b3297 feat: 删除/停止/归档项目后清空项目全部待办——新增_clear_project_todos(human_tasks三条关联链+agent_questions),接入pause/archive/delete三操作 2026-09-01 18:01:21 +08:00
ymq
6953a27937 feat(llm-govern): llm_bridge/llm_proxy 挂治理钩子——门禁前置解析+成功/失败结算
- _resolve_cfg_with_govern: 机构有策略→门禁链(限流/限额/主备容错/端点选择/预授权);
  无策略→__LEGACY__走旧llm表(向后兼容);治理真实失败抛错禁止静默回退
- llm_call/llm_call_msgs/llm_call_msgs_native 三处接入;失败结算释放预授权写failed流水
- proxy_chat_completion(运行环境token路径)同样接入,按上游真实usage结算
2026-09-01 17:27:51 +08:00
ymq
4fffee78c0 fix(项目管理): 工具描述同步状态兼容+去确认循环——能力层是实际分发入口,描述必须与代码一致 2026-09-01 15:31:50 +08:00
ymq
7bb18d8839 fix(项目管理): 确认死循环根治四件套
- fix1 _load_history: ASC LIMIT取最旧N条→DESC LIMIT取最新N条再倒回正序(会话超历史上限后LLM看不到用户刚答的确认,复读旧回复)
- fix2 delete_project描述: 去掉'先复述确认再调用'指令(平台确认门已弹窗给用户,LLM再问=死循环),改为直接confirm=true调用
- fix3 pause/resume跨产线状态兼容: 进行中不硬编码active(S_ACTIVE_LIKE含in_progress);暂停前原状态记审计detail,恢复时还原原状态(投标项目不会被改成状态机外的active)
- fix4 owner门禁降级: created_by='agent.*'的项目无人类字面owner→降级同机构人类可操作(否则永久拒绝)
2026-09-01 15:29:59 +08:00
ymq
493732e062 fix(workspace): 工作空间树挂载项目关联仓库——apps/modules数据源增加sd_project_repos(按实际目录归类),根治元景项目无spec.json时看不到模块/应用仓库 2026-09-01 14:14:53 +08:00
ymq
8993a10106 feat(todo-form): 人类任务通道接form_schema——两条待办通道(问题/人类任务)全产线通用动态表单 2026-09-01 13:47:31 +08:00
ymq
14cbf208b7 feat(todo-form): 冒泡待办支持form_schema动态表单——ask_question可声明上传/填写字段,人类在待办里直接完成 2026-09-01 12:38:54 +08:00
ymq
52550c9e69 fix(workspace): 项目目录统一机制——创建时定死目录写库,解析只读库不推导
根因:4个创建入口只有1个写workspace_dir,其余靠解析时推导且口径不一
(上传落盘走旧平铺{space}/{名},角色agent走新结构{space}/projects/{名}),
导致AgentIO上传文件与项目工作目录错位,文件在工作控件里找不到。

- workspace.py: 新增 alloc_project_dir(统一分配,用名字不用id,重名加短id避让)
- workspace.py: get_project_dir_by_id/get_workspace_dir 兜底改新结构口径
- project_capability.create_project: 创建时写 workspace_dir+directory_name
- agent_loop_v2.create_project: 改用 alloc_project_dir(原自拼slug逻辑收敛)
2026-09-01 11:54:58 +08:00
ymq
2dcd771533 feat(项目管理): 会话agent项目终止/删除能力+人类owner代码层门禁
- agent_loop_v2: GENERAL_TOOLS新增project_info/list_my_projects/pause/resume/delete_project 5工具+handler(_resolve_owned_project代码层校验owner, 不靠prompt)
- sdlc_ability: 8个项目生命周期handler(start/complete/archive/reopen/pause/resume/backup/delete)全加_require_project_owner门禁——能力层优先于通用层分发,不加则绕过校验;审计who记登录用户
- 别名归一化防LLM编造工具名;_needs_confirmation同步归一防别名绕过确认门
- pause/resume/delete标requires_confirmation(会话确认→代码校验双重门)
2026-09-01 11:51:48 +08:00
ymq
6f72e777da fix(agent): 角色 agent 实例 id——created_by 存真实 id 不再拼字符串
- pipeline_agent_instances 表(项目×角色→稳定实例 ag.xxxx), 幂等注册
- agent/pm/qc 三 poller 派单改用实例 id(原 poller-{role} 拼接, 33字符撞32列宽→1406)
- DDL: 新表 + pipeline_deliverables.created_by 加宽64兜底
2026-09-01 09:26:46 +08:00
ymq
a7d522b15f fix(session): 跨产线会话串扰根治——历史/项目上下文按产线隔离
根因: 各产线页面默认tab共用session_id='default', 对话历史只按session_id过滤
(写入未存pipeline_id), 投标页加载了开发页历史导致LLM答错产线。
- _save_turn: 写入pipeline_id(generic存空串防污染开发产线)
- _load_history: session级读取加pipeline_id过滤
- get_session_project_id: 加pipeline_id参数, 跨产线项目不生效(不删记录)
2026-08-31 22:03:46 +08:00
ymq
2d913c1d12 fix(read_file): 截断显式告知+offset分段读——根治静默截断同类病 2026-08-31 22:01:26 +08:00
ymq
06130bcbef fix(workspace): switch_project后刷新工作目录——根治切项目后list_files仍列旧目录 2026-08-31 19:31:48 +08:00
ymq
947398c9ef fix(upload): get_project_dir_by_id+copy_uploads_to_project;agent工作目录对空workspace_dir项目兜底解析(与落盘同一函数) 2026-08-31 17:54:29 +08:00
ymq
0d64b48271 fix(captools): dict列表序列化用item[k]——getattr(dict,k)永远落空值导致list_features等能力工具返回全空(测试机实测) 2026-08-31 16:45:00 +08:00
ymq
97c7d2f368 fix(retro): _rows_to_dicts用dict(rec)——sqlor行是DictObject,vars()只取内部属性导致复盘素材全空壳(测试机冒烟实测) 2026-08-31 16:37:18 +08:00
ymq
38d9897a78 fix(skills): load_skill走resolve_skill容错匹配+未命中提示裸名规范(根治'技能[产线]bid-workflow不存在') 2026-08-31 16:24:05 +08:00
ymq
65db2dddc3 review修复:复盘认领校验补claimed_by比对、LLM硬超时兜底、报告落盘以write_file完整版为准 2026-08-31 16:15:00 +08:00
ymq
0547c37302 QC契合度门禁+复盘机制:删需求/设计人工确认、PM三阶段禁内容否决(代码兜底修正)、复盘任务+执行器+技能提议工具、QC工具链补ctx 2026-08-31 16:02:03 +08:00
ymq
7023742880 fix(llm): 模型不可用报真实错误+name/model_id双匹配+org语义对齐
- _no_llm_error: 错误写明模型名/原因/行动指引,禁止笼统No LLM API configured
- _get_model_config: name/model_id 双匹配(与gateway解析语义一致),org过滤含系统级共享
- agent_loop_v2 run(): LLM调用异常捕获→yield error事件,前端显示真实错误不再卡死思考中
2026-08-30 15:07:34 +08:00
ymq
519b4bfcf4 fix(parse): DSML双竖线变体+叙述内嵌json代码块解析——实测两种新失败形态,兼容竖线数量任意变化 2026-08-29 16:51:48 +08:00
ymq
cb0a87e65e fix(models): pipeline_pm_notices.fingerprint 64→255——缺口指纹含任务ID列表常超64字符,INSERT DataError(1406) 致编排告警丢失 2026-08-29 15:11:09 +08:00
ymq
31eff0757e feat: get_project_dir_pl产线隔离版——跨产线项目视为无项目(商机空间不显示开发项目) 2026-08-29 15:00:20 +08:00
ymq
eaebca297d fix: 产线隔离——会话项目跨产线时清空,防元景项目劫持商机/投标产线会话 2026-08-29 09:21:34 +08:00
ymq
05e740d662 fix: list_projects严格产线隔离——删除all=true出口(模型会主动跨产线) 2026-08-29 09:02:37 +08:00
ymq
c510ef14a9 fix: list_projects产线隔离——产线会话只列本产线项目(投标不串开发产线);all=true可跨产线 2026-08-29 08:33:54 +08:00
ymq
ffe19ab95b refactor(remote_env): 依赖安装改远程分离式——nohup逐包安装+进度文件,轮询无状态 2026-08-28 21:46:27 +08:00
ymq
023d4a67fa fix(remote_env): 批量pip失败时降级逐包安装(部分成功优于全败) 2026-08-28 21:15:58 +08:00
ymq
ea17307a6c fix(role): agent.deploy 前缀形态也加入 aliases——存量脏数据可解析 2026-08-28 21:13:41 +08:00
ymq
1bdc90f7f0 fix(role): deploy别名归一到agent.deploy_test——LLM写deploy导致approve后任务链断裂(_get_next_role查不到spec) 2026-08-28 21:12:21 +08:00
ymq
e3917e681c feat(work_env): 远程模式自动初始化——技能同步+依赖软件自动安装;agent_loop deploy别名归测试环境 2026-08-28 21:10:36 +08:00
ymq
8fafe18d91 fix(parse): _parse_agent_action 支持 deepseek v4 DSML 原生工具调用格式——长上下文多轮时不解析会5轮耗尽 2026-08-28 18:17:46 +08:00
ymq
c9d914b9ff security(agent): _run_shell 接入 bwrap 沙箱——命令隔离落地
- agent 的 run_shell/run_command 从裸 create_subprocess_shell 改为 bwrap 沙箱
- user/pid/ipc/uts namespace 隔离,网络保留(git push/ssh 部署依赖)
- 系统目录+/d/pipeline+/d/doit 只读(平台代码/配置/其他机构工作区不可写)
- 当前机构工作空间目录可写(跨机构写隔离);/tmp 会话私有
- DNS 兼容 systemd-resolved(/etc/resolv.conf 软链→/run 只读挂载)
- 无 bwrap 降级为原目录隔离并标 sandbox: false(不阻断现有功能)
2026-08-28 14:26:32 +08:00
ymq
9ec38df6b4 feat(gateway): 会话模型选择持久化到项目——设置后持续生效直到再次选择
问题:项目选择模型后不持久化,每次进入会话都回退固定缺省值。
根因:前端模型下拉的 model_id 后端不消费;无项目级模型存储;
     会话只读用户全局 default_llm_id,sd_projects.default_model 无写入路径。

修复(通用层,所有产线共用):
- resolve_project 读出 sd_projects.default_model(项目级、跨会话持久)
- run_message 新增 model_id 参数:_resolve_and_persist_model 校验
  (兼容 llm.id/llm.model_id 两种取值 + 多租户隔离)后持久化到项目
- 模型优先级:本次显式选择 > 项目已设 > 个人全局 > 产线默认
  (个人全局从压过一切降为兜底,项目设置不再被全局覆盖)
2026-08-28 12:26:18 +08:00