@tea-agent/loop-agent 0.44.0-next.7 → 0.44.0-next.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 (147) hide show
  1. package/CHANGELOG.md +100 -0
  2. package/dist/application/evaluation/budget.js +21 -0
  3. package/dist/application/evaluation/corpus-hash.js +10 -15
  4. package/dist/application/evaluation/corpus.js +2 -1
  5. package/dist/application/evaluation/frontend-browser-acceptance.js +77 -0
  6. package/dist/application/evaluation/frontend-corpus-browser-acceptance.js +175 -0
  7. package/dist/application/evaluation/frontend-gateway-evidence.js +226 -0
  8. package/dist/application/evaluation/frontend-pair-registration.js +143 -0
  9. package/dist/application/evaluation/frontend-paired-summary.js +150 -0
  10. package/dist/application/evaluation/frontend-run-observation.js +144 -0
  11. package/dist/application/evaluation/frontend-shared-evidence.js +105 -0
  12. package/dist/application/evaluation/types.js +45 -12
  13. package/dist/application/task-lifecycle/observe.js +26 -1
  14. package/dist/build-stamp.json +3 -3
  15. package/dist/cli/command-definitions.js +11 -0
  16. package/dist/cli/program.js +4 -0
  17. package/dist/commands/task-advance.js +3 -5
  18. package/dist/commands/task-source-prepare.js +13 -1
  19. package/dist/executors/dag-pi/guards.js +4 -0
  20. package/dist/executors/dag-pi/model-config.js +30 -0
  21. package/dist/{workflows/dag/frontend-plan-completeness.js → executors/dag-pi/plan/facts.js} +25 -41
  22. package/dist/executors/dag-pi/plan/ledger-contract.js +55 -0
  23. package/dist/executors/dag-pi/tools/contract-tools.js +515 -0
  24. package/dist/executors/dag-pi/tools/design-terminal-tools.js +166 -0
  25. package/dist/executors/dag-pi/tools/plan-decision-tools.js +519 -0
  26. package/dist/executors/dag-pi/tools/review-terminal-tools.js +166 -0
  27. package/dist/executors/dag-pi/tools/scout-evidence-tools.js +270 -0
  28. package/dist/executors/dag-pi-executor.js +198 -118
  29. package/dist/executors/pi-executor.js +6 -1
  30. package/dist/executors/pi-sdk-executor.js +76 -11
  31. package/dist/executors/shell-executor.js +88 -12
  32. package/dist/infrastructure/console/operation-store.js +2 -0
  33. package/dist/infrastructure/evaluation/corpus-store.js +37 -12
  34. package/dist/shared/operator/capabilities.js +10 -5
  35. package/dist/task/config-types.js +22 -9
  36. package/dist/task/contract/project.js +13 -0
  37. package/dist/task/contract/schema.js +2 -8
  38. package/dist/task/frontend-preflight.js +1 -1
  39. package/dist/task/source-prepare/parse-intent.js +124 -5
  40. package/dist/task/source-prepare/prepare.js +6 -1
  41. package/dist/task/source-prepare/semantic-intake.js +18 -3
  42. package/dist/task/source-prepare/source-execution.js +65 -0
  43. package/dist/task/source-prepare/source-fidelity-pi.js +22 -9
  44. package/dist/task/source-prepare/source-provider-budget.js +290 -0
  45. package/dist/worker/console/operator-actions.js +0 -1
  46. package/dist/worker/console/operator-user-error.js +1 -1
  47. package/dist/worker/console/prd-intake-bridge.js +5 -15
  48. package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-DTuku_-7.js → abnfDiagram-N423BO3Z-r1NAPU_5.js} +1 -1
  49. package/dist/worker/console/static/assets/{arc-CQbCsSqb.js → arc-dT5T4sVL.js} +1 -1
  50. package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-C-xUntTR.js → architectureDiagram-T3A2C74G-CP_cOq46.js} +1 -1
  51. package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-DhNlwGAl.js → blockDiagram-VBNYF7ZC-sToEZxEf.js} +1 -1
  52. package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-B7j3nx8o.js → c4Diagram-5PPSVZJV-DSxwwi2m.js} +1 -1
  53. package/dist/worker/console/static/assets/channel-CyBY_yGk.js +1 -0
  54. package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-BCrcxEh2.js → chunk-2GRJ4B5K-B9fh0IkF.js} +1 -1
  55. package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-CsaePDb3.js → chunk-2Q5K7J3B-CAUNl-A6.js} +1 -1
  56. package/dist/worker/console/static/assets/{chunk-5RXB4S5H--SRQc1rN.js → chunk-5RXB4S5H-BomeqbNX.js} +1 -1
  57. package/dist/worker/console/static/assets/{chunk-5VM5RSS4-C5BFY2Po.js → chunk-5VM5RSS4-BNAuTOLE.js} +1 -1
  58. package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-Caso6uN7.js → chunk-6Q2QTUOP-DfzjRD5y.js} +1 -1
  59. package/dist/worker/console/static/assets/{chunk-GF5L2VYU-AY2ZSAx2.js → chunk-GF5L2VYU-C3uE-yc2.js} +1 -1
  60. package/dist/worker/console/static/assets/{chunk-JWPE2WC7-DiMqZQ_8.js → chunk-JWPE2WC7-C3sQMMYr.js} +1 -1
  61. package/dist/worker/console/static/assets/{chunk-KBJHAD2P-gpvvriOp.js → chunk-KBJHAD2P-D_AtEYQL.js} +1 -1
  62. package/dist/worker/console/static/assets/{chunk-RYQCIY6F-CUdyoJhI.js → chunk-RYQCIY6F-DW4TwhKv.js} +1 -1
  63. package/dist/worker/console/static/assets/{chunk-XXDRQBXY-Bp1xW3T4.js → chunk-XXDRQBXY-CTQDmJcp.js} +1 -1
  64. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-D5lN4E_E.js +1 -0
  65. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-D5lN4E_E.js +1 -0
  66. package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-D-JIcOIT.js → cose-bilkent-JH36ORCC-iMqPuBsL.js} +1 -1
  67. package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-C-NKFflx.js → cynefin-VYW2F7L2-DktIuDWs.js} +1 -1
  68. package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-CSOcvOAA.js → cynefinDiagram-MW4NZA55-BgVnjyEs.js} +1 -1
  69. package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-BQSBltMy.js → dagre-VZM6K2ZE-CR25E4bu.js} +1 -1
  70. package/dist/worker/console/static/assets/{diagram-7IWD3JNH-B0LVC45G.js → diagram-7IWD3JNH-CPM2h5HY.js} +1 -1
  71. package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-Cypg3nqy.js → diagram-B4RE2ZJO-DqF0x2g1.js} +1 -1
  72. package/dist/worker/console/static/assets/{diagram-LBJQPF4R-BBDU88XJ.js → diagram-LBJQPF4R-G8BYp2eb.js} +1 -1
  73. package/dist/worker/console/static/assets/{diagram-Q27KOJAE-BZusLqSb.js → diagram-Q27KOJAE-BbC4kT_D.js} +1 -1
  74. package/dist/worker/console/static/assets/{diagram-UB23O5K3-Cfolotcr.js → diagram-UB23O5K3-CKZwZ-G5.js} +1 -1
  75. package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-CjfyUy0m.js → ebnfDiagram-BXEA7PRR-kJDmheia.js} +1 -1
  76. package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-DJdz7txE.js → erDiagram-JOGREHBK-DFTVHyxB.js} +1 -1
  77. package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-CQqgPO6y.js → flowDiagram-UKHOOZJN-BqdN5_os.js} +1 -1
  78. package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-BOpGfS2m.js → ganttDiagram-PKOTCBZU-SYDjVakh.js} +1 -1
  79. package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-C6UCu0qx.js → gitGraphDiagram-DS77QQ5N-Bf8bNpGA.js} +1 -1
  80. package/dist/worker/console/static/assets/index-B28Onmfy.css +1 -0
  81. package/dist/worker/console/static/assets/{index-DWKejNVJ.js → index-CTMZsDmh.js} +98 -98
  82. package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-BWeaVEUB.js → infoDiagram-6WML65LV-DIeAmJ45.js} +1 -1
  83. package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-C8gmlBbk.js → ishikawaDiagram-WSZJBQD7-oikqUAlo.js} +1 -1
  84. package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-DF3bm8Bp.js → journeyDiagram-NVQOT4AX-mKEF_xYT.js} +1 -1
  85. package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-D2fG2Vxi.js → kanban-definition-27J2QSJJ-BdWJHPnN.js} +1 -1
  86. package/dist/worker/console/static/assets/{linear-BGKgMc2T.js → linear-DGRlieMH.js} +1 -1
  87. package/dist/worker/console/static/assets/{mermaid.core-DF6mMPJ9.js → mermaid.core-4P9yPC9c.js} +5 -5
  88. package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-AMhePheC.js → mindmap-definition-FAOFIHXS-5PTSkos6.js} +1 -1
  89. package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-DN1Cl0W0.js → pegDiagram-VL7TDLO6-DONIFpG5.js} +1 -1
  90. package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-Cx9ngUeN.js → pieDiagram-7S7Q4E2Y-D_Z4S70M.js} +1 -1
  91. package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-BcYPTQJb.js → quadrantDiagram-CIZ2JOQS-CAsjh8iY.js} +1 -1
  92. package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-BqHUZWnH.js → railroadDiagram-AXF67PYL-Cx4Dd6ac.js} +1 -1
  93. package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-CmqWZ0-B.js → requirementDiagram-LRYGKXZP-cQb7mwyH.js} +1 -1
  94. package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P--4YetH1y.js → sankeyDiagram-W5VNT64P-Cd-DhUdf.js} +1 -1
  95. package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-DGD4VMfD.js → sequenceDiagram-SI44F4Z6-AlKYRgIk.js} +1 -1
  96. package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-QVw9q7rh.js → sizeCapture-X5ZJPWSS-CUy_ET4e.js} +1 -1
  97. package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-CuemV9pe.js → stateDiagram-OKZ733FA-CTuVe6Sa.js} +1 -1
  98. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-BsWhs8O7.js +1 -0
  99. package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-C7oKzZKs.js → swimlanes-SLNWSIFB-ChFLJb-v.js} +2 -2
  100. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-CJcioYGH.js +8 -0
  101. package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-C2Of60nT.js → timeline-definition-Z64GVDOM-DZZeiAPr.js} +1 -1
  102. package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-DHtpQHyL.js → vennDiagram-T6HMQDX7-t4O91cZU.js} +1 -1
  103. package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-COi9OhSy.js → wardleyDiagram-T6FBY63Y-CV5qGHZu.js} +1 -1
  104. package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-DPHQfRrt.js → xychartDiagram-ELKLHX3M-DyXbytUI.js} +1 -1
  105. package/dist/worker/console/static/index.html +2 -2
  106. package/dist/workflows/dag/budget-enforcement.js +31 -2
  107. package/dist/workflows/dag/frontend-closeout.js +3 -1
  108. package/dist/workflows/dag/frontend-contract-facts.js +11 -8
  109. package/dist/workflows/dag/frontend-design-policy.js +6 -6
  110. package/dist/workflows/dag/frontend-durable-tools.js +90 -70
  111. package/dist/workflows/dag/frontend-implementation-contract.js +146 -59
  112. package/dist/workflows/dag/frontend-plan-canary.js +66 -16
  113. package/dist/workflows/dag/frontend-plan-decision-contract.js +13 -21
  114. package/dist/workflows/dag/frontend-plan-progress.js +92 -0
  115. package/dist/workflows/dag/frontend-recovery-plan.js +11 -10
  116. package/dist/workflows/dag/frontend-recovery-run.js +51 -46
  117. package/dist/workflows/dag/frontend-repair-assertions.js +36 -0
  118. package/dist/workflows/dag/frontend-review-context.js +29 -1
  119. package/dist/workflows/dag/frontend-review-scopes.js +92 -2
  120. package/dist/workflows/dag/frontend-risk.js +8 -3
  121. package/dist/workflows/dag/frontend-root-observation.js +261 -0
  122. package/dist/workflows/dag/frontend-session-budget.js +52 -39
  123. package/dist/workflows/dag/frontend-session-context.js +10 -0
  124. package/dist/workflows/dag/frontend-test-execution-evidence.js +206 -48
  125. package/dist/workflows/dag/frontend-typed-event-store.js +11 -6
  126. package/dist/workflows/dag/frontend-verification-trace.js +6 -0
  127. package/dist/workflows/dag/frontend-writer-admission.js +2 -1
  128. package/dist/workflows/dag/init-hybrid.js +108 -37
  129. package/dist/workflows/dag/node-execution.js +11 -11
  130. package/dist/workflows/dag/rerun-feedback.js +35 -4
  131. package/dist/workflows/dag/rerun-task.js +62 -67
  132. package/dist/workflows/dag/runner.js +58 -12
  133. package/dist/workflows/dag/types.js +15 -8
  134. package/docs/architecture/runtime-boundaries.md +1 -1
  135. package/docs/templates/backend-test-dag.json +4 -4
  136. package/docs/templates/frontend-implementation-contract.schema.json +31 -11
  137. package/package.json +1 -1
  138. package/skills/frontend-design-review/SKILL.md +8 -11
  139. package/skills/frontend-design-review/references/review-checklist.md +3 -4
  140. package/skills/frontend-review/SKILL.md +5 -1
  141. package/skills/loop-agent/references/command-reference.md +8 -0
  142. package/dist/worker/console/static/assets/channel-5_os7t_x.js +0 -1
  143. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-loz0n18W.js +0 -1
  144. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-loz0n18W.js +0 -1
  145. package/dist/worker/console/static/assets/index-CUT440A8.css +0 -1
  146. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-BdlGdIJw.js +0 -1
  147. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-DjjbHbde.js +0 -8
