@kanyun-ai-infra/band-cli 0.1.1 → 0.2.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/bundled/examples/aitutor-tool/band/views/release/package.json +1 -1
- package/bundled/examples/aitutor-tool/band/views/tool-preview/package.json +1 -1
- package/bundled/examples/analysis/band/views/intake/package.json +1 -1
- package/bundled/examples/compliance/band/views/compliance/package.json +1 -1
- package/bundled/examples/content-review/band/views/checklist/package.json +1 -1
- package/bundled/examples/rush-site/band/views/rush-db/package.json +1 -1
- package/bundled/examples/rush-site/band/views/rush-deploy/package.json +1 -1
- package/bundled/examples/video/band/views/timeline/package.json +1 -1
- package/bundled/kernel/fixture.js +1 -1
- package/bundled/kernel/index.js +1 -1
- package/bundled/official/activity/package.json +4 -4
- package/bundled/official/approval/package.json +4 -4
- package/bundled/official/artifacts/package.json +4 -4
- package/bundled/official/chat/dist/index.js +1 -1
- package/bundled/official/chat/package.json +4 -4
- package/bundled/official/chunks/chunk-7XYETT7C.js +1 -0
- package/bundled/official/comment/dist/index.js +1 -1
- package/bundled/official/comment/package.json +4 -4
- package/bundled/official/header/package.json +4 -4
- package/bundled/official/home/dist/index.js +1 -1
- package/bundled/official/home/package.json +4 -4
- package/bundled/official/layouts/package.json +4 -4
- package/bundled/official/library/dist/index.js +1 -1
- package/bundled/official/library/package.json +4 -4
- package/bundled/official/members/dist/index.js +1 -1
- package/bundled/official/members/package.json +4 -4
- package/bundled/official/memory/package.json +4 -4
- package/bundled/official/native/package.json +2 -2
- package/bundled/official/params-form/package.json +4 -4
- package/bundled/official/plugins/package.json +4 -4
- package/bundled/official/project/dist/index.js +1 -1
- package/bundled/official/project/package.json +4 -4
- package/bundled/official/queue/package.json +4 -4
- package/bundled/official/settings/dist/index.js +1 -1
- package/bundled/official/settings/package.json +4 -4
- package/bundled/official/shell/dist/index.js +1 -1
- package/bundled/official/shell/package.json +4 -4
- package/bundled/official/stages/package.json +4 -4
- package/bundled/official/threads/dist/index.js +1 -1
- package/bundled/official/threads/package.json +4 -4
- package/bundled/official/turn-bar/package.json +4 -4
- package/bundled/official/turn-trace/package.json +4 -4
- package/bundled/official/version-switch/dist/index.js +1 -1
- package/bundled/official/version-switch/package.json +4 -4
- package/bundled/official/viewer-entity/package.json +2 -2
- package/bundled/official/viewer-external/package.json +2 -2
- package/bundled/official/viewer-image/package.json +2 -2
- package/bundled/official/viewer-media/package.json +2 -2
- package/bundled/official/viewer-storyboard/package.json +2 -2
- package/bundled/official/viewer-text/package.json +4 -4
- package/bundled/official/viewer-tool/package.json +2 -2
- package/bundled/official/viewer-web/package.json +2 -2
- package/bundled/official/viewer-web-app/package.json +2 -2
- package/bundled/official/workshops/dist/index.js +2 -2
- package/bundled/official/workshops/package.json +4 -4
- package/bundled/official/workshops/plugin.yaml +2 -2
- package/bundled/skills/band-plugin/references/code.md +2 -2
- package/bundled/skills/band-plugin/references/manifest.md +2 -2
- package/bundled/skills/band-plugin/references/rules.md +1 -0
- package/bundled/skills/band-plugin/references/testing-publish.md +1 -1
- package/bundled/skills/band-plugin/templates/panel/package.json +1 -1
- package/bundled/tokens/components.css +1 -1
- package/dev-host/app.tsx +32 -12
- package/dev-host/host.css +7 -0
- package/dist/bin.js +3 -3
- package/dist/build-plugin.d.ts +1 -1
- package/dist/build-plugin.js +1 -1
- package/dist/{chunk-VTAJX7NN.js → chunk-FGPWXAOA.js} +165 -26
- package/dist/{chunk-TQHHHXXU.js → chunk-LGYGWMSY.js} +18 -16
- package/dist/{chunk-JWZU3NOD.js → chunk-XPLYTHNX.js} +1 -1
- package/dist/{dev-server-SB5FMSVP.js → dev-server-IBR3PKDE.js} +33 -5
- package/dist/fixture.d.ts +11 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.js +3 -3
- package/dist/vite.d.ts +1 -1
- package/dist/vite.js +2 -2
- package/dist/{workshop-repo-Uq6blxyt.d.ts → workshop-repo-DqoVdcGu.d.ts} +9 -9
- package/package.json +10 -7
- package/src/dev-managers.ts +16 -0
- package/src/inspector-default.ts +9 -0
- package/bundled/official/chunks/chunk-SB74RUTN.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import"../../chunks/chunk-JFPQMFKF.js";import{ATTACHMENT_LIMITS as ATTACHMENT_LIMITS2,MESSAGE_REF_TEXT_MAX}from"@kanyun-ai-infra/band-contracts";import{FIRST_MESSAGE_MAX}from"@kanyun-ai-infra/band-contracts/api";import{AgentAvatar,ErrorNote as ErrorNote4,MemoryNote,Message,PromptInput as PromptInput2,STATUS_CHIP,StatusMessage,StopTurn,THREAD_EVENTS as THREAD_EVENTS4,TurnStopped,VersionReference,agentIn as agentIn2,agentLabel as agentLabel2,anchorLabel as anchorLabel3,createState,deletedProjectText,emptyDraft as emptyDraft3,errorText as errorText3,firstTurnEnd,hasContent as hasContent2,isThreadTail,memberName as memberName4,queueSlot,queuedMessages,quoteFace,reactMount as reactMount2,readComments,receiptFileNames,receiptFooter,roleLabel,shortTime as shortTime2,statusText,stoppedTurnText,threadConfirmation,toMessageExtras as toMessageExtras2,toast as toast3,turnStoppedOf,useCtxData as useCtxData6,useDraft,useMembers as useMembers5,useMessageList,useReactionPatches,useStateOf,useUnsavedGuard as useUnsavedGuard3,useVersionReferences,versionReferenceLabel,versionReferenceText,withImeGuard as withImeGuard7}from"@kanyun-ai-infra/band-plugin-react";import{definePlugin,defineScopeState as defineScopeState2}from"@kanyun-ai-infra/band-plugin-sdk";import{createContext,useContext,useEffect as useEffect7,useLayoutEffect as useLayoutEffect6,useRef as useRef8,useState as useState8,useSyncExternalStore as useSyncExternalStore7}from"react";import{createPortal as createPortal4}from"react-dom";import{THREAD_EVENTS as THREAD_EVENTS2,anchorLabel,memberName,useArtifactRole,useCtxData as useCtxData2,useMembers,withImeGuard as withImeGuard3}from"@kanyun-ai-infra/band-plugin-react";import{useEffect as useEffect3,useLayoutEffect as useLayoutEffect2,useRef as useRef4,useState as useState3,useSyncExternalStore as useSyncExternalStore3}from"react";import{createPortal}from"react-dom";import{shotAnchorOf}from"@kanyun-ai-infra/band-contracts";import{THREAD_EVENTS,useCtxData,withImeGuard as withImeGuard2}from"@kanyun-ai-infra/band-plugin-react";import{useCallback,useEffect as useEffect2,useMemo,useRef as useRef3,useState as useState2,useSyncExternalStore as useSyncExternalStore2}from"react";import{flushSync}from"react-dom";import{popoverLeft,withImeGuard}from"@kanyun-ai-infra/band-plugin-react";import{useLayoutEffect,useRef,useState,useSyncExternalStore}from"react";import{isNarrow}from"@kanyun-ai-infra/band-plugin-sdk";import{NARROW_QUERY}from"@kanyun-ai-infra/band-plugin-sdk";import{ANCHOR_PAYLOAD}from"@kanyun-ai-infra/band-contracts";import{defineScopeState}from"@kanyun-ai-infra/band-plugin-sdk";import{useEffect,useRef as useRef2}from"react";import{Fragment,jsx,jsxs}from"react/jsx-runtime";import{jsx as jsx2,jsxs as jsxs2}from"react/jsx-runtime";import{ErrorNote,THREAD_EVENTS as THREAD_EVENTS3,agentIn,agentLabel,errorText,filterByQuery,memberName as memberName2,mentionsIn,personalImportSources,toMessageExtras,toast,useCtxData as useCtxData3,useSlotEntries}from"@kanyun-ai-infra/band-plugin-react";import{ATTACHMENT_LIMITS}from"@kanyun-ai-infra/band-plugin-sdk";import{useMemo as useMemo2}from"react";import{jsx as jsx3,jsxs as jsxs3}from"react/jsx-runtime";import{withImeGuard as withImeGuard4}from"@kanyun-ai-infra/band-plugin-react";import{SHOT_LIST_PATH,checkAnchorChoice as checkAnchorChoice2,parseShotList}from"@kanyun-ai-infra/band-contracts";import{ErrorNote as ErrorNote2,emptyDraft as emptyDraft2,useCtxData as useCtxData4,useMembers as useMembers3,useUnsavedGuard as useUnsavedGuard2,withImeGuard as withImeGuard6}from"@kanyun-ai-infra/band-plugin-react";import{useEffect as useEffect6,useLayoutEffect as useLayoutEffect5,useMemo as useMemo4,useRef as useRef7,useState as useState6,useSyncExternalStore as useSyncExternalStore6}from"react";import{createPortal as createPortal3}from"react-dom";import{checkAnchorChoice}from"@kanyun-ai-infra/band-contracts";import{PromptInput,anchorLabel as anchorLabel2,emptyDraft,hasContent,useMembers as useMembers2,useUnsavedGuard,withImeGuard as withImeGuard5}from"@kanyun-ai-infra/band-plugin-react";import{useEffect as useEffect5,useLayoutEffect as useLayoutEffect4,useMemo as useMemo3,useRef as useRef6,useState as useState5,useSyncExternalStore as useSyncExternalStore5}from"react";import{useEffect as useEffect4,useLayoutEffect as useLayoutEffect3,useRef as useRef5,useState as useState4,useSyncExternalStore as useSyncExternalStore4}from"react";import{createPortal as createPortal2}from"react-dom";import{Fragment as Fragment2,jsx as jsx4,jsxs as jsxs4}from"react/jsx-runtime";import{jsx as jsx5,jsxs as jsxs5}from"react/jsx-runtime";import{jsx as jsx6,jsxs as jsxs6}from"react/jsx-runtime";import{ErrorNote as ErrorNote3,errorText as errorText2,memberName as memberName3,reactMount,shortTime,useCtxData as useCtxData5,useMembers as useMembers4}from"@kanyun-ai-infra/band-plugin-react";import{useState as useState7}from"react";import{Fragment as Fragment3,jsx as jsx7,jsxs as jsxs7}from"react/jsx-runtime";import{toast as toast2}from"@kanyun-ai-infra/band-plugin-react";import{Fragment as Fragment4,jsx as jsx8,jsxs as jsxs8}from"react/jsx-runtime";if(typeof document!=="undefined"&&document.head){const css='/* src/comment.css */\n.band-comment-pop {\n position: fixed;\n z-index: var(--layer-pop);\n top: 112px;\n right: 24px;\n left: auto;\n margin: 0;\n border: 0;\n color: var(--ink);\n max-height: calc(100vh - 136px);\n overflow: auto;\n overscroll-behavior: contain;\n}\n.band-comment-pop.pop textarea {\n max-height: max(3.2em, min(200px, 24vh));\n}\n:is(.band-comment-pop, .band-comment-inplace) .band-plugin-react-prompt-box.composer {\n box-shadow: none;\n}\n:is(.band-comment-pop, .band-comment-inplace) .band-plugin-react-prompt-bar.composer-bar {\n flex-wrap: wrap;\n row-gap: 4px;\n}\n:is(.band-comment-pop, .band-comment-inplace) .band-plugin-react-prompt-hint {\n order: 1;\n flex: 1 0 100%;\n display: block;\n padding: 0 2px;\n overflow: visible;\n text-overflow: clip;\n white-space: normal;\n}\n:is(.band-comment-pop, .band-comment-inplace) .band-plugin-react-prompt-submit {\n max-width: 100%;\n white-space: normal;\n overflow-wrap: anywhere;\n}\n@media (pointer: coarse), (max-width: 599px) {\n .band-comment-pop.pop {\n left: 8px;\n right: 8px;\n top: auto;\n bottom: 12px;\n width: auto;\n }\n}\n.band-comment-confirm {\n margin: auto;\n border: 0;\n color: var(--ink);\n width: min(420px, calc(100vw - 32px));\n}\n.band-comment-confirm::backdrop {\n background: var(--scrim);\n}\n.band-comment-note {\n font-size: var(--fs-dense);\n}\n.band-comment-code {\n font-family: var(--mono);\n font-size: 0.88em;\n}\n.band-comment-anchor {\n color: var(--muted);\n}\n.band-comment-actions {\n display: flex;\n justify-content: flex-end;\n gap: 6px;\n flex-wrap: wrap;\n}\n.band-comment-hint {\n font-size: var(--fs-dense);\n color: var(--muted);\n}\n.band-comment-chatbox {\n padding: 6px 0 4px;\n display: grid;\n gap: 8px;\n}\n.band-comment-restart {\n margin: 0;\n font-size: var(--fs-dense);\n color: var(--muted);\n}\n.band-comment-thread.thread {\n box-shadow: none;\n padding: 0;\n background: none;\n}\n.band-comment-sent {\n color: var(--muted);\n}\n.band-comment-who {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n font-size: var(--fs-meta);\n}\n.band-comment-original > .band-comment-who {\n grid-area: 1 / 1;\n align-self: center;\n padding-right: 100px;\n}\n.band-comment-original > .band-plugin-react-msg-bar {\n grid-area: 1 / 1;\n align-self: start;\n}\n@media (hover: none) {\n .band-comment-original > .band-comment-who {\n padding-right: 0;\n }\n}\n.band-comment-role {\n color: var(--muted);\n}\n.band-comment-text {\n font-size: var(--fs-row);\n}\n.band-comment-reply {\n font-size: var(--fs-ui);\n padding: 6px 10px;\n border-radius: 8px;\n background: var(--sunk);\n}\n.band-comment-status-open {\n display: grid;\n gap: 4px;\n justify-items: start;\n min-width: 0;\n}\n.band-comment-status-row {\n display: flex;\n margin: 0;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n min-width: 0;\n padding: 0 2px 0 4px;\n font-size: var(--fs-dense);\n color: var(--accent-text);\n}\n.band-comment-status-row .band-comment-status-glyph.glyph {\n --c: var(--accent);\n}\n.band-comment-status-who {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.band-comment-time {\n color: var(--muted);\n font-size: var(--fs-dense);\n}\n.band-comment-acts {\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n align-items: center;\n}\n.band-comment-extras {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n margin: 4px 0 0;\n padding: 0;\n list-style: none;\n}\n.band-comment-extras-link {\n max-width: 100%;\n border: 0;\n font: inherit;\n font-size: var(--fs-meta);\n cursor: pointer;\n}\n.band-comment-extras-link:where(:hover) {\n color: var(--ink);\n}\n.band-comment-shot {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0;\n padding: 4px 6px;\n border-radius: var(--r);\n background: var(--sunk);\n}\n.band-comment-shot img {\n display: block;\n max-width: 64px;\n max-height: 36px;\n border-radius: var(--r-sm);\n box-shadow: 0 0 0 1px var(--rule);\n object-fit: contain;\n background: var(--panel);\n}\n.band-comment-shot figcaption {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n font-size: var(--fs-dense);\n color: var(--muted);\n}\n.band-comment-marks {\n position: fixed;\n z-index: 5;\n overflow: hidden;\n pointer-events: none;\n}\n.band-comment-pin {\n position: absolute;\n pointer-events: auto;\n cursor: pointer;\n padding: 0 5px;\n}\n.band-comment-pin:where([data-status]) {\n border-style: dashed;\n}\n.band-comment-pin:where([aria-pressed=true]) {\n outline: 2px solid var(--ink);\n outline-offset: 1px;\n}\n.band-comment-pin:where(:focus-visible) {\n outline: 2px solid var(--accent);\n outline-offset: 1px;\n}\n.band-comment-hl {\n position: absolute;\n border-radius: 4px;\n background: color-mix(in srgb, var(--accent) 12%, transparent);\n box-shadow: 0 0 0 1px var(--accent);\n}\n.band-comment-corner {\n position: absolute;\n right: 10px;\n bottom: 10px;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 6px;\n max-width: calc(100% - 20px);\n}\n.band-comment-orphans {\n display: flex;\n align-items: center;\n gap: 6px;\n max-width: 100%;\n padding: 5px 6px 5px 10px;\n border-radius: 8px;\n background: var(--panel);\n box-shadow: var(--shadow-pop);\n color: var(--muted);\n font-size: var(--fs-meta);\n overflow-x: auto;\n pointer-events: auto;\n}\n.band-comment-orphans > .band-comment-pin {\n position: static;\n flex: none;\n}\n.band-comment-rh {\n min-width: 0;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n.band-comment-receipt-foot {\n font-size: var(--fs-meta);\n color: var(--muted);\n}\n.band-comment-extras > li {\n min-width: 0;\n max-width: 100%;\n}\n.band-comment-extras :where(.chip) {\n max-width: 100%;\n}\n.band-comment-thread :where(.receipt) {\n min-width: 0;\n}\n.band-comment-ask {\n margin: 6px 0 0;\n padding: 8px 10px;\n border-radius: var(--r);\n background: var(--warn-soft);\n color: var(--ink);\n font-size: var(--fs-meta);\n}\n.band-comment-ask b {\n display: block;\n color: var(--warn);\n font-weight: 500;\n margin-bottom: 2px;\n}\n.band-comment-pop:where([aria-busy=true]) textarea {\n opacity: 0.62;\n}\n.band-comment-resident {\n position: fixed;\n z-index: 6;\n box-sizing: border-box;\n display: grid;\n gap: 6px;\n padding: 8px 12px 10px;\n background: var(--panel);\n border-top: 1px solid var(--rule);\n color: var(--ink);\n}\n.band-comment-resident[hidden] {\n display: none;\n}\n.band-comment-resident:where([data-inline]) {\n position: relative;\n border-top: 0;\n padding: 8px 16px 12px;\n}\n.band-comment-resident:where([aria-busy=true]) textarea {\n opacity: 0.62;\n}\n.band-comment-resident textarea {\n max-height: max(2.4em, min(160px, 20vh));\n}\n.band-comment-resident-top {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n.band-comment-resident-note {\n color: var(--muted);\n font-size: var(--fs-meta);\n}\n.band-comment-chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n max-width: 100%;\n padding: 2px 8px;\n border: 0;\n border-radius: 999px;\n background: var(--accent-soft);\n color: var(--accent-text);\n font: inherit;\n font-size: var(--fs-meta);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n cursor: pointer;\n}\n.band-comment-chip::after {\n content: "\\25be";\n font-size: 11px;\n line-height: 1;\n}\n.band-comment-chip:where(:focus-visible) {\n outline: 2px solid var(--accent);\n outline-offset: 1px;\n}\n.band-comment-chip:where(:disabled) {\n cursor: default;\n}\n.band-comment-chip-menu {\n position: absolute;\n left: 10px;\n bottom: calc(100% - 4px);\n z-index: 1;\n display: grid;\n width: min(300px, calc(100% - 20px));\n padding: 4px;\n border-radius: var(--r-lg);\n background: var(--panel);\n box-shadow: var(--shadow-pop);\n}\n.band-comment-chip-menu > button {\n display: flex;\n justify-content: space-between;\n gap: 8px;\n padding: 7px 10px;\n border: 0;\n border-radius: var(--r-sm);\n background: none;\n color: var(--ink);\n font: inherit;\n font-size: var(--fs-ui);\n text-align: left;\n cursor: pointer;\n}\n.band-comment-chip-menu > button > span {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.band-comment-chip-menu > button:where(:hover, :focus-visible, [aria-checked=true]) {\n background: var(--fill);\n outline: none;\n}\n.band-comment-chip-menu small {\n flex: none;\n color: var(--muted);\n font-size: var(--fs-meta);\n}\n.band-comment-range {\n position: absolute;\n height: 4px;\n border-radius: 2px;\n opacity: 0.85;\n}\n.band-comment-range:where([data-lit]) {\n opacity: 1;\n box-shadow: 0 0 0 1px var(--panel);\n}\n.band-comment-range:where(.open) {\n background: var(--warn);\n}\n.band-comment-range:where(.awaiting) {\n background: var(--wait);\n}\n.band-comment-range:where(.queued, .running) {\n background: var(--accent);\n}\n.band-comment-range:where(.draft) {\n background: var(--ink);\n}\n.band-comment-actions {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n.band-comment-actions-main.iconbtn,\n.band-comment-actions-caret.iconbtn {\n position: relative;\n flex: none;\n width: 32px;\n height: 32px;\n padding: 0;\n border: 0;\n border-radius: 8px;\n background: none;\n color: var(--muted);\n}\n.band-comment-actions-main.iconbtn:hover,\n.band-comment-actions-caret.iconbtn:hover {\n background: var(--fill-2);\n color: var(--ink);\n}\n.band-comment-actions-caret.iconbtn {\n width: 18px;\n margin-left: -4px;\n}\n.band-comment-actions-bubble {\n display: block;\n width: 18px;\n height: 18px;\n}\n.band-comment-actions-chevron {\n display: block;\n width: 12px;\n height: 12px;\n}\n.band-comment-actions-main.iconbtn:where([aria-pressed=true]),\n.band-comment-actions-main.iconbtn:where([aria-pressed=true]):hover {\n background: var(--accent-soft);\n color: var(--accent-text);\n}\n.band-comment-actions-main:where([aria-pressed=true]) .band-comment-actions-bubble {\n fill: var(--accent);\n stroke: var(--accent);\n}\n.band-comment-actions-count {\n position: absolute;\n top: 2px;\n right: 1px;\n min-width: 15px;\n height: 15px;\n padding: 0 4px;\n box-sizing: border-box;\n border-radius: 8px;\n background: var(--warn);\n color: var(--panel);\n font-size: var(--fs-badge);\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n line-height: 15px;\n}\n.band-comment-drop {\n position: fixed;\n z-index: var(--layer-pop);\n box-sizing: border-box;\n padding: 6px;\n border-radius: var(--r-lg);\n background: var(--panel);\n color: var(--ink);\n box-shadow: var(--shadow-pop);\n max-height: min(420px, calc(100vh - 24px));\n overflow: auto;\n overscroll-behavior: contain;\n}\n.band-comment-drop-head {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 8px;\n margin: 4px 8px 6px;\n font-size: var(--fs-meta);\n color: var(--muted);\n font-weight: 600;\n}\n.band-comment-drop-all {\n border: 0;\n background: none;\n padding: 0;\n color: var(--accent-text);\n font: inherit;\n font-size: var(--fs-meta);\n font-weight: 500;\n cursor: pointer;\n}\n.band-comment-drop-all:where(:hover, :focus-visible) {\n text-decoration: underline;\n outline: none;\n}\n.band-comment-drop-empty {\n margin: 4px 8px 10px;\n font-size: var(--fs-ui);\n color: var(--muted);\n}\n.band-comment-drop-list {\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.band-comment-drop-row {\n display: grid;\n grid-template-columns: auto 1fr;\n gap: 2px 8px;\n width: 100%;\n box-sizing: border-box;\n padding: 7px 8px;\n border: 0;\n border-radius: var(--r-sm);\n background: none;\n color: var(--ink);\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\n.band-comment-drop-row:where(:hover, :focus-visible) {\n background: var(--fill);\n outline: none;\n}\n.band-comment-drop-pin {\n grid-row: span 2;\n align-self: start;\n min-width: 18px;\n height: 18px;\n font-size: var(--fs-badge);\n}\n.band-comment-drop-where {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--fs-meta);\n color: var(--muted);\n}\n.band-comment-drop-text {\n min-width: 0;\n font-size: var(--fs-ui);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n.band-comment-inplace {\n position: fixed;\n z-index: 20;\n margin: 0;\n padding: 0;\n border: 0;\n border-radius: 12px;\n background: var(--panel);\n color: var(--ink);\n box-shadow: var(--shadow-pop);\n max-height: calc(100vh - 16px);\n overflow: auto;\n}\n.band-comment-inplace > .pop-h {\n padding: 10px 12px 0;\n}\n.band-comment-inplace-loc.band-comment-chip {\n min-width: 0;\n padding: 1px 8px;\n border-radius: 999px;\n background: var(--accent-soft);\n color: var(--accent-text);\n font-size: var(--fs-meta);\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.band-comment-inplace-text {\n padding: 8px 12px;\n min-height: 64px;\n font-size: var(--fs-body);\n}\n.band-comment-inplace-foot {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 6px;\n padding: 6px 8px 8px 12px;\n border-top: 1px solid var(--rule);\n flex-wrap: wrap;\n}\n.band-comment-inplace-actions {\n display: inline-flex;\n gap: 6px;\n}\n.band-comment-receipt-options {\n min-width: 0;\n border: 0;\n padding: 0;\n display: grid;\n gap: 6px;\n margin-top: 10px;\n}\n.band-comment-option {\n width: 100%;\n height: auto;\n min-height: 32px;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 4px;\n white-space: normal;\n overflow-wrap: anywhere;\n text-align: left;\n}\n.band-comment-option-title {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 6px;\n}\n.band-comment-option[aria-pressed=true] {\n border-color: var(--accent-text);\n background: var(--accent-soft);\n}\n.band-comment-option-why {\n color: var(--muted);\n font-size: var(--fs-meta);\n line-height: 1.5;\n}\n.band-comment-citations {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 8px;\n}\n.band-comment-citations > button {\n max-width: 100%;\n height: auto;\n white-space: normal;\n overflow-wrap: anywhere;\n}\n.band-material-discussions {\n box-sizing: border-box;\n height: 100%;\n min-height: 0;\n overflow: auto;\n overscroll-behavior: contain;\n padding: 16px;\n color: var(--ink);\n}\n.band-material-discussions-context,\n.band-material-discussion-form,\n.band-material-discussions-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-width: 0;\n margin-bottom: 16px;\n}\n.band-material-discussions-context strong,\n.band-material-discussion-message p {\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n}\n.band-material-discussions-context span,\n.band-material-discussions-context p,\n.band-material-discussion-meta,\n.band-material-discussions-empty {\n color: var(--muted);\n font-size: var(--fs-meta);\n}\n.band-material-discussion-card {\n min-width: 0;\n border-radius: var(--r);\n padding: 12px;\n background: var(--fill);\n}\n.band-material-discussion-message {\n padding-block: 8px;\n}\n.band-material-discussion-message p {\n margin: 4px 0;\n}\n.band-material-discussion-actions,\n.band-material-discussion-meta {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n}\n.band-material-discussion-actions {\n justify-content: flex-end;\n}\n.band-comment-mode-hover {\n position: fixed;\n z-index: 4;\n pointer-events: none;\n box-sizing: border-box;\n border: 1.5px solid var(--accent);\n border-radius: 3px;\n background: color-mix(in srgb, var(--accent) 9%, transparent);\n}\n.band-comment-mode-hint {\n position: fixed;\n pointer-events: none;\n z-index: 19;\n transform: translateX(-50%);\n max-width: calc(100vw - 32px);\n padding: 5px 12px;\n box-sizing: border-box;\n border-radius: 999px;\n background: var(--ink);\n color: var(--panel);\n font-size: var(--fs-meta);\n white-space: nowrap;\n animation: band-comment-hint 2300ms both;\n}\n@keyframes band-comment-hint {\n 0%, 89% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n}\n[data-band-commenting=true] {\n cursor: crosshair;\n}\n@media (prefers-reduced-motion: reduce) {\n .band-comment-mode-hint {\n animation: none;\n }\n}\n.band-comment-mode-hover:where([data-timeline]) {\n border: 0;\n border-radius: 0;\n background: var(--accent);\n opacity: 0.6;\n}\n.band-comment-inplace:where(:has(.band-plugin-react-prompt-box)) {\n overflow-x: hidden;\n}\n.band-comment-inplace .pop-h > span {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.band-comment-inplace .band-comment-chip-menu {\n position: static;\n width: auto;\n min-width: 0;\n margin: 6px 12px;\n}\n';let el2=document.head.querySelector('style[data-band-style="@kanyun-ai-infra/band-comment"]');if(!el2){el2=document.createElement("style");el2.setAttribute("data-band-style","@kanyun-ai-infra/band-comment");document.head.prepend(el2)}el2.textContent=css}var LAYER_SELECTOR="[data-band-layer]";function layerOf(el2){if(!el2||typeof el2.closest!=="function")return null;return el2.closest(LAYER_SELECTOR)}function topLayer(){if(typeof document==="undefined")return null;const all=document.querySelectorAll(LAYER_SELECTOR);return all[all.length-1]??null}function onTopLayer(el2){return layerOf(el2)===topLayer()}var listeners=new Set;var observer=null;var snapshot=null;function refresh(){const next=topLayer();if(next===snapshot)return;snapshot=next;for(const fn of[...listeners])fn()}function subscribeTopLayer(fn){listeners.add(fn);if(!observer&&typeof MutationObserver!=="undefined"&&typeof document!=="undefined"){snapshot=topLayer();observer=new MutationObserver(refresh);observer.observe(document.documentElement,{childList:true,subtree:true,attributes:true,attributeFilter:["data-band-layer"]})}return()=>{listeners.delete(fn);if(listeners.size===0){observer?.disconnect();observer=null}}}function topLayerSnapshot(){return observer?snapshot:topLayer()}function after(a,b){if(a===b||a===null)return false;if(b===null)return true;return(b.compareDocumentPosition(a)&Node.DOCUMENT_POSITION_FOLLOWING)!==0}var surfaces=new Map;var surfaceListeners=new Set;function registerSurface(project,layer){const list=surfaces.get(project)??[];list.push(layer);surfaces.set(project,list);for(const fn of[...surfaceListeners])fn();return()=>{const i=list.indexOf(layer);if(i>=0)list.splice(i,1);if(list.length===0&&surfaces.get(project)===list)surfaces.delete(project);for(const fn of[...surfaceListeners])fn()}}function subscribeSurfaces(fn){surfaceListeners.add(fn);return()=>{surfaceListeners.delete(fn)}}function popLayer(project){const list=(surfaces.get(project)??[]).filter(l=>l===null||l.isConnected);if(list.length===0)return void 0;return list.reduce((best,l)=>after(l,best)?l:best)}var GAP=12;var MENU_GAP=6;var OPENER_MS=1500;var EDGE=8;var PENDING_MS=600;function handOfSelection(doc=document){const sel=doc.getSelection();if(!sel||sel.isCollapsed||!sel.focusNode)return void 0;const r=doc.createRange();r.setStart(sel.focusNode,sel.focusOffset);r.collapse(true);return r}function anchorSpot(hosts,anchor,opts={}){if(anchor.kind==="artifact"||anchor.kind.startsWith("plugin:"))return null;const shown=hosts.filter(h=>h.kinds.includes(anchor.kind)&&(h.version?.id===anchor.versionId||opts.artifactId!==void 0&&h.version?.artifactId===opts.artifactId)).map(h=>({h,mount:h.mount.getBoundingClientRect()})).filter(({mount:mount2})=>mount2.width>0&&mount2.height>0);const pick=shown.find(({h})=>h.version?.id===opts.currentVersionId)??shown.find(({h})=>h.version?.id===anchor.versionId)??shown.at(-1);if(!pick)return"away";const{h:host,mount}=pick;const place=locateSafely(host,anchor);let rects;const below=opts.fresh===true&&anchor.kind==="text-range"&&place.at==="rects";if(place.at==="rects"){const lit=place.rects.filter(r=>r.width>0&&r.height>0);rects=below&&lit.length>0?lit:place.rects}else if(place.at==="track")rects=[{x:place.x,y:place.y,width:0,height:0}];else if(place.at==="pending")return"pending";else if(place.at==="elsewhere")return"away";else return null;if(rects.length===0)return null;const left=Math.min(...rects.map(r=>r.x));const top=Math.min(...rects.map(r=>r.y));const right=Math.max(...rects.map(r=>r.x+r.width));const bottom=Math.max(...rects.map(r=>r.y+r.height));if(right<0||bottom<0||left>mount.width||top>mount.height)return"away";const clampX=x=>Math.min(Math.max(x,0),mount.width);const clampY=y=>Math.min(Math.max(y,0),mount.height);const box=r=>({left:mount.left+clampX(r.x),top:mount.top+clampY(r.y),right:mount.left+clampX(r.x+r.width),bottom:mount.top+clampY(r.y+r.height)});const spot={target:{left:mount.left+clampX(left),top:mount.top+clampY(top),right:mount.left+clampX(right),bottom:mount.top+clampY(bottom)},bounds:{left:mount.left,top:mount.top,right:mount.right,bottom:mount.bottom}};const first=rects[0];const last=rects.at(-1);if(!below||!first||!last)return spot;const lines={first:box(first),last:box(last)};const hand=handX(opts.hand,host.mount,lines.last);return{...spot,lines,...hand===void 0?{}:{hand}}}function handX(range,mount,last){if(!range||!mount.contains(range.startContainer))return void 0;const r=range.getClientRects()[0]??range.getBoundingClientRect();if(r.height===0&&r.width===0&&r.x===0&&r.y===0)return void 0;const mid=r.top+r.height/2;return mid>=last.top&&mid<=last.bottom?r.left:void 0}function placeBeside({target,bounds},w,h,vw,vh){const clamp=(v,lo,hi)=>Math.max(lo,Math.min(v,hi));const minX=Math.max(bounds.left,EDGE);const maxX=Math.min(bounds.right,vw-EDGE);const sideTop=clamp(target.top,EDGE,vh-h-EDGE);if(target.right+GAP+w<=maxX)return{left:target.right+GAP,top:sideTop};if(target.left-GAP-w>=minX)return{left:target.left-GAP-w,top:sideTop};const left=clamp(clamp(target.left,minX,maxX-w),EDGE,vw-w-EDGE);if(target.bottom+GAP+h<=vh-EDGE)return{left,top:target.bottom+GAP};if(target.top-GAP-h>=EDGE)return{left,top:target.top-GAP-h};return{left:clamp(target.right-w,EDGE,vw-w-EDGE),top:clamp(target.bottom-h,EDGE,vh-h-EDGE)}}function placeBelow(spot,w,h,vw,vh){const{bounds,lines,hand}=spot;if(!lines)return placeBeside(spot,w,h,vw,vh);const clamp=(v,lo,hi)=>Math.max(lo,Math.min(v,hi));const minX=Math.max(bounds.left,EDGE);const maxX=Math.min(bounds.right,vw-EDGE);const start=lines.first.left;const toHand=hand!==void 0&&hand<=maxX&&hand-w>start;const left=clamp(clamp(toHand?hand-w:start,minX,maxX-w),EDGE,vw-w-EDGE);if(lines.last.bottom+GAP+h<=vh-EDGE)return{left,top:lines.last.bottom+GAP};if(lines.first.top-GAP-h>=EDGE)return{left,top:lines.first.top-GAP-h};return{left,top:clamp(lines.last.bottom+GAP,EDGE,vh-h-EDGE)}}function keyOf(p){return p===null||p==="hidden"?String(p):`${Math.round(p.left)},${Math.round(p.top)}`}function fadeIn(el2){if(typeof el2.animate!=="function")return;if(window.matchMedia?.("(prefers-reduced-motion: reduce)").matches)return;const ms=Number.parseFloat(getComputedStyle(el2).getPropertyValue("--eighth"))||250;el2.animate([{opacity:0},{opacity:1}],{duration:ms,easing:"cubic-bezier(.16, 1, .3, 1)"})}function placeUnderOpener(target,w,h,vw,vh){const clamp=(v,lo,hi)=>Math.max(lo,Math.min(v,hi));const left=popoverLeft(target,w,vw,EDGE);const below=target.bottom+MENU_GAP;const above=target.top-MENU_GAP-h;const top=below+h<=vh-EDGE?below:above>=EDGE?above:below;return{left:clamp(left,EDGE,vw-w-EDGE),top:clamp(top,EDGE,vh-h-EDGE)}}var PRESSABLE='button, [role="button"], a[href]';var lastPress=null;if(typeof document!=="undefined"){document.addEventListener("pointerdown",e=>{if(e.target instanceof Element)lastPress={el:e.target.closest(PRESSABLE)??e.target,at:Date.now()}},true);document.addEventListener("keydown",withImeGuard(e=>{const el2=document.activeElement?.closest(PRESSABLE);if((e.key==="Enter"||e.key===" ")&&el2)lastPress={el:el2,at:Date.now()}}),true)}function recentPress(now=Date.now()){return lastPress&&now-lastPress.at<=OPENER_MS?lastPress.el:null}function openerNow(now=Date.now()){const pressed=recentPress(now);if(pressed)return pressed;const focused=typeof document==="undefined"?null:document.activeElement;return focused?.closest(PRESSABLE)??null}function useAnchoredPop(ctx,anchor,artifactId,fresh){const[el2,setEl]=useState(null);const[pos,setPos]=useState(anchor?"hidden":null);const last=useRef(keyOf(pos));const faded=useRef(false);const per=useRef({id:void 0,shown:false,gaveUp:false,timer:void 0});const[opener]=useState(()=>openerNow());const anchors=ctx.collab.anchors;const hosts=useSyncExternalStore(anchors.subscribe,anchors.hosts);useLayoutEffect(()=>{if(!el2)return;const state=per.current;if(state.id!==anchor?.id){clearTimeout(state.timer);per.current={id:anchor?.id,shown:false,gaveUp:false,timer:void 0}}let frame=0;const fallback=()=>{if(isNarrow())return null;const button=openerBox(opener,el2);return button?placeUnderOpener(button,el2.offsetWidth,el2.offsetHeight,innerWidth,innerHeight):null};const apply=next=>{const key=keyOf(next);const now=per.current;if(next!=="hidden"&&!now.shown){now.shown=true;if(!faded.current){faded.current=true;fadeIn(el2)}}if(key===last.current)return;last.current=key;setPos(next)};const measure=()=>{frame=0;const now=per.current;if(!anchor)return apply(null);if(now.gaveUp)return apply(fallback());const vw=window.innerWidth;const vh=window.innerHeight;const current=ctx.version.current()?.id;const mine=layerOf(el2);const reachable=hosts.filter(h=>layerOf(h.mount)===mine);const spot=isNarrow()?null:anchorSpot(reachable,anchor,{...artifactId?{artifactId}:{},...current?{currentVersionId:current}:{},...fresh?{fresh:true,...fresh.hand?{hand:fresh.hand}:{}}:{}});if(spot==="pending"||spot==="away"&&!now.shown){if(now.shown)return;now.timer??=setTimeout(()=>{now.gaveUp=true;apply(fallback())},PENDING_MS);return apply("hidden")}clearTimeout(now.timer);if(spot===null||spot==="away")return apply(fallback());const at=spot.lines?placeBelow:placeBeside;apply(at(spot,el2.offsetWidth,el2.offsetHeight,vw,vh))};const schedule=()=>{if(!frame)frame=requestAnimationFrame(measure)};const onScroll=e=>{if(!(e.target instanceof Node&&el2.contains(e.target)))schedule()};measure();const offs=hosts.map(h=>h.onLayout(schedule));window.addEventListener("resize",schedule);document.addEventListener("scroll",onScroll,{capture:true,passive:true});const observer2=typeof ResizeObserver==="undefined"?null:new ResizeObserver(schedule);observer2?.observe(el2);return()=>{if(frame)cancelAnimationFrame(frame);for(const off of offs)off();window.removeEventListener("resize",schedule);document.removeEventListener("scroll",onScroll,{capture:true});observer2?.disconnect()}},[ctx,hosts,el2,anchor,artifactId,fresh,opener]);useLayoutEffect(()=>()=>clearTimeout(per.current.timer),[]);useLayoutEffect(()=>()=>{const back=opener?.closest(PRESSABLE);if(back instanceof HTMLElement&&back.isConnected)back.focus({preventScroll:true})},[opener]);if(pos==="hidden")return{ref:setEl,style:{opacity:0,pointerEvents:"none"}};return{ref:setEl,style:pos?{left:pos.left,top:pos.top,right:"auto",bottom:"auto",maxHeight:`calc(100vh - ${2*EDGE}px)`}:void 0}}function openerBox(opener,pop){if(!opener?.isConnected||pop.contains(opener))return null;const r=opener.getBoundingClientRect();if(r.width===0&&r.height===0)return null;return{left:r.left,top:r.top,right:r.right,bottom:r.bottom}}var commentMode=defineScopeState(ctx=>ctx.anchors.annotating);var SELECTION_ATTR="data-band-comment-selection";function useSelectionChange(ctx){const latest=useRef2(null);useEffect(()=>ctx.selection.subscribe(change=>{latest.current=change}),[ctx]);return latest}function matchingHosts(ctx,hosts,anchor){const current=ctx.version.current();if(anchor.kind!=="text-range"||!current||anchor.versionId!==current.id)return[];const parsed=ANCHOR_PAYLOAD["text-range"].safeParse(anchor.payload);if(!parsed.success||!parsed.data.quote.exact.trim())return[];return hosts.filter(host=>host.annotate&&host.kinds.includes("text-range")&&host.version?.id===current.id&&host.version.artifactId===current.artifactId&&onTopLayer(host.mount))}function consumingHost(ctx,hosts,anchor,source){const candidates=matchingHosts(ctx,hosts,anchor);if(source!==null)return candidates.find(host=>host.plugin===source)??null;const located=candidates.filter(host=>{try{const place=host.locate(anchor);return place.at==="rects"&&place.rects.some(rect=>rect.width>0&&rect.height>0)}catch{return false}});return located.length===1?located[0]??null:null}function readTextSelection(ctx,hosts,change){const selected=ctx.selection.get();if(selected?.kind!=="anchor")return null;const anchor=selected.anchor;const source=change?.value?.kind==="anchor"&&JSON.stringify(change.value.anchor)===JSON.stringify(anchor)?change.source:null;const host=consumingHost(ctx,hosts,anchor,source);return host?{anchor,host,source}:null}function validateTextSelection(ctx,hosts,selected){if(!selected)return null;const host=consumingHost(ctx,hosts,selected.anchor,selected.source);return host&&host.plugin===selected.host.plugin&&host.mount===selected.host.mount?{...selected,host}:null}function enterCommentMode(ctx,hosts,all,selected){clearRememberedSelection(all);const ready=validateTextSelection(ctx,hosts,selected);if(ready)ready.host.mount.setAttribute(SELECTION_ATTR,"true");else rememberSelection(hosts);commentMode.of(ctx).set(true);if(ready){try{ctx.threads.openAt(ready.anchor)}catch(error){ctx.report(error)}}}function clearRememberedSelection(hosts){for(const host of hosts)host.mount.removeAttribute(SELECTION_ATTR)}function rememberSelection(hosts){clearRememberedSelection(hosts);const selection=window.getSelection();if(!selection||selection.isCollapsed||selection.rangeCount===0||!selection.toString().trim())return false;const range=selection.getRangeAt(0);const host=hosts.find(entry=>{const mount=entry.mount;return mount.contains(range.startContainer)&&mount.contains(range.endContainer)});if(!host)return false;host.mount.setAttribute(SELECTION_ATTR,"true");return true}var PIN_CLASS={open:"open",queued:"queued",running:"running",awaiting_confirm:"awaiting",resolved:"resolved"};var PIN_STEP=24;var HOST_WAIT_MS=3e3;function locateSafely(host,anchor){try{return host.locate(anchor)}catch(e){console.error(`[band-comment] ${host.plugin} \u7684 locate \u51FA\u9519\uFF1A`,e);return{at:"pending"}}}function shownAs(host,anchor){if(anchor.kind!=="shot"&&host.kinds.includes("shot")){const shot=shotAnchorOf(anchor);if(shot)return{...anchor,kind:"shot",payload:shot}}return host.kinds.includes(anchor.kind)?anchor:null}function shows(host,artifactId,anchor){return host.version?.artifactId===artifactId&&shownAs(host,anchor)!==null}function selectsArtifact(ctx,artifactId,versionIds){const sel=ctx.selection.get();if(!sel)return false;if(sel.kind==="anchor")return sel.anchor.versionId!==void 0&&versionIds.has(sel.anchor.versionId);if(sel.kind==="stage")return false;return sel.artifactId===artifactId}async function revealThread(ctx,threadId,stale){const t=(await ctx.threads.list()).find(x=>x.id===threadId);if(stale()||!t?.anchor||t.anchor.kind==="artifact")return;const artifactId=t.artifactId;if(artifactId===void 0)return;const anchors=ctx.collab.anchors;const fit=()=>{const shown2=anchors.hosts().filter(h=>shows(h,artifactId,t.anchor));const all=shown2.filter(h=>onTopLayer(h.mount));const current=ctx.version.current()?.id;return all.find(h=>h.version?.id===current)??all.at(-1)};let host=fit();if(!host){if(topLayer()!==null&&anchors.hosts().some(h=>onTopLayer(h.mount)))return;if(topLayer()===null){const versionIds=new Set((await ctx.version.list(artifactId)).map(v=>v.id));if(stale())return;const shown2=anchors.hosts().some(h=>h.version?.artifactId===artifactId);if(!shown2&&!selectsArtifact(ctx,artifactId,versionIds)){ctx.selection.set({kind:"artifact",artifactId})}}host=await new Promise(resolve=>{const timer=setTimeout(()=>{off();resolve(void 0)},HOST_WAIT_MS);const off=anchors.subscribe(()=>{const h=fit();if(!h)return;clearTimeout(timer);off();resolve(h)})})}if(!host||stale())return;const shown=shownAs(host,t.anchor)??t.anchor;const anchor=host.version?await resolveIn(ctx,shown,host.version):shown;if(!anchor||stale())return;try{await host.reveal(anchor)}catch(e){console.error(`[band-comment] ${host.plugin} \u7684 reveal \u51FA\u9519\uFF1A`,e)}}function typing(target){if(!(target instanceof HTMLElement))return false;return target.isContentEditable||target instanceof HTMLInputElement||target instanceof HTMLTextAreaElement||target instanceof HTMLSelectElement}function useAnnotateKeys(ctx,hosts,all,dialog,layer){const selectionChange=useSelectionChange(ctx);const anywhere=all.some(h=>h.annotate);const previouslyAnnotatable=useRef3(all.filter(h=>h.annotate));const replacement=useRef3(null);useEffect2(()=>{const previous=previouslyAnnotatable.current;const current=ctx.version.current();const pending=replacement.current;const movedOn=pending!==null&¤t?.id!==pending.versionId;let timer;const replacing=!movedOn&&all.length===0&¤t!==null&&previous.some(h=>h.version?.artifactId===current.artifactId&&h.version.id!==current.id);if(replacing){const waiting=pending??{versionId:current.id,deadline:performance.now()+HOST_WAIT_MS};replacement.current=waiting;timer=setTimeout(()=>{const live=ctx.collab.anchors.hosts();const ready=ctx.version.current()?.id===waiting.versionId&&live.some(h=>h.annotate&&h.version?.id===waiting.versionId);replacement.current=null;previouslyAnnotatable.current=live.filter(h=>h.annotate);if(!ready)ctx.anchors.annotating.set(false)},Math.max(0,waiting.deadline-performance.now()))}else{replacement.current=null;previouslyAnnotatable.current=all.filter(h=>h.annotate);if(movedOn||previous.length>0&&!anywhere)ctx.anchors.annotating.set(false)}const onKey=withImeGuard2(e=>{if(e.defaultPrevented||e.repeat)return;if(e.metaKey||e.ctrlKey||e.altKey||typing(e.target))return;const on=ctx.anchors.annotating.get();const top=hosts.filter(h=>layerOf(h.mount)===layer&&onTopLayer(h.mount));const reachable=top.some(h=>h.annotate);if(!on&&!dialog&&reachable&&(e.code==="KeyC"||e.key.toLowerCase()==="c")){if(window.matchMedia?.(NARROW_QUERY).matches)return;e.preventDefault();const current2=top.filter(host=>host.version?.id===ctx.version.current()?.id);enterCommentMode(ctx,current2,all,readTextSelection(ctx,current2,selectionChange.current))}else if(on&&!dialog&&e.key==="Escape"){e.preventDefault();clearRememberedSelection(all);ctx.anchors.annotating.set(false)}});window.addEventListener("keydown",onKey);return()=>{clearTimeout(timer);window.removeEventListener("keydown",onKey)}},[ctx,hosts,all,anywhere,dialog,layer,selectionChange])}function AnchorMarks({ctx,active,draft,dialog=false,layer=null}){const{anchors}=ctx.collab;const narrow=useNarrow();const all=useSyncExternalStore2(anchors.subscribe,anchors.hosts);const hosts=useMemo(()=>all.filter(h=>layerOf(h.mount)===layer),[all,layer]);const mode2=ctx.anchors.annotating;const commenting=useSyncExternalStore2(fn=>mode2.subscribe(fn),()=>mode2.get(),()=>false);useAnnotateKeys(ctx,hosts,all,dialog,layer);if(!commenting&&!narrow)return null;return jsx(Fragment,{children:hosts.map(h=>jsx(HostMarks,{ctx,host:h,active,draft},keyOf2(h)))})}var keys=new WeakMap;var nextKey=0;function keyOf2(h){let k=keys.get(h);if(k===void 0){k=++nextKey;keys.set(h,k)}return k}function useLayoutTick(host){const[tick,setTick]=useState2(0);useEffect2(()=>{let frame=0;let queued=false;let live=true;const schedule=()=>{if(frame)return;frame=requestAnimationFrame(()=>{frame=0;setTick(n=>n+1)})};const now=()=>{if(queued)return;queued=true;queueMicrotask(()=>{queued=false;if(live)flushSync(()=>setTick(n=>n+1))})};const offLayout=host.onLayout(now);window.addEventListener("resize",schedule);document.addEventListener("scroll",schedule,{capture:true,passive:true});const mount=host.mount;const observer2=typeof ResizeObserver==="undefined"?null:new ResizeObserver(schedule);observer2?.observe(mount);return()=>{live=false;if(frame)cancelAnimationFrame(frame);offLayout();window.removeEventListener("resize",schedule);document.removeEventListener("scroll",schedule,{capture:true});observer2?.disconnect()}},[host]);return tick}function candidatesOf(host){if(!host.candidates)return null;try{return host.candidates()}catch(e){console.error(`[band-comment] ${host.plugin} \u7684 candidates \u51FA\u9519\uFF1A`,e);return null}}var STATUS_NOTE={moved:"\u539F\u6587\u632A\u4E86\u4F4D\u7F6E\uFF0C\u610F\u89C1\u7F16\u53F7\u8DDF\u5230\u4E86\u65B0\u4F4D\u7F6E",changed:"\u8FD9\u91CC\u7684\u5185\u5BB9\u6539\u8FC7\u4E86\uFF0C\u610F\u89C1\u662F\u5BF9\u6539\u4E4B\u524D\u63D0\u7684"};async function resolveIn(ctx,anchor,version){if(!anchor.kind.startsWith("plugin:"))return anchor;try{const payload=await ctx.collab.anchors.resolve(anchor,version);return payload===null?null:payload===void 0?anchor:{...anchor,payload}}catch{return null}}var RESOLVING=Symbol("resolving");function useResolved(ctx,host){const cache=useRef3(new Map);const[,bump]=useState2(0);const version=host.version;return anchor=>{if(!anchor.kind.startsWith("plugin:")||!version)return anchor;const key=anchor.id;const hit=cache.current.get(key);if(hit!==void 0)return hit;cache.current.set(key,RESOLVING);resolveIn(ctx,anchor,version).then(v=>{if(cache.current.get(key)!==RESOLVING)return;cache.current.set(key,v);bump(n=>n+1)});return RESOLVING}}function HostMarks({ctx,host,active,draft}){const artifactId=host.version?.artifactId;const threads=useCtxData(ctx,async()=>artifactId?ctx.threads.list({artifactId}):[],[artifactId],THREAD_EVENTS).data;useLayoutTick(host);const resolved=useResolved(ctx,host);const[hover,setHover]=useState2(null);const open=useCallback(id=>{try{ctx.threads.open(id)}catch(e){ctx.report(e)}},[ctx]);const box=host.mount.getBoundingClientRect();if(!artifactId||box.width===0||box.height===0)return null;const locate=anchor=>{const a=resolved(anchor);if(a===RESOLVING)return{at:"pending"};return a===null?{at:"none"}:locateSafely(host,a)};const peers=ctx.collab.anchors.hosts().filter(h=>h.version?.artifactId===artifactId);const current=ctx.version.current()?.id;const listsUnshown=(peers.find(h=>h.version?.id===current)??peers[0])===host;const pins=[];const orphans=[];const unshown=[];for(const t of threads??[]){if(!t.anchor||t.anchor.kind==="artifact"||t.status==="resolved")continue;const shown=shownAs(host,t.anchor);if(!shown){if(listsUnshown)unshown.push(t);continue}const place=locate(shown);const pin=pinOf(t.id,t,place);if(pin)pins.push(pin);else if(place.at==="none")orphans.push(t)}if(draft&&draft.versionId===host.version?.id&&shownAs(host,draft)){const pin=pinOf("draft",null,locate(draft));if(pin)pins.push(pin)}const lit=pins.filter(p=>p.key==="draft"||p.key===hover||p.thread&&p.thread.id===active);const corner=(rows,label,title)=>rows.length>0&&jsxs("section",{className:"band-comment-orphans","aria-label":`${label}\u7684\u610F\u89C1`,title,children:[jsx("span",{title,children:label}),rows.map(t=>jsx("button",{type:"button",className:`pin ${PIN_CLASS[t.status]} band-comment-pin`,"aria-label":`\u610F\u89C1 #${t.mark}`,title:`#${t.mark} ${t.excerpt}
|
|
2
2
|
${title}`,onClick:()=>open(t.id),children:t.mark},t.id))]});return jsxs("div",{className:"band-comment-marks",style:{left:box.left,top:box.top,width:box.width,height:box.height},children:[pins.flatMap(p=>{const b=p.bar;if(!b)return[];const status=p.thread?PIN_CLASS[p.thread.status]:"draft";return[jsx("div",{className:`band-comment-range ${status}`,"data-anchor-range":"","data-lit":lit.includes(p)||void 0,style:{left:b.x,top:b.y-2,width:b.w}},`${p.key}:bar`)]}),lit.flatMap(p=>p.rects.filter(r=>r.width>0||r.height>0).map((r,i)=>jsx("div",{className:"band-comment-hl","data-anchor-highlight":"",style:{left:r.x-3,top:r.y-3,width:r.width+6,height:r.height+6}},`${p.key}:${i}`))),placePins(pins,box.width,box.height).map(({pin,left,top})=>pin.thread?jsx("button",{type:"button",className:`pin ${PIN_CLASS[pin.thread.status]} band-comment-pin`,style:{left,top},"data-status":pin.status,"aria-pressed":pin.thread.id===active,"aria-label":`\u610F\u89C1 #${pin.thread.mark}`,title:[`#${pin.thread.mark} ${pin.thread.excerpt}`,pin.status&&STATUS_NOTE[pin.status]].filter(Boolean).join("\n"),onClick:()=>pin.thread&&open(pin.thread.id),onMouseEnter:()=>setHover(pin.key),onMouseLeave:()=>setHover(h=>h===pin.key?null:h),onFocus:()=>setHover(pin.key),onBlur:()=>setHover(h=>h===pin.key?null:h),children:pin.thread.mark},pin.key):jsx("span",{className:"pin draft band-comment-pin",style:{left,top},"aria-hidden":"true",children:"+"},pin.key)),(orphans.length>0||unshown.length>0)&&jsxs("div",{className:"band-comment-corner",children:[corner(orphans,"\u627E\u4E0D\u5230\u539F\u4F4D\u7F6E","\u8FD9\u4E9B\u610F\u89C1\u6307\u7684\u5730\u65B9\u5728\u8FD9\u4E00\u7248\u91CC\u627E\u4E0D\u5230\u4E86\uFF08\u88AB\u5220\u6389\u6216\u6539\u5F97\u8BA4\u4E0D\u51FA\uFF09"),corner(unshown,"\u6CA1\u753B\u5728\u5185\u5BB9\u4E0A","\u8FD9\u4E2A\u67E5\u770B\u5668\u4E0D\u5728\u5185\u5BB9\u4E0A\u753B\u8FD9\u4E9B\u610F\u89C1\uFF08\u5B83\u4E0D\u8BA4\u8FD9\u79CD\u4F4D\u7F6E\uFF0C\u6216\u8005\u4E0D\u652F\u6301\u6807\u6CE8\uFF09\uFF0C\u70B9\u5F00\u770B\u8FD9\u6761\u610F\u89C1")]})]})}function pinOf(key,thread,place){const status="status"in place?place.status:void 0;const pin=rects=>({key,thread,rects,...status?{status}:{}});const point=(x,y)=>pin([{x:x+1,y:y-1,width:0,height:0}]);if(place.at==="track"){const p=point(place.x,place.y);return place.w!==void 0&&place.w>0?{...p,bar:{x:place.x,y:place.y,w:place.w}}:p}if(place.at!=="rects"||place.rects.length===0)return null;const[only]=place.rects;if(place.rects.length===1&&only&&only.width===0&&only.height===0){return point(only.x,only.y)}return pin(place.rects)}function placePins(pins,width,height){const corners=new Map;for(const p of pins){const r=p.rects[0];if(r.y+r.height<=0||r.y>=height||r.x+r.width<=0||r.x>=width)continue;const at=`${Math.round(r.x+r.width)}:${Math.round(r.y)}`;corners.set(at,[...corners.get(at)??[],p])}const out=[];for(const group of corners.values()){const r=group[0]?.rects[0];const span=(group.length-1)*PIN_STEP+20;const left=Math.max(2,Math.min(r.x+r.width-11,width-span-2));const top=Math.max(2,r.y-9);group.forEach((pin,i)=>out.push({pin,left:left+i*PIN_STEP,top}))}return out}var ARTIFACT_PAGE="@kanyun-ai-infra/band-project/artifact";var DROP_WIDTH=360;var MOBILE_NOTE="\u624B\u673A\u4E0A\u53EA\u80FD\u770B\u610F\u89C1\u548C\u56DE\u590D\uFF1B\u8981\u6307\u7740\u753B\u9762\u63D0\u610F\u89C1\uFF0C\u8BF7\u5728\u7535\u8111\u4E0A\u6253\u5F00\u3002";function useNarrow(){const[narrow,setNarrow]=useState3(()=>typeof window!=="undefined"&&window.matchMedia?.(NARROW_QUERY).matches===true);useEffect3(()=>{const mq=window.matchMedia?.(NARROW_QUERY);if(!mq)return;const on=()=>setNarrow(mq.matches);on();mq.addEventListener("change",on);return()=>mq.removeEventListener("change",on)},[]);return narrow}function useAnnotating(ctx){const a=ctx.anchors.annotating;return useSyncExternalStore3(fn=>a.subscribe(fn),()=>a.get(),()=>false)}function openThreads(list){return[...list??[]].filter(t=>t.status!=="resolved").sort((a,b)=>a.mark-b.mark)}function CommentActions({ctx,owner}){const members=useMembers(ctx);const artifactId=owner.artifactId;const threads=useCtxData2(ctx,()=>ctx.threads.list({artifactId}),[artifactId],THREAD_EVENTS2).data;const open=openThreads(threads);const on=useAnnotating(ctx);const narrow=useNarrow();const root=useRef4(null);const pendingSelection=useRef4(null);const selectionChange=useSelectionChange(ctx);const[menu,setMenu]=useState3(false);const[layer,setLayer]=useState3(null);useLayoutEffect2(()=>{setLayer(layerOf(root.current))});const collabAnchors=ctx.collab.anchors;const hosts=useSyncExternalStore3(collabAnchors.subscribe,collabAnchors.hosts);const current=useSyncExternalStore3(fn=>ctx.version.subscribe(()=>fn()),()=>ctx.version.current()?.id??null,()=>null);const currentHosts=hosts.filter(host=>host.version?.id===current&&layerOf(host.mount)===layer);const annotatable=currentHosts.some(host=>host.annotate);const scopedHosts=()=>collabAnchors.hosts().filter(host=>host.version?.id===ctx.version.current()?.id&&layerOf(host.mount)===layerOf(root.current));const role=useArtifactRole(ctx,artifactId);const canComment=ctx.member.can("comment")&&ctx.project.canReadThreads!==false;if(!canComment||role!=="deliverable")return null;const openWhole=()=>{try{ctx.threads.openAt(ctx.anchors.make("artifact",{}))}catch(e){ctx.report(e)}};const press=()=>{if(narrow&&annotatable){setMenu(m=>!m);return}setMenu(false);const mode2=ctx.anchors.annotating;if(mode2.get()){clearRememberedSelection(hosts);pendingSelection.current=null;mode2.set(false);return}if(!current)return;if(annotatable){const available=scopedHosts();const selected=pendingSelection.current?validateTextSelection(ctx,available,pendingSelection.current):readTextSelection(ctx,available,selectionChange.current);enterCommentMode(ctx,available,hosts,selected);pendingSelection.current=null;return}openWhole()};const count=open.length;return jsxs2("span",{className:"band-comment-actions",ref:root,children:[jsxs2("button",{type:"button",className:"iconbtn band-comment-actions-main","aria-label":"\u8BC4\u8BBA","aria-pressed":narrow?void 0:on,"aria-haspopup":narrow&&annotatable?"menu":void 0,"aria-expanded":narrow&&annotatable?menu:void 0,"aria-keyshortcuts":"C",...annotatable?{"data-band-guide":"annotate"}:{},title:narrow&&annotatable?"\u6CA1\u5904\u7406\u5B8C\u7684\u610F\u89C1":on?"\u9000\u51FA\u8BC4\u8BBA\u6A21\u5F0F\uFF08Esc\uFF09":annotatable?"\u8BC4\u8BBA\uFF08C\uFF09":"\u5BF9\u6574\u4EFD\u4EA7\u7269\u63D0\u4E00\u6761\u610F\u89C1",onPointerDown:event=>{clearRememberedSelection(hosts);pendingSelection.current=null;if(event.pointerType!=="mouse"||narrow||on||!annotatable)return;const available=scopedHosts();pendingSelection.current=readTextSelection(ctx,available,selectionChange.current);if(pendingSelection.current||rememberSelection(available))event.preventDefault()},onPointerCancel:()=>{pendingSelection.current=null;clearRememberedSelection(hosts)},onPointerLeave:()=>{pendingSelection.current=null;clearRememberedSelection(hosts)},onPointerUp:()=>clearRememberedSelection(hosts),onClick:press,children:[jsx2("svg",{className:"band-comment-actions-bubble",viewBox:"0 0 24 24",width:"18",height:"18",fill:!narrow&&on?"currentColor":"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",focusable:"false",children:jsx2("path",{d:"M12 3.5c-4.7 0-8.5 3.4-8.5 7.6 0 2 .9 3.9 2.4 5.2L5 20.5l4.3-1.9c.9.3 1.8.4 2.7.4 4.7 0 8.5-3.4 8.5-7.6S16.7 3.5 12 3.5z"})}),count>0&&jsx2("span",{className:"band-comment-actions-count","aria-label":`${count} \u6761\u6CA1\u5904\u7406\u5B8C`,children:count})]}),!narrow&&jsx2("button",{type:"button",className:"iconbtn band-comment-actions-caret","aria-haspopup":"menu","aria-expanded":menu,"aria-label":"\u6CA1\u5904\u7406\u5B8C\u7684\u610F\u89C1",title:"\u6CA1\u5904\u7406\u5B8C\u7684\u610F\u89C1",onClick:()=>setMenu(m=>!m),children:jsx2("svg",{className:"band-comment-actions-chevron",viewBox:"0 0 16 16",width:"12",height:"12","aria-hidden":"true",focusable:"false",children:jsx2("path",{d:"M4 6.25 8 10.25l4-4",fill:"none",stroke:"currentColor",strokeWidth:"2.2",strokeLinecap:"round",strokeLinejoin:"round"})})}),menu&&jsx2(DropList,{ctx,members,threads:open,artifactId,anchor:root,layer,onClose:back=>{setMenu(false);if(back){const button=root.current?.querySelector(narrow?".band-comment-actions-main":".band-comment-actions-caret");button?.focus()}}})]})}function DropList({ctx,members,threads,artifactId,anchor,layer,onClose}){const box=useRef4(null);const[pos,setPos]=useState3(null);const count=threads.length;const narrow=useNarrow();const focused=useRef4(false);useLayoutEffect2(()=>{if(!pos||focused.current)return;const first=box.current?.querySelector('[role="menuitem"]');first?.focus({preventScroll:true});focused.current=!!first&&document.activeElement===first},[pos]);useLayoutEffect2(()=>{const el2=box.current;const trigger=anchor.current?.getBoundingClientRect();if(!el2||!trigger)return;const measure=()=>{const width=Math.min(DROP_WIDTH,window.innerWidth-16);const at=placeUnderOpener(trigger,width,el2.offsetHeight,window.innerWidth,window.innerHeight);setPos({...at,width})};let frame=0;const schedule=()=>{if(!frame){frame=requestAnimationFrame(()=>{frame=0;measure()})}};const onScroll=e=>{if(e.target instanceof Node&&el2.contains(e.target))return;schedule()};measure();const ro=typeof ResizeObserver==="undefined"?null:new ResizeObserver(measure);ro?.observe(el2);window.addEventListener("resize",schedule);document.addEventListener("scroll",onScroll,{capture:true,passive:true});return()=>{if(frame)cancelAnimationFrame(frame);ro?.disconnect();window.removeEventListener("resize",schedule);document.removeEventListener("scroll",onScroll,{capture:true})}},[anchor]);useEffect3(()=>{const onDown=e=>{const target=e.target;if(box.current?.contains(target)||anchor.current?.contains(target))return;onClose(false)};document.addEventListener("pointerdown",onDown,{capture:true});return()=>document.removeEventListener("pointerdown",onDown,{capture:true})},[anchor,onClose]);const items=()=>[...box.current?.querySelectorAll('[role="menuitem"]')??[]];const onKeyDown=withImeGuard3(e=>{const all2=items();const i=all2.indexOf(document.activeElement);let to;if(e.key==="ArrowDown")to=all2[(i+1)%all2.length];else if(e.key==="ArrowUp")to=all2[(i-1+all2.length)%all2.length];else if(e.key==="Home")to=all2[0];else if(e.key==="End")to=all2.at(-1);else if(e.key==="Escape"||e.key==="Tab"){if(e.key==="Escape"){e.preventDefault();e.stopPropagation()}onClose(e.key==="Escape");return}else return;e.preventDefault();to?.focus()});const openThread=id=>{try{ctx.threads.open(id)}catch(e){ctx.report(e)}onClose(false)};const all=()=>{const params={project:ctx.project.id,artifact:artifactId};if(ctx.project.workshop)params.workshop=ctx.project.workshop;ctx.app.navigate({page:ARTIFACT_PAGE,params});onClose(false)};return createPortal(jsxs2("div",{ref:box,className:"band-comment-drop",role:"menu","aria-label":"\u6CA1\u5904\u7406\u5B8C\u7684\u610F\u89C1",onKeyDown,style:pos?{left:pos.left,top:pos.top,width:pos.width}:{visibility:"hidden",position:"fixed"},children:[jsxs2("div",{className:"band-comment-drop-head",children:[jsx2("span",{children:count>0?`\u6CA1\u5904\u7406\u5B8C\u7684 ${count}`:"\u6CA1\u5904\u7406\u5B8C\u7684"}),jsx2("button",{type:"button",role:"menuitem",className:"band-comment-drop-all",onClick:all,children:"\u5168\u90E8\u610F\u89C1 \u203A"})]}),count===0?jsx2("p",{className:"band-comment-drop-empty",children:narrow?`\u90FD\u5904\u7406\u5B8C\u4E86\u3002${MOBILE_NOTE}`:"\u90FD\u5904\u7406\u5B8C\u4E86\u3002\u8981\u6307\u7740\u753B\u9762\u8BF4\u4E00\u53E5\uFF0C\u6309\u300C\u8BC4\u8BBA\u300D\u6216 C\u3002"}):jsx2("ul",{className:"band-comment-drop-list",children:threads.map(t=>jsx2("li",{children:jsxs2("button",{type:"button",role:"menuitem",className:"band-comment-drop-row",onClick:()=>openThread(t.id),children:[jsx2("span",{className:`pin band-comment-drop-pin ${PIN_CLASS[t.status]}`,children:t.mark}),jsxs2("span",{className:"band-comment-drop-where",children:[t.anchor?anchorLabel(t.anchor):"\u6574\u4EFD\u4EA7\u7269"," \xB7"," ",memberName(members,t.createdBy.id)]}),jsx2("span",{className:"band-comment-drop-text",children:t.excerpt})]})},t.id))}),narrow&&count>0&&jsx2("p",{className:"band-comment-drop-empty",children:MOBILE_NOTE})]}),layer??document.body)}var ATTACH_SLOT="@kanyun-ai-infra/band-comment/composer.attach";var REF_LIMIT=8;function useComposerBits(ctx,members,where){const caps=useCtxData3(ctx,()=>ctx.agent.capabilities(),[],[]).data;const conns=useCtxData3(ctx,()=>ctx.agent.connectors(),[],[]).data;const entries=useSlotEntries(ctx,ATTACH_SLOT);const sources=useMemo2(()=>entries.filter(e=>e.meta.in===void 0||e.meta.in===where).map(e=>({id:e.key,label:String(e.meta.label),source:e.plugin,mount:(el2,owner)=>ctx.slots.mount(el2,ATTACH_SLOT,{key:e.key,owner:{in:where,add:owner.add,close:owner.close}})})),[ctx,entries,where]);const attach=useMemo2(()=>ctx.attachments.available?{limits:ATTACHMENT_LIMITS,upload:(file,o)=>ctx.attachments.upload(file,{signal:o.signal,onProgress:o.onProgress}).then(a=>({attachmentId:a.id,size:a.size,name:a.name,mime:a.mime,...a.existing?{existing:true}:{}}))}:void 0,[ctx]);const externalImport=useMemo2(()=>personalImportSources(ctx,ctx.attachments),[ctx]);const references=useMemo2(()=>({async search(q){const threads=await ctx.threads.list();const recent=[...threads].sort((a,b)=>b.updatedAt.localeCompare(a.updatedAt));const hits=q?filterByQuery(recent,q.replace(/^#/,""),t=>[String(t.mark),t.excerpt]):recent;return hits.slice(0,REF_LIMIT).map(t=>({key:t.id,label:`#${t.mark}`,detail:t.excerpt,threadId:t.id}))}}),[ctx]);return{mentions:{members},references,...caps&&caps.length>0?{capabilities:{list:caps}}:{},...conns&&conns.length>0?{connectors:{list:conns}}:{},...attach?{attach}:{},sources,...externalImport?{externalImport}:{}}}function draftBody(draft){const text=draft.text.trim();return text||draft.items.map(i=>i.kind==="file"?i.name:i.label).join("\u3001")}function messageOf(draft,members){const body=draftBody(draft);return{body,mentions:mentionsIn(body,members),extras:toMessageExtras(draft)}}async function readThreadHandoff(ctx,anchor){if(anchor.kind==="project")return{allowed:true};const artifacts=await ctx.artifacts.list();const current=ctx.version.current();let artifactId=current&¤t.id===anchor.versionId?current.artifactId:void 0;if(!artifactId){const versions=await Promise.all(artifacts.map(a=>ctx.version.list(a.id)));artifactId=versions.flat().find(v=>v.id===anchor.versionId)?.artifactId}const stage=artifacts.find(a=>a.id===artifactId)?.stage;const summary=(await ctx.stages.list()).find(s=>s.stage===stage);const kind=summary?.kind;return{allowed:kind===void 0||kind==="agent",defaultHandToAgent:summary?.defaultHandToAgent}}function useThreadHandoff(ctx,anchor){const loaded=useCtxData3(ctx,()=>anchor?readThreadHandoff(ctx,anchor):Promise.resolve({allowed:false}),[anchor?.versionId,anchor?.kind==="project"],["stage.*","version.*"]);return{...loaded,allowed:loaded.data?.allowed===true,defaultHandToAgent:loaded.data?.defaultHandToAgent}}async function publishThread(ctx,members,o){const{body,mentions,extras}=messageOf(o.draft,members);const send=ctx.member.can("submit-change")&&(o.hand||!!agentIn(body,members))&&(await readThreadHandoff(ctx,o.anchor)).allowed;const shotId=await o.shot?.((extras.attachments?.length??0)+(extras.refs?.length??0));const saved=await ctx.collab.createThread({anchor:o.anchor,body,mentions,...extras,...shotId?{attachments:[...extras.attachments??[],shotId]}:{}});if(send){try{await ctx.propose.changeRequest([saved.id])}catch(e){toast({kind:"bad",text:`\u610F\u89C1\u5DF2\u4FDD\u5B58\uFF0C\u672A\u80FD\u4EA4\u7ED9 ${agentLabel(members,ctx.project.agent)}`,detail:errorText(e)})}}return saved}function useSendLabel(ctx,o){const turn=useCtxData3(ctx,()=>ctx.turns.state(),[],THREAD_EVENTS3).data;const forced=agentIn(o.text,o.members);if(!o.canHand||!ctx.member.can("submit-change")||!(o.hand||forced))return"\u53D1\u9001";const name=forced?.displayName??memberName2(o.members,o.defaultAgent);return`\u53D1\u9001\u5E76\u4EA4\u7ED9 ${name} \xB7 ${turn?.current?"\u6392\u5230\u4E0B\u4E00\u56DE\u5408":"\u4F1A\u5F00\u59CB\u4E00\u4E2A\u56DE\u5408"}`}function shortSendLabel(full){const m=full.match(/^发送并交给 (.+?) · /);return m?`\u4EA4\u7ED9 ${m[1]}`:"\u53D1\u9001"}function HandToggle({ctx,text,members,defaultAgent,checked,onChange,bare,handoff}){const turn=useCtxData3(ctx,()=>ctx.turns.state(),[],THREAD_EVENTS3).data;if(handoff.error)return jsxs3(ErrorNote,{retry:handoff.reload,children:["\u9636\u6BB5\u6CA1\u8BFB\u51FA\u6765\uFF1A",handoff.error]});if(!handoff.allowed){return jsx3("span",{className:"band-comment-hint",children:handoff.data===void 0?"\u6B63\u5728\u8BFB\u53D6\u9636\u6BB5\u2026":"\u53D1\u5E03\u53EA\u4FDD\u5B58\u610F\u89C1\uFF1B\u9700\u8981 Agent \u4FEE\u6539\u65F6\uFF0C\u53EF\u4E0A\u6EAF\u5230\u4EA7\u51FA\u5B83\u7684 Agent \u9636\u6BB5"})}if(!ctx.member.can("submit-change")){return jsxs3("span",{className:"band-comment-hint",children:["\u4EA4\u7ED9 ",agentLabel(members,defaultAgent)," \u7531\u6709\u6743\u9650\u7684\u6210\u5458\u51B3\u5B9A"]})}const forced=agentIn(text,members);const name=forced?.displayName??memberName2(members,defaultAgent);return jsxs3("label",{className:"qfor","data-band-guide":"hand-to-agent",children:[jsx3("input",{className:"checkbox",type:"checkbox",checked:checked||!!forced,disabled:!!forced,onChange:e=>onChange(e.target.checked)}),jsxs3("span",{children:["\u4EA4\u7ED9 ",jsx3("span",{className:"ag",children:name}),turn?.current&&!bare?" \xB7 \u6392\u5230\u4E0B\u4E00\u56DE\u5408":""]})]})}function el(tag,className,text){const node=document.createElement(tag);node.className=className;if(text!==void 0)node.textContent=text;return node}function openConfirm(request,answer){if(typeof document==="undefined"){answer(false);return()=>{}}const opener=document.activeElement;let done=false;const reply=ok=>{if(done)return;done=true;answer(ok)};const dialog=el("dialog","pop band-comment-confirm");dialog.dataset.bandLayer="confirm";dialog.setAttribute("aria-label","\u5199\u7EBF\u4E0A\u786E\u8BA4");const head=el("div","pop-h");head.append(el("b","","\u5199\u7EBF\u4E0A\u9700\u8981\u4F60\u786E\u8BA4"));const note=el("div","band-comment-note");note.append("\u63D2\u4EF6 ",el("span","band-comment-code",request.from)," \u8981\u7ECF Band \u4EE3\u7406\u8C03\u7528 ",el("span","band-comment-code",`${request.method} ${request.path}`),`\uFF08\u8D44\u6E90 ${request.key}\uFF09\uFF0C\u4EE5\u4F60\u7684\u8EAB\u4EFD\u5199\u5165\u5E76\u8BB0\u5BA1\u8BA1\u3002`);const actions=el("div","band-comment-actions");const no=el("button","btn ghost sm","\u4E0D\u5199");no.type="button";const yes=el("button","btn primary sm","\u786E\u8BA4\u5199\u5165");yes.type="button";actions.append(no,yes);dialog.append(head,note,actions);no.addEventListener("click",()=>reply(false));yes.addEventListener("click",()=>reply(true));const onKey=withImeGuard4(e=>{if(e.key!=="Escape"||e.defaultPrevented||topLayer()!==dialog)return;e.preventDefault();reply(false)});dialog.addEventListener("cancel",e=>e.preventDefault());dialog.addEventListener("close",()=>reply(false));document.addEventListener("keydown",onKey);document.body.append(dialog);if(typeof dialog.showModal==="function")dialog.showModal();else dialog.setAttribute("open","");no.focus();return()=>{document.removeEventListener("keydown",onKey);done=true;if(dialog.open&&typeof dialog.close==="function")dialog.close();dialog.remove();if(opener instanceof HTMLElement&&opener.isConnected)opener.focus()}}var COMMENTING_ATTR="data-band-commenting";var MODE_HINT="\u8BC4\u8BBA\u6A21\u5F0F\uFF1A\u70B9\u9009\u8981\u8BC4\u8BBA\u7684\u5730\u65B9 \xB7 Esc \u9000\u51FA";var HINT_ANCHOR_SELECTOR="[data-band-comment-hint-anchor]";function useAnnotating2(ctx){const a=ctx.anchors.annotating;return useSyncExternalStore4(fn=>a.subscribe(fn),()=>a.get(),()=>false)}function CommentModeLayer({ctx,layer}){const on=useAnnotating2(ctx);const narrow=useNarrow();const{anchors}=ctx.collab;const hosts=useSyncExternalStore4(anchors.subscribe,anchors.hosts);const current=useSyncExternalStore4(fn=>ctx.version.subscribe(()=>fn()),()=>ctx.version.current()?.id??null,()=>null);const host=hosts.find(h=>h.annotate&&h.version?.id===current&&layerOf(h.mount)===layer);if(!on||narrow||!host||!ctx.member.can("comment"))return null;return jsx4(ModeFrame,{host,layer},`${host.plugin}@${host.version?.id}`)}function sameBox(a,b){return a===b||!!a&&!!b&&a.left===b.left&&a.top===b.top&&a.width===b.width&&a.height===b.height}function hasSelection(mount){const selection=mount.ownerDocument.getSelection();if(!selection||selection.isCollapsed||!selection.toString().trim()||!selection.rangeCount)return false;const range=selection.getRangeAt(0);return mount.contains(range.startContainer)&&mount.contains(range.endContainer)}function ModeFrame({host,layer}){const[box,setBox]=useState4(null);const[hover,setHover]=useState4(null);const measured=useRef5({box:null,hover:null});const[hint,setHint]=useState4(()=>!host.mount.hasAttribute(SELECTION_ATTR)&&!hasSelection(host.mount));useEffect4(()=>{const timer=setTimeout(()=>setHint(false),2300);return()=>clearTimeout(timer)},[]);useLayoutEffect3(()=>{const mount=host.mount;mount.setAttribute(COMMENTING_ATTR,"true");mount.removeAttribute(SELECTION_ATTR);let pointerX=0;let target=null;let frame=0;const measure=()=>{const r=(mount.querySelector(HINT_ANCHOR_SELECTOR)??mount).getBoundingClientRect();const nextBox={left:r.left,top:r.top,width:r.width,height:r.height};if(!sameBox(measured.current.box,nextBox)){measured.current.box=nextBox;setBox(nextBox)}const semanticHover=mount.querySelector("[data-text-comment-hover]")!==null;const t=semanticHover?null:target?.getBoundingClientRect();const timeline=target?.getAttribute("data-band-comment-target")==="timeline";const selected=candidatesOf(host)?.preferred;const nextHover=t&&t.width>0&&t.height>0&&(timeline||selected!=="box"&&selected!=="range")?timeline?{left:Math.max(t.left,Math.min(pointerX,t.right))-1,top:t.top,width:2,height:t.height}:{left:t.left-3,top:t.top-3,width:t.width+6,height:t.height+6}:null;if(!sameBox(measured.current.hover,nextHover)){measured.current.hover=nextHover;setHover(nextHover)}};const schedule=()=>{if(frame)return;frame=requestAnimationFrame(()=>{frame=0;measure()})};const move=e=>{const el2=e.target;const marked=el2 instanceof Element?el2.closest("[data-band-comment-target]"):null;target=el2 instanceof Element&&el2!==mount&&!el2.closest("button, input, select, textarea, [role=button], iframe")?mount.querySelector("[data-band-comment-target]")?marked:el2:null;if("clientX"in e&&typeof e.clientX==="number")pointerX=e.clientX;schedule()};const leave=()=>{target=null;schedule()};measure();const off=host.onLayout(schedule);mount.addEventListener("pointermove",move);mount.addEventListener("pointerleave",leave);window.addEventListener("resize",schedule);document.addEventListener("scroll",schedule,{capture:true,passive:true});return()=>{if(frame)cancelAnimationFrame(frame);off();mount.removeAttribute(COMMENTING_ATTR);mount.removeEventListener("pointermove",move);mount.removeEventListener("pointerleave",leave);window.removeEventListener("resize",schedule);document.removeEventListener("scroll",schedule,{capture:true})}},[host]);return createPortal2(jsxs4(Fragment2,{children:[hover&&jsx4("div",{className:"band-comment-mode-hover","data-timeline":hover.width===2||void 0,"aria-hidden":"true",style:hover}),hint&&box&&jsx4("output",{className:"band-comment-mode-hint",style:{left:box.left+box.width/2,top:box.top+12},children:MODE_HINT})]}),layer??document.body)}var ORDER=["moment","shot","cue"];function clock(seconds){const t=Math.max(0,Math.round(seconds*10)/10);const m=Math.floor(t/60);const s=(t-m*60).toFixed(1).padStart(4,"0");return`${m}:${s}`}function chipText(choice,anchor){const p=anchor.payload;const at=typeof p.seconds==="number"?clock(p.seconds):"";const label=anchorLabel2(anchor);switch(choice){case"moment":return`\u6B64\u523B ${at}`;case"shot":return label.startsWith("\u955C\u5934")?`\u6574\u4E2A${label}`:`\u6574\u4E2A\u955C\u5934 \xB7 ${label}`;case"cue":return label.startsWith("\u65C1\u767D")?`\u8FD9\u53E5${label}`:`\u8FD9\u53E5\u65C1\u767D\u300C${label}\u300D`;case"range":return`\u533A\u95F4 ${at}\u2013${typeof p.end==="number"?clock(p.end):""}`;case"box":return`\u753B\u9762\u6846 \xB7 ${at}`}}function pickHost(hosts,current){const withCandidates=hosts.filter(h=>h.candidates);return withCandidates.find(h=>h.version?.id===current)??withCandidates.at(-1)}function ResidentComposers({ctx,layer,drawer=false}){const narrow=useNarrow();const{anchors}=ctx.collab;const all=useSyncExternalStore5(anchors.subscribe,anchors.hosts);const hosts=useMemo3(()=>all.filter(h=>layerOf(h.mount)===layer),[all,layer]);const host=pickHost(hosts,ctx.version.current()?.id);const key=host?`${host.plugin}@${host.version?.id??`#${idOf(host)}`}`:null;return host&&(!host.annotate||drawer||narrow)?jsx5(Resident,{ctx,host},key):null}var ids=new WeakMap;var nextId=0;function idOf(h){let k=ids.get(h);if(k===void 0){k=++nextId;ids.set(h,k)}return k}function Resident({ctx,host}){useLayoutTick(host);const members=useMembers2(ctx);const bits=useComposerBits(ctx,members,"comment");const[draft,setDraft]=useState5(emptyDraft);useUnsavedGuard(hasContent(draft));const[handChoice,setHand]=useState5(null);const[pick,setPick]=useState5(null);const[pinned,setPinned]=useState5(null);const[menu,setMenu]=useState5(false);const[sending,setSending]=useState5(false);const root=useRef6(null);const[inline,setInline]=useState5(false);useLayoutEffect4(()=>{const next=root.current?.closest("[data-drawer], [data-comment-inline]")!=null;if(next!==inline)setInline(next)});const chipRef=useRef6(null);const cands=candidatesOf(host);const offered=cands?.anchors??{};const auto=cands?.preferred;const overruled=!!pick&&auto!==pick.over&&(auto==="range"||auto==="box");useEffect5(()=>{if(overruled)setPick(null)},[overruled]);const gesture=auto==="range"||auto==="box";const on=useAnnotating2(ctx);const narrow=useNarrow();const free=pick&&!overruled&&offered[pick.choice]?pick.choice:gesture?"moment":auto;const choice=pinned?.choice??free;const anchor=pinned?.anchor??(choice?offered[choice]:void 0);const handoff=useThreadHandoff(ctx,anchor);const hand=handChoice??handoff.defaultHandToAgent??true;const sendLabel=useSendLabel(ctx,{text:draft.text,members,defaultAgent:ctx.project.agent,hand,canHand:handoff.allowed});const mount=host.mount;const box=mount.getBoundingClientRect();if(box.width===0||box.height===0||!anchor||!choice)return null;const pin=(c,a)=>{setPinned({choice:c,anchor:a});host.reveal(a).catch(e=>console.error(`[band-comment] ${host.plugin} \u7684 reveal \u51FA\u9519\uFF1A`,e))};const onDraft=next=>{setDraft(next);if(!pinned&&(next.text.length>0||next.items.length>0))pin(choice,anchor)};const reset=()=>{setDraft(emptyDraft());setPinned(null);setPick(null);setHand(null)};const choose=c=>{setMenu(false);chipRef.current?.focus();const a=offered[c];if(!a)return;if(auto)setPick({choice:c,over:auto});if(pinned)pin(c,a)};const post=async d=>{if(handoff.data===void 0)return false;const problem=checkAnchorChoice(choice,anchor);if(problem)throw new Error(`\u610F\u89C1\u6CA1\u53D1\u51FA\u53BB\uFF1A\u951A\u70B9\u4E0D\u5BF9\uFF08${problem}\uFF09`);setSending(true);try{await publishThread(ctx,members,{anchor,draft:d,hand});reset()}finally{setSending(false)}};const items=ORDER.filter(c=>offered[c]);const canComment=ctx.member.can("comment");const viewport=document.documentElement.clientHeight||window.innerHeight;const collapsed=!!host.annotate&&!on&&!narrow&&!inline;return jsxs5("section",{ref:root,className:"band-comment-resident","aria-label":"\u8BC4\u8BBA",hidden:collapsed,"aria-busy":sending||void 0,"data-choice":choice,"data-inline":inline||void 0,style:inline?void 0:{left:box.left,width:box.width,bottom:Math.max(0,viewport-box.bottom)},children:[jsxs5("div",{className:"band-comment-resident-top",children:[jsx5("button",{ref:chipRef,type:"button",className:"band-comment-chip","aria-haspopup":"menu","aria-expanded":menu,"aria-label":`\u610F\u89C1\u6302\u5728\uFF1A${chipText(choice,anchor)}\uFF0C\u70B9\u5F00\u6539`,disabled:!canComment,onClick:()=>setMenu(m=>!m),children:chipText(choice,anchor)}),pinned&&jsx5("span",{className:"band-comment-resident-note",children:"\u5DF2\u6682\u505C"})]}),menu&&jsx5(ChipMenu,{items:items.map(c=>({choice:c,text:chipText(c,offered[c]),note:c===choice?"\u5DF2\u9009":c===auto?"\u7CFB\u7EDF\u63A8\u65AD":void 0})),current:choice,onPick:choose,trigger:chipRef,onClose:()=>{setMenu(false);chipRef.current?.focus()}}),jsx5(PromptInput,{variant:"comment",busy:handoff.data===void 0,label:"\u610F\u89C1",placeholder:choice==="moment"?"\u5728\u8FD9\u4E00\u523B\u8BC4\u8BBA\u2026\uFF08C\uFF09":`\u5BF9${chipText(choice,anchor)}\u8BC4\u8BBA\u2026\uFF08C\uFF09`,draft,onDraft,onSubmit:post,...bits,...canComment?{}:{disabledReason:"\u4F60\u5728\u8FD9\u4E2A\u9879\u76EE\u91CC\u4E0D\u80FD\u63D0\u610F\u89C1\uFF0C\u53EA\u80FD\u67E5\u770B\u3002"},footerStart:jsx5(HandToggle,{ctx,text:draft.text,members,defaultAgent:ctx.project.agent,handoff,checked:hand,onChange:setHand}),submitLabel:"\u53D1\u5E03",submitText:sending?"\u53D1\u5E03\u4E2D\u2026":"\u53D1\u5E03",hint:`Enter \u53D1\u5E03\uFF0CShift+Enter \u6362\u884C${sendLabel!=="\u53D1\u9001"?"\uFF0C\u4F1A\u5F00\u59CB\u4E00\u4E2A\u56DE\u5408":""}`,...pinned||hasContent(draft)?{footerEnd:jsx5("button",{type:"button",className:"btn ghost sm",onClick:reset,children:"\u53D6\u6D88"})}:{}})]})}function ChipMenu({items,current,onPick,onClose,trigger}){const ref=useRef6(null);useEffect5(()=>{const first=ref.current?.querySelector('[aria-checked="true"]')??ref.current?.querySelector('[role="menuitemradio"]');first?.focus()},[]);useEffect5(()=>{const onDown=e=>{const target=e.target;if(trigger.current?.contains(target))return;if(ref.current&&!ref.current.contains(target))onClose()};document.addEventListener("pointerdown",onDown,{capture:true});return()=>document.removeEventListener("pointerdown",onDown,{capture:true})},[onClose,trigger]);const onKeyDown=withImeGuard5(e=>{const all=[...e.currentTarget.querySelectorAll('[role="menuitemradio"]')];const i=all.indexOf(document.activeElement);let to;if(e.key==="ArrowDown")to=all[(i+1)%all.length];else if(e.key==="ArrowUp")to=all[(i-1+all.length)%all.length];else if(e.key==="Home")to=all[0];else if(e.key==="End")to=all.at(-1);else if(e.key==="Escape"||e.key==="Tab"){e.preventDefault();e.stopPropagation();onClose();return}else return;e.preventDefault();to?.focus()});return jsx5("div",{ref,className:"band-comment-chip-menu",role:"menu","aria-label":"\u610F\u89C1\u6302\u5728\u54EA",onKeyDown,children:items.map(it=>jsxs5("button",{type:"button",role:"menuitemradio","aria-checked":it.choice===current,onClick:()=>onPick(it.choice),children:[jsx5("span",{children:it.text}),it.note&&jsx5("small",{children:it.note})]},it.choice))})}var BOX_WIDTH=340;var EDGE2=8;var GAP2=10;function useAnnotating3(ctx){const a=ctx.anchors.annotating;return useSyncExternalStore6(fn=>a.subscribe(fn),()=>a.get(),()=>false)}function InPlaceComposers({ctx,layer,drawer=false}){const narrow=useNarrow();const{anchors}=ctx.collab;const all=useSyncExternalStore6(anchors.subscribe,anchors.hosts);const hosts=useMemo4(()=>all.filter(h=>layerOf(h.mount)===layer),[all,layer]);const host=pickHost(hosts.filter(entry=>entry.annotate),ctx.version.current()?.id);const key=host?`${host.plugin}@${host.version?.id??""}`:null;return host&&!drawer&&!narrow?jsx6(InPlace,{ctx,host,layer},key):null}function InPlace({ctx,host,layer}){useLayoutTick(host);const on=useAnnotating3(ctx);const cands=candidatesOf(host);const preferred=cands?.preferred;const offered=cands?.anchors??{};const autoAnchor=preferred?offered[preferred]:void 0;const autoSig=preferred&&autoAnchor?signature(preferred,autoAnchor):null;const liveCandidates=useRef7(cands);liveCandidates.current=cands;const[selection,setSelection]=useState6(null);const[done,setDone]=useState6(null);const[gesturing,setGesturing]=useState6(false);const[draft,setDraft]=useState6(null);useEffect6(()=>{if(!on){setGesturing(false);return}const next=liveCandidates.current;const choice2=next?.preferred;const anchor2=choice2?next?.anchors[choice2]:void 0;if(choice2!=="range"&&choice2!=="box"||!anchor2||!autoSig||!next)return;setSelection({sig:autoSig,choice:choice2,anchor:anchor2,anchors:next.anchors})},[on,autoSig]);useEffect6(()=>{if(!on)return;const mount=host.mount;let active=true;let gesture=false;let timeline=false;let timer=0;let pointerId=null;const idOf2=event=>{const id=event.pointerId;return typeof id==="number"?id:null};const samePointer=event=>pointerId===null||idOf2(event)===pointerId;const onDown=event=>{if(gesture&&!samePointer(event))return;window.clearTimeout(timer);const target=event.target instanceof Element?event.target:null;gesture=!!target&&!target.closest("button, input, select, a");pointerId=gesture?idOf2(event):null;setGesturing(gesture);timeline=gesture&&!!target?.closest('[role="slider"]')};const onUp=event=>{if(!gesture||!samePointer(event))return;gesture=false;pointerId=null;const wasTimeline=timeline;timeline=false;timer=window.setTimeout(()=>{timer=0;if(!active)return;setGesturing(false);if(!ctx.anchors.annotating.get())return;const next=candidatesOf(host);const choice2=next?.preferred;const anchor2=choice2?next?.anchors[choice2]:void 0;if(!choice2||!anchor2||!next)return;if(!wasTimeline&&choice2!=="range"&&choice2!=="box")return;setDone(null);setSelection({sig:signature(choice2,anchor2),choice:choice2,anchor:anchor2,anchors:next.anchors})},0)};const onCancel=event=>{if(!gesture||!samePointer(event))return;window.clearTimeout(timer);setGesturing(false);gesture=false;pointerId=null;timeline=false};const onOutsideUp=event=>{if(event.target instanceof Node&&mount.contains(event.target))return;onCancel(event)};window.addEventListener("pointerup",onOutsideUp,true);window.addEventListener("pointercancel",onCancel,true);mount.addEventListener("pointerdown",onDown,true);mount.addEventListener("pointerup",onUp,true);mount.addEventListener("pointercancel",onCancel,true);return()=>{active=false;window.clearTimeout(timer);window.removeEventListener("pointerup",onOutsideUp,true);window.removeEventListener("pointercancel",onCancel,true);mount.removeEventListener("pointerdown",onDown,true);mount.removeEventListener("pointerup",onUp,true);mount.removeEventListener("pointercancel",onCancel,true)}},[on,host,ctx]);useUnsavedGuard2((draft?.text.trim().length??0)>0);if(!on||!cands||!selection||!ctx.member.can("comment")||done===selection.sig)return null;const{sig,anchor,choice}=selection;const mine=draft?.sig===sig?draft:{sig,text:"",hand:null};return jsx6(InPlaceBox,{temporarilyHidden:gesturing,ctx,host,anchor,choice,choices:selection.anchors,onChoice:next=>{const picked=selection.anchors[next];if(!picked)return;setSelection({...selection,choice:next,anchor:picked});void host.reveal(picked).catch(error=>ctx.report(error))},layer,text:mine.text,hand:mine.hand,onText:text=>setDraft({sig,text,hand:mine.hand}),onHand:hand=>setDraft({sig,text:mine.text,hand}),onDone:()=>{setDone(sig);setSelection(null);setDraft(null)}},sig)}function signature(choice,anchor){return`${choice}:${JSON.stringify(anchor.payload)}`}function whereText(name,shot,anchor,choice){const p=anchor.payload;const at=typeof p.seconds==="number"?clock(p.seconds):"";const head=[name,shot].filter(Boolean).join(" \u203A ");const what=choice==="range"?`${at}\u2013${typeof p.end==="number"?clock(p.end):""}`:choice==="box"?`${at} \xB7 ${isPoint(p.rect)?"\u4E00\u70B9":"\u753B\u9762\u6846"}`:chipText(choice,anchor);return`${head}${head?" \u203A ":""}${what}`}function isPoint(rect){if(!rect||typeof rect!=="object")return true;const r=rect;return r.w===0&&r.h===0}function InPlaceShell({ctx,host,anchor,layer,label,busy,onDone,children,className="pop band-comment-inplace field-host",temporarilyHidden=false}){const el2=useRef7(null);const place=useBoxPos(el2,ctx,host,anchor);const ready=!temporarilyHidden&&place.visibility!=="hidden";const focused=useRef7(false);useLayoutEffect5(()=>{if(!ready||focused.current)return;const input=el2.current?.querySelector('textarea, [contenteditable="true"]');if(!input)return;input.focus({preventScroll:true});focused.current=document.activeElement===input},[ready]);const owned=useRef7(anchor);useEffect6(()=>{owned.current=anchor;ctx.selection.set({kind:"anchor",anchor})},[ctx,anchor]);useEffect6(()=>()=>{const previous=owned.current;queueMicrotask(()=>{const selected=ctx.selection.get();if(selected?.kind==="anchor"&&selected.anchor.id===previous.id)ctx.selection.set(null)})},[ctx]);return createPortal3(jsx6("dialog",{open:true,ref:el2,className,"aria-label":label,"aria-busy":busy||void 0,style:temporarilyHidden?{...place,visibility:"hidden"}:place,"data-band-dialog":"new-comment","data-band-guide-keep":"",onKeyDown:withImeGuard6(event=>{if(event.key!=="Escape"||event.defaultPrevented)return;event.preventDefault();onDone()}),children}),layer??document.body)}function InPlaceBox({ctx,host,anchor,choice,choices,onChoice,layer,text,hand:handChoice,onText,onHand,onDone,temporarilyHidden}){const members=useMembers3(ctx);const handoff=useThreadHandoff(ctx,anchor);const hand=handChoice??handoff.defaultHandToAgent??true;const[sending,setSending]=useState6(false);const[error,setError]=useState6(null);const[menu,setMenu]=useState6(false);const trigger=useRef7(null);const area=useRef7(null);const artifacts=useCtxData4(ctx,()=>ctx.artifacts.list(),[],"version.*").data;const artifactName=artifacts?.find(a=>a.id===host.version?.artifactId)?.name;const shot=useShotAt(ctx,host,anchor,choice);const send=async()=>{if(!text.trim()||sending||handoff.data===void 0)return;setSending(true);setError(null);try{const problem=checkAnchorChoice2(choice,anchor);if(problem)throw new Error(`\u610F\u89C1\u6CA1\u53D1\u51FA\u53BB\uFF1A\u951A\u70B9\u4E0D\u5BF9\uFF08${problem}\uFF09`);await publishThread(ctx,members,{anchor,draft:{...emptyDraft2(),text},hand});onDone()}catch(e){setError(e instanceof Error?e.message:String(e))}finally{setSending(false)}};const loc=whereText(artifactName,shot,anchor,choice);const sendLabel=useSendLabel(ctx,{text,members,defaultAgent:ctx.project.agent,hand,canHand:handoff.allowed});return jsxs6(InPlaceShell,{temporarilyHidden,className:"pop band-comment-inplace field-host",ctx,host,anchor,layer,label:`\u5199\u8BC4\u8BBA\uFF1A${loc}`,busy:sending,onDone,children:[jsxs6("div",{className:"pop-h",children:[jsx6("button",{ref:trigger,type:"button",className:"band-comment-chip band-comment-inplace-loc","aria-label":`\u610F\u89C1\u6302\u5728\uFF1A${chipText(choice,anchor)}\uFF0C\u70B9\u5F00\u6539`,"aria-haspopup":"menu","aria-expanded":menu,disabled:sending,onClick:()=>setMenu(open=>!open),children:chipText(choice,anchor)}),jsx6("button",{type:"button",className:"x","aria-label":"\u5173\u95ED",onClick:onDone,children:"\xD7"})]}),menu&&jsx6(ChipMenu,{items:["moment","shot","cue"].flatMap(item=>{const option=choices[item];return option?[{choice:item,text:chipText(item,option),note:item===choice?"\u5DF2\u9009":void 0}]:[]}),current:choice,onPick:next=>{onChoice(next);setMenu(false);area.current?.focus()},trigger,onClose:()=>{setMenu(false);trigger.current?.focus()}}),jsx6("textarea",{ref:area,className:"field bare band-comment-inplace-text",rows:2,"aria-label":"\u8BC4\u8BBA",placeholder:"\u5199\u8BC4\u8BBA\uFF0C@ \u63D0\u5230\u6210\u5458\u2026",value:text,onChange:e=>onText(e.target.value),onKeyDown:withImeGuard6(e=>{if(e.key==="Enter"&&!e.shiftKey){e.preventDefault();void send()}})}),error&&jsx6(ErrorNote2,{children:error}),jsxs6("div",{className:"band-comment-inplace-foot",children:[jsx6(HandToggle,{ctx,text,members,defaultAgent:ctx.project.agent,handoff,checked:hand,onChange:onHand,bare:true}),jsxs6("span",{className:"band-comment-inplace-actions",children:[jsx6("button",{type:"button",className:"btn sm",onClick:onDone,children:"\u53D6\u6D88"}),jsx6("button",{type:"button",className:"btn primary sm","aria-label":sendLabel,title:sendLabel,disabled:sending||!text.trim()||handoff.data===void 0,onClick:()=>void send(),children:sending?"\u53D1\u9001\u4E2D\u2026":shortSendLabel(sendLabel)})]})]})]})}function useShotAt(ctx,host,anchor,choice){const versionId=host.version?.id;const seconds=typeof anchor.payload.seconds==="number"?anchor.payload.seconds:void 0;const board=useCtxData4(ctx,async()=>{if(!versionId||!host.version?.entries.some(entry=>entry.path===SHOT_LIST_PATH))return null;try{return parseShotList(await ctx.version.readFile(SHOT_LIST_PATH,{versionId}))}catch{return null}},[versionId],"version.*").data;if(!board||seconds===void 0)return void 0;const at=choice==="range"?seconds:seconds+.001;const i=board.shots.findIndex(s=>at>=s.start&&at<s.end);const shot=i>=0?board.shots[i]:void 0;return shot?`\u955C\u5934 ${i+1}${shot.title?` \xB7 ${shot.title}`:""}`:void 0}function placeInPlace(target,bounds,w,h,above,vw,vh){const width=Math.min(w,Math.max(0,bounds.right-bounds.left-2*EDGE2));const clamp=(v,lo2,hi2)=>Math.max(lo2,Math.min(v,hi2));const lo=bounds.left+EDGE2;const hi=Math.max(lo,bounds.right-width-EDGE2);const left=clamp(clamp(above?(target.left+target.right-width)/2:target.left,lo,hi),EDGE2,Math.max(EDGE2,vw-width-EDGE2));const below=target.bottom+GAP2;const upper=target.top-GAP2-h;const top=above?clamp(upper,EDGE2,vh-h-EDGE2):below+h<=vh-EDGE2?clamp(below,EDGE2,vh-h-EDGE2):clamp(upper,EDGE2,vh-h-EDGE2);return{left,top,width}}function useBoxPos(el2,ctx,host,anchor){const[pos,setPos]=useState6(null);const p=anchor.payload;const seconds=typeof p.seconds==="number"?p.seconds:void 0;const path=typeof p.path==="string"?p.path:void 0;const frameAnchor=useMemo4(()=>{if(!path||seconds===void 0)return null;try{return ctx.anchors.make("timecode",{path,label:"\u753B\u9762",seconds,rect:{x:0,y:0,w:1,h:1}})}catch{return null}},[ctx,path,seconds]);useLayoutEffect5(()=>{const node=el2.current;if(!node)return;const measure=()=>{const mount=host.mount.getBoundingClientRect();const place=locateSafely(host,anchor);let target=null;if(place.at==="rects"&&place.rects.length>0){const rect=[...place.rects].reverse().find(r=>r.width>0||r.height>0)??place.rects.at(-1);if(rect)target={left:mount.left+rect.x,top:mount.top+rect.y,right:mount.left+rect.x+rect.width,bottom:mount.top+rect.y+rect.height}}else if(place.at==="track"){let endX=mount.left+place.x;const range=candidatesOf(host)?.anchors.range;const payload=anchor.payload;if(range&&typeof payload.end==="number"&&range.payload.path===payload.path&&range.payload.seconds===payload.seconds&&range.payload.end===payload.end){endX+=place.w??0;const track=host.mount.querySelector('[data-band-comment-target="timeline"]');const raw=track?.dataset.bandCommentX;const x=raw===void 0||raw.trim()===""?Number.NaN:Number(raw);if(track&&Number.isFinite(x)){const rect=track.getBoundingClientRect();endX=rect.left+Math.max(0,Math.min(x,rect.width))}}target={left:endX,top:mount.top+place.y,right:endX,bottom:mount.top+place.y}}if(!target)return;let bounds={left:mount.left,top:mount.top,right:mount.right,bottom:mount.bottom};const frame2=frameAnchor?locateSafely(host,frameAnchor):null;const f=frame2&&frame2.at==="rects"?frame2.rects[0]:void 0;if(f){bounds={left:mount.left+f.x,top:mount.top+f.y,right:mount.left+f.x+f.width,bottom:mount.top+f.y+f.height}}const at=placeInPlace(target,bounds,BOX_WIDTH,node.offsetHeight,place.at==="track",window.innerWidth,window.innerHeight);setPos(at)};let frame=0;const schedule=()=>{if(!frame){frame=requestAnimationFrame(()=>{frame=0;measure()})}};const onScroll=e=>{if(e.target instanceof Node&&node.contains(e.target))return;schedule()};measure();const off=host.onLayout(schedule);window.addEventListener("resize",schedule);document.addEventListener("scroll",onScroll,{capture:true,passive:true});const ro=typeof ResizeObserver==="undefined"?null:new ResizeObserver(measure);ro?.observe(node);return()=>{if(frame)cancelAnimationFrame(frame);off();window.removeEventListener("resize",schedule);document.removeEventListener("scroll",onScroll,{capture:true});ro?.disconnect()}},[el2,host,frameAnchor,anchor]);if(!pos)return{position:"fixed",left:0,top:0,width:BOX_WIDTH,visibility:"hidden"};return{position:"fixed",left:pos.left,top:pos.top,width:pos.width}}function MaterialDiscussions({ctx,version}){const api=ctx.materialDiscussions;const writer=ctx.collab.materialDiscussions;const read=useCtxData5(ctx,()=>{if(!api)return Promise.reject(new Error("\u5F53\u524D\u5BBF\u4E3B\u4E0D\u652F\u6301\u7D20\u6750\u610F\u89C1"));return api.read(version)},[version.artifactId,version.versionId],["material.discussion.*","member.*","project.*"]);const people=useMembers4(ctx);const[draft,setDraft]=useState7("");const[reply,setReply]=useState7("");const[replyTo,setReplyTo]=useState7(null);const[busy,setBusy]=useState7(false);const[error,setError]=useState7(null);const data=read.data;const writable=data?.canWrite===true&&writer!==void 0;const run=async(work,done)=>{setBusy(true);setError(null);try{await work();done?.();read.reload()}catch(e){setError(errorText2(e));read.reload()}finally{setBusy(false)}};return jsxs7("section",{className:"band-material-discussions","aria-label":"\u7D20\u6750\u7248\u672C\u610F\u89C1",children:[read.error&&jsx7(ErrorNote3,{retry:read.reload,children:read.error}),!data&&!read.error&&jsx7("output",{children:"\u6B63\u5728\u8BFB\u53D6\u610F\u89C1\u2026"}),data&&jsxs7(Fragment3,{children:[jsxs7("div",{className:"band-material-discussions-context",children:[jsx7("strong",{children:data.version.entries[0]?.path}),jsxs7("span",{children:["\u7B2C ",data.versionNumber," \u7248 \xB7 ",data.current?"\u5F53\u524D\u7248\u672C":"\u65E7\u7248\u672C"]}),!writable&&jsx7("output",{children:data.deleted?"\u7D20\u6750\u5DF2\u5220\u9664\uFF0C\u610F\u89C1\u4EC5\u53EF\u67E5\u770B":!data.current?"\u65E7\u7248\u672C\u7684\u610F\u89C1\u4EC5\u53EF\u67E5\u770B":"\u5F53\u524D\u4EC5\u53EF\u67E5\u770B\u610F\u89C1"})]}),error&&jsx7(ErrorNote3,{children:error}),writable&&jsxs7("form",{className:"band-material-discussion-form",onSubmit:e=>{e.preventDefault();const path=data.version.entries[0]?.path;if(!writer||!path||!draft.trim()||busy)return;void run(()=>writer.create(version,{path,body:draft.trim()}),()=>setDraft(""))},children:[jsx7("label",{htmlFor:"band-material-new-opinion",children:"\u5BF9\u8FD9\u4E00\u7248\u6587\u4EF6\u8BC4\u8BBA"}),jsx7("textarea",{id:"band-material-new-opinion",className:"field fill",value:draft,onChange:e=>setDraft(e.target.value),rows:3,disabled:busy}),jsx7("div",{className:"band-material-discussion-actions",children:jsx7("button",{className:"btn primary sm",type:"submit",disabled:busy||!draft.trim(),children:"\u53D1\u5E03\u610F\u89C1"})})]}),data.threads.length===0&&jsx7("p",{className:"band-material-discussions-empty",children:"\u8FD9\u4E00\u7248\u8FD8\u6CA1\u6709\u610F\u89C1"}),jsx7("div",{className:"band-material-discussions-list",children:data.threads.map(({thread})=>jsxs7("article",{className:"band-material-discussion-card","aria-label":`\u610F\u89C1 #${thread.mark}`,children:[jsxs7("div",{className:"band-material-discussion-meta",children:[jsxs7("strong",{children:["#",thread.mark]}),jsx7("span",{children:thread.status==="resolved"?"\u5DF2\u5173\u95ED":"\u5F85\u5904\u7406"})]}),data.comments.filter(c=>c.threadId===thread.id).map(comment=>jsxs7("div",{className:"band-material-discussion-message",children:[jsxs7("div",{className:"band-material-discussion-meta",children:[jsx7("span",{children:memberName3(people,comment.author.id)}),jsx7("time",{dateTime:comment.createdAt,children:shortTime(comment.createdAt)})]}),jsx7("p",{children:comment.body})]},comment.id)),writable&&writer&&jsx7("div",{className:"band-material-discussion-actions",children:thread.status==="open"?jsxs7(Fragment3,{children:[jsx7("button",{type:"button",className:"btn ghost sm","aria-label":`\u56DE\u590D\u610F\u89C1 #${thread.mark}`,disabled:busy,onClick:()=>{setReplyTo(thread.id);setReply("")},children:"\u56DE\u590D"}),jsx7("button",{type:"button",className:"btn ghost sm","aria-label":`\u5173\u95ED\u610F\u89C1 #${thread.mark}`,disabled:busy,onClick:()=>void run(()=>writer.close(thread.id)),children:"\u5173\u95ED\u610F\u89C1"})]}):jsx7("button",{type:"button",className:"btn ghost sm","aria-label":`\u91CD\u5F00\u610F\u89C1 #${thread.mark}`,disabled:busy,onClick:()=>void run(()=>writer.reopen(thread.id)),children:"\u91CD\u5F00\u610F\u89C1"})}),writable&&writer&&thread.status==="open"&&replyTo===thread.id&&jsxs7("form",{className:"band-material-discussion-form",onSubmit:e=>{e.preventDefault();if(!reply.trim()||busy)return;void run(()=>writer.comment(thread.id,reply.trim()),()=>{setReply("");setReplyTo(null)})},children:[jsxs7("label",{htmlFor:`reply-${thread.id}`,children:["\u56DE\u590D\u610F\u89C1 #",thread.mark]}),jsx7("textarea",{id:`reply-${thread.id}`,className:"field fill",value:reply,onChange:e=>setReply(e.target.value),rows:2,disabled:busy}),jsx7("div",{className:"band-material-discussion-actions",children:jsx7("button",{type:"submit",className:"btn primary sm",disabled:busy||!reply.trim(),children:"\u53D1\u9001\u56DE\u590D"})})]})]},thread.id))})]})]})}function installMaterialDiscussions(ctx){const layers=ctx.layers;if(!ctx.materialDiscussions||!ctx.collab.materialDiscussions||!layers)return()=>{};let layer;const mount=reactMount((owner,version)=>jsx7(MaterialDiscussions,{ctx:owner,version}));const off=ctx.collab.requests.handle("material.discussions.open",request=>{layer?.close();layer=layers.open({title:"\u7D20\u6750\u610F\u89C1"},el2=>mount(ctx,el2,request.version))});return()=>{off();layer?.close()}}function pickBody(anchor){const label=anchor.payload.label;return typeof label==="string"&&label?`\u7528${label}`:"\u7528\u8FD9\u6761\u5019\u9009"}var messageOf2=e=>e instanceof Error&&e.message?e.message:"\u51FA\u9519\u4E86";async function sendPick(ctx,anchor){if(!ctx.member.can("submit-change")){toast2({kind:"bad",text:"\u4E0D\u80FD\u9009\u7528\u8FD9\u4E00\u6761",detail:"\u4EA4\u7ED9 Rondo \u8981\u6709\u63D0\u4EA4\u4FEE\u6539\u7684\u6743\u9650"});return}try{const t=await ctx.collab.createThread({anchor,body:pickBody(anchor),intent:"pick",handToAgent:true});toast2({text:"\u5DF2\u4EA4\u7ED9 Rondo",detail:typeof anchor.payload.label==="string"?anchor.payload.label:void 0,action:{label:"\u64A4\u9500",onClick:()=>void undoPick(ctx,t.id)}})}catch(e){toast2({kind:"bad",text:"\u6CA1\u80FD\u4EA4\u7ED9 Rondo",detail:messageOf2(e)})}}async function undoPick(ctx,threadId){try{await ctx.collab.undoPick(threadId);toast2({text:"\u5DF2\u64A4\u9500"})}catch(e){toast2({kind:"bad",text:"\u6CA1\u80FD\u64A4\u9500",detail:messageOf2(e)})}}function watchPickSettling(ctx){let running=false;let again=false;let live=true;const sweep=async()=>{if(running){again=true;return}running=true;try{do{again=false;if(!live||!ctx.member.can("comment"))return;const threads=await ctx.threads.list({status:["awaiting_confirm"]});for(const t of threads){if(!live)return;if(t.intent!=="pick")continue;await ctx.collab.settlePick(t.id).catch(()=>{})}}while(again&&live)}catch{}finally{running=false}};const off=ctx.events.subscribe("thread.*",()=>void sweep());const offTurn=ctx.events.subscribe("turn.delivered",()=>void sweep());void sweep();return()=>{live=false;off();offTurn()}}function ReceiptOptions({ctx,thread,comment,comments}){const[busy,setBusy]=useState8(false);const[chosen,setChosen]=useState8();const[error,setError]=useState8();const options=comment.receipt?.options;if(!options)return null;const selected=comments.find(c=>c.choice?.receiptCommentId===comment.id)?.choice?.choiceId??chosen;const enabled=ctx.member.can("comment")&&thread.status==="open"&&comment.receipt?.optionsOpen===true&&!selected;const choose=async(id,label)=>{if(!enabled||busy)return;setBusy(true);setError(void 0);try{await ctx.collab.comment(thread.id,label,{choice:{receiptCommentId:comment.id,choiceId:id}});setChosen(id)}catch(e){setError(errorText3(e))}finally{setBusy(false)}};return jsxs8("fieldset",{className:"band-comment-receipt-options","aria-label":"\u56DE\u7B54\u8FD9\u4E2A\u95EE\u9898","aria-busy":busy,children:[options.map(option=>jsxs8("button",{type:"button",className:"btn ghost sm band-comment-option",disabled:!enabled||busy,"aria-pressed":selected===option.id,onClick:()=>choose(option.id,option.label),children:[jsxs8("span",{className:"band-comment-option-title",children:[option.label,option.recommended&&jsx8("span",{className:"chip",children:"\u63A8\u8350"}),selected===option.id&&jsx8("span",{children:"\u5DF2\u9009\u62E9"})]}),option.why&&jsx8("span",{className:"band-comment-option-why",children:option.why})]},option.id)),jsx8("span",{className:"band-comment-option-why",children:selected?"\u5DF2\u56DE\u7B54\uFF0C\u53EF\u4EE5\u5728\u4E0B\u65B9\u7EE7\u7EED\u8865\u5145":enabled?"\u4E5F\u53EF\u4EE5\u5728\u4E0B\u65B9\u76F4\u63A5\u56DE\u590D":"\u8FD9\u4E2A\u95EE\u9898\u5F53\u524D\u4E0D\u53EF\u9009\u62E9"}),jsx8(ErrorNote4,{children:error})]})}function ReceiptCitations({ctx,citations}){const artifacts=useCtxData6(ctx,()=>ctx.artifacts.list(),[],"version.*").data;const[busy,setBusy]=useState8(false);const[error,setError]=useState8();const open=async citation=>{if(busy)return;setBusy(true);setError(void 0);try{const version=(await ctx.version.list(citation.artifactId)).find(v=>v.id===citation.versionId&&v.artifactId===citation.artifactId);if(!version){setError("\u5F15\u7528\u4E0D\u53EF\u7528");return}const target=citation.anchorId?(await ctx.threads.list()).find(t=>t.anchor.id===citation.anchorId&&t.anchor.versionId===version.id):void 0;const resolved=target?await ctx.collab.anchors.resolve(target.anchor,version):void 0;let located=Boolean(target&&resolved!==null&&resolved!==void 0);const dialog=ctx.services.find("@kanyun-ai-infra/band-project/artifact-dialog");if(dialog)dialog.open({artifactId:version.artifactId,versionId:version.id,...located&&target?{threadId:target.id}:{}});else{ctx.collab.showVersion(version);if(located&&target){const host=ctx.collab.anchors.hosts().find(h=>h.version?.id===version.id);located=host?await host.reveal({...target.anchor,payload:resolved??target.anchor.payload}):false}}if(citation.anchorId&&!located){const text="\u4F4D\u7F6E\u5DF2\u4E0D\u53EF\u7528\uFF0C\u5DF2\u6253\u5F00\u5F15\u7528\u7248\u672C";if(dialog)toast3({kind:"bad",text});else setError(text)}}catch{setError("\u5F15\u7528\u4E0D\u53EF\u7528")}finally{setBusy(false)}};return jsxs8("div",{className:"band-comment-citations","aria-label":"\u56DE\u6267\u4F9D\u636E","aria-busy":busy,children:[citations.map((citation,n)=>{const name=artifacts?.find(a=>a.id===citation.artifactId)?.name;return jsx8("button",{type:"button",className:"btn ghost sm","aria-label":`\u67E5\u770B\u4F9D\u636E${name?`\uFF1A${name}`:""}`,disabled:busy,onClick:()=>open(citation),children:name??`\u4F9D\u636E ${n+1}`},JSON.stringify(citation))}),jsx8(ErrorNote4,{children:error})]})}var NOT_ASSIGNED="\u6CA1\u6709 collab\uFF1A\u90E8\u7F72\u65B9\u6848\uFF08band.profiles.yaml\uFF09\u6CA1\u628A\u9501\u5B9A\u89D2\u8272 comment \u6307\u6D3E\u7ED9 @kanyun-ai-infra/band-comment";var PROCESS_NO_COMMENT="\u8FC7\u7A0B\u6587\u6863\u4E0D\u80FD\u63D0\u610F\u89C1\uFF1B\u8981\u6539\u5B83\uFF0C\u5230\u4EA7\u7269\u6216\u5BF9\u8BDD\u91CC\u8BF4";var mode=defineScopeState2(ctx=>{if(!ctx.collab)throw new Error(NOT_ASSIGNED);const state=createState(null);let sessions=0;ctx.collab.requests.handle("thread.openAt",r=>{if(r.intent==="pick"){void sendPick(ctx,r.anchor);return}const hand=handOfSelection();const layer=popLayer(ctx.project.id)??null;const viaMode=ctx.anchors.annotating.get()&&r.anchor.kind!=="artifact"&&r.anchor.kind!=="project"&&ctx.collab.anchors.hosts().some(host=>{if(!host.annotate||host.version?.id!==r.anchor.versionId||!host.kinds.includes(r.anchor.kind)||layerOf(host.mount)!==layer)return false;const place=locateSafely(host,r.anchor);return place.at==="rects"&&place.rects.length>0||place.at==="track"});const open=()=>{const prev=state.get();const keep=prev?.kind==="new"&&prev.from===r.from&&r.draft===void 0;state.set({kind:"new",anchor:r.anchor,draft:r.draft??"",handToAgent:r.handToAgent,viaMode,from:r.from,session:keep?prev.session:++sessions,fresh:hand?{hand}:{}})};const versionId=r.anchor.versionId;if(versionId===void 0)return open();void ctx.artifacts.list().then(list=>{const viewing=ctx.version.current();const id=viewing?.id===versionId?viewing.artifactId:void 0;const a=list.find(x=>x.id===id||x.latest?.versionId===versionId);if(a?.role==="process")throw new Error(PROCESS_NO_COMMENT);open()}).catch(e=>ctx.report(e))});ctx.collab.requests.handle("pick.undo",r=>{void undoPick(ctx,r.threadId)});ctx.collab.requests.handle("thread.open",r=>{if(!window.matchMedia?.(NARROW_QUERY).matches)ctx.anchors.annotating.set(true);state.set({kind:"thread",threadId:r.threadId});const opened=state.get();revealThread(ctx,r.threadId,()=>state.get()!==opened).catch(e=>ctx.report(e))});ctx.collab.requests.handle("resource.confirm",r=>{if(state.get()?.kind==="confirm")return r.answer(false);state.set({kind:"confirm",request:r})});let confirming=null;state.subscribe(()=>{const m=state.get();if(confirming&&(m?.kind!=="confirm"||m.request!==confirming.request)){confirming.remove();confirming.request.answer(false);confirming=null}if(m?.kind==="confirm"&&!confirming){const request=m.request;confirming={request,remove:openConfirm(request,ok=>{request.answer(ok);if(state.get()===m)state.set(null)})}}});return state},{dispose(state){const m=state.get();if(m?.kind==="confirm"){m.request.answer(false);state.set(null)}}});var QUOTE_KEY_PREFIX="quote-";function quoteLabel(c,members){const text=c.body.replace(/\s+/g," ").trim();const short=text.length>24?`${text.slice(0,24)}\u2026`:text;return`\u5F15\u7528 ${memberName4(members,c.author.id)}\uFF1A${short}`}var quoting=defineScopeState2(ctx=>{if(!ctx.collab)throw new Error(NOT_ASSIGNED);const pending=createState(null);const chats=new Set;const reachable=()=>[...chats].some(box=>{const el2=box();if(!el2)return true;return[...document.querySelectorAll("dialog[open]")].filter(isModal).every(d=>d.contains(el2))});ctx.collab.requests.handle("thread.quote",r=>{void(async()=>{if(!ctx.member.can("comment"))throw new Error("\u4F60\u5728\u8FD9\u4E2A\u9879\u76EE\u91CC\u4E0D\u80FD\u63D0\u610F\u89C1\uFF0C\u5F15\u7528\u6CA1\u6709\u653E\u8FDB\u53D1\u9001\u6846");const[comments,members]=await Promise.all([ctx.threads.comments(r.threadId),ctx.members.list()]);const c=comments.find(x=>x.id===r.commentId);if(!c)throw new Error(`\u7EBF\u7A0B ${r.threadId} \u91CC\u6CA1\u6709\u6D88\u606F ${r.commentId}`);const item={kind:"text",key:`${QUOTE_KEY_PREFIX}${crypto.randomUUID()}`,label:quoteLabel(c,members),text:c.body.slice(0,MESSAGE_REF_TEXT_MAX)};if(reachable()){pending.set({target:"chat",item});return}const state=mode.of(ctx);if(state.get()?.kind==="confirm")throw new Error("\u6709\u4E00\u4E2A\u786E\u8BA4\u5728\u7B49\uFF0C\u5904\u7406\u5B8C\u518D\u5F15\u7528");const thread=(await ctx.threads.list()).find(t=>t.id===r.threadId);if(thread?.status==="resolved")throw new Error("\u8FD9\u6761\u7EBF\u7A0B\u5DF2\u89E3\u51B3\uFF0C\u4E0D\u80FD\u56DE\u590D\uFF0C\u5F15\u7528\u6CA1\u6709\u653E\u8FDB\u53BB");state.set({kind:"thread",threadId:r.threadId});const opened=state.get();pending.set({target:r.threadId,item});await revealThread(ctx,r.threadId,()=>state.get()!==opened)})().catch(e=>ctx.report(e))});ctx.collab.requests.handle("anchor.quote",r=>{void(async()=>{if(!ctx.member.can("comment"))throw new Error("\u4F60\u5728\u8FD9\u4E2A\u9879\u76EE\u91CC\u4E0D\u80FD\u63D0\u610F\u89C1\uFF0C\u5F15\u7528\u6CA1\u6709\u653E\u8FDB\u53D1\u9001\u6846");if(!reachable())throw new Error("\u8FD9\u91CC\u6CA1\u6709\u5BF9\u8BDD\u53D1\u9001\u6846\uFF0C\u5F15\u7528\u6CA1\u6709\u653E\u8FDB\u53BB");const versionId=r.anchor.versionId;if(versionId){const arts=await ctx.artifacts.list();if(!arts.some(a=>a.latest?.versionId===versionId))throw new Error("\u6B63\u5728\u770B\u65E7\u7248\u672C\uFF0C\u56DE\u5230\u6700\u65B0\u7248\u518D\u5F15\u7528\u5230\u5BF9\u8BDD")}pending.set({target:"chat",item:refItem({label:anchorLabel3(r.anchor),anchor:r.anchor},quoteFace(r.anchor))})})().catch(e=>ctx.report(e))});return{pending,mountChat(box){chats.add(box);return()=>{chats.delete(box)}},hasChat:reachable}});function isModal(d){if(d.getAttribute("data-band-layer")==="dialog")return true;try{return d.matches(":modal")}catch{return false}}function carriedItems(d){return d.items.filter(i=>i.kind!=="file"||i.state==="done")}function refItem(r,detail){return{kind:"ref",key:`ref-${crypto.randomUUID()}`,...r,detail:detail??""}}function useQuoteInto(target,draft,setDraft,onArrive){const q=useShared().quoting;const p=useStateOf(q.pending);const latest=useRef8(draft);latest.current=draft;const arrive=useRef8(onArrive);arrive.current=onArrive;const mine=p?.target===target;const[notice,setNotice]=useState8();const count=draft?.items.length;useEffect7(()=>{if(count!==void 0)setNotice(void 0)},[count]);useLayoutEffect6(()=>{const d=latest.current;if(!mine||!p||!d||!setDraft)return;q.pending.set(null);const carryText=p.carry?.text.trim()?p.carry.text.trimEnd():"";const text=carryText?d.text.trim()?`${d.text}
|
|
3
3
|
|
|
4
|
-
${carryText}`:carryText:d.text;const room=ATTACHMENT_LIMITS2.maxPerMessage-d.items.length;const wanted=[...p.carry?.items??[],p.item];const added=wanted.slice(0,Math.max(0,room));const dropped=wanted.length-added.length;if(dropped>0)setNotice(`${dropped} \u9879\u6CA1\u52A0\u4E0A\uFF1A\u4E00\u6761\u6D88\u606F\u6700\u591A ${ATTACHMENT_LIMITS2.maxPerMessage} \u9879`);if(added.length===0&&text===d.text)return;setDraft({...d,text,items:[...d.items,...added]});arrive.current?.()},[mine,p,q,setDraft]);return{mine,notice}}var shared=new Map;function sharedOf(ctx){const s=shared.get(ctx.project.id)?.at(-1);if(!s)throw new Error(`\u8BC4\u8BBA\u63D2\u4EF6\uFF1A\u9879\u76EE ${ctx.project.id} \u7684\u4F5C\u7528\u57DF\u6CA1\u5F00\u7740`);return s}var SharedContext=createContext(null);function useShared(){const s=useContext(SharedContext);if(!s)throw new Error("\u8BC4\u8BBA\u63D2\u4EF6\uFF1A\u7EC4\u4EF6\u6CA1\u6302\u5728\u8BC4\u8BBA\u63D2\u4EF6\u7684\u6302\u8F7D\u9762\u91CC");return s}var src_default=definePlugin({scopes:{project(ctx){const stopMaterialDiscussions=ctx.collab?installMaterialDiscussions(ctx):()=>{};const mine={mode:mode.of(ctx),quoting:quoting.of(ctx)};const stack=shared.get(ctx.project.id)??[];stack.push(mine);shared.set(ctx.project.id,stack);const stopSettling=ctx.collab?watchPickSettling(ctx):()=>{};return()=>{stopMaterialDiscussions();stopSettling();stack.splice(stack.indexOf(mine),1);if(stack.length===0&&shared.get(ctx.project.id)===stack)shared.delete(ctx.project.id)}}},surfaces:{comment:reactMount2((ctx,_props,mount)=>jsx8(SharedContext.Provider,{value:sharedOf(ctx),children:jsx8(CommentSurface,{ctx,layer:layerOf(mount),drawer:mount.closest("[data-drawer]")!==null})})),"chat-composer":reactMount2(ctx=>jsx8(SharedContext.Provider,{value:sharedOf(ctx),children:jsx8(ChatComposer,{ctx,defaultAgent:ctx.project.agent})})),actions:reactMount2((ctx,props)=>jsx8(CommentActions,{ctx,owner:props.owner}))}});function CommentSurface({ctx,layer,drawer}){const state=useShared().mode;useEffect7(()=>registerSurface(ctx.project.id,layer),[ctx,layer]);return jsxs8(Fragment4,{children:[jsx8(Marks,{ctx,state,layer}),jsx8(ResidentComposers,{ctx,layer,drawer}),jsx8(CommentModeLayer,{ctx,layer}),jsx8(InPlaceComposers,{ctx,layer,drawer}),jsx8(CommentOverlay,{ctx,state,layer,defaultAgent:ctx.project.agent})]})}function Marks({ctx,state,layer}){const m=useStateOf(state);const annotating=useAnnotating2(ctx);const hiddenDraft=m?.kind==="new"&&m.viaMode&&!annotating;return jsx8(AnchorMarks,{ctx,active:m?.kind==="thread"?m.threadId:null,draft:m?.kind==="new"?m.anchor:null,dialog:m!==null&&!hiddenDraft,layer})}function CommentOverlay(props){const{ctx,state,layer}=props;const current=useStateOf(state);const annotating=useAnnotating2(ctx);const hiddenDraft=current?.kind==="new"&¤t.viaMode&&!annotating;const mode2=current?.kind==="confirm"?null:current;useSyncExternalStore7(subscribeTopLayer,topLayerSnapshot);const top=topLayer();const pop=useSyncExternalStore7(subscribeSurfaces,()=>popLayer(ctx.project.id));const owner=mode2!==null&&(pop===void 0?layer===null:pop===layer);const opened=useRef8({mode:null,top:null});if(opened.current.mode!==mode2)opened.current={mode:mode2,top};const gone=mode2!==null&&opened.current.top!==top;const close=()=>state.set(null);useEffect7(()=>{if(owner&&gone&&state.get()===mode2)close()});const owning=useRef8(null);owning.current=owner?mode2:null;useEffect7(()=>()=>{const m=owning.current;if(layer!==null&&m&&state.get()===m)state.set(null)},[layer,state]);const onTop=layer===top;useEffect7(()=>{if(!owner||!onTop||hiddenDraft)return;const onKey=withImeGuard7(e=>{if(e.key!=="Escape"||e.defaultPrevented)return;e.preventDefault();close()});document.addEventListener("keydown",onKey);return()=>document.removeEventListener("keydown",onKey)});if(!mode2||!owner||gone)return null;return createPortal4(jsx8(OverlayBody,{...props,mode:mode2,close:()=>state.set(null)}),layer??document.body)}function OverlayBody({ctx,state,defaultAgent,mode:mode2,close,layer}){const members=useMembers5(ctx);if(mode2.kind==="new"){return jsx8(Composer,{ctx,members,defaultAgent,anchor:mode2.anchor,draft:mode2.draft,handToAgent:mode2.handToAgent,viaMode:mode2.viaMode,fresh:mode2.fresh,layer,onDone:threadId=>threadId?state.set({kind:"thread",threadId,fresh:mode2.fresh}):close()},mode2.session)}return jsx8(ThreadPop,{ctx,members,defaultAgent,threadId:mode2.threadId,...mode2.fresh?{fresh:mode2.fresh}:{},onClose:close},mode2.threadId)}function Composer({ctx,members,defaultAgent,anchor,draft:initial,handToAgent,viaMode,fresh,onDone,layer}){const[draft,setDraft]=useState8(()=>({...emptyDraft3(),text:initial}));useUnsavedGuard3(hasContent2(draft));const[handChoice,setHand]=useState8(null);const handoff=useThreadHandoff(ctx,anchor);const hand=handChoice??handToAgent??handoff.defaultHandToAgent??viaMode;const bits=useComposerBits(ctx,members,"comment");const canComment=ctx.member.can("comment");const shot=useAnchorShot(ctx,anchor);const[sending,setSending]=useState8(false);const narrow=useNarrow();const anchors=ctx.collab.anchors;const hosts=useSyncExternalStore7(anchors.subscribe,anchors.hosts);const annotating=useSyncExternalStore7(fn=>ctx.anchors.annotating.subscribe(fn),()=>ctx.anchors.annotating.get(),()=>false);const inplaceHost=!narrow&&annotating&&anchor.kind!=="artifact"&&anchor.kind!=="project"?hosts.find(host=>{if(!host.annotate||host.version?.id!==anchor.versionId||!host.kinds.includes(anchor.kind)||layerOf(host.mount)!==layer)return false;const place2=locateSafely(host,anchor);return place2.at==="rects"&&place2.rects.length>0||place2.at==="track"}):void 0;const post=async d=>{if(handoff.data===void 0)return false;setSending(true);try{const t=await publishThread(ctx,members,{anchor,draft:d,hand,shot:shot.upload});onDone(inplaceHost?void 0:t.id)}finally{setSending(false)}};const place=useAnchoredPop(ctx,anchor,void 0,fresh);const shared2=useShared();const[quoting2,setQuoting]=useState8(false);const draftRef=useRef8(draft);draftRef.current=draft;const live=useRef8({mounted:true,anchor});live.current.anchor=anchor;useEffect7(()=>{live.current.mounted=true;return()=>{live.current.mounted=false}},[]);const toChat=canComment&&anchor.kind!=="artifact"&&anchor.kind!=="project"&&shared2.quoting.hasChat()?()=>{setQuoting(true);void(async()=>{if(anchor.versionId){const arts=await ctx.artifacts.list();if(!arts.some(a=>a.latest?.versionId===anchor.versionId))throw new Error("\u6B63\u5728\u770B\u65E7\u7248\u672C\uFF0C\u56DE\u5230\u6700\u65B0\u7248\u518D\u5F15\u7528\u5230\u5BF9\u8BDD")}if(!live.current.mounted||live.current.anchor!==anchor)return;shared2.quoting.pending.set({target:"chat",item:refItem({label:anchorLabel3(anchor),anchor},quoteFace(anchor)),carry:{text:draftRef.current.text,items:carriedItems(draftRef.current)}});onDone()})().catch(e=>ctx.report(e)).finally(()=>{if(live.current.mounted)setQuoting(false)})}:void 0;const uploadingNow=draft.items.some(i=>i.kind==="file"&&i.state==="uploading");const sendLabel=useSendLabel(ctx,{text:draft.text,members,defaultAgent,hand,canHand:handoff.allowed});if(viaMode&&!annotating)return null;const body=jsxs8(Fragment4,{children:[jsxs8("div",{className:"pop-h",children:[jsxs8("span",{children:[jsx8("b",{children:"\u65B0\u610F\u89C1"})," \xB7 ",anchorLabel3(anchor)]}),jsx8("button",{type:"button",className:"x","aria-label":"\u5173\u95ED",onClick:()=>onDone(),children:"\xD7"})]}),shot.url&&jsxs8("figure",{className:"band-comment-shot",children:[jsx8("img",{src:shot.url,alt:`\u622A\u56FE\uFF1A${anchorLabel3(anchor)}`}),jsxs8("figcaption",{children:[jsx8("span",{children:"\u622A\u56FE\u4F1A\u4F5C\u4E3A\u53C2\u8003\u9644\u4E0A"}),jsx8("button",{type:"button",className:"btn ghost sm",onClick:shot.drop,children:"\u4E0D\u9644"})]})]}),jsx8(PromptInput2,{variant:"comment",busy:handoff.data===void 0,label:"\u610F\u89C1",placeholder:inplaceHost?"\u5199\u8BC4\u8BBA\uFF0C@ \u63D0\u5230\u6210\u5458\u2026":handoff.allowed?`\u54EA\u91CC\u4E0D\u5BF9\u3001\u5E0C\u671B\u600E\u4E48\u6539\uFF1B@ \u6210\u5458\u63D0\u9192\u5BF9\u65B9\uFF0C@${agentLabel2(members,defaultAgent)} \u4EA4\u7ED9\u5B83`:"\u54EA\u91CC\u4E0D\u5BF9\u3001\u5E0C\u671B\u600E\u4E48\u6539\uFF1B@ \u6210\u5458\u63D0\u9192\u5BF9\u65B9",draft,onDraft:setDraft,onSubmit:post,...bits,...canComment?{}:{disabledReason:"\u4F60\u5728\u8FD9\u4E2A\u9879\u76EE\u91CC\u4E0D\u80FD\u63D0\u610F\u89C1\uFF0C\u53EA\u80FD\u67E5\u770B\u3002"},footerStart:jsx8(HandToggle,{ctx,text:draft.text,members,defaultAgent,handoff,checked:hand,onChange:setHand}),submitLabel:"\u53D1\u5E03",submitText:sending?"\u53D1\u5E03\u4E2D\u2026":inplaceHost?shortSendLabel(sendLabel):"\u53D1\u5E03",...inplaceHost?{submitTitle:sendLabel}:{},hint:`Enter \u53D1\u5E03\uFF0CShift+Enter \u6362\u884C${sendLabel!=="\u53D1\u9001"?"\uFF0C\u4F1A\u5F00\u59CB\u4E00\u4E2A\u56DE\u5408":""}`,...toChat?{footerEnd:jsx8("button",{type:"button",className:"btn ghost sm",disabled:quoting2||uploadingNow,onClick:toChat,title:uploadingNow?"\u9644\u4EF6\u8FD8\u5728\u4E0A\u4F20\uFF0C\u4F20\u5B8C\u518D\u5F15\u7528":"\u628A\u8FD9\u5904\u5143\u7D20\u8FDE\u540C\u5199\u597D\u7684\u610F\u89C1\u653E\u8FDB\u5BF9\u8BDD\u6846",children:"\u5728\u5BF9\u8BDD\u91CC\u5F15\u7528"})}:{},autoFocus:true})]});if(inplaceHost)return jsx8(InPlaceShell,{className:"pop band-comment-inplace field-host",ctx,host:inplaceHost,anchor,layer,label:"\u65B0\u610F\u89C1",busy:sending,onDone:()=>onDone(),children:body});return jsx8("dialog",{open:true,ref:place.ref,style:place.style,className:"pop band-comment-pop field-host","aria-label":"\u65B0\u610F\u89C1","data-band-dialog":"new-comment","data-band-guide-keep":"","aria-busy":sending||void 0,children:body})}function useDiscardSentDraft(ctx,draft,setDraft){const stored=useRef8(null);if(stored.current===null)stored.current=draft;const latest=useRef8(draft);latest.current=draft;const d=stored.current;const needs=d!==null&&legacyLeftover(d)&&ctx.member.can("comment");const live=useRef8(true);const done=useRef8(false);const now=useRef8({ctx,d,needs,setDraft});now.current={ctx,d,needs,setDraft};useEffect7(()=>{live.current=true;return()=>{live.current=false}},[]);useEffect7(()=>{const cur=now.current;if(done.current||!cur.needs||cur.d===null)return;done.current=true;const ctxNow=cur.ctx;const draft2=cur.d;void(async()=>{const all=(await ctxNow.threads.list()).filter(t=>t.createdBy.kind==="human"&&t.createdBy.id===ctxNow.member.id).filter(t=>t.anchor.kind==="artifact"||t.anchor.kind==="project").sort((a,b)=>a.createdAt<b.createdAt?1:a.createdAt>b.createdAt?-1:0);if(!live.current||latest.current!==draft2)return;if(all.length===0){cur.setDraft(draft2);return}for(let i=0;i<all.length;i+=MINE_THREAD_BATCH){const batch=all.slice(i,i+MINE_THREAD_BATCH);const byThread=await readComments(ctxNow,batch.map(t=>t.id));if(!live.current||latest.current!==draft2)return;for(const t of batch){const sent=lastMine(byThread[t.id],ctxNow.member.id);if(sent&&sameAsSent(draft2,sent)){cur.setDraft(emptyDraft3());return}}}cur.setDraft(draft2)})().catch(()=>{})},[])}var MINE_THREAD_BATCH=20;function lastMine(comments,me){let last;for(const c of comments??[]){if(c.kind!=="comment"||c.author.id!==me)continue;if(!last||c.createdAt>=last.createdAt)last=c}return last}function legacyLeftover(d){return d.savedAt===void 0&&sentLike(d)}function sentLike(d){return hasContent2(d)&&d.items.every(i=>i.kind!=="file"||i.state==="done"&&i.attachmentId!==void 0)}function sameAsSent(d,c){if(draftBody(d)!==c.body.trim())return false;const sent=toMessageExtras2(d);return sameSet(sent.attachments,c.attachments)&&sameSet(sent.capabilities,c.capabilities)&&sameSet(sent.connectors,c.connectors)&&sameSet((sent.refs??[]).map(canonicalRef),(c.refs??[]).map(canonicalRef))}function canonicalRef(v){return JSON.stringify(sortKeys(v))}function sortKeys(v){if(Array.isArray(v))return v.map(sortKeys);if(v&&typeof v==="object")return Object.fromEntries(Object.entries(v).filter(([,x])=>x!==void 0).sort(([a],[b])=>a<b?-1:a>b?1:0).map(([k,x])=>[k,sortKeys(x)]));return v}function sameSet(a,b){const x=[...a??[]].sort();const y=[...b??[]].sort();return x.length===y.length&&x.every((v,i)=>v===y[i])}function ChatComposer({ctx,defaultAgent}){const members=useMembers5(ctx);const turn=useCtxData6(ctx,()=>ctx.turns.state(),[],THREAD_EVENTS4).data;const last=turn?.last;const queued=(turn?.queue.length??0)>0;const restart=!queued&&last?.restartWith?firstTurnEnd(turn):void 0;const chatDraft=useDraft(`${ctx.project.id}:chat`);const restartDraft=useDraft(`${ctx.project.id}:restart`);useDiscardSentDraft(ctx,chatDraft[0],chatDraft[1]);useDiscardSentDraft(ctx,restartDraft[0],restartDraft[1]);const[draft,setDraft]=restart?restartDraft:chatDraft;const box=useRef8(null);const{quoting:q}=useShared();useEffect7(()=>q.mountChat(()=>box.current),[q]);const quoteNotice=useQuoteInto("chat",draft,setDraft,()=>{queueMicrotask(()=>{const el2=box.current;el2?.dispatchEvent(new CustomEvent("band-reveal",{bubbles:true}));const ta=el2?.querySelector("textarea");ta?.focus();if(ta)setTimeout(()=>ta.setSelectionRange(ta.value.length,ta.value.length),0)})}).notice;const bits=useComposerBits(ctx,members,"chat");const[current,setCurrent]=useState8(ctx.version.current());useEffect7(()=>ctx.version.subscribe(setCurrent),[ctx]);const artifactId=current?.artifactId;const versions=useCtxData6(ctx,()=>artifactId?ctx.version.list(artifactId):Promise.resolve([]),[artifactId],"version.*").data;const latestId=versions?.at(-1)?.id;const arts=useCtxData6(ctx,()=>ctx.artifacts.list(),[],"version.*").data;const empty=arts?.every(a=>a.latest===void 0);const firstTurnBusy=!current&&empty===true&&(!!turn?.current||!!last&&queued);const process=arts?.find(a=>a.id===artifactId)?.role==="process";const work=process?latestWork(arts??[]):void 0;const target=work??arts?.find(a=>a.id===artifactId);const stageLoad=useCtxData6(ctx,()=>ctx.stages.list(),[],[]);const stages=stageLoad.data;const stage=stages?.find(st=>st.stage===target?.stage);const kind=stage?.kind;const byAgent=kind===void 0||kind==="agent";const hand=ctx.member.can("submit-change")&&byAgent&&(stage?.defaultHandToAgent??true);const agent=agentLabel2(members,defaultAgent);const ended=restart?.how==="stopped"?stoppedTurnText(restart.number):`${agent} \u6CA1\u80FD\u505A\u51FA\u7B2C\u4E00\u7248`;const disabledReason=ctx.project.deleted?deletedProjectText(ctx.project.deleted):!ctx.member.can("comment")?"\u8FD9\u4E2A\u9879\u76EE\u73B0\u5728\u53EA\u80FD\u67E5\u770B":restart?ctx.member.can("submit-change")?void 0:`${ended}\uFF1A\u6709\u63D0\u4EA4\u4FEE\u6539\u6743\u9650\u7684\u6210\u5458\u8865\u4E00\u53E5\u5C31\u80FD\u91CD\u65B0\u5F00\u59CB`:!current&&empty?firstTurnBusy?void 0:`\u7B2C\u4E00\u7248\u4EA4\u4ED8\u524D\u53D1\u4E0D\u4E86\u6D88\u606F\uFF1A\u9700\u6C42\u4EA4\u7ED9 ${agent} \u540E\uFF0C\u7B2C\u4E00\u7248\u4EA4\u4ED8\u4E86\u5C31\u80FD\u63A5\u7740\u8BF4`:!current||!latestId?"\u7248\u672C\u52A0\u8F7D\u4E2D\u2026":process?work?void 0:`\u8FD8\u6CA1\u6709\u4F5C\u54C1\u53EF\u4EE5\u63A5\u7740\u8BF4\uFF1A${agent} \u4EA4\u51FA\u4F5C\u54C1\u540E\u5C31\u80FD\u53D1\u6D88\u606F`:current.id!==latestId?"\u6B63\u5728\u53EA\u8BFB\u67E5\u770B\u65E7\u7248\u672C\uFF0C\u56DE\u5230\u6700\u65B0\u7248\u624D\u80FD\u53D1\u6D88\u606F":void 0;const post=async d=>{if(!restart&&target&&stages===void 0)return false;if(restart?.retryStage)return ctx.stages.rerunWith(restart.retryStage,restartMessage(d));const{body,mentions,extras}=messageOf(d,members);if(firstTurnBusy){await ctx.collab.createProjectThread({body,mentions,...extras,...hand?{handToAgent:true}:{}});return}const anchor=ctx.anchors.make("artifact",{});await publishThread(ctx,members,{anchor:work?.latest?{...anchor,versionId:work.latest.versionId}:anchor,draft:d,hand})};const handsTo=ctx.member.can("submit-change")&&byAgent&&(hand||agentIn2(draft.text,members)!==void 0);const queuesBehind=handsTo&&(!!turn?.current||firstTurnBusy);const how=!byAgent?`\u5B83\u4E0D\u662F ${agent} \u505A\u7684\uFF0C\u53D1\u51FA\u53BB\u662F\u4E00\u6761\u610F\u89C1`:!handsTo?stage?.defaultHandToAgent===false&&ctx.member.can("submit-change")?`\u53D1\u51FA\u53BB\u662F\u4E00\u6761\u610F\u89C1\uFF0C@${agent} \u4EA4\u7ED9\u5B83`:`\u53D1\u51FA\u53BB\u662F\u4E00\u6761\u610F\u89C1\uFF0C\u4EA4\u7ED9 ${agent} \u7531\u6709\u6743\u9650\u7684\u6210\u5458\u51B3\u5B9A`:queuesBehind?"\u53D1\u9001\u540E\u4F1A\u5F00\u59CB\u4E00\u4E2A\u56DE\u5408\uFF0C\u6392\u5728\u5F53\u524D\u56DE\u5408\u4E4B\u540E":"Enter \u53D1\u9001\uFF0C\u4F1A\u5F00\u59CB\u4E00\u4E2A\u56DE\u5408";const hint=restart?"Enter \u53D1\u9001":work?`\u6B63\u5728\u770B\u8FC7\u7A0B\u6587\u6863\uFF0C\u6D88\u606F\u53D1\u7ED9\u300C${work.name}\u300D\xB7 ${how}`:target?`\u53D1\u7ED9\u300C${target.name}\u300D\xB7 ${how}`:how;return jsxs8("div",{className:"band-comment-chatbox",ref:box,children:[stageLoad.error&&jsxs8(ErrorNote4,{retry:stageLoad.reload,children:["\u9636\u6BB5\u6CA1\u8BFB\u51FA\u6765\uFF1A",stageLoad.error]}),restart&&!disabledReason&&jsxs8("p",{className:"band-comment-restart",children:[`${ended}\u3002\u8865\u4E00\u53E5\u8981\u6C42\uFF0C\u4F1A\u5E26\u7740\u5B83\u91CD\u65B0\u5F00\u59CB`,hasContent2(chatDraft[0])&&"\u3002\u4F60\u4E4B\u524D\u6CA1\u53D1\u51FA\u7684\u8349\u7A3F\u8FD8\u7559\u7740\uFF0C\u91CD\u65B0\u5F00\u59CB\u540E\u4F1A\u56DE\u5230\u8F93\u5165\u6846"]}),jsx8(PromptInput2,{busy:!restart&&!!target&&stages===void 0,variant:"prompt",label:"\u5BF9\u8BDD",placeholder:restart?"\u8FD8\u60F3\u600E\u4E48\u505A\uFF0C\u8865\u4E00\u53E5":queuesBehind?"\u8865\u4E00\u53E5\uFF0C@ \u63D0\u9192\u6210\u5458\uFF0C# \u5F15\u7528\u610F\u89C1":"\u8BF4\u8BF4\u6574\u4F53\u8981\u600E\u4E48\u6539\uFF0C@ \u6210\u5458\u63D0\u9192\u5BF9\u65B9\uFF0C# \u5F15\u7528\u4E00\u6761\u610F\u89C1",draft,onDraft:setDraft,onSubmit:post,hint,...quoteNotice?{notice:quoteNotice}:{},...restart?bits.attach?{attach:bits.attach}:{}:bits,foldPaste:!restart,...restart?{submitLabel:"\u53D1\u9001\u5E76\u91CD\u65B0\u5F00\u59CB",submitText:"\u53D1\u9001\u5E76\u91CD\u65B0\u5F00\u59CB"}:{},...disabledReason?{disabledReason}:{}},restart?"restart":"chat")]})}function restartMessage(d){const{text,items,capabilities,connectors,savedAt:_savedAt,...rest}=d;const unhandledFields=rest;if(Object.keys(unhandledFields).length>0)throw new Error(`\u8865\u53D1\u4E0D\u8BA4\u8BC6\u8FD9\u4E9B\u8349\u7A3F\u5B57\u6BB5\uFF1A${Object.keys(unhandledFields).join("\u3001")}`);if(capabilities.length>0||connectors.length>0)throw new Error("\u8865\u53D1\u53EA\u5E26\u6B63\u6587\u548C\u9644\u4EF6\uFF1A\u5148\u79FB\u9664\u80FD\u529B\u548C\u8FDE\u63A5\u5668\u518D\u53D1");const attachments=[];for(const i of items){switch(i.kind){case"text":if(i.key.startsWith(QUOTE_KEY_PREFIX))throw new Error("\u8865\u53D1\u53EA\u5E26\u6B63\u6587\u548C\u9644\u4EF6\uFF1A\u5148\u79FB\u9664\u5F15\u7528\u518D\u53D1");if(i.source)throw new Error(`\u8865\u53D1\u53EA\u5E26\u6B63\u6587\u548C\u9644\u4EF6\uFF1A\u5148\u79FB\u9664\u300C${i.label}\u300D\u518D\u53D1`);throw new Error("\u8865\u53D1\u53EA\u5E26\u6B63\u6587\u548C\u9644\u4EF6\uFF1A\u5148\u628A\u300C\u7C98\u8D34\u7684\u6587\u672C\u300D\u653E\u56DE\u6B63\u6587\u518D\u53D1");case"file":if(i.state==="done"&&i.attachmentId)attachments.push(i.attachmentId);break;case"ref":throw new Error("\u8865\u53D1\u53EA\u5E26\u6B63\u6587\u548C\u9644\u4EF6\uFF1A\u5148\u79FB\u9664\u5F15\u7528\u518D\u53D1");default:{const unhandled=i;throw new Error(`\u8865\u53D1\u4E0D\u8BA4\u8BC6\u8FD9\u79CD\u8349\u7A3F\u6761\u76EE\uFF1A${JSON.stringify(unhandled)}`)}}}const body=text.trim();if(body==="")throw new Error("\u8865\u53D1\u8981\u5199\u4E00\u53E5\u8981\u6C42");if(body.length>FIRST_MESSAGE_MAX)throw new Error(`\u8865\u7684\u8981\u6C42\u592A\u957F\uFF08\u8D85\u8FC7 ${FIRST_MESSAGE_MAX} \u5B57\uFF09\uFF0C\u5220\u77ED\u4E00\u4E9B\u518D\u53D1`);return{body,...attachments.length>0?{attachments}:{}}}function latestWork(arts){let best;for(const a of arts){if(a.role==="process"||a.unused||!a.latest)continue;if(!best?.latest||a.latest.at>best.latest.at)best=a}return best}function CollapsibleStatus({turn,members,context,stop}){const[open,setOpen]=useState8(false);const who=memberName4(members,turn.agent);if(open||turn.stopping)return jsxs8("div",{className:"band-comment-status-open",children:[jsx8(StatusMessage,{turn,members,context,stop}),!turn.stopping&&jsx8("button",{type:"button",className:"btn ghost sm band-comment-status-toggle","aria-expanded":"true",onClick:()=>setOpen(false),children:"\u6536\u8D77"})]});return jsxs8("output",{className:"band-comment-status-row","aria-label":`${who}\u6B63\u5728\u5904\u7406`,children:[jsx8("span",{className:"glyph working band-comment-status-glyph","aria-hidden":"true"}),jsxs8("span",{className:"band-comment-status-who",children:[who," \u6B63\u5728\u5904\u7406 \xB7 ",context]}),jsx8("button",{type:"button",className:"btn ghost sm","aria-expanded":"false",onClick:()=>setOpen(true),children:"\u8BE6\u60C5"}),jsx8(StopTurn,{stop:stop.run,can:stop.can,queued:stop.queued??0,noteClassName:"band-comment-hint"})]})}var NO_COMMENTS=[];function ThreadPop({ctx,members,defaultAgent,threadId,fresh,onClose}){const threads=useCtxData6(ctx,()=>ctx.threads.list(),[],THREAD_EVENTS4);const comments=useCtxData6(ctx,()=>ctx.threads.comments(threadId),[threadId],THREAD_EVENTS4);const turn=useCtxData6(ctx,()=>ctx.turns.state(),[],THREAD_EVENTS4).data;const t=threads.data?.find(x=>x.id===threadId);const place=useAnchoredPop(ctx,t?.anchor,t?.artifactId,fresh);if(threads.error)return jsx8(ErrorPop,{text:threads.error,onClose});if(!threads.data)return null;if(!t)return jsx8(ErrorPop,{text:`\u627E\u4E0D\u5230\u610F\u89C1 ${threadId}`,onClose});return jsxs8("dialog",{open:true,ref:place.ref,style:place.style,className:"pop band-comment-pop field-host","aria-label":`\u610F\u89C1 #${t.mark}`,children:[jsxs8("div",{className:"pop-h",children:[jsx8("span",{className:"band-comment-anchor",children:anchorLabel3(t.anchor)}),jsx8("button",{type:"button",className:"x","aria-label":"\u5173\u95ED",onClick:onClose,children:"\xD7"})]}),jsx8(ThreadCard,{ctx,thread:t,comments:comments.data??NO_COMMENTS,members,defaultAgent,slot:queueSlot(turn,t.id),turnActive:!!turn?.current,queued:queuedMessages(turn?.queue??[]),running:turn?.current?.threadIds.includes(t.id)?turn.current:null})]})}function ErrorPop({text,onClose}){return jsxs8("dialog",{open:true,className:"pop band-comment-pop field-host","aria-label":"\u610F\u89C1",children:[jsxs8("div",{className:"pop-h",children:[jsx8("span",{}),jsx8("button",{type:"button",className:"x","aria-label":"\u5173\u95ED",onClick:onClose,children:"\xD7"})]}),jsx8(ErrorNote4,{children:text})]})}function ThreadCard({ctx,thread:t,comments,members,defaultAgent,slot,turnActive,queued=0,running=null}){const[reply,setReply]=useState8(null);const[busy,setBusy]=useState8(false);const[error,setError]=useState8(null);const quoted=useQuoteInto(t.id,null,null).mine;useEffect7(()=>{if(quoted)setReply("reply")},[quoted]);const me=ctx.member.id;const confirmation=threadConfirmation(t,ctx.member,members);const agentName=memberName4(members,t.agent??defaultAgent);const versionRefs=useVersionReferences(ctx);const labelOf=id=>versionReferenceLabel(versionRefs.data,id,t.artifactId??null);const stages=useCtxData6(ctx,()=>ctx.stages.list(),[],"stage.*").data;const stageName=key=>{const s=stages?.find(x=>x.stage===key);return s?s.name??s.stage:key};const run=async fn=>{setBusy(true);setError(null);try{await fn();setReply(null)}catch(e){setError(errorText3(e))}finally{setBusy(false)}};const first=comments.find(c=>c.kind==="comment");const tail=comments.filter(c=>c!==first&&(c.kind==="comment"||isThreadTail(c)));const canWithdraw=t.status==="queued"&&(t.sentBy?.id===me||ctx.member.can("publish"));const quotable=t.status!=="resolved";const sharedState=useShared();const toChat=t.anchor&&t.anchor.kind!=="artifact"&&t.anchor.kind!=="project"&&ctx.member.can("comment")&&sharedState.quoting.hasChat()?()=>{sharedState.quoting.pending.set({target:"chat",item:refItem({label:`#${t.mark} ${t.anchor?anchorLabel3(t.anchor):""}`.trim(),threadId:t.id},t.anchor?quoteFace(t.anchor):t.excerpt)});sharedState.mode.set(null)}:void 0;const reactionsOf=useReactionPatches(ctx,comments);const nav=useMessageList();const who=jsxs8("div",{className:"band-comment-who",children:[jsx8("span",{children:memberName4(members,t.createdBy.id)}),jsxs8("span",{className:"band-comment-role",children:[roleLabel(members,t.createdBy.id)," \xB7 ",shortTime2(t.createdAt)]})]});return jsxs8("div",{ref:nav.ref,className:`thread band-comment-thread${t.status==="resolved"?" resolved":""}`,"data-band-messages":"",onKeyDown:nav.onKeyDown,onFocus:nav.onFocus,children:[jsxs8("div",{className:"th",children:[jsxs8("span",{className:"num",children:["#",t.mark]}),!running&&jsx8("span",{className:`chip ${STATUS_CHIP[t.status]}`,children:statusText(t.status,{...slot,agent:agentName})}),t.agent&&t.status!=="open"&&jsxs8("span",{className:"band-comment-sent",children:["\u2192 ",agentName,t.sentBy&&t.sentBy.id!==t.createdBy.id?` \xB7 ${memberName4(members,t.sentBy.id)} \u4EA4\u7684`:""]})]}),first?jsxs8(Message,{ctx,threadId:t.id,comment:first,className:"band-comment-original",members,reactions:reactionsOf(first),label:`${memberName4(members,first.author.id)}\u7684\u610F\u89C1`,quotable,children:[who,jsx8("div",{className:"band-comment-text",children:first.body}),jsx8(Extras,{ctx,comment:first,versions:versionRefs.data,artifactId:t.artifactId??null})]}):jsxs8(Fragment4,{children:[who,jsx8("div",{className:"band-comment-text",children:t.excerpt})]}),tail.map(c=>{if(c.kind==="comment")return jsx8(Message,{ctx,threadId:t.id,comment:c,members,reactions:reactionsOf(c),label:`${memberName4(members,c.author.id)}\u7684\u56DE\u590D`,quotable,children:jsxs8("div",{className:"band-comment-reply",children:[jsx8("b",{children:memberName4(members,c.author.id)})," ",jsx8("span",{className:"band-comment-time",children:shortTime2(c.createdAt)}),jsx8("div",{children:c.body}),jsx8(Extras,{ctx,comment:c,versions:versionRefs.data,artifactId:t.artifactId??null})]})},c.id);const stopped=turnStoppedOf(c);if(stopped)return jsx8(TurnStopped,{event:stopped,members},c.id);const ref=c.receipt?.versionId?versionRefs.data?.versions.get(c.receipt.versionId):void 0;const v=ref?.version;const label=c.receipt?.versionId?labelOf(c.receipt.versionId):void 0;return jsx8(Message,{ctx,threadId:t.id,comment:c,members,reactions:reactionsOf(c),label:`${memberName4(members,c.author.id)}\u7684\u56DE\u6267`,quotable,...label?{version:{label,...v?{open:()=>{if(v.artifactId===t.artifactId){ctx.collab.showVersion(ref.latest?null:v)}else{ctx.services.find("@kanyun-ai-infra/band-project/artifact-dialog")?.open({artifactId:v.artifactId,versionId:v.id})}}}:{}}}:{},children:jsxs8("div",{className:"receipt",children:[jsxs8("div",{className:"rh band-comment-rh",children:[jsx8(AgentAvatar,{id:c.author.id,members,decorative:true}),memberName4(members,c.author.id)," \xB7 \u56DE\u5408\u56DE\u6267",label&&jsxs8(Fragment4,{children:[" ","\xB7 \u6539\u5728 ",jsx8(VersionReference,{label})]})]}),jsx8("div",{children:c.body}),c.receipt?.outcome==="needs-input"&&c.receipt.question&&jsxs8("p",{className:"band-comment-ask",children:[jsxs8("b",{children:[memberName4(members,c.author.id)," \u5728\u95EE\u4F60"]}),c.receipt.question]}),c.receipt?.options&&jsx8(ReceiptOptions,{ctx,thread:t,comment:c,comments}),c.receipt?.citations&&jsx8(ReceiptCitations,{ctx,citations:c.receipt.citations}),c.receipt&&c.receipt.files.length>0&&jsx8("div",{className:"files",children:receiptFileNames(c.receipt.files).join(" ")}),receiptFooter(c,stageName)&&jsx8("div",{className:"band-comment-receipt-foot",children:receiptFooter(c,stageName)}),c.receipt&&jsx8(MemoryNote,{ctx,turnId:c.receipt.turnId})]})},c.id)}),running&&jsx8(CollapsibleStatus,{turn:running,members,context:`\u56DE\u5408 #${running.number}`,stop:{run:()=>ctx.collab.stopTurn(running.changeRequestId),can:ctx.member.can("submit-change"),queued}}),jsx8(ErrorNote4,{children:error}),reply?jsx8(ReplyBox,{ctx,members,threadId:t.id,mode:reply,onCancel:()=>setReply(null),onSent:()=>setReply(null)}):jsxs8("div",{className:"band-comment-acts",children:[t.status==="awaiting_confirm"&&(confirmation.allowed?jsxs8(Fragment4,{children:[jsx8("button",{type:"button",className:"btn primary sm",disabled:busy,onClick:()=>run(()=>ctx.collab.confirm(t.id)),children:"\u786E\u8BA4\u89E3\u51B3"}),jsx8("button",{type:"button",className:"btn sm",onClick:()=>setReply("reject"),children:"\u8FD8\u6CA1\u597D"})]}):jsx8("span",{className:"band-comment-hint",children:confirmation.hint})),t.status==="open"&&ctx.member.can("submit-change")&&jsx8("button",{type:"button",className:"btn primary sm",disabled:busy,onClick:()=>run(()=>ctx.propose.changeRequest([t.id])),children:turnActive?`\u6392\u5230 ${agentName} \u4E0B\u4E00\u56DE\u5408`:`\u4EA4\u7ED9 ${agentName}`}),canWithdraw&&jsx8("button",{type:"button",className:"btn sm",disabled:busy,onClick:()=>run(()=>ctx.collab.withdraw(t.id)),children:"\u64A4\u56DE"}),t.status!=="resolved"&&ctx.member.can("comment")&&jsx8("button",{type:"button",className:"btn ghost sm",onClick:()=>setReply("reply"),children:"\u56DE\u590D"}),(t.status==="open"||t.status==="awaiting_confirm")&&ctx.member.can("comment")&&jsx8("button",{type:"button",className:"btn ghost sm",disabled:busy,onClick:()=>run(()=>ctx.collab.close(t.id)),title:"\u4E0D\u4EA4\u7ED9 AI\uFF0C\u76F4\u63A5\u5173\u6389\u8FD9\u6761\u610F\u89C1",children:"\u5173\u95ED\u610F\u89C1"}),t.status==="resolved"&&ctx.member.can("comment")&&jsx8("button",{type:"button",className:"btn ghost sm",disabled:busy,onClick:()=>run(()=>ctx.collab.reopen(t.id)),children:"\u91CD\u5F00\u610F\u89C1"}),toChat&&jsx8("button",{type:"button",className:"btn ghost sm",onClick:toChat,title:"\u628A\u8FD9\u6761\u610F\u89C1\u4F5C\u4E3A\u5F15\u7528\u653E\u8FDB\u5BF9\u8BDD\u6846",children:"\u5728\u5BF9\u8BDD\u91CC\u5F15\u7528"})]})]})}function ReplyBox({ctx,members,threadId,mode:mode2,onCancel,onSent}){const[draft,setDraft]=useDraft(`${ctx.project.id}:thread:${threadId}:${mode2}`);const quoteNotice=useQuoteInto(threadId,mode2==="reply"?draft:null,mode2==="reply"?setDraft:null).notice;const bits=useComposerBits(ctx,members,"comment");const post=async d=>{const{body,mentions,extras}=messageOf(d,members);const withMentions={...extras,mentions};if(mode2==="reject")await ctx.collab.reject(threadId,body,withMentions);else await ctx.collab.comment(threadId,body,withMentions);onSent()};const reject=mode2==="reject";return jsx8(PromptInput2,{variant:"reply",label:reject?"\u54EA\u91CC\u8FD8\u4E0D\u5BF9":"\u56DE\u590D",placeholder:reject?"\u8BF4\u8BF4\u54EA\u91CC\u8FD8\u4E0D\u5BF9\uFF0C\u8FD9\u6761\u610F\u89C1\u4F1A\u56DE\u5230\u5F85\u5904\u7406":"\u56DE\u590D\uFF1B@ \u6210\u5458\u63D0\u9192\u5BF9\u65B9",draft,onDraft:setDraft,onSubmit:post,...bits,...quoteNotice?{notice:quoteNotice}:{},submitLabel:reject?"\u6253\u56DE":"\u56DE\u590D",submitText:reject?"\u6253\u56DE":"\u56DE\u590D",footerEnd:jsx8("button",{type:"button",className:"btn ghost sm",onClick:onCancel,children:"\u53D6\u6D88"}),autoFocus:true})}function Extras({ctx,comment:c,versions,artifactId}){const refs=c.refs??[];const caps=c.capabilities??[];const conns=c.connectors??[];if(refs.length+caps.length+conns.length===0)return null;return jsxs8("ul",{className:"band-comment-extras","aria-label":"\u9644\u5E26",children:[refs.map((r,i)=>{const versionId=r.versionId??r.anchor?.versionId;const label=versionId?versionReferenceText(r.label,versions,versionId,artifactId):r.label;return jsx8("li",{children:r.threadId?jsx8("button",{type:"button",className:"chip plain band-comment-extras-link",onClick:()=>r.threadId&&ctx.threads.open(r.threadId),children:jsx8(VersionReference,{label})}):jsx8("span",{className:"chip plain",children:jsx8(VersionReference,{label})})},`ref:${i}`)}),caps.map(id=>jsxs8("li",{className:"chip plain",children:["/",id]},`cap:${id}`)),conns.map(id=>jsx8("li",{className:"chip plain",children:id},`conn:${id}`))]})}var SHOT_WAIT_MS=3e3;function useAnchorShot(ctx,anchor){const[state,setState]=useState8(null);const[dropped,setDropped]=useState8(null);const pending=useRef8(Promise.resolve(null));useEffect7(()=>{if(!ctx.attachments.available)return;let live=true;const shot=thumbnailOf(ctx,anchor);pending.current=shot;void shot.then(blob=>{if(!live||!blob)return;setState({anchorId:anchor.id,blob,url:URL.createObjectURL(blob)})});return()=>{live=false}},[ctx,anchor]);useEffect7(()=>()=>{if(state)URL.revokeObjectURL(state.url)},[state]);const current=state?.anchorId===anchor.id&&dropped!==anchor.id?state:null;return{url:current?.url??null,drop:()=>setDropped(anchor.id),async upload(used){if(!ctx.attachments.available||dropped===anchor.id)return null;if(used>=ATTACHMENT_LIMITS2.maxPerMessage)return null;const blob=current?.blob??await Promise.race([pending.current,new Promise(r=>setTimeout(()=>r(null),SHOT_WAIT_MS))]);if(!blob)return null;try{const file=new File([blob],"\u6807\u6CE8\u622A\u56FE.png",{type:blob.type||"image/png"});return(await ctx.attachments.upload(file)).id}catch(e){ctx.report(e);return null}}}}async function thumbnailOf(ctx,anchor){const hosts=(ctx.collab?.anchors.hosts()??[]).filter(h=>h.thumbnail&&h.kinds.includes(anchor.kind));for(const h of hosts){const blob=await h.thumbnail?.(anchor).catch(()=>null);if(blob)return blob}return null}export{QUOTE_KEY_PREFIX,ThreadCard,carriedItems,src_default as default,restartMessage};
|
|
4
|
+
${carryText}`:carryText:d.text;const room=ATTACHMENT_LIMITS2.maxPerMessage-d.items.length;const wanted=[...p.carry?.items??[],p.item];const added=wanted.slice(0,Math.max(0,room));const dropped=wanted.length-added.length;if(dropped>0)setNotice(`${dropped} \u9879\u6CA1\u52A0\u4E0A\uFF1A\u4E00\u6761\u6D88\u606F\u6700\u591A ${ATTACHMENT_LIMITS2.maxPerMessage} \u9879`);if(added.length===0&&text===d.text)return;setDraft({...d,text,items:[...d.items,...added]});arrive.current?.()},[mine,p,q,setDraft]);return{mine,notice}}var shared=new Map;function sharedOf(ctx){const s=shared.get(ctx.project.id)?.at(-1);if(!s)throw new Error(`\u8BC4\u8BBA\u63D2\u4EF6\uFF1A\u9879\u76EE ${ctx.project.id} \u7684\u4F5C\u7528\u57DF\u6CA1\u5F00\u7740`);return s}var SharedContext=createContext(null);function useShared(){const s=useContext(SharedContext);if(!s)throw new Error("\u8BC4\u8BBA\u63D2\u4EF6\uFF1A\u7EC4\u4EF6\u6CA1\u6302\u5728\u8BC4\u8BBA\u63D2\u4EF6\u7684\u6302\u8F7D\u9762\u91CC");return s}var src_default=definePlugin({scopes:{project(ctx){const stopMaterialDiscussions=ctx.collab?installMaterialDiscussions(ctx):()=>{};const mine={mode:mode.of(ctx),quoting:quoting.of(ctx)};const stack=shared.get(ctx.project.id)??[];stack.push(mine);shared.set(ctx.project.id,stack);const stopSettling=ctx.collab?watchPickSettling(ctx):()=>{};return()=>{stopMaterialDiscussions();stopSettling();stack.splice(stack.indexOf(mine),1);if(stack.length===0&&shared.get(ctx.project.id)===stack)shared.delete(ctx.project.id)}}},surfaces:{comment:reactMount2((ctx,_props,mount)=>jsx8(SharedContext.Provider,{value:sharedOf(ctx),children:jsx8(CommentSurface,{ctx,layer:layerOf(mount),drawer:mount.closest("[data-drawer]")!==null})})),"chat-composer":reactMount2(ctx=>jsx8(SharedContext.Provider,{value:sharedOf(ctx),children:jsx8(ChatComposer,{ctx,defaultAgent:ctx.project.agent})})),actions:reactMount2((ctx,props)=>jsx8(CommentActions,{ctx,owner:props.owner}))}});function CommentSurface({ctx,layer,drawer}){const state=useShared().mode;useEffect7(()=>registerSurface(ctx.project.id,layer),[ctx,layer]);return jsxs8(Fragment4,{children:[jsx8(Marks,{ctx,state,layer}),jsx8(ResidentComposers,{ctx,layer,drawer}),jsx8(CommentModeLayer,{ctx,layer}),jsx8(InPlaceComposers,{ctx,layer,drawer}),jsx8(CommentOverlay,{ctx,state,layer,defaultAgent:ctx.project.agent})]})}function Marks({ctx,state,layer}){const m=useStateOf(state);const annotating=useAnnotating2(ctx);const hiddenDraft=m?.kind==="new"&&m.viaMode&&!annotating;return jsx8(AnchorMarks,{ctx,active:m?.kind==="thread"?m.threadId:null,draft:m?.kind==="new"?m.anchor:null,dialog:m!==null&&!hiddenDraft,layer})}function CommentOverlay(props){const{ctx,state,layer}=props;const current=useStateOf(state);const annotating=useAnnotating2(ctx);const hiddenDraft=current?.kind==="new"&¤t.viaMode&&!annotating;const mode2=current?.kind==="confirm"?null:current;useSyncExternalStore7(subscribeTopLayer,topLayerSnapshot);const top=topLayer();const pop=useSyncExternalStore7(subscribeSurfaces,()=>popLayer(ctx.project.id));const owner=mode2!==null&&(pop===void 0?layer===null:pop===layer);const opened=useRef8({mode:null,top:null});if(opened.current.mode!==mode2)opened.current={mode:mode2,top};const gone=mode2!==null&&opened.current.top!==top;const close=()=>state.set(null);useEffect7(()=>{if(owner&&gone&&state.get()===mode2)close()});const owning=useRef8(null);owning.current=owner?mode2:null;useEffect7(()=>()=>{const m=owning.current;if(layer!==null&&m&&state.get()===m)state.set(null)},[layer,state]);const onTop=layer===top;useEffect7(()=>{if(!owner||!onTop||hiddenDraft)return;const onKey=withImeGuard7(e=>{if(e.key!=="Escape"||e.defaultPrevented)return;e.preventDefault();close()});document.addEventListener("keydown",onKey);return()=>document.removeEventListener("keydown",onKey)});if(!mode2||!owner||gone)return null;return createPortal4(jsx8(OverlayBody,{...props,mode:mode2,close:()=>state.set(null)}),layer??document.body)}function OverlayBody({ctx,state,defaultAgent,mode:mode2,close,layer}){const members=useMembers5(ctx);if(mode2.kind==="new"){return jsx8(Composer,{ctx,members,defaultAgent,anchor:mode2.anchor,draft:mode2.draft,handToAgent:mode2.handToAgent,viaMode:mode2.viaMode,fresh:mode2.fresh,layer,onDone:threadId=>threadId?state.set({kind:"thread",threadId,fresh:mode2.fresh}):close()},mode2.session)}return jsx8(ThreadPop,{ctx,members,defaultAgent,threadId:mode2.threadId,...mode2.fresh?{fresh:mode2.fresh}:{},onClose:close},mode2.threadId)}function Composer({ctx,members,defaultAgent,anchor,draft:initial,handToAgent,viaMode,fresh,onDone,layer}){const[draft,setDraft]=useState8(()=>({...emptyDraft3(),text:initial}));useUnsavedGuard3(hasContent2(draft));const[handChoice,setHand]=useState8(null);const handoff=useThreadHandoff(ctx,anchor);const hand=handChoice??handToAgent??handoff.defaultHandToAgent??viaMode;const bits=useComposerBits(ctx,members,"comment");const canComment=ctx.member.can("comment");const shot=useAnchorShot(ctx,anchor);const[sending,setSending]=useState8(false);const narrow=useNarrow();const anchors=ctx.collab.anchors;const hosts=useSyncExternalStore7(anchors.subscribe,anchors.hosts);const annotating=useSyncExternalStore7(fn=>ctx.anchors.annotating.subscribe(fn),()=>ctx.anchors.annotating.get(),()=>false);const inplaceHost=!narrow&&annotating&&anchor.kind!=="artifact"&&anchor.kind!=="project"?hosts.find(host=>{if(!host.annotate||host.version?.id!==anchor.versionId||!host.kinds.includes(anchor.kind)||layerOf(host.mount)!==layer)return false;const place2=locateSafely(host,anchor);return place2.at==="rects"&&place2.rects.length>0||place2.at==="track"}):void 0;const post=async d=>{if(handoff.data===void 0)return false;setSending(true);try{const t=await publishThread(ctx,members,{anchor,draft:d,hand,shot:shot.upload});onDone(inplaceHost?void 0:t.id)}finally{setSending(false)}};const place=useAnchoredPop(ctx,anchor,void 0,fresh);const shared2=useShared();const[quoting2,setQuoting]=useState8(false);const draftRef=useRef8(draft);draftRef.current=draft;const live=useRef8({mounted:true,anchor});live.current.anchor=anchor;useEffect7(()=>{live.current.mounted=true;return()=>{live.current.mounted=false}},[]);const toChat=canComment&&anchor.kind!=="artifact"&&anchor.kind!=="project"&&shared2.quoting.hasChat()?()=>{setQuoting(true);void(async()=>{if(anchor.versionId){const arts=await ctx.artifacts.list();if(!arts.some(a=>a.latest?.versionId===anchor.versionId))throw new Error("\u6B63\u5728\u770B\u65E7\u7248\u672C\uFF0C\u56DE\u5230\u6700\u65B0\u7248\u518D\u5F15\u7528\u5230\u5BF9\u8BDD")}if(!live.current.mounted||live.current.anchor!==anchor)return;shared2.quoting.pending.set({target:"chat",item:refItem({label:anchorLabel3(anchor),anchor},quoteFace(anchor)),carry:{text:draftRef.current.text,items:carriedItems(draftRef.current)}});onDone()})().catch(e=>ctx.report(e)).finally(()=>{if(live.current.mounted)setQuoting(false)})}:void 0;const uploadingNow=draft.items.some(i=>i.kind==="file"&&i.state==="uploading");const sendLabel=useSendLabel(ctx,{text:draft.text,members,defaultAgent,hand,canHand:handoff.allowed});if(viaMode&&!annotating)return null;const body=jsxs8(Fragment4,{children:[jsxs8("div",{className:"pop-h",children:[jsxs8("span",{children:[jsx8("b",{children:"\u65B0\u610F\u89C1"})," \xB7 ",anchorLabel3(anchor)]}),jsx8("button",{type:"button",className:"x","aria-label":"\u5173\u95ED",onClick:()=>onDone(),children:"\xD7"})]}),shot.url&&jsxs8("figure",{className:"band-comment-shot",children:[jsx8("img",{src:shot.url,alt:`\u622A\u56FE\uFF1A${anchorLabel3(anchor)}`}),jsxs8("figcaption",{children:[jsx8("span",{children:"\u622A\u56FE\u4F1A\u4F5C\u4E3A\u53C2\u8003\u9644\u4E0A"}),jsx8("button",{type:"button",className:"btn ghost sm",onClick:shot.drop,children:"\u4E0D\u9644"})]})]}),jsx8(PromptInput2,{variant:"comment",busy:handoff.data===void 0,label:"\u610F\u89C1",placeholder:inplaceHost?"\u5199\u8BC4\u8BBA\uFF0C@ \u63D0\u5230\u6210\u5458\u2026":handoff.allowed?`\u54EA\u91CC\u4E0D\u5BF9\u3001\u5E0C\u671B\u600E\u4E48\u6539\uFF1B@ \u6210\u5458\u63D0\u9192\u5BF9\u65B9\uFF0C@${agentLabel2(members,defaultAgent)} \u4EA4\u7ED9\u5B83`:"\u54EA\u91CC\u4E0D\u5BF9\u3001\u5E0C\u671B\u600E\u4E48\u6539\uFF1B@ \u6210\u5458\u63D0\u9192\u5BF9\u65B9",draft,onDraft:setDraft,onSubmit:post,...bits,...canComment?{}:{disabledReason:"\u4F60\u5728\u8FD9\u4E2A\u9879\u76EE\u91CC\u4E0D\u80FD\u63D0\u610F\u89C1\uFF0C\u53EA\u80FD\u67E5\u770B\u3002"},footerStart:jsx8(HandToggle,{ctx,text:draft.text,members,defaultAgent,handoff,checked:hand,onChange:setHand}),submitLabel:"\u53D1\u5E03",submitText:sending?"\u53D1\u5E03\u4E2D\u2026":inplaceHost?shortSendLabel(sendLabel):"\u53D1\u5E03",...inplaceHost?{submitTitle:sendLabel}:{},hint:`Enter \u53D1\u5E03\uFF0CShift+Enter \u6362\u884C${sendLabel!=="\u53D1\u9001"?"\uFF0C\u4F1A\u5F00\u59CB\u4E00\u4E2A\u56DE\u5408":""}`,...toChat?{footerEnd:jsx8("button",{type:"button",className:"btn ghost sm",disabled:quoting2||uploadingNow,onClick:toChat,title:uploadingNow?"\u9644\u4EF6\u8FD8\u5728\u4E0A\u4F20\uFF0C\u4F20\u5B8C\u518D\u5F15\u7528":"\u628A\u8FD9\u5904\u5143\u7D20\u8FDE\u540C\u5199\u597D\u7684\u610F\u89C1\u653E\u8FDB\u5BF9\u8BDD\u6846",children:"\u5728\u5BF9\u8BDD\u91CC\u5F15\u7528"})}:{},autoFocus:true})]});if(inplaceHost)return jsx8(InPlaceShell,{className:"pop band-comment-inplace field-host",ctx,host:inplaceHost,anchor,layer,label:"\u65B0\u610F\u89C1",busy:sending,onDone:()=>onDone(),children:body});return jsx8("dialog",{open:true,ref:place.ref,style:place.style,className:"pop band-comment-pop field-host","aria-label":"\u65B0\u610F\u89C1","data-band-dialog":"new-comment","data-band-guide-keep":"","aria-busy":sending||void 0,children:body})}function useDiscardSentDraft(ctx,draft,setDraft){const stored=useRef8(null);if(stored.current===null)stored.current=draft;const latest=useRef8(draft);latest.current=draft;const d=stored.current;const needs=d!==null&&legacyLeftover(d)&&ctx.member.can("comment");const live=useRef8(true);const done=useRef8(false);const now=useRef8({ctx,d,needs,setDraft});now.current={ctx,d,needs,setDraft};useEffect7(()=>{live.current=true;return()=>{live.current=false}},[]);useEffect7(()=>{const cur=now.current;if(done.current||!cur.needs||cur.d===null)return;done.current=true;const ctxNow=cur.ctx;const draft2=cur.d;void(async()=>{const all=(await ctxNow.threads.list()).filter(t=>t.createdBy.kind==="human"&&t.createdBy.id===ctxNow.member.id).filter(t=>t.anchor.kind==="artifact"||t.anchor.kind==="project").sort((a,b)=>a.createdAt<b.createdAt?1:a.createdAt>b.createdAt?-1:0);if(!live.current||latest.current!==draft2)return;if(all.length===0){cur.setDraft(draft2);return}for(let i=0;i<all.length;i+=MINE_THREAD_BATCH){const batch=all.slice(i,i+MINE_THREAD_BATCH);const byThread=await readComments(ctxNow,batch.map(t=>t.id));if(!live.current||latest.current!==draft2)return;for(const t of batch){const sent=lastMine(byThread[t.id],ctxNow.member.id);if(sent&&sameAsSent(draft2,sent)){cur.setDraft(emptyDraft3());return}}}cur.setDraft(draft2)})().catch(()=>{})},[])}var MINE_THREAD_BATCH=20;function lastMine(comments,me){let last;for(const c of comments??[]){if(c.kind!=="comment"||c.author.id!==me)continue;if(!last||c.createdAt>=last.createdAt)last=c}return last}function legacyLeftover(d){return d.savedAt===void 0&&sentLike(d)}function sentLike(d){return hasContent2(d)&&d.items.every(i=>i.kind!=="file"||i.state==="done"&&i.attachmentId!==void 0)}function sameAsSent(d,c){if(draftBody(d)!==c.body.trim())return false;const sent=toMessageExtras2(d);return sameSet(sent.attachments,c.attachments)&&sameSet(sent.capabilities,c.capabilities)&&sameSet(sent.connectors,c.connectors)&&sameSet((sent.refs??[]).map(canonicalRef),(c.refs??[]).map(canonicalRef))}function canonicalRef(v){return JSON.stringify(sortKeys(v))}function sortKeys(v){if(Array.isArray(v))return v.map(sortKeys);if(v&&typeof v==="object")return Object.fromEntries(Object.entries(v).filter(([,x])=>x!==void 0).sort(([a],[b])=>a<b?-1:a>b?1:0).map(([k,x])=>[k,sortKeys(x)]));return v}function sameSet(a,b){const x=[...a??[]].sort();const y=[...b??[]].sort();return x.length===y.length&&x.every((v,i)=>v===y[i])}function ChatComposer({ctx,defaultAgent}){const members=useMembers5(ctx);const turn=useCtxData6(ctx,()=>ctx.turns.state(),[],THREAD_EVENTS4).data;const last=turn?.last;const queued=(turn?.queue.length??0)>0;const restart=!queued&&last?.restartWith?firstTurnEnd(turn):void 0;const chatDraft=useDraft(`${ctx.project.id}:chat`);const restartDraft=useDraft(`${ctx.project.id}:restart`);useDiscardSentDraft(ctx,chatDraft[0],chatDraft[1]);useDiscardSentDraft(ctx,restartDraft[0],restartDraft[1]);const[draft,setDraft]=restart?restartDraft:chatDraft;const box=useRef8(null);const{quoting:q}=useShared();useEffect7(()=>q.mountChat(()=>box.current),[q]);const quoteNotice=useQuoteInto("chat",draft,setDraft,()=>{queueMicrotask(()=>{const el2=box.current;el2?.dispatchEvent(new CustomEvent("band-reveal",{bubbles:true}));const ta=el2?.querySelector("textarea");ta?.focus();if(ta)setTimeout(()=>ta.setSelectionRange(ta.value.length,ta.value.length),0)})}).notice;const bits=useComposerBits(ctx,members,"chat");const[current,setCurrent]=useState8(ctx.version.current());useEffect7(()=>ctx.version.subscribe(setCurrent),[ctx]);const artifactId=current?.artifactId;const versions=useCtxData6(ctx,()=>artifactId?ctx.version.list(artifactId):Promise.resolve([]),[artifactId],"version.*").data;const latestId=versions?.at(-1)?.id;const arts=useCtxData6(ctx,()=>ctx.artifacts.list(),[],"version.*").data;const empty=arts?.every(a=>a.latest===void 0);const firstTurnBusy=!current&&empty===true&&(!!turn?.current||!!last&&queued);const process=arts?.find(a=>a.id===artifactId)?.role==="process";const work=process?latestWork(arts??[]):void 0;const target=work??arts?.find(a=>a.id===artifactId);const stageLoad=useCtxData6(ctx,()=>ctx.stages.list(),[],[]);const stages=stageLoad.data;const stage=stages?.find(st=>st.stage===target?.stage);const kind=stage?.kind;const byAgent=kind===void 0||kind==="agent";const hand=ctx.member.can("submit-change")&&byAgent&&(stage?.defaultHandToAgent??true);const agent=agentLabel2(members,defaultAgent);const ended=restart?.how==="stopped"?stoppedTurnText(restart.number):`${agent} \u6CA1\u80FD\u505A\u51FA\u7B2C\u4E00\u7248`;const disabledReason=ctx.project.deleted?deletedProjectText(ctx.project.deleted):!ctx.member.can("comment")?"\u8FD9\u4E2A\u9879\u76EE\u73B0\u5728\u53EA\u80FD\u67E5\u770B":restart?ctx.member.can("submit-change")?void 0:`${ended}\uFF1A\u6709\u63D0\u4EA4\u4FEE\u6539\u6743\u9650\u7684\u6210\u5458\u8865\u4E00\u53E5\u5C31\u80FD\u91CD\u65B0\u5F00\u59CB`:!current&&empty?firstTurnBusy?void 0:`\u7B2C\u4E00\u7248\u4EA4\u4ED8\u524D\u53D1\u4E0D\u4E86\u6D88\u606F\uFF1A\u9700\u6C42\u4EA4\u7ED9 ${agent} \u540E\uFF0C\u7B2C\u4E00\u7248\u4EA4\u4ED8\u4E86\u5C31\u80FD\u63A5\u7740\u8BF4`:!current||!latestId?"\u7248\u672C\u52A0\u8F7D\u4E2D\u2026":process?work?void 0:`\u8FD8\u6CA1\u6709\u4F5C\u54C1\u53EF\u4EE5\u63A5\u7740\u8BF4\uFF1A${agent} \u4EA4\u51FA\u4F5C\u54C1\u540E\u5C31\u80FD\u53D1\u6D88\u606F`:current.id!==latestId?"\u6B63\u5728\u53EA\u8BFB\u67E5\u770B\u65E7\u7248\u672C\uFF0C\u56DE\u5230\u6700\u65B0\u7248\u624D\u80FD\u53D1\u6D88\u606F":void 0;const post=async d=>{if(!restart&&target&&stages===void 0)return false;if(restart?.retryStage)return ctx.stages.rerunWith(restart.retryStage,restartMessage(d));const{body,mentions,extras}=messageOf(d,members);if(firstTurnBusy){await ctx.collab.createProjectThread({body,mentions,...extras,...hand?{handToAgent:true}:{}});return}const anchor=ctx.anchors.make("artifact",{});await publishThread(ctx,members,{anchor:work?.latest?{...anchor,versionId:work.latest.versionId}:anchor,draft:d,hand})};const handsTo=ctx.member.can("submit-change")&&byAgent&&(hand||agentIn2(draft.text,members)!==void 0);const queuesBehind=handsTo&&(!!turn?.current||firstTurnBusy);const how=!byAgent?`\u5B83\u4E0D\u662F ${agent} \u505A\u7684\uFF0C\u53D1\u51FA\u53BB\u662F\u4E00\u6761\u610F\u89C1`:!handsTo?stage?.defaultHandToAgent===false&&ctx.member.can("submit-change")?`\u53D1\u51FA\u53BB\u662F\u4E00\u6761\u610F\u89C1\uFF0C@${agent} \u4EA4\u7ED9\u5B83`:`\u53D1\u51FA\u53BB\u662F\u4E00\u6761\u610F\u89C1\uFF0C\u4EA4\u7ED9 ${agent} \u7531\u6709\u6743\u9650\u7684\u6210\u5458\u51B3\u5B9A`:queuesBehind?"\u53D1\u9001\u540E\u4F1A\u5F00\u59CB\u4E00\u4E2A\u56DE\u5408\uFF0C\u6392\u5728\u5F53\u524D\u56DE\u5408\u4E4B\u540E":"Enter \u53D1\u9001\uFF0C\u4F1A\u5F00\u59CB\u4E00\u4E2A\u56DE\u5408";const hint=restart?"Enter \u53D1\u9001":work?`\u6B63\u5728\u770B\u8FC7\u7A0B\u6587\u6863\uFF0C\u6D88\u606F\u53D1\u7ED9\u300C${work.name}\u300D\xB7 ${how}`:target?`\u53D1\u7ED9\u300C${target.name}\u300D\xB7 ${how}`:how;return jsxs8("div",{className:"band-comment-chatbox",ref:box,children:[stageLoad.error&&jsxs8(ErrorNote4,{retry:stageLoad.reload,children:["\u9636\u6BB5\u6CA1\u8BFB\u51FA\u6765\uFF1A",stageLoad.error]}),restart&&!disabledReason&&jsxs8("p",{className:"band-comment-restart",children:[`${ended}\u3002\u8865\u4E00\u53E5\u8981\u6C42\uFF0C\u4F1A\u5E26\u7740\u5B83\u91CD\u65B0\u5F00\u59CB`,hasContent2(chatDraft[0])&&"\u3002\u4F60\u4E4B\u524D\u6CA1\u53D1\u51FA\u7684\u8349\u7A3F\u8FD8\u7559\u7740\uFF0C\u91CD\u65B0\u5F00\u59CB\u540E\u4F1A\u56DE\u5230\u8F93\u5165\u6846"]}),jsx8(PromptInput2,{busy:!restart&&!!target&&stages===void 0,variant:"prompt",label:"\u5BF9\u8BDD",placeholder:restart?"\u8FD8\u60F3\u600E\u4E48\u505A\uFF0C\u8865\u4E00\u53E5":queuesBehind?"\u8865\u4E00\u53E5\uFF0C@ \u63D0\u9192\u6210\u5458\uFF0C# \u5F15\u7528\u610F\u89C1":"\u8BF4\u8BF4\u6574\u4F53\u8981\u600E\u4E48\u6539\uFF0C@ \u6210\u5458\u63D0\u9192\u5BF9\u65B9\uFF0C# \u5F15\u7528\u4E00\u6761\u610F\u89C1",draft,onDraft:setDraft,onSubmit:post,hint,...quoteNotice?{notice:quoteNotice}:{},...restart?bits.attach?{attach:bits.attach}:{}:bits,foldPaste:!restart,...restart?{submitLabel:"\u53D1\u9001\u5E76\u91CD\u65B0\u5F00\u59CB",submitText:"\u53D1\u9001\u5E76\u91CD\u65B0\u5F00\u59CB"}:{},...disabledReason?{disabledReason}:{}},restart?"restart":"chat")]})}function restartMessage(d){const{text,items,capabilities,connectors,savedAt:_savedAt,...rest}=d;const unhandledFields=rest;if(Object.keys(unhandledFields).length>0)throw new Error(`\u8865\u53D1\u4E0D\u8BA4\u8BC6\u8FD9\u4E9B\u8349\u7A3F\u5B57\u6BB5\uFF1A${Object.keys(unhandledFields).join("\u3001")}`);if(capabilities.length>0||connectors.length>0)throw new Error("\u8865\u53D1\u53EA\u5E26\u6B63\u6587\u548C\u9644\u4EF6\uFF1A\u5148\u79FB\u9664\u80FD\u529B\u548C\u8FDE\u63A5\u5668\u518D\u53D1");const attachments=[];for(const i of items){switch(i.kind){case"text":if(i.key.startsWith(QUOTE_KEY_PREFIX))throw new Error("\u8865\u53D1\u53EA\u5E26\u6B63\u6587\u548C\u9644\u4EF6\uFF1A\u5148\u79FB\u9664\u5F15\u7528\u518D\u53D1");if(i.source)throw new Error(`\u8865\u53D1\u53EA\u5E26\u6B63\u6587\u548C\u9644\u4EF6\uFF1A\u5148\u79FB\u9664\u300C${i.label}\u300D\u518D\u53D1`);throw new Error("\u8865\u53D1\u53EA\u5E26\u6B63\u6587\u548C\u9644\u4EF6\uFF1A\u5148\u628A\u300C\u7C98\u8D34\u7684\u6587\u672C\u300D\u653E\u56DE\u6B63\u6587\u518D\u53D1");case"file":if(i.state==="done"&&i.attachmentId)attachments.push(i.attachmentId);break;case"ref":throw new Error("\u8865\u53D1\u53EA\u5E26\u6B63\u6587\u548C\u9644\u4EF6\uFF1A\u5148\u79FB\u9664\u5F15\u7528\u518D\u53D1");default:{const unhandled=i;throw new Error(`\u8865\u53D1\u4E0D\u8BA4\u8BC6\u8FD9\u79CD\u8349\u7A3F\u6761\u76EE\uFF1A${JSON.stringify(unhandled)}`)}}}const body=text.trim();if(body==="")throw new Error("\u8865\u53D1\u8981\u5199\u4E00\u53E5\u8981\u6C42");if(body.length>FIRST_MESSAGE_MAX)throw new Error(`\u8865\u7684\u8981\u6C42\u592A\u957F\uFF08\u8D85\u8FC7 ${FIRST_MESSAGE_MAX} \u5B57\uFF09\uFF0C\u5220\u77ED\u4E00\u4E9B\u518D\u53D1`);return{body,...attachments.length>0?{attachments}:{}}}function latestWork(arts){let best;for(const a of arts){if(a.role==="process"||a.unused||!a.latest)continue;if(!best?.latest||a.latest.at>best.latest.at)best=a}return best}function CollapsibleStatus({turn,members,context,stop}){const[open,setOpen]=useState8(false);const who=memberName4(members,turn.agent);if(open||turn.stopping)return jsxs8("div",{className:"band-comment-status-open",children:[jsx8(StatusMessage,{turn,members,context,stop}),!turn.stopping&&jsx8("button",{type:"button",className:"btn ghost sm band-comment-status-toggle","aria-expanded":"true",onClick:()=>setOpen(false),children:"\u6536\u8D77"})]});return jsxs8("output",{className:"band-comment-status-row","aria-label":`${who}\u6B63\u5728\u5904\u7406`,children:[jsx8("span",{className:"glyph working band-comment-status-glyph","aria-hidden":"true"}),jsxs8("span",{className:"band-comment-status-who",children:[who," \u6B63\u5728\u5904\u7406 \xB7 ",context]}),jsx8("button",{type:"button",className:"btn ghost sm","aria-expanded":"false",onClick:()=>setOpen(true),children:"\u8BE6\u60C5"}),jsx8(StopTurn,{stop:stop.run,can:stop.can,queued:stop.queued??0,noteClassName:"band-comment-hint"})]})}var NO_COMMENTS=[];function ThreadPop({ctx,members,defaultAgent,threadId,fresh,onClose}){const threads=useCtxData6(ctx,()=>ctx.threads.list(),[],THREAD_EVENTS4);const comments=useCtxData6(ctx,()=>ctx.threads.comments(threadId),[threadId],THREAD_EVENTS4);const turn=useCtxData6(ctx,()=>ctx.turns.state(),[],THREAD_EVENTS4).data;const t=threads.data?.find(x=>x.id===threadId);const place=useAnchoredPop(ctx,t?.anchor,t?.artifactId,fresh);if(threads.error)return jsx8(ErrorPop,{text:threads.error,onClose});if(!threads.data)return null;if(!t)return jsx8(ErrorPop,{text:`\u627E\u4E0D\u5230\u610F\u89C1 ${threadId}`,onClose});return jsxs8("dialog",{open:true,ref:place.ref,style:place.style,className:"pop band-comment-pop field-host","aria-label":`\u610F\u89C1 #${t.mark}`,children:[jsxs8("div",{className:"pop-h",children:[jsx8("span",{className:"band-comment-anchor",children:anchorLabel3(t.anchor)}),jsx8("button",{type:"button",className:"x","aria-label":"\u5173\u95ED",onClick:onClose,children:"\xD7"})]}),jsx8(ThreadCard,{ctx,thread:t,comments:comments.data??NO_COMMENTS,members,defaultAgent,slot:queueSlot(turn,t.id),turnActive:!!turn?.current,queued:queuedMessages(turn?.queue??[]),running:turn?.current?.threadIds.includes(t.id)?turn.current:null})]})}function ErrorPop({text,onClose}){return jsxs8("dialog",{open:true,className:"pop band-comment-pop field-host","aria-label":"\u610F\u89C1",children:[jsxs8("div",{className:"pop-h",children:[jsx8("span",{}),jsx8("button",{type:"button",className:"x","aria-label":"\u5173\u95ED",onClick:onClose,children:"\xD7"})]}),jsx8(ErrorNote4,{children:text})]})}function useProjectAdmin(ctx,wanted){const api=ctx.memberSettings;const[admin,setAdmin]=useState8(false);const[error,setError]=useState8(null);const[round,setRound]=useState8(0);useEffect7(()=>{if(!wanted||!api)return;let live=true;setError(null);api.get().then(v=>{if(!live)return;setAdmin(v.canManage)},e=>{if(!live)return;setAdmin(null);setError(e instanceof Error?e.message:String(e))});return()=>{live=false}},[api,wanted,round]);return{admin,error,reload:()=>setRound(n=>n+1)}}function ThreadCard({ctx,thread:t,comments,members,defaultAgent,slot,turnActive,queued=0,running=null}){const[reply,setReply]=useState8(null);const[busy,setBusy]=useState8(false);const[error,setError]=useState8(null);const quoted=useQuoteInto(t.id,null,null).mine;useEffect7(()=>{if(quoted)setReply("reply")},[quoted]);const me=ctx.member.id;const confirmation=threadConfirmation(t,ctx.member,members);const agentName=memberName4(members,t.agent??defaultAgent);const versionRefs=useVersionReferences(ctx);const labelOf=id=>versionReferenceLabel(versionRefs.data,id,t.artifactId??null);const stages=useCtxData6(ctx,()=>ctx.stages.list(),[],"stage.*").data;const stageName=key=>{const s=stages?.find(x=>x.stage===key);return s?s.name??s.stage:key};const run=async fn=>{setBusy(true);setError(null);try{await fn();setReply(null)}catch(e){setError(errorText3(e))}finally{setBusy(false)}};const first=comments.find(c=>c.kind==="comment");const tail=comments.filter(c=>c!==first&&(c.kind==="comment"||isThreadTail(c)));const sentByMe=t.sentBy?.id===me;const adminRead=useProjectAdmin(ctx,t.status==="queued"&&!sentByMe);const canWithdraw=t.status==="queued"&&(sentByMe||adminRead.admin!==false);const quotable=t.status!=="resolved";const sharedState=useShared();const toChat=t.anchor&&t.anchor.kind!=="artifact"&&t.anchor.kind!=="project"&&ctx.member.can("comment")&&sharedState.quoting.hasChat()?()=>{sharedState.quoting.pending.set({target:"chat",item:refItem({label:`#${t.mark} ${t.anchor?anchorLabel3(t.anchor):""}`.trim(),threadId:t.id},t.anchor?quoteFace(t.anchor):t.excerpt)});sharedState.mode.set(null)}:void 0;const reactionsOf=useReactionPatches(ctx,comments);const nav=useMessageList();const who=jsxs8("div",{className:"band-comment-who",children:[jsx8("span",{children:memberName4(members,t.createdBy.id)}),jsxs8("span",{className:"band-comment-role",children:[roleLabel(members,t.createdBy.id)," \xB7 ",shortTime2(t.createdAt)]})]});return jsxs8("div",{ref:nav.ref,className:`thread band-comment-thread${t.status==="resolved"?" resolved":""}`,"data-band-messages":"",onKeyDown:nav.onKeyDown,onFocus:nav.onFocus,children:[jsxs8("div",{className:"th",children:[jsxs8("span",{className:"num",children:["#",t.mark]}),!running&&jsx8("span",{className:`chip ${STATUS_CHIP[t.status]}`,children:statusText(t.status,{...slot,agent:agentName})}),t.agent&&t.status!=="open"&&jsxs8("span",{className:"band-comment-sent",children:["\u2192 ",agentName,t.sentBy&&t.sentBy.id!==t.createdBy.id?` \xB7 ${memberName4(members,t.sentBy.id)} \u4EA4\u7684`:""]})]}),first?jsxs8(Message,{ctx,threadId:t.id,comment:first,className:"band-comment-original",members,reactions:reactionsOf(first),label:`${memberName4(members,first.author.id)}\u7684\u610F\u89C1`,quotable,children:[who,jsx8("div",{className:"band-comment-text",children:first.body}),jsx8(Extras,{ctx,comment:first,versions:versionRefs.data,artifactId:t.artifactId??null})]}):jsxs8(Fragment4,{children:[who,jsx8("div",{className:"band-comment-text",children:t.excerpt})]}),tail.map(c=>{if(c.kind==="comment")return jsx8(Message,{ctx,threadId:t.id,comment:c,members,reactions:reactionsOf(c),label:`${memberName4(members,c.author.id)}\u7684\u56DE\u590D`,quotable,children:jsxs8("div",{className:"band-comment-reply",children:[jsx8("b",{children:memberName4(members,c.author.id)})," ",jsx8("span",{className:"band-comment-time",children:shortTime2(c.createdAt)}),jsx8("div",{children:c.body}),jsx8(Extras,{ctx,comment:c,versions:versionRefs.data,artifactId:t.artifactId??null})]})},c.id);const stopped=turnStoppedOf(c);if(stopped)return jsx8(TurnStopped,{event:stopped,members},c.id);const ref=c.receipt?.versionId?versionRefs.data?.versions.get(c.receipt.versionId):void 0;const v=ref?.version;const label=c.receipt?.versionId?labelOf(c.receipt.versionId):void 0;return jsx8(Message,{ctx,threadId:t.id,comment:c,members,reactions:reactionsOf(c),label:`${memberName4(members,c.author.id)}\u7684\u56DE\u6267`,quotable,...label?{version:{label,...v?{open:()=>{if(v.artifactId===t.artifactId){ctx.collab.showVersion(ref.latest?null:v)}else{ctx.services.find("@kanyun-ai-infra/band-project/artifact-dialog")?.open({artifactId:v.artifactId,versionId:v.id})}}}:{}}}:{},children:jsxs8("div",{className:"receipt",children:[jsxs8("div",{className:"rh band-comment-rh",children:[jsx8(AgentAvatar,{id:c.author.id,members,decorative:true}),memberName4(members,c.author.id)," \xB7 \u56DE\u5408\u56DE\u6267",label&&jsxs8(Fragment4,{children:[" ","\xB7 \u6539\u5728 ",jsx8(VersionReference,{label})]})]}),jsx8("div",{children:c.body}),c.receipt?.outcome==="needs-input"&&c.receipt.question&&jsxs8("p",{className:"band-comment-ask",children:[jsxs8("b",{children:[memberName4(members,c.author.id)," \u5728\u95EE\u4F60"]}),c.receipt.question]}),c.receipt?.options&&jsx8(ReceiptOptions,{ctx,thread:t,comment:c,comments}),c.receipt?.citations&&jsx8(ReceiptCitations,{ctx,citations:c.receipt.citations}),c.receipt&&c.receipt.files.length>0&&jsx8("div",{className:"files",children:receiptFileNames(c.receipt.files).join(" ")}),receiptFooter(c,stageName)&&jsx8("div",{className:"band-comment-receipt-foot",children:receiptFooter(c,stageName)}),c.receipt&&jsx8(MemoryNote,{ctx,turnId:c.receipt.turnId})]})},c.id)}),running&&jsx8(CollapsibleStatus,{turn:running,members,context:`\u56DE\u5408 #${running.number}`,stop:{run:()=>ctx.collab.stopTurn(running.changeRequestId),can:ctx.member.can("submit-change"),queued}}),jsx8(ErrorNote4,{children:error}),reply?jsx8(ReplyBox,{ctx,members,threadId:t.id,mode:reply,onCancel:()=>setReply(null),onSent:()=>setReply(null)}):jsxs8("div",{className:"band-comment-acts",children:[t.status==="awaiting_confirm"&&(confirmation.allowed?jsxs8(Fragment4,{children:[jsx8("button",{type:"button",className:"btn primary sm",disabled:busy,onClick:()=>run(()=>ctx.collab.confirm(t.id)),children:"\u786E\u8BA4\u89E3\u51B3"}),jsx8("button",{type:"button",className:"btn sm",onClick:()=>setReply("reject"),children:"\u8FD8\u6CA1\u597D"})]}):jsx8("span",{className:"band-comment-hint",children:confirmation.hint})),t.status==="open"&&ctx.member.can("submit-change")&&jsx8("button",{type:"button",className:"btn primary sm",disabled:busy,onClick:()=>run(()=>ctx.propose.changeRequest([t.id])),children:turnActive?`\u6392\u5230 ${agentName} \u4E0B\u4E00\u56DE\u5408`:`\u4EA4\u7ED9 ${agentName}`}),canWithdraw&&jsx8("button",{type:"button",className:"btn sm",disabled:busy,onClick:()=>run(()=>ctx.collab.withdraw(t.id)),children:"\u64A4\u56DE"}),t.status==="queued"&&adminRead.admin===null&&adminRead.error&&jsxs8(ErrorNote4,{retry:adminRead.reload,children:["\u8BFB\u4E0D\u5230\u4F60\u80FD\u4E0D\u80FD\u64A4\u56DE\uFF08",adminRead.error,"\uFF09\uFF0C\u70B9\u64A4\u56DE\u65F6\u7531\u670D\u52A1\u7AEF\u5224\u3002"]}),t.status!=="resolved"&&ctx.member.can("comment")&&jsx8("button",{type:"button",className:"btn ghost sm",onClick:()=>setReply("reply"),children:"\u56DE\u590D"}),(t.status==="open"||t.status==="awaiting_confirm")&&ctx.member.can("comment")&&jsx8("button",{type:"button",className:"btn ghost sm",disabled:busy,onClick:()=>run(()=>ctx.collab.close(t.id)),title:"\u4E0D\u4EA4\u7ED9 AI\uFF0C\u76F4\u63A5\u5173\u6389\u8FD9\u6761\u610F\u89C1",children:"\u5173\u95ED\u610F\u89C1"}),t.status==="resolved"&&ctx.member.can("comment")&&jsx8("button",{type:"button",className:"btn ghost sm",disabled:busy,onClick:()=>run(()=>ctx.collab.reopen(t.id)),children:"\u91CD\u5F00\u610F\u89C1"}),toChat&&jsx8("button",{type:"button",className:"btn ghost sm",onClick:toChat,title:"\u628A\u8FD9\u6761\u610F\u89C1\u4F5C\u4E3A\u5F15\u7528\u653E\u8FDB\u5BF9\u8BDD\u6846",children:"\u5728\u5BF9\u8BDD\u91CC\u5F15\u7528"})]})]})}function ReplyBox({ctx,members,threadId,mode:mode2,onCancel,onSent}){const[draft,setDraft]=useDraft(`${ctx.project.id}:thread:${threadId}:${mode2}`);const quoteNotice=useQuoteInto(threadId,mode2==="reply"?draft:null,mode2==="reply"?setDraft:null).notice;const bits=useComposerBits(ctx,members,"comment");const post=async d=>{const{body,mentions,extras}=messageOf(d,members);const withMentions={...extras,mentions};if(mode2==="reject")await ctx.collab.reject(threadId,body,withMentions);else await ctx.collab.comment(threadId,body,withMentions);onSent()};const reject=mode2==="reject";return jsx8(PromptInput2,{variant:"reply",label:reject?"\u54EA\u91CC\u8FD8\u4E0D\u5BF9":"\u56DE\u590D",placeholder:reject?"\u8BF4\u8BF4\u54EA\u91CC\u8FD8\u4E0D\u5BF9\uFF0C\u8FD9\u6761\u610F\u89C1\u4F1A\u56DE\u5230\u5F85\u5904\u7406":"\u56DE\u590D\uFF1B@ \u6210\u5458\u63D0\u9192\u5BF9\u65B9",draft,onDraft:setDraft,onSubmit:post,...bits,...quoteNotice?{notice:quoteNotice}:{},submitLabel:reject?"\u6253\u56DE":"\u56DE\u590D",submitText:reject?"\u6253\u56DE":"\u56DE\u590D",footerEnd:jsx8("button",{type:"button",className:"btn ghost sm",onClick:onCancel,children:"\u53D6\u6D88"}),autoFocus:true})}function Extras({ctx,comment:c,versions,artifactId}){const refs=c.refs??[];const caps=c.capabilities??[];const conns=c.connectors??[];if(refs.length+caps.length+conns.length===0)return null;return jsxs8("ul",{className:"band-comment-extras","aria-label":"\u9644\u5E26",children:[refs.map((r,i)=>{const versionId=r.versionId??r.anchor?.versionId;const label=versionId?versionReferenceText(r.label,versions,versionId,artifactId):r.label;return jsx8("li",{children:r.threadId?jsx8("button",{type:"button",className:"chip plain band-comment-extras-link",onClick:()=>r.threadId&&ctx.threads.open(r.threadId),children:jsx8(VersionReference,{label})}):jsx8("span",{className:"chip plain",children:jsx8(VersionReference,{label})})},`ref:${i}`)}),caps.map(id=>jsxs8("li",{className:"chip plain",children:["/",id]},`cap:${id}`)),conns.map(id=>jsx8("li",{className:"chip plain",children:id},`conn:${id}`))]})}var SHOT_WAIT_MS=3e3;function useAnchorShot(ctx,anchor){const[state,setState]=useState8(null);const[dropped,setDropped]=useState8(null);const pending=useRef8(Promise.resolve(null));useEffect7(()=>{if(!ctx.attachments.available)return;let live=true;const shot=thumbnailOf(ctx,anchor);pending.current=shot;void shot.then(blob=>{if(!live||!blob)return;setState({anchorId:anchor.id,blob,url:URL.createObjectURL(blob)})});return()=>{live=false}},[ctx,anchor]);useEffect7(()=>()=>{if(state)URL.revokeObjectURL(state.url)},[state]);const current=state?.anchorId===anchor.id&&dropped!==anchor.id?state:null;return{url:current?.url??null,drop:()=>setDropped(anchor.id),async upload(used){if(!ctx.attachments.available||dropped===anchor.id)return null;if(used>=ATTACHMENT_LIMITS2.maxPerMessage)return null;const blob=current?.blob??await Promise.race([pending.current,new Promise(r=>setTimeout(()=>r(null),SHOT_WAIT_MS))]);if(!blob)return null;try{const file=new File([blob],"\u6807\u6CE8\u622A\u56FE.png",{type:blob.type||"image/png"});return(await ctx.attachments.upload(file)).id}catch(e){ctx.report(e);return null}}}}async function thumbnailOf(ctx,anchor){const hosts=(ctx.collab?.anchors.hosts()??[]).filter(h=>h.thumbnail&&h.kinds.includes(anchor.kind));for(const h of hosts){const blob=await h.thumbnail?.(anchor).catch(()=>null);if(blob)return blob}return null}export{QUOTE_KEY_PREFIX,ThreadCard,carriedItems,src_default as default,restartMessage,useProjectAdmin};
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kanyun-ai-infra/band-comment",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "评论框与发送框:在内容上提意见、给 Agent 发消息",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
7
7
|
".": "./dist/index.js"
|
|
8
8
|
},
|
|
9
9
|
"peerDependencies": {
|
|
10
|
-
"@kanyun-ai-infra/band-plugin-sdk": "^1.
|
|
10
|
+
"@kanyun-ai-infra/band-plugin-sdk": "^2.1.0",
|
|
11
11
|
"@kanyun-ai-infra/band-project": "*",
|
|
12
|
-
"react": "^
|
|
13
|
-
"react-dom": "^
|
|
12
|
+
"react": "^19.0.0",
|
|
13
|
+
"react-dom": "^19.0.0",
|
|
14
14
|
"@kanyun-ai-infra/band-version-switch": "*"
|
|
15
15
|
},
|
|
16
16
|
"peerDependenciesMeta": {
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kanyun-ai-infra/band-header",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "项目头:工坊、项目地址、分支、项目名、成员;评审页与产物页的头",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
7
7
|
".": "./dist/index.js"
|
|
8
8
|
},
|
|
9
9
|
"peerDependencies": {
|
|
10
|
-
"@kanyun-ai-infra/band-plugin-sdk": "^1.
|
|
11
|
-
"react": "^
|
|
12
|
-
"react-dom": "^
|
|
10
|
+
"@kanyun-ai-infra/band-plugin-sdk": "^2.1.0",
|
|
11
|
+
"react": "^19.0.0",
|
|
12
|
+
"react-dom": "^19.0.0",
|
|
13
13
|
"@kanyun-ai-infra/band-project": "*"
|
|
14
14
|
}
|
|
15
15
|
}
|