@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.
Files changed (164) hide show
  1. package/AGENTS.md +1 -1
  2. package/CHANGELOG.md +23 -5
  3. package/README.md +2 -2
  4. package/dist/application/task-lifecycle/advance.js +12 -0
  5. package/dist/build-stamp.json +3 -3
  6. package/dist/cli/command-definitions.js +7 -0
  7. package/dist/cli/program.js +5 -0
  8. package/dist/cli/update/runtime-activity.js +1 -29
  9. package/dist/commands/dag-follow-up.js +138 -0
  10. package/dist/commands/dag-rerun.js +1 -1
  11. package/dist/commands/init.js +26 -0
  12. package/dist/executors/dag-pi-executor.js +326 -8
  13. package/dist/executors/pi-read-budget-policy.js +166 -0
  14. package/dist/executors/shell-executor.js +26 -30
  15. package/dist/shared/dag-prompt-override.js +4 -5
  16. package/dist/shared/update/npm-client.js +33 -11
  17. package/dist/task/config-types.js +15 -0
  18. package/dist/task/contract/apply.js +11 -1
  19. package/dist/task/contract/constants.js +2 -0
  20. package/dist/task/contract/hash.js +3 -0
  21. package/dist/task/contract/observe.js +25 -4
  22. package/dist/task/contract/paths.js +2 -1
  23. package/dist/task/contract/project.js +15 -1
  24. package/dist/task/contract/schema.js +2 -0
  25. package/dist/task/contract/transaction.js +12 -0
  26. package/dist/task/frontend-project-capability.js +123 -4
  27. package/dist/task/source-prepare/completeness.js +188 -0
  28. package/dist/task/source-prepare/fragment-inventory.js +477 -0
  29. package/dist/task/source-prepare/index.js +3 -0
  30. package/dist/task/source-prepare/ledger-reconciliation.js +127 -0
  31. package/dist/task/source-prepare/ledger-review.js +214 -0
  32. package/dist/task/source-prepare/ledger.js +545 -0
  33. package/dist/task/source-prepare/prepare.js +262 -1
  34. package/dist/task/source-prepare/semantic-intake.js +25 -5
  35. package/dist/task/source-prepare/source-fidelity-pi.js +384 -0
  36. package/dist/task/source-prepare/types.js +22 -0
  37. package/dist/worker/cli.js +12 -26
  38. package/dist/worker/console/console-handoff.js +82 -0
  39. package/dist/worker/console/console-update-and-init.js +115 -0
  40. package/dist/worker/console/console-update-runtime.js +84 -0
  41. package/dist/worker/console/draft-store.js +49 -0
  42. package/dist/worker/console/operation-store.js +1 -1
  43. package/dist/worker/console/operator-actions.js +129 -4
  44. package/dist/worker/console/operator-surface-health.js +1 -0
  45. package/dist/worker/console/prd-intake-bridge.js +13 -0
  46. package/dist/worker/console/routes.js +3 -0
  47. package/dist/worker/console/server.js +73 -5
  48. package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-bPer1waP.js → abnfDiagram-N423BO3Z-D1-Z-BBa.js} +1 -1
  49. package/dist/worker/console/static/assets/{arc-BLdkwucW.js → arc-q8qAYm5m.js} +1 -1
  50. package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-Bw4wo4I1.js → architectureDiagram-T3A2C74G-CAu4_lve.js} +1 -1
  51. package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-DUUkc0gr.js → blockDiagram-VBNYF7ZC-D5GhQvHm.js} +1 -1
  52. package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-BC3O0nob.js → c4Diagram-5PPSVZJV-ClQjeLkO.js} +1 -1
  53. package/dist/worker/console/static/assets/channel-ClAuhSUL.js +1 -0
  54. package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-Dd4g2nti.js → chunk-2GRJ4B5K-DLqWlFbo.js} +1 -1
  55. package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-s2EDm7-n.js → chunk-2Q5K7J3B-DkRT_usL.js} +1 -1
  56. package/dist/worker/console/static/assets/{chunk-5RXB4S5H-GqtHM2yQ.js → chunk-5RXB4S5H-Cqp7Chi3.js} +1 -1
  57. package/dist/worker/console/static/assets/{chunk-5VM5RSS4-BzRFrN8j.js → chunk-5VM5RSS4-CedEdFB9.js} +1 -1
  58. package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-Bw9nFjCJ.js → chunk-6Q2QTUOP-BHM8vP5x.js} +1 -1
  59. package/dist/worker/console/static/assets/{chunk-GF5L2VYU-B4n-03Qm.js → chunk-GF5L2VYU-D7EFr377.js} +1 -1
  60. package/dist/worker/console/static/assets/{chunk-JWPE2WC7-Dt75ZdBD.js → chunk-JWPE2WC7-DR38mTWV.js} +1 -1
  61. package/dist/worker/console/static/assets/{chunk-KBJHAD2P-B_afMhHB.js → chunk-KBJHAD2P-BFv2LsR3.js} +1 -1
  62. package/dist/worker/console/static/assets/{chunk-RYQCIY6F-Bd8Rqqg9.js → chunk-RYQCIY6F-BAvpJS5z.js} +1 -1
  63. package/dist/worker/console/static/assets/{chunk-XXDRQBXY-9boOMji4.js → chunk-XXDRQBXY-eKI9TO72.js} +1 -1
  64. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-cBgeCpVU.js +1 -0
  65. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-cBgeCpVU.js +1 -0
  66. package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-BtCycfCc.js → cose-bilkent-JH36ORCC-BMJXpgo4.js} +1 -1
  67. package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-eTOts9L1.js → cynefin-VYW2F7L2-CKJ2ofZx.js} +1 -1
  68. package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-Cibd2mjg.js → cynefinDiagram-MW4NZA55-CsKnsazm.js} +1 -1
  69. package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-CDjDZtDV.js → dagre-VZM6K2ZE-DVQ46vIw.js} +1 -1
  70. package/dist/worker/console/static/assets/{diagram-7IWD3JNH-Btexn-JJ.js → diagram-7IWD3JNH-D_RuonYS.js} +1 -1
  71. package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-Cyl8sdpM.js → diagram-B4RE2ZJO-D2Mt0nMu.js} +1 -1
  72. package/dist/worker/console/static/assets/{diagram-LBJQPF4R-Ev-83E1t.js → diagram-LBJQPF4R-DjBDuye6.js} +1 -1
  73. package/dist/worker/console/static/assets/{diagram-Q27KOJAE-41LqE0Mc.js → diagram-Q27KOJAE-8VZkqpE_.js} +1 -1
  74. package/dist/worker/console/static/assets/{diagram-UB23O5K3-BC39T5R3.js → diagram-UB23O5K3-D0izYxia.js} +1 -1
  75. package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-DzcNRuri.js → ebnfDiagram-BXEA7PRR-CncG2I95.js} +1 -1
  76. package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-B5Frvvnz.js → erDiagram-JOGREHBK-DiBUUXR8.js} +1 -1
  77. package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-BapxROIM.js → flowDiagram-UKHOOZJN-Dtc0fArb.js} +1 -1
  78. package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-Cd4d4wQ0.js → ganttDiagram-PKOTCBZU-BPNFP5OZ.js} +1 -1
  79. package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-CrL6buFW.js → gitGraphDiagram-DS77QQ5N-CsgpxEEd.js} +1 -1
  80. package/dist/worker/console/static/assets/{index-DBh_x_Ek.js → index-Bai8Z25q.js} +81 -81
  81. package/dist/worker/console/static/assets/index-CH0Tr5hY.css +1 -0
  82. package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-BrSiNxyd.js → infoDiagram-6WML65LV-kHGxkJUS.js} +1 -1
  83. package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-gvlvY-n9.js → ishikawaDiagram-WSZJBQD7-CbLe9wrr.js} +1 -1
  84. package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-D-YaPzRQ.js → journeyDiagram-NVQOT4AX-BOkwxAcP.js} +1 -1
  85. package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-BsmDv9E_.js → kanban-definition-27J2QSJJ-BHYQ2rDu.js} +1 -1
  86. package/dist/worker/console/static/assets/{linear-UWaoDN3h.js → linear-CHT4ujob.js} +1 -1
  87. package/dist/worker/console/static/assets/{mermaid.core-BlvpGVG8.js → mermaid.core-yL8sfqnY.js} +5 -5
  88. package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-CUCIP5CP.js → mindmap-definition-FAOFIHXS-DZx1coV-.js} +1 -1
  89. package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-CB1aQUAK.js → pegDiagram-VL7TDLO6-DStWRCI8.js} +1 -1
  90. package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-BwehHxhf.js → pieDiagram-7S7Q4E2Y-DSKZkwzK.js} +1 -1
  91. package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-CFz30APB.js → quadrantDiagram-CIZ2JOQS-CmoEGOuW.js} +1 -1
  92. package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-BwNmw1i6.js → railroadDiagram-AXF67PYL-BLqzhKyq.js} +1 -1
  93. package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-jg-tPXlI.js → requirementDiagram-LRYGKXZP-gbHeUabM.js} +1 -1
  94. package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-BlyReDKl.js → sankeyDiagram-W5VNT64P-CaKkBCKO.js} +1 -1
  95. package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-DBUzW1f3.js → sequenceDiagram-SI44F4Z6-PUbi3Upu.js} +1 -1
  96. package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-BYcI2RAr.js → sizeCapture-X5ZJPWSS-dm7S9Qfe.js} +1 -1
  97. package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-D7AiyJdo.js → stateDiagram-OKZ733FA-C7WSzv4p.js} +1 -1
  98. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-sQDv5AP3.js +1 -0
  99. package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-BHGt7Kkv.js → swimlanes-SLNWSIFB-CBKCiQwd.js} +2 -2
  100. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-BXwsmcPs.js +8 -0
  101. package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-OPjooWcX.js → timeline-definition-Z64GVDOM-CvnUlylk.js} +1 -1
  102. package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-ggsWDvrO.js → vennDiagram-T6HMQDX7-xM0StY1O.js} +1 -1
  103. package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-DjNe-BjZ.js → wardleyDiagram-T6FBY63Y-CWtJMagy.js} +1 -1
  104. package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-Byp63Hei.js → xychartDiagram-ELKLHX3M-BO_-MeK8.js} +1 -1
  105. package/dist/worker/console/static/index.html +2 -2
  106. package/dist/worker/console/static-src/app/console-types.js +40 -1
  107. package/dist/worker/console/static-src/app/useOperatorActions.js +5 -0
  108. package/dist/worker/console/static-src/app/useTaskWizard.js +73 -1
  109. package/dist/worker/observability/init-runtime-activity.js +26 -0
  110. package/dist/worker/observe/node-input.js +88 -2
  111. package/dist/worker/observe/routes.js +188 -0
  112. package/dist/worker/observe/static/api.js +3 -3
  113. package/dist/worker/observe/static/format.js +37 -0
  114. package/dist/worker/observe/static/index.html +5 -0
  115. package/dist/worker/observe/static/prompt-restart-candidates.d.ts +18 -0
  116. package/dist/worker/observe/static/prompt-restart-candidates.js +36 -0
  117. package/dist/worker/observe/static/state.js +2 -2
  118. package/dist/worker/observe/static/styles.css +331 -35
  119. package/dist/worker/observe/static/views/dag-inspector.js +509 -78
  120. package/dist/worker/observe/static/views/task.js +55 -0
  121. package/dist/workflows/dag/frontend-design-policy.js +19 -9
  122. package/dist/workflows/dag/frontend-implementation-contract.js +117 -50
  123. package/dist/workflows/dag/frontend-plan-render.js +27 -0
  124. package/dist/workflows/dag/frontend-prewrite-gate.js +45 -1
  125. package/dist/workflows/dag/frontend-recovery-controller.js +1 -0
  126. package/dist/workflows/dag/frontend-review-context.js +102 -15
  127. package/dist/workflows/dag/frontend-review-findings.js +42 -10
  128. package/dist/workflows/dag/frontend-shadow-dual-write.js +36 -2
  129. package/dist/workflows/dag/frontend-source-fidelity-ledger.js +108 -0
  130. package/dist/workflows/dag/frontend-worktree-diff.js +154 -0
  131. package/dist/workflows/dag/frontend-writer-admission.js +12 -0
  132. package/dist/workflows/dag/init-hybrid.js +297 -65
  133. package/dist/workflows/dag/interrupt-request.js +7 -0
  134. package/dist/workflows/dag/node-execution.js +111 -1
  135. package/dist/workflows/dag/prompt.js +34 -1
  136. package/dist/workflows/dag/recovery-lease.js +80 -0
  137. package/dist/workflows/dag/rerun-feedback.js +31 -8
  138. package/dist/workflows/dag/rerun-run.js +23 -0
  139. package/dist/workflows/dag/rerun-task.js +29 -0
  140. package/dist/workflows/dag/retry-policy.js +34 -9
  141. package/dist/workflows/dag/runner.js +83 -16
  142. package/dist/workflows/dag/types.js +67 -11
  143. package/docs/README.md +1 -0
  144. package/docs/architecture/evolution.md +45 -0
  145. package/docs/init-surface.manifest.json +4 -0
  146. package/docs/templates/README.md +2 -1
  147. package/docs/templates/frontend-implementation-contract.schema.json +684 -24
  148. package/docs/templates/spec-registry.schema.json +45 -0
  149. package/harness.json +3 -3
  150. package/package.json +1 -1
  151. package/skills/frontend-bounded-implement/SKILL.md +8 -14
  152. package/skills/frontend-design-review/SKILL.md +20 -41
  153. package/skills/frontend-implementation/SKILL.md +2 -3
  154. package/skills/frontend-implementation/references/design-spec.md +4 -3
  155. package/skills/frontend-implementation/references/node-contracts.md +4 -3
  156. package/skills/frontend-review/SKILL.md +22 -14
  157. package/skills/frontend-review/references/review-findings.md +6 -7
  158. package/skills/loop-agent/references/hybrid-dag.md +7 -0
  159. package/dist/worker/console/static/assets/channel-AbFtVnFm.js +0 -1
  160. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-n1yf2Jcv.js +0 -1
  161. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-n1yf2Jcv.js +0 -1
  162. package/dist/worker/console/static/assets/index-DwOGauxU.css +0 -1
  163. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-BBSH5c8m.js +0 -1
  164. 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
- // Experimental internal switch; the browser UI hides the prompt-edit
2241
- // entry unless this reports enabled=true.
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; set ${DAG_RERUN_PROMPT_OVERRIDE_ENV}=1 to enable this experimental capability`);
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; set ${DAG_RERUN_PROMPT_OVERRIDE_ENV}=1 to enable this experimental capability`);
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
- // Experimental prompt-override rerun: only while the internal switch
409
- // is enabled do we hand the inspect page SCOPED mutation
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). Default stays
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-Bw9nFjCJ.js";import{p as f}from"./chunk-JWPE2WC7-Dt75ZdBD.js";import{_ as n,l as o}from"./mermaid.core-BlvpGVG8.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-eTOts9L1.js";import"./index-DBh_x_Ek.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
+ 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-BlvpGVG8.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};
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};