@tea-agent/loop-agent 0.39.0-beta.7 → 0.39.0-beta.9
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/AGENTS.md +1 -1
- package/CHANGELOG.md +23 -5
- package/README.md +2 -2
- package/dist/application/task-lifecycle/advance.js +12 -0
- package/dist/build-stamp.json +3 -3
- package/dist/cli/command-definitions.js +7 -0
- package/dist/cli/program.js +5 -0
- package/dist/cli/update/runtime-activity.js +1 -29
- package/dist/commands/dag-follow-up.js +138 -0
- package/dist/commands/dag-rerun.js +1 -1
- package/dist/commands/init.js +26 -0
- package/dist/executors/dag-pi-executor.js +326 -8
- package/dist/executors/pi-read-budget-policy.js +166 -0
- package/dist/executors/shell-executor.js +26 -30
- package/dist/shared/dag-prompt-override.js +4 -5
- package/dist/shared/update/npm-client.js +33 -11
- package/dist/task/config-types.js +15 -0
- package/dist/task/contract/apply.js +11 -1
- package/dist/task/contract/constants.js +2 -0
- package/dist/task/contract/hash.js +3 -0
- package/dist/task/contract/observe.js +25 -4
- package/dist/task/contract/paths.js +2 -1
- package/dist/task/contract/project.js +15 -1
- package/dist/task/contract/schema.js +2 -0
- package/dist/task/contract/transaction.js +12 -0
- package/dist/task/frontend-project-capability.js +123 -4
- package/dist/task/source-prepare/completeness.js +188 -0
- package/dist/task/source-prepare/fragment-inventory.js +477 -0
- package/dist/task/source-prepare/index.js +3 -0
- package/dist/task/source-prepare/ledger-reconciliation.js +127 -0
- package/dist/task/source-prepare/ledger-review.js +214 -0
- package/dist/task/source-prepare/ledger.js +545 -0
- package/dist/task/source-prepare/prepare.js +262 -1
- package/dist/task/source-prepare/semantic-intake.js +25 -5
- package/dist/task/source-prepare/source-fidelity-pi.js +384 -0
- package/dist/task/source-prepare/types.js +22 -0
- package/dist/worker/cli.js +12 -26
- package/dist/worker/console/console-handoff.js +82 -0
- package/dist/worker/console/console-update-and-init.js +115 -0
- package/dist/worker/console/console-update-runtime.js +84 -0
- package/dist/worker/console/draft-store.js +49 -0
- package/dist/worker/console/operation-store.js +1 -1
- package/dist/worker/console/operator-actions.js +129 -4
- package/dist/worker/console/operator-surface-health.js +1 -0
- package/dist/worker/console/prd-intake-bridge.js +13 -0
- package/dist/worker/console/routes.js +3 -0
- package/dist/worker/console/server.js +73 -5
- package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-bPer1waP.js → abnfDiagram-N423BO3Z-D1-Z-BBa.js} +1 -1
- package/dist/worker/console/static/assets/{arc-BLdkwucW.js → arc-q8qAYm5m.js} +1 -1
- package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-Bw4wo4I1.js → architectureDiagram-T3A2C74G-CAu4_lve.js} +1 -1
- package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-DUUkc0gr.js → blockDiagram-VBNYF7ZC-D5GhQvHm.js} +1 -1
- package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-BC3O0nob.js → c4Diagram-5PPSVZJV-ClQjeLkO.js} +1 -1
- package/dist/worker/console/static/assets/channel-ClAuhSUL.js +1 -0
- package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-Dd4g2nti.js → chunk-2GRJ4B5K-DLqWlFbo.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-s2EDm7-n.js → chunk-2Q5K7J3B-DkRT_usL.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5RXB4S5H-GqtHM2yQ.js → chunk-5RXB4S5H-Cqp7Chi3.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5VM5RSS4-BzRFrN8j.js → chunk-5VM5RSS4-CedEdFB9.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-Bw9nFjCJ.js → chunk-6Q2QTUOP-BHM8vP5x.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-GF5L2VYU-B4n-03Qm.js → chunk-GF5L2VYU-D7EFr377.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-JWPE2WC7-Dt75ZdBD.js → chunk-JWPE2WC7-DR38mTWV.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-KBJHAD2P-B_afMhHB.js → chunk-KBJHAD2P-BFv2LsR3.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-RYQCIY6F-Bd8Rqqg9.js → chunk-RYQCIY6F-BAvpJS5z.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-XXDRQBXY-9boOMji4.js → chunk-XXDRQBXY-eKI9TO72.js} +1 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-cBgeCpVU.js +1 -0
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-cBgeCpVU.js +1 -0
- package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-BtCycfCc.js → cose-bilkent-JH36ORCC-BMJXpgo4.js} +1 -1
- package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-eTOts9L1.js → cynefin-VYW2F7L2-CKJ2ofZx.js} +1 -1
- package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-Cibd2mjg.js → cynefinDiagram-MW4NZA55-CsKnsazm.js} +1 -1
- package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-CDjDZtDV.js → dagre-VZM6K2ZE-DVQ46vIw.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-7IWD3JNH-Btexn-JJ.js → diagram-7IWD3JNH-D_RuonYS.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-Cyl8sdpM.js → diagram-B4RE2ZJO-D2Mt0nMu.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-LBJQPF4R-Ev-83E1t.js → diagram-LBJQPF4R-DjBDuye6.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-Q27KOJAE-41LqE0Mc.js → diagram-Q27KOJAE-8VZkqpE_.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-UB23O5K3-BC39T5R3.js → diagram-UB23O5K3-D0izYxia.js} +1 -1
- package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-DzcNRuri.js → ebnfDiagram-BXEA7PRR-CncG2I95.js} +1 -1
- package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-B5Frvvnz.js → erDiagram-JOGREHBK-DiBUUXR8.js} +1 -1
- package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-BapxROIM.js → flowDiagram-UKHOOZJN-Dtc0fArb.js} +1 -1
- package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-Cd4d4wQ0.js → ganttDiagram-PKOTCBZU-BPNFP5OZ.js} +1 -1
- package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-CrL6buFW.js → gitGraphDiagram-DS77QQ5N-CsgpxEEd.js} +1 -1
- package/dist/worker/console/static/assets/{index-DBh_x_Ek.js → index-Bai8Z25q.js} +81 -81
- package/dist/worker/console/static/assets/index-CH0Tr5hY.css +1 -0
- package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-BrSiNxyd.js → infoDiagram-6WML65LV-kHGxkJUS.js} +1 -1
- package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-gvlvY-n9.js → ishikawaDiagram-WSZJBQD7-CbLe9wrr.js} +1 -1
- package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-D-YaPzRQ.js → journeyDiagram-NVQOT4AX-BOkwxAcP.js} +1 -1
- package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-BsmDv9E_.js → kanban-definition-27J2QSJJ-BHYQ2rDu.js} +1 -1
- package/dist/worker/console/static/assets/{linear-UWaoDN3h.js → linear-CHT4ujob.js} +1 -1
- package/dist/worker/console/static/assets/{mermaid.core-BlvpGVG8.js → mermaid.core-yL8sfqnY.js} +5 -5
- package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-CUCIP5CP.js → mindmap-definition-FAOFIHXS-DZx1coV-.js} +1 -1
- package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-CB1aQUAK.js → pegDiagram-VL7TDLO6-DStWRCI8.js} +1 -1
- package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-BwehHxhf.js → pieDiagram-7S7Q4E2Y-DSKZkwzK.js} +1 -1
- package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-CFz30APB.js → quadrantDiagram-CIZ2JOQS-CmoEGOuW.js} +1 -1
- package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-BwNmw1i6.js → railroadDiagram-AXF67PYL-BLqzhKyq.js} +1 -1
- package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-jg-tPXlI.js → requirementDiagram-LRYGKXZP-gbHeUabM.js} +1 -1
- package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-BlyReDKl.js → sankeyDiagram-W5VNT64P-CaKkBCKO.js} +1 -1
- package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-DBUzW1f3.js → sequenceDiagram-SI44F4Z6-PUbi3Upu.js} +1 -1
- package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-BYcI2RAr.js → sizeCapture-X5ZJPWSS-dm7S9Qfe.js} +1 -1
- package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-D7AiyJdo.js → stateDiagram-OKZ733FA-C7WSzv4p.js} +1 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-sQDv5AP3.js +1 -0
- package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-BHGt7Kkv.js → swimlanes-SLNWSIFB-CBKCiQwd.js} +2 -2
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-BXwsmcPs.js +8 -0
- package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-OPjooWcX.js → timeline-definition-Z64GVDOM-CvnUlylk.js} +1 -1
- package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-ggsWDvrO.js → vennDiagram-T6HMQDX7-xM0StY1O.js} +1 -1
- package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-DjNe-BjZ.js → wardleyDiagram-T6FBY63Y-CWtJMagy.js} +1 -1
- package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-Byp63Hei.js → xychartDiagram-ELKLHX3M-BO_-MeK8.js} +1 -1
- package/dist/worker/console/static/index.html +2 -2
- package/dist/worker/console/static-src/app/console-types.js +40 -1
- package/dist/worker/console/static-src/app/useOperatorActions.js +5 -0
- package/dist/worker/console/static-src/app/useTaskWizard.js +73 -1
- package/dist/worker/observability/init-runtime-activity.js +26 -0
- package/dist/worker/observe/node-input.js +88 -2
- package/dist/worker/observe/routes.js +188 -0
- package/dist/worker/observe/static/api.js +3 -3
- package/dist/worker/observe/static/format.js +37 -0
- package/dist/worker/observe/static/index.html +5 -0
- package/dist/worker/observe/static/prompt-restart-candidates.d.ts +18 -0
- package/dist/worker/observe/static/prompt-restart-candidates.js +36 -0
- package/dist/worker/observe/static/state.js +2 -2
- package/dist/worker/observe/static/styles.css +331 -35
- package/dist/worker/observe/static/views/dag-inspector.js +509 -78
- package/dist/worker/observe/static/views/task.js +55 -0
- package/dist/workflows/dag/frontend-design-policy.js +19 -9
- package/dist/workflows/dag/frontend-implementation-contract.js +117 -50
- package/dist/workflows/dag/frontend-plan-render.js +27 -0
- package/dist/workflows/dag/frontend-prewrite-gate.js +45 -1
- package/dist/workflows/dag/frontend-recovery-controller.js +1 -0
- package/dist/workflows/dag/frontend-review-context.js +102 -15
- package/dist/workflows/dag/frontend-review-findings.js +42 -10
- package/dist/workflows/dag/frontend-shadow-dual-write.js +36 -2
- package/dist/workflows/dag/frontend-source-fidelity-ledger.js +108 -0
- package/dist/workflows/dag/frontend-worktree-diff.js +154 -0
- package/dist/workflows/dag/frontend-writer-admission.js +12 -0
- package/dist/workflows/dag/init-hybrid.js +297 -65
- package/dist/workflows/dag/interrupt-request.js +7 -0
- package/dist/workflows/dag/node-execution.js +111 -1
- package/dist/workflows/dag/prompt.js +34 -1
- package/dist/workflows/dag/recovery-lease.js +80 -0
- package/dist/workflows/dag/rerun-feedback.js +31 -8
- package/dist/workflows/dag/rerun-run.js +23 -0
- package/dist/workflows/dag/rerun-task.js +29 -0
- package/dist/workflows/dag/retry-policy.js +34 -9
- package/dist/workflows/dag/runner.js +83 -16
- package/dist/workflows/dag/types.js +67 -11
- package/docs/README.md +1 -0
- package/docs/architecture/evolution.md +45 -0
- package/docs/init-surface.manifest.json +4 -0
- package/docs/templates/README.md +2 -1
- package/docs/templates/frontend-implementation-contract.schema.json +684 -24
- package/docs/templates/spec-registry.schema.json +45 -0
- package/harness.json +3 -3
- package/package.json +1 -1
- package/skills/frontend-bounded-implement/SKILL.md +8 -14
- package/skills/frontend-design-review/SKILL.md +20 -41
- package/skills/frontend-implementation/SKILL.md +2 -3
- package/skills/frontend-implementation/references/design-spec.md +4 -3
- package/skills/frontend-implementation/references/node-contracts.md +4 -3
- package/skills/frontend-review/SKILL.md +22 -14
- package/skills/frontend-review/references/review-findings.md +6 -7
- package/skills/loop-agent/references/hybrid-dag.md +7 -0
- package/dist/worker/console/static/assets/channel-AbFtVnFm.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-n1yf2Jcv.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-n1yf2Jcv.js +0 -1
- package/dist/worker/console/static/assets/index-DwOGauxU.css +0 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-BBSH5c8m.js +0 -1
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-D2F7-U4H.js +0 -8
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import { readPackageVersion } from "../../shared/package-metadata.js";
|
|
3
|
+
import { createNpmUpdateClient } from "../../shared/update/npm-client.js";
|
|
4
|
+
import { acquireUpdateLock, updateLockPath } from "../../shared/update/state.js";
|
|
5
|
+
import { readInitRuntimeActivity } from "../observability/init-runtime-activity.js";
|
|
6
|
+
import { performConsoleUpdateAndInit, } from "./console-update-and-init.js";
|
|
7
|
+
import { TERMINAL_OPERATION_STATES } from "./operation-store.js";
|
|
8
|
+
export function createConsoleUpdateExecutor(input) {
|
|
9
|
+
return async (channel) => {
|
|
10
|
+
const currentVersion = readPackageVersion(input.packageRoot);
|
|
11
|
+
if (!currentVersion) {
|
|
12
|
+
return {
|
|
13
|
+
state: "failed",
|
|
14
|
+
errorCode: "PACKAGE_IDENTITY_UNAVAILABLE",
|
|
15
|
+
errorMessage: "Console package version cannot be proven",
|
|
16
|
+
maintenance: {
|
|
17
|
+
package: { status: "failed", channel },
|
|
18
|
+
initialization: { status: "not-run", pendingPaths: [] },
|
|
19
|
+
handoff: { status: "not-needed" },
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const npm = createNpmUpdateClient({
|
|
24
|
+
currentVersion,
|
|
25
|
+
packageRoot: input.packageRoot,
|
|
26
|
+
cwd: input.repoRoot,
|
|
27
|
+
});
|
|
28
|
+
return performConsoleUpdateAndInit({
|
|
29
|
+
currentVersion,
|
|
30
|
+
preflight: async () => {
|
|
31
|
+
const [activity, operations] = await Promise.all([
|
|
32
|
+
readInitRuntimeActivity(input.repoRoot),
|
|
33
|
+
input.operations.list(),
|
|
34
|
+
]);
|
|
35
|
+
if (activity.workerProjectionError ||
|
|
36
|
+
activity.activeDagRunIds.length > 0 ||
|
|
37
|
+
activity.activeWorkerTasks > 0 ||
|
|
38
|
+
activity.activeWorkerBatches > 0) {
|
|
39
|
+
return {
|
|
40
|
+
ok: false,
|
|
41
|
+
code: "ACTIVE_RUNTIME",
|
|
42
|
+
message: "active DAG/Worker runtime exists or cannot be proven inactive",
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
if (input.activeChatTurnCount() > 0) {
|
|
46
|
+
return {
|
|
47
|
+
ok: false,
|
|
48
|
+
code: "CHAT_TURN_ACTIVE",
|
|
49
|
+
message: "an Operator Chat turn is active",
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const liveOtherOperation = operations.some((operation) => operation.action !== "consoleUpdateAndInit" &&
|
|
53
|
+
!TERMINAL_OPERATION_STATES.has(operation.state));
|
|
54
|
+
return liveOtherOperation
|
|
55
|
+
? {
|
|
56
|
+
ok: false,
|
|
57
|
+
code: "OPERATION_ACTIVE",
|
|
58
|
+
message: "another Console operation is active",
|
|
59
|
+
}
|
|
60
|
+
: { ok: true };
|
|
61
|
+
},
|
|
62
|
+
acquireLock: () => acquireUpdateLock(updateLockPath(os.homedir())),
|
|
63
|
+
resolveVersion: (selectedChannel) => npm.distTagVersionCheck(selectedChannel),
|
|
64
|
+
canAutoInstall: () => npm.canAutoInstall(),
|
|
65
|
+
installExact: (version, selectedChannel) => npm.installExact(version, selectedChannel),
|
|
66
|
+
verifyInstalled: (version) => npm.verifyInstalled(version),
|
|
67
|
+
applySafeInit: async () => {
|
|
68
|
+
const result = await input.client.runExternal("loop-agent", ["init", "update", "--apply-safe", "--repo-root", input.repoRoot], {
|
|
69
|
+
cwd: input.repoRoot,
|
|
70
|
+
artifactName: "console-update-safe-init",
|
|
71
|
+
timeoutMs: 120_000,
|
|
72
|
+
});
|
|
73
|
+
return result.ok
|
|
74
|
+
? { ok: true, pendingPaths: [] }
|
|
75
|
+
: {
|
|
76
|
+
ok: false,
|
|
77
|
+
message: result.stderr || result.stdout || "safe initialization failed",
|
|
78
|
+
pendingPaths: [],
|
|
79
|
+
};
|
|
80
|
+
},
|
|
81
|
+
requestHandoff: async ({ targetVersion }) => input.requestHandoff(targetVersion),
|
|
82
|
+
}, channel);
|
|
83
|
+
};
|
|
84
|
+
}
|
|
@@ -1,5 +1,51 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { readJsonIfExists, sha256Json, writeSecureJson, } from "./app-data.js";
|
|
3
|
+
/**
|
|
4
|
+
* 从任意上游载荷安全投影 ledger 摘要(未知形状丢弃,绝不抛错、绝不信任字段外的数据)。
|
|
5
|
+
* 供 DraftStore / prd-intake-bridge 把 prepare/advance 结果中的 ledger 摘要带入草稿。
|
|
6
|
+
*/
|
|
7
|
+
export function summarizeLedgerPayload(value) {
|
|
8
|
+
if (!value || typeof value !== "object")
|
|
9
|
+
return undefined;
|
|
10
|
+
const record = value;
|
|
11
|
+
if (record.present !== true)
|
|
12
|
+
return undefined;
|
|
13
|
+
const num = (key) => {
|
|
14
|
+
const raw = record[key];
|
|
15
|
+
return typeof raw === "number" && Number.isFinite(raw) ? raw : 0;
|
|
16
|
+
};
|
|
17
|
+
const gateRaw = record.gateStatus;
|
|
18
|
+
const gateStatus = gateRaw === "pass" || gateRaw === "fail" || gateRaw === "unknown"
|
|
19
|
+
? gateRaw
|
|
20
|
+
: "unknown";
|
|
21
|
+
const failureCode = typeof record.failureCode === "string" && record.failureCode
|
|
22
|
+
? record.failureCode
|
|
23
|
+
: null;
|
|
24
|
+
const rawExclusions = Array.isArray(record.exclusions) ? record.exclusions : [];
|
|
25
|
+
const exclusions = [];
|
|
26
|
+
for (const item of rawExclusions) {
|
|
27
|
+
if (!item || typeof item !== "object")
|
|
28
|
+
continue;
|
|
29
|
+
const entry = item;
|
|
30
|
+
const fragmentId = typeof entry.fragmentId === "string" ? entry.fragmentId : "";
|
|
31
|
+
const reason = typeof entry.reason === "string" ? entry.reason : "";
|
|
32
|
+
if (!fragmentId)
|
|
33
|
+
continue;
|
|
34
|
+
exclusions.push({ fragmentId, reason });
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
present: true,
|
|
38
|
+
fragmentCount: num("fragmentCount"),
|
|
39
|
+
canonicalRequirementCount: num("canonicalRequirementCount"),
|
|
40
|
+
contextOnlyCount: num("contextOnlyCount"),
|
|
41
|
+
duplicateCount: num("duplicateCount"),
|
|
42
|
+
unresolvedCount: num("unresolvedCount"),
|
|
43
|
+
conflictCount: num("conflictCount"),
|
|
44
|
+
gateStatus,
|
|
45
|
+
failureCode,
|
|
46
|
+
exclusions,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
3
49
|
function draftPath(appData, taskId) {
|
|
4
50
|
const safe = taskId.replace(/[^a-zA-Z0-9._-]+/g, "_");
|
|
5
51
|
return path.join(appData.drafts, `${safe}.json`);
|
|
@@ -86,6 +132,9 @@ export function toCanonicalDraftForCli(draft) {
|
|
|
86
132
|
if (draft.interviewAssessmentRef) {
|
|
87
133
|
canonical.interviewAssessmentRef = draft.interviewAssessmentRef;
|
|
88
134
|
}
|
|
135
|
+
// AC-BLOCK-002:canonical draft JSON 绝不携带 ledgerSummary 字段(strict
|
|
136
|
+
// taskContractDraftSchema 拒绝未知键)。摘要仅留在 prd-intake-bridge 响应与
|
|
137
|
+
// console-types 的 LedgerSummaryView(UI 视图模型),不进入持久化 draft。
|
|
89
138
|
return canonical;
|
|
90
139
|
}
|
|
91
140
|
export class DraftStore {
|
|
@@ -5,7 +5,7 @@ import { buildFrontendHumanDecisionProjection, consumeFrontendHumanDecision, mat
|
|
|
5
5
|
import { buildFrontendSplitAggregateCloseout, computeFrontendSplitDigest, finalizeFrontendSplitAggregate, frontendCommittedFactRefSchema, frontendSplitChildCloseoutFactsSchema, initializeFrontendSplitParent, } from "../../workflows/dag/frontend-split-orchestrator.js";
|
|
6
6
|
import { frontendCloseoutFactsSchema, frontendTestHandoffSchema, } from "../../workflows/dag/frontend-closeout.js";
|
|
7
7
|
import { listJsonFiles, readJsonIfExists, sha256Json, writeSecureJson, } from "./app-data.js";
|
|
8
|
-
export const TERMINAL_OPERATION_STATES = new Set(["succeeded", "failed", "timed-out"]);
|
|
8
|
+
export const TERMINAL_OPERATION_STATES = new Set(["succeeded", "failed", "timed-out", "restarting"]);
|
|
9
9
|
function operationFile(appData, operationId) {
|
|
10
10
|
return path.join(appData.operations, `${operationId}.json`);
|
|
11
11
|
}
|
|
@@ -614,6 +614,106 @@ async function runHumanDecisionAction(action, run) {
|
|
|
614
614
|
return invalid(action, error instanceof Error ? error.message : String(error));
|
|
615
615
|
}
|
|
616
616
|
}
|
|
617
|
+
async function acceptConsoleUpdateAndInit(ctx, clientRequestId, channel) {
|
|
618
|
+
if (!ctx.consoleUpdateExecutor) {
|
|
619
|
+
return {
|
|
620
|
+
kind: "error",
|
|
621
|
+
status: 503,
|
|
622
|
+
body: operatorFailed({
|
|
623
|
+
command: "consoleUpdateAndInit",
|
|
624
|
+
outcome: "blocked",
|
|
625
|
+
code: "CONSOLE_UPDATE_UNAVAILABLE",
|
|
626
|
+
message: "Console update runtime is unavailable",
|
|
627
|
+
}),
|
|
628
|
+
};
|
|
629
|
+
}
|
|
630
|
+
const created = await ctx.operations.create({
|
|
631
|
+
clientRequestId,
|
|
632
|
+
action: "consoleUpdateAndInit",
|
|
633
|
+
actionParams: { channel },
|
|
634
|
+
});
|
|
635
|
+
if (created.kind === "conflict") {
|
|
636
|
+
return {
|
|
637
|
+
kind: "error",
|
|
638
|
+
status: 409,
|
|
639
|
+
body: operatorFailed({
|
|
640
|
+
command: "consoleUpdateAndInit",
|
|
641
|
+
outcome: "conflict",
|
|
642
|
+
code: "REQUEST_ID_REUSE_CONFLICT",
|
|
643
|
+
message: created.message,
|
|
644
|
+
}),
|
|
645
|
+
};
|
|
646
|
+
}
|
|
647
|
+
if (created.kind === "idempotent") {
|
|
648
|
+
return {
|
|
649
|
+
kind: "accepted",
|
|
650
|
+
status: 202,
|
|
651
|
+
body: {
|
|
652
|
+
operationId: created.operation.operationId,
|
|
653
|
+
state: created.operation.state,
|
|
654
|
+
clientRequestId: created.operation.clientRequestId,
|
|
655
|
+
action: created.operation.action,
|
|
656
|
+
},
|
|
657
|
+
};
|
|
658
|
+
}
|
|
659
|
+
queueMicrotask(() => {
|
|
660
|
+
void (async () => {
|
|
661
|
+
const operationId = created.operation.operationId;
|
|
662
|
+
await ctx.operations.update(operationId, {
|
|
663
|
+
state: "running",
|
|
664
|
+
startedAt: new Date().toISOString(),
|
|
665
|
+
});
|
|
666
|
+
ctx.events.append(operationId, {
|
|
667
|
+
at: new Date().toISOString(),
|
|
668
|
+
kind: "state",
|
|
669
|
+
state: "running",
|
|
670
|
+
message: `checking runtime, npm ${channel}, and safe initialization`,
|
|
671
|
+
});
|
|
672
|
+
try {
|
|
673
|
+
const result = await ctx.consoleUpdateExecutor(channel);
|
|
674
|
+
const state = result.state;
|
|
675
|
+
const next = await ctx.operations.update(operationId, {
|
|
676
|
+
state,
|
|
677
|
+
finishedAt: new Date().toISOString(),
|
|
678
|
+
result: result,
|
|
679
|
+
...(result.errorCode ? { errorCode: result.errorCode } : {}),
|
|
680
|
+
...(result.errorMessage ? { errorMessage: result.errorMessage } : {}),
|
|
681
|
+
});
|
|
682
|
+
ctx.events.append(operationId, {
|
|
683
|
+
at: new Date().toISOString(),
|
|
684
|
+
kind: "state",
|
|
685
|
+
state: next.state,
|
|
686
|
+
message: result.errorMessage ?? `console maintenance ${next.state}`,
|
|
687
|
+
});
|
|
688
|
+
}
|
|
689
|
+
catch (error) {
|
|
690
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
691
|
+
const next = await ctx.operations.update(operationId, {
|
|
692
|
+
state: "needs-reconcile",
|
|
693
|
+
finishedAt: new Date().toISOString(),
|
|
694
|
+
errorCode: "CONSOLE_UPDATE_EXCEPTION",
|
|
695
|
+
errorMessage: message,
|
|
696
|
+
});
|
|
697
|
+
ctx.events.append(operationId, {
|
|
698
|
+
at: new Date().toISOString(),
|
|
699
|
+
kind: "error",
|
|
700
|
+
state: next.state,
|
|
701
|
+
message,
|
|
702
|
+
});
|
|
703
|
+
}
|
|
704
|
+
})();
|
|
705
|
+
});
|
|
706
|
+
return {
|
|
707
|
+
kind: "accepted",
|
|
708
|
+
status: 202,
|
|
709
|
+
body: {
|
|
710
|
+
operationId: created.operation.operationId,
|
|
711
|
+
state: created.operation.state,
|
|
712
|
+
clientRequestId: created.operation.clientRequestId,
|
|
713
|
+
action: created.operation.action,
|
|
714
|
+
},
|
|
715
|
+
};
|
|
716
|
+
}
|
|
617
717
|
export async function dispatchOperatorAction(ctx, req) {
|
|
618
718
|
const action = req.action?.trim();
|
|
619
719
|
if (!action) {
|
|
@@ -644,6 +744,31 @@ export async function dispatchOperatorAction(ctx, req) {
|
|
|
644
744
|
};
|
|
645
745
|
}
|
|
646
746
|
const p = paramsOf(req);
|
|
747
|
+
if (action === "consoleUpdateAndInit") {
|
|
748
|
+
if (req.source !== "human-ui") {
|
|
749
|
+
return {
|
|
750
|
+
kind: "error",
|
|
751
|
+
status: 403,
|
|
752
|
+
body: operatorFailed({
|
|
753
|
+
command: action,
|
|
754
|
+
outcome: "blocked",
|
|
755
|
+
code: "HUMAN_UI_REQUIRED",
|
|
756
|
+
message: "consoleUpdateAndInit is available only from the Operate UI",
|
|
757
|
+
}),
|
|
758
|
+
};
|
|
759
|
+
}
|
|
760
|
+
if (!req.clientRequestId?.trim()) {
|
|
761
|
+
return invalid(action, "clientRequestId is required");
|
|
762
|
+
}
|
|
763
|
+
if (Object.keys(p).some((key) => key !== "channel")) {
|
|
764
|
+
return invalid(action, "only channel may be provided");
|
|
765
|
+
}
|
|
766
|
+
const channel = p.channel ?? "latest";
|
|
767
|
+
if (channel !== "latest" && channel !== "next") {
|
|
768
|
+
return invalid(action, "channel must be latest or next");
|
|
769
|
+
}
|
|
770
|
+
return acceptConsoleUpdateAndInit(ctx, req.clientRequestId, channel);
|
|
771
|
+
}
|
|
647
772
|
switch (action) {
|
|
648
773
|
case "operatorCapabilities": {
|
|
649
774
|
const doc = buildOperatorCapabilitiesDocument();
|
|
@@ -2237,8 +2362,8 @@ export async function dispatchOperatorAction(ctx, req) {
|
|
|
2237
2362
|
return accepted;
|
|
2238
2363
|
}
|
|
2239
2364
|
case "dagPromptOverrideConfig": {
|
|
2240
|
-
//
|
|
2241
|
-
//
|
|
2365
|
+
// The prompt-edit entry is visible by default. The internal environment
|
|
2366
|
+
// switch remains an emergency kill switch and is reflected here.
|
|
2242
2367
|
return {
|
|
2243
2368
|
kind: "sync",
|
|
2244
2369
|
status: 200,
|
|
@@ -2260,7 +2385,7 @@ export async function dispatchOperatorAction(ctx, req) {
|
|
|
2260
2385
|
}
|
|
2261
2386
|
if (parsedOverrides.overrides.length > 0 &&
|
|
2262
2387
|
!isDagRerunPromptOverrideEnabled()) {
|
|
2263
|
-
return invalid(action, `prompt override rerun is disabled
|
|
2388
|
+
return invalid(action, `prompt override rerun is disabled by ${DAG_RERUN_PROMPT_OVERRIDE_ENV}; unset it or use a value other than 0, false, or off to enable this experimental capability`);
|
|
2264
2389
|
}
|
|
2265
2390
|
const overrideArgs = parsedOverrides.overrides.length > 0
|
|
2266
2391
|
? await buildPromptOverrideCliArgs(ctx, parsedOverrides.overrides)
|
|
@@ -2293,7 +2418,7 @@ export async function dispatchOperatorAction(ctx, req) {
|
|
|
2293
2418
|
}
|
|
2294
2419
|
if (parsedOverrides.overrides.length > 0 &&
|
|
2295
2420
|
!isDagRerunPromptOverrideEnabled()) {
|
|
2296
|
-
return invalid(action, `prompt override rerun is disabled
|
|
2421
|
+
return invalid(action, `prompt override rerun is disabled by ${DAG_RERUN_PROMPT_OVERRIDE_ENV}; unset it or use a value other than 0, false, or off to enable this experimental capability`);
|
|
2297
2422
|
}
|
|
2298
2423
|
const overrideArgs = parsedOverrides.overrides.length > 0
|
|
2299
2424
|
? await buildPromptOverrideCliArgs(ctx, parsedOverrides.overrides)
|
|
@@ -12,6 +12,7 @@ export function buildOperatorSurfaceHealthV1(input) {
|
|
|
12
12
|
repoName: input.repoRoot.split(/[\\/]/).filter(Boolean).pop() ?? "repository",
|
|
13
13
|
packageName,
|
|
14
14
|
packageVersion,
|
|
15
|
+
consoleInstanceId: input.consoleInstanceId,
|
|
15
16
|
piReadiness: input.piReadiness,
|
|
16
17
|
inspect: {
|
|
17
18
|
ready: input.inspectReady,
|
|
@@ -9,6 +9,7 @@ import { getTaskPaths } from "../../task/runtime.js";
|
|
|
9
9
|
import { SEMANTIC_INTAKE_ARTIFACT_REL, } from "../../task/source-prepare/semantic-intake.js";
|
|
10
10
|
import { extractRequirementFactsFromMarkdown } from "../../task/source-prepare/parse-intent.js";
|
|
11
11
|
import { filterPlaceholderPaths, isNonPlaceholderPath, } from "../../task/source-prepare/placeholder-paths.js";
|
|
12
|
+
import { summarizeLedgerPayload, } from "./draft-store.js";
|
|
12
13
|
import { emptyDraft } from "./interview/grill-me.js";
|
|
13
14
|
import { normalizeConsoleWorkflowKind } from "./workflow-kinds.js";
|
|
14
15
|
function asStringList(value) {
|
|
@@ -219,6 +220,15 @@ export async function buildDraftFromTaskIntake(input) {
|
|
|
219
220
|
const paths = getTaskPaths(input.repoRoot, input.taskId);
|
|
220
221
|
const warnings = warningList(input.advanceJson);
|
|
221
222
|
const lifecycleState = lifecycleFromAdvanceJson(input.advanceJson);
|
|
223
|
+
// Source fidelity ledger 安全摘要透传(AC-009):来自 advance/prepare 结果,
|
|
224
|
+
// 未知形状安全丢弃,绝不携带未截断原文。
|
|
225
|
+
const advanceRoot = input.advanceJson && typeof input.advanceJson === "object"
|
|
226
|
+
? input.advanceJson
|
|
227
|
+
: {};
|
|
228
|
+
const ledgerSummary = summarizeLedgerPayload(advanceRoot.ledgerSummary) ??
|
|
229
|
+
summarizeLedgerPayload(advanceRoot.result && typeof advanceRoot.result === "object"
|
|
230
|
+
? advanceRoot.result.ledgerSummary
|
|
231
|
+
: undefined);
|
|
222
232
|
const semanticApplied = warnings.some((w) => w.code === "SEMANTIC_INTAKE_APPLIED");
|
|
223
233
|
const semanticFailed = warnings.find((w) => w.code === "SEMANTIC_INTAKE_PI_FAILED" ||
|
|
224
234
|
w.code === "SEMANTIC_INTAKE_INVALID_OUTPUT" ||
|
|
@@ -427,11 +437,14 @@ export async function buildDraftFromTaskIntake(input) {
|
|
|
427
437
|
if (input.engineering) {
|
|
428
438
|
draft = applyEngineeringBoundaryToDraft(draft, input.engineering);
|
|
429
439
|
}
|
|
440
|
+
// AC-BLOCK-002:摘要仅经响应返回 UI 视图模型,不写入 draft(防止 strict
|
|
441
|
+
// taskContractDraftSchema 因未知 ledgerSummary 键拒绝 canonical draft)。
|
|
430
442
|
return {
|
|
431
443
|
draft,
|
|
432
444
|
parseStatus,
|
|
433
445
|
semanticIntake,
|
|
434
446
|
gaps,
|
|
447
|
+
...(ledgerSummary ? { ledgerSummary } : {}),
|
|
435
448
|
lifecycleState,
|
|
436
449
|
};
|
|
437
450
|
}
|
|
@@ -67,6 +67,7 @@ export async function handleConsoleHealthRequest(_req, res, ctx) {
|
|
|
67
67
|
piReadiness: ctx.operator?.getReadiness().state ?? "setup-required",
|
|
68
68
|
inspectReady: ctx.inspect.ready,
|
|
69
69
|
routes: ROUTES,
|
|
70
|
+
consoleInstanceId: ctx.consoleInstanceId,
|
|
70
71
|
}));
|
|
71
72
|
}
|
|
72
73
|
catch {
|
|
@@ -77,6 +78,7 @@ export async function handleConsoleHealthRequest(_req, res, ctx) {
|
|
|
77
78
|
repoFingerprint: "unavailable",
|
|
78
79
|
packageName: "unknown",
|
|
79
80
|
packageVersion: "0.0.0",
|
|
81
|
+
consoleInstanceId: ctx.consoleInstanceId,
|
|
80
82
|
piReadiness: ctx.operator?.getReadiness().state ?? "setup-required",
|
|
81
83
|
inspect: {
|
|
82
84
|
ready: ctx.inspect.ready,
|
|
@@ -217,6 +219,7 @@ async function handleCreateOperation(req, res, ctx) {
|
|
|
217
219
|
action,
|
|
218
220
|
actionParams,
|
|
219
221
|
clientRequestId,
|
|
222
|
+
source: "human-ui",
|
|
220
223
|
});
|
|
221
224
|
sendJson(res, result.status, result.body);
|
|
222
225
|
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
2
3
|
import { existsSync } from "node:fs";
|
|
3
4
|
import { rm } from "node:fs/promises";
|
|
4
5
|
import { createServer } from "node:http";
|
|
5
6
|
import path from "node:path";
|
|
6
7
|
import { fileURLToPath } from "node:url";
|
|
7
8
|
import { LoopAgentClient } from "../loop-agent/loop-agent-client.js";
|
|
9
|
+
import { readPackageVersion } from "../../shared/package-metadata.js";
|
|
8
10
|
import { DAG_ABSOLUTE_MAX_WALL_CLOCK_MS } from "../../shared/timeout-policy.js";
|
|
9
11
|
import { openConsoleAppData, sha256Json, writeSecureJson } from "./app-data.js";
|
|
10
12
|
import { DagConfirmationStore } from "./dag-confirmation.js";
|
|
@@ -26,11 +28,13 @@ import { FrontendSplitTaskMaterializer, } from "../materialize/frontend-split-ta
|
|
|
26
28
|
import { probePiReadiness, } from "./pi-readiness.js";
|
|
27
29
|
import { handleConsoleHealthRequest, handleConsoleOperatorRequest, sendJson, serveConsoleStatic, } from "./routes.js";
|
|
28
30
|
import { issueBootCapabilityToken, injectConfirmationTokenScript, } from "./security.js";
|
|
29
|
-
import { resolveSiblingLoopAgentBin } from "./sibling-controller.js";
|
|
31
|
+
import { resolvePackageRootFromConsole, resolveSiblingLoopAgentBin, } from "./sibling-controller.js";
|
|
30
32
|
import { isDagRerunPromptOverrideEnabled } from "../../shared/dag-prompt-override.js";
|
|
31
33
|
import { NightAuxTicker } from "./night-aux-ticker.js";
|
|
32
34
|
import { deriveObserveRouteCapabilities } from "../observe/health.js";
|
|
33
35
|
import { createObserveRouteContext, defaultObserveStaticDir, handleMatchedObserveRoute, matchObserveGetRoute, ROUTES, serveObserveStatic, } from "../observe/routes.js";
|
|
36
|
+
import { createConsoleUpdateExecutor } from "./console-update-runtime.js";
|
|
37
|
+
import { createConsoleHandoff } from "./console-handoff.js";
|
|
34
38
|
/**
|
|
35
39
|
* Default hard timeout for the Console-owned LoopAgentClient.
|
|
36
40
|
*
|
|
@@ -80,6 +84,7 @@ export async function createConsoleServer(options) {
|
|
|
80
84
|
staticDir: inspectStaticDir,
|
|
81
85
|
});
|
|
82
86
|
const operatorSessionId = `sess_${randomBytes(16).toString("hex")}`;
|
|
87
|
+
const consoleInstanceId = options.consoleInstanceId ?? `console_${randomBytes(16).toString("hex")}`;
|
|
83
88
|
const appData = openConsoleAppData({
|
|
84
89
|
repoRoot,
|
|
85
90
|
appDataRoot: options.appDataRoot,
|
|
@@ -261,6 +266,7 @@ export async function createConsoleServer(options) {
|
|
|
261
266
|
refreshReadiness,
|
|
262
267
|
observeBaseUrl: options.observeBaseUrl,
|
|
263
268
|
fetchImpl: options.fetchImpl,
|
|
269
|
+
consoleUpdateExecutor: options.consoleUpdateExecutor,
|
|
264
270
|
getConsoleOrigin: () => `http://${boundHost}:${boundPort}`,
|
|
265
271
|
};
|
|
266
272
|
let boundHost = host;
|
|
@@ -276,6 +282,68 @@ export async function createConsoleServer(options) {
|
|
|
276
282
|
const chatEventEpoch = randomBytes(12).toString("hex");
|
|
277
283
|
const chatEvents = createChatEventStore({ appData, epoch: chatEventEpoch });
|
|
278
284
|
const chatTurnExecutions = createChatTurnExecutionRegistry();
|
|
285
|
+
const requestConsoleHandoff = async (targetVersion) => {
|
|
286
|
+
// The maintenance preflight proves this running Console was loaded from
|
|
287
|
+
// the global package. npm replaces that package in place, so resolve the
|
|
288
|
+
// replacement worker from that same package root rather than trusting the
|
|
289
|
+
// ambient PATH (which could point at another installation).
|
|
290
|
+
const packageRoot = resolvePackageRootFromConsole();
|
|
291
|
+
const agentWorkerBin = path.join(packageRoot, "bin", "agent-worker.js");
|
|
292
|
+
if (readPackageVersion(packageRoot) !== targetVersion ||
|
|
293
|
+
!existsSync(agentWorkerBin)) {
|
|
294
|
+
return {
|
|
295
|
+
ok: false,
|
|
296
|
+
message: "verified global package no longer contains the target Console worker",
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
const { handoff, env } = createConsoleHandoff({
|
|
300
|
+
oldPid: process.pid,
|
|
301
|
+
repoRoot,
|
|
302
|
+
host: boundHost,
|
|
303
|
+
port: boundPort,
|
|
304
|
+
...(options.appDataRoot ? { appDataRoot: options.appDataRoot } : {}),
|
|
305
|
+
targetVersion,
|
|
306
|
+
});
|
|
307
|
+
try {
|
|
308
|
+
const child = spawn(process.execPath, [
|
|
309
|
+
agentWorkerBin,
|
|
310
|
+
"console",
|
|
311
|
+
"--repo",
|
|
312
|
+
repoRoot,
|
|
313
|
+
"--host",
|
|
314
|
+
boundHost,
|
|
315
|
+
"--port",
|
|
316
|
+
String(boundPort),
|
|
317
|
+
...(options.appDataRoot
|
|
318
|
+
? ["--app-data", options.appDataRoot]
|
|
319
|
+
: []),
|
|
320
|
+
"--no-open",
|
|
321
|
+
], { detached: true, stdio: "ignore", env: { ...process.env, ...env } });
|
|
322
|
+
await new Promise((resolve, reject) => {
|
|
323
|
+
child.once("spawn", resolve);
|
|
324
|
+
child.once("error", reject);
|
|
325
|
+
});
|
|
326
|
+
child.unref();
|
|
327
|
+
setTimeout(() => process.kill(process.pid, "SIGTERM"), 100).unref();
|
|
328
|
+
return { ok: true, consoleInstanceId: handoff.consoleInstanceId };
|
|
329
|
+
}
|
|
330
|
+
catch (error) {
|
|
331
|
+
return {
|
|
332
|
+
ok: false,
|
|
333
|
+
message: error instanceof Error ? error.message : String(error),
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
actionContext.consoleUpdateExecutor =
|
|
338
|
+
options.consoleUpdateExecutor ??
|
|
339
|
+
createConsoleUpdateExecutor({
|
|
340
|
+
repoRoot,
|
|
341
|
+
packageRoot: resolvePackageRootFromConsole(),
|
|
342
|
+
client,
|
|
343
|
+
operations,
|
|
344
|
+
activeChatTurnCount: () => chatTurnExecutions.size(),
|
|
345
|
+
requestHandoff: requestConsoleHandoff,
|
|
346
|
+
});
|
|
279
347
|
const chatOperationLinker = createChatOperationLinker({
|
|
280
348
|
chatEvents,
|
|
281
349
|
operations,
|
|
@@ -322,6 +390,7 @@ export async function createConsoleServer(options) {
|
|
|
322
390
|
ready: existsSync(path.join(inspectStaticDir, "index.html")),
|
|
323
391
|
routeCapabilities: deriveObserveRouteCapabilities(ROUTES),
|
|
324
392
|
},
|
|
393
|
+
consoleInstanceId,
|
|
325
394
|
operator: {
|
|
326
395
|
actionContext,
|
|
327
396
|
operations,
|
|
@@ -405,11 +474,10 @@ export async function createConsoleServer(options) {
|
|
|
405
474
|
}
|
|
406
475
|
}
|
|
407
476
|
if (pathname.startsWith("/inspect")) {
|
|
408
|
-
//
|
|
409
|
-
//
|
|
477
|
+
// Prompt-override rerun is enabled by default. Unless the emergency
|
|
478
|
+
// kill switch disables it, hand the inspect page SCOPED mutation
|
|
410
479
|
// credentials (separate cookie + token, only strong enough for
|
|
411
|
-
// INSPECT_MUTATION_ALLOWED_ACTIONS — see routes.ts).
|
|
412
|
-
// strictly read-only: no token, no cookie, no tab.
|
|
480
|
+
// INSPECT_MUTATION_ALLOWED_ACTIONS — see routes.ts).
|
|
413
481
|
const htmlEnhancer = isDagRerunPromptOverrideEnabled()
|
|
414
482
|
? (html) => ({
|
|
415
483
|
content: injectConfirmationTokenScript(html, routeContext.inspectBootToken?.confirmationToken ??
|
|
@@ -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-BHM8vP5x.js";import{p as f}from"./chunk-JWPE2WC7-DR38mTWV.js";import{_ as n,l as o}from"./mermaid.core-yL8sfqnY.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-CKJ2ofZx.js";import"./index-Bai8Z25q.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-yL8sfqnY.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};
|