@@ -0,0 +1,290 @@
1
+ import { completedSourceExecutionSchema } from "./source-execution.js";
2
+ import { currentFrontendSessionIdentity } from "../../workflows/dag/frontend-session-context.js";
3
+ import { sha256OfCanonicalJson } from "../contract/hash.js";
4
+ import { createHash, randomUUID } from "node:crypto";
5
+ import { lstat, mkdir, readdir, rmdir } from "node:fs/promises";
6
+ import path from "node:path";
7
+ import { sourceProviderBudgetSchema as ledgerSchema } from "../../application/evaluation/budget.js";
8
+ import { writeJsonAtomic } from "../../infrastructure/harness/atomic-write.js";
9
+ import { readFileBoundarySafe } from "../../shared/path-safety.js";
10
+ import { getTaskPaths, loadTaskConfig } from "../runtime.js";
11
+ /** Read-only generation snapshot; never create a zero ledger over old receipts. */
12
+ export async function readTaskSourceProviderBudget(input) {
13
+ const root = path.join(getTaskPaths(input.repoRoot, input.taskId).taskDir, "artifacts");
14
+ const file = path.join(root, "source-provider-budget.json");
15
+ const exists = await lstat(file).then(() => true).catch(error => { if (error.code === "ENOENT")
16
+ return false; throw error; });
17
+ if (!exists) {
18
+ const files = await readdir(path.join(root, "session-budget")).catch(error => { if (error.code === "ENOENT")
19
+ return []; throw error; });
20
+ if (files.length || input.expectedBudgetId)
21
+ throw Error("FRONTEND_PROVIDER_BUDGET_INVALID: missing bound source budget");
22
+ return undefined;
23
+ }
24
+ const ledger = ledgerSchema.parse(JSON.parse((await readFileBoundarySafe({ boundaryRoot: root, targetPath: file, label: "source provider budget" })).toString("utf8")));
25
+ validateBinding(input, ledger);
26
+ return ledger;
27
+ }
28
+ function validateBinding(input, ledger) {
29
+ if (ledger.taskId !== input.taskId || ledger.maxProviderRequests !== input.maxProviderRequests || input.expectedBudgetId && ledger.budgetId !== input.expectedBudgetId || input.minimumReservedRequests !== undefined && ledger.reservedRequests < input.minimumReservedRequests)
30
+ throw Error("FRONTEND_PROVIDER_BUDGET_INVALID: source budget binding changed");
31
+ }
32
+ /** The short filesystem critical section spans read, admission and atomic
33
+ * persistence. A stale lock is never stolen on an age heuristic. */
34
+ async function transact(input, reserve) {
35
+ if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(input.taskId) || !Number.isSafeInteger(input.maxProviderRequests) || input.maxProviderRequests < 1)
36
+ throw Error("FRONTEND_PROVIDER_BUDGET_INVALID: invalid source budget identity or limit");
37
+ await loadTaskConfig(input.repoRoot, input.taskId); // never recreate a missing task
38
+ const root = path.join(getTaskPaths(input.repoRoot, input.taskId).taskDir, "artifacts");
39
+ const rootStat = await lstat(root);
40
+ if (!rootStat.isDirectory() || rootStat.isSymbolicLink())
41
+ throw Error("FRONTEND_PROVIDER_BUDGET_INVALID: source artifact directory is not a real directory");
42
+ const file = path.join(root, "source-provider-budget.json");
43
+ const lock = path.join(root, ".source-provider-budget.lock");
44
+ let held = false;
45
+ try {
46
+ for (let attempt = 0; attempt < 100; attempt++) {
47
+ try {
48
+ await mkdir(lock);
49
+ held = true;
50
+ break;
51
+ }
52
+ catch (error) {
53
+ if (error.code !== "EEXIST")
54
+ throw error;
55
+ await new Promise(resolve => setTimeout(resolve, 10));
56
+ }
57
+ }
58
+ if (!held)
59
+ throw Error("FRONTEND_PROVIDER_BUDGET_BUSY: source budget lock unavailable");
60
+ let ledger;
61
+ try {
62
+ await lstat(file);
63
+ ledger = ledgerSchema.parse(JSON.parse((await readFileBoundarySafe({ boundaryRoot: root, targetPath: file, label: "source provider budget" })).toString("utf8")));
64
+ }
65
+ catch (error) {
66
+ if (error.code !== "ENOENT")
67
+ throw Error(`FRONTEND_PROVIDER_BUDGET_INVALID: ${error instanceof Error ? error.message : String(error)}`);
68
+ if (input.expectedBudgetId)
69
+ throw Error("FRONTEND_PROVIDER_BUDGET_INVALID: bound task budget is missing");
70
+ // Existing attempts cannot be silently imported as zero-cost history.
71
+ const previous = await readdir(path.join(root, "session-budget")).catch(error => {
72
+ if (error.code === "ENOENT")
73
+ return [];
74
+ throw error;
75
+ });
76
+ if (previous.length)
77
+ throw Error("FRONTEND_PROVIDER_BUDGET_INVALID: source receipts have no bound budget");
78
+ ledger = { schemaVersion: 1, taskId: input.taskId, budgetId: randomUUID(), maxProviderRequests: input.maxProviderRequests, reservedRequests: 0 };
79
+ }
80
+ validateBinding(input, ledger);
81
+ if (reserve) {
82
+ if (ledger.reservedRequests >= ledger.maxProviderRequests)
83
+ throw Error("FRONTEND_PROVIDER_BUDGET_EXHAUSTED: source request quota reached");
84
+ const identity = currentFrontendSessionIdentity();
85
+ if (identity) {
86
+ if (identity.executionKind !== "model" || identity.taskId && identity.taskId !== input.taskId)
87
+ throw Error("FRONTEND_PROVIDER_BUDGET_INVALID: request belongs to another session/task");
88
+ const key = `${identity.runId ?? "task"}:${identity.sessionId}`;
89
+ const previous = ledger.requestSessions?.[key];
90
+ if (previous && sha256OfCanonicalJson(previous.identity) !== sha256OfCanonicalJson(identity))
91
+ throw Error("FRONTEND_PROVIDER_BUDGET_INVALID: session identity changed");
92
+ ledger.requestSessions ??= {};
93
+ ledger.requestSessions[key] = { identity, reservedRequests: (previous?.reservedRequests ?? 0) + 1 };
94
+ }
95
+ ledger.reservedRequests++;
96
+ }
97
+ // A failed write grants no admission. A successful reservation is never refunded.
98
+ await writeJsonAtomic(file, ledger, { repoRoot: input.repoRoot });
99
+ return ledger;
100
+ }
101
+ finally {
102
+ if (held)
103
+ await rmdir(lock);
104
+ }
105
+ }
106
+ export async function reserveTaskSourceProviderRequest(input) {
107
+ try {
108
+ await transact(input, true);
109
+ }
110
+ catch (error) {
111
+ const message = error instanceof Error ? error.message : String(error);
112
+ throw Error(message.startsWith("FRONTEND_PROVIDER_") ? message : `FRONTEND_PROVIDER_BUDGET_PERSIST_FAILED: ${message}`);
113
+ }
114
+ }
115
+ /** Initialize before the adapter writes its first incomplete session receipt. */
116
+ export async function openTaskSourceProviderBudget(input) {
117
+ await transact(input, false);
118
+ return () => reserveTaskSourceProviderRequest(input);
119
+ }
120
+ /** Check the closed set of source sessions registered by durable admission.
121
+ * Receipt copies deduplicate only when their contents are identical. */
122
+ export function summarizeBoundSourceUsage(ledger, receipts) {
123
+ ledgerSchema.parse(ledger);
124
+ const diagnostics = [];
125
+ const sessions = Object.values(ledger.requestSessions ?? {});
126
+ const sources = sessions.filter(session => session.identity.runId === null);
127
+ const unattributedRequests = ledger.reservedRequests - sessions.reduce((sum, session) => sum + session.reservedRequests, 0);
128
+ if (unattributedRequests)
129
+ diagnostics.push("unattributed-task-requests");
130
+ const byId = new Map();
131
+ for (const receipt of receipts) {
132
+ if (receipt.identity.runId !== null)
133
+ continue;
134
+ const key = receipt.identity.sessionId;
135
+ const previous = byId.get(key);
136
+ if (previous && sha256OfCanonicalJson(previous) !== sha256OfCanonicalJson(receipt))
137
+ diagnostics.push(`conflicting-source-receipt:${key}`);
138
+ byId.set(key, receipt);
139
+ if (!sources.some(session => session.identity.sessionId === key))
140
+ diagnostics.push(`unbound-source-receipt:${key}`);
141
+ }
142
+ let totalTokens = 0;
143
+ for (const session of sources) {
144
+ const receipt = byId.get(session.identity.sessionId);
145
+ if (!receipt || session.identity.taskId !== ledger.taskId || !session.identity.sourceDigest || sha256OfCanonicalJson(session.identity) !== sha256OfCanonicalJson(receipt.identity)) {
146
+ diagnostics.push(`source-session-binding:${session.identity.sessionId}`);
147
+ continue;
148
+ }
149
+ if (receipt.completion !== "complete" || !receipt.terminal || receipt.actual.requestCount !== session.reservedRequests)
150
+ diagnostics.push(`source-session-incomplete:${session.identity.sessionId}`);
151
+ const tokens = receipt.actual.totalTokens;
152
+ if (tokens === null || !Number.isFinite(tokens) || tokens < 0)
153
+ diagnostics.push(`source-tokens-unknown:${session.identity.sessionId}`);
154
+ else
155
+ totalTokens += tokens;
156
+ if (receipt.attempts.length && (receipt.attempts.some(attempt => attempt.completion !== "complete" || attempt.actual?.requestCount == null || attempt.actual?.totalTokens == null) || receipt.attempts.reduce((sum, attempt) => sum + (attempt.actual?.requestCount ?? 0), 0) !== session.reservedRequests || receipt.attempts.reduce((sum, attempt) => sum + (attempt.actual?.totalTokens ?? 0), 0) !== tokens))
157
+ diagnostics.push(`source-attempt-usage-mismatch:${session.identity.sessionId}`);
158
+ }
159
+ return { complete: diagnostics.length === 0, diagnostics, sourceSessions: sources.length, sourceRequests: sources.reduce((sum, session) => sum + session.reservedRequests, 0), unattributedRequests, totalTokens: diagnostics.length ? null : totalTokens };
160
+ }
161
+ const receiptHash = (bytes) => createHash("sha256").update(bytes).digest("hex");
162
+ /** Freeze actual bytes, not a caller-supplied token total. Concurrent changes
163
+ * remain diagnostic evidence rather than a cheaper snapshot. */
164
+ export async function freezeTaskSourceUsage(input, ledger) {
165
+ const root = path.join(getTaskPaths(input.repoRoot, input.taskId).taskDir, "artifacts");
166
+ const evidence = { receipts: [], executions: [], diagnostics: [] };
167
+ try {
168
+ const files = await readdir(path.join(root, "session-budget")).catch(error => { if (error.code === "ENOENT")
169
+ return []; throw error; });
170
+ for (const name of files.sort()) {
171
+ const relative = `session-budget/${name}`;
172
+ const bytes = await readFileBoundarySafe({ boundaryRoot: root, targetPath: path.join(root, relative), label: "source usage receipt" });
173
+ evidence.receipts.push({ path: relative, sha256: receiptHash(bytes), content: bytes.toString("utf8") });
174
+ }
175
+ const executionIds = new Set(Object.values(ledger.requestSessions ?? {}).filter(row => row.identity.runId === null).map(row => row.identity.sourceExecutionId).filter((id) => !!id));
176
+ for (const id of [...executionIds].sort()) {
177
+ const relative = `source-executions/${id}.json`;
178
+ const bytes = await readFileBoundarySafe({ boundaryRoot: root, targetPath: path.join(root, relative), label: "source execution" });
179
+ evidence.executions.push({ path: relative, sha256: receiptHash(bytes), content: bytes.toString("utf8") });
180
+ }
181
+ for (const ref of [...evidence.receipts, ...evidence.executions]) {
182
+ const bytes = await readFileBoundarySafe({ boundaryRoot: root, targetPath: path.join(root, ref.path), label: "source usage receipt" });
183
+ if (receiptHash(bytes) !== ref.sha256)
184
+ throw Error("source-receipt-changed-during-freeze");
185
+ }
186
+ const after = await readTaskSourceProviderBudget(input);
187
+ if (sha256OfCanonicalJson(after ?? null) !== sha256OfCanonicalJson(ledger))
188
+ throw Error("source-ledger-changed-during-freeze");
189
+ }
190
+ catch (error) {
191
+ evidence.diagnostics.push(error instanceof Error ? error.message : String(error));
192
+ }
193
+ return evidence;
194
+ }
195
+ export function summarizeFrozenSourceUsage(binding) {
196
+ const diagnostics = [...(binding.evidence?.diagnostics ?? [])];
197
+ const receipts = [];
198
+ if (!binding.evidence)
199
+ diagnostics.push("missing-frozen-source-evidence");
200
+ for (const ref of binding.evidence?.receipts ?? []) {
201
+ try {
202
+ if (!/^session-budget\/[^/\\]+\.json$/.test(ref.path) || receiptHash(ref.content) !== ref.sha256)
203
+ throw Error("source-receipt-hash-or-path");
204
+ const receipt = JSON.parse(ref.content);
205
+ if (receipt.schemaVersion !== 2 || receipt.policyVersion !== "frontend-session-observation-v2" || !receipt.identity || receipt.identity.runId !== null || !receipt.actual || !Array.isArray(receipt.attempts) || !Number.isFinite(Date.parse(receipt.startedAt)) || !receipt.finishedAt || Date.parse(receipt.finishedAt) < Date.parse(receipt.startedAt) || !Number.isFinite(Date.parse(receipt.finishedAt)))
206
+ throw Error("invalid-source-receipt");
207
+ receipts.push(receipt);
208
+ }
209
+ catch {
210
+ diagnostics.push(`invalid-frozen-source-receipt:${ref.path}`);
211
+ }
212
+ }
213
+ const executions = new Map();
214
+ const required = new Set(Object.values(binding.ledger.requestSessions ?? {}).filter(row => row.identity.runId === null).map(row => row.identity.sourceExecutionId).filter((id) => !!id));
215
+ for (const ref of binding.evidence?.executions ?? []) {
216
+ try {
217
+ if (receiptHash(ref.content) !== ref.sha256)
218
+ throw Error("execution hash");
219
+ const execution = completedSourceExecutionSchema.parse(JSON.parse(ref.content));
220
+ if (ref.path !== `source-executions/${execution.executionId}.json` || execution.taskId !== binding.ledger.taskId || !required.has(execution.executionId) || executions.has(execution.executionId))
221
+ throw Error("execution identity");
222
+ executions.set(execution.executionId, execution);
223
+ }
224
+ catch {
225
+ diagnostics.push(`invalid-source-execution:${ref.path}`);
226
+ }
227
+ }
228
+ for (const id of required)
229
+ if (!executions.has(id))
230
+ diagnostics.push(`missing-source-execution:${id}`);
231
+ for (const receipt of receipts) {
232
+ const id = receipt.identity.sourceExecutionId;
233
+ if (!id) {
234
+ diagnostics.push(`unregistered-source-execution:${receipt.identity.sessionId}`);
235
+ continue;
236
+ }
237
+ const execution = executions.get(id);
238
+ if (!execution || Date.parse(receipt.startedAt) < Date.parse(execution.startedAt) || Date.parse(receipt.finishedAt) > Date.parse(execution.finishedAt) || (execution.phase === "semantic-intake") !== (receipt.identity.phase === "semantic-intake"))
239
+ diagnostics.push(`source-execution-session-mismatch:${receipt.identity.sessionId}`);
240
+ }
241
+ const relation = (snapshot) => {
242
+ if (!binding.contract)
243
+ return "unbound";
244
+ if (snapshot.revision === null && snapshot.canonicalHash === null && snapshot.observedCanonicalHash === null)
245
+ return "pre-contract";
246
+ if (snapshot.revision === null || snapshot.canonicalHash === null || snapshot.observedCanonicalHash !== snapshot.canonicalHash)
247
+ return "conflict";
248
+ if (snapshot.revision > binding.contract.revision)
249
+ return "future-revision";
250
+ if (snapshot.revision < binding.contract.revision)
251
+ return "prior-revision";
252
+ return snapshot.canonicalHash === binding.contract.canonicalHash ? "current" : "conflict";
253
+ };
254
+ const executionContracts = [...executions.values()].map(execution => ({ executionId: execution.executionId, before: relation(execution.beforeContract), after: relation(execution.afterContract) }));
255
+ for (const row of executionContracts)
256
+ if ([row.before, row.after].some(value => ["unbound", "conflict", "future-revision"].includes(value)))
257
+ diagnostics.push(`source-execution-contract:${row.executionId}`);
258
+ try {
259
+ const usage = summarizeBoundSourceUsage(binding.ledger, receipts);
260
+ diagnostics.push(...usage.diagnostics);
261
+ // Non-source requests in a task-lifetime ledger have not been priced by
262
+ // this source-only proof. Keep their existing unknown-cost marker.
263
+ if (binding.ledger.reservedRequests !== usage.sourceRequests)
264
+ diagnostics.push("non-source-task-cost-unproven");
265
+ return { ...usage, executionContracts, complete: diagnostics.length === 0, diagnostics, totalTokens: diagnostics.length ? null : usage.totalTokens };
266
+ }
267
+ catch {
268
+ return { executionContracts, complete: false, diagnostics: [...diagnostics, "invalid-source-usage"], sourceSessions: null, sourceRequests: null, unattributedRequests: null, totalTokens: null };
269
+ }
270
+ }
271
+ /** Evaluation checks the original files against the frozen generation bytes.
272
+ * It never reads today's task ledger as yesterday's cost. */
273
+ export async function verifyFrozenSourceUsage(repoRoot, binding) {
274
+ const summary = summarizeFrozenSourceUsage(binding);
275
+ const diagnostics = [...summary.diagnostics];
276
+ const root = path.join(getTaskPaths(repoRoot, binding.ledger.taskId).taskDir, "artifacts");
277
+ for (const ref of [...(binding.evidence?.receipts ?? []), ...(binding.evidence?.executions ?? [])]) {
278
+ try {
279
+ if (!/^(?:session-budget|source-executions)\/[^/\\]+\.json$/.test(ref.path))
280
+ throw Error("invalid path");
281
+ const bytes = await readFileBoundarySafe({ boundaryRoot: root, targetPath: path.join(root, ref.path), label: "frozen source usage" });
282
+ if (receiptHash(bytes) !== ref.sha256)
283
+ throw Error("changed receipt");
284
+ }
285
+ catch {
286
+ diagnostics.push(`source-evidence-missing-or-changed:${ref.path}`);
287
+ }
288
+ }
289
+ return { ...summary, complete: diagnostics.length === 0, diagnostics, totalTokens: diagnostics.length ? null : summary.totalTokens };
290
+ }
@@ -2789,7 +2789,6 @@ export async function dispatchOperatorAction(ctx, req) {
2789
2789
  reconcileAction,
2790
2790
  "--reason",
2791
2791
  reason,
2792
- "--json",
2793
2792
  ],
