@tea-agent/loop-agent 0.39.0-next.4 → 0.39.0-next.6
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.
- package/CHANGELOG.md +9 -0
- package/dist/build-stamp.json +2 -2
- package/dist/worker/console/harness-pi-model-matrix.js +137 -0
- package/dist/worker/console/operator-actions.js +49 -0
- package/dist/worker/console/pi-readiness.js +7 -1
- package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-DSvF6RXQ.js → abnfDiagram-N423BO3Z-CNPzEh3R.js} +1 -1
- package/dist/worker/console/static/assets/{arc-DuI4ogtJ.js → arc-BDY2Y-xG.js} +1 -1
- package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-DdBbgD4y.js → architectureDiagram-T3A2C74G-NfkWQpnU.js} +1 -1
- package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-xQC2HELm.js → blockDiagram-VBNYF7ZC-KE8pmdGY.js} +1 -1
- package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-DPMSgwIZ.js → c4Diagram-5PPSVZJV-D-CheaMa.js} +1 -1
- package/dist/worker/console/static/assets/channel-CgVmTdib.js +1 -0
- package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-WTEKTxin.js → chunk-2GRJ4B5K-Db2uLs2I.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-B6vZ0Pv_.js → chunk-2Q5K7J3B-Bv9VDtNX.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5RXB4S5H-BrerNAix.js → chunk-5RXB4S5H-CE4aFV_O.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5VM5RSS4-D_ch2aaI.js → chunk-5VM5RSS4-BoUlzoKw.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-VvfacNrq.js → chunk-6Q2QTUOP-Bqn4bPPg.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-GF5L2VYU-B-uGFIg2.js → chunk-GF5L2VYU-ClNxnCSZ.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-JWPE2WC7-BlysCtod.js → chunk-JWPE2WC7-Dibdg_rY.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-KBJHAD2P-BjAUAfcT.js → chunk-KBJHAD2P-BwFyCP8o.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-RYQCIY6F-BeZnBmb-.js → chunk-RYQCIY6F-31vjPu53.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-XXDRQBXY-Bbfe3UJG.js → chunk-XXDRQBXY-CAPr_ybW.js} +1 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-CfJu47mG.js +1 -0
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-CfJu47mG.js +1 -0
- package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-BKJQnYVM.js → cose-bilkent-JH36ORCC-H53opjD2.js} +1 -1
- package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-B1wtI3hU.js → cynefin-VYW2F7L2-DA3X4LYG.js} +1 -1
- package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-DCF6DBSu.js → cynefinDiagram-MW4NZA55-CDeEtk0O.js} +1 -1
- package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-BJyNGRlP.js → dagre-VZM6K2ZE-C_iy9nAa.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-7IWD3JNH-B7j1-VsZ.js → diagram-7IWD3JNH-BSjR3Gvm.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-BREJ140a.js → diagram-B4RE2ZJO-CB_gyKnB.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-LBJQPF4R-CDPHmHGH.js → diagram-LBJQPF4R-Dk9uv1qU.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-Q27KOJAE-BtZLrez1.js → diagram-Q27KOJAE-in2ro3ZT.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-UB23O5K3-mzybu8oU.js → diagram-UB23O5K3-BEI07gDu.js} +1 -1
- package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-Dk3I2uO6.js → ebnfDiagram-BXEA7PRR-BbF5_PGc.js} +1 -1
- package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-BT97u_tQ.js → erDiagram-JOGREHBK-B4uWTa-w.js} +1 -1
- package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-CMOtYzui.js → flowDiagram-UKHOOZJN-DPIyLgKv.js} +1 -1
- package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-DiNydkuY.js → ganttDiagram-PKOTCBZU-CuDKirqJ.js} +1 -1
- package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-Cwt6fLkl.js → gitGraphDiagram-DS77QQ5N-BLlH01Hh.js} +1 -1
- package/dist/worker/console/static/assets/{index-_j0Hzo69.css → index-B25KrZZ6.css} +1 -1
- package/dist/worker/console/static/assets/{index-DQxiso1w.js → index-F4oI1Kcc.js} +53 -53
- package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-AsGIGKKB.js → infoDiagram-6WML65LV-1QctUUzp.js} +1 -1
- package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-BL8ITZh3.js → ishikawaDiagram-WSZJBQD7-BBNAeRyb.js} +1 -1
- package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-VPKAUX8M.js → journeyDiagram-NVQOT4AX-DFAUj-9c.js} +1 -1
- package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-BL56hfGp.js → kanban-definition-27J2QSJJ-O0PrAPYU.js} +1 -1
- package/dist/worker/console/static/assets/{linear-BmSG3nIZ.js → linear-COV8Syym.js} +1 -1
- package/dist/worker/console/static/assets/{mermaid.core-DWGK9kwP.js → mermaid.core-Dudn9krq.js} +5 -5
- package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS--vvKLjo0.js → mindmap-definition-FAOFIHXS-DVQQWMKd.js} +1 -1
- package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-B41mxb2-.js → pegDiagram-VL7TDLO6-B5PU21Bj.js} +1 -1
- package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-DTlu77sw.js → pieDiagram-7S7Q4E2Y-D0SrZrKx.js} +1 -1
- package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-Bk5A7alv.js → quadrantDiagram-CIZ2JOQS-DxZmA3-n.js} +1 -1
- package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-Csf9jzQy.js → railroadDiagram-AXF67PYL-z2bVQOmD.js} +1 -1
- package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-CeptoSNx.js → requirementDiagram-LRYGKXZP-Cw3JACRQ.js} +1 -1
- package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-A-DLCLer.js → sankeyDiagram-W5VNT64P-BrRX95W-.js} +1 -1
- package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-22VbPdOI.js → sequenceDiagram-SI44F4Z6-Dr4lAMIp.js} +1 -1
- package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-DWvAyBC9.js → sizeCapture-X5ZJPWSS-D3nWOJBl.js} +1 -1
- package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-qICZ75yT.js → stateDiagram-OKZ733FA-BRzY1ow8.js} +1 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-IUSBfChT.js +1 -0
- package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-xi7lcMyp.js → swimlanes-SLNWSIFB-C8pcow-m.js} +2 -2
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-uiU-pbpp.js +8 -0
- package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-Bu6Nl6O2.js → timeline-definition-Z64GVDOM-CMdjG3fZ.js} +1 -1
- package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-BzMz4Bn9.js → vennDiagram-T6HMQDX7-o4YAsgix.js} +1 -1
- package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-CxaJnzc5.js → wardleyDiagram-T6FBY63Y-D1DRa0xZ.js} +1 -1
- package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-5JK-omQK.js → xychartDiagram-ELKLHX3M-DWkYcwN2.js} +1 -1
- package/dist/worker/console/static/index.html +2 -2
- package/dist/worker/console/static-src/app/console-types.js +39 -0
- package/dist/workflows/dag/frontend-implementation-contract.js +48 -0
- package/dist/workflows/dag/frontend-plan-render.js +73 -0
- package/dist/workflows/dag/frontend-prewrite-gate.js +97 -3
- package/dist/workflows/dag/init-hybrid.js +35 -11
- package/dist/workflows/dag/types.js +16 -0
- package/docs/templates/frontend-implementation-contract.schema.json +6 -1
- package/package.json +1 -1
- package/skills/frontend-implementation/references/node-contracts.md +2 -1
- package/dist/worker/console/static/assets/channel-DLVz9TYW.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-BeAuGcO9.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-BeAuGcO9.js +0 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-DzKvfHTX.js +0 -1
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-Cxqr_qM1.js +0 -8
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,14 @@
|
|
|
4
4
|
|
|
5
5
|
### 新增
|
|
6
6
|
|
|
7
|
+
- 前端 plan 唯一机器契约化(JSON-only):`frontend-plan-pi` / `frontend-plan-revision-pi` 输出收敛为「一行导语 + 唯一 fenced `json` 契约 + 唯一 `openspec-citations` 引用块」,彻底移除「可选 Markdown 说明」;plan.md(`contracts/frontend-plan.md`)改由 prewrite gate 用纯函数 `renderFrontendPlanMarkdown` 确定性渲染(不新增 DAG 节点/不新增 Pi 调用)
|
|
8
|
+
- 契约 schema 新增 5 个可选字段(`implementationSteps` / `stylingStrategy` / `dependencyPolicy` / `residualRisks` / `realIntegrationGap`),`schemaVersion` 保持 1;`docs/templates/frontend-implementation-contract.schema.json` 同步
|
|
9
|
+
- revision 输出改为 RFC 7386 merge-patch delta + 引用块:gate 配置新增 `revisionPatch`,生效时在 `planFallbackFromNodeIds[0]` 原始契约上应用 `applyFrontendImplementationContractPatch` 后进入既有分析/规范化/物化管线;旧 DAG 缺字段按整契约处理
|
|
10
|
+
- canonical contract 序列化(UTF-8)超过 64KB → `retryable-invalid` + 新增 `contract-too-large` failureCode(体积守卫兜底)
|
|
11
|
+
- `design-review` / `final-design-review` 提示改为消费契约 JSON(注入契约字段摘要),不再要求读取 plan prose
|
|
12
|
+
- Console「模型与认证」页新增模型矩阵编辑器:展示并允许编辑 `harness.json executors.pi` 的 LOW/MED/HIGH 三档模型;输入框从 readiness 结构化投影 `piModelMatrix` 预填(provider/model 或裸 model id),本地内联校验(空串 / `default` 哨兵 / 畸形 `provider/`、`/model`、`a//b`)非法时禁用保存;保存经既有 `POST /api/operator/v1/operations` 派发 `savePiModelMatrix`,复用 HTTP 层 `evaluateMutationGate`(boot capability cookie + `x-loop-console-confirmation` 头 + Origin/Host/Sec-Fetch-Site),读全文档后原子写 tmp+fsync+rename(保留 `$schema` 与其余字段),成功后自动重测 readiness 并对活动 Chat session 触发 `/sessions/:id/reload`(409 `PI_SESSION_BUSY` 给出可恢复提示)
|
|
13
|
+
- `GET /api/operator/v1/readiness` 的 probe 新增 `piModelMatrix` 结构化投影(向后兼容,不改动既有 `modelsMessage`)
|
|
14
|
+
|
|
7
15
|
- `frontend-prewrite-gate` 的 OpenSpec 读取校验支持 `task.json.frontendOpenspec` 配置:`policy` 缺省 `cited`(候选 = `requiredReadPaths` ∪ 任务源显式引用的 openspec 路径),`scan-strict` 保留止血任务后的全量必读语义;`requiredReadPaths` 中非 openspec 支持路径在生成期确定性失败
|
|
8
16
|
- 确定性引用块协议:生效 plan 输出在 fenced `json` 契约块后追加 `openspec-citations` fenced 块(每行一个 JSON `{"path","section","line"}`);gate 解析并与生效 plan/review 节点的成功 read 事件核验,新增 `openspec-citation-block-unparseable` / `openspec-not-cited` / `openspec-citation-not-read` 三个 retryable-invalid failureCode(防捏造、防遗漏)
|
|
9
17
|
- `src/shared/openspec-spec.ts` 新增 `extractTaskSourceOpenspecPaths` 纯函数(反引号内联、markdown 链接目标、裸路径 token → 归一化 → spec 过滤 → 治理子树排除 → 去重排序)
|
|
@@ -11,6 +19,7 @@
|
|
|
11
19
|
|
|
12
20
|
### 文档
|
|
13
21
|
|
|
22
|
+
- 新增 `docs/decisions/0015-frontend-plan-json-only-contract.md`,并同步 `docs/runtime/frontend-implementation-workflow.md`、`docs/templates/frontend-implementation-contract.schema.json`、`skills/frontend-implementation/references/node-contracts.md`
|
|
14
23
|
- 新增 `docs/decisions/0014-openspec-gate-claim-verification.md`,并同步 `docs/runtime/frontend-implementation-workflow.md`、`docs/templates/frontend-task-constraints.md`、`docs/templates/frontend-design-contract.md`、`skills/frontend-implementation/references/node-contracts.md`
|
|
15
24
|
|
|
16
25
|
## [0.36.4-beta.0] - 2026-08-16
|
package/dist/build-stamp.json
CHANGED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* harness.json executors.pi LOW/MED/HIGH 模型矩阵的读写与校验。
|
|
3
|
+
*
|
|
4
|
+
* 该模块只服务于 Console「模型与认证」页的模型矩阵编辑器:
|
|
5
|
+
* - `validatePiModelMatrixTiers`:写入前拒绝空串 / default 哨兵 / 非字符串 /
|
|
6
|
+
* 畸形 provider/model(如 provider/、/model、a//b)。
|
|
7
|
+
* - `readPiModelMatrixProjection`:读全文档并投影三档的 provider/model 或裸
|
|
8
|
+
* model id(供 readiness 结构化投影 piModelMatrix 使用)。
|
|
9
|
+
* - `writePiModelMatrix`:读全文档 → 校验 → 原子写 tmp + fsync + rename,
|
|
10
|
+
* 保留 $schema 与其余所有字段。
|
|
11
|
+
*
|
|
12
|
+
* 本模块在 worker/console(Node 侧),不得被浏览器静态资源直接 import
|
|
13
|
+
* (依赖 node:fs / node:crypto / node:path)。
|
|
14
|
+
*/
|
|
15
|
+
import { randomBytes } from "node:crypto";
|
|
16
|
+
import { open, readFile, rename, writeFile } from "node:fs/promises";
|
|
17
|
+
import path from "node:path";
|
|
18
|
+
import { normalizeExecutorTierValue } from "../../governance/manifest-types.js";
|
|
19
|
+
export const PI_MODEL_TIERS = ["LOW", "MED", "HIGH"];
|
|
20
|
+
/** 校验单档字符串值,返回错误文案;合法返回 undefined。 */
|
|
21
|
+
export function piModelTierValueError(value) {
|
|
22
|
+
if (typeof value !== "string")
|
|
23
|
+
return "模型值必须是字符串";
|
|
24
|
+
if (value.length === 0)
|
|
25
|
+
return "模型值不能为空";
|
|
26
|
+
if (value.trim() !== value)
|
|
27
|
+
return "模型值不能包含首尾空白";
|
|
28
|
+
if (value === "default")
|
|
29
|
+
return "default 是保留哨兵,不能作为模型值";
|
|
30
|
+
// 比 normalizeExecutorTierValue 更严格:拒绝 provider/、/model、a//b。
|
|
31
|
+
if (value.startsWith("/") || value.endsWith("/") || value.includes("//")) {
|
|
32
|
+
return "provider/model 格式非法:不允许 /model、provider/ 或 a//b";
|
|
33
|
+
}
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 写入前校验三档字符串值。任何一档非法即整体拒绝,保证不落盘。
|
|
38
|
+
*/
|
|
39
|
+
export function validatePiModelMatrixTiers(input) {
|
|
40
|
+
if (!input || typeof input !== "object" || Array.isArray(input)) {
|
|
41
|
+
return {
|
|
42
|
+
ok: false,
|
|
43
|
+
code: "INVALID_INPUT",
|
|
44
|
+
message: "模型矩阵必须是 { LOW, MED, HIGH } 对象",
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const record = input;
|
|
48
|
+
const tiers = {};
|
|
49
|
+
for (const tier of PI_MODEL_TIERS) {
|
|
50
|
+
const raw = record[tier];
|
|
51
|
+
const error = piModelTierValueError(raw);
|
|
52
|
+
if (error) {
|
|
53
|
+
return {
|
|
54
|
+
ok: false,
|
|
55
|
+
code: "INVALID_INPUT",
|
|
56
|
+
message: `${tier}: ${error}`,
|
|
57
|
+
tier,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
tiers[tier] = raw;
|
|
61
|
+
}
|
|
62
|
+
return { ok: true, tiers };
|
|
63
|
+
}
|
|
64
|
+
async function readHarnessJson(repoRoot) {
|
|
65
|
+
try {
|
|
66
|
+
const raw = await readFile(path.join(repoRoot, "harness.json"), "utf8");
|
|
67
|
+
const parsed = JSON.parse(raw);
|
|
68
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
return parsed;
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 投影 harness.json executors.pi 三档(provider/model 或裸 model id)。
|
|
79
|
+
* 缺文件 / 非法 JSON / 未配置档位均优雅降级为缺省,绝不抛错。
|
|
80
|
+
*/
|
|
81
|
+
export async function readPiModelMatrixProjection(repoRoot) {
|
|
82
|
+
const manifest = await readHarnessJson(repoRoot);
|
|
83
|
+
const pi = manifest?.executors?.pi;
|
|
84
|
+
const projection = {};
|
|
85
|
+
if (!pi || typeof pi !== "object")
|
|
86
|
+
return projection;
|
|
87
|
+
for (const tier of PI_MODEL_TIERS) {
|
|
88
|
+
const selection = normalizeExecutorTierValue(pi[tier]);
|
|
89
|
+
if (!selection)
|
|
90
|
+
continue;
|
|
91
|
+
projection[tier] = {
|
|
92
|
+
model: selection.model,
|
|
93
|
+
...(selection.provider ? { provider: selection.provider } : {}),
|
|
94
|
+
value: selection.provider
|
|
95
|
+
? `${selection.provider}/${selection.model}`
|
|
96
|
+
: selection.model,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
return projection;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* 原子更新 harness.json executors.pi.LOW/MED/HIGH:
|
|
103
|
+
* 读全文档 → 校验 → 保留其余字段 → 写 tmp + fsync + rename。
|
|
104
|
+
*/
|
|
105
|
+
export async function writePiModelMatrix(repoRoot, tiers) {
|
|
106
|
+
const validation = validatePiModelMatrixTiers(tiers);
|
|
107
|
+
if (!validation.ok) {
|
|
108
|
+
throw Object.assign(new Error(validation.message), {
|
|
109
|
+
code: validation.code,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
const file = path.join(repoRoot, "harness.json");
|
|
113
|
+
const manifest = await readHarnessJson(repoRoot);
|
|
114
|
+
if (!manifest) {
|
|
115
|
+
throw Object.assign(new Error("harness.json 不存在或不是合法 JSON"), {
|
|
116
|
+
code: "HARNESS_NOT_FOUND",
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
const executors = (manifest.executors ?? {});
|
|
120
|
+
const pi = (executors.pi ?? {});
|
|
121
|
+
const nextPi = { ...pi };
|
|
122
|
+
for (const tier of PI_MODEL_TIERS) {
|
|
123
|
+
nextPi[tier] = validation.tiers[tier];
|
|
124
|
+
}
|
|
125
|
+
const nextManifest = { ...manifest, executors: { ...executors, pi: nextPi } };
|
|
126
|
+
const body = `${JSON.stringify(nextManifest, null, 2)}\n`;
|
|
127
|
+
const tmp = path.join(repoRoot, `.harness.${process.pid}.${randomBytes(4).toString("hex")}.tmp`);
|
|
128
|
+
await writeFile(tmp, body, { encoding: "utf8" });
|
|
129
|
+
const handle = await open(tmp, "r+");
|
|
130
|
+
try {
|
|
131
|
+
await handle.sync();
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
await handle.close();
|
|
135
|
+
}
|
|
136
|
+
await rename(tmp, file);
|
|
137
|
+
}
|
|
@@ -11,6 +11,7 @@ import { resolveLatestDagRunIdForTask } from "./resolve-dag-run-for-task.js";
|
|
|
11
11
|
import { repoFingerprintV1 } from "./repo-fingerprint.js";
|
|
12
12
|
import { scheduleOperation, } from "./operation-runner.js";
|
|
13
13
|
import { readinessGateFailure, } from "./pi-readiness.js";
|
|
14
|
+
import { validatePiModelMatrixTiers, writePiModelMatrix, } from "./harness-pi-model-matrix.js";
|
|
14
15
|
import { isAssessmentFreshForDraft } from "./interview/assessment.js";
|
|
15
16
|
import { applyGrillMeAnswer, draftSummary, emptyDraft, isDraftStructurallyComplete, nextGrillMeQuestion, } from "./interview/grill-me.js";
|
|
16
17
|
import { toCanonicalDraftForCli, } from "./draft-store.js";
|
|
@@ -2483,6 +2484,54 @@ export async function dispatchOperatorAction(ctx, req) {
|
|
|
2483
2484
|
}),
|
|
2484
2485
|
};
|
|
2485
2486
|
}
|
|
2487
|
+
case "savePiModelMatrix": {
|
|
2488
|
+
// 「模型与认证」页模型矩阵编辑器:三档字符串值经校验后原子写入
|
|
2489
|
+
// harness.json executors.pi,并自动重测 readiness。写路径本身由 HTTP
|
|
2490
|
+
// 层 evaluateMutationGate 拦截(cookie + confirmation 头 + origin)。
|
|
2491
|
+
const matrixInput = p.matrix ?? p;
|
|
2492
|
+
const validation = validatePiModelMatrixTiers(matrixInput);
|
|
2493
|
+
if (!validation.ok) {
|
|
2494
|
+
return {
|
|
2495
|
+
kind: "error",
|
|
2496
|
+
status: 400,
|
|
2497
|
+
body: operatorFailed({
|
|
2498
|
+
command: action,
|
|
2499
|
+
outcome: "invalid",
|
|
2500
|
+
code: validation.code,
|
|
2501
|
+
message: validation.message,
|
|
2502
|
+
...(validation.tier ? { details: { tier: validation.tier } } : {}),
|
|
2503
|
+
}),
|
|
2504
|
+
};
|
|
2505
|
+
}
|
|
2506
|
+
try {
|
|
2507
|
+
await writePiModelMatrix(ctx.repoRoot, validation.tiers);
|
|
2508
|
+
}
|
|
2509
|
+
catch (error) {
|
|
2510
|
+
return {
|
|
2511
|
+
kind: "error",
|
|
2512
|
+
status: 500,
|
|
2513
|
+
body: operatorFailed({
|
|
2514
|
+
command: action,
|
|
2515
|
+
outcome: "blocked",
|
|
2516
|
+
code: "PI_MODEL_MATRIX_WRITE_FAILED",
|
|
2517
|
+
message: error instanceof Error ? error.message : String(error),
|
|
2518
|
+
}),
|
|
2519
|
+
};
|
|
2520
|
+
}
|
|
2521
|
+
// 保存成功自动重测 readiness(复用 probePiReadiness),让页面立即
|
|
2522
|
+
// 展示新的 modelsAvailable / modelsMessage / piModelMatrix(AC-4)。
|
|
2523
|
+
const report = ctx.refreshReadiness
|
|
2524
|
+
? await ctx.refreshReadiness()
|
|
2525
|
+
: ctx.getReadiness?.() ?? ctx.readiness;
|
|
2526
|
+
return {
|
|
2527
|
+
kind: "sync",
|
|
2528
|
+
status: 200,
|
|
2529
|
+
body: operatorSucceeded("savePiModelMatrix", {
|
|
2530
|
+
tiers: validation.tiers,
|
|
2531
|
+
readiness: report,
|
|
2532
|
+
}),
|
|
2533
|
+
};
|
|
2534
|
+
}
|
|
2486
2535
|
default: {
|
|
2487
2536
|
// M5 official-command coverage uses one generic tail for newly registered
|
|
2488
2537
|
// CLI actions. It remains inside dispatchOperatorAction (the sole dispatch
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { mapSnapshotAvailableModels, resolveHarnessPiExecutorMatrix, } from "./chat/model-resolver.js";
|
|
7
|
+
import { readPiModelMatrixProjection, } from "./harness-pi-model-matrix.js";
|
|
7
8
|
const SETUP_BLOCKED = Object.freeze([
|
|
8
9
|
"newTask",
|
|
9
10
|
"importPrd",
|
|
@@ -238,13 +239,18 @@ export async function discoverPiReadinessProbe(options) {
|
|
|
238
239
|
* override is injected. Tests inject override for determinism.
|
|
239
240
|
*/
|
|
240
241
|
export async function probePiReadiness(options) {
|
|
242
|
+
const repoRoot = options?.repoRoot ?? process.cwd();
|
|
243
|
+
// 模型矩阵投影与 SDK 探测解耦:即使 SDK 不可用 / 测试注入 override,仍要
|
|
244
|
+
// 投影 harness.json 三档值供模型矩阵编辑器预填(AC-1 / AC-4)。
|
|
245
|
+
const piModelMatrix = await readPiModelMatrixProjection(repoRoot);
|
|
241
246
|
if (options?.override) {
|
|
242
|
-
return buildPiReadinessReport(options.override);
|
|
247
|
+
return buildPiReadinessReport({ ...options.override, piModelMatrix });
|
|
243
248
|
}
|
|
244
249
|
try {
|
|
245
250
|
const probe = await discoverPiReadinessProbe({
|
|
246
251
|
repoRoot: options?.repoRoot,
|
|
247
252
|
});
|
|
253
|
+
probe.piModelMatrix = piModelMatrix;
|
|
248
254
|
if (options?.siblingControllerOk && !probe.details) {
|
|
249
255
|
probe.details = {};
|
|
250
256
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{g as p,r as u,d as a}from"./chunk-6Q2QTUOP-
|
|
1
|
+
import{g as p,r as u,d as a}from"./chunk-6Q2QTUOP-Bqn4bPPg.js";import{p as f}from"./chunk-JWPE2WC7-Dibdg_rY.js";import{_ as n,l as o}from"./mermaid.core-Dudn9krq.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-DA3X4LYG.js";import"./index-F4oI1Kcc.js";var v=d().RailroadAbnf.parser.LangiumParser,i=n(e=>{const r=e.alternatives.map(g);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),g=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),l=t?parseInt(t,10):0,m=s?parseInt(s,10):1/0;return{min:l,max:m}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return i(e.element);case"AbnfOptionalGroup":return{type:"optional",element:i(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:i(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=v.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new c(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},B={parser:R,db:a,renderer:u,styles:p};export{B as diagram};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Y as ln,$ as an,a0 as F,a1 as q,a2 as j,a3 as un,a4 as y,a5 as tn,a6 as J,a7 as _,a8 as rn,a9 as o,aa as on,ab as sn,ac as fn}from"./mermaid.core-
|
|
1
|
+
import{Y as ln,$ as an,a0 as F,a1 as q,a2 as j,a3 as un,a4 as y,a5 as tn,a6 as J,a7 as _,a8 as rn,a9 as o,aa as on,ab as sn,ac as fn}from"./mermaid.core-Dudn9krq.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,z,a){var O=I-l,i=D-h,n=z-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function U(l,h,I,D,v,A,z){var a=l-I,O=h-D,i=(z?A:-A)/J(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,B=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*J(on(0,T*T*R-P*P)),Y=(P*g-m*S)/R,$=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=Y-B,e=$-t,r=w-B,C=p-t;return x*x+e*e>r*r+C*C&&(Y=w,$=p),{cx:Y,cy:$,x01:-n,y01:-d,x11:Y*(v/T-1),y11:$*(v/T-1)}}function hn(){var l=cn,h=yn,I=j(0),D=null,v=gn,A=dn,z=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=A.apply(this,arguments)-un,B=rn(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(B>tn-y)a.moveTo(s*F(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*F(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=B,S=B,Y=z.apply(this,arguments)/2,$=Y>y&&(D?+D.apply(this,arguments):J(u*u+s*s)),w=_(rn(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if($>y){var C=sn($/u*q(Y)),K=sn($/s*q(Y));(P-=C*2)>y?(C*=t?1:-1,R+=C,T-=C):(P=0,R=T=(f+c)/2),(S-=K*2)>y?(K*=t?1:-1,m+=K,g-=K):(S=0,m=g=(f+c)/2)}var G=s*F(m),H=s*q(m),L=u*F(T),M=u*q(T);if(w>y){var N=s*F(g),Q=s*q(g),V=u*F(R),W=u*q(R),E;if(B<an)if(E=pn(G,H,V,W,N,Q,L,M)){var X=G-E[0],Z=H-E[1],b=N-E[0],k=Q-E[1],nn=1/q(fn((X*b+Z*k)/(J(X*X+Z*Z)*J(b*b+k*k)))/2),en=J(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=U(V,W,G,H,s,x,t),r=U(N,Q,L,M,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(G,H),a.arc(0,0,s,m,g,!t)):a.moveTo(G,H),!(u>y)||!(P>y)?a.lineTo(L,M):p>y?(e=U(L,M,N,Q,u,-p,t),r=U(G,H,V,W,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-an/2;return[F(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:j(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:j(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:j(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:j(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:j(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:j(+n),i):A},i.padAngle=function(n){return arguments.length?(z=typeof n=="function"?n:j(+n),i):z},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};
|