@tea-agent/loop-agent 0.40.0-next.9 → 0.41.0-beta.1
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 +130 -3
- package/README.md +2 -2
- package/dist/adapters/context-transfer/optional-pi-handoff.js +31 -0
- package/dist/adapters/context-transfer/pi-session.js +61 -0
- package/dist/application/dag/generate-task-dag.js +6 -2
- package/dist/build-stamp.json +3 -3
- package/dist/cli/command-definitions.js +21 -5
- package/dist/cli/program.js +61 -4
- package/dist/commands/client-recovery.js +8 -36
- package/dist/commands/dag-artifact.js +284 -0
- package/dist/commands/dag-context.js +184 -0
- package/dist/commands/dag-rerun.js +206 -1
- package/dist/commands/init-model-catalog.js +22 -0
- package/dist/commands/task-advance.js +23 -1
- package/dist/commands/task-source-prepare.js +5 -0
- package/dist/commands/task-status.js +1 -0
- package/dist/executors/dag-pi-executor.js +39 -12
- package/dist/executors/pi-sdk-executor.js +36 -5
- package/dist/executors/shell-executor.js +64 -17
- package/dist/governance/checks.js +1 -0
- package/dist/{worker → infrastructure}/console/app-data.js +4 -0
- package/dist/infrastructure/console/artifact-revision-store.js +430 -0
- package/dist/infrastructure/console/context-export-store.js +160 -0
- package/dist/infrastructure/console/dir-lock.js +132 -0
- package/dist/{worker → infrastructure}/console/operation-store.js +28 -0
- package/dist/infrastructure/harness/artifact-store.js +10 -1
- package/dist/infrastructure/harness/atomic-write.js +12 -2
- package/dist/shared/context-transfer/artifact-revision.js +172 -0
- package/dist/shared/context-transfer.js +418 -0
- package/dist/shared/operator/capabilities.js +23 -1
- package/dist/shared/operator/safe-run-summary.js +1 -0
- package/dist/shared/path-safety.js +93 -0
- package/dist/shared/pi-context-pressure/checkpoint.js +116 -0
- package/dist/shared/pi-context-pressure/compaction-policy.js +151 -0
- package/dist/shared/pi-context-pressure/env.js +58 -0
- package/dist/shared/pi-context-pressure/extension.js +100 -0
- package/dist/shared/pi-context-pressure/index.js +7 -0
- package/dist/shared/pi-context-pressure/overflow.js +252 -0
- package/dist/shared/pi-context-pressure/sift-bridge.js +386 -0
- package/dist/shared/pi-context-pressure/telemetry.js +51 -0
- package/dist/shared/preview.js +28 -4
- package/dist/task/config-types.js +2 -1
- package/dist/task/task-demand-routing.js +3 -0
- package/dist/worker/console/chat/assistant-content.js +7 -0
- package/dist/worker/console/chat/chat-event-store.js +84 -13
- package/dist/worker/console/chat/goal-round-driver.js +72 -0
- package/dist/worker/console/chat/goals.js +300 -0
- package/dist/worker/console/chat/pi-runtime.js +285 -8
- package/dist/worker/console/chat/provider-error.js +2 -1
- package/dist/worker/console/chat/repo-browser.js +94 -12
- package/dist/worker/console/chat/resource-preferences-store.js +1 -1
- package/dist/worker/console/chat/routes.js +487 -30
- package/dist/worker/console/chat/session-catalog.js +48 -0
- package/dist/worker/console/chat/session-stats.js +96 -0
- package/dist/worker/console/chat/session-store.js +28 -19
- package/dist/worker/console/chat/shortcuts.js +7 -0
- package/dist/worker/console/chat/sift-bridge.js +1 -0
- package/dist/worker/console/chat/turn-process.js +32 -3
- package/dist/worker/console/chat/user-questions.js +1 -1
- package/dist/worker/console/console-update-runtime.js +1 -1
- package/dist/worker/console/context-transfer-diagnostics.js +198 -0
- package/dist/worker/console/dag-confirmation.js +1 -1
- package/dist/worker/console/dag-execution-receipt.js +21 -3
- package/dist/worker/console/doctor.js +1 -1
- package/dist/worker/console/draft-store.js +1 -1
- package/dist/worker/console/human-gate-token.js +1 -1
- package/dist/worker/console/index.js +3 -3
- package/dist/worker/console/interview/assessment.js +1 -1
- package/dist/worker/console/interview/session.js +1 -1
- package/dist/worker/console/operation-runner.js +45 -4
- package/dist/worker/console/operation-sse.js +1 -1
- package/dist/worker/console/operation-wait.js +1 -1
- package/dist/worker/console/operator-actions.js +124 -8
- package/dist/worker/console/operator-selection.js +6 -2
- package/dist/worker/console/operator-surface-health.js +1 -1
- package/dist/worker/console/operator-user-error.js +169 -0
- package/dist/worker/console/pi-plugins.catalog.json +73658 -0
- package/dist/worker/console/pi-plugins.js +179 -0
- package/dist/worker/console/routes.js +864 -13
- package/dist/worker/console/security.js +35 -0
- package/dist/worker/console/server.js +177 -44
- package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-Bs-CDAXM.js → abnfDiagram-N423BO3Z-DSVcg1YO.js} +1 -1
- package/dist/worker/console/static/assets/{arc-CAkA3We3.js → arc-BtXhIqui.js} +1 -1
- package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-DEmI_zqr.js → architectureDiagram-T3A2C74G-B-nh-ilJ.js} +1 -1
- package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-uDHANebE.js → blockDiagram-VBNYF7ZC-BIUSVdZI.js} +1 -1
- package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-Bv97b4_B.js → c4Diagram-5PPSVZJV-Cmw3L4qM.js} +1 -1
- package/dist/worker/console/static/assets/channel-BhZFNefx.js +1 -0
- package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-shmQKsFz.js → chunk-2GRJ4B5K-CGpMMjGm.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-BAraNvcN.js → chunk-2Q5K7J3B-BNBkEpEJ.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5RXB4S5H-BirhxUop.js → chunk-5RXB4S5H-ubln3eaU.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5VM5RSS4-C9LgUJpR.js → chunk-5VM5RSS4-_XcBTt1i.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-DrU-s-t7.js → chunk-6Q2QTUOP-Ln30Pgrh.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-GF5L2VYU-Tx-H_FA2.js → chunk-GF5L2VYU-ESH3lhSx.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-JWPE2WC7-BjLtNFrR.js → chunk-JWPE2WC7-DAJt-qXB.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-KBJHAD2P-UNLVwSsy.js → chunk-KBJHAD2P-Cx10LIcH.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-RYQCIY6F-CBEUX8XD.js → chunk-RYQCIY6F-CENeOxoJ.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-XXDRQBXY-WTL7IZOq.js → chunk-XXDRQBXY-DXqK-D38.js} +1 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-Sbv-NJni.js +1 -0
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-Sbv-NJni.js +1 -0
- package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-CkHG6W3s.js → cose-bilkent-JH36ORCC-CE4dmvGY.js} +1 -1
- package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-BRzFqTaL.js → cynefin-VYW2F7L2-CRacN1zK.js} +1 -1
- package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-2_CFp_i7.js → cynefinDiagram-MW4NZA55-Cneukjrt.js} +1 -1
- package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-BJtsmdkE.js → dagre-VZM6K2ZE-DPFboRoL.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-7IWD3JNH-DNEFFo6w.js → diagram-7IWD3JNH-DIAQgcOP.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-B_IWV7eo.js → diagram-B4RE2ZJO-VrYMKxuy.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-LBJQPF4R-DvvRx2dz.js → diagram-LBJQPF4R-CLHvBghn.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-Q27KOJAE-CsibsWLg.js → diagram-Q27KOJAE-DVCWBif8.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-UB23O5K3-les_djBQ.js → diagram-UB23O5K3-BTMmbBzJ.js} +1 -1
- package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-BEm2n7qJ.js → ebnfDiagram-BXEA7PRR-BUZsKJ56.js} +1 -1
- package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-BI7vHHVm.js → erDiagram-JOGREHBK-BsBZ5NXC.js} +1 -1
- package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-CUFCERrB.js → flowDiagram-UKHOOZJN-D7fH_kDa.js} +1 -1
- package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-wxyLiGWt.js → ganttDiagram-PKOTCBZU-Bza5OohY.js} +1 -1
- package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-Bt897K8Z.js → gitGraphDiagram-DS77QQ5N-DpkoGR_Y.js} +1 -1
- package/dist/worker/console/static/assets/index-Ius3vxhf.css +1 -0
- package/dist/worker/console/static/assets/index-yASzcbBr.js +451 -0
- package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-DYNx_IPv.js → infoDiagram-6WML65LV-BYm3g6LT.js} +1 -1
- package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-CzpLNEu6.js → ishikawaDiagram-WSZJBQD7-C2RS_H4v.js} +1 -1
- package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-97f9owNU.js → journeyDiagram-NVQOT4AX-B4slKpCo.js} +1 -1
- package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-BxM9hyBn.js → kanban-definition-27J2QSJJ-B7orRNpI.js} +1 -1
- package/dist/worker/console/static/assets/{linear-ByuxcHvp.js → linear-D1BeBxLQ.js} +1 -1
- package/dist/worker/console/static/assets/{mermaid.core-DwPGvpCv.js → mermaid.core-0TtMP8k4.js} +5 -5
- package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-DCoqG9RT.js → mindmap-definition-FAOFIHXS-XL5EbCtT.js} +1 -1
- package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-BLSBmBMx.js → pegDiagram-VL7TDLO6-CwF7uas5.js} +1 -1
- package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-B0t_0oJW.js → pieDiagram-7S7Q4E2Y-A_Jo-72f.js} +1 -1
- package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-sTzDk7Nt.js → quadrantDiagram-CIZ2JOQS-CxOa4gKL.js} +1 -1
- package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-B3jRdATC.js → railroadDiagram-AXF67PYL-DoAoswIH.js} +1 -1
- package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-D-cTtXEN.js → requirementDiagram-LRYGKXZP-C1Lc1MlD.js} +1 -1
- package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-B25igJRE.js → sankeyDiagram-W5VNT64P-DFXOkq0U.js} +1 -1
- package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-jW_lM1_D.js → sequenceDiagram-SI44F4Z6-B0ufUCuW.js} +1 -1
- package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-CrzTgsHE.js → sizeCapture-X5ZJPWSS-iPbW55g3.js} +1 -1
- package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-B01MvlqE.js → stateDiagram-OKZ733FA-CHiXzEKP.js} +1 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-BtMgzo_H.js +1 -0
- package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-YcF12FiU.js → swimlanes-SLNWSIFB-LyFs7TpX.js} +2 -2
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-Cb-OVd9Y.js +8 -0
- package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-ClnRcg2s.js → timeline-definition-Z64GVDOM-tNkJnb6z.js} +1 -1
- package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-B6gr_z-q.js → vennDiagram-T6HMQDX7-DFm7Oo8o.js} +1 -1
- package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-CvSgguGH.js → wardleyDiagram-T6FBY63Y-tpblTp9i.js} +1 -1
- package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-23OtSZCb.js → xychartDiagram-ELKLHX3M-BCDLWR_D.js} +1 -1
- package/dist/worker/console/static/index.html +7 -2
- package/dist/worker/console/static-src/app/useOperatorActions.js +3 -2
- package/dist/worker/console/static-src/operator-chat/chat-sse-events.js +95 -25
- package/dist/worker/console/static-src/operator-chat/compaction-message.js +35 -1
- package/dist/worker/console/static-src/operator-chat/open-preview-in-browser.js +3 -1
- package/dist/worker/console/static-src/operator-chat/useChatSessions.js +26 -19
- package/dist/worker/console/static-src/operator-chat/useChatStream.js +0 -11
- package/dist/worker/console/static-src/operator-chat/useChatThread.js +14 -1
- package/dist/worker/console/static-src/operator-chat/useRepoBrowser.js +34 -4
- package/dist/worker/console/static-src/operator-chat/useRuntimeControls.js +28 -3
- package/dist/worker/console/static-src/operator-chat/workspace-reorder.js +18 -0
- package/dist/worker/console/static-src/shell/console-update-reload.js +25 -0
- package/dist/worker/console/static-src/shell/useWorkspaces.js +150 -34
- package/dist/worker/console/static-src/shell/workspace-route.js +3 -1
- package/dist/worker/console/workspace-context.js +56 -5
- package/dist/worker/console/workspace-registry.js +335 -62
- package/dist/worker/continuation/worker-continuation.js +278 -0
- package/dist/worker/observe/health.js +1 -1
- package/dist/worker/observe/node-transparency.js +572 -0
- package/dist/worker/observe/routes.js +51 -1
- package/dist/worker/observe/static/api.js +69 -5
- package/dist/worker/observe/static/dag-context-reason-labels.d.ts +9 -0
- package/dist/worker/observe/static/dag-context-reason-labels.js +120 -0
- package/dist/worker/observe/static/inspect-bootstrap.d.ts +8 -0
- package/dist/worker/observe/static/inspect-bootstrap.js +57 -0
- package/dist/worker/observe/static/inspect-workspace.js +54 -10
- package/dist/worker/observe/static/operator-chrome.css +23 -4
- package/dist/worker/observe/static/operator-chrome.js +7 -2
- package/dist/worker/observe/static/state.js +3 -1
- package/dist/worker/observe/static/styles.css +1108 -135
- package/dist/worker/observe/static/views/dag-inspector.js +1257 -59
- package/dist/worker/observe/static/views/dags.js +7 -5
- package/dist/worker/observe/static/views/session-timeline.js +210 -10
- package/dist/worker/outcomes/adapters.js +19 -0
- package/dist/worker/outcomes/types.js +1 -0
- package/dist/worker/pool/attempt-lease.js +97 -66
- package/dist/worker/pool/begin-attempt-with-lease.js +1 -0
- package/dist/worker/pool/reconcile.js +46 -1
- package/dist/worker/pool/run-store.js +2 -0
- package/dist/worker/pool/state-projection.js +2 -0
- package/dist/worker/task-spec/workflow-routing.js +8 -3
- package/dist/workflows/dag/artifact-bindings.js +149 -0
- package/dist/workflows/dag/artifact-revision-schema-registry.js +31 -0
- package/dist/workflows/dag/backend-test-case-coverage-analysis.js +162 -8
- package/dist/workflows/dag/backend-test-pytest-collection.js +70 -2
- package/dist/workflows/dag/backend-test-result-contract.js +4 -0
- package/dist/workflows/dag/backend-test-scenario-param.js +339 -53
- package/dist/workflows/dag/backend-test-writer-completeness.js +11 -0
- package/dist/workflows/dag/budget-enforcement.js +10 -0
- package/dist/workflows/dag/context-receipt.js +305 -0
- package/dist/workflows/dag/context-transfer/context-bundle.js +423 -0
- package/dist/workflows/dag/context-transfer/operator-actions.js +61 -0
- package/dist/workflows/dag/context-transfer/renderers.js +93 -0
- package/dist/workflows/dag/frontend-writer-rollback.js +32 -0
- package/dist/workflows/dag/init-hybrid.js +151 -4
- package/dist/workflows/dag/node-execution.js +112 -27
- package/dist/workflows/dag/path-safety.js +1 -0
- package/dist/workflows/dag/prompt.js +29 -4
- package/dist/workflows/dag/rerun-plan.js +555 -1
- package/dist/workflows/dag/rerun-run.js +601 -15
- package/dist/workflows/dag/runner.js +20 -1
- package/dist/workflows/dag/skill-snapshot.js +17 -0
- package/dist/workflows/dag/types.js +183 -7
- package/docs/architecture/runtime-boundaries.md +8 -7
- package/docs/architecture/worker-and-feature.md +1 -1
- package/docs/templates/agent-dag.schema.json +32 -0
- package/docs/templates/backend-test-dag.json +6 -5
- package/docs/templates/init-managed-agents.md +1 -1
- package/docs/templates/product-line/task.yaml +1 -1
- package/package.json +5 -2
- package/skills/loop-agent/references/command-reference.md +21 -1
- package/dist/worker/console/static/assets/channel-amxUpk7o.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-bejwBVIz.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-bejwBVIz.js +0 -1
- package/dist/worker/console/static/assets/index-BHhUOTri.css +0 -1
- package/dist/worker/console/static/assets/index-DqJbO3-p.js +0 -407
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-BvFKEtm2.js +0 -1
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-DIB2eVg-.js +0 -8
- /package/dist/{worker → infrastructure}/console/repo-fingerprint.js +0 -0
|
@@ -218,6 +218,41 @@ export function evaluateMutationGate(req, ctx) {
|
|
|
218
218
|
}
|
|
219
219
|
return undefined;
|
|
220
220
|
}
|
|
221
|
+
/**
|
|
222
|
+
* Authorize a browser-initiated download without weakening the mutation gate.
|
|
223
|
+
* Same-origin GET requests do not reliably carry Origin, so Referer is the
|
|
224
|
+
* required source proof when Origin is absent. Capability, confirmation, Host,
|
|
225
|
+
* and Fetch Metadata checks remain identical to mutations.
|
|
226
|
+
*/
|
|
227
|
+
export function evaluateProtectedDownloadGate(req, ctx) {
|
|
228
|
+
const origin = req.headers.origin;
|
|
229
|
+
if (typeof origin === "string" && origin.length > 0) {
|
|
230
|
+
return evaluateMutationGate(req, ctx);
|
|
231
|
+
}
|
|
232
|
+
const referer = req.headers.referer;
|
|
233
|
+
let refererOrigin = "";
|
|
234
|
+
if (typeof referer === "string" && referer.length > 0) {
|
|
235
|
+
try {
|
|
236
|
+
refererOrigin = new URL(referer).origin;
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
// Keep the synthesized Origin empty so the normal gate fails closed.
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
const requestWithSource = Object.create(req);
|
|
243
|
+
requestWithSource.headers = {
|
|
244
|
+
...req.headers,
|
|
245
|
+
origin: refererOrigin,
|
|
246
|
+
};
|
|
247
|
+
const failure = evaluateMutationGate(requestWithSource, ctx);
|
|
248
|
+
if (failure?.code === "origin-mismatch") {
|
|
249
|
+
return {
|
|
250
|
+
...failure,
|
|
251
|
+
message: "Referer does not match Console origin",
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
return failure;
|
|
255
|
+
}
|
|
221
256
|
export function isMutationMethod(method) {
|
|
222
257
|
const m = (method ?? "GET").toUpperCase();
|
|
223
258
|
return m === "POST" || m === "PUT" || m === "PATCH" || m === "DELETE";
|
|
@@ -6,8 +6,11 @@ import path from "node:path";
|
|
|
6
6
|
import { fileURLToPath } from "node:url";
|
|
7
7
|
import { readPackageVersion } from "../../shared/package-metadata.js";
|
|
8
8
|
import { DAG_ABSOLUTE_MAX_WALL_CLOCK_MS } from "../../shared/timeout-policy.js";
|
|
9
|
-
import { openConsoleAppData } from "
|
|
9
|
+
import { openConsoleAppData } from "../../infrastructure/console/app-data.js";
|
|
10
10
|
import { isLoopbackHost } from "./loopback.js";
|
|
11
|
+
import { ChatSessionStore } from "./chat/session-store.js";
|
|
12
|
+
import { ChatSessionCatalog } from "./chat/session-catalog.js";
|
|
13
|
+
import { matchRepoHtmlPreviewRoute } from "./chat/repo-browser.js";
|
|
11
14
|
import { handleConsoleHealthRequest, handleWorkspaceRoutes, sendJson, serveConsoleStatic, } from "./routes.js";
|
|
12
15
|
import { issueBootCapabilityToken, injectConfirmationTokenScript, } from "./security.js";
|
|
13
16
|
import { resolvePackageRootFromConsole } from "./sibling-controller.js";
|
|
@@ -74,6 +77,35 @@ export async function createConsoleServer(options) {
|
|
|
74
77
|
});
|
|
75
78
|
const registry = new WorkspaceRegistry(bootstrapAppData);
|
|
76
79
|
const startupRecord = await registry.ensureStartupWorkspace(repoRoot);
|
|
80
|
+
const chatSessionCatalog = new ChatSessionCatalog();
|
|
81
|
+
// DSH-style dual baseline: Workspace records own grouping/order, while the
|
|
82
|
+
// Session catalog is rebuilt once at Host startup from durable Session
|
|
83
|
+
// persistence. Requests never rediscover every Workspace store.
|
|
84
|
+
for (const record of await registry.listAll()) {
|
|
85
|
+
try {
|
|
86
|
+
const store = new ChatSessionStore(openConsoleAppData({
|
|
87
|
+
repoRoot: record.repoRoot,
|
|
88
|
+
...(options.appDataRoot
|
|
89
|
+
? { appDataRoot: options.appDataRoot }
|
|
90
|
+
: {}),
|
|
91
|
+
}));
|
|
92
|
+
const sessions = await store.list({ includeArchived: true });
|
|
93
|
+
for (const session of sessions) {
|
|
94
|
+
if (session.repoFingerprint !== record.repoFingerprint)
|
|
95
|
+
continue;
|
|
96
|
+
chatSessionCatalog.upsert(session, record.workspaceId);
|
|
97
|
+
}
|
|
98
|
+
if (!record.hidden) {
|
|
99
|
+
await registry.reconcileSessions(record.workspaceId, sessions
|
|
100
|
+
.filter((session) => session.repoFingerprint === record.repoFingerprint)
|
|
101
|
+
.map((session) => session.sessionId));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// A removed or externally unavailable Workspace is not an empty Session
|
|
106
|
+
// baseline. Its prior durable membership remains untouched.
|
|
107
|
+
}
|
|
108
|
+
}
|
|
77
109
|
const instanceNonce = configuredPort === 0 ? randomBytes(16).toString("hex") : undefined;
|
|
78
110
|
const bootToken = issueBootCapabilityToken({
|
|
79
111
|
repoFingerprint: startupRecord.repoFingerprint,
|
|
@@ -96,28 +128,10 @@ export async function createConsoleServer(options) {
|
|
|
96
128
|
// ---- Per-workspace lazily-created contexts -------------------------------
|
|
97
129
|
const workspaceContexts = new Map();
|
|
98
130
|
let sharedConsoleUpdateExecutor = options.consoleUpdateExecutor;
|
|
99
|
-
const
|
|
100
|
-
const
|
|
101
|
-
if (!id) {
|
|
102
|
-
return {
|
|
103
|
-
ok: false,
|
|
104
|
-
status: 400,
|
|
105
|
-
code: "WORKSPACE_REQUIRED",
|
|
106
|
-
message: "workspaceId is required",
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
const existing = workspaceContexts.get(id);
|
|
131
|
+
const materializeContext = async (record) => {
|
|
132
|
+
const existing = workspaceContexts.get(record.workspaceId);
|
|
110
133
|
if (existing)
|
|
111
|
-
return
|
|
112
|
-
const record = await registry.getVisible(id);
|
|
113
|
-
if (!record) {
|
|
114
|
-
return {
|
|
115
|
-
ok: false,
|
|
116
|
-
status: 404,
|
|
117
|
-
code: "WORKSPACE_NOT_FOUND",
|
|
118
|
-
message: `unknown workspace: ${id}`,
|
|
119
|
-
};
|
|
120
|
-
}
|
|
134
|
+
return existing;
|
|
121
135
|
const context = await createWorkspaceContext(record, {
|
|
122
136
|
appDataRoot: options.appDataRoot,
|
|
123
137
|
staticDir,
|
|
@@ -132,12 +146,35 @@ export async function createConsoleServer(options) {
|
|
|
132
146
|
createClient: options.createClient,
|
|
133
147
|
defaultTimeoutMs: options.defaultTimeoutMs,
|
|
134
148
|
skipReconcile: options.skipReconcile,
|
|
149
|
+
chatSessionCatalog,
|
|
135
150
|
});
|
|
136
151
|
if (sharedConsoleUpdateExecutor) {
|
|
137
152
|
context.actionContext.consoleUpdateExecutor = sharedConsoleUpdateExecutor;
|
|
138
153
|
}
|
|
139
|
-
workspaceContexts.set(
|
|
154
|
+
workspaceContexts.set(record.workspaceId, context);
|
|
140
155
|
void context.recoverDeferredTurns().catch(() => undefined);
|
|
156
|
+
return context;
|
|
157
|
+
};
|
|
158
|
+
const resolveContext = async (workspaceId) => {
|
|
159
|
+
const id = workspaceId?.trim();
|
|
160
|
+
if (!id) {
|
|
161
|
+
return {
|
|
162
|
+
ok: false,
|
|
163
|
+
status: 400,
|
|
164
|
+
code: "WORKSPACE_REQUIRED",
|
|
165
|
+
message: "workspaceId is required",
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
const record = await registry.getVisible(id);
|
|
169
|
+
if (!record) {
|
|
170
|
+
return {
|
|
171
|
+
ok: false,
|
|
172
|
+
status: 404,
|
|
173
|
+
code: "WORKSPACE_NOT_FOUND",
|
|
174
|
+
message: `unknown workspace: ${id}`,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
const context = await materializeContext(record);
|
|
141
178
|
return { ok: true, context };
|
|
142
179
|
};
|
|
143
180
|
const startupResolution = await resolveContext(startupRecord.workspaceId);
|
|
@@ -383,6 +420,52 @@ export async function createConsoleServer(options) {
|
|
|
383
420
|
// the JSON body; all other chat routes resolve via Session ownership
|
|
384
421
|
// (durable) with optional query workspaceId conflict check.
|
|
385
422
|
const { handleChatRequest: dispatchChat } = await import("./chat/routes.js");
|
|
423
|
+
const htmlPreviewRoute = matchRepoHtmlPreviewRoute(pathname);
|
|
424
|
+
if (method === "GET" &&
|
|
425
|
+
pathname === "/api/operator/v1/chat/sessions" &&
|
|
426
|
+
!url.searchParams.has("workspaceId")) {
|
|
427
|
+
const sessions = chatSessionCatalog.list().map((entry) => {
|
|
428
|
+
const active = entry.workspaceId
|
|
429
|
+
? workspaceContexts
|
|
430
|
+
.get(entry.workspaceId)
|
|
431
|
+
?.chatRouteDeps.events.getActiveTurn(entry.sessionId)
|
|
432
|
+
: undefined;
|
|
433
|
+
return {
|
|
434
|
+
sessionId: entry.sessionId,
|
|
435
|
+
...(entry.workspaceId ? { workspaceId: entry.workspaceId } : {}),
|
|
436
|
+
state: entry.state,
|
|
437
|
+
createdAt: entry.createdAt,
|
|
438
|
+
updatedAt: entry.updatedAt,
|
|
439
|
+
...(entry.title !== undefined ? { title: entry.title } : {}),
|
|
440
|
+
...(entry.displayTitle !== undefined
|
|
441
|
+
? { displayTitle: entry.displayTitle }
|
|
442
|
+
: {}),
|
|
443
|
+
...(entry.modelProvider !== undefined
|
|
444
|
+
? { modelProvider: entry.modelProvider }
|
|
445
|
+
: {}),
|
|
446
|
+
...(entry.modelId !== undefined ? { modelId: entry.modelId } : {}),
|
|
447
|
+
...(entry.thinkingLevel !== undefined
|
|
448
|
+
? { thinkingLevel: entry.thinkingLevel }
|
|
449
|
+
: {}),
|
|
450
|
+
activeTurnId: active?.turnId,
|
|
451
|
+
turnPhase: active?.abortRequestedAt
|
|
452
|
+
? "stopping"
|
|
453
|
+
: active
|
|
454
|
+
? "running"
|
|
455
|
+
: "idle",
|
|
456
|
+
deferredTurn: entry.deferredTurn,
|
|
457
|
+
deferredTurns: entry.deferredTurns,
|
|
458
|
+
};
|
|
459
|
+
});
|
|
460
|
+
sendJson(res, 200, {
|
|
461
|
+
ok: true,
|
|
462
|
+
schemaVersion: 2,
|
|
463
|
+
sessions,
|
|
464
|
+
hasBash: true,
|
|
465
|
+
workspaceErrors: [],
|
|
466
|
+
});
|
|
467
|
+
return;
|
|
468
|
+
}
|
|
386
469
|
if (method === "POST" && pathname === "/api/operator/v1/chat/sessions") {
|
|
387
470
|
// AC-R5-006: the mutation gate fires BEFORE body pre-read/workspace
|
|
388
471
|
// resolution — an unauthenticated mutation gets exactly 403, never a
|
|
@@ -445,30 +528,44 @@ export async function createConsoleServer(options) {
|
|
|
445
528
|
}
|
|
446
529
|
}
|
|
447
530
|
const requestedId = url.searchParams.get("workspaceId")?.trim();
|
|
531
|
+
const catalogEntry = chatSessionCatalog.get(sessionId);
|
|
448
532
|
let owner;
|
|
449
533
|
if (requestedId) {
|
|
534
|
+
if (catalogEntry?.workspaceId &&
|
|
535
|
+
catalogEntry.workspaceId !== requestedId) {
|
|
536
|
+
sendJson(res, 403, {
|
|
537
|
+
ok: false,
|
|
538
|
+
error: {
|
|
539
|
+
code: "WORKSPACE_CONFLICT",
|
|
540
|
+
message: "workspaceId does not match the session's owning workspace",
|
|
541
|
+
},
|
|
542
|
+
});
|
|
543
|
+
return;
|
|
544
|
+
}
|
|
450
545
|
// The current UI always sends its selected workspace. Resolve that one
|
|
451
546
|
// context directly: scanning every historical registry entry first can
|
|
452
547
|
// fail on an old, deleted temp directory before reaching the real owner.
|
|
453
|
-
const
|
|
454
|
-
|
|
548
|
+
const ownerRecord = catalogEntry
|
|
549
|
+
? await registry.get(requestedId)
|
|
550
|
+
: await registry.getVisible(requestedId);
|
|
551
|
+
if (!ownerRecord ||
|
|
552
|
+
(catalogEntry &&
|
|
553
|
+
ownerRecord.repoFingerprint !== catalogEntry.repoFingerprint)) {
|
|
455
554
|
// A session-scoped workspace hint is a conflict boundary. Unknown
|
|
456
555
|
// workspace ids must not reveal whether the session exists elsewhere.
|
|
457
|
-
|
|
458
|
-
sendJson(res, workspaceConflict ? 403 : resolution.status, {
|
|
556
|
+
sendJson(res, 403, {
|
|
459
557
|
ok: false,
|
|
460
|
-
error:
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
}
|
|
465
|
-
: { code: resolution.code, message: resolution.message },
|
|
558
|
+
error: {
|
|
559
|
+
code: "WORKSPACE_CONFLICT",
|
|
560
|
+
message: "workspaceId does not match the session's owning workspace",
|
|
561
|
+
},
|
|
466
562
|
});
|
|
467
563
|
return;
|
|
468
564
|
}
|
|
469
|
-
const
|
|
565
|
+
const context = await materializeContext(ownerRecord);
|
|
566
|
+
const stored = await context.chatRouteDeps.store.get(sessionId);
|
|
470
567
|
if (stored)
|
|
471
|
-
owner =
|
|
568
|
+
owner = context;
|
|
472
569
|
else {
|
|
473
570
|
// Do not scan another workspace and disclose whether the id exists there.
|
|
474
571
|
sendJson(res, 403, {
|
|
@@ -481,12 +578,18 @@ export async function createConsoleServer(options) {
|
|
|
481
578
|
return;
|
|
482
579
|
}
|
|
483
580
|
}
|
|
581
|
+
else if (catalogEntry?.workspaceId) {
|
|
582
|
+
const ownerRecord = await registry.get(catalogEntry.workspaceId);
|
|
583
|
+
if (ownerRecord &&
|
|
584
|
+
ownerRecord.repoFingerprint === catalogEntry.repoFingerprint) {
|
|
585
|
+
owner = await materializeContext(ownerRecord);
|
|
586
|
+
}
|
|
587
|
+
}
|
|
484
588
|
else {
|
|
485
|
-
//
|
|
486
|
-
//
|
|
487
|
-
//
|
|
488
|
-
const
|
|
489
|
-
for (const record of visible) {
|
|
589
|
+
// Catalog misses are limited to out-of-process/legacy writes after Host
|
|
590
|
+
// startup. Recover once, then publish the discovered Session into the
|
|
591
|
+
// independent baseline for subsequent requests.
|
|
592
|
+
for (const record of await registry.listVisible()) {
|
|
490
593
|
try {
|
|
491
594
|
const resolution = await resolveContext(record.workspaceId);
|
|
492
595
|
if (!resolution.ok)
|
|
@@ -494,6 +597,7 @@ export async function createConsoleServer(options) {
|
|
|
494
597
|
const stored = await resolution.context.chatRouteDeps.store.get(sessionId);
|
|
495
598
|
if (stored) {
|
|
496
599
|
owner = resolution.context;
|
|
600
|
+
chatSessionCatalog.upsert(stored, record.workspaceId);
|
|
497
601
|
break;
|
|
498
602
|
}
|
|
499
603
|
}
|
|
@@ -519,9 +623,24 @@ export async function createConsoleServer(options) {
|
|
|
519
623
|
await dispatchChat(req, res, owner.chatRouteDeps, pathname, undefined);
|
|
520
624
|
return;
|
|
521
625
|
}
|
|
522
|
-
// Non-session chat
|
|
523
|
-
//
|
|
524
|
-
|
|
626
|
+
// Non-session chat surfaces normally resolve from ?workspaceId=. The
|
|
627
|
+
// HTML preview route carries it in the URL path so browser-relative
|
|
628
|
+
// CSS/image requests retain the same workspace scope after dropping a
|
|
629
|
+
// document query string.
|
|
630
|
+
const queryWorkspaceId = url.searchParams.get("workspaceId")?.trim() || undefined;
|
|
631
|
+
if (htmlPreviewRoute &&
|
|
632
|
+
queryWorkspaceId &&
|
|
633
|
+
queryWorkspaceId !== htmlPreviewRoute.workspaceId) {
|
|
634
|
+
sendJson(res, 403, {
|
|
635
|
+
ok: false,
|
|
636
|
+
error: {
|
|
637
|
+
code: "WORKSPACE_CONFLICT",
|
|
638
|
+
message: "workspaceId does not match the HTML preview route",
|
|
639
|
+
},
|
|
640
|
+
});
|
|
641
|
+
return;
|
|
642
|
+
}
|
|
643
|
+
const workspaceId = htmlPreviewRoute?.workspaceId || queryWorkspaceId;
|
|
525
644
|
const resolution = await resolveContext(workspaceId);
|
|
526
645
|
if (!resolution.ok) {
|
|
527
646
|
sendJson(res, resolution.status, {
|
|
@@ -548,8 +667,10 @@ export async function createConsoleServer(options) {
|
|
|
548
667
|
return;
|
|
549
668
|
}
|
|
550
669
|
const opMatch = pathname.match(/^\/api\/operator\/v1\/operations\/([^/]+)(?:\/(events))?$/);
|
|
670
|
+
const contextDownloadMatch = pathname.match(/^\/api\/operator\/v1\/context-exports\/[a-f0-9]{32}\/download$/);
|
|
551
671
|
if ((method === "GET" && pathname === "/api/operator/v1/operations") ||
|
|
552
|
-
opMatch
|
|
672
|
+
opMatch ||
|
|
673
|
+
(method === "GET" && contextDownloadMatch)) {
|
|
553
674
|
const workspaceId = url.searchParams.get("workspaceId") ?? undefined;
|
|
554
675
|
const resolution = await resolveContext(workspaceId);
|
|
555
676
|
if (!resolution.ok) {
|
|
@@ -595,6 +716,14 @@ export async function createConsoleServer(options) {
|
|
|
595
716
|
await handleConsoleOperatorRequest(req, res, operatorRouteContext(startup));
|
|
596
717
|
return;
|
|
597
718
|
}
|
|
719
|
+
// Pi 插件目录 / 版本 / 安装 / 卸载:全局用户级(~/.pi/agent),非工作区作用域,用 startup context。
|
|
720
|
+
if (pathname === "/api/operator/v1/pi-plugins" ||
|
|
721
|
+
pathname === "/api/operator/v1/pi-plugins/versions" ||
|
|
722
|
+
pathname === "/api/operator/v1/pi-plugins/install" ||
|
|
723
|
+
pathname === "/api/operator/v1/pi-plugins/uninstall") {
|
|
724
|
+
await handleConsoleOperatorRequest(req, res, operatorRouteContext(startup));
|
|
725
|
+
return;
|
|
726
|
+
}
|
|
598
727
|
// Unknown operator route: fail closed (never a startup-workspace proxy).
|
|
599
728
|
sendJson(res, 404, {
|
|
600
729
|
ok: false,
|
|
@@ -670,7 +799,11 @@ export async function createConsoleServer(options) {
|
|
|
670
799
|
}
|
|
671
800
|
}
|
|
672
801
|
workspaceContexts.clear();
|
|
802
|
+
registry.close();
|
|
673
803
|
server.close((err) => (err ? closeReject(err) : closeResolve()));
|
|
804
|
+
// Workspace/event SSE responses are intentionally long-lived. Force them
|
|
805
|
+
// closed after initiating shutdown so Console close never hangs on a tab.
|
|
806
|
+
server.closeAllConnections();
|
|
674
807
|
}),
|
|
675
808
|
});
|
|
676
809
|
});
|
|
@@ -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-Ln30Pgrh.js";import{p as f}from"./chunk-JWPE2WC7-DAJt-qXB.js";import{_ as n,l as o}from"./mermaid.core-0TtMP8k4.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-CRacN1zK.js";import"./index-yASzcbBr.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-0TtMP8k4.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};
|