2794
2793
  });
2795
2794
  await finalizeMutationGateReceipt(ctx, gated.receiptId, accepted);
@@ -114,7 +114,7 @@ const CONTEXT_TRANSFER_CODE_COPY = [
114
114
  },
115
115
  {
116
116
  pattern: /\bOPERATION_NEEDS_RECONCILE\b/,
117
- copy: "当前操作的执行结果尚未确认,需要先核对(OPERATION_NEEDS_RECONCILE)。请查看操作记录和相关任务状态,核对实际执行结果后再决定后续操作;确认前请勿重复提交。",
117
+ copy: "当前操作的执行结果尚未确认,需要先核对(OPERATION_NEEDS_RECONCILE)。请查看操作记录和相关任务状态,核对实际执行结果后再决定后续操作;确认前请勿重复提交。"
118
118
  },
119
119
  {
120
120
  pattern: /\bCONTEXT_EXPORT_FAILED\b/,
@@ -1,3 +1,4 @@
1
+ import { capabilityBoundarySchema } from "../../task/config-types.js";
1
2
  /**
2
3
  * Console PRD Intake Bridge (design 2026-08-11-console-prd-intake-bridge).
3
4
  * Maps task-side intake artifacts / projected source into Console DraftStore
@@ -119,20 +120,9 @@ export function parseEngineeringBoundaryFromParams(p) {
119
120
  };
120
121
  const allowedPaths = asList(p.allowedPaths ?? p.allowedPath);
121
122
  const forbiddenPaths = asList(p.forbiddenPaths ?? p.forbiddenPath);
122
- const capabilityBoundaryRaw = p.capabilityBoundary;
123
- const capabilityBoundary = capabilityBoundaryRaw && typeof capabilityBoundaryRaw === "object" && !Array.isArray(capabilityBoundaryRaw)
124
- ? {
125
- allowed: Array.isArray(capabilityBoundaryRaw.allowed)
126
- ? capabilityBoundaryRaw.allowed.filter((x) => typeof x === "string" && x.trim().length > 0)
127
- : undefined,
128
- forbidden: Array.isArray(capabilityBoundaryRaw.forbidden)
129
- ? capabilityBoundaryRaw.forbidden.filter((x) => typeof x === "string" && x.trim().length > 0)
130
- : undefined,
131
- requiredClauses: Array.isArray(capabilityBoundaryRaw.requiredClauses)
132
- ? capabilityBoundaryRaw.requiredClauses.filter((x) => typeof x === "string" && x.trim().length > 0)
133
- : undefined,
134
- }
135
- : undefined;
123
+ const capabilityBoundary = p.capabilityBoundary === undefined
124
+ ? undefined
125
+ : capabilityBoundarySchema.parse(p.capabilityBoundary);
136
126
  const interactionIds = asList(p.interactionIds ?? p.interactionId);
137
127
  const requirementOwnership = Array.isArray(p.requirementOwnership)
138
128
  ? p.requirementOwnership
@@ -206,7 +196,7 @@ export function parseEngineeringBoundaryFromParams(p) {
206
196
  ...(forbiddenPaths.length > 0 ? { forbiddenPaths } : {}),
207
197
  ...(verifyCommands.length > 0 ? { verifyCommands } : {}),
208
198
  ...(requirementOwnership?.length ? { requirementOwnership } : {}),
209
- ...(capabilityBoundary && ((capabilityBoundary.allowed?.length ?? 0) + (capabilityBoundary.forbidden?.length ?? 0)) > 0
199
+ ...(capabilityBoundary
210
200
  ? { capabilityBoundary }
211
201
  : {}),
212
202
  ...(interactionIds.length > 0 ? { interactionIds } : {}),
@@ -1 +1 @@
1
- import{g as p,r as u,d as a}from"./chunk-6Q2QTUOP-Caso6uN7.js";import{p as f}from"./chunk-JWPE2WC7-DiMqZQ_8.js";import{_ as n,l as o}from"./mermaid.core-DF6mMPJ9.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-C-NKFflx.js";import"./index-DWKejNVJ.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-DfzjRD5y.js";import{p as f}from"./chunk-JWPE2WC7-C3sQMMYr.js";import{_ as n,l as o}from"./mermaid.core-4P9yPC9c.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-DktIuDWs.js";import"./index-CTMZsDmh.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-DF6mMPJ9.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-4P9yPC9c.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};