@tea-agent/loop-agent 0.42.0-next.9 → 0.42.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/CHANGELOG.md +111 -45
- package/dist/application/dag/run-dag.js +8 -2
- package/dist/application/evaluation/budget.js +19 -1
- package/dist/application/task-lifecycle/advance.js +26 -8
- package/dist/application/task-lifecycle/observe.js +43 -29
- package/dist/application/task-lifecycle/plan-transitions.js +5 -4
- package/dist/build-stamp.json +3 -3
- package/dist/cli/program.js +1 -1
- package/dist/commands/dag-rerun-task.js +2 -0
- package/dist/commands/task-source-prepare.js +3 -1
- package/dist/executors/dag-pi-executor.js +2584 -600
- package/dist/executors/pi-executor.js +22 -1
- package/dist/executors/pi-extension-resolver.js +14 -2
- package/dist/executors/pi-sdk-executor.js +140 -39
- package/dist/executors/shell-executor.js +135 -55
- package/dist/shared/dag-failure-category.js +6 -0
- package/dist/shared/frontend-execution-policy.js +23 -0
- package/dist/task/config-types.js +4 -0
- package/dist/task/contract/apply.js +36 -2
- package/dist/task/source-prepare/ledger-reconciliation.js +2 -2
- package/dist/task/source-prepare/ledger-review.js +6 -9
- package/dist/task/source-prepare/parse-intent.js +7 -0
- package/dist/task/source-prepare/semantic-intake.js +16 -26
- package/dist/task/source-prepare/source-fidelity-pi.js +28 -9
- package/dist/task/source-references.js +48 -23
- package/dist/worker/console/chat/assistant-content.js +23 -2
- package/dist/worker/console/chat/browser-policy.js +143 -0
- package/dist/worker/console/chat/browser-routes.js +148 -0
- package/dist/worker/console/chat/chat-event-store.js +4 -2
- package/dist/worker/console/chat/explore-tools.js +13 -0
- package/dist/worker/console/chat/pi-runtime.js +173 -94
- package/dist/worker/console/chat/resource-loader.js +4 -1
- package/dist/worker/console/chat/routes.js +208 -66
- package/dist/worker/console/chat/scm-routes.js +217 -0
- package/dist/worker/console/chat/scm-service.js +283 -0
- package/dist/worker/console/chat/scm-tools.js +111 -0
- package/dist/worker/console/chat/sdd-data-alignment.js +78 -11
- package/dist/worker/console/chat/session-catalog.js +32 -0
- package/dist/worker/console/chat/session-mode-view.js +48 -0
- package/dist/worker/console/chat/session-mode.js +218 -0
- package/dist/worker/console/chat/session-store.js +27 -7
- package/dist/worker/console/chat/shortcuts.js +6 -0
- package/dist/worker/console/chat/subagents/agent-tool.js +62 -0
- package/dist/worker/console/chat/subagents/explore-agent.js +169 -0
- package/dist/worker/console/chat/subagents/index.js +5 -0
- package/dist/worker/console/chat/subagents/orchestrator.js +273 -0
- package/dist/worker/console/chat/subagents/tool-policy.js +53 -0
- package/dist/worker/console/chat/subagents/types.js +13 -0
- package/dist/worker/console/chat/terminal-routes.js +216 -0
- package/dist/worker/console/chat/terminal-sessions.js +284 -0
- package/dist/worker/console/chat/terminal-tools.js +199 -0
- package/dist/worker/console/chat/tool-preview.js +21 -0
- package/dist/worker/console/chat/tools.js +13 -1
- package/dist/worker/console/chat/turn-process.js +1 -0
- package/dist/worker/console/interview/tools.js +1 -0
- package/dist/worker/console/server.js +2 -28
- package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-C6n9_m0P.js → abnfDiagram-N423BO3Z-C9eI7nEo.js} +1 -1
- package/dist/worker/console/static/assets/{arc-DQh-IfZ1.js → arc-VJWsxWhB.js} +1 -1
- package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-54NnrwUC.js → architectureDiagram-T3A2C74G-BGcyiMSo.js} +1 -1
- package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-pivRALGK.js → blockDiagram-VBNYF7ZC-BScnFwyi.js} +1 -1
- package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-BR7OV2NJ.js → c4Diagram-5PPSVZJV-Bl9_BsLi.js} +1 -1
- package/dist/worker/console/static/assets/channel-B6sQYuOE.js +1 -0
- package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-B1Aq6BcK.js → chunk-2GRJ4B5K-F1uKxiUt.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-CbdU0rjo.js → chunk-2Q5K7J3B-rSRMynVu.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5RXB4S5H-Dqi2GJeD.js → chunk-5RXB4S5H-DAsJm1WD.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-5VM5RSS4-BYn1Hu4R.js → chunk-5VM5RSS4-DQIdVI0a.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-DRLjDL0k.js → chunk-6Q2QTUOP-4A_8rJ-Q.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-GF5L2VYU-CY9Xx2jV.js → chunk-GF5L2VYU-BHnT-vjh.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-JWPE2WC7-BNCZs7_z.js → chunk-JWPE2WC7-Rq7QKBkn.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-KBJHAD2P-DZ8AStLL.js → chunk-KBJHAD2P-BXh-AI2u.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-RYQCIY6F-DsxjYrzz.js → chunk-RYQCIY6F-BblcLy8m.js} +1 -1
- package/dist/worker/console/static/assets/{chunk-XXDRQBXY-Ddx1KC1l.js → chunk-XXDRQBXY-zHZmVnB6.js} +1 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-Z6s5QoeI.js +1 -0
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-Z6s5QoeI.js +1 -0
- package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-W9TveCnK.js → cose-bilkent-JH36ORCC-Cmwz0Wi4.js} +1 -1
- package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-l9j_ztZH.js → cynefin-VYW2F7L2-Dq76MHQU.js} +1 -1
- package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-BMJMKi4G.js → cynefinDiagram-MW4NZA55-zPahV1fM.js} +1 -1
- package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-Bb4mG9pH.js → dagre-VZM6K2ZE-DQJ3xPc_.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-7IWD3JNH-BMgL_Qv0.js → diagram-7IWD3JNH-BwX7u6fv.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-Bvo2T4OQ.js → diagram-B4RE2ZJO-CodnDCco.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-LBJQPF4R-_5kWRN9c.js → diagram-LBJQPF4R-gAjtWkxG.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-Q27KOJAE-DqdMrltM.js → diagram-Q27KOJAE-CGCqz0cS.js} +1 -1
- package/dist/worker/console/static/assets/{diagram-UB23O5K3-CDDYsNkp.js → diagram-UB23O5K3-RHwYEywd.js} +1 -1
- package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-c4nfnZUV.js → ebnfDiagram-BXEA7PRR-B6seb_p_.js} +1 -1
- package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-DnkUcNMs.js → erDiagram-JOGREHBK-CmwCKYe8.js} +1 -1
- package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-Dz0KGLZE.js → flowDiagram-UKHOOZJN-BfNsaZ0V.js} +1 -1
- package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-Cj1t1uka.js → ganttDiagram-PKOTCBZU-zmYgi_Z3.js} +1 -1
- package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-tp2FrBHd.js → gitGraphDiagram-DS77QQ5N-BDEzzSKF.js} +1 -1
- package/dist/worker/console/static/assets/index-DgenUAfc.js +468 -0
- package/dist/worker/console/static/assets/index-aF4u-Y__.css +1 -0
- package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-DQwJS8DH.js → infoDiagram-6WML65LV-DeSz8l42.js} +1 -1
- package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-eimCQWD4.js → ishikawaDiagram-WSZJBQD7-B1LV29aH.js} +1 -1
- package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-Dd9Gbwgv.js → journeyDiagram-NVQOT4AX-CCw4W2oU.js} +1 -1
- package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-Qve3cyft.js → kanban-definition-27J2QSJJ-BozaMoRJ.js} +1 -1
- package/dist/worker/console/static/assets/{linear-UXKSe36Z.js → linear-G1JR40SX.js} +1 -1
- package/dist/worker/console/static/assets/{mermaid.core-CWhj4JXN.js → mermaid.core-CCgPF0oA.js} +5 -5
- package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-yTcwf4SJ.js → mindmap-definition-FAOFIHXS-CEqnCHnD.js} +1 -1
- package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-_7qToaZP.js → pegDiagram-VL7TDLO6-DpmQPKuI.js} +1 -1
- package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-CXmrKmDm.js → pieDiagram-7S7Q4E2Y-BP501AxR.js} +1 -1
- package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-hMmrJyaS.js → quadrantDiagram-CIZ2JOQS-D1dBhl_A.js} +1 -1
- package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-BXw8tCBe.js → railroadDiagram-AXF67PYL-DgZDS5pY.js} +1 -1
- package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-BmjgnLZl.js → requirementDiagram-LRYGKXZP-BzB3pyIq.js} +1 -1
- package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-Bj77SPpN.js → sankeyDiagram-W5VNT64P-B9ZprFFP.js} +1 -1
- package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-B2FDVysL.js → sequenceDiagram-SI44F4Z6-CC2-_XrA.js} +1 -1
- package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-UChNY9ZZ.js → sizeCapture-X5ZJPWSS-UVtAUqgB.js} +1 -1
- package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-wbAEkbd7.js → stateDiagram-OKZ733FA-CWcS5JYG.js} +1 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-BooX8u1Q.js +1 -0
- package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-DCEkU8HR.js → swimlanes-SLNWSIFB-C4p-dn06.js} +2 -2
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-D64_eqqE.js +8 -0
- package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-BGp7H06U.js → timeline-definition-Z64GVDOM-Dnz52OHX.js} +1 -1
- package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-DsCIQuWR.js → vennDiagram-T6HMQDX7-CzTE0Nfu.js} +1 -1
- package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-cRZLP4Xe.js → wardleyDiagram-T6FBY63Y-NAR9cjQQ.js} +1 -1
- package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-CP0xLR9Y.js → xychartDiagram-ELKLHX3M-DVMk8413.js} +1 -1
- package/dist/worker/console/static/index.html +2 -2
- package/dist/worker/console/static-src/chat-view-types.js +1 -1
- package/dist/worker/console/static-src/operator-chat/chat-link.js +94 -0
- package/dist/worker/console/static-src/operator-chat/chat-sse-events.js +142 -7
- package/dist/worker/console/static-src/operator-chat/pending-user-message.js +44 -0
- package/dist/worker/console/static-src/operator-chat/process-label.js +41 -0
- package/dist/worker/console/static-src/operator-chat/tools-catalog.js +21 -2
- package/dist/worker/console/static-src/operator-chat/turn-group-equality.js +13 -0
- package/dist/worker/console/static-src/operator-chat/turn-stream-controller.js +2 -0
- package/dist/worker/console/static-src/operator-chat/use-searchable-hidden.js +51 -0
- package/dist/worker/console/static-src/operator-chat/useChatSessions.js +33 -18
- package/dist/worker/console/static-src/operator-chat/useChatStream.js +48 -16
- package/dist/worker/console/static-src/operator-chat/useChatThread.js +170 -7
- package/dist/worker/console/static-src/operator-chat/useComposer.js +13 -7
- package/dist/worker/console/static-src/operator-chat/user-turn-anchor-equality.js +21 -0
- package/dist/worker/console/static-src/shell/workspace-route.js +4 -0
- package/dist/worker/console/workspace-context.js +15 -1
- package/dist/worker/observe/node-transparency.js +81 -72
- package/dist/worker/observe/routes.js +20 -1
- package/dist/worker/observe/static/constants.js +22 -22
- package/dist/worker/observe/static/dag-context-reason-labels.js +19 -0
- package/dist/worker/observe/static/dag-history-labels.js +1 -0
- package/dist/worker/observe/static/dag-inspector-humanize.d.ts +16 -0
- package/dist/worker/observe/static/dag-inspector-humanize.js +342 -0
- package/dist/worker/observe/static/dag-node-purpose.js +10 -10
- package/dist/worker/observe/static/dom.js +20 -1
- package/dist/worker/observe/static/format-pool.d.ts +2 -0
- package/dist/worker/observe/static/format-pool.js +6 -0
- package/dist/worker/observe/static/format.js +7 -0
- package/dist/worker/observe/static/index.html +4 -4
- package/dist/worker/observe/static/inspect-workspace.js +34 -7
- package/dist/worker/observe/static/inspector-submission.js +32 -0
- package/dist/worker/observe/static/kpi.js +1 -0
- package/dist/worker/observe/static/prompt-restart-candidates.js +4 -2
- package/dist/worker/observe/static/relations.js +7 -5
- package/dist/worker/observe/static/router.js +13 -0
- package/dist/worker/observe/static/run-processing.js +2 -0
- package/dist/worker/observe/static/shell-chrome.js +36 -3
- package/dist/worker/observe/static/state.js +35 -2
- package/dist/worker/observe/static/styles.css +431 -39
- package/dist/worker/observe/static/task-failure-labels.d.ts +4 -0
- package/dist/worker/observe/static/task-failure-labels.js +67 -0
- package/dist/worker/observe/static/task-history.js +12 -0
- package/dist/worker/observe/static/views/batch.js +6 -13
- package/dist/worker/observe/static/views/dag-graph.js +51 -4
- package/dist/worker/observe/static/views/dag-inspector.js +1069 -426
- package/dist/worker/observe/static/views/dag-trajectory.js +3 -0
- package/dist/worker/observe/static/views/dag.d.ts +6 -0
- package/dist/worker/observe/static/views/dag.js +64 -22
- package/dist/worker/observe/static/views/dags.js +2 -0
- package/dist/worker/observe/static/views/dashboard.js +21 -12
- package/dist/worker/observe/static/views/failures.js +21 -11
- package/dist/worker/observe/static/views/feature.js +11 -29
- package/dist/worker/observe/static/views/pool.js +37 -28
- package/dist/worker/observe/static/views/run.js +48 -5
- package/dist/worker/observe/static/views/session-timeline.js +194 -243
- package/dist/worker/observe/static/views/task.js +81 -62
- package/dist/workflows/dag/backend-test-plan-protocol.js +104 -0
- package/dist/workflows/dag/budget-enforcement.js +53 -3
- package/dist/workflows/dag/dag-retry-schema.js +3 -0
- package/dist/workflows/dag/frontend-capacity.js +9 -0
- package/dist/workflows/dag/frontend-contract-facts.js +130 -0
- package/dist/workflows/dag/frontend-design-policy.js +103 -17
- package/dist/workflows/dag/frontend-durable-tools.js +193 -0
- package/dist/workflows/dag/frontend-execution-groups.js +24 -0
- package/dist/workflows/dag/frontend-implementation-contract.js +423 -41
- package/dist/workflows/dag/frontend-input-projection.js +76 -0
- package/dist/workflows/dag/frontend-plan-completeness.js +186 -0
- package/dist/workflows/dag/frontend-plan-recovery-policy.js +18 -0
- package/dist/workflows/dag/frontend-plan-render.js +21 -3
- package/dist/workflows/dag/frontend-prewrite-gate.js +1 -1
- package/dist/workflows/dag/frontend-recovery-controller.js +32 -8
- package/dist/workflows/dag/frontend-recovery-lineage.js +13 -0
- package/dist/workflows/dag/frontend-recovery-plan.js +4 -1
- package/dist/workflows/dag/frontend-recovery-run.js +146 -16
- package/dist/workflows/dag/frontend-review-scopes.js +139 -0
- package/dist/workflows/dag/frontend-risk.js +2 -0
- package/dist/workflows/dag/frontend-session-budget.js +249 -0
- package/dist/workflows/dag/frontend-shadow-dual-write.js +37 -3
- package/dist/workflows/dag/frontend-shape-facts.js +12 -2
- package/dist/workflows/dag/frontend-shape.js +46 -7
- package/dist/workflows/dag/frontend-test-execution-evidence.js +49 -0
- package/dist/workflows/dag/frontend-typed-event-store.js +14 -0
- package/dist/workflows/dag/frontend-verification-trace.js +38 -4
- package/dist/workflows/dag/frontend-writer-admission.js +2 -2
- package/dist/workflows/dag/init-hybrid.js +70 -35
- package/dist/workflows/dag/node-execution.js +225 -226
- package/dist/workflows/dag/prompt.js +4 -0
- package/dist/workflows/dag/recovery-lease.js +106 -16
- package/dist/workflows/dag/rerun-feedback.js +1 -0
- package/dist/workflows/dag/rerun-plan.js +96 -4
- package/dist/workflows/dag/rerun-run.js +28 -6
- package/dist/workflows/dag/rerun-task.js +221 -18
- package/dist/workflows/dag/retry-policy.js +27 -10
- package/dist/workflows/dag/runner-exit-diagnostics.js +125 -0
- package/dist/workflows/dag/runner.js +246 -19
- package/dist/workflows/dag/structured-output-repair.js +4 -1
- package/dist/workflows/dag/types.js +10 -3
- package/dist/workflows/dag/validate.js +10 -8
- package/dist/workflows/dag/workspace-checkpoint.js +66 -0
- package/docs/operations/README.md +2 -0
- package/docs/templates/agent-dag.schema.json +2 -2
- package/docs/templates/backend-test-dag.json +6 -4
- package/docs/templates/frontend-design-contract.md +4 -4
- package/docs/templates/frontend-implementation-contract.schema.json +68 -4
- package/docs/templates/frontend-implementation-dag.json +5 -5
- package/harness.json +1 -1
- package/package.json +8 -6
- package/skills/frontend-contract/SKILL.md +2 -1
- package/skills/frontend-contract/references/contract-protocol.md +19 -3
- package/skills/frontend-design-review/SKILL.md +12 -11
- package/skills/frontend-plan/SKILL.md +22 -2
- package/skills/frontend-plan/references/decision-contract.md +114 -5
- package/skills/frontend-plan/references/design-decisions.md +32 -0
- package/skills/frontend-review/SKILL.md +10 -11
- package/skills/frontend-scout/references/scout-evidence.md +4 -0
- package/dist/worker/console/static/assets/channel-DsZxrgqe.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-CuToPeGV.js +0 -1
- package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-CuToPeGV.js +0 -1
- package/dist/worker/console/static/assets/index-D9Sc0f0y.js +0 -449
- package/dist/worker/console/static/assets/index-DDQc5a50.css +0 -1
- package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-yPoT19ft.js +0 -1
- package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-VWdarchG.js +0 -8
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operator Chat — model-facing persistent terminal tools (DSH-style).
|
|
3
|
+
*
|
|
4
|
+
* Registers `terminal` (single tool managing named persistent shells) so the
|
|
5
|
+
* model can run commands in a REAL persistent PTY: cwd, env vars, activated
|
|
6
|
+
* virtualenvs and background jobs survive across calls, exactly like the DSH
|
|
7
|
+
* persistent bash/pwsh tools.
|
|
8
|
+
*
|
|
9
|
+
* Protocol (completion-marker, same idea as DSH):
|
|
10
|
+
* 1. tool writes `command + unique echo marker + newline`
|
|
11
|
+
* 2. waits until the marker line appears in PTY output
|
|
12
|
+
* 3. returns output captured since the send (bounded), plus exit-code echo
|
|
13
|
+
*
|
|
14
|
+
* Lifecycle: shells are owned by the chat session id; `terminal_list`,
|
|
15
|
+
* `terminal_kill` manage them. Console UI can attach to the same PTYs via the
|
|
16
|
+
* terminal HTTP API (same registry).
|
|
17
|
+
*/
|
|
18
|
+
import { TerminalSessionError, availableShellKinds, } from "./terminal-sessions.js";
|
|
19
|
+
const MAX_OUTPUT_CHARS = 16_000;
|
|
20
|
+
const DEFAULT_TIMEOUT_MS = 120_000;
|
|
21
|
+
const MARKER_PREFIX = "__DSH_TERM_DONE_";
|
|
22
|
+
const TOOL_DESCRIPTION = "Run commands in a persistent terminal (real PTY). State survives across calls: cwd, env vars, activated environments, functions, and background jobs. " +
|
|
23
|
+
"Actions: 'run' executes a command in the owner's shell of the given kind (auto-creates on first use, reuses afterwards; avoid interactive commands that wait for stdin); " +
|
|
24
|
+
"'list' shows active shells; 'kill' stops one. Prefer this over one-shot bash for multi-step work needing shared state (build → test → inspect) or long-running dev servers. " +
|
|
25
|
+
"Output is bounded; long output keeps the earliest readable prefix. On timeout the command output so far is returned (the shell keeps running — use 'kill' or run an interrupt to stop it). " +
|
|
26
|
+
"The shell parameter accepts only kinds available on the host platform.";
|
|
27
|
+
export async function buildPersistentTerminalTools(deps) {
|
|
28
|
+
const [{ Type }, { defineTool }] = await Promise.all([
|
|
29
|
+
import("typebox"),
|
|
30
|
+
import("@earendil-works/pi-coding-agent"),
|
|
31
|
+
]);
|
|
32
|
+
/** Resolve the owner's shell for a kind, spawning on first use. */
|
|
33
|
+
const ensureShell = (kind, cwd) => {
|
|
34
|
+
const existing = deps.registry
|
|
35
|
+
.list(deps.ownerSessionId)
|
|
36
|
+
.find((s) => s.shell === kind && !s.exited);
|
|
37
|
+
if (existing)
|
|
38
|
+
return existing;
|
|
39
|
+
return deps.registry.spawn({
|
|
40
|
+
ownerSessionId: deps.ownerSessionId,
|
|
41
|
+
name: kind,
|
|
42
|
+
shell: kind,
|
|
43
|
+
cwd: cwd ?? deps.defaultCwd ?? process.cwd(),
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
const runInShell = async (kind, command, timeoutMs) => {
|
|
47
|
+
const shellInfo = ensureShell(kind);
|
|
48
|
+
const marker = `${MARKER_PREFIX}${Date.now().toString(36)}${Math.random()
|
|
49
|
+
.toString(36)
|
|
50
|
+
.slice(2, 8)}`;
|
|
51
|
+
// Exit-code echo: PowerShell uses $LASTEXITCODE; bash/zsh use $?.
|
|
52
|
+
const exitEcho = kind === "powershell"
|
|
53
|
+
? `Write-Host "${marker}:$LASTEXITCODE"`
|
|
54
|
+
: `echo "${marker}:$?"`;
|
|
55
|
+
const wrapped = `${command}\n${exitEcho}\n`;
|
|
56
|
+
// Capture output from the moment of send until the marker line shows up.
|
|
57
|
+
const pending = [];
|
|
58
|
+
let settled = false;
|
|
59
|
+
const unsubscribe = deps.registry.subscribe(shellInfo.sessionId, (chunk) => {
|
|
60
|
+
pending.push(chunk);
|
|
61
|
+
});
|
|
62
|
+
// Drain anything already in the ring buffer boundary: we only want output
|
|
63
|
+
// produced after this send, so snapshot totalOutputChars first.
|
|
64
|
+
const startTotal = deps.registry.get(shellInfo.sessionId).totalOutputChars;
|
|
65
|
+
// Re-read after subscribing; chunks between snapshot and send are benign
|
|
66
|
+
// (they precede the marker) and get filtered by the marker search below.
|
|
67
|
+
let captured = "";
|
|
68
|
+
const collect = () => {
|
|
69
|
+
captured = pending.join("");
|
|
70
|
+
};
|
|
71
|
+
try {
|
|
72
|
+
deps.registry.send(shellInfo.sessionId, wrapped);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
unsubscribe();
|
|
76
|
+
return `error: ${error instanceof TerminalSessionError
|
|
77
|
+
? `${error.code} ${error.message}`
|
|
78
|
+
: error instanceof Error
|
|
79
|
+
? error.message
|
|
80
|
+
: String(error)}`;
|
|
81
|
+
}
|
|
82
|
+
const deadline = Date.now() + timeoutMs;
|
|
83
|
+
const markerRe = new RegExp(`${marker}:(\\d+)\\s*(${"\\r"}|\\n|$)`);
|
|
84
|
+
let exitCode;
|
|
85
|
+
return await new Promise((resolve) => {
|
|
86
|
+
const poll = () => {
|
|
87
|
+
collect();
|
|
88
|
+
const text = pending.join("");
|
|
89
|
+
const match = markerRe.exec(text);
|
|
90
|
+
if (match) {
|
|
91
|
+
settled = true;
|
|
92
|
+
exitCode = Number(match[1]);
|
|
93
|
+
// Output up to the start of the marker line.
|
|
94
|
+
const output = text.slice(0, match.index);
|
|
95
|
+
finish(output);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (Date.now() > deadline) {
|
|
99
|
+
settled = true;
|
|
100
|
+
finish(text, true);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
setTimeout(poll, 120);
|
|
104
|
+
};
|
|
105
|
+
const finish = (output, timedOut = false) => {
|
|
106
|
+
unsubscribe();
|
|
107
|
+
let result = stripAnsi(output).trimEnd();
|
|
108
|
+
if (result.length > MAX_OUTPUT_CHARS) {
|
|
109
|
+
result =
|
|
110
|
+
result.slice(0, MAX_OUTPUT_CHARS) +
|
|
111
|
+
`\n…[truncated ${result.length - MAX_OUTPUT_CHARS} chars]`;
|
|
112
|
+
}
|
|
113
|
+
if (exitCode !== undefined && exitCode !== 0) {
|
|
114
|
+
result += `\n[exit code: ${exitCode}]`;
|
|
115
|
+
}
|
|
116
|
+
if (timedOut) {
|
|
117
|
+
result += `\n[timeout after ${timeoutMs}ms — shell still running; output may be partial]`;
|
|
118
|
+
}
|
|
119
|
+
resolve(result || "(no output)");
|
|
120
|
+
};
|
|
121
|
+
poll();
|
|
122
|
+
});
|
|
123
|
+
};
|
|
124
|
+
const kinds = availableShellKinds().kinds;
|
|
125
|
+
const defaultKind = kinds.includes("bash")
|
|
126
|
+
? "bash"
|
|
127
|
+
: kinds.includes("zsh")
|
|
128
|
+
? "zsh"
|
|
129
|
+
: "powershell";
|
|
130
|
+
const kindLabels = {
|
|
131
|
+
powershell: "PowerShell",
|
|
132
|
+
bash: "bash",
|
|
133
|
+
zsh: "zsh",
|
|
134
|
+
};
|
|
135
|
+
const tool = defineTool({
|
|
136
|
+
name: "terminal",
|
|
137
|
+
label: "Terminal",
|
|
138
|
+
description: TOOL_DESCRIPTION,
|
|
139
|
+
promptSnippet: `terminal: persistent PTY shells (${kinds.join(" + ")}). State (cwd/env/jobs) survives across calls. Actions: run / list / kill.`,
|
|
140
|
+
parameters: Type.Object({
|
|
141
|
+
action: Type.Union([Type.Literal("run"), Type.Literal("list"), Type.Literal("kill")], {
|
|
142
|
+
description: "run = execute command; list = active shells; kill = stop a shell",
|
|
143
|
+
}),
|
|
144
|
+
command: Type.Optional(Type.String({ description: "Command for action=run (no trailing newline)." })),
|
|
145
|
+
shell: Type.Optional(Type.Union(kinds.map((k) => Type.Literal(k)), {
|
|
146
|
+
description: `Shell kind for action=run (available on this platform: ${kinds.map((k) => kindLabels[k]).join(", ")}). Default ${kindLabels[defaultKind]}.`,
|
|
147
|
+
})),
|
|
148
|
+
sessionId: Type.Optional(Type.String({ description: "Terminal session id for action=kill." })),
|
|
149
|
+
timeoutMs: Type.Optional(Type.Number({ description: "Wall-clock limit for action=run. Default 120000." })),
|
|
150
|
+
}, { additionalProperties: false }),
|
|
151
|
+
async execute(_toolCallId, params, signal) {
|
|
152
|
+
const action = params.action;
|
|
153
|
+
try {
|
|
154
|
+
if (action === "list") {
|
|
155
|
+
const shells = deps.registry.list(deps.ownerSessionId);
|
|
156
|
+
return text(JSON.stringify(shells.map(({ sessionId, shell, name, exited, exitCode, createdAt }) => ({
|
|
157
|
+
sessionId,
|
|
158
|
+
shell,
|
|
159
|
+
name,
|
|
160
|
+
exited,
|
|
161
|
+
...(exitCode !== undefined ? { exitCode } : {}),
|
|
162
|
+
createdAt,
|
|
163
|
+
})), null, 2));
|
|
164
|
+
}
|
|
165
|
+
if (action === "kill") {
|
|
166
|
+
if (!params.sessionId)
|
|
167
|
+
return text(`error: sessionId required for kill`);
|
|
168
|
+
const info = deps.registry.list(deps.ownerSessionId).find((s) => s.sessionId === params.sessionId);
|
|
169
|
+
if (!info)
|
|
170
|
+
return text(`error: no terminal ${params.sessionId} owned by this chat session`);
|
|
171
|
+
await deps.registry.kill(params.sessionId);
|
|
172
|
+
return text(`terminal ${params.sessionId} stopped`);
|
|
173
|
+
}
|
|
174
|
+
// action === "run"
|
|
175
|
+
const command = (params.command ?? "").trim();
|
|
176
|
+
if (!command)
|
|
177
|
+
return text("error: command required for action=run");
|
|
178
|
+
const kind = kinds.includes(params.shell)
|
|
179
|
+
? params.shell
|
|
180
|
+
: defaultKind;
|
|
181
|
+
const timeoutMs = Math.min(Math.max(params.timeoutMs ?? DEFAULT_TIMEOUT_MS, 1_000), 600_000);
|
|
182
|
+
const output = await runInShell(kind, command, timeoutMs);
|
|
183
|
+
return text(output);
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
return text(`error: ${error instanceof Error ? error.message : String(error)}`);
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
});
|
|
190
|
+
return [tool];
|
|
191
|
+
}
|
|
192
|
+
function text(body) {
|
|
193
|
+
return { content: [{ type: "text", text: body }], details: { output: body } };
|
|
194
|
+
}
|
|
195
|
+
/** Minimal ANSI escape stripper for tool-result readability. */
|
|
196
|
+
export function stripAnsi(input) {
|
|
197
|
+
// eslint-disable-next-line no-control-regex
|
|
198
|
+
return input.replace(/\u001b\[[0-9;?]*[A-Za-z]/g, "");
|
|
199
|
+
}
|
|
@@ -93,6 +93,13 @@ function adapterPreview(toolName, input, maxLen) {
|
|
|
93
93
|
const query = fieldString(input, "query") ?? fieldString(input, "symbol");
|
|
94
94
|
return query ? clampOneLine(query, maxLen) : undefined;
|
|
95
95
|
}
|
|
96
|
+
if (name === "agent") {
|
|
97
|
+
const description = fieldString(input, "description");
|
|
98
|
+
const subagent = fieldString(input, "subagent_type") ?? "Explore";
|
|
99
|
+
if (description)
|
|
100
|
+
return clampOneLine(`${subagent} · ${description}`, maxLen);
|
|
101
|
+
return clampOneLine(subagent, maxLen);
|
|
102
|
+
}
|
|
96
103
|
if (name === "read" ||
|
|
97
104
|
name === "read_symbol" ||
|
|
98
105
|
name === "read_enclosing" ||
|
|
@@ -181,8 +188,22 @@ export function getToolPresentation(toolName) {
|
|
|
181
188
|
if (name === "mcp" || name.startsWith("mcp_") || name.includes("__")) {
|
|
182
189
|
return { kind: "mcp", label: name === "mcp" ? "MCP" : raw };
|
|
183
190
|
}
|
|
191
|
+
if (name === "agent") {
|
|
192
|
+
return { kind: "search", label: "Explore" };
|
|
193
|
+
}
|
|
184
194
|
return { kind: "tool", label: raw };
|
|
185
195
|
}
|
|
196
|
+
/** A tool call that failed on its own. A call interrupted by Stop carries
|
|
197
|
+
* `interrupted: true` and must never render (or count) as a failure — every
|
|
198
|
+
* error affordance goes through this single predicate (2026-09-08). */
|
|
199
|
+
export function isToolFailure(entry) {
|
|
200
|
+
return entry.status === "error" && entry.interrupted !== true;
|
|
201
|
+
}
|
|
202
|
+
/** Built-in subagent delegations surface as the `Agent` tool. DSH counts them
|
|
203
|
+
* in a separate「N 个 subagent」bucket instead of the tool-call bucket. */
|
|
204
|
+
export function isSubagentTool(toolName) {
|
|
205
|
+
return (toolName ?? "").trim().toLowerCase() === "agent";
|
|
206
|
+
}
|
|
186
207
|
/** Section labels for ToolCard expand body. */
|
|
187
208
|
export function getToolSectionLabels(toolName) {
|
|
188
209
|
const name = (toolName ?? "").toLowerCase();
|
|
@@ -18,7 +18,14 @@
|
|
|
18
18
|
import { buildOperatorCapabilitiesDocument } from "../../../shared/operator/capabilities.js";
|
|
19
19
|
import { OFFICIAL_DENIED_TOOL_IDS } from "../resource-loader.js";
|
|
20
20
|
import { EXECUTABLE_GATE_ONLY_ACTIONS } from "./tool-adapter.js";
|
|
21
|
+
import { OPERATOR_CHAT_AGENT_TOOL_NAME } from "./subagents/types.js";
|
|
21
22
|
const EXECUTABLE_GATE_ONLY = new Set(EXECUTABLE_GATE_ONLY_ACTIONS);
|
|
23
|
+
/** Built-in Chat custom tools that are not operator registry actions. */
|
|
24
|
+
export const OPERATOR_CHAT_BUILTIN_CUSTOM_TOOLS = Object.freeze([
|
|
25
|
+
OPERATOR_CHAT_AGENT_TOOL_NAME,
|
|
26
|
+
"terminal",
|
|
27
|
+
"scm",
|
|
28
|
+
]);
|
|
22
29
|
/**
|
|
23
30
|
* Actions the model MAY invoke. Derived from the registry but filtered by the
|
|
24
31
|
* modelCallable policy: modelCallable="never" actions (e.g. confirmDagConfirmation)
|
|
@@ -90,17 +97,22 @@ const DENIED_ACTIONS = new Set(OPERATOR_CHAT_DENIED_OPERATOR_ACTIONS.map((a) =>
|
|
|
90
97
|
const DENIED_TOOLS = new Set(OPERATOR_CHAT_DENIED_TOOLS.map((t) => t.toLowerCase()));
|
|
91
98
|
/** Pi builtins are authorized without being operator registry actions. */
|
|
92
99
|
const PI_BUILTIN_AUTHORIZED = new Set(OPERATOR_CHAT_PI_BUILTIN_TOOLS.map((t) => t.toLowerCase()));
|
|
100
|
+
const BUILTIN_CUSTOM_AUTHORIZED = new Set(OPERATOR_CHAT_BUILTIN_CUSTOM_TOOLS.map((t) => t.toLowerCase()));
|
|
93
101
|
export function isOperatorChatToolAllowed(toolId) {
|
|
94
102
|
const id = toolId.trim().toLowerCase();
|
|
95
103
|
if (PI_BUILTIN_AUTHORIZED.has(id))
|
|
96
104
|
return true;
|
|
105
|
+
if (BUILTIN_CUSTOM_AUTHORIZED.has(id))
|
|
106
|
+
return true;
|
|
97
107
|
return ALLOWED.has(id);
|
|
98
108
|
}
|
|
99
109
|
export function isOperatorChatToolDenied(toolId) {
|
|
100
110
|
const id = toolId.trim().toLowerCase();
|
|
101
|
-
// Pi builtins are never denied under ADR 0011.
|
|
111
|
+
// Pi builtins and built-in Chat custom tools are never denied under ADR 0011 / 0022.
|
|
102
112
|
if (PI_BUILTIN_AUTHORIZED.has(id))
|
|
103
113
|
return false;
|
|
114
|
+
if (BUILTIN_CUSTOM_AUTHORIZED.has(id))
|
|
115
|
+
return false;
|
|
104
116
|
if (DENIED_TOOLS.has(id))
|
|
105
117
|
return true;
|
|
106
118
|
if (DENIED_ACTIONS.has(id))
|
|
@@ -41,6 +41,7 @@ export function hydrateSessionThread(raw) {
|
|
|
41
41
|
role: "user",
|
|
42
42
|
text: item.text,
|
|
43
43
|
createdAt,
|
|
44
|
+
...(item.clientRequestId ? { clientRequestId: item.clientRequestId } : {}),
|
|
44
45
|
...(item.eventSeq === undefined ? {} : { eventSeq: item.eventSeq }),
|
|
45
46
|
...(item.turnId ? { turnId: item.turnId } : {}),
|
|
46
47
|
});
|
|
@@ -33,6 +33,7 @@ export const INTERVIEW_DENIED_TOOLS = Object.freeze([
|
|
|
33
33
|
"importPrd",
|
|
34
34
|
"newTask",
|
|
35
35
|
"contractAdopt",
|
|
36
|
+
"Agent",
|
|
36
37
|
]);
|
|
37
38
|
const ALLOWED = new Set(INTERVIEW_ALLOWED_TOOLS.map((t) => t.toLowerCase()));
|
|
38
39
|
const DENIED = new Set(INTERVIEW_DENIED_TOOLS.map((t) => t.toLowerCase()));
|
|
@@ -9,7 +9,7 @@ import { DAG_ABSOLUTE_MAX_WALL_CLOCK_MS } from "../../shared/timeout-policy.js";
|
|
|
9
9
|
import { openConsoleAppData } from "../../infrastructure/console/app-data.js";
|
|
10
10
|
import { isLoopbackHost } from "./loopback.js";
|
|
11
11
|
import { ChatSessionStore } from "./chat/session-store.js";
|
|
12
|
-
import { ChatSessionCatalog } from "./chat/session-catalog.js";
|
|
12
|
+
import { ChatSessionCatalog, projectChatSessionCatalogListItem, } from "./chat/session-catalog.js";
|
|
13
13
|
import { matchRepoHtmlPreviewRoute } from "./chat/repo-browser.js";
|
|
14
14
|
import { handleConsoleHealthRequest, handleWorkspaceRoutes, sendJson, serveConsoleStatic, } from "./routes.js";
|
|
15
15
|
import { issueBootCapabilityToken, injectConfirmationTokenScript, } from "./security.js";
|
|
@@ -430,33 +430,7 @@ export async function createConsoleServer(options) {
|
|
|
430
430
|
.get(entry.workspaceId)
|
|
431
431
|
?.chatRouteDeps.events.getActiveTurn(entry.sessionId)
|
|
432
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
|
-
isBlank: entry.isBlank && !active,
|
|
459
|
-
};
|
|
433
|
+
return projectChatSessionCatalogListItem(entry, active);
|
|
460
434
|
});
|
|
461
435
|
sendJson(res, 200, {
|
|
462
436
|
ok: true,
|
|
@@ -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-4A_8rJ-Q.js";import{p as f}from"./chunk-JWPE2WC7-Rq7QKBkn.js";import{_ as n,l as o}from"./mermaid.core-CCgPF0oA.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-Dq76MHQU.js";import"./index-DgenUAfc.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-CCgPF0oA.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};
|