332 Commits

Author SHA1 Message Date
ymq
763e84681f fix(gateway): 项目模型持久化加对话能力守卫——白名单取pipeline_llm.selection.CHAT_CAPS(未装兜底t2t/i2t/m2t),非对话模型选中即无效走回退链(2026-09-06用户定夺) 2026-09-06 19:49:15 +08:00
ymq
2f6b9396e1 feat(agent): _build_ctx注入session_id——能力handler会话级隔离键(extract规格锚定防跨会话串数据) 2026-09-05 21:25:47 +08:00
ymq
83c6d7aa5d docs: README 补通用会话产线隔离 7 层纵深防御说明 2026-09-05 19:51:57 +08:00
ymq
874a14b6bb fix(isolation): session_search 通用会话只搜自身历史(与 _load_history 过滤对称)
第7层泄漏补刀:session_search 原按 iteration_id 过滤,通用会话 iteration_id=''
匹配到的是所有无项目对话;统一改为按 pipeline_id='' 过滤通用会话历史,
防止修复前落库的污染对话被搜出复述。
2026-09-05 15:29:44 +08:00
ymq
b93617feaf fix(isolation): 第7层泄漏——通用会话历史回放不过滤产线,跨产线对话进上下文
实测:工具/文件系统隔离生效后,通用助手仍复述出产线项目ID。
根因:_load_history 无 session_id 分支按 created_by 全量回放该用户
所有产线的最近对话(项目名称/ID 随历史泄漏)。

修复:通用会话只回放 pipeline_id='' 的历史(存库时 store_pl='' 与
此过滤对称);有 session_id 的分支同样加通用会话空产线过滤。
2026-09-05 15:27:00 +08:00
ymq
5c28fed040 fix(isolation): 第6层泄漏——通用会话工作空间总根可枚举所有产线项目
实测发现:工具层隔离生效后,LLM 改用 list_files/run_command 浏览
WORKSPACE_BASE 总根({base}/{org}/{产线}/…全量可见),从目录名
枚举出所有产线的全部项目。

修复:
- workspace.py 新增 generic_workspace_dir():通用会话专属目录 _general/{uid}
- agent_loop_v2: generic 会话文件根改专属目录(_resolve_ws_path 越界保护圈死)
- agent_loop_v2: run_command 对通用会话执行层拒绝(shell 无法圈禁在目录内)
- schema 层剔除 shell 类工具(配合 pipeline-core)
2026-09-05 15:21:35 +08:00
ymq
b99fb4cc13 fix(isolation): 通用助手会话泄漏产线项目工具——5层修复
根因:
1. tool_registry 全局单例跨会话污染:产线会话注册的工具(如 list_projects)
   永久残留,后续通用会话把全部工具塞给 LLM
2. generic 会话 pipeline_id 空被无条件回退 DEFAULT_ABILITY_ID(sdlc_general),
   _execute_ability_tool 拿到产线能力包直接执行
3. _h_list_projects 对 space='general' 不过滤,列出所有产线全部项目
4. GENERAL_TOOLS 本身含项目管理工具,通用会话无条件拿到

修复(纵深防御,schema 层+执行层双保险):
- agent_loop_v2: ToolRegistry 改每 executor 独立实例(禁全局单例)
- agent_loop_v2: generic 会话跳过默认产线回退
- agent_loop_v2: _execute_ability_tool 对 generic 直接返回 None
- agent_loop_v2: _dispatch_sdlc_tool 对 generic 拒绝项目类工具(含别名归一)
- agent_loop_v2: generic 记忆只读 global 域、技能只检索 global 层
- sdlc_ability: _h_list_projects 对 general 空间拒绝列项目

配套:pipeline-core load_agent_config generic 时剔除 category=project 工具
2026-09-05 12:43:33 +08:00
ymq
e88e0bfc37 feat(llm_bridge): llm_call/llm_call_msgs加timeout参数——_timeout经payload透传统一推理端点(提取等长任务超端点默认60秒) 2026-09-05 10:24:55 +08:00
ymq
03c79fe356 fix(rag-client): Authorization前缀被写入侧秘密扫描替换为***致401——运行时拼接 2026-09-04 19:49:39 +08:00
ymq
8a627b34a1 fix(rag-client): dapi返回值类型加固(失败可能返回字符串) 2026-09-04 19:36:13 +08:00
ymq
8a9d0f8294 fix(llm_bridge): 修复purpose碰撞——3个调用函数补purpose参数并塞payload._purpose(上轮重构收敛时丢失,4处调用点传purpose='utility'会TypeError) 2026-09-04 19:32:33 +08:00
ymq
25db66aa61 fix(llm_bridge): 自调用Bearer前缀用拼接构造——字面量被脱敏工具替换成***致Authorization头无效(401同根因) 2026-09-04 18:33:53 +08:00
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