chore: finalize integrated release baseline
This commit is contained in:
1 parent
fd39347603
commit
d5465e9c0d
36 files changed
+324
-92
No files matched your search
@@ -5,7 +5,7 @@
|
||||
## 服务边界
|
||||
|
||||
- PostgreSQL 是任务、事件、幂等、审计和回查状态的唯一事实源。
|
||||
- 平台账号使用 `admin`(管理员)、`team_lead`(组长)和 `user`(普通用户)三种固定角色登录;服务端会话使用 HttpOnly/Secure/SameSite Cookie。管理员维护账号、角色、状态、密码重置、会话撤销和可执行任务类型;平台不提供组织或租户选择。
|
||||
- 平台账号使用 `admin`(管理员)、`team_lead`(组长)和 `user`(普通用户)三种固定角色登录;服务端会话使用 HttpOnly/Secure/SameSite Cookie。管理员维护账号、角色、状态、密码重置、会话撤销和员工可执行任务类型,但自身不进入任务数据面;平台不提供组织或租户选择。
|
||||
- 登录会话默认跨浏览器重启持续有效,不按空闲时间或绝对时长自动失效;用户退出、修改密码、账号停用或管理员强制撤销时由服务端立即撤销。
|
||||
- 业务页面通过 REST 创建任务;Agent 返回结构化结果后,任务归属人在自己的任务上一次点击“确认并提交到 ERP 插件”,再通过 SSE 或轮询读取服务端状态。普通用户与组长的任务 API、SSE、附件和插件执行权限只覆盖分配给本人的人工任务与 AgentBus 任务;管理员是纯管理面身份,不能创建、查看、修改、领取、接收事件或提交任何业务任务。
|
||||
- 手工与 AgentBus 的每个新任务都会按同一组织、同一 18 项业务路由固化解析策略及配置 revision;来源不能覆盖模式。其中两项名单 route 固定为 `program_only`,其余 16 项可配置 `ai / shadow / auto / program`。全消息中的唯一已登记指令可以确定 route;没有指令时,只有全部标签都属于唯一 route、至少两个不同标签且业务定位必填项完整的字段签名才可确定 route。未知、冲突或多 route 输入不猜测。后续补充轮次沿用原任务快照,设置变化只影响新任务和新会话。
|
||||
|
||||
@@ -73,7 +73,7 @@ export class ParserOrchestrator {
|
||||
|
||||
// Unresolved/legacy traffic and tasks explicitly pinned to AI preserve the
|
||||
// original parser path. This is also the permanent affinity after an Auto
|
||||
// fallback or the one-time administrator AI reparse.
|
||||
// fallback or the legacy one-time task AI reparse.
|
||||
if (!routeId || configuredMode === 'ai' || affinity === 'ai') {
|
||||
const started = performance.now();
|
||||
const aiResult = await this.aiParser.parse(this.aiInput(claim, signal));
|
||||
|
||||
@@ -5924,7 +5924,7 @@ export class TaskService {
|
||||
? failure
|
||||
? `解析失败【${failure.failure_stage}】:${failure.failure_message}`
|
||||
: '解析失败:系统解析未通过,任务已阻断。'
|
||||
: '指令已拆解,等待管理员确认。';
|
||||
: '指令已拆解,等待任务归属人确认。';
|
||||
const outcome = await withTransaction(this.config, async (client) => {
|
||||
const lookup = await client.query(
|
||||
'SELECT * FROM tasks WHERE organization_id = $1 AND task_id = $2 FOR UPDATE',
|
||||
|
||||
@@ -1438,6 +1438,8 @@ test('operator page has a login gate and uses the durable task API', async () =>
|
||||
assert.match(index, /确认并提交到 ERP 插件/);
|
||||
assert.match(app, /const MANUAL_HANDOFF_LABEL = '确认并提交到 ERP 插件'/);
|
||||
assert.match(app, /async function confirmAndSubmitToErpPlugin/);
|
||||
assert.match(taskService, /指令已拆解,等待任务归属人确认/);
|
||||
assert.doesNotMatch(taskService, /指令已拆解,等待管理员确认/);
|
||||
assert.doesNotMatch(app, /textContent = canStart \? '开始执行' : '确认执行'/);
|
||||
assert.match(app, /fetchWithTimeout\('\/api\/auth\/login'/);
|
||||
assert.match(app, /showAuthChecking\(\);[\s\S]*pingAi\(\)\.catch/);
|
||||
|
||||
Reference in new issue
Block a user