@stephen1620/dsh-tomato-board 0.3.3 → 0.3.4
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/README.md +103 -32
- package/lib/client.js +5078 -831
- package/lib/client.js.map +1 -1
- package/lib/index.js +2509 -17
- package/lib/invariant.js +1 -1
- package/lib/types/client/TomatoBoard.d.ts +1 -0
- package/lib/types/index.d.ts +2 -1
- package/package.json +1 -1
package/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["css","css","Button","IconRefreshOutline16","css","Modal","Button","Menu","IconRefreshOutline16","IconCloseOutline16","Toast","IconChevronDownOutline14"],"sources":["../../../packages/core/session/src/types.ts","../src/client/Tag.tsx","../src/client/StoryPoints.tsx","../src/client/TomatoBoard.tsx"],"sourcesContent":["import type { Branded } from '@deepseek-ai/dsh-brand'\nimport type {\n AssistantMessage,\n ToolCallId,\n LlmCallConfig,\n LlmCallConfigAdapterDefaults,\n LlmFailure,\n StreamChunk,\n TokenUsage,\n ToolResultMessage,\n ToolSchema,\n UserMessage,\n} from '@deepseek-ai/dsh-llm'\nimport type { JsonValue } from './json.ts'\n\n// The lossless-JSON payload type belongs to this client-safe face too: a wire\n// contract carrying JSON data must not import the root entry, which merges\n// `ctx.sessions` (a Host-only SessionStore) into every consumer's program.\nexport type { JsonValue } from './json.ts'\n\n/** Identifies one session in the store (and its persistence artifacts). */\nexport type SessionId = Branded<'SessionId'>\n\n/**\n * Brand a string as a {@link SessionId}.\n * @param id - the raw session id string.\n * @returns the same string, branded (a compile-time cast — no runtime cost).\n */\nexport function SessionId(id: string): SessionId {\n return id as SessionId\n}\n\n/**\n * The on-disk session format version, stamped into every newly-written {@link SessionHeader}\n * and enforced by every persistence backend on load. The single source of truth for the\n * version — write sites and the load-time check all read it.\n * While the harness is unreleased it is pinned at `0`: no compatibility is\n * implied, incompatible logs are rejected, and no migration is provided.\n *\n * The version is a single monotonic integer with no major/minor split. Whether\n * a bump is needed is decided by what the WRITER emits, never by what a newer\n * reader can accept: bump exactly when an older runtime could no longer handle\n * a new log with full semantic correctness (\"parses without error\" is not\n * correctness — silently skipping content that shapes reconstruction is a\n * wrong read). Only structural changes reach that bar: the header shape, the\n * {@link SessionEvent} envelope, core event semantics, or the surface\n * mechanism (the {@link SurfaceEventType} set and {@link SurfaceOp} variants).\n * Adding an ordinary event type does not bump: the generated known-event guard\n * makes older runtimes refuse logs containing a type they do not understand.\n * When in doubt, bump: a near-identity upgrade step is almost free, a missed\n * bump makes older runtimes read new logs wrong silently. The full mechanism\n * (upgrade-step chain, in-memory view conversion, migrate-on-continue) is\n * recorded in the fail-closed-session-event-vocabulary Agent Note\n * (`.agents/notes/implemented/simplification/2026-08-25-fail-closed-session-event-vocabulary.md`).\n */\nexport const SESSION_FORMAT_VERSION = 0\n\n/**\n * Immutable validated storage metadata, kept outside the conversation event log.\n */\nexport interface SessionHeader {\n /**\n * On-disk format version, stamped from {@link SESSION_FORMAT_VERSION} when the\n * session is created. A persistence backend rejects any other version on load\n * (no migration — see the constant).\n */\n readonly version: number\n /** The session's id (mirrors the {@link Session}'s id). */\n readonly id: SessionId\n /** Non-negative safe-integer Unix epoch milliseconds when the session was created. */\n readonly createdAt: number\n /** Absolute working directory the session was created in (if any). */\n readonly cwd?: string\n /** The session this one was forked from (seed lineage), if any. */\n readonly parentSession?: SessionId\n /**\n * How many leading events were inherited through a seed. Persisting this\n * boundary lets resume and replay distinguish parent history from child work.\n */\n readonly seedLength?: number\n /**\n * Coarse product classification for a session created as a subagent child.\n * This is presentation metadata, not proof that the child is continuable.\n */\n readonly origin?: 'subagent'\n /**\n * Delegation depth: absent (zero) for a top-level session, parent depth + 1\n * for a subagent child. Persisted so a recursion budget survives restart and\n * resume — a runtime-only depth would reset a resumed child to top-level.\n */\n readonly delegationDepth?: number\n /**\n * Id of the agent preset this session's agent was composed from, when the\n * deployment composes per session. Durable because the preset decides the\n * session's tools and prompt: a resume that restored a different composition\n * would replay history the model can no longer act on.\n */\n readonly agentPreset?: string\n}\n\n/**\n * Options for creating a {@link Session} via the store. `seed` replays/forks\n * an existing event log; `meta` carries the caller-supplied storage fields the\n * store folds into a {@link SessionHeader}.\n */\nexport interface CreateSessionOptions {\n /** Initial replay or fork history supplied at construction. */\n readonly seed?: readonly SessionEvent[]\n /**\n * Storage metadata read once before publication. `seedLength` is explicit\n * because a resumed seed contains the full stored log, not only its inherited prefix.\n */\n readonly meta?: {\n readonly cwd?: string\n readonly parentSession?: SessionId\n readonly createdAt?: number\n readonly seedLength?: number\n readonly origin?: 'subagent'\n readonly delegationDepth?: number\n readonly agentPreset?: string\n }\n}\n\n/**\n * Fresh storage values transferred to {@link SessionStore.prepare} without a\n * second serialization copy. Callers retain no mutable aliases.\n */\nexport interface RestoredSessionOptions {\n /** Fresh detached storage events to validate and freeze in place. */\n readonly seed: SessionEvent[]\n /** Fresh detached storage metadata to validate and freeze in place. */\n readonly meta: SessionHeader\n /** Select the persistence ownership-transfer path. */\n readonly seedSource: 'persistence'\n}\n\n/** Inputs accepted while constructing an unpublished Session. */\nexport type PrepareSessionOptions =\n | (CreateSessionOptions & { readonly seedSource?: undefined })\n | RestoredSessionOptions\n\n/** Why an active agent driver was cancelled. */\nexport type AgentCancelCause =\n | { readonly kind: 'user' }\n | { readonly kind: 'parent' }\n | { readonly kind: 'hook'; readonly reason: string }\n | { readonly kind: 'disposed' }\n\n/** Durable cancellation cause, including imports whose original coarse record carried no cause. */\nexport type TurnEndCancelCause = AgentCancelCause | { readonly kind: 'legacy' }\n\n/**\n * Why a turn ended. Merge-extensible sum type.\n */\nexport interface TurnEndReasonMap {\n completed: { kind: 'completed' }\n /** A cancellation request interrupted the live turn. */\n aborted: { kind: 'aborted'; reason: TurnEndCancelCause }\n\n blocked: { kind: 'blocked' }\n /**\n * The turn failed. `error` is always a structured failure: the `LlmError`\n * facts verbatim, or `{ message: errorChain(error), code: 'UNKNOWN' }`\n * flattened from any other error.\n */\n error: { kind: 'error'; error: LlmFailure }\n /** At least one step reached its output-token ceiling, even if a plugin continued the turn. */\n 'max-tokens': { kind: 'max-tokens' }\n /**\n * A persistence backend closed a crash-orphaned turn on reload. The loop never\n * emits this marker, and the events recorded before the crash remain intact.\n */\n interrupted: { kind: 'interrupted' }\n}\n\n/** The union over {@link TurnEndReasonMap} — why a turn ended; plugins extend it by merging variants into the map. */\nexport type TurnEndReason = TurnEndReasonMap[keyof TurnEndReasonMap]\n\n/**\n * Logged request state outside derived history: call config, system prompt, and\n * tools. The latest full `request/header` snapshot reconstructs it; canonical\n * empty optional fields are absent.\n */\nexport interface EpochHeader {\n /** The conversation's call configuration (provider, model, reasoning effort, and sampling scalars). */\n config: LlmCallConfig\n /** Effective config fields materialized from the exact adapter rather than proposed by a caller. */\n adapterDefaults?: LlmCallConfigAdapterDefaults\n /** Rendered system prompt text; absent for a system-less request. */\n system?: string\n /** Assembled tool schemas; absent for a tool-less request. */\n tools?: ToolSchema[]\n}\n\n/** Registration-bound metadata for one resolved model route. */\nexport interface RequestContext {\n /** Registered provider route the metadata belongs to. */\n provider: string\n /** Provider-owned model id the metadata belongs to. */\n model: string\n /** Maximum combined request and response context in tokens, when advertised. */\n contextWindow?: number\n}\n\n/**\n * Why a `request/header` snapshot was appended: `'initial'` — the log's first\n * header (a new conversation); `'resume'` — a loop instance's first request\n * over a log that already has header events (process restart, fork seed);\n * `'change'` — a later request used a different header, with `startsSeries`\n * preserving a coincident series boundary; `'series'` — an unchanged header\n * began an explicitly distinct message series or followed a surface replacement.\n */\nexport type RequestHeaderReason = 'initial' | 'resume' | 'change' | 'series'\n\n/**\n * The merge-extensible, append-only source of truth for an agent interaction.\n * Message history is derived from this log. Every event is lossless JSON and\n * sequence numbers stay contiguous, including raw chunks, so persistence can\n * store the canonical log verbatim.\n */\nexport interface SessionEventMap {\n /**\n * Opens turn `turn` before the loop claims queued input or runs pre-step.\n * Rejection, empty input, cancellation, or failure may close it with no\n * step; otherwise the following identified `user/message` event or batch\n * records the messages entering the step.\n */\n 'turn/start': { turn: number }\n /**\n * Closes turn `turn` with the {@link TurnEndReason} that ended it. A turn\n * with no entered step has no `step/start` or `step/end`. The loop does not await a\n * flush at turn boundaries: `dsh-session-checkpoint-policy` owns the\n * per-request durability checkpoint, and consumers that read storage after\n * `whenIdle()` flush themselves. Success commits the turn; rejection is\n * reported live and does not prevent later work.\n */\n 'turn/end': { turn: number; reason: TurnEndReason }\n /** Opens step `step` of turn `turn` — one model call plus the tool executions it requested. */\n 'step/start': { turn: number; step: number }\n /** Closes step `step` of turn `turn`. */\n 'step/end': { turn: number; step: number }\n /**\n * A user-role message on the model-visible surface: a direct human prompt\n * (the queued message claimed for this turn), a synthetic `agent.inject()`\n * context (file-change notices, subdir AGENTS.md, skill content, cron\n * notifications, …), or an entered goal continuation round. All three\n * project their `content` verbatim; `source` tells them apart.\n */\n 'user/message': UserMessage\n /** Raw stream chunk — token-level replay fidelity. */\n 'assistant/chunk': { turn: number; step: number; chunk: StreamChunk }\n /**\n * Assembled assistant message for one step (derived history uses this).\n * Carries the step's `usage` when the adapter reported token accounting, so\n * the model output and its accounting travel together (there is no separate\n * usage record). `usage` is absent when the adapter reported none. A turn\n * cancelled mid-stream finalizes its delivered text/reasoning prefix as this\n * event with `interrupted: true`; undispatched tool calls are absent. The\n * marker distinguishes that prefix without re-deriving interruption from turn\n * boundaries. An aborted turn with no such event streamed no visible content.\n */\n 'assistant/message': { turn: number; step: number; message: AssistantMessage; usage?: TokenUsage; interrupted?: true }\n /**\n * The model requested one tool invocation: `name` with the raw `arguments`\n * JSON string exactly as the model produced it (unparsed). `callId` pairs the\n * call with its `tool/result`.\n */\n 'tool/call': { turn: number; step: number; callId: ToolCallId; name: string; arguments: string }\n /**\n * A completed tool call's model-facing result, optional internal failure\n * identity, and optional tool-private `meta` presentation payload. `meta` is\n * opaque to the core (the producing tool owns its shape and reads it back in\n * `presentResult`) but MUST be JSON-serializable: `Session.append`\n * runtime-validates all event data with `isJsonValue`, so a non-serializable\n * `meta` is rejected at the source, and the durable log reproduces the\n * identical card on replay. Absent\n * unless the tool attaches one (e.g. `dsh-tool-fs` carries its result-time\n * contextual diff here).\n */\n 'tool/result': {\n turn: number\n step: number\n message: ToolResultMessage\n error?: { name: string; code: string }\n meta?: JsonValue\n }\n /**\n * Full header for the next request, appended inside its step before dispatch.\n * It is log-only; the latest snapshot reconstructs the request header.\n */\n 'request/header': {\n header: EpochHeader\n reason: RequestHeaderReason\n /** A changed header also begins a distinct model-message series. */\n startsSeries?: true\n }\n /**\n * Route metadata for the next request, logged only when the route or capacity\n * changes. It does not participate in request reconstruction or header equality.\n */\n 'request/context': RequestContext\n /**\n * Marks the end of a constructor seed. Events before it have smaller seq\n * values and came from the seed (resume, fork, or replay); this lifecycle\n * produced none of them. This log-only event is the durable projection of\n * {@link Session.firstLiveSeq}. Its payload is empty — position and `time`\n * carry the meaning.\n *\n * Locate the LAST one in stored history. A seed already ending in one is not\n * re-marked, so reopening an untouched session does not grow its log per\n * pickup and the event need not be at the current `firstLiveSeq`.\n *\n * `Session`'s constructor is the only legitimate writer. The invariant\n * companion deliberately constrains nothing here, so a plugin appending one\n * would silently classify every live bracket before it as seed history.\n *\n * An owner of a standalone open/close bracket (`compaction/start` …\n * `compaction/end`) reads it because seed history and live work are otherwise\n * byte-identical: an unmatched opening marker before this event belongs to\n * an ended lifecycle, whatever ended it. NOT a liveness signal about other\n * writers — a concurrently live session holds its own boundary elsewhere,\n * so tolerating concurrent writers needs a signal beyond the log.\n */\n 'session/end-seed': Record<string, never>\n}\n\n/** The appendable event-type keys of {@link SessionEventMap}, plugin-merged extensions included. */\nexport type SessionEventType = keyof SessionEventMap\n\n/**\n * The subset of {@link SessionEventType} values whose events produce LLM\n * messages and are eligible to appear on the ordered surface. Only these\n * event types may carry {@link SurfaceOp} and {@link SessionEvent.sourceEventSeqs}.\n */\nexport type SurfaceEventType =\n | 'user/message'\n | 'assistant/message'\n | 'tool/result'\n\n/**\n * A {@link SessionEvent} that is **on** the ordered surface — its\n * `surfaceOp` is guaranteed present (mandatory), narrowed from a\n * surface-eligible {@link SessionEvent} by checking both `type` and\n * `surfaceOp` at runtime.\n *\n * Use the `isSurfaceEvent` type guard (in `surface.ts`) to narrow a\n * `SessionEvent` to this type.\n */\nexport type SurfaceEvent = SessionEvent<SurfaceEventType> & { surfaceOp: SurfaceOp }\n\n/**\n * How a session event entered the ordered surface. Only valid on\n * {@link SurfaceEventType} events.\n *\n * - `'append'`: added to the tail — normal path for user/assistant/tool\n * messages.\n * - `{ op: 'replace', start, end }`: replaces surface nodes from `start`\n * (inclusive) through `end` (inclusive) with this node. Both must exist as\n * surface nodes in the current surface. `start === end` replaces a single\n * node. The node's {@link SessionEvent.sourceEventSeqs} must include every\n * shadowed surface node. Used by compaction; any surface-replacing producer\n * may use it.\n */\nexport type SurfaceOp =\n | 'append'\n | { op: 'replace'; start: number; end: number }\n\n/**\n * Surface placement and cited source-event seqs for {@link Session.append}. Required on\n * message-producing events and forbidden on log-only events.\n */\nexport interface SurfaceIntent {\n surfaceOp: SurfaceOp\n /**\n * Complete set of known source-event seqs. `assistant/message` may use a\n * present empty array for a known empty provider stream; when the field is\n * absent, the event does not record which earlier events produced the message.\n * Other surface events require a non-empty set when this field is present.\n */\n sourceEventSeqs?: number[]\n}\n\n/**\n * One immutable entry in the session log.\n *\n * A proper discriminated union over `type` (not independent `type`/`data`\n * unions), so `switch (event.type)` narrows `event.data` without casts.\n *\n * The {@link sourceEventSeqs} and {@link surfaceOp} fields are conditional:\n * they only exist on {@link SurfaceEventType} variants (`user/message`,\n * `assistant/message`, `tool/result`).\n * Non-surface events (boundary markers, chunks, usage, errors) never carry\n * surface metadata — the compiler enforces this at `Session.append()`\n * call sites.\n */\nexport type SessionEvent<T extends SessionEventType = SessionEventType> = {\n [K in SessionEventType]: {\n type: K\n /** Monotonic sequence number within the session. */\n seq: number\n /** Unix epoch milliseconds. */\n time: number\n data: SessionEventMap[K]\n } & (K extends SurfaceEventType ? {\n /**\n * Seq numbers of earlier events that this event cites as sources\n * (e.g. the `assistant/chunk` seqs that built an `assistant/message`,\n * or the surface nodes shadowed by a compaction replace node). An\n * `assistant/message` may carry a present empty array for a known empty\n * provider stream; when the field is absent, the event does not record which\n * earlier events produced the message.\n */\n sourceEventSeqs?: number[]\n /** How this event entered the surface; absent for non-surface events. */\n surfaceOp?: SurfaceOp\n } : object)\n}[T]\n","import type { CSSProperties, ReactNode } from 'react'\nimport css from './tag.module.css'\n\nexport interface TagProps {\n children: ReactNode\n /** Tint color (hex or CSS color var). Omit for the neutral card-meta look. */\n tone?: string | undefined\n /** Render as a toggle button (filter chips) instead of a static span. */\n interactive?: boolean\n /** Toggle state for interactive tags; false renders the dimmed-off look. */\n pressed?: boolean | undefined\n title?: string | undefined\n className?: string | undefined\n onClick?: (() => void) | undefined\n}\n\n/**\n * The one tag chip used across the workbench — card metadata, filter chips and\n * status labels. Static usage renders a span; interactive usage renders a\n * toggle button. Only callers that pass `tone` get a colored chip (by\n * convention just the item-type tags).\n */\nexport function Tag({ children, tone, interactive = false, pressed, title, className, onClick }: TagProps) {\n const style = tone === undefined ? undefined : { '--tag-tone': tone } as CSSProperties\n const classes = [\n css.tag,\n tone === undefined ? '' : css.toned,\n interactive ? css.toggle : '',\n interactive && pressed === false ? css.off : '',\n className,\n ].filter(Boolean).join(' ')\n if (interactive) {\n return (\n <button type=\"button\" className={classes} style={style} title={title} aria-pressed={pressed} onClick={onClick}>\n {children}\n </button>\n )\n }\n return <span className={classes} style={style} title={title}>{children}</span>\n}\n","import { useEffect, useMemo, useRef, useState } from 'react'\nimport type { Dispatch, ReactNode, SetStateAction } from 'react'\nimport { Button, IconRefreshOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport css from './story-points.module.css'\nimport { Tag } from './Tag'\nimport type { TomatoItem } from './TomatoBoard'\n\ntype User = { username: string; name: string }\ntype Sprint = { sprintId: string; name: string; workspaceKey: string; status: string; startDate?: string }\ntype Item = TomatoItem & { storyPoints: number | null }\ntype Result = { items: Item[]; truncated: boolean }\ntype Team = { id: string; name: string; members: string[] }\nconst LEGACY_TEAM_KEY = 'taskboard.tomatoStoryTeam.v1'\nconst TEAMS_KEY = 'taskboard.tomatoStoryTeams.v2'\nconst SPRINT_KEY = 'taskboard.tomatoStorySprint.v1'\nconst OWNER_KEY = 'taskboard.tomatoStoryOwner.v1'\nconst colors = ['#d76b50', '#458e88', '#c79940', '#687fb2', '#976f9c', '#75914f', '#be7f92', '#698b9d']\nconst number = (value: number) => new Intl.NumberFormat('zh-CN', { maximumFractionDigits: 4 }).format(value)\nconst total = (items: Item[]) => items.reduce((sum, item) => sum + (item.storyPoints ?? 0), 0)\nconst savedValue = (key: string, fallback: string) => { try { return localStorage.getItem(key) || fallback } catch { return fallback } }\nconst teamId = () => `team-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 7)}`\nasync function json<T>(url: string, signal?: AbortSignal): Promise<T> {\n const response = await fetch(url, { signal: signal ?? null, cache: 'no-store', headers: { accept: 'application/json', 'cache-control': 'no-cache' } }); const text = await response.text(); let body: Record<string, unknown>\n try { body = text ? JSON.parse(text) as Record<string, unknown> : {} } catch { throw new Error(response.status === 404 || text.trim() === 'not found' ? '迭代故事点接口尚未加载,请完全重启 DSH Desktop' : `服务返回了无法识别的内容 (${response.status})`) }\n if (!response.ok) throw new Error(typeof body.error === 'string' ? body.error : `请求失败 (${response.status})`); return body as T\n}\nfunction readTeams(): Team[] {\n try {\n const saved: unknown = JSON.parse(localStorage.getItem(TEAMS_KEY) ?? '[]')\n if (Array.isArray(saved) && saved.length) return saved.flatMap(value => value && typeof value === 'object' ? [{ id: String((value as Team).id), name: String((value as Team).name), members: Array.isArray((value as Team).members) ? [...new Set((value as Team).members)] : [] }] : [])\n const legacy: unknown = JSON.parse(localStorage.getItem(LEGACY_TEAM_KEY) ?? '[]')\n return Array.isArray(legacy) && legacy.length ? [{ id: 'team-default', name: '默认团队', members: legacy.filter((value): value is string => typeof value === 'string') }] : []\n } catch { return [] }\n}\n\nexport function StoryPoints({ toolbarTarget, onOpenItem }: { toolbarTarget: Dispatch<SetStateAction<ReactNode>>; onOpenItem: (item: TomatoItem) => void }) {\n const [sprints, setSprints] = useState<Sprint[]>([]); const [users, setUsers] = useState<User[]>([])\n const [sprint, setSprint] = useState(() => savedValue(SPRINT_KEY, '')); const [owner, setOwner] = useState(() => savedValue(OWNER_KEY, 'currentUser()'))\n const [teams, setTeams] = useState(readTeams); const [openTeamId, setOpenTeamId] = useState(() => readTeams()[0]?.id ?? '')\n const [teamDraft, setTeamDraft] = useState(''); const [teamEditor, setTeamEditor] = useState<{ mode: 'create' | 'rename'; id?: string } | null>(null)\n const [addingTeamId, setAddingTeamId] = useState(''); const addPeopleRef = useRef<HTMLDivElement>(null); const addPeopleInputRef = useRef<HTMLInputElement>(null); const [search, setSearch] = useState('')\n const [results, setResults] = useState<Record<string, Result>>({}); const [errors, setErrors] = useState<Record<string, string>>({}); const [directoryError, setDirectoryError] = useState(''); const [directoryLoading, setDirectoryLoading] = useState(true); const [version, setVersion] = useState(0); const [directoryVersion, setDirectoryVersion] = useState(0)\n useEffect(() => {\n const controller = new AbortController(); setDirectoryLoading(true); setDirectoryError('')\n void Promise.all([json<{ sprints: Sprint[] }>('/api/tomato-board/sprints', controller.signal), json<{ users: User[] }>('/api/tomato-board/filters', controller.signal)]).then(([data, directory]) => { const sorted = [...data.sprints].sort((a, b) => (b.startDate ?? '').localeCompare(a.startDate ?? '')); setSprints(sorted); setUsers(directory.users); setSprint(current => sorted.some(value => value.sprintId === current) ? current : sorted[0]?.sprintId || '') }).catch(error => { if (!controller.signal.aborted) setDirectoryError(error.message) }).finally(() => { if (!controller.signal.aborted) setDirectoryLoading(false) }); return () => controller.abort()\n }, [directoryVersion])\n useEffect(() => { try { localStorage.setItem(TEAMS_KEY, JSON.stringify(teams)) } catch {} }, [teams]); useEffect(() => { if (sprint) try { localStorage.setItem(SPRINT_KEY, sprint) } catch {} }, [sprint]); useEffect(() => { try { localStorage.setItem(OWNER_KEY, owner) } catch {} }, [owner])\n const openTeam = teams.find(team => team.id === openTeamId); const openMembers = openTeam?.members ?? []; const ownersKey = JSON.stringify([...new Set([owner, ...openMembers])].sort())\n const resultScope = useRef('')\n useEffect(() => {\n if (directoryLoading || !sprint) return\n const scope = JSON.stringify([sprint, version])\n const sameScope = resultScope.current === scope\n if (!sameScope) {\n resultScope.current = scope\n setResults({})\n setErrors({})\n }\n const controller = new AbortController(); const owners = (JSON.parse(ownersKey) as string[]).filter(username => !sameScope || (!results[username] && !errors[username]))\n const worker = async () => { while (owners.length && !controller.signal.aborted) { const username = owners.shift()!; try { const data = await json<Result>(`/api/tomato-board/story-points?${new URLSearchParams({ sprint, assignee: username, refresh: String(version) })}`, controller.signal); if (!controller.signal.aborted) setResults(current => ({ ...current, [username]: data })) } catch (error) { if (!controller.signal.aborted) setErrors(current => ({ ...current, [username]: error instanceof Error ? error.message : '读取失败' })) } } }; void Promise.all([worker(), worker(), worker()]); return () => controller.abort()\n }, [directoryLoading, sprint, ownersKey, version])\n const personal = results[owner]; const items = useMemo(() => [...(personal?.items ?? [])].sort((a, b) => (b.storyPoints ?? -1) - (a.storyPoints ?? -1) || a.itemKey.localeCompare(b.itemKey)), [personal]); const sum = total(items); const slices = items.filter(item => item.storyPoints !== null && item.storyPoints > 0); let offset = 0\n const gradient = slices.map((item, index) => { const start = offset; offset += item.storyPoints! / sum * 100; return `${colors[index % colors.length]} ${start}% ${offset}%` }).join(', '); const userName = (username: string) => username === 'currentUser()' ? '我' : users.find(user => user.username === username)?.name ?? username\n const toggleTeam = (id: string) => { setOpenTeamId(current => current === id ? '' : id); setAddingTeamId(''); setTeamEditor(null) }\n const ranking = openMembers.map(username => ({ username, result: results[username], points: total(results[username]?.items ?? []) })).sort((a, b) => Number(Boolean(b.result)) - Number(Boolean(a.result)) || b.points - a.points || a.username.localeCompare(b.username)); const max = Math.max(1, ...ranking.map(row => row.points)); const available = users.filter(user => !openMembers.includes(user.username) && `${user.name} ${user.username}`.toLowerCase().includes(search.toLowerCase()))\n const submitTeam = () => { const name = teamDraft.trim(); if (!name || !teamEditor) return; if (teamEditor.mode === 'create') { const team = { id: teamId(), name, members: [] }; setTeams(current => [...current, team]); setOpenTeamId(team.id) } else setTeams(current => current.map(team => team.id === teamEditor.id ? { ...team, name } : team)); setTeamDraft(''); setTeamEditor(null) }\n const deleteTeam = (id: string) => { setTeams(current => current.filter(team => team.id !== id)); if (openTeamId === id) setOpenTeamId('') }\n const updateMembers = (id: string, updater: (values: string[]) => string[]) => setTeams(current => current.map(team => team.id === id ? { ...team, members: updater(team.members) } : team))\n useEffect(() => { if (!addingTeamId) return; const close = (event: PointerEvent) => { if (event.target instanceof Node && !addPeopleRef.current?.contains(event.target)) { setAddingTeamId(''); setSearch('') } }; document.addEventListener('pointerdown', close, true); requestAnimationFrame(() => addPeopleInputRef.current?.focus()); return () => document.removeEventListener('pointerdown', close, true) }, [addingTeamId])\n useEffect(() => { toolbarTarget(<div className={css.headerControls}><label><span>迭代</span><select aria-label=\"选择迭代\" value={sprint} disabled={directoryLoading} onChange={event => { setSprint(event.target.value); setResults({}); setErrors({}) }}>{!sprints.length && <option value=\"\">{directoryLoading ? '正在读取迭代…' : '暂无迭代'}</option>}{sprints.map(value => <option key={value.sprintId} value={value.sprintId}>{value.name} · {value.workspaceKey}{value.status === 'completed' ? '(已结束)' : ''}</option>)}</select></label><Button variant=\"toolbar\" size=\"sm\" className={css.headerIconButton} icon={<IconRefreshOutline16 />} title=\"刷新\" aria-label=\"刷新迭代故事点\" onClick={() => { setResults({}); setErrors({}); setVersion(value => value + 1); if (directoryError || !sprints.length) setDirectoryVersion(value => value + 1) }} /></div>); return () => toolbarTarget(null) }, [directoryError, directoryLoading, sprint, sprints, toolbarTarget])\n return <div className={css.page}>{directoryError && <p className={css.error}>{directoryError},请点击刷新重试。</p>}<div className={css.columns}>\n <section className={css.panel} aria-label=\"个人故事点\"><div className={css.panelHeader}><h3>个人分布</h3><select aria-label=\"选择个人负责人\" value={owner} onChange={event => setOwner(event.target.value)}><option value=\"currentUser()\">我负责的</option>{users.map(user => <option key={user.username} value={user.username}>{user.name} · {user.username}</option>)}</select></div>{errors[owner] ? <p className={css.error}>{errors[owner]}</p> : !personal ? <p className={css.empty}>{sprint ? '正在读取个人故事点…' : '请选择迭代'}</p> : <><div className={css.summary}><div><span className={css.eyebrow}>故事点总数</span><div className={css.total}>{number(sum)}<small> SP</small></div></div><div className={css.pie} style={{ background: gradient ? `conic-gradient(${gradient})` : undefined }}><div><strong>{slices.length}</strong><span>项占比</span></div></div></div><div className={css.listHeading}><h4>需求列表</h4><span>{items.length} 项</span></div>{!items.length && <p className={css.empty}>该负责人在本迭代暂无事项。</p>}<div>{items.map(item => <div className={css.item} key={item.itemKey} role=\"button\" tabIndex={0} aria-label={`打开 ${item.itemKey} 的对话`} onClick={() => onOpenItem(item)} onKeyDown={event => { if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); onOpenItem(item) } }}><span className={css.dot} style={{ background: item.storyPoints && item.storyPoints > 0 ? colors[slices.indexOf(item) % colors.length] : 'var(--dsw-alias-border-l2, #ddd)' }} /><div className={css.itemText}><span className={css.itemTitle}>{item.title}</span><small>{item.itemKey}</small><Tag>{item.status}</Tag></div><strong className={css.itemPoints}>{item.storyPoints === null ? '未估点' : `${number(item.storyPoints)} SP`}</strong><Button className={css.tomatoLink} variant=\"ghost\" size=\"sm\" title=\"在番茄中打开事项\" aria-label={`在番茄中打开 ${item.itemKey}`} onClick={event => { event.stopPropagation(); window.open(item.tomatoUrl, '_blank', 'noopener,noreferrer') }} onKeyDown={event => event.stopPropagation()}>↗</Button></div>)}</div></>}</section>\n <section className={css.panel} aria-label=\"团队故事点\"><div className={css.teamsHeader}><h3>团队分布</h3><button className={css.addTeamButton} aria-label=\"创建团队\" title=\"创建团队\" onClick={() => { setTeamEditor({ mode: 'create' }); setTeamDraft('') }}>+ 创建团队</button></div>{teamEditor?.mode === 'create' && <form className={css.teamEditor} onSubmit={event => { event.preventDefault(); submitTeam() }}><input autoFocus placeholder=\"团队名称\" value={teamDraft} onChange={event => setTeamDraft(event.target.value)} /><button type=\"button\" onClick={() => setTeamEditor(null)}>取消</button><button type=\"submit\">创建</button></form>}<div className={css.teamAccordions}>{teams.map(team => { const open = openTeamId === team.id; const rows = open ? ranking : []; return <article className={css.teamAccordion} key={team.id}><div className={css.teamAccordionHeader}><button className={css.teamToggle} aria-expanded={open} onClick={() => toggleTeam(team.id)}><span className={css.chevron}>›</span><strong>{team.name}</strong><small>{team.members.length} 人</small></button><button className={css.renameTeam} aria-label={`改名 ${team.name}`} title=\"改名\" onClick={() => { setTeamEditor({ mode: 'rename', id: team.id }); setTeamDraft(team.name); setOpenTeamId(team.id) }}>✎</button><div className={css.teamRowActions}><button aria-label={`删除 ${team.name}`} title=\"删除\" onClick={() => deleteTeam(team.id)}>×</button></div></div>{teamEditor?.mode === 'rename' && teamEditor.id === team.id && <form className={css.teamEditor} onSubmit={event => { event.preventDefault(); submitTeam() }}><input autoFocus value={teamDraft} onChange={event => setTeamDraft(event.target.value)} /><button type=\"button\" onClick={() => setTeamEditor(null)}>取消</button><button type=\"submit\">保存</button></form>}{open && <div className={css.teamBody}><div className={css.teamBodyToolbar}><span>{team.members.length ? '成员故事点' : '暂无成员'}</span><div ref={addingTeamId === team.id ? addPeopleRef : undefined} className={css.addPeopleRoot}><button className={css.smallAddButton} onClick={() => setAddingTeamId(current => current === team.id ? '' : team.id)}>+ 添加成员</button>{addingTeamId === team.id && <div className={css.addPeople} role=\"dialog\"><div className={css.addPeopleTitle}><strong>添加成员</strong><button onClick={() => setAddingTeamId('')}>×</button></div><input ref={addPeopleInputRef} value={search} onChange={event => setSearch(event.target.value)} placeholder=\"搜索姓名或用户名…\" /><div>{available.map(user => <button key={user.username} onClick={() => { updateMembers(team.id, current => [...current, user.username]); setAddingTeamId(''); setSearch('') }}>{user.name}<small>{user.username}</small><span>+</span></button>)}{!available.length && <p>没有可添加的成员</p>}</div></div>}</div></div><div className={css.ranking}>{rows.map((row, index) => <div key={row.username} className={css.rankRow}><div className={css.memberRow}><button className={css.rankLabel} aria-pressed={owner === row.username} onClick={() => setOwner(row.username)}><i className={css.rankFill} style={{ width: `${row.points / max * 100}%` }} /><span className={css.rankIndex}>{String(index + 1).padStart(2, '0')}</span><span className={css.memberAvatar}>{userName(row.username).slice(0, 1)}</span><span className={css.memberIdentity}><strong>{userName(row.username)}</strong><small>{row.result ? `${row.result.items.length} 个事项` : errors[row.username] ? '读取失败' : '读取中…'}</small></span><b>{row.result ? `${number(row.points)} SP` : '—'}</b></button><button className={css.removeMember} aria-label={`移除 ${userName(row.username)}`} title=\"移除成员\" onClick={() => updateMembers(team.id, current => current.filter(value => value !== row.username))}>×</button></div></div>)}</div>{!team.members.length && <div className={css.teamBodyEmpty}>添加成员后查看故事点分布</div>}</div>}</article> })}</div>{!teams.length && <div className={css.empty}>点击右上角加号创建团队。</div>}</section>\n </div></div>\n}\n","import { useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-api-session-controller/client'\nimport type { WorkspaceView } from '@deepseek-ai/dsh-api-workspace-controller/client'\nimport type {} from '@deepseek-ai/dsh-api-workspace-controller/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-layout/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-sidebar/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport {\n Button, IconChevronDownOutline14, IconCloseOutline16, IconRefreshOutline16, Menu, Modal, Toast,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { MenuEntry } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport { SessionId } from '@deepseek-ai/dsh-session/types'\nimport css from './tomato-board.module.css'\nimport { StoryPoints } from './StoryPoints'\nimport { Tag } from './Tag'\n\nexport interface TomatoItem {\n itemKey: string\n title: string\n status: string\n itemType: string\n workspace: string\n workspaceKey: string\n workspaceName: string\n creator: string\n assignees: string[]\n priority: string\n tomatoUrl: string\n}\n\ninterface FilterDirectory {\n users: Array<{ username: string; name: string }>\n workspaces: Array<{ key: string; name: string }>\n}\n\ninterface LaneOrder {\n head: string | null\n next: Record<string, string | null>\n}\n\ninterface TomatoTransition {\n transition: string\n targetStatus: string\n disabled: boolean\n disabledReason?: string\n}\n\ninterface TomatoTransitionState {\n currentStatus: string\n tomatoUrl: string\n transitions: TomatoTransition[]\n}\n\ninterface BoardState {\n open: boolean\n loading: boolean\n // 本次打开期间已成功加载过一次的标记:空列表也算加载完成,\n // 用来区分「还没加载」和「加载了但结果为空」。\n loaded: boolean\n items: TomatoItem[]\n error: string | null\n successMessage: string | null\n selectedItem: TomatoItem | null\n truncated: boolean\n}\n\nlet state: BoardState = { open: false, loading: false, loaded: false, items: [], error: null, successMessage: null, selectedItem: null, truncated: false }\nconst listeners = new Set<() => void>()\nconst emit = (patch: Partial<BoardState>) => {\n state = { ...state, ...patch }\n for (const listener of listeners) listener()\n}\nconst subscribe = (listener: () => void) => {\n listeners.add(listener)\n return () => listeners.delete(listener)\n}\nconst snapshot = () => state\n\n// 真实番茄事项 itemKey 形如 `Gitee-Test-2026-737`、`Proxima-1116`:字母前缀(可含连字符分段)+ 数字结尾。\n// 只匹配该格式可避免把任意 `[xxx]` 开头的普通对话标题(如 `[分析]`、`[每日复盘]`)误判为番茄事项,\n// 进而错误地在对话头上渲染出状态流转按钮并触发无意义的 CLI 调用。\nconst TOMATO_ITEM_KEY_PATTERN = /^\\[([A-Za-z][A-Za-z0-9]*(?:-[A-Za-z0-9]+)*-\\d+)\\]/u\n\nconst TOMATO_STATUS_ORDER = [\n '新建', 'Bugfix', '修复中', '开发中', '待测试', '测试中', '测试通过', '已完成',\n '已取消', '延期解决', '测试完成', '待开发', '不修复', '已挂起',\n]\nconst TOMATO_FILTER_BLACKLIST_KEY = 'taskboard.tomatoFilterBlacklist.v1'\nconst TOMATO_SESSION_LINKS_KEY = 'taskboard.tomatoSessionLinks.v1'\nconst TOMATO_MUTED_ITEMS_KEY = 'taskboard.tomatoMutedItems.v1'\nconst TOMATO_LANE_ORDER_KEY = 'taskboard.tomatoLaneOrder.v1'\n\nfunction readLaneOrder(): LaneOrder {\n try {\n const value = JSON.parse(window.localStorage.getItem(TOMATO_LANE_ORDER_KEY) ?? '{}')\n return {\n head: typeof value?.head === 'string' ? value.head : null,\n next: value?.next && typeof value.next === 'object' ? value.next as Record<string, string | null> : {},\n }\n } catch {\n return { head: null, next: {} }\n }\n}\n\nfunction laneOrderValues(order: LaneOrder): string[] {\n const values: string[] = []\n const seen = new Set<string>()\n let current = order.head\n while (current && !seen.has(current) && values.length < 1000) {\n values.push(current)\n seen.add(current)\n current = order.next[current] ?? null\n }\n return values\n}\n\nfunction createLaneOrder(values: string[]): LaneOrder {\n const next: Record<string, string | null> = {}\n values.forEach((value, index) => { next[value] = values[index + 1] ?? null })\n return { head: values[0] ?? null, next }\n}\n\nfunction applyLaneOrder(statuses: string[], order: LaneOrder): string[] {\n const available = new Set(statuses)\n const tracked = laneOrderValues(order).filter(status => available.has(status))\n const trackedSet = new Set(tracked)\n return [...tracked, ...statuses.filter(status => !trackedSet.has(status))]\n}\n\nfunction readSessionLinks(): Record<string, string> {\n try {\n const value = JSON.parse(window.localStorage.getItem(TOMATO_SESSION_LINKS_KEY) ?? '{}')\n return value && typeof value === 'object' ? value as Record<string, string> : {}\n } catch {\n return {}\n }\n}\n\nfunction linkedSessionId(itemKey: string): SessionId | '' {\n const value = readSessionLinks()[itemKey]\n return typeof value === 'string' && value ? SessionId(value) : ''\n}\n\nfunction saveSessionLink(itemKey: string, sessionId: SessionId) {\n const links = readSessionLinks()\n links[itemKey] = sessionId\n window.localStorage.setItem(TOMATO_SESSION_LINKS_KEY, JSON.stringify(links))\n}\n\nfunction readFilterBlacklist(): { types: Set<string>; statuses: Set<string>; workspaces: Set<string> } {\n try {\n const value = JSON.parse(window.localStorage.getItem(TOMATO_FILTER_BLACKLIST_KEY) ?? '{}')\n return {\n types: new Set(Array.isArray(value?.types) ? value.types.filter((item: unknown): item is string => typeof item === 'string') : []),\n statuses: new Set(Array.isArray(value?.statuses) ? value.statuses.filter((item: unknown): item is string => typeof item === 'string') : []),\n workspaces: new Set(Array.isArray(value?.workspaces) ? value.workspaces.filter((item: unknown): item is string => typeof item === 'string') : []),\n }\n } catch {\n return { types: new Set(), statuses: new Set(), workspaces: new Set() }\n }\n}\n\nfunction readMutedItems(): Set<string> {\n try {\n const value = JSON.parse(window.localStorage.getItem(TOMATO_MUTED_ITEMS_KEY) ?? '[]')\n return new Set(Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : [])\n } catch {\n return new Set()\n }\n}\n\nasync function refresh(assignee = 'currentUser()') {\n emit({ loading: true, error: null, successMessage: null })\n try {\n const query = new URLSearchParams({ assignee })\n const response = await fetch(`/api/tomato-board/items?${query}`, { headers: { accept: 'application/json' } })\n const body = await response.json() as { items?: TomatoItem[]; truncated?: boolean; error?: string }\n if (!response.ok) throw new Error(body.error || `请求失败 (${response.status})`)\n emit({ items: body.items ?? [], truncated: body.truncated === true, loaded: true, successMessage: `已刷新 ${body.items?.length ?? 0} 条事项` })\n } catch (error) {\n emit({ error: error instanceof Error ? error.message : '番茄事项读取失败' })\n } finally {\n emit({ loading: false })\n }\n}\n\nfunction dismissSuccessMessage() {\n emit({ successMessage: null })\n}\n\nfunction closeWorkbench(ctx: Context) {\n // 关闭时清掉 loaded 和 error:下次打开工作台会重新拉取一次最新数据。\n emit({ open: false, selectedItem: null, loaded: false, error: null, successMessage: null })\n ctx.layout.selectPanel(null)\n}\n\nfunction TomatoBoardAction({ wide, openWorkbench }: { wide: boolean; openWorkbench: () => void }) {\n return (\n <button className={css.sidebarAction} type=\"button\" title=\"番茄工作台\" onClick={openWorkbench}>\n <span className={css.tomatoIcon} aria-hidden=\"true\">T</span>\n {wide && <span>番茄工作台</span>}\n </button>\n )\n}\n\nfunction TomatoBoardTopbarAction({ openWorkbench }: { openWorkbench: () => void }) {\n return (\n <button className={css.topbarAction} type=\"button\" title=\"打开番茄工作台\" onClick={openWorkbench}>\n <span className={css.tomatoIcon} aria-hidden=\"true\">T</span>\n <span>番茄工作台</span>\n </button>\n )\n}\n\nfunction CreateConversationDialog({ ctx, item }: { ctx: Context; item: TomatoItem }) {\n const [workspaceId, setWorkspaceId] = useState('')\n const [workspaceMenuOpen, setWorkspaceMenuOpen] = useState(false)\n const [creating, setCreating] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const workspaces = useSyncExternalStore(\n listener => ctx.workspaces.list.subscribe(listener),\n () => ctx.workspaces.list.getSnapshot(),\n () => ctx.workspaces.list.getSnapshot(),\n )\n const selectedWorkspace = workspaces.items.find(workspace => workspace.workspaceId === workspaceId)\n\n async function createConversation() {\n if (!selectedWorkspace || creating) return\n setCreating(true)\n setError(null)\n try {\n const createdSessionId = await ctx.sessions.create({ workspaceId: selectedWorkspace.workspaceId })\n const session = ctx.sessions.binding(createdSessionId)?.session\n if (!session) throw new Error('新建对话未能在 Harness 中加载')\n const title = `[${item.itemKey}] ${item.title}`\n const renamed = await session.rename(title)\n if (!renamed.ok) throw new Error(`对话标题设置失败:${renamed.error.message}`)\n const prompt = [\n `请处理番茄事项 ${item.itemKey}。`,\n `标题:${item.title}`,\n `类型:${item.itemType || '未设置'}`,\n `状态:${item.status || '未设置'}`,\n `优先级:${item.priority || '未设置'}`,\n ].join('\\n')\n const prompted = await session.prompt([{ type: 'text', text: prompt }], 'queue')\n if (!prompted.ok) throw new Error(`事项上下文写入失败:${prompted.error.message}`)\n saveSessionLink(item.itemKey, createdSessionId)\n ctx.sessions.open(createdSessionId)\n closeWorkbench(ctx)\n } catch (reason) {\n setError(reason instanceof Error ? reason.message : 'Harness 对话创建失败')\n } finally {\n setCreating(false)\n }\n }\n\n return (\n <Modal\n open\n onClose={() => emit({ selectedItem: null })}\n title=\"选择处理该事项的仓库\"\n closeLabel=\"关闭\"\n description={item.title}\n className={css.createDialog!}\n footer={(\n <>\n <Button variant=\"ghost\" onClick={() => emit({ selectedItem: null })}>取消</Button>\n <Button variant=\"primary\" disabled={!selectedWorkspace || creating} onClick={() => void createConversation()}>\n {creating ? '正在创建…' : '创建并进入对话'}\n </Button>\n </>\n )}\n >\n <div className={css.dialogBody}>\n <span>{item.itemKey}</span>\n {error ? <div className={css.error} role=\"alert\">{error}</div> : null}\n <Menu\n open={workspaceMenuOpen}\n portal\n items={workspaces.items.map((workspace: WorkspaceView) => ({\n id: workspace.workspaceId,\n label: workspace.title,\n }))}\n selectedId={workspaceId || undefined}\n onSelect={id => {\n setWorkspaceId(id)\n setWorkspaceMenuOpen(false)\n }}\n onClose={() => setWorkspaceMenuOpen(false)}\n anchor={(\n <Button\n className={css.workspaceTrigger}\n variant=\"outline\"\n aria-haspopup=\"menu\"\n aria-expanded={workspaceMenuOpen}\n onClick={() => setWorkspaceMenuOpen(open => !open)}\n >\n <span>{selectedWorkspace?.title ?? '选择 Harness 项目…'}</span>\n <span aria-hidden=\"true\">⌄</span>\n </Button>\n )}\n />\n {selectedWorkspace ? <code>{selectedWorkspace.path}</code> : null}\n </div>\n </Modal>\n )\n}\n\nfunction TomatoBoardPanel({ ctx }: { ctx: Context }) {\n const board = useSyncExternalStore(subscribe, snapshot, snapshot)\n const workbenchRef = useRef<HTMLElement>(null)\n const filterMenuRef = useRef<HTMLDetailsElement>(null)\n const [page, setPage] = useState<'board' | 'points'>('board')\n const [storyToolbar, setStoryToolbar] = useState<React.ReactNode>(null)\n const [search, setSearch] = useState('')\n const [blacklist, setBlacklist] = useState(readFilterBlacklist)\n const [mutedItems, setMutedItems] = useState(readMutedItems)\n const [selectedAssignee, setSelectedAssignee] = useState('currentUser()')\n const [filterDirectory, setFilterDirectory] = useState<FilterDirectory>({ users: [], workspaces: [] })\n const [directoryVersion, setDirectoryVersion] = useState(0)\n const [laneOrder, setLaneOrder] = useState(readLaneOrder)\n const [draggedLane, setDraggedLane] = useState<string | null>(null)\n const [dropLane, setDropLane] = useState<{ status: string; after: boolean } | null>(null)\n const laneElements = useRef(new Map<string, HTMLElement>())\n const previousLanePositions = useRef(new Map<string, DOMRect>())\n const sessions = useSyncExternalStore(\n listener => ctx.sessions.list.subscribe(listener),\n () => ctx.sessions.list.getSnapshot(),\n () => ctx.sessions.list.getSnapshot(),\n )\n\n useEffect(() => {\n // 用 loaded 而不是 items.length 判断:成功返回空列表时也算加载完成,\n // 否则 loading 变回 false 会再次命中本 effect,形成无限请求循环。\n if (board.open && !board.loaded && !board.loading && !board.error) void refresh()\n }, [board.error, board.loaded, board.loading, board.open])\n useEffect(() => {\n if (!board.open) return\n void fetch('/api/tomato-board/filters', { headers: { accept: 'application/json' } })\n .then(response => response.ok ? response.json() : Promise.reject(new Error(`HTTP ${response.status}`)))\n .then(value => setFilterDirectory(value as FilterDirectory))\n .catch(() => {})\n }, [board.open, directoryVersion])\n useEffect(() => {\n if (!board.open) return\n const closeOnOutsideNavigation = (event: PointerEvent) => {\n if (!(event.target instanceof Element)) return\n if (workbenchRef.current?.contains(event.target)) return\n if (event.target.closest('[role=\"dialog\"], [role=\"menu\"]')) return\n closeWorkbench(ctx)\n }\n document.addEventListener('pointerdown', closeOnOutsideNavigation, true)\n return () => document.removeEventListener('pointerdown', closeOnOutsideNavigation, true)\n }, [board.open])\n useEffect(() => {\n const closeFilterMenu = (event: PointerEvent) => {\n const menu = filterMenuRef.current\n if (menu?.open && event.target instanceof Node && !menu.contains(event.target)) menu.open = false\n }\n const closeFilterMenuOnEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && filterMenuRef.current?.open) filterMenuRef.current.open = false\n }\n document.addEventListener('pointerdown', closeFilterMenu, true)\n document.addEventListener('keydown', closeFilterMenuOnEscape)\n return () => {\n document.removeEventListener('pointerdown', closeFilterMenu, true)\n document.removeEventListener('keydown', closeFilterMenuOnEscape)\n }\n }, [])\n useLayoutEffect(() => {\n const previous = previousLanePositions.current\n if (previous.size === 0) return\n if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\n previous.clear()\n return\n }\n for (const [status, element] of laneElements.current) {\n const before = previous.get(status)\n if (!before) continue\n const after = element.getBoundingClientRect()\n const deltaX = before.left - after.left\n const deltaY = before.top - after.top\n if (deltaX || deltaY) {\n element.animate(\n [{ transform: `translate(${deltaX}px, ${deltaY}px)` }, { transform: 'translate(0, 0)' }],\n { duration: 240, easing: 'cubic-bezier(.2,.8,.2,1)' },\n )\n }\n }\n previous.clear()\n }, [laneOrder])\n if (!board.open) return null\n\n function openItem(item: TomatoItem) {\n const stored = linkedSessionId(item.itemKey)\n const titlePrefix = `[${item.itemKey}]`\n // 只有至少跑过一轮对话的会话才算「已关联」:blank 会话(创建后没跑起来、\n // 流程失败留下的空壳等)不拦截点击,让它走选项目的新建流程。\n const hasConversation = (id: SessionId) => sessions.byId[id]?.blank === false\n const discovered = sessions.ids.find(id => {\n const summary = sessions.byId[id]\n const matched = summary?.title?.startsWith(titlePrefix) === true || summary?.displayTitle?.startsWith(titlePrefix) === true\n return matched && hasConversation(id)\n })\n const associated = stored && hasConversation(stored) ? stored : discovered\n if (associated) {\n saveSessionLink(item.itemKey, associated)\n ctx.sessions.open(associated)\n closeWorkbench(ctx)\n return\n }\n emit({ selectedItem: item })\n }\n\n const normalizedSearch = search.trim().toLowerCase()\n const filteredItems = board.items.filter(item => (\n !blacklist.types.has(item.itemType)\n && !blacklist.statuses.has(item.status)\n && !blacklist.workspaces.has(item.workspaceKey)\n && !blacklist.workspaces.has(item.workspaceName)\n && (!normalizedSearch || [\n item.itemKey, item.title, item.itemType, item.status, item.workspaceKey, item.workspaceName, item.creator, item.assignees.join(' '), item.priority,\n ].join(' ').toLowerCase().includes(normalizedSearch))\n ))\n const typeOptions = [...new Set(board.items.map(item => item.itemType).filter(Boolean))].sort((left, right) => left.localeCompare(right))\n const statusOptions = applyLaneOrder([...new Set([\n ...TOMATO_STATUS_ORDER,\n ...board.items.map(item => item.status).filter(status => !TOMATO_STATUS_ORDER.includes(status)),\n ])], laneOrder)\n // Workspace options derive purely from the current assignee's items (the\n // board query is already assignee-scoped server-side), so the count is\n // however many workspaces that assignee actually spans — never the logged-in\n // account's full directory. The item filter checks key AND name so both\n // identity forms hide correctly.\n const workspaceOptions = (() => {\n const entries = new Map<string, { value: string; label: string }>()\n for (const item of board.items) {\n const value = item.workspaceKey || item.workspaceName || item.workspace\n if (!value) continue\n const label = item.workspaceName && item.workspaceKey && item.workspaceName !== item.workspaceKey ? `${item.workspaceName} (${item.workspaceKey})` : value\n if (!entries.has(value)) entries.set(value, { value, label })\n }\n return [...entries.values()]\n })()\n const defaultStatuses = [...new Set([\n ...TOMATO_STATUS_ORDER.filter(status => filteredItems.some(item => item.status === status)),\n ...filteredItems.map(item => item.status).filter(status => !TOMATO_STATUS_ORDER.includes(status)),\n ])]\n const statuses = applyLaneOrder(defaultStatuses, laneOrder)\n\n const persistBlacklist = (next: typeof blacklist) => {\n window.localStorage.setItem(TOMATO_FILTER_BLACKLIST_KEY, JSON.stringify({\n types: [...next.types],\n statuses: [...next.statuses],\n workspaces: [...next.workspaces],\n }))\n return next\n }\n const toggleBlacklist = (kind: 'types' | 'statuses' | 'workspaces', value: string) => setBlacklist(current => {\n const nextValues = new Set(current[kind])\n if (nextValues.has(value)) nextValues.delete(value)\n else nextValues.add(value)\n return persistBlacklist({ ...current, [kind]: nextValues })\n })\n const setWorkspaceFilterAll = (visible: boolean) => setBlacklist(current => persistBlacklist({\n ...current,\n workspaces: visible ? new Set<string>() : new Set(workspaceOptions.map(option => option.value)),\n }))\n\n const toggleMutedItem = (itemKey: string) => setMutedItems(current => {\n const next = new Set(current)\n if (next.has(itemKey)) next.delete(itemKey)\n else next.add(itemKey)\n window.localStorage.setItem(TOMATO_MUTED_ITEMS_KEY, JSON.stringify([...next]))\n return next\n })\n\n const moveLane = (dragged: string, target: string, after: boolean) => {\n if (dragged === target) return\n previousLanePositions.current = new Map([...laneElements.current].map(([status, element]) => [status, element.getBoundingClientRect()]))\n setLaneOrder(current => {\n const visible = applyLaneOrder(defaultStatuses, current).filter(status => status !== dragged)\n const targetIndex = visible.indexOf(target)\n visible.splice(targetIndex + (after ? 1 : 0), 0, dragged)\n const previousTracked = laneOrderValues(current)\n const trackedSet = new Set([...previousTracked, dragged, target])\n const hiddenTracked = previousTracked.filter(status => !visible.includes(status))\n const next = createLaneOrder([...visible.filter(status => trackedSet.has(status)), ...hiddenTracked])\n window.localStorage.setItem(TOMATO_LANE_ORDER_KEY, JSON.stringify(next))\n return next\n })\n }\n\n return (\n <section ref={workbenchRef} className={css.workbench} aria-label=\"番茄工作台\">\n <header className={css.header}>\n <div className={css.titleRow}>\n <h1>番茄工作台</h1>\n <div className={css.actions}>\n {page === 'points' && storyToolbar}\n {page === 'board' && <><label className={css.searchField}>\n <span aria-hidden=\"true\">⌕</span>\n <input\n type=\"search\"\n value={search}\n onChange={event => setSearch(event.target.value)}\n placeholder=\"搜索标题或 tag…\"\n aria-label=\"搜索标题或 tag\"\n />\n {search && <button type=\"button\" aria-label=\"清空搜索词\" onClick={() => setSearch('')}>×</button>}\n </label>\n <details ref={filterMenuRef} className={css.filterMenu}>\n <summary aria-label=\"空间、负责人、类型和状态筛选\" title=\"空间、负责人、类型和状态筛选\">\n <span aria-hidden=\"true\">▽</span>\n {(blacklist.types.size > 0 || blacklist.statuses.size > 0 || blacklist.workspaces.size > 0 || selectedAssignee !== 'currentUser()') && <i />}\n </summary>\n <div className={css.filterPopover}>\n <WorkspaceFilterRow options={workspaceOptions} hidden={blacklist.workspaces} onToggle={value => toggleBlacklist('workspaces', value)} onSetAll={setWorkspaceFilterAll} />\n <AssigneePicker users={filterDirectory.users} value={selectedAssignee} onChange={value => { setSelectedAssignee(value); void refresh(value) }} />\n <FilterRow label=\"类型\" options={typeOptions} hidden={blacklist.types} onToggle={value => toggleBlacklist('types', value)} />\n <FilterRow label=\"状态\" options={statusOptions} hidden={blacklist.statuses} onToggle={value => toggleBlacklist('statuses', value)} />\n </div>\n </details>\n <Button\n variant=\"toolbar\"\n size=\"sm\"\n className={css.headerIconButton}\n icon={<IconRefreshOutline16 />}\n title=\"刷新番茄事项\"\n aria-label=\"刷新番茄事项\"\n disabled={board.loading}\n onClick={() => { void refresh(selectedAssignee); setDirectoryVersion(value => value + 1) }}\n />\n </>}\n <Button\n variant=\"toolbar\"\n size=\"sm\"\n className={css.headerIconButton}\n icon={<IconCloseOutline16 />}\n title=\"关闭番茄工作台\"\n aria-label=\"关闭番茄工作台\"\n onClick={() => closeWorkbench(ctx)}\n />\n </div>\n </div>\n <nav className={css.pageTabs} aria-label=\"番茄工作台页面\">\n <button type=\"button\" aria-current={page === 'board' ? 'page' : undefined} onClick={() => setPage('board')}>事项看板</button>\n <button type=\"button\" aria-current={page === 'points' ? 'page' : undefined} onClick={() => setPage('points')}>迭代投入</button>\n </nav>\n </header>\n {page === 'points' ? <StoryPoints toolbarTarget={setStoryToolbar} onOpenItem={openItem} /> : <>\n {board.successMessage && <Toast\n text={board.successMessage}\n anchor={workbenchRef.current}\n holdMs={1500}\n onDone={dismissSuccessMessage}\n />}\n {board.error && <div className={css.error} role=\"alert\">{board.error}</div>}\n {board.truncated && <p className={css.notice} role=\"status\">事项数量已达配置上限,当前仅展示前 {board.items.length} 条。</p>}\n <div className={css.board}>\n {statuses.map(status => {\n const items = filteredItems.filter(item => item.status === status)\n return (\n <section\n ref={element => { if (element) laneElements.current.set(status, element); else laneElements.current.delete(status) }}\n className={`${css.lane} ${draggedLane === status ? css.laneDragging : ''} ${dropLane?.status === status ? (dropLane.after ? css.laneDropAfter : css.laneDropBefore) : ''}`}\n key={status}\n aria-labelledby={`tomato-lane-${status}`}\n onDragOver={event => {\n if (!draggedLane || draggedLane === status) return\n event.preventDefault()\n const bounds = event.currentTarget.getBoundingClientRect()\n setDropLane({ status, after: event.clientX >= bounds.left + bounds.width / 2 })\n }}\n onDrop={event => {\n event.preventDefault()\n if (draggedLane && dropLane?.status === status) moveLane(draggedLane, status, dropLane.after)\n setDraggedLane(null)\n setDropLane(null)\n }}\n >\n <header\n className={css.laneHeader}\n draggable\n title=\"拖拽调整泳道顺序\"\n onDragStart={event => {\n event.dataTransfer.effectAllowed = 'move'\n event.dataTransfer.setData('text/plain', status)\n const lane = event.currentTarget.parentElement\n if (lane) {\n const bounds = lane.getBoundingClientRect()\n event.dataTransfer.setDragImage(\n lane,\n Math.min(Math.max(event.clientX - bounds.left, 0), bounds.width),\n Math.min(Math.max(event.clientY - bounds.top, 0), bounds.height),\n )\n }\n setDraggedLane(status)\n }}\n onDragEnd={() => { setDraggedLane(null); setDropLane(null) }}\n >\n <h2 id={`tomato-lane-${status}`}>{status}</h2>\n <span>{items.length}</span>\n </header>\n <div className={css.cards}>\n {items.map(item => (\n <article\n className={`${css.card} ${mutedItems.has(item.itemKey) ? css.cardMuted : ''}`}\n key={item.itemKey}\n tabIndex={0}\n role=\"button\"\n onClick={() => openItem(item)}\n onKeyDown={event => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n openItem(item)\n }\n }}\n >\n <div className={css.cardTopline}>\n <span className={css.key}>{item.itemKey}</span>\n <div className={css.cardButtons}>\n <Button\n className={css.muteButton}\n variant=\"ghost\"\n size=\"sm\"\n title={mutedItems.has(item.itemKey) ? '取消置灰' : '置灰标记'}\n aria-label={mutedItems.has(item.itemKey) ? `取消置灰 ${item.itemKey}` : `置灰 ${item.itemKey}`}\n aria-pressed={mutedItems.has(item.itemKey)}\n onClick={event => {\n event.stopPropagation()\n toggleMutedItem(item.itemKey)\n }}\n onKeyDown={event => event.stopPropagation()}\n >\n ●\n </Button>\n <Button\n className={css.tomatoLink}\n variant=\"ghost\"\n size=\"sm\"\n title=\"在番茄中打开事项\"\n aria-label={`在番茄中打开 ${item.itemKey}`}\n onClick={event => {\n event.stopPropagation()\n window.open(item.tomatoUrl, '_blank', 'noopener,noreferrer')\n }}\n onKeyDown={event => event.stopPropagation()}\n >\n ↗\n </Button>\n </div>\n </div>\n <strong>{item.title}</strong>\n <div className={css.cardMeta}>\n <Tag tone={typeTone(item.itemType)}>{item.itemType}</Tag>\n {(item.workspaceName || item.workspaceKey) && <Tag title=\"空间\">{item.workspaceName && item.workspaceKey && item.workspaceName !== item.workspaceKey ? `${item.workspaceName} (${item.workspaceKey})` : item.workspaceKey || item.workspaceName}</Tag>}\n {item.priority && <Tag title=\"优先级\">{priorityLabel(item.priority)}</Tag>}\n {item.creator && <Tag title=\"创建人\">创建 {item.creator}</Tag>}\n </div>\n </article>\n ))}\n </div>\n </section>\n )\n })}\n {!board.loading && !board.error && statuses.length === 0 && (\n <div className={css.empty}>当前没有可显示的番茄事项</div>\n )}\n </div>\n </>}\n {board.selectedItem ? <CreateConversationDialog ctx={ctx} item={board.selectedItem} /> : null}\n </section>\n )\n}\n\nconst PRIORITY_LABELS: Record<string, string> = {\n '69e65065-4b34-4109-bca9-0154e548554a': 'P0',\n '8f7912a5-9176-4a79-a269-2269ac42b5a2': 'P1',\n 'ca8c3e43-3e7b-444d-8940-d0967d944921': 'P2',\n 'ec31e4c1-b55b-479d-be97-86d5f7bf38ef': 'P2',\n '1a3e1092-7d70-42ee-ad38-0e8d953c4c23': 'P3',\n 'faae52da-28c8-46fc-96dd-db9cdb28b557': 'P4',\n}\nconst priorityLabel = (value: string) => PRIORITY_LABELS[value] ?? value\n\nconst TYPE_TONES: Record<string, string> = {\n Story: '#2f7d72', EnablerStory: '#2777a8', Task: '#7b61a8', Bug: '#c34f43', 缺陷: '#c34f43', 测试缺陷: '#d06438', Epic: '#9a6b24', Feature: '#3f68ad',\n}\nfunction typeTone(type: string): string {\n if (TYPE_TONES[type]) return TYPE_TONES[type]\n const palette = ['#2f7d72', '#2777a8', '#7b61a8', '#c34f43', '#9a6b24', '#51753a', '#a14f78']\n return palette[[...type].reduce((hash, char) => hash + char.charCodeAt(0), 0) % palette.length]!\n}\n\nfunction FilterRow({ label, options, hidden, onToggle }: {\n label: string\n options: string[]\n hidden: ReadonlySet<string>\n onToggle: (value: string) => void\n}) {\n return (\n <div className={css.filterRow}>\n <span>{label}</span>\n <div>\n {options.map(option => (\n <Tag\n key={option}\n interactive\n pressed={!hidden.has(option)}\n tone={label === '类型' ? typeTone(option) : undefined}\n onClick={() => onToggle(option)}\n >\n {option}\n </Tag>\n ))}\n </div>\n </div>\n )\n}\n\nconst WORKSPACE_SELECT_ALL = 'workspace:select-all'\nconst WORKSPACE_SELECT_NONE = 'workspace:select-none'\n\n/** Multi-select workspace dropdown composed on the shared Menu primitive. */\nfunction WorkspaceFilterRow({ options, hidden, onToggle, onSetAll }: {\n options: Array<{ value: string; label: string }>\n hidden: ReadonlySet<string>\n onToggle: (value: string) => void\n onSetAll: (visible: boolean) => void\n}) {\n const [open, setOpen] = useState(false)\n const rootRef = useRef<HTMLDivElement>(null)\n const visibleValues = options.filter(option => !hidden.has(option.value)).map(option => option.value)\n const summary = options.length === 0\n ? '暂无空间'\n : hidden.size === 0\n ? `全部空间 · ${options.length}`\n : visibleValues.length === 0\n ? '未选择空间'\n : `已选空间 ${visibleValues.length} / ${options.length}`\n // First Esc closes this dropdown only; the host filter popover stays open.\n useEffect(() => {\n if (!open) return\n const onKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') { event.stopPropagation(); setOpen(false) }\n }\n const root = rootRef.current\n root?.addEventListener('keydown', onKey, true)\n return () => root?.removeEventListener('keydown', onKey, true)\n }, [open])\n const items: MenuEntry[] = options.map(option => ({ id: option.value, label: option.label }))\n const footer: MenuEntry[] = [\n { id: WORKSPACE_SELECT_ALL, label: '全部显示' },\n { id: WORKSPACE_SELECT_NONE, label: '全部隐藏' },\n ]\n return (\n <div className={css.filterRow} ref={rootRef}>\n <span>空间</span>\n <div className={css.workspaceSelect}>\n <Menu\n open={open}\n items={items}\n footer={footer}\n selectedIds={visibleValues}\n onSelect={(id) => {\n if (id === WORKSPACE_SELECT_ALL) onSetAll(true)\n else if (id === WORKSPACE_SELECT_NONE) onSetAll(false)\n else onToggle(id)\n }}\n onClose={() => { setOpen(false) }}\n anchor={\n <button\n type=\"button\"\n className={css.workspaceTrigger}\n aria-expanded={open}\n title={summary}\n onClick={() => { setOpen(!open) }}\n >\n <span>{summary}</span>\n <i className={css.workspaceChevron} aria-hidden><IconChevronDownOutline14 /></i>\n </button>\n }\n />\n </div>\n </div>\n )\n}\n\nfunction AssigneePicker({ users, value, onChange }: {\n users: FilterDirectory['users']\n value: string\n onChange: (value: string) => void\n}) {\n const rootRef = useRef<HTMLDivElement>(null)\n const [open, setOpen] = useState(false)\n const [query, setQuery] = useState('')\n const options = useMemo(() => [{ username: 'currentUser()', name: '我负责的' }, ...users.filter(user => user.username !== 'currentUser()')], [users])\n const selected = options.find(option => option.username === value) ?? options[0]\n const needle = query.trim().toLowerCase()\n const filtered = needle\n ? options.filter(option => `${option.name} ${option.username}`.toLowerCase().includes(needle))\n : options\n\n useEffect(() => {\n if (!open) return\n const close = (event: PointerEvent) => {\n if (event.target instanceof Node && !rootRef.current?.contains(event.target)) setOpen(false)\n }\n document.addEventListener('pointerdown', close, true)\n return () => document.removeEventListener('pointerdown', close, true)\n }, [open])\n\n return (\n <div className={css.assigneeFilter}>\n <span>负责人</span>\n <div ref={rootRef} className={css.assigneePicker}>\n <Button variant=\"outline\" size=\"sm\" className={css.assigneeTrigger} aria-haspopup=\"listbox\" aria-expanded={open} onClick={() => { setOpen(current => !current); setQuery('') }}>\n <span>{selected?.name ?? value}</span><IconChevronDownOutline14 />\n </Button>\n {open ? (\n <div className={css.assigneeDropdown}>\n <input autoFocus type=\"search\" value={query} onChange={event => setQuery(event.target.value)} placeholder=\"搜索昵称或用户名…\" aria-label=\"搜索负责人\" />\n <div role=\"listbox\" aria-label=\"负责人\">\n {filtered.map(option => (\n <button key={option.username} type=\"button\" role=\"option\" aria-selected={option.username === value} onClick={() => { onChange(option.username); setOpen(false); setQuery('') }}>\n <strong>{option.name}</strong>{option.name !== option.username && option.username !== 'currentUser()' ? <small>{option.username}</small> : null}\n </button>\n ))}\n {filtered.length === 0 ? <p>没有匹配的负责人</p> : null}\n </div>\n </div>\n ) : null}\n </div>\n </div>\n )\n}\n\nfunction TomatoConversationShortcut({ ctx, sessionId, useSessions }: PropsRuntime<'conversation.session.header.actions'> & { ctx: Context }) {\n const itemKey = useSessions(state => {\n const summary = state.byId[sessionId]\n const title = summary?.title ?? summary?.displayTitle ?? ''\n const match = TOMATO_ITEM_KEY_PATTERN.exec(title)?.[1]?.trim()\n if (!match) return ''\n // 仅当该对话确实由番茄工作台创建并记录在本机映射中时,才认定它是番茄事项对话。\n // 这样即便普通新建对话的标题恰好命中 itemKey 格式,也不会被误带上状态流转 UI。\n return linkedSessionId(match) === sessionId ? match : ''\n })\n const [menuOpen, setMenuOpen] = useState(false)\n const [loading, setLoading] = useState(false)\n const [transitioning, setTransitioning] = useState(false)\n const [transitionState, setTransitionState] = useState<TomatoTransitionState>({\n currentStatus: '',\n tomatoUrl: '',\n transitions: [],\n })\n const [transitionError, setTransitionError] = useState<string | null>(null)\n\n useEffect(() => {\n if (!itemKey) return\n const controller = new AbortController()\n setLoading(true)\n setTransitionError(null)\n setTransitionState({ currentStatus: '', tomatoUrl: '', transitions: [] })\n void fetch(`/api/tomato-board/transitions/${encodeURIComponent(itemKey)}`, {\n headers: { accept: 'application/json' },\n signal: controller.signal,\n }).then(async response => {\n const body = await response.json() as TomatoTransitionState & { error?: string }\n if (!response.ok) throw new Error(body.error || `请求失败 (${response.status})`)\n setTransitionState({\n currentStatus: body.currentStatus || '',\n tomatoUrl: body.tomatoUrl || '',\n transitions: body.transitions ?? [],\n })\n }).catch(error => {\n if (error instanceof Error && error.name === 'AbortError') return\n setTransitionError(error instanceof Error ? error.message : '番茄流转状态读取失败')\n }).finally(() => {\n if (!controller.signal.aborted) setLoading(false)\n })\n return () => controller.abort()\n }, [itemKey])\n\n if (!itemKey) return null\n\n async function transitionTo(transitionName: string) {\n if (transitioning) return\n setMenuOpen(false)\n setTransitioning(true)\n setTransitionError(null)\n try {\n const query = new URLSearchParams({ transition: transitionName })\n const response = await fetch(`/api/tomato-board/transition/${encodeURIComponent(itemKey)}?${query}`, {\n method: 'POST',\n headers: { accept: 'application/json' },\n })\n const body = await response.json() as {\n currentStatus?: string\n error?: string\n details?: { stderr?: string; stdout?: string }\n }\n if (!response.ok) {\n const selected = transitionState.transitions.find(transition => transition.transition === transitionName)\n const failure = [body.error, body.details?.stderr, body.details?.stdout].filter(Boolean).join('\\n')\n const requiredFieldsMissing = /字段.{0,24}必填|必填.{0,24}字段|流转前需填写/u.test(failure)\n if (selected?.targetStatus === '待测试' && requiredFieldsMissing) {\n const session = ctx.sessions.binding(sessionId)?.session\n if (!session) throw new Error('当前 Harness 对话未加载,无法交给 AI 继续处理')\n const prompt = [\n `番茄事项 ${itemKey} 流转到「待测试」失败,CLI 提示存在必填字段缺失。`,\n '请先读取番茄事项详情,并结合当前对话和仓库代码进行分析。',\n '基于证据补齐并回读确认以下字段:根因分析、RD引入原因分析、原因描述、修复版本、解决方案。',\n '不要编造业务事实;证据不足时先向我确认。',\n '只有这些字段已经持久化且回读一致后,才能重新执行「修复完成」流转到「待测试」,最后再次回读状态验证。',\n `CLI 失败信息:${failure || '未返回具体原因'}`,\n ].join('\\n')\n const prompted = await session.prompt([{ type: 'text', text: prompt }], 'queue')\n if (!prompted.ok) throw new Error(`无法把流转任务交给 AI:${prompted.error.message}`)\n setTransitionError('必填字段缺失,已交给当前对话中的 AI 分析并继续处理')\n return\n }\n throw new Error(failure || `请求失败 (${response.status})`)\n }\n const transitionsResponse = await fetch(`/api/tomato-board/transitions/${encodeURIComponent(itemKey)}`, {\n headers: { accept: 'application/json' },\n })\n const transitionsBody = await transitionsResponse.json() as TomatoTransitionState & { error?: string }\n if (!transitionsResponse.ok) {\n throw new Error(transitionsBody.error || `状态刷新失败 (${transitionsResponse.status})`)\n }\n setTransitionState({\n currentStatus: transitionsBody.currentStatus || body.currentStatus || '',\n tomatoUrl: transitionsBody.tomatoUrl || '',\n transitions: transitionsBody.transitions ?? [],\n })\n } catch (error) {\n setTransitionError(error instanceof Error ? error.message : '番茄事项流转失败')\n } finally {\n setTransitioning(false)\n }\n }\n\n const availableTransitions = transitionState.transitions.filter(transition => !transition.disabled)\n const delegatedToAgent = transitionError?.startsWith('必填字段缺失') === true\n const transitionTitle = transitionError\n ? delegatedToAgent ? transitionError : `番茄流转失败:${transitionError}`\n : loading\n ? '正在查询番茄事项状态'\n : availableTransitions.length === 0\n ? `当前状态「${transitionState.currentStatus || '未知'}」没有可用流转`\n : `当前状态:${transitionState.currentStatus || '未知'}`\n return (\n <>\n <Menu\n open={menuOpen}\n portal\n align=\"end\"\n items={transitionState.transitions.map(transition => ({\n id: transition.transition,\n label: `流转到 ${transition.targetStatus}`,\n disabled: transition.disabled,\n }))}\n onSelect={transitionName => void transitionTo(transitionName)}\n onClose={() => setMenuOpen(false)}\n anchor={(\n <Button\n variant=\"toolbar\"\n size=\"sm\"\n className={css.transitionTrigger}\n title={transitionTitle}\n aria-label={transitionTitle}\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n disabled={loading || transitioning || availableTransitions.length === 0}\n onClick={() => setMenuOpen(open => !open)}\n >\n {transitioning || delegatedToAgent || transitionError\n ? transitioning ? '正在流转…' : delegatedToAgent ? 'AI 已接手' : '流转失败'\n : (\n <>\n <span className={css.transitionCaption}>状态</span>\n <strong>{transitionState.currentStatus || '查询中…'}</strong>\n {availableTransitions.length > 0 ? (\n <>\n <span className={css.transitionDivider} aria-hidden=\"true\" />\n <span className={css.transitionAction}>流转</span>\n <IconChevronDownOutline14 className={css.transitionChevron} />\n </>\n ) : null}\n </>\n )}\n </Button>\n )}\n />\n <Button\n variant=\"toolbar\"\n size=\"sm\"\n title=\"在番茄中打开事项\"\n aria-label={`在番茄中打开 ${itemKey}`}\n disabled={!transitionState.tomatoUrl}\n onClick={() => window.open(transitionState.tomatoUrl, '_blank', 'noopener,noreferrer')}\n >\n 番茄 ↗\n </Button>\n </>\n )\n}\n\nexport const inject = ['slots', 'layout', 'sessions', 'workspaces']\n\nexport function apply(ctx: Context): void {\n ctx.slots.inject('main', () => ctx.slots.register(\n { name: 'main', key: 'tomato-board', id: 'tomato-board-panel' },\n () => <TomatoBoardPanel ctx={ctx} />,\n ))\n const openWorkbench = () => {\n emit({ open: true, loaded: false, error: null })\n ctx.layout.selectPanel('tomato-board')\n }\n ctx.slots.inject('conversation.session.header.actions', () => ctx.slots.register(\n { name: 'conversation.session.header.actions', id: 'tomato-shortcut', order: 12 },\n props => <TomatoConversationShortcut {...props} ctx={ctx} />,\n ))\n ctx.slots.inject('sidebar.footer.action', () => ctx.slots.register(\n { name: 'sidebar.footer.action', id: 'tomato-board' },\n props => <TomatoBoardAction {...props} openWorkbench={openWorkbench} />,\n ))\n // The shell's session header is the visible top bar in the Web client. Keep the\n // sidebar shortcut as a compact fallback for narrow or collapsed layouts.\n ctx.slots.inject('conversation.session.header.actions', () => ctx.slots.register(\n { name: 'conversation.session.header.actions', id: 'tomato-board-topbar', order: 11 },\n () => <TomatoBoardTopbarAction openWorkbench={openWorkbench} />,\n ))\n}\n"],"mappings":";;;;;;;;;;;;;;;EA4BA,SAAgB,UAAU,IAAuB;GAC/C,OAAO;EACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECRA,SAAgB,IAAI,EAAE,UAAU,MAAM,cAAc,OAAO,SAAS,OAAO,WAAW,WAAqB;GACzG,MAAM,QAAQ,SAAS,KAAA,IAAY,KAAA,IAAY,EAAE,cAAc,KAAK;GACpE,MAAM,UAAU;IACdA,uBAAI;IACJ,SAAS,KAAA,IAAY,KAAKA,uBAAI;IAC9B,cAAcA,uBAAI,SAAS;IAC3B,eAAe,YAAY,QAAQA,uBAAI,MAAM;IAC7C;GACF,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;GAC1B,IAAI,aACF,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;IAAQ,MAAK;IAAS,WAAW;IAAgB;IAAc;IAAO,gBAAc;IAAkB;IACnG;GACK,CAAA;GAGZ,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;IAAM,WAAW;IAAgB;IAAc;IAAQ;GAAe,CAAA;EAC/E;;;EC3BA,MAAM,kBAAkB;EACxB,MAAM,YAAY;EAClB,MAAM,aAAa;EACnB,MAAM,YAAY;EAClB,MAAM,SAAS;GAAC;GAAW;GAAW;GAAW;GAAW;GAAW;GAAW;GAAW;EAAS;EACtG,MAAM,UAAU,UAAkB,IAAI,KAAK,aAAa,SAAS,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK;EAC3G,MAAM,SAAS,UAAkB,MAAM,QAAQ,KAAK,SAAS,OAAO,KAAK,eAAe,IAAI,CAAC;EAC7F,MAAM,cAAc,KAAa,aAAqB;GAAE,IAAI;IAAE,OAAO,aAAa,QAAQ,GAAG,KAAK;GAAS,QAAQ;IAAE,OAAO;GAAS;EAAE;EACvI,MAAM,eAAe,QAAQ,KAAK,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;EAC7F,eAAe,KAAQ,KAAa,QAAkC;GACpE,MAAM,WAAW,MAAM,MAAM,KAAK;IAAE,QAAQ,UAAU;IAAM,OAAO;IAAY,SAAS;KAAE,QAAQ;KAAoB,iBAAiB;IAAW;GAAE,CAAC;GAAG,MAAM,OAAO,MAAM,SAAS,KAAK;GAAG,IAAI;GAChM,IAAI;IAAE,OAAO,OAAO,KAAK,MAAM,IAAI,IAA+B,CAAC;GAAE,QAAQ;IAAE,MAAM,IAAI,MAAM,SAAS,WAAW,OAAO,KAAK,KAAK,MAAM,cAAc,kCAAkC,iBAAiB,SAAS,OAAO,EAAE;GAAE;GAC/N,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,SAAS,SAAS,OAAO,EAAE;GAAG,OAAO;EACvH;EACA,SAAS,YAAoB;GAC3B,IAAI;IACF,MAAM,QAAiB,KAAK,MAAM,aAAa,QAAQ,SAAS,KAAK,IAAI;IACzE,IAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,QAAQ,OAAO,MAAM,SAAQ,UAAS,SAAS,OAAO,UAAU,WAAW,CAAC;KAAE,IAAI,OAAQ,MAAe,EAAE;KAAG,MAAM,OAAQ,MAAe,IAAI;KAAG,SAAS,MAAM,QAAS,MAAe,OAAO,IAAI,CAAC,GAAG,IAAI,IAAK,MAAe,OAAO,CAAC,IAAI,CAAC;IAAE,CAAC,IAAI,CAAC,CAAC;IACxR,MAAM,SAAkB,KAAK,MAAM,aAAa,QAAQ,eAAe,KAAK,IAAI;IAChF,OAAO,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,CAAC;KAAE,IAAI;KAAgB,MAAM;KAAQ,SAAS,OAAO,QAAQ,UAA2B,OAAO,UAAU,QAAQ;IAAE,CAAC,IAAI,CAAC;GAC3K,QAAQ;IAAE,OAAO,CAAC;GAAE;EACtB;EAEA,SAAgB,YAAY,EAAE,eAAe,cAA8G;GACzJ,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,SAAA,CAAiC,CAAC,CAAC;GAAG,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAA6B,CAAC,CAAC;GACnG,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,SAAA,OAA4B,WAAW,YAAY,EAAE,CAAC;GAAG,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,OAA2B,WAAW,WAAW,eAAe,CAAC;GACvJ,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAAqB,SAAS;GAAG,MAAM,CAAC,YAAY,kBAAA,GAAA,MAAA,SAAA,OAAgC,UAAU,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE;GAC1H,MAAM,CAAC,WAAW,iBAAA,GAAA,MAAA,SAAA,CAAyB,EAAE;GAAG,MAAM,CAAC,YAAY,kBAAA,GAAA,MAAA,SAAA,CAA6E,IAAI;GACpJ,MAAM,CAAC,cAAc,oBAAA,GAAA,MAAA,SAAA,CAA4B,EAAE;GAAG,MAAM,gBAAA,GAAA,MAAA,OAAA,CAAsC,IAAI;GAAG,MAAM,qBAAA,GAAA,MAAA,OAAA,CAA6C,IAAI;GAAG,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,SAAA,CAAsB,EAAE;GAC1M,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,SAAA,CAA+C,CAAC,CAAC;GAAG,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,SAAA,CAA8C,CAAC,CAAC;GAAG,MAAM,CAAC,gBAAgB,sBAAA,GAAA,MAAA,SAAA,CAA8B,EAAE;GAAG,MAAM,CAAC,kBAAkB,wBAAA,GAAA,MAAA,SAAA,CAAgC,IAAI;GAAG,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,SAAA,CAAuB,CAAC;GAAG,MAAM,CAAC,kBAAkB,wBAAA,GAAA,MAAA,SAAA,CAAgC,CAAC;GACrW,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,MAAM,aAAa,IAAI,gBAAgB;IAAG,oBAAoB,IAAI;IAAG,kBAAkB,EAAE;IACzF,QAAa,IAAI,CAAC,KAA4B,6BAA6B,WAAW,MAAM,GAAG,KAAwB,6BAA6B,WAAW,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,eAAe;KAAE,MAAM,SAAS,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,MAAM,GAAG,OAAO,EAAE,aAAa,GAAA,CAAI,cAAc,EAAE,aAAa,EAAE,CAAC;KAAG,WAAW,MAAM;KAAG,SAAS,UAAU,KAAK;KAAG,WAAU,YAAW,OAAO,MAAK,UAAS,MAAM,aAAa,OAAO,IAAI,UAAU,OAAO,EAAE,EAAE,YAAY,EAAE;IAAE,CAAC,CAAC,CAAC,OAAM,UAAS;KAAE,IAAI,CAAC,WAAW,OAAO,SAAS,kBAAkB,MAAM,OAAO;IAAE,CAAC,CAAC,CAAC,cAAc;KAAE,IAAI,CAAC,WAAW,OAAO,SAAS,oBAAoB,KAAK;IAAE,CAAC;IAAG,aAAa,WAAW,MAAM;GACjpB,GAAG,CAAC,gBAAgB,CAAC;GACrB,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,IAAI;KAAE,aAAa,QAAQ,WAAW,KAAK,UAAU,KAAK,CAAC;IAAE,QAAQ,CAAC;GAAE,GAAG,CAAC,KAAK,CAAC;GAAG,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,IAAI,QAAQ,IAAI;KAAE,aAAa,QAAQ,YAAY,MAAM;IAAE,QAAQ,CAAC;GAAE,GAAG,CAAC,MAAM,CAAC;GAAG,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,IAAI;KAAE,aAAa,QAAQ,WAAW,KAAK;IAAE,QAAQ,CAAC;GAAE,GAAG,CAAC,KAAK,CAAC;GACpO,MAAM,cAAlD,MAAM,MAAK,SAAQ,KAAK,OAAO,UAAwC,CAAC,EAAE,WAAW,CAAC;GAAG,MAAM,YAAY,KAAK,UAAU,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;GACvL,MAAM,eAAA,GAAA,MAAA,OAAA,CAAqB,EAAE;GAC7B,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,oBAAoB,CAAC,QAAQ;IACjC,MAAM,QAAQ,KAAK,UAAU,CAAC,QAAQ,OAAO,CAAC;IAC9C,MAAM,YAAY,YAAY,YAAY;IAC1C,IAAI,CAAC,WAAW;KACd,YAAY,UAAU;KACtB,WAAW,CAAC,CAAC;KACb,UAAU,CAAC,CAAC;IACd;IACA,MAAM,aAAa,IAAI,gBAAgB;IAAG,MAAM,SAAU,KAAK,MAAM,SAAS,CAAC,CAAc,QAAO,aAAY,CAAC,aAAc,CAAC,QAAQ,aAAa,CAAC,OAAO,SAAU;IACvK,MAAM,SAAS,YAAY;KAAE,OAAO,OAAO,UAAU,CAAC,WAAW,OAAO,SAAS;MAAE,MAAM,WAAW,OAAO,MAAM;MAAI,IAAI;OAAE,MAAM,OAAO,MAAM,KAAa,kCAAkC,IAAI,gBAAgB;QAAE;QAAQ,UAAU;QAAU,SAAS,OAAO,OAAO;OAAE,CAAC,KAAK,WAAW,MAAM;OAAG,IAAI,CAAC,WAAW,OAAO,SAAS,YAAW,aAAY;QAAE,GAAG;SAAU,WAAW;OAAK,EAAE;MAAE,SAAS,OAAO;OAAE,IAAI,CAAC,WAAW,OAAO,SAAS,WAAU,aAAY;QAAE,GAAG;SAAU,WAAW,iBAAiB,QAAQ,MAAM,UAAU;OAAO,EAAE;MAAE;KAAE;IAAE;IAAG,QAAa,IAAI;KAAC,OAAO;KAAG,OAAO;KAAG,OAAO;IAAC,CAAC;IAAG,aAAa,WAAW,MAAM;GAC3mB,GAAG;IAAC;IAAkB;IAAQ;IAAW;GAAO,CAAC;GACjD,MAAM,WAAW,QAAQ;GAAQ,MAAM,SAAA,GAAA,MAAA,QAAA,OAAsB,CAAC,GAAI,UAAU,SAAS,CAAC,CAAE,CAAC,CAAC,MAAM,GAAG,OAAO,EAAE,eAAe,OAAO,EAAE,eAAe,OAAO,EAAE,QAAQ,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;GAAG,MAAM,MAAM,MAAM,KAAK;GAAG,MAAM,SAAS,MAAM,QAAO,SAAQ,KAAK,gBAAgB,QAAQ,KAAK,cAAc,CAAC;GAAG,IAAI,SAAS;GAC3U,MAAM,WAAW,OAAO,KAAK,MAAM,UAAU;IAAE,MAAM,QAAQ;IAAQ,UAAU,KAAK,cAAe,MAAM;IAAK,OAAO,GAAG,OAAO,QAAQ,OAAO,QAAQ,GAAG,MAAM,IAAI,OAAO;GAAG,CAAC,CAAC,CAAC,KAAK,IAAI;GAAG,MAAM,YAAY,aAAqB,aAAa,kBAAkB,MAAM,MAAM,MAAK,SAAQ,KAAK,aAAa,QAAQ,CAAC,EAAE,QAAQ;GAChU,MAAM,cAAc,OAAe;IAAE,eAAc,YAAW,YAAY,KAAK,KAAK,EAAE;IAAG,gBAAgB,EAAE;IAAG,cAAc,IAAI;GAAE;GAClI,MAAM,UAAU,YAAY,KAAI,cAAa;IAAE;IAAU,QAAQ,QAAQ;IAAW,QAAQ,MAAM,QAAQ,SAAS,EAAE,SAAS,CAAC,CAAC;GAAE,EAAE,CAAC,CAAC,MAAM,GAAG,MAAM,OAAO,QAAQ,EAAE,MAAM,CAAC,IAAI,OAAO,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,cAAc,EAAE,QAAQ,CAAC;GAAG,MAAM,MAAM,KAAK,IAAI,GAAG,GAAG,QAAQ,KAAI,QAAO,IAAI,MAAM,CAAC;GAAG,MAAM,YAAY,MAAM,QAAO,SAAQ,CAAC,YAAY,SAAS,KAAK,QAAQ,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,WAAW,YAAY,CAAC,CAAC,SAAS,OAAO,YAAY,CAAC,CAAC;GACne,MAAM,mBAAmB;IAAE,MAAM,OAAO,UAAU,KAAK;IAAG,IAAI,CAAC,QAAQ,CAAC,YAAY;IAAQ,IAAI,WAAW,SAAS,UAAU;KAAE,MAAM,OAAO;MAAE,IAAI,OAAO;MAAG;MAAM,SAAS,CAAC;KAAE;KAAG,UAAS,YAAW,CAAC,GAAG,SAAS,IAAI,CAAC;KAAG,cAAc,KAAK,EAAE;IAAE,OAAO,UAAS,YAAW,QAAQ,KAAI,SAAQ,KAAK,OAAO,WAAW,KAAK;KAAE,GAAG;KAAM;IAAK,IAAI,IAAI,CAAC;IAAG,aAAa,EAAE;IAAG,cAAc,IAAI;GAAE;GAC/X,MAAM,cAAc,OAAe;IAAE,UAAS,YAAW,QAAQ,QAAO,SAAQ,KAAK,OAAO,EAAE,CAAC;IAAG,IAAI,eAAe,IAAI,cAAc,EAAE;GAAE;GAC3I,MAAM,iBAAiB,IAAY,YAA4C,UAAS,YAAW,QAAQ,KAAI,SAAQ,KAAK,OAAO,KAAK;IAAE,GAAG;IAAM,SAAS,QAAQ,KAAK,OAAO;GAAE,IAAI,IAAI,CAAC;GAC3L,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,IAAI,CAAC,cAAc;IAAQ,MAAM,SAAS,UAAwB;KAAE,IAAI,MAAM,kBAAkB,QAAQ,CAAC,aAAa,SAAS,SAAS,MAAM,MAAM,GAAG;MAAE,gBAAgB,EAAE;MAAG,UAAU,EAAE;KAAE;IAAE;IAAG,SAAS,iBAAiB,eAAe,OAAO,IAAI;IAAG,4BAA4B,kBAAkB,SAAS,MAAM,CAAC;IAAG,aAAa,SAAS,oBAAoB,eAAe,OAAO,IAAI;GAAE,GAAG,CAAC,YAAY,CAAC;GACla,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,cAAc,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAWC,gCAAI;eAApB,CAAoC,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAM,KAAQ,CAAA,GAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;MAAQ,cAAW;MAAO,OAAO;MAAQ,UAAU;MAAkB,WAAU,UAAS;OAAE,UAAU,MAAM,OAAO,KAAK;OAAG,WAAW,CAAC,CAAC;OAAG,UAAU,CAAC,CAAC;MAAE;gBAAvJ,CAA2J,CAAC,QAAQ,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,OAAM;iBAAI,mBAAmB,YAAY;MAAe,CAAA,GAAG,QAAQ,KAAI,UAAS,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;OAA6B,OAAO,MAAM;iBAA1C;QAAqD,MAAM;QAAK;QAAI,MAAM;QAAc,MAAM,WAAW,cAAc,UAAU;OAAW;SAA/H,MAAM,QAAyH,CAAC,CAAU;OAAQ,EAAA,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,QAAD;MAAQ,SAAQ;MAAU,MAAK;MAAK,WAAWD,gCAAI;MAAkB,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAACE,sCAAAA,sBAAD,CAAuB,CAAA;MAAG,OAAM;MAAK,cAAW;MAAU,eAAe;OAAE,WAAW,CAAC,CAAC;OAAG,UAAU,CAAC,CAAC;OAAG,YAAW,UAAS,QAAQ,CAAC;OAAG,IAAI,kBAAkB,CAAC,QAAQ,QAAQ,qBAAoB,UAAS,QAAQ,CAAC;MAAE;KAAI,CAAA,CAAM;MAAC;IAAG,aAAa,cAAc,IAAI;GAAE,GAAG;IAAC;IAAgB;IAAkB;IAAQ;IAAS;GAAa,CAAC;GACx5B,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWF,gCAAI;cAApB,CAA2B,kBAAkB,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;KAAG,WAAWA,gCAAI;eAAlB,CAA0B,gBAAe,WAAY;QAAE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAWA,gCAAI;eAApB,CACzG,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;MAAS,WAAWA,gCAAI;MAAO,cAAW;gBAA1C,CAAkD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWA,gCAAI;iBAApB,CAAiC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAI,OAAQ,CAAA,GAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;QAAQ,cAAW;QAAU,OAAO;QAAO,WAAU,UAAS,SAAS,MAAM,OAAO,KAAK;kBAAzF,CAA4F,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,OAAM;mBAAgB;QAAY,CAAA,GAAE,MAAM,KAAI,SAAQ,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;SAA4B,OAAO,KAAK;mBAAxC;UAAmD,KAAK;UAAK;UAAI,KAAK;SAAiB;WAA1E,KAAK,QAAqE,CAAC,CAAU;SAAM;UAAE,OAAO,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAWA,gCAAI;iBAAQ,OAAO;MAAU,CAAA,IAAI,CAAC,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAWA,gCAAI;iBAAQ,SAAS,eAAe;MAAW,CAAA,IAAI,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;OAAE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,gCAAI;kBAApB,CAA6B,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAWA,gCAAI;mBAAS;QAAW,CAAA,GAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAWA,gCAAI;mBAApB,CAA4B,OAAO,GAAG,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAO,MAAU,CAAA,CAAM;UAAM,EAAA,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SAAK,WAAWA,gCAAI;SAAK,OAAO,EAAE,YAAY,WAAW,kBAAkB,SAAS,KAAK,KAAA,EAAU;mBAAG,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,OAAO,OAAe,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAM,MAAS,CAAA,CAAM,EAAA,CAAA;QAAM,CAAA,CAAM;;OAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,gCAAI;kBAApB,CAAiC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAI,OAAQ,CAAA,GAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA,CAAO,MAAM,QAAO,IAAQ,EAAA,CAAA,CAAM;;OAAE,CAAC,MAAM,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAWA,gCAAI;kBAAO;OAAgB,CAAA;OAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD,EAAA,UAAM,MAAM,KAAI,SAAQ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,gCAAI;QAAyB,MAAK;QAAS,UAAU;QAAG,cAAY,MAAM,KAAK,QAAQ;QAAO,eAAe,WAAW,IAAI;QAAG,YAAW,UAAS;SAAE,IAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;UAAE,MAAM,eAAe;UAAG,WAAW,IAAI;SAAE;QAAE;kBAAlQ;SAAqQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAWA,gCAAI;UAAK,OAAO,EAAE,YAAY,KAAK,eAAe,KAAK,cAAc,IAAI,OAAO,OAAO,QAAQ,IAAI,IAAI,OAAO,UAAU,mCAAmC;SAAI,CAAA;SAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAWA,gCAAI;oBAApB;WAA8B,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;YAAM,WAAWA,gCAAI;sBAAY,KAAK;WAAY,CAAA;WAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,KAAK,QAAe,CAAA;WAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAM,KAAK,OAAY,CAAA;UAAM;;SAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,WAAWA,gCAAI;oBAAa,KAAK,gBAAgB,OAAO,QAAQ,GAAG,OAAO,KAAK,WAAW,EAAE;SAAa,CAAA;SAAC,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,QAAD;UAAQ,WAAWD,gCAAI;UAAY,SAAQ;UAAQ,MAAK;UAAK,OAAM;UAAW,cAAY,UAAU,KAAK;UAAW,UAAS,UAAS;WAAE,MAAM,gBAAgB;WAAG,OAAO,KAAK,KAAK,WAAW,UAAU,qBAAqB;UAAE;UAAG,YAAW,UAAS,MAAM,gBAAgB;oBAAG;SAAS,CAAA;QAAM;UAAl7B,KAAK,OAA66B,CAAC,EAAO,CAAA;MAAG,EAAA,CAAA,CAAW;SAC97D,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;MAAS,WAAWA,gCAAI;MAAO,cAAW;gBAA1C;OAAkD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,gCAAI;kBAApB,CAAiC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAI,OAAQ,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,WAAWA,gCAAI;SAAe,cAAW;SAAO,OAAM;SAAO,eAAe;UAAE,cAAc,EAAE,MAAM,SAAS,CAAC;UAAG,aAAa,EAAE;SAAE;mBAAG;QAAc,CAAA,CAAM;;OAAE,YAAY,SAAS,YAAY,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;QAAM,WAAWA,gCAAI;QAAY,WAAU,UAAS;SAAE,MAAM,eAAe;SAAG,WAAW;QAAE;kBAA3F;SAA8F,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UAAO,WAAA;UAAU,aAAY;UAAO,OAAO;UAAW,WAAU,UAAS,aAAa,MAAM,OAAO,KAAK;SAAI,CAAA;SAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,eAAe,cAAc,IAAI;oBAAG;SAAU,CAAA;SAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;oBAAS;SAAU,CAAA;QAAO;;OAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAWA,gCAAI;kBAAiB,MAAM,KAAI,SAAQ;SAAE,MAAM,OAAO,eAAe,KAAK;SAAI,MAAM,OAAO,OAAO,UAAU,CAAC;SAAG,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;UAAS,WAAWA,gCAAI;oBAAxB;WAAqD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;YAAK,WAAWA,gCAAI;sBAApB;aAAyC,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;cAAQ,WAAWA,gCAAI;cAAY,iBAAe;cAAM,eAAe,WAAW,KAAK,EAAE;wBAAzF;eAA4F,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;gBAAM,WAAWA,gCAAI;0BAAS;eAAO,CAAA;eAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,KAAK,KAAa,CAAA;eAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQ,KAAK,QAAQ,QAAO,IAAS,EAAA,CAAA;cAAS;;aAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;cAAQ,WAAWA,gCAAI;cAAY,cAAY,MAAM,KAAK;cAAQ,OAAM;cAAK,eAAe;eAAE,cAAc;gBAAE,MAAM;gBAAU,IAAI,KAAK;eAAG,CAAC;eAAG,aAAa,KAAK,IAAI;eAAG,cAAc,KAAK,EAAE;cAAE;wBAAG;aAAS,CAAA;aAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;cAAK,WAAWA,gCAAI;wBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;eAAQ,cAAY,MAAM,KAAK;eAAQ,OAAM;eAAK,eAAe,WAAW,KAAK,EAAE;yBAAG;cAAS,CAAA;aAAM,CAAA;YAAM;;WAAE,YAAY,SAAS,YAAY,WAAW,OAAO,KAAK,MAAM,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;YAAM,WAAWA,gCAAI;YAAY,WAAU,UAAS;aAAE,MAAM,eAAe;aAAG,WAAW;YAAE;sBAA3F;aAA8F,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;cAAO,WAAA;cAAU,OAAO;cAAW,WAAU,UAAS,aAAa,MAAM,OAAO,KAAK;aAAI,CAAA;aAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;cAAQ,MAAK;cAAS,eAAe,cAAc,IAAI;wBAAG;aAAU,CAAA;aAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;cAAQ,MAAK;wBAAS;aAAU,CAAA;YAAO;;WAAG,QAAQ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;YAAK,WAAWA,gCAAI;sBAApB;aAA8B,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;cAAK,WAAWA,gCAAI;wBAApB,CAAqC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,KAAK,QAAQ,SAAS,UAAU,OAAa,CAAA,GAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;eAAK,KAAK,iBAAiB,KAAK,KAAK,eAAe,KAAA;eAAW,WAAWA,gCAAI;yBAA9E,CAA6F,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;gBAAQ,WAAWA,gCAAI;gBAAgB,eAAe,iBAAgB,YAAW,YAAY,KAAK,KAAK,KAAK,KAAK,EAAE;0BAAG;eAAc,CAAA,GAAE,iBAAiB,KAAK,MAAM,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;gBAAK,WAAWA,gCAAI;gBAAW,MAAK;0BAApC;iBAA6C,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;kBAAK,WAAWA,gCAAI;4BAApB,CAAoC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAQ,OAAY,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;mBAAQ,eAAe,gBAAgB,EAAE;6BAAG;kBAAS,CAAA,CAAM;;iBAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;kBAAO,KAAK;kBAAmB,OAAO;kBAAQ,WAAU,UAAS,UAAU,MAAM,OAAO,KAAK;kBAAG,aAAY;iBAAa,CAAA;iBAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CAAM,UAAU,KAAI,SAAQ,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;kBAA4B,eAAe;mBAAE,cAAc,KAAK,KAAI,YAAW,CAAC,GAAG,SAAS,KAAK,QAAQ,CAAC;mBAAG,gBAAgB,EAAE;mBAAG,UAAU,EAAE;kBAAE;4BAAhJ;mBAAoJ,KAAK;mBAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,KAAK,SAAgB,CAAA;mBAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAM,IAAO,CAAA;kBAAS;oBAArM,KAAK,QAAgM,CAAC,GAAG,CAAC,UAAU,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAG,WAAW,CAAA,CAAO,EAAA,CAAA;gBAAM;iBAAO;gBAAM;;aAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;cAAK,WAAWA,gCAAI;wBAAU,KAAK,KAAK,KAAK,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;eAAwB,WAAWA,gCAAI;yBAAS,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;gBAAK,WAAWA,gCAAI;0BAApB,CAA+B,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;iBAAQ,WAAWA,gCAAI;iBAAW,gBAAc,UAAU,IAAI;iBAAU,eAAe,SAAS,IAAI,QAAQ;2BAA5G;kBAA+G,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;mBAAG,WAAWA,gCAAI;mBAAU,OAAO,EAAE,OAAO,GAAG,IAAI,SAAS,MAAM,IAAI,GAAG;kBAAI,CAAA;kBAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;mBAAM,WAAWA,gCAAI;6BAAY,OAAO,QAAQ,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG;kBAAQ,CAAA;kBAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;mBAAM,WAAWA,gCAAI;6BAAe,SAAS,IAAI,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC;kBAAQ,CAAA;kBAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;mBAAM,WAAWA,gCAAI;6BAArB,CAAqC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,SAAS,IAAI,QAAQ,EAAU,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,IAAI,SAAS,GAAG,IAAI,OAAO,MAAM,OAAO,QAAQ,OAAO,IAAI,YAAY,SAAS,OAAc,CAAA,CAAO;;kBAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,IAAI,SAAS,GAAG,OAAO,IAAI,MAAM,EAAE,OAAO,IAAO,CAAA;iBAAS;oBAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;iBAAQ,WAAWA,gCAAI;iBAAc,cAAY,MAAM,SAAS,IAAI,QAAQ;iBAAK,OAAM;iBAAO,eAAe,cAAc,KAAK,KAAI,YAAW,QAAQ,QAAO,UAAS,UAAU,IAAI,QAAQ,CAAC;2BAAG;gBAAS,CAAA,CAAM;;cAAM,GAA52B,IAAI,QAAw2B,CAAC;aAAO,CAAA;aAAE,CAAC,KAAK,QAAQ,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;cAAK,WAAWA,gCAAI;wBAAe;aAAiB,CAAA;YAAO;;UAAW;YAAh6F,KAAK,EAA25F;QAAE,CAAC;OAAO,CAAA;OAAE,CAAC,MAAM,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAWA,gCAAI;kBAAO;OAAiB,CAAA;MAAW;OACjwH;MAAM;;EACb;;;ECLA,IAAI,QAAoB;GAAE,MAAM;GAAO,SAAS;GAAO,QAAQ;GAAO,OAAO,CAAC;GAAG,OAAO;GAAM,gBAAgB;GAAM,cAAc;GAAM,WAAW;EAAM;EACzJ,MAAM,4BAAY,IAAI,IAAgB;EACtC,MAAM,QAAQ,UAA+B;GAC3C,QAAQ;IAAE,GAAG;IAAO,GAAG;GAAM;GAC7B,KAAK,MAAM,YAAY,WAAW,SAAS;EAC7C;EACA,MAAM,aAAa,aAAyB;GAC1C,UAAU,IAAI,QAAQ;GACtB,aAAa,UAAU,OAAO,QAAQ;EACxC;EACA,MAAM,iBAAiB;EAKvB,MAAM,0BAA0B;EAEhC,MAAM,sBAAsB;GAC1B;GAAM;GAAU;GAAO;GAAO;GAAO;GAAO;GAAQ;GACpD;GAAO;GAAQ;GAAQ;GAAO;GAAO;EACvC;EACA,MAAM,8BAA8B;EACpC,MAAM,2BAA2B;EACjC,MAAM,yBAAyB;EAC/B,MAAM,wBAAwB;EAE9B,SAAS,gBAA2B;GAClC,IAAI;IACF,MAAM,QAAQ,KAAK,MAAM,OAAO,aAAa,QAAQ,qBAAqB,KAAK,IAAI;IACnF,OAAO;KACL,MAAM,OAAO,OAAO,SAAS,WAAW,MAAM,OAAO;KACrD,MAAM,OAAO,QAAQ,OAAO,MAAM,SAAS,WAAW,MAAM,OAAwC,CAAC;IACvG;GACF,QAAQ;IACN,OAAO;KAAE,MAAM;KAAM,MAAM,CAAC;IAAE;GAChC;EACF;EAEA,SAAS,gBAAgB,OAA4B;GACnD,MAAM,SAAmB,CAAC;GAC1B,MAAM,uBAAO,IAAI,IAAY;GAC7B,IAAI,UAAU,MAAM;GACpB,OAAO,WAAW,CAAC,KAAK,IAAI,OAAO,KAAK,OAAO,SAAS,KAAM;IAC5D,OAAO,KAAK,OAAO;IACnB,KAAK,IAAI,OAAO;IAChB,UAAU,MAAM,KAAK,YAAY;GACnC;GACA,OAAO;EACT;EAEA,SAAS,gBAAgB,QAA6B;GACpD,MAAM,OAAsC,CAAC;GAC7C,OAAO,SAAS,OAAO,UAAU;IAAE,KAAK,SAAS,OAAO,QAAQ,MAAM;GAAK,CAAC;GAC5E,OAAO;IAAE,MAAM,OAAO,MAAM;IAAM;GAAK;EACzC;EAEA,SAAS,eAAe,UAAoB,OAA4B;GACtE,MAAM,YAAY,IAAI,IAAI,QAAQ;GAClC,MAAM,UAAU,gBAAgB,KAAK,CAAC,CAAC,QAAO,WAAU,UAAU,IAAI,MAAM,CAAC;GAC7E,MAAM,aAAa,IAAI,IAAI,OAAO;GAClC,OAAO,CAAC,GAAG,SAAS,GAAG,SAAS,QAAO,WAAU,CAAC,WAAW,IAAI,MAAM,CAAC,CAAC;EAC3E;EAEA,SAAS,mBAA2C;GAClD,IAAI;IACF,MAAM,QAAQ,KAAK,MAAM,OAAO,aAAa,QAAQ,wBAAwB,KAAK,IAAI;IACtF,OAAO,SAAS,OAAO,UAAU,WAAW,QAAkC,CAAC;GACjF,QAAQ;IACN,OAAO,CAAC;GACV;EACF;EAEA,SAAS,gBAAgB,SAAiC;GACxD,MAAM,QAAQ,iBAAiB,CAAC,CAAC;GACjC,OAAO,OAAO,UAAU,YAAY,QAAQ,UAAU,KAAK,IAAI;EACjE;EAEA,SAAS,gBAAgB,SAAiB,WAAsB;GAC9D,MAAM,QAAQ,iBAAiB;GAC/B,MAAM,WAAW;GACjB,OAAO,aAAa,QAAQ,0BAA0B,KAAK,UAAU,KAAK,CAAC;EAC7E;EAEA,SAAS,sBAA8F;GACrG,IAAI;IACF,MAAM,QAAQ,KAAK,MAAM,OAAO,aAAa,QAAQ,2BAA2B,KAAK,IAAI;IACzF,OAAO;KACL,OAAO,IAAI,IAAI,MAAM,QAAQ,OAAO,KAAK,IAAI,MAAM,MAAM,QAAQ,SAAkC,OAAO,SAAS,QAAQ,IAAI,CAAC,CAAC;KACjI,UAAU,IAAI,IAAI,MAAM,QAAQ,OAAO,QAAQ,IAAI,MAAM,SAAS,QAAQ,SAAkC,OAAO,SAAS,QAAQ,IAAI,CAAC,CAAC;KAC1I,YAAY,IAAI,IAAI,MAAM,QAAQ,OAAO,UAAU,IAAI,MAAM,WAAW,QAAQ,SAAkC,OAAO,SAAS,QAAQ,IAAI,CAAC,CAAC;IAClJ;GACF,QAAQ;IACN,OAAO;KAAE,uBAAO,IAAI,IAAI;KAAG,0BAAU,IAAI,IAAI;KAAG,4BAAY,IAAI,IAAI;IAAE;GACxE;EACF;EAEA,SAAS,iBAA8B;GACrC,IAAI;IACF,MAAM,QAAQ,KAAK,MAAM,OAAO,aAAa,QAAQ,sBAAsB,KAAK,IAAI;IACpF,OAAO,IAAI,IAAI,MAAM,QAAQ,KAAK,IAAI,MAAM,QAAQ,SAAyB,OAAO,SAAS,QAAQ,IAAI,CAAC,CAAC;GAC7G,QAAQ;IACN,uBAAO,IAAI,IAAI;GACjB;EACF;EAEA,eAAe,QAAQ,WAAW,iBAAiB;GACjD,KAAK;IAAE,SAAS;IAAM,OAAO;IAAM,gBAAgB;GAAK,CAAC;GACzD,IAAI;IACF,MAAM,QAAQ,IAAI,gBAAgB,EAAE,SAAS,CAAC;IAC9C,MAAM,WAAW,MAAM,MAAM,2BAA2B,SAAS,EAAE,SAAS,EAAE,QAAQ,mBAAmB,EAAE,CAAC;IAC5G,MAAM,OAAO,MAAM,SAAS,KAAK;IACjC,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,KAAK,SAAS,SAAS,SAAS,OAAO,EAAE;IAC3E,KAAK;KAAE,OAAO,KAAK,SAAS,CAAC;KAAG,WAAW,KAAK,cAAc;KAAM,QAAQ;KAAM,gBAAgB,OAAO,KAAK,OAAO,UAAU,EAAE;IAAM,CAAC;GAC1I,SAAS,OAAO;IACd,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,WAAW,CAAC;GACrE,UAAU;IACR,KAAK,EAAE,SAAS,MAAM,CAAC;GACzB;EACF;EAEA,SAAS,wBAAwB;GAC/B,KAAK,EAAE,gBAAgB,KAAK,CAAC;EAC/B;EAEA,SAAS,eAAe,KAAc;GAEpC,KAAK;IAAE,MAAM;IAAO,cAAc;IAAM,QAAQ;IAAO,OAAO;IAAM,gBAAgB;GAAK,CAAC;GAC1F,IAAI,OAAO,YAAY,IAAI;EAC7B;EAEA,SAAS,kBAAkB,EAAE,MAAM,iBAA+D;GAChG,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;IAAQ,WAAWG,gCAAI;IAAe,MAAK;IAAS,OAAM;IAAQ,SAAS;cAA3E,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAM,WAAWA,gCAAI;KAAY,eAAY;eAAO;IAAO,CAAA,GAC1D,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAM,QAAW,CAAA,CACpB;;EAEZ;EAEA,SAAS,wBAAwB,EAAE,iBAAgD;GACjF,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;IAAQ,WAAWA,gCAAI;IAAc,MAAK;IAAS,OAAM;IAAU,SAAS;cAA5E,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAM,WAAWA,gCAAI;KAAY,eAAY;eAAO;IAAO,CAAA,GAC3D,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAM,QAAW,CAAA,CACX;;EAEZ;EAEA,SAAS,yBAAyB,EAAE,KAAK,QAA4C;GACnF,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,SAAA,CAA2B,EAAE;GACjD,MAAM,CAAC,mBAAmB,yBAAA,GAAA,MAAA,SAAA,CAAiC,KAAK;GAChE,MAAM,CAAC,UAAU,gBAAA,GAAA,MAAA,SAAA,CAAwB,KAAK;GAC9C,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAAoC,IAAI;GACtD,MAAM,cAAA,GAAA,MAAA,qBAAA,EACJ,aAAY,IAAI,WAAW,KAAK,UAAU,QAAQ,SAC5C,IAAI,WAAW,KAAK,YAAY,SAChC,IAAI,WAAW,KAAK,YAAY,CACxC;GACA,MAAM,oBAAoB,WAAW,MAAM,MAAK,cAAa,UAAU,gBAAgB,WAAW;GAElG,eAAe,qBAAqB;IAClC,IAAI,CAAC,qBAAqB,UAAU;IACpC,YAAY,IAAI;IAChB,SAAS,IAAI;IACb,IAAI;KACF,MAAM,mBAAmB,MAAM,IAAI,SAAS,OAAO,EAAE,aAAa,kBAAkB,YAAY,CAAC;KACjG,MAAM,UAAU,IAAI,SAAS,QAAQ,gBAAgB,CAAC,EAAE;KACxD,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,qBAAqB;KACnD,MAAM,QAAQ,IAAI,KAAK,QAAQ,IAAI,KAAK;KACxC,MAAM,UAAU,MAAM,QAAQ,OAAO,KAAK;KAC1C,IAAI,CAAC,QAAQ,IAAI,MAAM,IAAI,MAAM,YAAY,QAAQ,MAAM,SAAS;KACpE,MAAM,SAAS;MACb,WAAW,KAAK,QAAQ;MACxB,MAAM,KAAK;MACX,MAAM,KAAK,YAAY;MACvB,MAAM,KAAK,UAAU;MACrB,OAAO,KAAK,YAAY;KAC1B,CAAC,CAAC,KAAK,IAAI;KACX,MAAM,WAAW,MAAM,QAAQ,OAAO,CAAC;MAAE,MAAM;MAAQ,MAAM;KAAO,CAAC,GAAG,OAAO;KAC/E,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,aAAa,SAAS,MAAM,SAAS;KACvE,gBAAgB,KAAK,SAAS,gBAAgB;KAC9C,IAAI,SAAS,KAAK,gBAAgB;KAClC,eAAe,GAAG;IACpB,SAAS,QAAQ;KACf,SAAS,kBAAkB,QAAQ,OAAO,UAAU,gBAAgB;IACtE,UAAU;KACR,YAAY,KAAK;IACnB;GACF;GAEA,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,OAAD;IACE,MAAA;IACA,eAAe,KAAK,EAAE,cAAc,KAAK,CAAC;IAC1C,OAAM;IACN,YAAW;IACX,aAAa,KAAK;IAClB,WAAWD,gCAAI;IACf,QACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACE,sCAAAA,QAAD;KAAQ,SAAQ;KAAQ,eAAe,KAAK,EAAE,cAAc,KAAK,CAAC;eAAG;IAAU,CAAA,GAC/E,iBAAA,GAAA,kBAAA,IAAA,CAACA,sCAAAA,QAAD;KAAQ,SAAQ;KAAU,UAAU,CAAC,qBAAqB;KAAU,eAAe,KAAK,mBAAmB;eACxG,WAAW,UAAU;IAChB,CAAA,CACR,EAAA,CAAA;cAGJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAWF,gCAAI;eAApB;MACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,KAAK,QAAc,CAAA;MACzB,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAWA,gCAAI;OAAO,MAAK;iBAAS;MAAW,CAAA,IAAI;MACjE,iBAAA,GAAA,kBAAA,IAAA,CAACG,sCAAAA,MAAD;OACE,MAAM;OACN,QAAA;OACA,OAAO,WAAW,MAAM,KAAK,eAA8B;QACzD,IAAI,UAAU;QACd,OAAO,UAAU;OACnB,EAAE;OACF,YAAY,eAAe,KAAA;OAC3B,WAAU,OAAM;QACd,eAAe,EAAE;QACjB,qBAAqB,KAAK;OAC5B;OACA,eAAe,qBAAqB,KAAK;OACzC,QACE,iBAAA,GAAA,kBAAA,KAAA,CAACD,sCAAAA,QAAD;QACE,WAAWF,gCAAI;QACf,SAAQ;QACR,iBAAc;QACd,iBAAe;QACf,eAAe,sBAAqB,SAAQ,CAAC,IAAI;kBALnD,CAOE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,mBAAmB,SAAS,iBAAuB,CAAA,GAC1D,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,eAAY;mBAAO;QAAO,CAAA,CAC1B;;MAEX,CAAA;MACA,oBAAoB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,kBAAkB,KAAW,CAAA,IAAI;KAC1D;;GACA,CAAA;EAEX;EAEA,SAAS,iBAAiB,EAAE,OAAyB;GACnD,MAAM,SAAA,GAAA,MAAA,qBAAA,CAA6B,WAAW,UAAU,QAAQ;GAChE,MAAM,gBAAA,GAAA,MAAA,OAAA,CAAmC,IAAI;GAC7C,MAAM,iBAAA,GAAA,MAAA,OAAA,CAA2C,IAAI;GACrD,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,SAAA,CAAwC,OAAO;GAC5D,MAAM,CAAC,cAAc,oBAAA,GAAA,MAAA,SAAA,CAA6C,IAAI;GACtE,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,SAAA,CAAsB,EAAE;GACvC,MAAM,CAAC,WAAW,iBAAA,GAAA,MAAA,SAAA,CAAyB,mBAAmB;GAC9D,MAAM,CAAC,YAAY,kBAAA,GAAA,MAAA,SAAA,CAA0B,cAAc;GAC3D,MAAM,CAAC,kBAAkB,wBAAA,GAAA,MAAA,SAAA,CAAgC,eAAe;GACxE,MAAM,CAAC,iBAAiB,uBAAA,GAAA,MAAA,SAAA,CAAgD;IAAE,OAAO,CAAC;IAAG,YAAY,CAAC;GAAE,CAAC;GACrG,MAAM,CAAC,kBAAkB,wBAAA,GAAA,MAAA,SAAA,CAAgC,CAAC;GAC1D,MAAM,CAAC,WAAW,iBAAA,GAAA,MAAA,SAAA,CAAyB,aAAa;GACxD,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,SAAA,CAA0C,IAAI;GAClE,MAAM,CAAC,UAAU,gBAAA,GAAA,MAAA,SAAA,CAAmE,IAAI;GACxF,MAAM,gBAAA,GAAA,MAAA,OAAA,iBAAsB,IAAI,IAAyB,CAAC;GAC1D,MAAM,yBAAA,GAAA,MAAA,OAAA,iBAA+B,IAAI,IAAqB,CAAC;GAC/D,MAAM,YAAA,GAAA,MAAA,qBAAA,EACJ,aAAY,IAAI,SAAS,KAAK,UAAU,QAAQ,SAC1C,IAAI,SAAS,KAAK,YAAY,SAC9B,IAAI,SAAS,KAAK,YAAY,CACtC;GAEA,CAAA,GAAA,MAAA,UAAA,OAAgB;IAGd,IAAI,MAAM,QAAQ,CAAC,MAAM,UAAU,CAAC,MAAM,WAAW,CAAC,MAAM,OAAO,QAAa;GAClF,GAAG;IAAC,MAAM;IAAO,MAAM;IAAQ,MAAM;IAAS,MAAM;GAAI,CAAC;GACzD,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,CAAC,MAAM,MAAM;IACjB,MAAW,6BAA6B,EAAE,SAAS,EAAE,QAAQ,mBAAmB,EAAE,CAAC,CAAC,CACjF,MAAK,aAAY,SAAS,KAAK,SAAS,KAAK,IAAI,QAAQ,uBAAO,IAAI,MAAM,QAAQ,SAAS,QAAQ,CAAC,CAAC,CAAC,CACtG,MAAK,UAAS,mBAAmB,KAAwB,CAAC,CAAC,CAC3D,YAAY,CAAC,CAAC;GACnB,GAAG,CAAC,MAAM,MAAM,gBAAgB,CAAC;GACjC,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,CAAC,MAAM,MAAM;IACjB,MAAM,4BAA4B,UAAwB;KACxD,IAAI,EAAE,MAAM,kBAAkB,UAAU;KACxC,IAAI,aAAa,SAAS,SAAS,MAAM,MAAM,GAAG;KAClD,IAAI,MAAM,OAAO,QAAQ,oCAAgC,GAAG;KAC5D,eAAe,GAAG;IACpB;IACA,SAAS,iBAAiB,eAAe,0BAA0B,IAAI;IACvE,aAAa,SAAS,oBAAoB,eAAe,0BAA0B,IAAI;GACzF,GAAG,CAAC,MAAM,IAAI,CAAC;GACf,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,MAAM,mBAAmB,UAAwB;KAC/C,MAAM,OAAO,cAAc;KAC3B,IAAI,MAAM,QAAQ,MAAM,kBAAkB,QAAQ,CAAC,KAAK,SAAS,MAAM,MAAM,GAAG,KAAK,OAAO;IAC9F;IACA,MAAM,2BAA2B,UAAyB;KACxD,IAAI,MAAM,QAAQ,YAAY,cAAc,SAAS,MAAM,cAAc,QAAQ,OAAO;IAC1F;IACA,SAAS,iBAAiB,eAAe,iBAAiB,IAAI;IAC9D,SAAS,iBAAiB,WAAW,uBAAuB;IAC5D,aAAa;KACX,SAAS,oBAAoB,eAAe,iBAAiB,IAAI;KACjE,SAAS,oBAAoB,WAAW,uBAAuB;IACjE;GACF,GAAG,CAAC,CAAC;GACL,CAAA,GAAA,MAAA,gBAAA,OAAsB;IACpB,MAAM,WAAW,sBAAsB;IACvC,IAAI,SAAS,SAAS,GAAG;IACzB,IAAI,OAAO,WAAW,kCAAkC,CAAC,CAAC,SAAS;KACjE,SAAS,MAAM;KACf;IACF;IACA,KAAK,MAAM,CAAC,QAAQ,YAAY,aAAa,SAAS;KACpD,MAAM,SAAS,SAAS,IAAI,MAAM;KAClC,IAAI,CAAC,QAAQ;KACb,MAAM,QAAQ,QAAQ,sBAAsB;KAC5C,MAAM,SAAS,OAAO,OAAO,MAAM;KACnC,MAAM,SAAS,OAAO,MAAM,MAAM;KAClC,IAAI,UAAU,QACZ,QAAQ,QACN,CAAC,EAAE,WAAW,aAAa,OAAO,MAAM,OAAO,KAAK,GAAG,EAAE,WAAW,kBAAkB,CAAC,GACvF;MAAE,UAAU;MAAK,QAAQ;KAA2B,CACtD;IAEJ;IACA,SAAS,MAAM;GACjB,GAAG,CAAC,SAAS,CAAC;GACd,IAAI,CAAC,MAAM,MAAM,OAAO;GAExB,SAAS,SAAS,MAAkB;IAClC,MAAM,SAAS,gBAAgB,KAAK,OAAO;IAC3C,MAAM,cAAc,IAAI,KAAK,QAAQ;IAGrC,MAAM,mBAAmB,OAAkB,SAAS,KAAK,GAAG,EAAE,UAAU;IACxE,MAAM,aAAa,SAAS,IAAI,MAAK,OAAM;KACzC,MAAM,UAAU,SAAS,KAAK;KAE9B,QADgB,SAAS,OAAO,WAAW,WAAW,MAAM,QAAQ,SAAS,cAAc,WAAW,WAAW,MAAM,SACrG,gBAAgB,EAAE;IACtC,CAAC;IACD,MAAM,aAAa,UAAU,gBAAgB,MAAM,IAAI,SAAS;IAChE,IAAI,YAAY;KACd,gBAAgB,KAAK,SAAS,UAAU;KACxC,IAAI,SAAS,KAAK,UAAU;KAC5B,eAAe,GAAG;KAClB;IACF;IACA,KAAK,EAAE,cAAc,KAAK,CAAC;GAC7B;GAEA,MAAM,mBAAmB,OAAO,KAAK,CAAC,CAAC,YAAY;GACnD,MAAM,gBAAgB,MAAM,MAAM,QAAO,SACvC,CAAC,UAAU,MAAM,IAAI,KAAK,QAAQ,KAC/B,CAAC,UAAU,SAAS,IAAI,KAAK,MAAM,KACnC,CAAC,UAAU,WAAW,IAAI,KAAK,YAAY,KAC3C,CAAC,UAAU,WAAW,IAAI,KAAK,aAAa,MAC3C,CAAC,oBAAoB;IACvB,KAAK;IAAS,KAAK;IAAO,KAAK;IAAU,KAAK;IAAQ,KAAK;IAAc,KAAK;IAAe,KAAK;IAAS,KAAK,UAAU,KAAK,GAAG;IAAG,KAAK;GAC5I,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,gBAAgB,EACpD;GACD,MAAM,cAAc,CAAC,GAAG,IAAI,IAAI,MAAM,MAAM,KAAI,SAAQ,KAAK,QAAQ,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC;GACxI,MAAM,gBAAgB,eAAe,CAAC,GAAG,IAAI,IAAI,CAC/C,GAAG,qBACH,GAAG,MAAM,MAAM,KAAI,SAAQ,KAAK,MAAM,CAAC,CAAC,QAAO,WAAU,CAAC,oBAAoB,SAAS,MAAM,CAAC,CAChG,CAAC,CAAC,GAAG,SAAS;GAMd,MAAM,0BAA0B;IAC9B,MAAM,0BAAU,IAAI,IAA8C;IAClE,KAAK,MAAM,QAAQ,MAAM,OAAO;KAC9B,MAAM,QAAQ,KAAK,gBAAgB,KAAK,iBAAiB,KAAK;KAC9D,IAAI,CAAC,OAAO;KACZ,MAAM,QAAQ,KAAK,iBAAiB,KAAK,gBAAgB,KAAK,kBAAkB,KAAK,eAAe,GAAG,KAAK,cAAc,IAAI,KAAK,aAAa,KAAK;KACrJ,IAAI,CAAC,QAAQ,IAAI,KAAK,GAAG,QAAQ,IAAI,OAAO;MAAE;MAAO;KAAM,CAAC;IAC9D;IACA,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC;GAC7B,EAAA,CAAG;GACH,MAAM,kBAAkB,CAAC,GAAG,IAAI,IAAI,CAClC,GAAG,oBAAoB,QAAO,WAAU,cAAc,MAAK,SAAQ,KAAK,WAAW,MAAM,CAAC,GAC1F,GAAG,cAAc,KAAI,SAAQ,KAAK,MAAM,CAAC,CAAC,QAAO,WAAU,CAAC,oBAAoB,SAAS,MAAM,CAAC,CAClG,CAAC,CAAC;GACF,MAAM,WAAW,eAAe,iBAAiB,SAAS;GAE1D,MAAM,oBAAoB,SAA2B;IACnD,OAAO,aAAa,QAAQ,6BAA6B,KAAK,UAAU;KACtE,OAAO,CAAC,GAAG,KAAK,KAAK;KACrB,UAAU,CAAC,GAAG,KAAK,QAAQ;KAC3B,YAAY,CAAC,GAAG,KAAK,UAAU;IACjC,CAAC,CAAC;IACF,OAAO;GACT;GACA,MAAM,mBAAmB,MAA2C,UAAkB,cAAa,YAAW;IAC5G,MAAM,aAAa,IAAI,IAAI,QAAQ,KAAK;IACxC,IAAI,WAAW,IAAI,KAAK,GAAG,WAAW,OAAO,KAAK;SAC7C,WAAW,IAAI,KAAK;IACzB,OAAO,iBAAiB;KAAE,GAAG;MAAU,OAAO;IAAW,CAAC;GAC5D,CAAC;GACD,MAAM,yBAAyB,YAAqB,cAAa,YAAW,iBAAiB;IAC3F,GAAG;IACH,YAAY,0BAAU,IAAI,IAAY,IAAI,IAAI,IAAI,iBAAiB,KAAI,WAAU,OAAO,KAAK,CAAC;GAChG,CAAC,CAAC;GAEF,MAAM,mBAAmB,YAAoB,eAAc,YAAW;IACpE,MAAM,OAAO,IAAI,IAAI,OAAO;IAC5B,IAAI,KAAK,IAAI,OAAO,GAAG,KAAK,OAAO,OAAO;SACrC,KAAK,IAAI,OAAO;IACrB,OAAO,aAAa,QAAQ,wBAAwB,KAAK,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC;IAC7E,OAAO;GACT,CAAC;GAED,MAAM,YAAY,SAAiB,QAAgB,UAAmB;IACpE,IAAI,YAAY,QAAQ;IACxB,sBAAsB,UAAU,IAAI,IAAI,CAAC,GAAG,aAAa,OAAO,CAAC,CAAC,KAAK,CAAC,QAAQ,aAAa,CAAC,QAAQ,QAAQ,sBAAsB,CAAC,CAAC,CAAC;IACvI,cAAa,YAAW;KACtB,MAAM,UAAU,eAAe,iBAAiB,OAAO,CAAC,CAAC,QAAO,WAAU,WAAW,OAAO;KAC5F,MAAM,cAAc,QAAQ,QAAQ,MAAM;KAC1C,QAAQ,OAAO,eAAe,QAAQ,IAAI,IAAI,GAAG,OAAO;KACxD,MAAM,kBAAkB,gBAAgB,OAAO;KAC/C,MAAM,aAAa,IAAI,IAAI;MAAC,GAAG;MAAiB;MAAS;KAAM,CAAC;KAChE,MAAM,gBAAgB,gBAAgB,QAAO,WAAU,CAAC,QAAQ,SAAS,MAAM,CAAC;KAChF,MAAM,OAAO,gBAAgB,CAAC,GAAG,QAAQ,QAAO,WAAU,WAAW,IAAI,MAAM,CAAC,GAAG,GAAG,aAAa,CAAC;KACpG,OAAO,aAAa,QAAQ,uBAAuB,KAAK,UAAU,IAAI,CAAC;KACvE,OAAO;IACT,CAAC;GACH;GAEA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,KAAK;IAAc,WAAWA,gCAAI;IAAW,cAAW;cAAjE;KACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;MAAQ,WAAWA,gCAAI;gBAAvB,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWA,gCAAI;iBAApB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAI,QAAS,CAAA,GACb,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,gCAAI;kBAApB;SACG,SAAS,YAAY;SACrB,SAAS,WAAW,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;UAAE,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;WAAO,WAAWA,gCAAI;qBAAtB;YACrB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;aAAM,eAAY;uBAAO;YAAO,CAAA;YAChC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;aACE,MAAK;aACL,OAAO;aACP,WAAU,UAAS,UAAU,MAAM,OAAO,KAAK;aAC/C,aAAY;aACZ,cAAW;YACZ,CAAA;YACA,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;aAAQ,MAAK;aAAS,cAAW;aAAQ,eAAe,UAAU,EAAE;uBAAG;YAAS,CAAA;WACtF;;UACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;WAAS,KAAK;WAAe,WAAWA,gCAAI;qBAA5C,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;YAAS,cAAW;YAAiB,OAAM;sBAA3C,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;aAAM,eAAY;uBAAO;YAAO,CAAA,IAC9B,UAAU,MAAM,OAAO,KAAK,UAAU,SAAS,OAAO,KAAK,UAAU,WAAW,OAAO,KAAK,qBAAqB,oBAAoB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,CAAI,CAAA,CACpI;eACT,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;YAAK,WAAWA,gCAAI;sBAApB;aACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,oBAAD;cAAoB,SAAS;cAAkB,QAAQ,UAAU;cAAY,WAAU,UAAS,gBAAgB,cAAc,KAAK;cAAG,UAAU;aAAwB,CAAA;aACxK,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD;cAAgB,OAAO,gBAAgB;cAAO,OAAO;cAAkB,WAAU,UAAS;eAAE,oBAAoB,KAAK;eAAG,QAAa,KAAK;cAAE;aAAI,CAAA;aAChJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;cAAW,OAAM;cAAK,SAAS;cAAa,QAAQ,UAAU;cAAO,WAAU,UAAS,gBAAgB,SAAS,KAAK;aAAI,CAAA;aAC1H,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;cAAW,OAAM;cAAK,SAAS;cAAe,QAAQ,UAAU;cAAU,WAAU,UAAS,gBAAgB,YAAY,KAAK;aAAI,CAAA;YAC/H;aACE;;UACT,iBAAA,GAAA,kBAAA,IAAA,CAACE,sCAAAA,QAAD;WACE,SAAQ;WACR,MAAK;WACL,WAAWF,gCAAI;WACf,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAACI,sCAAAA,sBAAD,CAAuB,CAAA;WAC7B,OAAM;WACN,cAAW;WACX,UAAU,MAAM;WAChB,eAAe;YAAE,QAAa,gBAAgB;YAAG,qBAAoB,UAAS,QAAQ,CAAC;WAAE;UAC1F,CAAA;SACC,EAAA,CAAA;SACF,iBAAA,GAAA,kBAAA,IAAA,CAACF,sCAAAA,QAAD;UACE,SAAQ;UACR,MAAK;UACL,WAAWF,gCAAI;UACf,MAAM,iBAAA,GAAA,kBAAA,IAAA,CAACK,sCAAAA,oBAAD,CAAqB,CAAA;UAC3B,OAAM;UACN,cAAW;UACX,eAAe,eAAe,GAAG;SAClC,CAAA;QACE;SACF;UACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWL,gCAAI;OAAU,cAAW;iBAAzC,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,gBAAc,SAAS,UAAU,SAAS,KAAA;QAAW,eAAe,QAAQ,OAAO;kBAAG;OAAY,CAAA,GACxH,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,gBAAc,SAAS,WAAW,SAAS,KAAA;QAAW,eAAe,QAAQ,QAAQ;kBAAG;OAAY,CAAA,CACvH;QACC;;KACP,SAAS,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;MAAa,eAAe;MAAiB,YAAY;KAAW,CAAA,IAAI,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;MAC5F,MAAM,kBAAkB,iBAAA,GAAA,kBAAA,IAAA,CAACM,sCAAAA,OAAD;OACvB,MAAM,MAAM;OACZ,QAAQ,aAAa;OACrB,QAAQ;OACR,QAAQ;MACT,CAAA;MACA,MAAM,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAWN,gCAAI;OAAO,MAAK;iBAAS,MAAM;MAAW,CAAA;MACzE,MAAM,aAAa,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;OAAG,WAAWA,gCAAI;OAAQ,MAAK;iBAA/B;QAAwC;QAAmB,MAAM,MAAM;QAAO;OAAM;;MACxG,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWA,gCAAI;iBAApB,CACG,SAAS,KAAI,WAAU;QACtB,MAAM,QAAQ,cAAc,QAAO,SAAQ,KAAK,WAAW,MAAM;QACjE,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;SACE,MAAK,YAAW;UAAE,IAAI,SAAS,aAAa,QAAQ,IAAI,QAAQ,OAAO;eAAQ,aAAa,QAAQ,OAAO,MAAM;SAAE;SACnH,WAAW,GAAGA,gCAAI,KAAK,GAAG,gBAAgB,SAASA,gCAAI,eAAe,GAAG,GAAG,UAAU,WAAW,SAAU,SAAS,QAAQA,gCAAI,gBAAgBA,gCAAI,iBAAkB;SAEtK,mBAAiB,eAAe;SAChC,aAAY,UAAS;UACnB,IAAI,CAAC,eAAe,gBAAgB,QAAQ;UAC5C,MAAM,eAAe;UACrB,MAAM,SAAS,MAAM,cAAc,sBAAsB;UACzD,YAAY;WAAE;WAAQ,OAAO,MAAM,WAAW,OAAO,OAAO,OAAO,QAAQ;UAAE,CAAC;SAChF;SACA,SAAQ,UAAS;UACf,MAAM,eAAe;UACrB,IAAI,eAAe,UAAU,WAAW,QAAQ,SAAS,aAAa,QAAQ,SAAS,KAAK;UAC5F,eAAe,IAAI;UACnB,YAAY,IAAI;SAClB;mBAhBF,CAkBE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;UACE,WAAWA,gCAAI;UACf,WAAA;UACA,OAAM;UACJ,cAAa,UAAS;WACpB,MAAM,aAAa,gBAAgB;WACnC,MAAM,aAAa,QAAQ,cAAc,MAAM;WAC/C,MAAM,OAAO,MAAM,cAAc;WACjC,IAAI,MAAM;YACR,MAAM,SAAS,KAAK,sBAAsB;YAC1C,MAAM,aAAa,aACjB,MACA,KAAK,IAAI,KAAK,IAAI,MAAM,UAAU,OAAO,MAAM,CAAC,GAAG,OAAO,KAAK,GAC/D,KAAK,IAAI,KAAK,IAAI,MAAM,UAAU,OAAO,KAAK,CAAC,GAAG,OAAO,MAAM,CACjE;WACF;WACA,eAAe,MAAM;UACvB;UACF,iBAAiB;WAAE,eAAe,IAAI;WAAG,YAAY,IAAI;UAAE;oBAlB7D,CAoBE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;WAAI,IAAI,eAAe;qBAAW;UAAW,CAAA,GAC7C,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,MAAM,OAAa,CAAA,CACpB;aACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;UAAK,WAAWA,gCAAI;oBACjB,MAAM,KAAI,SACT,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;WACE,WAAW,GAAGA,gCAAI,KAAK,GAAG,WAAW,IAAI,KAAK,OAAO,IAAIA,gCAAI,YAAY;WAEzE,UAAU;WACV,MAAK;WACL,eAAe,SAAS,IAAI;WAC5B,YAAW,UAAS;YAClB,IAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;aAC9C,MAAM,eAAe;aACrB,SAAS,IAAI;YACf;WACF;qBAXF;YAaE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;aAAK,WAAWA,gCAAI;uBAApB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;cAAM,WAAWA,gCAAI;wBAAM,KAAK;aAAc,CAAA,GAC9C,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;cAAK,WAAWA,gCAAI;wBAApB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACE,sCAAAA,QAAD;eACE,WAAWF,gCAAI;eACf,SAAQ;eACR,MAAK;eACL,OAAO,WAAW,IAAI,KAAK,OAAO,IAAI,SAAS;eAC/C,cAAY,WAAW,IAAI,KAAK,OAAO,IAAI,QAAQ,KAAK,YAAY,MAAM,KAAK;eAC/E,gBAAc,WAAW,IAAI,KAAK,OAAO;eACzC,UAAS,UAAS;gBAChB,MAAM,gBAAgB;gBACtB,gBAAgB,KAAK,OAAO;eAC9B;eACA,YAAW,UAAS,MAAM,gBAAgB;yBAC3C;cAEO,CAAA,GACR,iBAAA,GAAA,kBAAA,IAAA,CAACE,sCAAAA,QAAD;eACE,WAAWF,gCAAI;eACf,SAAQ;eACR,MAAK;eACL,OAAM;eACN,cAAY,UAAU,KAAK;eAC3B,UAAS,UAAS;gBAChB,MAAM,gBAAgB;gBACtB,OAAO,KAAK,KAAK,WAAW,UAAU,qBAAqB;eAC7D;eACA,YAAW,UAAS,MAAM,gBAAgB;yBAC3C;cAEO,CAAA,CACL;eACF;;YACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,KAAK,MAAc,CAAA;YAC5B,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;aAAK,WAAWA,gCAAI;uBAApB;cACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;eAAK,MAAM,SAAS,KAAK,QAAQ;yBAAI,KAAK;cAAc,CAAA;eACtD,KAAK,iBAAiB,KAAK,iBAAiB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;eAAK,OAAM;yBAAM,KAAK,iBAAiB,KAAK,gBAAgB,KAAK,kBAAkB,KAAK,eAAe,GAAG,KAAK,cAAc,IAAI,KAAK,aAAa,KAAK,KAAK,gBAAgB,KAAK;cAAmB,CAAA;cAClP,KAAK,YAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;eAAK,OAAM;yBAAO,cAAc,KAAK,QAAQ;cAAO,CAAA;cACrE,KAAK,WAAW,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;eAAK,OAAM;yBAAX,CAAiB,OAAI,KAAK,OAAa;;aACrD;;WACE;aApDF,KAAK,OAoDH,CACV;SACE,CAAA,CACE;WAjGF,MAiGE;OAEb,CAAC,GACA,CAAC,MAAM,WAAW,CAAC,MAAM,SAAS,SAAS,WAAW,KACrD,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAWA,gCAAI;kBAAO;OAAiB,CAAA,CAE3C;;KACH,EAAA,CAAA;KACD,MAAM,eAAe,iBAAA,GAAA,kBAAA,IAAA,CAAC,0BAAD;MAA+B;MAAK,MAAM,MAAM;KAAe,CAAA,IAAI;IAClF;;EAEb;EAEA,MAAM,kBAA0C;GAC9C,wCAAwC;GACxC,wCAAwC;GACxC,wCAAwC;GACxC,wCAAwC;GACxC,wCAAwC;GACxC,wCAAwC;EAC1C;EACA,MAAM,iBAAiB,UAAkB,gBAAgB,UAAU;EAEnE,MAAM,aAAqC;GACzC,OAAO;GAAW,cAAc;GAAW,MAAM;GAAW,KAAK;GAAW,IAAI;GAAW,MAAM;GAAW,MAAM;GAAW,SAAS;EACxI;EACA,SAAS,SAAS,MAAsB;GACtC,IAAI,WAAW,OAAO,OAAO,WAAW;GACxC,MAAM,UAAU;IAAC;IAAW;IAAW;IAAW;IAAW;IAAW;IAAW;GAAS;GAC5F,OAAO,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,QAAQ,MAAM,SAAS,OAAO,KAAK,WAAW,CAAC,GAAG,CAAC,IAAI,QAAQ;EAC1F;EAEA,SAAS,UAAU,EAAE,OAAO,SAAS,QAAQ,YAK1C;GACD,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWA,gCAAI;cAApB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,MAAY,CAAA,GACnB,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD,EAAA,UACG,QAAQ,KAAI,WACX,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KAEE,aAAA;KACA,SAAS,CAAC,OAAO,IAAI,MAAM;KAC3B,MAAM,UAAU,OAAO,SAAS,MAAM,IAAI,KAAA;KAC1C,eAAe,SAAS,MAAM;eAE7B;IACE,GAPE,MAOF,CACN,EACE,CAAA,CACF;;EAET;EAEA,MAAM,uBAAuB;EAC7B,MAAM,wBAAwB;;EAG9B,SAAS,mBAAmB,EAAE,SAAS,QAAQ,UAAU,YAKtD;GACD,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,SAAA,CAAoB,KAAK;GACtC,MAAM,WAAA,GAAA,MAAA,OAAA,CAAiC,IAAI;GAC3C,MAAM,gBAAgB,QAAQ,QAAO,WAAU,CAAC,OAAO,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAI,WAAU,OAAO,KAAK;GACpG,MAAM,UAAU,QAAQ,WAAW,IAC/B,SACA,OAAO,SAAS,IACd,UAAU,QAAQ,WAClB,cAAc,WAAW,IACvB,UACA,QAAQ,cAAc,OAAO,KAAK,QAAQ;GAElD,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,CAAC,MAAM;IACX,MAAM,SAAS,UAAyB;KACtC,IAAI,MAAM,QAAQ,UAAU;MAAE,MAAM,gBAAgB;MAAG,QAAQ,KAAK;KAAE;IACxE;IACA,MAAM,OAAO,QAAQ;IACrB,MAAM,iBAAiB,WAAW,OAAO,IAAI;IAC7C,aAAa,MAAM,oBAAoB,WAAW,OAAO,IAAI;GAC/D,GAAG,CAAC,IAAI,CAAC;GACT,MAAM,QAAqB,QAAQ,KAAI,YAAW;IAAE,IAAI,OAAO;IAAO,OAAO,OAAO;GAAM,EAAE;GAC5F,MAAM,SAAsB,CAC1B;IAAE,IAAI;IAAsB,OAAO;GAAO,GAC1C;IAAE,IAAI;IAAuB,OAAO;GAAO,CAC7C;GACA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWA,gCAAI;IAAW,KAAK;cAApC,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAM,KAAQ,CAAA,GACd,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,WAAWA,gCAAI;eAClB,iBAAA,GAAA,kBAAA,IAAA,CAACG,sCAAAA,MAAD;MACQ;MACC;MACC;MACR,aAAa;MACb,WAAW,OAAO;OAChB,IAAI,OAAO,sBAAsB,SAAS,IAAI;YACzC,IAAI,OAAO,uBAAuB,SAAS,KAAK;YAChD,SAAS,EAAE;MAClB;MACA,eAAe;OAAE,QAAQ,KAAK;MAAE;MAChC,QACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;OACE,MAAK;OACL,WAAWH,gCAAI;OACf,iBAAe;OACf,OAAO;OACP,eAAe;QAAE,QAAQ,CAAC,IAAI;OAAE;iBALlC,CAOE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,QAAc,CAAA,GACrB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAWA,gCAAI;QAAkB,eAAA;kBAAY,iBAAA,GAAA,kBAAA,IAAA,CAACO,sCAAAA,0BAAD,CAA2B,CAAA;OAAI,CAAA,CACzE;;KAEX,CAAA;IACE,CAAA,CACF;;EAET;EAEA,SAAS,eAAe,EAAE,OAAO,OAAO,YAIrC;GACD,MAAM,WAAA,GAAA,MAAA,OAAA,CAAiC,IAAI;GAC3C,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,SAAA,CAAoB,KAAK;GACtC,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAAqB,EAAE;GACrC,MAAM,WAAA,GAAA,MAAA,QAAA,OAAwB,CAAC;IAAE,UAAU;IAAiB,MAAM;GAAO,GAAG,GAAG,MAAM,QAAO,SAAQ,KAAK,aAAa,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;GAChJ,MAAM,WAAW,QAAQ,MAAK,WAAU,OAAO,aAAa,KAAK,KAAK,QAAQ;GAC9E,MAAM,SAAS,MAAM,KAAK,CAAC,CAAC,YAAY;GACxC,MAAM,WAAW,SACb,QAAQ,QAAO,WAAU,GAAG,OAAO,KAAK,GAAG,OAAO,WAAW,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,IAC3F;GAEJ,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,CAAC,MAAM;IACX,MAAM,SAAS,UAAwB;KACrC,IAAI,MAAM,kBAAkB,QAAQ,CAAC,QAAQ,SAAS,SAAS,MAAM,MAAM,GAAG,QAAQ,KAAK;IAC7F;IACA,SAAS,iBAAiB,eAAe,OAAO,IAAI;IACpD,aAAa,SAAS,oBAAoB,eAAe,OAAO,IAAI;GACtE,GAAG,CAAC,IAAI,CAAC;GAET,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWP,gCAAI;cAApB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAM,MAAS,CAAA,GACf,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,KAAK;KAAS,WAAWA,gCAAI;eAAlC,CACE,iBAAA,GAAA,kBAAA,KAAA,CAACE,sCAAAA,QAAD;MAAQ,SAAQ;MAAU,MAAK;MAAK,WAAWF,gCAAI;MAAiB,iBAAc;MAAU,iBAAe;MAAM,eAAe;OAAE,SAAQ,YAAW,CAAC,OAAO;OAAG,SAAS,EAAE;MAAE;gBAA7K,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,UAAU,QAAQ,MAAY,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAACO,sCAAAA,0BAAD,CAA2B,CAAA,CAC3D;SACP,OACC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWP,gCAAI;gBAApB,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;OAAO,WAAA;OAAU,MAAK;OAAS,OAAO;OAAO,WAAU,UAAS,SAAS,MAAM,OAAO,KAAK;OAAG,aAAY;OAAY,cAAW;MAAS,CAAA,GAC1I,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,MAAK;OAAU,cAAW;iBAA/B,CACG,SAAS,KAAI,WACZ,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;QAA8B,MAAK;QAAS,MAAK;QAAS,iBAAe,OAAO,aAAa;QAAO,eAAe;SAAE,SAAS,OAAO,QAAQ;SAAG,QAAQ,KAAK;SAAG,SAAS,EAAE;QAAE;kBAA7K,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,OAAO,KAAa,CAAA,GAAE,OAAO,SAAS,OAAO,YAAY,OAAO,aAAa,kBAAkB,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,OAAO,SAAgB,CAAA,IAAI,IACrI;UAFK,OAAO,QAEZ,CACT,GACA,SAAS,WAAW,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAG,WAAW,CAAA,IAAI,IACxC;QACF;UACH,IACD;MACF;;EAET;EAEA,SAAS,2BAA2B,EAAE,KAAK,WAAW,eAAuF;GAC3I,MAAM,UAAU,aAAY,UAAS;IACnC,MAAM,UAAU,MAAM,KAAK;IAC3B,MAAM,QAAQ,SAAS,SAAS,SAAS,gBAAgB;IACzD,MAAM,QAAQ,wBAAwB,KAAK,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK;IAC7D,IAAI,CAAC,OAAO,OAAO;IAGnB,OAAO,gBAAgB,KAAK,MAAM,YAAY,QAAQ;GACxD,CAAC;GACD,MAAM,CAAC,UAAU,gBAAA,GAAA,MAAA,SAAA,CAAwB,KAAK;GAC9C,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,SAAA,CAAuB,KAAK;GAC5C,MAAM,CAAC,eAAe,qBAAA,GAAA,MAAA,SAAA,CAA6B,KAAK;GACxD,MAAM,CAAC,iBAAiB,uBAAA,GAAA,MAAA,SAAA,CAAsD;IAC5E,eAAe;IACf,WAAW;IACX,aAAa,CAAC;GAChB,CAAC;GACD,MAAM,CAAC,iBAAiB,uBAAA,GAAA,MAAA,SAAA,CAA8C,IAAI;GAE1E,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,CAAC,SAAS;IACd,MAAM,aAAa,IAAI,gBAAgB;IACvC,WAAW,IAAI;IACf,mBAAmB,IAAI;IACvB,mBAAmB;KAAE,eAAe;KAAI,WAAW;KAAI,aAAa,CAAC;IAAE,CAAC;IACxE,MAAW,iCAAiC,mBAAmB,OAAO,KAAK;KACzE,SAAS,EAAE,QAAQ,mBAAmB;KACtC,QAAQ,WAAW;IACrB,CAAC,CAAC,CAAC,KAAK,OAAM,aAAY;KACxB,MAAM,OAAO,MAAM,SAAS,KAAK;KACjC,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,KAAK,SAAS,SAAS,SAAS,OAAO,EAAE;KAC3E,mBAAmB;MACjB,eAAe,KAAK,iBAAiB;MACrC,WAAW,KAAK,aAAa;MAC7B,aAAa,KAAK,eAAe,CAAC;KACpC,CAAC;IACH,CAAC,CAAC,CAAC,OAAM,UAAS;KAChB,IAAI,iBAAiB,SAAS,MAAM,SAAS,cAAc;KAC3D,mBAAmB,iBAAiB,QAAQ,MAAM,UAAU,YAAY;IAC1E,CAAC,CAAC,CAAC,cAAc;KACf,IAAI,CAAC,WAAW,OAAO,SAAS,WAAW,KAAK;IAClD,CAAC;IACD,aAAa,WAAW,MAAM;GAChC,GAAG,CAAC,OAAO,CAAC;GAEZ,IAAI,CAAC,SAAS,OAAO;GAErB,eAAe,aAAa,gBAAwB;IAClD,IAAI,eAAe;IACnB,YAAY,KAAK;IACjB,iBAAiB,IAAI;IACrB,mBAAmB,IAAI;IACvB,IAAI;KACF,MAAM,QAAQ,IAAI,gBAAgB,EAAE,YAAY,eAAe,CAAC;KAChE,MAAM,WAAW,MAAM,MAAM,gCAAgC,mBAAmB,OAAO,EAAE,GAAG,SAAS;MACnG,QAAQ;MACR,SAAS,EAAE,QAAQ,mBAAmB;KACxC,CAAC;KACD,MAAM,OAAO,MAAM,SAAS,KAAK;KAKjC,IAAI,CAAC,SAAS,IAAI;MAChB,MAAM,WAAW,gBAAgB,YAAY,MAAK,eAAc,WAAW,eAAe,cAAc;MACxG,MAAM,UAAU;OAAC,KAAK;OAAO,KAAK,SAAS;OAAQ,KAAK,SAAS;MAAM,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,IAAI;MAClG,MAAM,wBAAwB,kCAAkC,KAAK,OAAO;MAC5E,IAAI,UAAU,iBAAiB,SAAS,uBAAuB;OAC7D,MAAM,UAAU,IAAI,SAAS,QAAQ,SAAS,CAAC,EAAE;OACjD,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,+BAA+B;OAC7D,MAAM,SAAS;QACb,QAAQ,QAAQ;QAChB;QACA;QACA;QACA;QACA,YAAY,WAAW;OACzB,CAAC,CAAC,KAAK,IAAI;OACX,MAAM,WAAW,MAAM,QAAQ,OAAO,CAAC;QAAE,MAAM;QAAQ,MAAM;OAAO,CAAC,GAAG,OAAO;OAC/E,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,gBAAgB,SAAS,MAAM,SAAS;OAC1E,mBAAmB,6BAA6B;OAChD;MACF;MACA,MAAM,IAAI,MAAM,WAAW,SAAS,SAAS,OAAO,EAAE;KACxD;KACA,MAAM,sBAAsB,MAAM,MAAM,iCAAiC,mBAAmB,OAAO,KAAK,EACtG,SAAS,EAAE,QAAQ,mBAAmB,EACxC,CAAC;KACD,MAAM,kBAAkB,MAAM,oBAAoB,KAAK;KACvD,IAAI,CAAC,oBAAoB,IACvB,MAAM,IAAI,MAAM,gBAAgB,SAAS,WAAW,oBAAoB,OAAO,EAAE;KAEnF,mBAAmB;MACjB,eAAe,gBAAgB,iBAAiB,KAAK,iBAAiB;MACtE,WAAW,gBAAgB,aAAa;MACxC,aAAa,gBAAgB,eAAe,CAAC;KAC/C,CAAC;IACH,SAAS,OAAO;KACd,mBAAmB,iBAAiB,QAAQ,MAAM,UAAU,UAAU;IACxE,UAAU;KACR,iBAAiB,KAAK;IACxB;GACF;GAEA,MAAM,uBAAuB,gBAAgB,YAAY,QAAO,eAAc,CAAC,WAAW,QAAQ;GAClG,MAAM,mBAAmB,iBAAiB,WAAW,QAAQ,MAAM;GACnE,MAAM,kBAAkB,kBACpB,mBAAmB,kBAAkB,UAAU,oBAC/C,UACE,eACA,qBAAqB,WAAW,IAC9B,QAAQ,gBAAgB,iBAAiB,KAAK,WAC9C,QAAQ,gBAAgB,iBAAiB;GACjD,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACG,sCAAAA,MAAD;IACE,MAAM;IACN,QAAA;IACA,OAAM;IACN,OAAO,gBAAgB,YAAY,KAAI,gBAAe;KACpD,IAAI,WAAW;KACf,OAAO,OAAO,WAAW;KACzB,UAAU,WAAW;IACvB,EAAE;IACF,WAAU,mBAAkB,KAAK,aAAa,cAAc;IAC5D,eAAe,YAAY,KAAK;IAChC,QACE,iBAAA,GAAA,kBAAA,IAAA,CAACD,sCAAAA,QAAD;KACE,SAAQ;KACR,MAAK;KACL,WAAWF,gCAAI;KACf,OAAO;KACP,cAAY;KACZ,iBAAc;KACd,iBAAe;KACf,UAAU,WAAW,iBAAiB,qBAAqB,WAAW;KACtE,eAAe,aAAY,SAAQ,CAAC,IAAI;eAEvC,iBAAiB,oBAAoB,kBAClC,gBAAgB,UAAU,mBAAmB,WAAW,SAExD,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;MACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,gCAAI;iBAAmB;MAAQ,CAAA;MAChD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,gBAAgB,iBAAiB,OAAe,CAAA;MACxD,qBAAqB,SAAS,IAC7B,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,gCAAI;QAAmB,eAAY;OAAQ,CAAA;OAC5D,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,gCAAI;kBAAkB;OAAQ,CAAA;OAC/C,iBAAA,GAAA,kBAAA,IAAA,CAACO,sCAAAA,0BAAD,EAA0B,WAAWP,gCAAI,kBAAoB,CAAA;MAC7D,EAAA,CAAA,IACA;KACJ,EAAA,CAAA;IAEA,CAAA;GAEX,CAAA,GACD,iBAAA,GAAA,kBAAA,IAAA,CAACE,sCAAAA,QAAD;IACE,SAAQ;IACR,MAAK;IACL,OAAM;IACN,cAAY,UAAU;IACtB,UAAU,CAAC,gBAAgB;IAC3B,eAAe,OAAO,KAAK,gBAAgB,WAAW,UAAU,qBAAqB;cACtF;GAEO,CAAA,CACR,EAAA,CAAA;EAEN;EAEA,MAAa,SAAS;GAAC;GAAS;GAAU;GAAY;EAAY;EAElE,SAAgB,MAAM,KAAoB;GACxC,IAAI,MAAM,OAAO,cAAc,IAAI,MAAM,SACvC;IAAE,MAAM;IAAQ,KAAK;IAAgB,IAAI;GAAqB,SACxD,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD,EAAuB,IAAM,CAAA,CACrC,CAAC;GACD,MAAM,sBAAsB;IAC1B,KAAK;KAAE,MAAM;KAAM,QAAQ;KAAO,OAAO;IAAK,CAAC;IAC/C,IAAI,OAAO,YAAY,cAAc;GACvC;GACA,IAAI,MAAM,OAAO,6CAA6C,IAAI,MAAM,SACtE;IAAE,MAAM;IAAuC,IAAI;IAAmB,OAAO;GAAG,IAChF,UAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,4BAAD;IAA4B,GAAI;IAAY;GAAM,CAAA,CAC7D,CAAC;GACD,IAAI,MAAM,OAAO,+BAA+B,IAAI,MAAM,SACxD;IAAE,MAAM;IAAyB,IAAI;GAAe,IACpD,UAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,mBAAD;IAAmB,GAAI;IAAsB;GAAgB,CAAA,CACxE,CAAC;GAGD,IAAI,MAAM,OAAO,6CAA6C,IAAI,MAAM,SACtE;IAAE,MAAM;IAAuC,IAAI;IAAuB,OAAO;GAAG,SAC9E,iBAAA,GAAA,kBAAA,IAAA,CAAC,yBAAD,EAAwC,cAAgB,CAAA,CAChE,CAAC;EACH"}
|
|
1
|
+
{"version":3,"file":"client.js","names":["css","prefix","browserStorage","css","css","css","Button","IconRefreshOutline16","css","Button","IconChevronDownOutline14","css","Button","errorText","Modal","css","Button","css","t","css","Toast","Modal","Button","css","Modal","Button","Menu","IconRefreshOutline16","IconCloseOutline16","Toast","IconCopyOutline16","IconChevronDownOutline14"],"sources":["../src/client/item-type-colors.ts","../src/client/TomatoLinkButton.tsx","../src/client/view-cache.ts","../src/client/PrAssistant.tsx","../src/team-metrics.ts","../src/client/Tag.tsx","../src/client/TeamManagement.tsx","../src/worktime-model.ts","../src/client/worktime-locale.ts","../src/client/AssigneePicker.tsx","../src/client/TaskBugs.tsx","../src/task-report-model.ts","../src/client/TaskReport.tsx","../src/client/RequirementPicker.tsx","../src/client/Worktime.tsx","../src/client/board-cache.ts","../src/client/TomatoBoard.tsx"],"sourcesContent":["const TYPE_TONES: Record<string, string> = {\n Story: '#2f7d72', EnablerStory: '#2777a8', Task: '#7b61a8', 跟踪任务: '#a14f78', Bug: '#c34f43', 缺陷: '#c34f43', 测试缺陷: '#d06438', Epic: '#9a6b24', Feature: '#3f68ad',\n}\nexport function typeTone(type: string): string {\n if (TYPE_TONES[type]) return TYPE_TONES[type]\n const palette = ['#2f7d72', '#2777a8', '#7b61a8', '#c34f43', '#9a6b24', '#51753a', '#a14f78']\n return palette[[...type].reduce((hash, char) => hash + char.charCodeAt(0), 0) % palette.length]!\n}\n","import css from './tomato-link-button.module.css'\n\n/** One external-item action, using the configured host and tenant on the server. */\nexport function TomatoLinkButton({ itemKey, disabled = false }: { itemKey: string; disabled?: boolean }) {\n return <button type=\"button\" className={css.button} disabled={disabled || !itemKey}\n title=\"在番茄中查看\" aria-label={`在番茄中查看 ${itemKey}`}\n onClick={event => {\n event.stopPropagation()\n window.open(`/api/tomato-board/open/${encodeURIComponent(itemKey)}`, '_blank', 'noopener,noreferrer')\n }}\n onKeyDown={event => { if (event.key === 'Enter' || event.key === ' ') event.stopPropagation() }}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M9 3h4v4M13 3 7 9M6 3H4a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1v-2\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n}\n","type CacheStorage = Pick<Storage, 'getItem' | 'setItem'>\nconst prefix = 'taskboard.tomatoViews.v1:'\nfunction browserStorage(): CacheStorage | null {\n try { return typeof window === 'undefined' ? null : window.localStorage } catch { return null }\n}\n/** Restore only a validated successful snapshot; storage is always optional. */\nexport function readViewCache<T>(key: string, validate: (value: unknown) => value is T, storage: CacheStorage | null = browserStorage()): T | null {\n try {\n const raw = storage?.getItem(prefix + encodeURIComponent(key))\n if (!raw || raw.length > 10_000_000) return null\n const value = JSON.parse(raw)\n return value?.version === 1 && Number.isFinite(value.updatedAt) && validate(value.data) ? value.data : null\n } catch { return null }\n}\nexport function writeViewCache<T>(key: string, data: T, storage: CacheStorage | null = browserStorage()): void {\n try {\n const value = JSON.stringify({ version: 1, updatedAt: Date.now(), data })\n if (value.length <= 10_000_000) storage?.setItem(prefix + encodeURIComponent(key), value)\n } catch { /* Preserve the last snapshot if storage is full or disabled. */ }\n}\n","import { useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport type { Context } from '@deepseek-ai/cordis'\nimport type { ModelCatalog, ModelSelection } from '@deepseek-ai/dsh-api-session-controller/types'\nimport type {} from '@deepseek-ai/dsh-api-session-controller/client'\nimport type {} from '@deepseek-ai/dsh-api-session-controller/remote'\nimport type { WorkspaceView } from '@deepseek-ai/dsh-api-workspace-controller/client'\nimport type {} from '@deepseek-ai/dsh-api-workspace-controller/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-layout/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-sidebar/client'\nimport css from './pr-assistant.module.css'\nimport { readViewCache, writeViewCache } from './view-cache.ts'\n\ninterface PullRequest {\n number: number\n title: string\n author: string\n updatedAt: string\n url: string\n draft: boolean\n conflictStatus: 'conflicting' | 'mergeable' | 'unknown'\n sourceBranch: string\n targetBranch: string\n}\n\ninterface RepositoryResult {\n workspaceId: WorkspaceView['workspaceId']\n workspaceTitle: string\n localPath: string\n provider?: 'github' | 'gitee'\n repository?: string\n url?: string\n openCount: number\n truncated?: boolean\n pullRequests: PullRequest[]\n error?: string\n}\n\nfunction isPrOverview(value: unknown): value is RepositoryResult[] {\n return Array.isArray(value) && value.length <= 2000 && value.every(repo => repo && typeof repo.workspaceId === 'string'\n && typeof repo.workspaceTitle === 'string' && typeof repo.localPath === 'string' && Number.isFinite(repo.openCount)\n && Array.isArray(repo.pullRequests) && repo.pullRequests.length <= 5000\n && repo.pullRequests.every((pr: PullRequest) => pr && Number.isInteger(pr.number) && typeof pr.title === 'string' && typeof pr.url === 'string'))\n}\n\ninterface PullRequestDetail {\n number: number\n title: string\n description: string\n author: string\n sourceBranch: string\n targetBranch: string\n url: string\n updatedAt: string\n commitCount: number | null\n additions: number\n deletions: number\n changedFiles: number\n conflictStatus: 'conflicting' | 'mergeable' | 'unknown'\n mergeStatus: string\n commits: Array<{\n sha: string\n title: string\n author: string\n committedAt: string\n url: string\n }>\n files: Array<{\n path: string\n previousPath: string\n additions: number\n deletions: number\n status: 'added' | 'deleted' | 'renamed' | 'modified'\n diff: string\n }>\n}\n\ninterface ReviewModel extends ModelSelection {\n key: string\n label: string\n providerName: string\n description?: string\n}\n\ninterface ReviewResult {\n text: string\n time: number\n}\n\ninterface ConflictLink {\n operationId: string\n sessionId: string\n path: string\n sourceBranch: string\n targetBranch: string\n sourceSha: string\n targetSha: string\n}\n\ninterface ConflictGitStatus {\n operationId: string\n sourceBranch: string\n targetBranch: string\n sourceSha: string\n targetSha: string\n currentBranch: string\n headSha: string\n clean: boolean\n unresolved: string[]\n targetMerged: boolean\n hasCommit: boolean\n pushReady: boolean\n changedFiles: Array<{ status: string; path: string }>\n commits: Array<{ sha: string; title: string }>\n diff: string\n diffTruncated: boolean\n}\n\nconst EMPTY_REVIEW_EVENTS = { entries: [], hasMore: false, revision: 0, change: { kind: 'replace' as const, entries: [] } }\n\nconst HIDDEN_REPOSITORIES_KEY = 'prAssistant.hiddenRepositories.v1'\nconst REVIEW_SESSION_LINKS_KEY = 'prAssistant.reviewSessionLinks.v1'\nconst CONFLICT_LINKS_KEY = 'prAssistant.conflictLinks.v1'\ntype HarnessSessionId = Parameters<Context['sessions']['binding']>[0]\n\nfunction reviewLinkKey(repository: RepositoryResult, pullRequest: PullRequest) {\n return `${repository.workspaceId}:${pullRequest.number}`\n}\n\nfunction readReviewSessionLinks(): Record<string, string> {\n try {\n const value = JSON.parse(window.localStorage.getItem(REVIEW_SESSION_LINKS_KEY) ?? '{}')\n return value && typeof value === 'object' ? value as Record<string, string> : {}\n } catch {\n return {}\n }\n}\n\nfunction linkedReviewSession(repository: RepositoryResult, pullRequest: PullRequest): HarnessSessionId | null {\n const value = readReviewSessionLinks()[reviewLinkKey(repository, pullRequest)]\n return typeof value === 'string' && value ? value as HarnessSessionId : null\n}\n\nfunction saveReviewSession(repository: RepositoryResult, pullRequest: PullRequest, sessionId: HarnessSessionId) {\n const links = readReviewSessionLinks()\n links[reviewLinkKey(repository, pullRequest)] = String(sessionId)\n window.localStorage.setItem(REVIEW_SESSION_LINKS_KEY, JSON.stringify(links))\n}\n\nfunction readConflictLinks(): Record<string, ConflictLink> {\n try {\n const value = JSON.parse(window.localStorage.getItem(CONFLICT_LINKS_KEY) ?? '{}')\n return value && typeof value === 'object' ? value as Record<string, ConflictLink> : {}\n } catch {\n return {}\n }\n}\n\nfunction conflictLink(repository: RepositoryResult, pullRequest: PullRequest): ConflictLink | null {\n const value = readConflictLinks()[reviewLinkKey(repository, pullRequest)]\n return value && typeof value.operationId === 'string' && typeof value.sessionId === 'string' ? value : null\n}\n\nfunction saveConflictLink(repository: RepositoryResult, pullRequest: PullRequest, value: ConflictLink) {\n const links = readConflictLinks()\n links[reviewLinkKey(repository, pullRequest)] = value\n window.localStorage.setItem(CONFLICT_LINKS_KEY, JSON.stringify(links))\n}\n\nfunction findReviewSession(ctx: Context, repository: RepositoryResult, pullRequest: PullRequest): HarnessSessionId | null {\n const snapshot = ctx.sessions.list.getSnapshot()\n // 只有至少跑过一轮对话的评审会话才算「已关联」:blank 会话(创建后没跑起来、\n // 流程失败留下的空壳等)不拦截入口,让它走选项目的新建评审流程。\n const hasConversation = (id: HarnessSessionId) => snapshot.byId[id]?.blank === false\n const linked = linkedReviewSession(repository, pullRequest)\n if (linked && hasConversation(linked)) return linked\n const expectedTitle = `[PR #${pullRequest.number}] ${pullRequest.title}`\n return snapshot.ids.find(id => {\n const summary = snapshot.byId[id]\n return summary?.title === expectedTitle && summary.cwd === repository.localPath && summary.blank === false\n }) ?? null\n}\n\nfunction useReviewResult(ctx: Context, sessionId: HarnessSessionId | null): ReviewResult | null {\n const binding = sessionId ? ctx.sessions.binding(sessionId) : undefined\n const source = binding?.eventSource\n const window = useSyncExternalStore(\n listener => source?.subscribe(listener) ?? (() => {}),\n () => source?.getSnapshot() ?? EMPTY_REVIEW_EVENTS,\n () => source?.getSnapshot() ?? EMPTY_REVIEW_EVENTS,\n )\n const running = useSyncExternalStore(\n listener => binding?.session.subscribe(listener) ?? (() => {}),\n () => binding?.session.getSnapshot().running ?? false,\n () => binding?.session.getSnapshot().running ?? false,\n )\n if (running) return null\n for (let index = window.entries.length - 1; index >= 0; index -= 1) {\n const entry = window.entries[index]\n if (entry?.type !== 'event' || entry.event.type !== 'assistant/message') continue\n const text = entry.event.data.message.content\n .filter(block => block.type === 'text')\n .map(block => block.text)\n .join('\\n')\n .trim()\n if (text) return { text, time: entry.event.time }\n }\n return null\n}\n\nfunction readHiddenRepositories() {\n try {\n const value = JSON.parse(window.localStorage.getItem(HIDDEN_REPOSITORIES_KEY) ?? '[]')\n return new Set(Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : [])\n } catch {\n return new Set<string>()\n }\n}\n\nfunction relativeTime(value: string) {\n const elapsed = Date.now() - new Date(value).getTime()\n if (!Number.isFinite(elapsed)) return ''\n const hours = Math.max(0, Math.floor(elapsed / 3_600_000))\n if (hours < 1) return '刚刚更新'\n if (hours < 24) return `${hours} 小时前`\n return `${Math.floor(hours / 24)} 天前`\n}\n\nasync function copyToClipboard(text: string): Promise<boolean> {\n try {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text)\n return true\n }\n } catch { /* fall through to legacy path */ }\n try {\n const textarea = document.createElement('textarea')\n textarea.value = text\n textarea.style.position = 'fixed'\n textarea.style.opacity = '0'\n document.body.appendChild(textarea)\n textarea.select()\n const ok = document.execCommand('copy')\n document.body.removeChild(textarea)\n return ok\n } catch {\n return false\n }\n}\n\nasync function inspectWorkspace(workspace: WorkspaceView): Promise<RepositoryResult> {\n try {\n const query = new URLSearchParams({ path: workspace.path })\n const response = await fetch(`/api/tomato-board/pr/repository?${query}`, { headers: { accept: 'application/json' } })\n const body = await response.json() as Omit<RepositoryResult, 'workspaceId' | 'workspaceTitle'> & { error?: string }\n if (!response.ok) throw new Error(body.error || `请求失败 (${response.status})`)\n return { ...body, workspaceId: workspace.workspaceId, workspaceTitle: workspace.title, localPath: workspace.path }\n } catch (error) {\n return {\n workspaceId: workspace.workspaceId,\n workspaceTitle: workspace.title,\n localPath: workspace.path,\n openCount: 0,\n pullRequests: [],\n error: error instanceof Error ? error.message : '仓库读取失败',\n }\n }\n}\n\nasync function inspectWorkspaces(workspaces: readonly WorkspaceView[], concurrency = 4) {\n const results = new Array<RepositoryResult>(workspaces.length)\n let cursor = 0\n await Promise.all(Array.from({ length: Math.min(concurrency, workspaces.length) }, async () => {\n while (cursor < workspaces.length) {\n const index = cursor\n cursor += 1\n const workspace = workspaces[index]\n if (!workspace) break\n results[index] = await inspectWorkspace(workspace)\n }\n }))\n return results\n}\n\nfunction FileDiff({ diff }: { diff: string }) {\n if (!diff) return <div className={css.diffUnavailable}>该文件没有可展示的文本差异,可能是二进制文件或平台省略了补丁。</div>\n return <pre className={css.diffBlock}>{diff.split('\\n').map((line, index) => (\n <span className={line.startsWith('+') ? css.diffAdd : line.startsWith('-') ? css.diffDelete : line.startsWith('@@') ? css.diffHunk : undefined} key={index}>{line || ' '}\\n</span>\n ))}</pre>\n}\n\ninterface CommitDetail {\n sha: string\n files: NonNullable<PullRequestDetail['files']>\n}\n\ntype CommitSummary = PullRequestDetail['commits'][number]\n\nasync function readApiJson<T>(response: Response): Promise<T> {\n const text = await response.text()\n let body: T & { error?: string }\n try {\n body = JSON.parse(text) as T & { error?: string }\n } catch {\n if (response.status === 404) throw new Error('提交详情接口尚未加载,请重启 Harness Desktop 后重试')\n throw new Error(text.trim() || `接口返回了无效数据 (${response.status})`)\n }\n if (!response.ok) throw new Error(body.error || `请求失败 (${response.status})`)\n return body\n}\n\nfunction CommitRow({ commit, repositoryPath }: { commit: CommitSummary; repositoryPath: string }) {\n const [open, setOpen] = useState(false)\n const [files, setFiles] = useState<CommitDetail['files'] | null>(null)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [copied, setCopied] = useState(false)\n\n useEffect(() => {\n if (!open || files || loading) return\n const controller = new AbortController()\n setLoading(true)\n setError(null)\n const query = new URLSearchParams({ path: repositoryPath, sha: commit.sha })\n void fetch(`/api/tomato-board/pr/commit?${query}`, {\n headers: { accept: 'application/json' },\n signal: controller.signal,\n }).then(async response => {\n const body = await readApiJson<CommitDetail>(response)\n setFiles(body.files ?? [])\n }).catch(reason => {\n if (reason instanceof Error && reason.name === 'AbortError') return\n setError(reason instanceof Error ? reason.message : '提交详情读取失败')\n }).finally(() => {\n if (!controller.signal.aborted) setLoading(false)\n })\n return () => controller.abort()\n }, [commit.sha, files, open, repositoryPath])\n\n async function copySha() {\n if (await copyToClipboard(commit.sha)) {\n setCopied(true)\n }\n }\n\n return (\n <li>\n <div className={css.commitRow}>\n <button\n className={css.commitMain}\n type=\"button\"\n aria-expanded={open}\n title={open ? '收起提交详情' : '展开提交详情'}\n onClick={() => setOpen(value => !value)}\n >\n <span className={css.disclosureIcon} aria-hidden=\"true\"><svg viewBox=\"0 0 12 12\"><path d=\"m4.5 2.5 3.5 3.5-3.5 3.5\" /></svg></span>\n <div className={css.commitMeta}>\n <strong>{commit.title || '无提交说明'}</strong>\n <span>{commit.author || '未知作者'} · {relativeTime(commit.committedAt)}</span>\n </div>\n </button>\n <button\n className={css.commitShaButton}\n type=\"button\"\n title={copied ? '已复制' : '复制完整 commit hash'}\n aria-label={copied ? `已复制 ${commit.sha}` : `复制 ${commit.sha}`}\n aria-pressed={copied}\n onClick={() => void copySha()}\n >\n <code>{commit.sha.slice(0, 7)}</code>\n <span className={css.commitShaCopyHint} aria-hidden=\"true\">{copied ? '✓' : '⧉'}</span>\n </button>\n {commit.url ? (\n <button\n className={css.commitExternal}\n type=\"button\"\n aria-label=\"打开提交\"\n title=\"打开提交\"\n onClick={() => window.open(commit.url, '_blank', 'noopener,noreferrer')}\n >\n ↗\n </button>\n ) : null}\n </div>\n {open ? (\n <div className={css.commitBody}>\n {loading ? <div className={css.commitState}>正在读取提交变更…</div> : null}\n {error ? <div className={css.commitState} role=\"alert\">{error}</div> : null}\n {files ? (\n files.length ? (\n <ol className={css.commitFiles}>\n {files.map(file => (\n <li key={`${file.previousPath}:${file.path}`}>\n <details>\n <summary>\n <span className={css.disclosureIcon} aria-hidden=\"true\"><svg viewBox=\"0 0 12 12\"><path d=\"m4.5 2.5 3.5 3.5-3.5 3.5\" /></svg></span>\n <span className={css.fileStatus}>{file.status === 'added' ? 'A' : file.status === 'deleted' ? 'D' : file.status === 'renamed' ? 'R' : 'M'}</span>\n <code>{file.path}</code>\n <span className={css.fileCounts}><i>+{file.additions}</i><b>−{file.deletions}</b></span>\n </summary>\n <FileDiff diff={file.diff} />\n </details>\n </li>\n ))}\n </ol>\n ) : <div className={css.commitState}>该提交没有可展示的文件变更。</div>\n ) : null}\n </div>\n ) : null}\n </li>\n )\n}\n\nfunction CommitView({ commits, repositoryPath }: { commits: CommitSummary[]; repositoryPath: string }) {\n return (\n <section className={css.commitView}>\n <h3>按提交查看 <span>{commits.length}</span></h3>\n <ol className={css.commitList}>\n {commits.map(commit => (\n <CommitRow key={commit.sha} commit={commit} repositoryPath={repositoryPath} />\n ))}\n </ol>\n </section>\n )\n}\n\nfunction conflictLabel(detail: PullRequestDetail) {\n if (detail.conflictStatus === 'conflicting') return '存在冲突'\n if (detail.conflictStatus === 'mergeable') return '无冲突'\n return '待平台检测'\n}\n\nfunction buildReviewPrompt(repository: RepositoryResult, pullRequest: PullRequest, detail: PullRequestDetail) {\n const commits = detail.commits.length\n ? detail.commits.map((commit, index) => `${index + 1}. ${commit.sha.slice(0, 12)} ${commit.title || '无提交说明'}(${commit.author || '未知作者'})`).join('\\n')\n : '提交信息暂不可用。'\n const description = detail.description.trim() || '未提供 PR 说明。'\n const platformCommand = repository.provider === 'gitee'\n ? `如需补充证据,可使用只读命令 gitee code pr view ${pullRequest.number} 和 gitee code pr diff ${pullRequest.number}。`\n : `如需补充证据,可使用 GitHub API 或当前可用的 GitHub 工具读取 PR #${pullRequest.number} 的完整 diff。`\n\n return [\n `请对当前仓库的 PR #${pullRequest.number} 做一次严格的代码评审。`,\n `标题:${detail.title}`,\n `分支:${detail.sourceBranch} → ${detail.targetBranch}`,\n `PR 说明:\\n${description}`,\n `当前摘要:${detail.changedFiles} 个文件,+${detail.additions}/-${detail.deletions},合并状态:${conflictLabel(detail)}${detail.mergeStatus ? `(平台原始状态:${detail.mergeStatus})` : ''}。`,\n `本 PR 的提交记录(共 ${detail.commitCount ?? detail.commits.length} 个):\\n${commits}`,\n '先结合 PR 说明和每条 commit 的标题理解需求目标与实现演进,再检查最终 diff。不要把明确属于需求目标的行为变化本身当成风险;只有当实现偏离目标、破坏既有约束,或存在可复现缺陷时才报告。commit 信息用于理解意图,不能替代代码证据。',\n platformCommand,\n '重点检查正确性、回归风险、安全性、并发/状态一致性、边界条件、性能和缺失测试。',\n '只报告可以用代码证据证明的问题;每条问题标注严重级别、文件路径、紧凑行号范围、触发场景和修复建议。',\n '回复必须简明且仅保留必要信息:不要复述 PR 背景、检查过程或给出泛化建议;每个问题最多一个短段落。',\n '如果没有发现问题,只回复“未发现明确问题”,必要时再用一行列出关键未验证风险。',\n '本次只做只读评审;不要修改代码、提交分支、合并 PR 或向代码平台发表评论,除非我之后明确授权。',\n ].join('\\n')\n}\n\nfunction buildConflictPrompt(pullRequest: PullRequest, operation: ConflictLink) {\n return [\n `请在当前本地仓库中处理 PR #${pullRequest.number} 的合并冲突。`,\n `源分支:${operation.sourceBranch}(预检版本 ${operation.sourceSha})`,\n `目标分支:${operation.targetBranch}(预检版本 ${operation.targetSha})`,\n '你已获得修改仓库的授权,但绝对不要 push、force push、rebase、reset --hard 或清理用户文件。',\n `第一步确认仓库路径为 ${operation.path},执行 git status,并切换/确认当前分支必须是 ${operation.sourceBranch};若不一致或工作区不干净,立即停止并说明。`,\n `使用锁定的目标提交 ${operation.targetSha} 合并到当前源分支(git merge --no-ff --no-commit ${operation.targetSha}),逐项解决冲突。`,\n '理解源分支与目标分支双方意图后再解决,不得简单选择 ours/theirs 覆盖;解决后检查不存在未合并文件,并运行 git diff --check。',\n '识别并运行与改动相关的仓库测试或类型检查;如果测试失败,修复后重试。无法运行的测试必须明确说明原因。',\n `确认无未解决冲突后提交,提交标题使用“Resolve conflicts for PR #${pullRequest.number}”。只提交本次冲突处理产生的修改。`,\n '最终回复必须包含:1. 提交 hash;2. 测试命令及结果;3. 修改位置(文件及关键区域);4. 每处冲突的处理逻辑。不要执行 push,推送由用户在 PR 助手中确认。',\n ].join('\\n')\n}\n\nfunction flattenModels(catalog: ModelCatalog): ReviewModel[] {\n const models: ReviewModel[] = []\n const routableProviders = new Set(catalog.routableProviders)\n for (const group of catalog.groups) {\n if (!routableProviders.has(group.id)) continue\n for (const model of group.models) {\n models.push({\n key: `${group.id}\\u0000${model.id}`,\n provider: group.id,\n model: model.id,\n label: model.name,\n providerName: group.name,\n ...(model.description ? { description: model.description } : {}),\n ...(model.reasoning?.defaultEffort ? { reasoningEffort: model.reasoning.defaultEffort } : {}),\n })\n }\n }\n return models\n}\n\nfunction AiReviewDialog({\n ctx, repository, pullRequest, detail, onClose, onStarted,\n}: {\n ctx: Context\n repository: RepositoryResult\n pullRequest: PullRequest\n detail: PullRequestDetail\n onClose: () => void\n onStarted: () => void\n}) {\n const [models, setModels] = useState<ReviewModel[]>([])\n const [selectedKey, setSelectedKey] = useState('')\n const [loading, setLoading] = useState(true)\n const [starting, setStarting] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let active = true\n void ctx.remote.session.modelCatalog().then(result => {\n if (!active) return\n if (!result.ok) throw new Error(`${result.error.code}: ${result.error.message}`)\n const next = flattenModels(result.value)\n setModels(next)\n const preferred = next.find(model => model.provider === result.value.default.provider && model.model === result.value.default.model)\n setSelectedKey(preferred?.key ?? next[0]?.key ?? '')\n }).catch(reason => {\n if (active) setError(reason instanceof Error ? reason.message : '模型列表读取失败')\n }).finally(() => {\n if (active) setLoading(false)\n })\n return () => { active = false }\n }, [ctx])\n\n async function startReview() {\n const selected = models.find(model => model.key === selectedKey)\n if (!selected || starting) return\n setStarting(true)\n setError(null)\n try {\n const sessionId = await ctx.sessions.create({ workspaceId: repository.workspaceId })\n const selectedResult = await ctx.remote.session.selectModel({\n sessionId,\n provider: selected.provider,\n model: selected.model,\n ...(selected.reasoningEffort ? { reasoningEffort: selected.reasoningEffort } : {}),\n })\n if (!selectedResult.ok) throw new Error(`模型选择失败:${selectedResult.error.message}`)\n const session = ctx.sessions.binding(sessionId)?.session\n if (!session) throw new Error('新建评审对话未能在 Harness 中加载')\n const renamed = await session.rename(`[PR #${pullRequest.number}] ${pullRequest.title}`)\n if (!renamed.ok) throw new Error(`评审对话命名失败:${renamed.error.message}`)\n const prompt = buildReviewPrompt(repository, pullRequest, detail)\n const prompted = await session.prompt([{ type: 'text', text: prompt }], 'queue')\n if (!prompted.ok) throw new Error(`评审任务发送失败:${prompted.error.message}`)\n saveReviewSession(repository, pullRequest, sessionId)\n ctx.sessions.open(sessionId)\n onStarted()\n } catch (reason) {\n setError(reason instanceof Error ? reason.message : 'AI 评审启动失败')\n } finally {\n setStarting(false)\n }\n }\n\n const selected = models.find(model => model.key === selectedKey)\n return (\n <div className={css.modalBackdrop} role=\"presentation\" onMouseDown={event => {\n if (event.target === event.currentTarget) onClose()\n }}>\n <section className={css.reviewDialog} role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"ai-review-title\">\n <span className={css.eyebrow}>AI CODE REVIEW</span>\n <h2 id=\"ai-review-title\">选择评审模型</h2>\n <p>将为 {repository.repository} 的 PR #{pullRequest.number} 创建一个只读评审对话。</p>\n {error ? <div className={css.reviewError} role=\"alert\">{error}</div> : null}\n <label className={css.modelField}>\n <span>Harness 模型</span>\n <select disabled={loading || starting} value={selectedKey} onChange={event => setSelectedKey(event.target.value)}>\n {models.map(model => <option key={model.key} value={model.key}>{model.providerName} · {model.label}</option>)}\n </select>\n </label>\n <div className={css.modelHint}>{loading ? '正在读取可用模型…' : selected?.description || selected?.providerName || '没有可用模型'}</div>\n <footer>\n <button type=\"button\" disabled={starting} onClick={onClose}>取消</button>\n <button type=\"button\" disabled={!selected || loading || starting} onClick={() => void startReview()}>{starting ? '正在创建…' : '开始 AI 评审'}</button>\n </footer>\n </section>\n </div>\n )\n}\n\nexport function PrAssistant({ ctx, close, active: visible = true }: { ctx: Context; close: () => void; active?: boolean }) {\n const panelRef = useRef<HTMLElement>(null)\n const refreshGeneration = useRef(0)\n const workspaces = useSyncExternalStore(\n listener => ctx.workspaces.list.subscribe(listener),\n () => ctx.workspaces.list.getSnapshot(),\n () => ctx.workspaces.list.getSnapshot(),\n )\n const overviewKey = 'pr-overview:' + JSON.stringify(workspaces.items.map(workspace => [workspace.workspaceId, workspace.path]).sort())\n const overviewScope = useRef(overviewKey)\n const detailCache = useRef(new Map<string, PullRequestDetail>())\n const [results, setResults] = useState<RepositoryResult[]>(() => readViewCache(overviewKey, isPrOverview) ?? [])\n const resultsRef = useRef(results)\n resultsRef.current = results\n const [loading, setLoading] = useState(false)\n const [query, setQuery] = useState('')\n const [hiddenRepositories, setHiddenRepositories] = useState(readHiddenRepositories)\n const [restoreOpen, setRestoreOpen] = useState(false)\n const [restoreWorkspaceId, setRestoreWorkspaceId] = useState('')\n const [selection, setSelection] = useState<{ repository: RepositoryResult; pullRequest: PullRequest } | null>(null)\n const [detail, setDetail] = useState<PullRequestDetail | null>(null)\n const [detailLoading, setDetailLoading] = useState(false)\n const [detailError, setDetailError] = useState<string | null>(null)\n const [reviewOpen, setReviewOpen] = useState(false)\n const [commitView, setCommitView] = useState(false)\n const [conflict, setConflict] = useState<ConflictLink | null>(null)\n const [conflictStatus, setConflictStatus] = useState<ConflictGitStatus | null>(null)\n const [conflictBusy, setConflictBusy] = useState(false)\n const [conflictError, setConflictError] = useState<string | null>(null)\n const [pushed, setPushed] = useState(false)\n const [commentBusy, setCommentBusy] = useState(false)\n const [commentStatus, setCommentStatus] = useState<string | null>(null)\n\n\n async function refresh() {\n const generation = ++refreshGeneration.current\n setLoading(true)\n try {\n const next = await inspectWorkspaces(workspaces.items)\n if (generation === refreshGeneration.current) {\n const merged = next.map(repo => {\n const previous = resultsRef.current.find(value => value.workspaceId === repo.workspaceId && value.localPath === repo.localPath)\n return repo.error && previous ? { ...previous, error: repo.error } : repo\n })\n setResults(merged)\n if (next.some(repo => !repo.error) || next.length === 0) writeViewCache(overviewKey, merged)\n }\n } finally {\n if (generation === refreshGeneration.current) setLoading(false)\n }\n }\n\n useEffect(() => {\n if (!visible) return\n if (overviewScope.current !== overviewKey) {\n overviewScope.current = overviewKey\n setResults(readViewCache(overviewKey, isPrOverview) ?? [])\n }\n void refresh()\n return () => { refreshGeneration.current += 1 }\n }, [workspaces.items, overviewKey, visible])\n useEffect(() => {\n if (!visible || !selection) return\n const cacheKey = JSON.stringify([selection.repository.localPath, selection.pullRequest.number])\n const controller = new AbortController()\n const query = new URLSearchParams({ path: selection.repository.localPath, number: String(selection.pullRequest.number), _t: String(Date.now()) })\n setDetail(detailCache.current.get(cacheKey) ?? null)\n setDetailError(null)\n setDetailLoading(true)\n void fetch(`/api/tomato-board/pr/pull-request?${query}`, {\n headers: { accept: 'application/json' },\n signal: controller.signal,\n }).then(async response => {\n const body = await response.json() as PullRequestDetail & { error?: string }\n if (!response.ok) throw new Error(body.error || `请求失败 (${response.status})`)\n if (!controller.signal.aborted) {\n if (detailCache.current.size >= 20) detailCache.current.delete(detailCache.current.keys().next().value!)\n detailCache.current.set(cacheKey, body)\n setDetail(body)\n }\n }).catch(error => {\n if (error instanceof Error && error.name === 'AbortError') return\n setDetailError(error instanceof Error ? error.message : 'PR 详情读取失败')\n }).finally(() => {\n if (!controller.signal.aborted) setDetailLoading(false)\n })\n return () => controller.abort()\n }, [selection, visible])\n useEffect(() => {\n setCommitView(false)\n setConflict(selection ? conflictLink(selection.repository, selection.pullRequest) : null)\n setConflictStatus(null)\n setConflictError(null)\n setPushed(false)\n setCommentStatus(null)\n }, [selection])\n useEffect(() => {\n if (!visible || !conflict) return\n let active = true\n let timer: number | undefined\n const refreshStatus = async () => {\n try {\n const query = new URLSearchParams({ operationId: conflict.operationId })\n const status = await readApiJson<ConflictGitStatus>(await fetch(`/api/tomato-board/pr/conflict/status?${query}`, { headers: { accept: 'application/json' } }))\n if (active) setConflictStatus(status)\n } catch (reason) {\n if (active) setConflictError(reason instanceof Error ? reason.message : '冲突处理状态读取失败')\n }\n if (active) timer = window.setTimeout(refreshStatus, 2000)\n }\n void refreshStatus()\n return () => { active = false; if (timer !== undefined) window.clearTimeout(timer) }\n }, [conflict, visible])\n\n\n const filtered = useMemo(() => {\n const needle = query.trim().toLowerCase()\n const visible = results.filter(result => !hiddenRepositories.has(result.workspaceId))\n if (!needle) return visible\n return visible.filter(result => [result.workspaceTitle, result.repository, result.provider]\n .some(value => value?.toLowerCase().includes(needle)))\n }, [hiddenRepositories, query, results])\n const visibleResults = results.filter(result => !hiddenRepositories.has(result.workspaceId))\n const total = visibleResults.reduce((sum, result) => sum + result.openCount, 0)\n const healthy = visibleResults.filter(result => !result.error).length\n\n function hideRepository(workspaceId: string) {\n setHiddenRepositories(current => {\n const next = new Set(current).add(workspaceId)\n window.localStorage.setItem(HIDDEN_REPOSITORIES_KEY, JSON.stringify([...next]))\n return next\n })\n }\n\n function restoreRepository(workspaceId: string) {\n setHiddenRepositories(current => {\n const next = new Set(current)\n next.delete(workspaceId)\n window.localStorage.setItem(HIDDEN_REPOSITORIES_KEY, JSON.stringify([...next]))\n setRestoreOpen(false)\n setRestoreWorkspaceId('')\n return next\n })\n }\n\n async function publishReviewToPr() {\n if (!selection || !reviewResult || commentBusy) return\n if (reviewResult.text.length > 20_000) {\n setCommentStatus('AI 分析结果超过 20000 个字符,无法发布,请先在会话中精简内容。')\n return\n }\n if (!window.confirm(`确认将当前 AI 分析结果评论到 PR #${selection.pullRequest.number}?\\n\\n发布后会对仓库协作者可见。`)) return\n setCommentBusy(true)\n setCommentStatus(null)\n try {\n await readApiJson<{ published: true }>(await fetch('/api/tomato-board/pr/review/comment', {\n method: 'POST',\n headers: { accept: 'application/json', 'content-type': 'application/json', 'x-pr-assistant-action': '1' },\n body: JSON.stringify({\n path: selection.repository.localPath,\n number: selection.pullRequest.number,\n body: reviewResult.text,\n }),\n }))\n setCommentStatus('已成功评论到 PR。')\n } catch (reason) {\n setCommentStatus(reason instanceof Error ? reason.message : 'PR 评论发布失败')\n } finally {\n setCommentBusy(false)\n }\n }\n\n async function startConflictResolution() {\n if (!selection || !detail || conflictBusy) return\n setConflictBusy(true)\n setConflictError(null)\n try {\n const response = await fetch('/api/tomato-board/pr/conflict/preflight', {\n method: 'POST',\n headers: { accept: 'application/json', 'content-type': 'application/json', 'x-pr-assistant-action': '1' },\n body: JSON.stringify({ path: selection.repository.localPath, number: selection.pullRequest.number }),\n })\n const preflight = await readApiJson<Omit<ConflictLink, 'sessionId'>>(response)\n const sessionId = await ctx.sessions.create({ cwd: preflight.path })\n const catalog = await ctx.remote.session.modelCatalog()\n if (!catalog.ok) throw new Error(`模型列表读取失败:${catalog.error.message}`)\n const selected = catalog.value.default\n const selectedResult = await ctx.remote.session.selectModel({ sessionId, ...selected })\n if (!selectedResult.ok) throw new Error(`模型选择失败:${selectedResult.error.message}`)\n const session = ctx.sessions.binding(sessionId)?.session\n if (!session) throw new Error('新建冲突处理对话未能在 Harness 中加载')\n const renamed = await session.rename(`[PR #${selection.pullRequest.number}] 处理合并冲突`)\n if (!renamed.ok) throw new Error(`对话命名失败:${renamed.error.message}`)\n const link: ConflictLink = { ...preflight, sessionId: String(sessionId) }\n const prompted = await session.prompt([{ type: 'text', text: buildConflictPrompt(selection.pullRequest, link) }], 'queue')\n if (!prompted.ok) throw new Error(`冲突处理任务发送失败:${prompted.error.message}`)\n saveConflictLink(selection.repository, selection.pullRequest, link)\n setConflict(link)\n ctx.sessions.open(sessionId)\n } catch (reason) {\n setConflictError(reason instanceof Error ? reason.message : '冲突处理启动失败')\n } finally {\n setConflictBusy(false)\n }\n }\n\n async function pushConflictResolution() {\n if (!conflict || !conflictStatus?.pushReady || conflictBusy) return\n if (!window.confirm(`确认将 ${conflictStatus.headSha.slice(0, 12)} 推送到 origin/${conflict.sourceBranch}?`)) return\n setConflictBusy(true)\n setConflictError(null)\n try {\n await readApiJson<{ pushed: true }>(await fetch('/api/tomato-board/pr/conflict/push', {\n method: 'POST',\n headers: { accept: 'application/json', 'content-type': 'application/json', 'x-pr-assistant-action': '1' },\n body: JSON.stringify({ operationId: conflict.operationId, expectedHead: conflictStatus.headSha }),\n }))\n setPushed(true)\n } catch (reason) {\n setConflictError(reason instanceof Error ? reason.message : '推送失败')\n } finally {\n setConflictBusy(false)\n }\n }\n\n function openAiReview() {\n if (!selection) return\n setReviewOpen(true)\n }\n\n const linkedSessionId = selection ? findReviewSession(ctx, selection.repository, selection.pullRequest) : null\n const hasLinkedReview = linkedSessionId !== null\n const reviewResult = useReviewResult(ctx, linkedSessionId)\n const conflictSessionId = conflict?.sessionId as HarnessSessionId | undefined\n const conflictResult = useReviewResult(ctx, conflictSessionId ?? null)\n\n return (\n <section ref={panelRef} className={css.workbench} aria-label=\"PR 助手\">\n <header className={css.header}>\n <div className={css.headerIdentity}>\n <div className={css.titleRow}>\n {selection && commitView ? <button className={css.titleBack} type=\"button\" aria-label=\"返回 PR 详情\" title=\"返回 PR 详情\" onClick={() => setCommitView(false)}>←</button> : null}\n {selection && !commitView ? <button className={css.titleBack} type=\"button\" aria-label=\"返回 PR 列表\" title=\"返回 PR 列表\" onClick={() => setSelection(null)}>←</button> : null}\n <h1>{selection ? (commitView ? `#${selection.pullRequest.number} 按提交查看` : `#${selection.pullRequest.number} PR 详情`) : 'PR 助手'}</h1>\n </div>\n <p>{selection ? (commitView ? `${detail?.commits.length ?? 0} 个提交` : selection.repository.repository) : `${healthy} 个代码仓库 · ${total} 个待处理 PR`}</p>\n </div>\n <div className={css.actions}>\n {!selection ? (\n <>\n <label className={css.search}>\n <span aria-hidden=\"true\">⌕</span>\n <input value={query} onChange={event => setQuery(event.target.value)} placeholder=\"搜索仓库\" />\n </label>\n <button type=\"button\" disabled={loading} onClick={() => void refresh()}>{loading ? '同步中…' : '刷新'}</button>\n {hiddenRepositories.size ? <button type=\"button\" onClick={() => { setRestoreWorkspaceId(''); setRestoreOpen(true) }}>恢复隐藏 ({hiddenRepositories.size})</button> : null}\n </>\n ) : null}\n </div>\n </header>\n\n <div className={css.scrollArea}>\n {selection ? (\n <main className={css.detail}>\n {detailLoading && !detail ? <div className={css.detailState}>正在读取 PR 详情…</div> : null}\n {detailError ? <div className={css.detailState} role=\"alert\">{detailError}</div> : null}\n {detail ? (\n commitView ? (\n <CommitView commits={detail.commits} repositoryPath={selection.repository.localPath} />\n ) : (\n <>\n <section className={css.detailHero}>\n <div>\n <span>{detail.author} · {relativeTime(detail.updatedAt)}</span>\n <h2>{detail.title}</h2>\n <code>{detail.sourceBranch} → {detail.targetBranch}</code>\n </div>\n <div className={css.detailActions}>\n {detail.conflictStatus === 'conflicting' ? <button className={css.conflictButton} type=\"button\" disabled={conflictBusy} onClick={() => void startConflictResolution()}>{conflict ? '重新处理冲突' : conflictBusy ? '正在预检…' : '一键处理冲突'}</button> : null}\n <button className={css.reviewButton} type=\"button\" onClick={openAiReview}>{hasLinkedReview ? '重新分析' : 'AI 评审'}</button>\n <button type=\"button\" onClick={() => window.open(detail.url, '_blank', 'noopener,noreferrer')}>打开 PR ↗</button>\n </div>\n </section>\n <section className={css.detailStats}>\n <button className={css.commitStat} type=\"button\" disabled={detail.commitCount === null} onClick={() => setCommitView(true)}><strong>{detail.commitCount ?? '—'}</strong><span>{detail.commitCount === null ? '提交数暂不可用' : '提交 · 点击查看'}</span></button>\n <div><strong>{detail.changedFiles}</strong><span>变更文件</span></div>\n <div><strong className={css.addition}>+{detail.additions}</strong><span>新增行</span></div>\n <div><strong className={css.deletion}>−{detail.deletions}</strong><span>删除行</span></div>\n <div title={detail.mergeStatus ? `平台状态:${detail.mergeStatus}` : undefined}><strong className={detail.conflictStatus === 'conflicting' ? css.conflict : detail.conflictStatus === 'mergeable' ? css.clean : css.unknown}>{conflictLabel(detail)}</strong><span>冲突状态</span></div>\n </section>\n {detail.description ? <section className={css.description}><h3>说明</h3><p>{detail.description}</p></section> : null}\n {conflict || conflictError ? (\n <section className={css.conflictResult}>\n <header>\n <div><span className={css.eyebrow}>CONFLICT RESOLUTION</span><h3>冲突处理</h3></div>\n <div className={css.conflictResultActions}>\n {conflictSessionId ? <button type=\"button\" onClick={() => { ctx.sessions.open(conflictSessionId); close() }}>打开处理会话 ↗</button> : null}\n {conflictStatus?.pushReady && !pushed ? <button className={css.pushButton} type=\"button\" disabled={conflictBusy} onClick={() => void pushConflictResolution()}>{conflictBusy ? '推送中…' : `Push 到 ${conflictStatus.sourceBranch}`}</button> : null}\n </div>\n </header>\n {conflictError ? <div className={css.reviewError} role=\"alert\">{conflictError}</div> : null}\n {pushed ? <div className={css.conflictSuccess}>已成功推送到 origin/{conflict?.sourceBranch}</div> : null}\n {conflictStatus ? (\n <div className={css.conflictFacts}>\n <span>当前分支 <code>{conflictStatus.currentBranch || 'detached HEAD'}</code></span>\n <span>工作区 {conflictStatus.clean ? '干净' : '有未提交修改'}</span>\n <span>未解决冲突 {conflictStatus.unresolved.length}</span>\n <span>目标已合并 {conflictStatus.targetMerged ? '是' : '否'}</span>\n <span>提交 {conflictStatus.hasCommit ? conflictStatus.headSha.slice(0, 12) : '尚未生成'}</span>\n </div>\n ) : <div className={css.commitState}>正在读取仓库处理状态…</div>}\n {conflictStatus?.changedFiles.length ? <div className={css.conflictChanges}><h4>已提交修改位置</h4><ol>{conflictStatus.changedFiles.map(file => <li key={`${file.status}:${file.path}`}><b>{file.status}</b><code>{file.path}</code></li>)}</ol></div> : null}\n {conflictResult ? <div className={css.conflictLogic}><h4>AI 处理逻辑与测试结果</h4><pre>{conflictResult.text}</pre></div> : <div className={css.commitState}>AI 正在处理;完成后将在此回填修改位置、测试结果和处理逻辑。</div>}\n </section>\n ) : null}\n {reviewResult ? (\n <section className={css.reviewResult}>\n <header>\n <div><span className={css.eyebrow}>AI REVIEW</span><h3>AI 分析结果</h3></div>\n <div className={css.reviewResultActions}>\n <button type=\"button\" disabled={commentBusy} onClick={() => void publishReviewToPr()}>{commentBusy ? '发布中…' : '评论到 PR'}</button>\n <button type=\"button\" onClick={() => { if (linkedSessionId) { ctx.sessions.open(linkedSessionId); close() } }}>打开评审对话 ↗</button>\n </div>\n </header>\n {commentStatus ? <div className={commentStatus === '已成功评论到 PR。' ? css.commentSuccess : css.reviewError} role=\"status\">{commentStatus}</div> : null}\n <pre>{reviewResult.text}</pre>\n </section>\n ) : hasLinkedReview ? (\n <section className={css.reviewPending}>\n <span className={css.eyebrow}>AI REVIEW</span>\n <strong>AI 分析正在处理中</strong>\n <button type=\"button\" onClick={() => { if (linkedSessionId) { ctx.sessions.open(linkedSessionId); close() } }}>查看评审对话</button>\n </section>\n ) : null}\n <section className={css.files}>\n <h3>文件差异 <span>{detail.files.length}</span></h3>\n <ol>{detail.files.map(file => (\n <li key={`${file.previousPath}:${file.path}`}>\n <details>\n <summary>\n <span className={css.disclosureIcon} aria-hidden=\"true\"><svg viewBox=\"0 0 12 12\"><path d=\"m4.5 2.5 3.5 3.5-3.5 3.5\" /></svg></span>\n <span className={css.fileStatus}>{file.status === 'added' ? 'A' : file.status === 'deleted' ? 'D' : file.status === 'renamed' ? 'R' : 'M'}</span>\n <code>{file.path}</code>\n <span className={css.fileCounts}><i>+{file.additions}</i><b>−{file.deletions}</b></span>\n </summary>\n <FileDiff diff={file.diff} />\n </details>\n </li>\n ))}</ol>\n </section>\n </>\n )\n ) : null}\n </main>\n ) : (\n <main className={css.grid}>\n {filtered.map(result => (\n <article className={css.repo} key={result.workspaceId}>\n <div className={css.repoHeader}>\n <div className={css.repoIdentity}>\n <span className={css.provider}>{result.provider ?? 'GIT'}</span>\n <h2 title={result.repository ?? result.workspaceTitle}>{result.repository ?? result.workspaceTitle}</h2>\n </div>\n <div className={css.repoTools}>\n <span className={result.openCount ? css.countActive : css.count}>{result.openCount} 个 PR</span>\n <button className={css.hideRepo} type=\"button\" onClick={() => hideRepository(result.workspaceId)}>隐藏</button>\n </div>\n </div>\n {result.error && !result.pullRequests.length ? (\n <div className={css.error}><strong>无法读取</strong><span>{result.error}</span></div>\n ) : result.pullRequests.length ? (\n <ol className={css.prList}>\n {result.pullRequests.map(pr => (\n <li key={pr.number}>\n <div className={css.prRow}>\n <button className={css.prMain} type=\"button\" onClick={() => setSelection({ repository: result, pullRequest: pr })}>\n <span className={css.prNumber}>#{pr.number}</span>\n <span className={css.prTitle}>{pr.title}</span>\n {pr.draft ? <span className={css.draft}>草稿</span> : null}\n {pr.conflictStatus === 'conflicting' ? <span className={css.conflictTag}>冲突</span> : pr.conflictStatus === 'unknown' ? <span className={css.unknownTag}>待检测</span> : null}\n {pr.sourceBranch || pr.targetBranch ? (\n <span className={css.branches}>\n <span className={css.sourceBranch} title={`来源分支:${pr.sourceBranch || '未知'}`}><b>来源</b><code>{pr.sourceBranch || '未知'}</code></span>\n <span className={css.targetBranch} title={`目标分支:${pr.targetBranch || '未知'}`}><b>目标</b><code>{pr.targetBranch || '未知'}</code></span>\n </span>\n ) : null}\n <span className={css.meta}>{pr.author || '未知作者'} · {relativeTime(pr.updatedAt)}</span>\n </button>\n <button className={css.externalLink} type=\"button\" aria-label=\"打开 PR\" title=\"打开 PR\" onClick={() => window.open(pr.url, '_blank', 'noopener,noreferrer')}>\n <svg aria-hidden=\"true\" viewBox=\"0 0 16 16\"><path d=\"M6 3H3.8A1.8 1.8 0 0 0 2 4.8v7.4A1.8 1.8 0 0 0 3.8 14h7.4a1.8 1.8 0 0 0 1.8-1.8V10M9 2h5v5M14 2 7.5 8.5\" /></svg>\n </button>\n </div>\n </li>\n ))}\n </ol>\n ) : (\n <div className={css.empty}><span>✓</span><p>队列已清空</p><small>当前没有待处理的 PR</small></div>\n )}\n {result.truncated ? <p className={css.notice}>仅显示前 100 个 PR</p> : null}\n </article>\n ))}\n {!loading && filtered.length === 0 ? <div className={css.noResults}>没有匹配的仓库</div> : null}\n </main>\n )}</div>\n {reviewOpen && selection && detail ? (\n <AiReviewDialog\n ctx={ctx}\n repository={selection.repository}\n pullRequest={selection.pullRequest}\n detail={detail}\n onClose={() => setReviewOpen(false)}\n onStarted={close}\n />\n ) : null}\n {restoreOpen ? (\n <div className={css.modalBackdrop} role=\"presentation\" onMouseDown={event => { if (event.target === event.currentTarget) setRestoreOpen(false) }}>\n <section className={css.restoreDialog} role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"restore-repository-title\">\n <span className={css.eyebrow}>HIDDEN REPOSITORIES</span>\n <h2 id=\"restore-repository-title\">恢复隐藏仓库</h2>\n <p>选择一个仓库恢复到 PR 助手。</p>\n <ol>{results.filter(result => hiddenRepositories.has(result.workspaceId)).map(result => (\n <li key={result.workspaceId}>\n <label>\n <input type=\"radio\" name=\"restore-repository\" value={result.workspaceId} checked={restoreWorkspaceId === result.workspaceId} onChange={() => setRestoreWorkspaceId(result.workspaceId)} />\n <span><strong>{result.repository ?? result.workspaceTitle}</strong><small>{result.workspaceTitle}</small></span>\n </label>\n </li>\n ))}</ol>\n <footer>\n <button type=\"button\" onClick={() => setRestoreOpen(false)}>取消</button>\n <button type=\"button\" disabled={!restoreWorkspaceId} onClick={() => restoreRepository(restoreWorkspaceId)}>恢复所选仓库</button>\n </footer>\n </section>\n </div>\n ) : null}\n </section>\n )\n}\n","export interface TeamPeriod { start: string; end: string }\ntype Fields = Record<string, unknown>\nexport function teamDate(value: unknown): string {\n if (typeof value !== 'string' && typeof value !== 'number') return ''\n if (typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/u.test(value)) {\n const time = Date.parse(`${value}T00:00:00Z`)\n return Number.isFinite(time) && new Date(time).toISOString().slice(0, 10) === value ? value : ''\n }\n const time = typeof value === 'number' ? value : Date.parse(value)\n return Number.isFinite(time) ? new Date(time + 8 * 3600_000).toISOString().slice(0, 10) : ''\n}\nexport function teamPeriod(start: unknown, end: unknown): TeamPeriod {\n const period = { start: teamDate(start), end: teamDate(end) }\n if (!period.start || !period.end || period.end < period.start) throw new Error('迭代缺少有效起止日期,请先在番茄中补全')\n return period\n}\nconst amount = (raw: unknown): number | null => {\n if ((typeof raw !== 'number' && typeof raw !== 'string') || raw === '' || (typeof raw === 'string' && !raw.trim())) return null\n const value = Number(raw)\n return Number.isFinite(value) && value >= 0 ? value : null\n}\nconst days = (start: string, end: string) => Math.round((Date.parse(`${end}T00:00:00Z`) - Date.parse(`${start}T00:00:00Z`)) / 86400000) + 1\n\n/** Story estimates and Task effort have different units and must stay separate. */\nexport function teamItemMetrics(itemType: string, fields: Fields, inSprint: boolean, period: TeamPeriod) {\n const start = teamDate(fields.DateSDate)\n const end = teamDate(fields.qiwangwanchengriqi)\n const hasDates = Boolean(start && end && end >= start)\n const overlaps = hasDates && start <= period.end && end >= period.start\n if (itemType === 'Task') {\n if (!overlaps) return null\n const plannedDays = amount(fields.planStoryPoint)\n const overlapDays = days(start < period.start ? period.start : start, end > period.end ? period.end : end)\n return { storyPoints: null, plannedDays, periodDays: plannedDays === null ? null : Number((plannedDays * overlapDays / days(start, end)).toFixed(4)), plannedStart: start, plannedEnd: end }\n }\n if (!['Story', 'EnablerStory'].includes(itemType) || (hasDates ? !overlaps : !inSprint)) return null\n return { storyPoints: amount(fields.StoryPoint), plannedDays: null, periodDays: null, plannedStart: start, plannedEnd: end }\n}\n","import type { CSSProperties, ReactNode } from 'react'\nimport css from './tag.module.css'\n\nexport interface TagProps {\n children: ReactNode\n /** Tint color (hex or CSS color var). Omit for the neutral card-meta look. */\n tone?: string | undefined\n /** Render as a toggle button (filter chips) instead of a static span. */\n interactive?: boolean\n /** Toggle state for interactive tags; false renders the dimmed-off look. */\n pressed?: boolean | undefined\n title?: string | undefined\n className?: string | undefined\n onClick?: (() => void) | undefined\n}\n\n/**\n * The one tag chip used across the workbench — card metadata, filter chips and\n * status labels. Static usage renders a span; interactive usage renders a\n * toggle button. Only callers that pass `tone` get a colored chip (by\n * convention just the item-type tags).\n */\nexport function Tag({ children, tone, interactive = false, pressed, title, className, onClick }: TagProps) {\n const style = tone === undefined ? undefined : { '--tag-tone': tone } as CSSProperties\n const classes = [\n css.tag,\n tone === undefined ? '' : css.toned,\n interactive ? css.toggle : '',\n interactive && pressed === false ? css.off : '',\n className,\n ].filter(Boolean).join(' ')\n if (interactive) {\n return (\n <button type=\"button\" className={classes} style={style} title={title} aria-pressed={pressed} onClick={onClick}>\n {children}\n </button>\n )\n }\n return <span className={classes} style={style} title={title}>{children}</span>\n}\n","import { useEffect, useMemo, useRef, useState } from 'react'\nimport type { Dispatch, ReactNode, SetStateAction } from 'react'\nimport { Button, IconRefreshOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { TomatoLinkButton } from './TomatoLinkButton.tsx'\nimport css from './team-management.module.css'\nimport { readViewCache, writeViewCache } from './view-cache.ts'\nimport { teamDate } from '../team-metrics.ts'\nimport { Tag } from './Tag'\nimport type { TomatoItem } from './TomatoBoard'\n\ntype User = { username: string; name: string }\ntype Sprint = { sprintId: string; name: string; workspaceKey: string; status: string; startDate?: string; endDate?: string }\ntype Item = TomatoItem & { storyPoints: number | null; plannedDays: number | null; periodDays: number | null; plannedStart: string; plannedEnd: string }\ntype Metric = 'days' | 'points'\ntype Result = { items: Item[]; truncated: boolean }\ntype Directory = { sprints: Sprint[]; users: User[] }\nconst resultsKey = (sprint: string) => 'team-results:' + sprint\nfunction isDirectory(value: unknown): value is Directory {\n const data = value as Directory | null\n return Boolean(data && Array.isArray(data.sprints) && Array.isArray(data.users)\n && data.sprints.every(row => row && typeof row.sprintId === 'string' && typeof row.name === 'string')\n && data.users.every(row => row && typeof row.username === 'string' && typeof row.name === 'string'))\n}\nfunction isResults(value: unknown): value is Record<string, Result> {\n if (!value || typeof value !== 'object' || Array.isArray(value) || Object.keys(value).length > 1000) return false\n return Object.values(value).every((row: Result) => row && typeof row.truncated === 'boolean' && Array.isArray(row.items) && row.items.length <= 20_000\n && row.items.every(item => item && typeof item.itemKey === 'string' && typeof item.title === 'string'\n && typeof item.itemType === 'string' && typeof item.status === 'string'\n && (item.storyPoints === null || Number.isFinite(item.storyPoints)) && (item.periodDays === null || Number.isFinite(item.periodDays))))\n}\ntype Team = { id: string; name: string; members: string[] }\nconst LEGACY_TEAM_KEY = 'taskboard.tomatoStoryTeam.v1'\nconst TEAMS_KEY = 'taskboard.tomatoStoryTeams.v2'\nconst SPRINT_KEY = 'taskboard.tomatoStorySprint.v1'\nconst OWNER_KEY = 'taskboard.tomatoStoryOwner.v1'\nconst colors = ['#d76b50', '#458e88', '#c79940', '#687fb2', '#976f9c', '#75914f', '#be7f92', '#698b9d']\nconst number = (value: number) => new Intl.NumberFormat('zh-CN', { maximumFractionDigits: 4 }).format(value)\nconst metricValue = (item: Item, metric: Metric) => (metric === 'days' ? item.periodDays : item.storyPoints) ?? 0\nconst total = (items: Item[], metric: Metric) => items.reduce((sum, item) => sum + metricValue(item, metric), 0)\nconst savedValue = (key: string, fallback: string) => { try { return localStorage.getItem(key) || fallback } catch { return fallback } }\nconst teamId = () => `team-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 7)}`\nasync function json<T>(url: string, signal?: AbortSignal): Promise<T> {\n const response = await fetch(url, { signal: signal ?? null, cache: 'no-store', headers: { accept: 'application/json', 'cache-control': 'no-cache' } }); const text = await response.text(); let body: Record<string, unknown>\n try { body = text ? JSON.parse(text) as Record<string, unknown> : {} } catch { throw new Error(response.status === 404 || text.trim() === 'not found' ? '迭代故事点接口尚未加载,请完全重启 DSH Desktop' : `服务返回了无法识别的内容 (${response.status})`) }\n if (!response.ok) throw new Error(typeof body.error === 'string' ? body.error : `请求失败 (${response.status})`); return body as T\n}\nfunction readTeams(): Team[] {\n try {\n const saved: unknown = JSON.parse(localStorage.getItem(TEAMS_KEY) ?? '[]')\n if (Array.isArray(saved) && saved.length) return saved.flatMap(value => value && typeof value === 'object' ? [{ id: String((value as Team).id), name: String((value as Team).name), members: Array.isArray((value as Team).members) ? [...new Set((value as Team).members)] : [] }] : [])\n const legacy: unknown = JSON.parse(localStorage.getItem(LEGACY_TEAM_KEY) ?? '[]')\n return Array.isArray(legacy) && legacy.length ? [{ id: 'team-default', name: '默认团队', members: legacy.filter((value): value is string => typeof value === 'string') }] : []\n } catch { return [] }\n}\n\nexport function TeamManagement({ toolbarTarget, onOpenItem, active: visible = true }: { active?: boolean; toolbarTarget: Dispatch<SetStateAction<ReactNode>>; onOpenItem: (item: TomatoItem) => void }) {\n const [metric, setMetric] = useState<Metric>(() => savedValue('taskboard.tomatoTeamMetric.v1', 'days') === 'points' ? 'points' : 'days')\n const unitLabel = metric === 'days' ? '人天' : 'SP'\n useEffect(() => { try { localStorage.setItem('taskboard.tomatoTeamMetric.v1', metric) } catch {} }, [metric])\n const [cachedDirectory] = useState(() => readViewCache('team-directory', isDirectory))\n const [sprints, setSprints] = useState<Sprint[]>(cachedDirectory?.sprints ?? []); const [users, setUsers] = useState<User[]>(cachedDirectory?.users ?? [])\n const [sprint, setSprint] = useState(() => savedValue(SPRINT_KEY, '')); const [owner, setOwner] = useState(() => savedValue(OWNER_KEY, 'currentUser()'))\n const [teams, setTeams] = useState(readTeams); const [openTeamId, setOpenTeamId] = useState(() => readTeams()[0]?.id ?? '')\n const [teamDraft, setTeamDraft] = useState(''); const [teamEditor, setTeamEditor] = useState<{ mode: 'create' | 'rename'; id?: string } | null>(null)\n const [addingTeamId, setAddingTeamId] = useState(''); const addPeopleRef = useRef<HTMLDivElement>(null); const addPeopleInputRef = useRef<HTMLInputElement>(null); const [search, setSearch] = useState('')\n const [results, setResults] = useState<Record<string, Result>>(() => readViewCache(resultsKey(sprint), isResults) ?? {}); const [errors, setErrors] = useState<Record<string, string>>({}); const [directoryError, setDirectoryError] = useState(''); const [directoryLoading, setDirectoryLoading] = useState(!cachedDirectory); const [version, setVersion] = useState(0); const [directoryVersion, setDirectoryVersion] = useState(0)\n useEffect(() => {\n if (!visible) return\n const controller = new AbortController(); setDirectoryLoading(!sprints.length); setDirectoryError('')\n void Promise.all([json<{ sprints: Sprint[] }>('/api/tomato-board/sprints', controller.signal), json<{ users: User[] }>('/api/tomato-board/filters', controller.signal)]).then(([data, directory]) => { if (controller.signal.aborted) return; const sorted = [...data.sprints].sort((a, b) => (b.startDate ?? '').localeCompare(a.startDate ?? '')); setSprints(sorted); setUsers(directory.users); writeViewCache('team-directory', { sprints: sorted, users: directory.users }); setSprint(current => sorted.some(value => value.sprintId === current) ? current : sorted[0]?.sprintId || '') }).catch(error => { if (!controller.signal.aborted) setDirectoryError(error.message) }).finally(() => { if (!controller.signal.aborted) setDirectoryLoading(false) }); return () => controller.abort()\n }, [directoryVersion, visible])\n useEffect(() => { try { localStorage.setItem(TEAMS_KEY, JSON.stringify(teams)) } catch {} }, [teams]); useEffect(() => { if (sprint) try { localStorage.setItem(SPRINT_KEY, sprint) } catch {} }, [sprint]); useEffect(() => { try { localStorage.setItem(OWNER_KEY, owner) } catch {} }, [owner])\n const openTeam = teams.find(team => team.id === openTeamId); const openMembers = openTeam?.members ?? []; const ownersKey = JSON.stringify([...new Set([owner, ...openMembers])].sort())\n const resultScope = useRef('')\n const completedOwners = useRef(new Set<string>())\n useEffect(() => {\n if (!visible) { completedOwners.current.clear(); return }\n if (directoryLoading || !sprint) return\n const scope = JSON.stringify([sprint, version])\n if (resultScope.current !== scope) {\n const previousSprint = resultScope.current ? (JSON.parse(resultScope.current) as [string, number])[0] : sprint\n resultScope.current = scope\n completedOwners.current.clear()\n if (previousSprint !== sprint) setResults(readViewCache(resultsKey(sprint), isResults) ?? {})\n setErrors({})\n }\n const controller = new AbortController()\n const owners = (JSON.parse(ownersKey) as string[]).filter(username => !completedOwners.current.has(username))\n const worker = async () => {\n while (owners.length && !controller.signal.aborted) {\n const username = owners.shift()!\n try {\n const data = await json<Result>('/api/tomato-board/team-management?' + new URLSearchParams({ sprint, assignee: username, refresh: String(version) }), controller.signal)\n if (!controller.signal.aborted) {\n completedOwners.current.add(username)\n const cached = readViewCache(resultsKey(sprint), isResults) ?? {}\n writeViewCache(resultsKey(sprint), { ...cached, [username]: data })\n setResults(current => ({ ...current, [username]: data }))\n setErrors(current => { const next = { ...current }; delete next[username]; return next })\n }\n } catch (error) {\n if (!controller.signal.aborted) {\n completedOwners.current.add(username)\n setErrors(current => ({ ...current, [username]: error instanceof Error ? error.message : String(error) }))\n }\n }\n }\n }\n void Promise.all([worker(), worker(), worker()])\n return () => controller.abort()\n }, [directoryLoading, sprint, ownersKey, version, visible])\n const personal = results[owner]\n const items = useMemo(() => [...(personal?.items ?? [])].sort((a, b) => metricValue(b, metric) - metricValue(a, metric) || a.itemKey.localeCompare(b.itemKey)), [personal, metric])\n const sum = total(items, metric)\n const slices = items.filter(item => metricValue(item, metric) > 0)\n let offset = 0\n const gradient = slices.map((item, index) => { const start = offset; offset += metricValue(item, metric) / sum * 100; return `${colors[index % colors.length]} ${start}% ${offset}%` }).join(', ')\n const userName = (username: string) => username === 'currentUser()' ? '我' : users.find(user => user.username === username)?.name ?? username\n const selectedSprint = sprints.find(value => value.sprintId === sprint)\n\n const toggleTeam = (id: string) => { setOpenTeamId(current => current === id ? '' : id); setAddingTeamId(''); setTeamEditor(null) }\n const ranking = openMembers.map(username => ({ username, result: results[username], points: total(results[username]?.items ?? [], metric) })).sort((a, b) => Number(Boolean(b.result)) - Number(Boolean(a.result)) || b.points - a.points || a.username.localeCompare(b.username)); const max = Math.max(1, ...ranking.map(row => row.points)); const available = users.filter(user => !openMembers.includes(user.username) && `${user.name} ${user.username}`.toLowerCase().includes(search.toLowerCase()))\n const submitTeam = () => { const name = teamDraft.trim(); if (!name || !teamEditor) return; if (teamEditor.mode === 'create') { const team = { id: teamId(), name, members: [] }; setTeams(current => [...current, team]); setOpenTeamId(team.id) } else setTeams(current => current.map(team => team.id === teamEditor.id ? { ...team, name } : team)); setTeamDraft(''); setTeamEditor(null) }\n const deleteTeam = (id: string) => { setTeams(current => current.filter(team => team.id !== id)); if (openTeamId === id) setOpenTeamId('') }\n const updateMembers = (id: string, updater: (values: string[]) => string[]) => setTeams(current => current.map(team => team.id === id ? { ...team, members: updater(team.members) } : team))\n useEffect(() => { if (!addingTeamId) return; const close = (event: PointerEvent) => { if (event.target instanceof Node && !addPeopleRef.current?.contains(event.target)) { setAddingTeamId(''); setSearch('') } }; document.addEventListener('pointerdown', close, true); requestAnimationFrame(() => addPeopleInputRef.current?.focus()); return () => document.removeEventListener('pointerdown', close, true) }, [addingTeamId])\n useEffect(() => { if (!visible) return; toolbarTarget(<div className={css.headerControls}><label><span>迭代</span><select aria-label=\"选择迭代\" value={sprint} disabled={directoryLoading} onChange={event => { setSprint(event.target.value); setResults(readViewCache(resultsKey(event.target.value), isResults) ?? {}); setErrors({}) }}>{!sprints.length && <option value=\"\">{directoryLoading ? '正在读取迭代…' : '暂无迭代'}</option>}{sprints.map(value => <option key={value.sprintId} value={value.sprintId}>{value.name} · {value.workspaceKey}{value.status === 'completed' ? '(已结束)' : ''}</option>)}</select></label><Button variant=\"toolbar\" size=\"sm\" className={css.headerIconButton} icon={<IconRefreshOutline16 />} title=\"刷新\" aria-label=\"刷新团队统计\" onClick={() => { setErrors({}); setVersion(value => value + 1); if (directoryError || !sprints.length) setDirectoryVersion(value => value + 1) }} /></div>); return () => toolbarTarget(null) }, [directoryError, directoryLoading, sprint, sprints, toolbarTarget, visible])\n return <div className={css.page}>{directoryError && <p className={css.error}>{directoryError},请点击刷新重试。</p>}<div className={css.metricToolbar}><span>{selectedSprint ? `${teamDate(selectedSprint.startDate)} — ${teamDate(selectedSprint.endDate)}` : '请选择迭代'}</span><div role=\"group\" aria-label=\"统计指标\"><button type=\"button\" aria-pressed={metric === 'days'} onClick={() => setMetric('days')}>Task 人天</button><button type=\"button\" aria-pressed={metric === 'points'} onClick={() => setMetric('points')}>需求故事点</button></div></div><div className={css.columns}>\n <section className={css.panel} aria-label=\"个人迭代投入\"><div className={css.panelHeader}><h3>个人分布</h3><select aria-label=\"选择个人负责人\" value={owner} onChange={event => setOwner(event.target.value)}><option value=\"currentUser()\">我负责的</option>{users.map(user => <option key={user.username} value={user.username}>{user.name} · {user.username}</option>)}</select></div>{errors[owner] && !personal ? <p className={css.error}>{errors[owner]}</p> : !personal ? <p className={css.empty}>{sprint ? '正在读取个人迭代投入…' : '请选择迭代'}</p> : <><div className={css.summary}><div><span className={css.eyebrow}>{metric === 'days' ? '迭代内 Task 计划投入' : '需求故事点'}</span><div className={css.total}>{number(sum)}<small> {unitLabel}</small></div><span className={css.secondaryMetric}>{metric === 'days' ? `需求 ${number(total(items, 'points'))} SP` : `Task ${number(total(items, 'days'))} 人天`}</span></div><div className={css.pie} style={{ background: gradient ? `conic-gradient(${gradient})` : undefined }}><div><strong>{slices.length}</strong><span>项占比</span></div></div></div><div className={css.listHeading}><h4>需求与 Task</h4><span>{items.length} 项</span></div>{!items.length && <p className={css.empty}>该负责人在本迭代暂无事项。</p>}<div>{items.map(item => <div className={css.item} key={item.itemKey} role=\"button\" tabIndex={0} aria-label={`打开 ${item.itemKey} 的对话`} onClick={() => onOpenItem(item)} onKeyDown={event => { if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); onOpenItem(item) } }}><span className={css.dot} style={{ background: metricValue(item, metric) > 0 ? colors[slices.indexOf(item) % colors.length] : 'var(--dsw-alias-border-l2, #ddd)' }} /><div className={css.itemText}><span className={css.itemTitle}>{item.title}</span><small>{item.itemKey}</small><Tag>{item.itemType === 'Task' ? 'Task' : '需求'}</Tag><Tag>{item.status}</Tag>{item.plannedStart && <small>{item.plannedStart} — {item.plannedEnd}</small>}</div><strong className={css.itemPoints}>{item.itemType === 'Task' ? (item.periodDays === null ? '未估算' : `${number(item.periodDays)} 人天`) : (item.storyPoints === null ? '未估点' : `${number(item.storyPoints)} SP`)}</strong><TomatoLinkButton itemKey={item.itemKey} /></div>)}</div></>}</section>\n <section className={css.panel} aria-label=\"团队迭代投入\"><div className={css.teamsHeader}><h3>团队分布</h3><button className={css.addTeamButton} aria-label=\"创建团队\" title=\"创建团队\" onClick={() => { setTeamEditor({ mode: 'create' }); setTeamDraft('') }}>+ 创建团队</button></div>{teamEditor?.mode === 'create' && <form className={css.teamEditor} onSubmit={event => { event.preventDefault(); submitTeam() }}><input autoFocus placeholder=\"团队名称\" value={teamDraft} onChange={event => setTeamDraft(event.target.value)} /><button type=\"button\" onClick={() => setTeamEditor(null)}>取消</button><button type=\"submit\">创建</button></form>}<div className={css.teamAccordions}>{teams.map(team => { const open = openTeamId === team.id; const rows = open ? ranking : []; return <article className={css.teamAccordion} key={team.id}><div className={css.teamAccordionHeader}><button className={css.teamToggle} aria-expanded={open} onClick={() => toggleTeam(team.id)}><span className={css.chevron}>›</span><strong>{team.name}</strong><small>{team.members.length} 人</small></button><button className={css.renameTeam} aria-label={`改名 ${team.name}`} title=\"改名\" onClick={() => { setTeamEditor({ mode: 'rename', id: team.id }); setTeamDraft(team.name); setOpenTeamId(team.id) }}>✎</button><div className={css.teamRowActions}><button aria-label={`删除 ${team.name}`} title=\"删除\" onClick={() => deleteTeam(team.id)}>×</button></div></div>{teamEditor?.mode === 'rename' && teamEditor.id === team.id && <form className={css.teamEditor} onSubmit={event => { event.preventDefault(); submitTeam() }}><input autoFocus value={teamDraft} onChange={event => setTeamDraft(event.target.value)} /><button type=\"button\" onClick={() => setTeamEditor(null)}>取消</button><button type=\"submit\">保存</button></form>}{open && <div className={css.teamBody}><div className={css.teamBodyToolbar}><span>{team.members.length ? '成员迭代投入' : '暂无成员'}</span><div ref={addingTeamId === team.id ? addPeopleRef : undefined} className={css.addPeopleRoot}><button className={css.smallAddButton} onClick={() => setAddingTeamId(current => current === team.id ? '' : team.id)}>+ 添加成员</button>{addingTeamId === team.id && <div className={css.addPeople} role=\"dialog\"><div className={css.addPeopleTitle}><strong>添加成员</strong><button onClick={() => setAddingTeamId('')}>×</button></div><input ref={addPeopleInputRef} value={search} onChange={event => setSearch(event.target.value)} placeholder=\"搜索姓名或用户名…\" /><div>{available.map(user => <button key={user.username} onClick={() => { updateMembers(team.id, current => [...current, user.username]); setAddingTeamId(''); setSearch('') }}>{user.name}<small>{user.username}</small><span>+</span></button>)}{!available.length && <p>没有可添加的成员</p>}</div></div>}</div></div><div className={css.ranking}>{rows.map((row, index) => <div key={row.username} className={css.rankRow}><div className={css.memberRow}><button className={css.rankLabel} aria-pressed={owner === row.username} onClick={() => setOwner(row.username)}><i className={css.rankFill} style={{ width: `${row.points / max * 100}%` }} /><span className={css.rankIndex}>{String(index + 1).padStart(2, '0')}</span><span className={css.memberAvatar}>{userName(row.username).slice(0, 1)}</span><span className={css.memberIdentity}><strong>{userName(row.username)}</strong><small>{row.result ? `${row.result.items.filter(item => item.itemType !== 'Task').length} 个需求 · ${row.result.items.filter(item => item.itemType === 'Task').length} 个 Task` : errors[row.username] ? '读取失败' : '读取中…'}</small></span><b>{row.result ? `${number(row.points)} ${unitLabel}` : '—'}</b></button><button className={css.removeMember} aria-label={`移除 ${userName(row.username)}`} title=\"移除成员\" onClick={() => updateMembers(team.id, current => current.filter(value => value !== row.username))}>×</button></div></div>)}</div>{!team.members.length && <div className={css.teamBodyEmpty}>添加成员后查看迭代投入分布</div>}</div>}</article> })}</div>{!teams.length && <div className={css.empty}>点击右上角加号创建团队。</div>}</section>\n </div></div>\n}\n","/** Durable calendar units and their individually verified Tomato tasks. */\nexport interface WorktimeTask {\n itemType?: string\n stage: string\n title: string\n days: number\n start: string\n end: string\n itemKey?: string\n status: 'pending' | 'creating' | 'created' | 'uncertain'\n /** One date per allocated half-day; preserves gaps when calendar ranges change. */\n allocationSlots?: string[]\n error?: string\n /** Optional Task fields omitted because the create screen only accepts another range. */\n skipped?: string[]\n}\n\n/** A continuous date selection remains one operation across task creation. */\nexport interface WorktimeUnit {\n id: string\n itemKey: string\n title: string\n workspace: string\n start: string\n end: string\n revision: number\n updatedAt: string\n assignees?: string[]\n project?: string\n team?: string\n cost?: string\n category?: string\n tasks: WorktimeTask[]\n}\n\n/** A Task may cover several ranges even though its record belongs to the first. */\nexport function unitHasCreatedTasks(unit: WorktimeUnit, units: WorktimeUnit[]): boolean {\n return units.some(owner => owner.itemKey === unit.itemKey && owner.tasks.some(task =>\n task.status === 'created' && task.start <= unit.end && task.end >= unit.start))\n}\n\nexport type WorktimeTaskChange = { itemKey: string; action: 'delete' }\n | { itemKey: string; action: 'move'; start: string; end: string }\n\n/** Render an in-flight change without modifying the last server snapshot. */\nexport function applyTaskChange<T extends { itemKey?: string; start: string; end: string; allocationSlots?: string[] }>(tasks: T[], change: WorktimeTaskChange | null): T[] {\n if (!change) return tasks\n return tasks.flatMap(task => {\n if (task.itemKey !== change.itemKey) return [task]\n if (change.action === 'delete') return []\n const next = { ...task, start: change.start, end: change.end }\n delete next.allocationSlots\n return [next]\n })\n}\n\nexport type WorktimeRequirementChange = { action: 'move'; id: string; delta: number }\n | { action: 'resize'; id: string; start: string; end: string }\n\n/** Join touching ranges without changing any Task dates or creation records. */\nexport function mergeRequirementRanges(units: WorktimeUnit[], itemKey: string, preserveAllocated = false): WorktimeUnit[] {\n const group = units.filter(unit => unit.itemKey === itemKey).sort((a, b) => a.start.localeCompare(b.start) || a.id.localeCompare(b.id))\n const merged: WorktimeUnit[] = []\n for (const unit of group) {\n const previous = merged.at(-1)\n const locked = preserveAllocated && previous && (unitHasCreatedTasks(unit, units) || unitHasCreatedTasks(previous, units)\n || unit.tasks.some(task => task.status !== 'pending') || previous.tasks.some(task => task.status !== 'pending'))\n if (previous && !locked && unit.start <= addDays(previous.end, 1)) {\n merged[merged.length - 1] = { ...previous, end: previous.end > unit.end ? previous.end : unit.end,\n tasks: [...previous.tasks, ...unit.tasks], revision: Math.max(previous.revision, unit.revision) + 1,\n updatedAt: previous.updatedAt > unit.updatedAt ? previous.updatedAt : unit.updatedAt,\n assignees: [...new Set([...(previous.assignees ?? []), ...(unit.assignees ?? [])])],\n cost: previous.cost || unit.cost || '', team: previous.team || unit.team || '', category: previous.category || unit.category || '' }\n } else merged.push(unit)\n }\n const survivors = new Map(merged.map(unit => [unit.id, unit]))\n return units.flatMap(unit => unit.itemKey !== itemKey ? [unit] : survivors.has(unit.id) ? [survivors.get(unit.id)!] : [])\n}\n\n/** Change one range, then merge its continuous neighbours; Task dates stay unchanged. */\nexport function applyRequirementChange(units: WorktimeUnit[], change: WorktimeRequirementChange | null): WorktimeUnit[] {\n if (!change) return units\n const active = units.find(unit => unit.id === change.id)\n if (!active) return units\n const next = units.map(unit => {\n if (change.action === 'resize') return unit.id === change.id ? { ...unit, start: change.start, end: change.end } : unit\n if (unit.id !== change.id) return unit\n return { ...unit, start: addDays(unit.start, change.delta), end: addDays(unit.end, change.delta) }\n })\n return mergeRequirementRanges(next, active.itemKey)\n}\n\n/** Use calendar dates across week boundaries for both the drag preview and its saved result. */\nexport function calendarDragAllowed(active: { start: string; end: string }, edge: 'move' | 'start' | 'end', target: string): boolean {\n return edge === 'move' || (edge === 'start' ? target <= active.end : target >= active.start)\n}\n\nexport function calendarDragRanges(ranges: Array<{ start: string; end: string }>, active: { start: string; end: string }, anchor: string,\n edge: 'move' | 'start' | 'end', target: string): Array<{ start: string; end: string }> {\n if (!calendarDragAllowed(active, edge, target)) return [{ start: active.start, end: active.end }]\n if (edge === 'start') return [{ start: target, end: active.end }]\n if (edge === 'end') return [{ start: active.start, end: target }]\n const delta = Math.round((Date.parse(`${target}T12:00:00Z`) - Date.parse(`${anchor}T12:00:00Z`)) / 86400000)\n return ranges.map(range => ({ start: addDays(range.start, delta), end: addDays(range.end, delta) }))\n}\n\n/** Creation metadata is discovered from the story and current Task screen. */\nexport interface WorktimeMetadata {\n project: string\n assignee: string\n assigneeName: string\n teams: string[]\n costs: string[]\n categories: string[]\n suggestedTeam: string\n suggestedCost: string\n suggestionSource: string\n actualRange: string[] | null\n}\n\n/** Format a browser-local calendar date without UTC conversion. */\nexport function dateKey(date: Date): string {\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`\n}\n\n/** Add calendar days using local noon to avoid daylight-saving midnight gaps. */\nexport function addDays(value: string, days: number): string {\n const date = new Date(`${value}T12:00:00`)\n date.setDate(date.getDate() + days)\n return dateKey(date)\n}\n\n/** Inclusive, bounded dates; rejects invalid or reversed selections. */\nexport function datesBetween(start: string, end: string): string[] {\n const valid = (s: string) => /^\\d{4}-\\d{2}-\\d{2}$/u.test(s) && dateKey(new Date(`${s}T12:00:00`)) === s\n if (!valid(start) || !valid(end) || end < start) throw new Error('请选择有效的连续日期')\n const dates: string[] = []\n for (let day = start; day <= end; day = addDays(day, 1)) {\n if (dates.length >= 366) throw new Error('一次安排最多 366 天')\n dates.push(day)\n }\n return dates\n}\n\n/** The five-week view starts two Saturdays before the anchor's week. */\nexport function calendarStart(anchor: string): string {\n const day = new Date(`${anchor}T12:00:00`).getDay()\n return addDays(anchor, -((day + 1) % 7) - 14)\n}\n\n/** Generate descriptive editable titles from the requirement and phase. */\nexport function taskTitle(story: string, stage: string): string {\n const subject = story.replace(/^[【\\[].*?[】\\]]\\s*/u, '').replace(/[-—]\\s*(前端|后端)\\s*$/u, '').trim()\n const capability = subject.replace(/支持/u, '的')\n switch (stage) {\n case 'understand': return `梳理${capability}需求与现有项目实现`\n case 'design': return `设计${capability}的技术方案与实现路径`\n case 'develop': return `实现${capability}能力并完成集成`\n case 'verify': return `验证${capability}功能与边界场景`\n case 'bugfix': return `定位并修复${subject}相关问题`\n default: throw new Error('未知任务阶段')\n }\n}\n\n/** Every planned date of one requirement, de-duplicated and chronological. */\nexport function unitDates(units: Array<{ start: string; end: string }>): string[] {\n const dates = new Set<string>()\n for (const unit of units) for (const day of datesBetween(unit.start, unit.end)) dates.add(day)\n return [...dates].sort()\n}\n\n/** Recover old allocations once, and retain exact half-day dates for subsequent batches. */\nexport function plannedTaskSlots(dates: string[], tasks: WorktimeTask[]): Map<WorktimeTask, string[]> {\n const used = new Map<string, number>()\n const seen = new Set<string>()\n const allocations = new Map<WorktimeTask, string[]>()\n const confirmed = tasks.filter(task => task.status === 'created').sort((a, b) => a.end.localeCompare(b.end) || b.start.localeCompare(a.start))\n const reserve = (day: string) => used.set(day, (used.get(day) ?? 0) + 1)\n // Saved allocations are authoritative even when the enclosing range moves.\n for (const task of confirmed) {\n if (task.itemKey && seen.has(task.itemKey)) continue\n if (!task.allocationSlots || task.allocationSlots.length !== Math.round(task.days * 2)\n || task.allocationSlots.some(day => day < task.start || day > task.end)) continue\n allocations.set(task, [...task.allocationSlots])\n task.allocationSlots.forEach(reserve)\n if (task.itemKey) seen.add(task.itemKey)\n }\n for (const task of confirmed) {\n if (allocations.has(task)) continue\n if (task.itemKey && seen.has(task.itemKey)) continue\n if (task.itemKey) seen.add(task.itemKey)\n let remaining = Math.ceil(task.days * 2 - 1e-8)\n if (!Number.isSafeInteger(remaining) || remaining <= 0) throw new Error('已有 Task 的人天无效,请先核对')\n const slots: string[] = []\n const relevant = dates.filter(day => day >= task.start && day <= task.end)\n const candidates = [...relevant, ...datesBetween(task.start, task.end).filter(day => !relevant.includes(day))]\n for (const day of candidates) {\n const taken = Math.min(remaining, Math.max(0, 2 - (used.get(day) ?? 0)))\n used.set(day, (used.get(day) ?? 0) + taken)\n slots.push(...Array<string>(taken).fill(day))\n remaining -= taken\n if (!remaining) break\n }\n allocations.set(task, slots.sort())\n }\n return allocations\n}\n\n/** Remaining half-day slots; the wider context recovers legacy multi-range Tasks. */\nexport function availableWorktimeSlots(dates: string[], tasks: WorktimeTask[], contextDates = dates): string[] {\n const used = new Map<string, number>()\n for (const slots of plannedTaskSlots(contextDates, tasks).values()) for (const day of slots) used.set(day, (used.get(day) ?? 0) + 1)\n return [...new Set(dates)].sort().flatMap(day => Array<string>(Math.max(0, 2 - (used.get(day) ?? 0))).fill(day))\n}\n\n/**\n * Allocate person-days across one requirement's ordered dates. Half days are the\n * smallest unit, so two stages may share a date; a plan may leave time\n * unallocated but may never exceed the planned total.\n */\nexport function allocateGroupTasks(dates: string[], tasks: Array<{ stage: string; title: string; days: number }>, existing: WorktimeTask[] = [], contextDates = dates): WorktimeTask[] {\n if (!dates.length) throw new Error('请先选择需求的日期')\n if (!tasks.length || tasks.length > 20) throw new Error('请填写至少一个阶段的人天')\n const slots = availableWorktimeSlots(dates, existing, contextDates)\n if (!slots.length) throw new Error('该时间段已创建 Task,当前没有剩余人天,请延长时间段后再安排')\n let spent = 0\n const result = tasks.map(task => {\n if (!['understand', 'design', 'develop', 'verify', 'bugfix'].includes(task.stage)\n || !task.title.trim() || task.title.length > 240 || !Number.isFinite(task.days) || task.days <= 0) throw new Error('任务标题或人天无效')\n if (task.days < 0.5 - 1e-9) throw new Error('每个阶段至少 0.5 人天')\n if (Math.abs(task.days * 2 - Math.round(task.days * 2)) > 1e-9) throw new Error('每个阶段需按 0.5 人天递增')\n const first = Math.round(spent * 2)\n spent += task.days\n const last = Math.round(spent * 2) - 1\n return { ...task, title: task.title.trim(), start: slots[first] ?? '', end: slots[last] ?? '', allocationSlots: slots.slice(first, last + 1), status: 'pending' as const }\n })\n if (spent > slots.length / 2 + 1e-6) throw new Error(`阶段合计不能大于剩余 ${slots.length / 2} 人天,当前为 ${Number(spent.toFixed(4))} 人天`)\n return result\n}\n\n/** Allocate fractional person-days over one continuous range. */\nexport function allocateTasks(start: string, end: string, tasks: Array<{ stage: string; title: string; days: number }>): WorktimeTask[] {\n return allocateGroupTasks(datesBetween(start, end), tasks)\n}\n","/** Chinese worktime copy, kept separate from rendering and wire discriminants. */\nexport const worktimeText = {\n switchUser: '切换用户', currentUser: '我(当前登录用户)', readOnlyView: '只读',\n title: '任务日历', previous: '前一周', next: '后一周', today: '回到本周', refresh: '刷新记录',\n personDays: '人天', days: '天',\n cancel: '取消', save: '保存', saving: '正在保存…',\n request: '需求安排', task: 'Task', pending: '待创建', created: '已创建', uncertain: '结果待核对',\n pickTitle: '选择需求', confirmPick: '确定',\n range: '时间段', addRange: '+ 添加时间段', deleteRange: '删除', rangeDeleteHint: '只移除本地时间段,番茄需求和 Task 保留', confirmDelete: '确认移入回收站', rangeEmpty: '没有可保存的时间段改动',\n rangeIncomplete: '请填写完整的时间段(开始与结束日期)', rangeInvalid: '时间段的结束日期不能早于开始日期',\n rangeHint: '时间段可增删;删除仅移除本地排期,不影响番茄需求和 Task。',\n taskBusy: '当前为只读视图或正在保存,请稍后操作', taskDeleted: 'Task 已移入番茄回收站,需求安排已保留', taskMoved: 'Task 计划日期已同步到番茄', deleteTask: '删除 Task', saveTaskDates: '保存计划日期', taskMoveHint: '可拖动日历上的 Task 改期,也可在此修改计划起止日期;实际工时和人天保持不变。', taskDeleteHint: '确认后此 Task 及其全部后代将移入番茄回收站,需求安排保留。',\n invalidDrag: '不可放置:开始日期不能晚于结束日期', previewRange: '预览日期范围', requirementSaved: '当前需求时间段已保存', resizeStart: '拖动调整开始日期', resizeEnd: '拖动调整结束日期', taskSyncing: '日历已更新,正在后台同步…', taskRolledBack: '同步未完成,已恢复原来的日历显示',\n start: '开始日期', end: '结束日期', saveRanges: '保存时间段',\n edit: '工时分配', editHint: '每个阶段创建一个直属 Task。标题已结合需求润色,可直接修改。',\n unallocated: '剩余未分配', overAllocate: '阶段合计不能超过剩余可分配人天',\n project: '所属项目', owner: 'Task 负责人', team: '所属团队', cost: '工时成本归属', category: '任务分类',\n placeholder: '请选择', loading: '正在读取…', stages: '阶段与投入', stage: '阶段', taskTitle: 'Task 标题',\n total: '阶段合计', create: '确认并创建 Task', creating: '正在创建并核对…',\n createdAllocation: '已分配投入', currentCapacity: '本次可分配', currentStages: '本次阶段与投入', skippedFields: '未写入番茄的字段',\n splitHint: '仅填写需要的阶段,留空的阶段不会创建。每个阶段至少 0.5 人天、按 0.5 递增,合计不能超过剩余可分配人天。',\n locked: '已有 Task 会保留;拖拽扩长时间段后,可以继续分配剩余人天。',\n readFailed: '读取失败', hostStale: '工时服务仍是旧版本,请退出并重新打开 DSH 后重试', close: '关闭', saved: '安排已保存', createdMessage: 'Task 已创建并核对',\n duplicate: '该需求在相同日期已有安排,已打开原记录',\n historyFailed: '番茄历史 Task 读取失败,本地安排仍保留',\n view: '在番茄中查看', taskHistory: '番茄历史 Task', dateSelection: '选择日期',\n dayPickHint: '点击某天,或拖动连续几天,即可为该需求安排工时',\n stageLabels: { understand: '需求与项目理解', design: '方案设计', develop: '功能开发', verify: '联调与验证', bugfix: 'Bug 修复' },\n weekdays: ['周六', '周日', '周一', '周二', '周三', '周四', '周五'],\n} as const\n","import { useEffect, useMemo, useRef, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { Button, IconChevronDownOutline14 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport css from './tomato-board.module.css'\n\nexport interface AssigneeUser {\n username: string\n name: string\n}\n\n/** Shared searchable assignee picker used by the board and worktime pages. */\nexport function AssigneePicker({ users, value, onChange, label = '负责人', className, currentUserName = '我负责的', ariaLabel }: {\n users: AssigneeUser[]\n value: string\n onChange: (value: string) => void\n /** Set to null to hide the leading label (compact toolbar usage). */\n label?: ReactNode\n className?: string\n currentUserName?: string\n ariaLabel?: string\n}) {\n const rootRef = useRef<HTMLDivElement>(null)\n const [open, setOpen] = useState(false)\n const [query, setQuery] = useState('')\n const options = useMemo(() => [{ username: 'currentUser()', name: currentUserName }, ...users.filter(user => user.username !== 'currentUser()')], [users, currentUserName])\n const selected = options.find(option => option.username === value) ?? options[0]\n const needle = query.trim().toLowerCase()\n const filtered = needle\n ? options.filter(option => `${option.name} ${option.username}`.toLowerCase().includes(needle))\n : options\n\n useEffect(() => {\n if (!open) return\n const close = (event: PointerEvent) => {\n if (event.target instanceof Node && !rootRef.current?.contains(event.target)) setOpen(false)\n }\n document.addEventListener('pointerdown', close, true)\n return () => document.removeEventListener('pointerdown', close, true)\n }, [open])\n\n return (\n <div className={[css.assigneeFilter, className].filter(Boolean).join(' ')}>\n {label ? <span>{label}</span> : null}\n <div ref={rootRef} className={css.assigneePicker}>\n <Button variant=\"outline\" size=\"sm\" className={css.assigneeTrigger} aria-label={ariaLabel} aria-haspopup=\"listbox\" aria-expanded={open} onClick={() => { setOpen(current => !current); setQuery('') }}>\n <span>{selected?.name ?? value}</span><IconChevronDownOutline14 />\n </Button>\n {open ? (\n <div className={css.assigneeDropdown}>\n <input autoFocus type=\"search\" value={query} onChange={event => setQuery(event.target.value)} placeholder=\"搜索昵称或用户名…\" aria-label=\"搜索负责人\" />\n <div role=\"listbox\" aria-label=\"负责人\">\n {filtered.map(option => (\n <button key={option.username} type=\"button\" role=\"option\" aria-selected={option.username === value} onClick={() => { onChange(option.username); setOpen(false); setQuery('') }}>\n <strong>{option.name}</strong>{option.name !== option.username && option.username !== 'currentUser()' ? <small>{option.username}</small> : null}\n </button>\n ))}\n {filtered.length === 0 ? <p>没有匹配的负责人</p> : null}\n </div>\n </div>\n ) : null}\n </div>\n </div>\n )\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { Button } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { TaskBug } from '../task-bugs.ts'\nimport { TomatoLinkButton } from './TomatoLinkButton.tsx'\nimport css from './worktime.module.css'\n\ninterface BugData { linked: TaskBug[]; suggested: TaskBug[]; parent: { itemKey: string; title: string } | null; canLink: boolean }\ntype Request = <T>(path: string, input?: unknown, signal?: AbortSignal) => Promise<T>\nexport function TaskBugs({ itemKey, readOnly, disabled, request, onBusyChange, onNotify, onCountChange }: {\n itemKey: string; readOnly: boolean; disabled: boolean; request: Request\n onBusyChange: (busy: boolean) => void; onNotify: (text: string, error?: boolean) => void\n onCountChange: (itemKey: string, count: number) => void\n}) {\n const [data, setData] = useState<BugData | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState('')\n const [version, setVersion] = useState(0)\n const [query, setQuery] = useState('')\n const [submitted, setSubmitted] = useState('')\n const [searchVersion, setSearchVersion] = useState(0)\n const [results, setResults] = useState<TaskBug[]>([])\n const [searching, setSearching] = useState(false)\n const [linking, setLinking] = useState('')\n const pending = useRef(false)\n useEffect(() => {\n const controller = new AbortController()\n setLoading(true); setError('')\n void request<BugData>(`/task-bugs?itemKey=${encodeURIComponent(itemKey)}`, undefined, controller.signal)\n .then(value => { if (!controller.signal.aborted) { setData(value); onCountChange(itemKey, value.linked.length) } })\n .catch(error => { if (!controller.signal.aborted) setError(error instanceof Error ? error.message : 'Bug 读取失败') })\n .finally(() => { if (!controller.signal.aborted) setLoading(false) })\n return () => controller.abort()\n }, [itemKey, request, version, onCountChange])\n useEffect(() => {\n if (!submitted) { setResults([]); setSearching(false); return }\n const controller = new AbortController()\n setSearching(true); setError(''); setResults([])\n void request<{ items: TaskBug[] }>(`/task-bugs?itemKey=${encodeURIComponent(itemKey)}&q=${encodeURIComponent(submitted)}`, undefined, controller.signal)\n .then(value => { if (!controller.signal.aborted) setResults(value.items) })\n .catch(error => { if (!controller.signal.aborted) setError(error instanceof Error ? error.message : 'Bug 搜索失败') })\n .finally(() => { if (!controller.signal.aborted) setSearching(false) })\n return () => controller.abort()\n }, [itemKey, request, submitted, searchVersion])\n async function link(bug: TaskBug) {\n if (!data?.canLink || disabled || readOnly || pending.current || loading) return\n pending.current = true; onBusyChange(true); setLinking(bug.itemKey); setError('')\n // Show the association immediately; the last snapshot remains available for rollback.\n const previous = data\n setData({ ...data, linked: [...data.linked, bug] })\n onCountChange(itemKey, data.linked.length + 1)\n try {\n const result = await request<{ bug: TaskBug; count: number }>('/task-bug', { itemKey, bugKey: bug.itemKey })\n setData(current => current ? { ...current, linked: current.linked.map(value => value.itemKey === bug.itemKey ? result.bug : value) } : current)\n onCountChange(itemKey, result.count)\n onNotify('Bug 已关联到番茄 Task')\n } catch (error) {\n setData(previous)\n onCountChange(itemKey, previous.linked.length)\n const message = `${error instanceof Error ? error.message : 'Bug 关联失败'};请刷新核对番茄中的关联结果`\n setError(message); onNotify(message, true)\n } finally { pending.current = false; setLinking(''); onBusyChange(false) }\n }\n const linkedKeys = new Set(data?.linked.map(bug => bug.itemKey))\n const candidates = (submitted ? results : data?.suggested ?? []).filter(bug => !linkedKeys.has(bug.itemKey))\n function row(bug: TaskBug, candidate = false) {\n return <li key={bug.itemKey} className={css.bugRow}>\n <div className={css.bugTitle}><span>{bug.title}</span><small>{bug.itemKey}</small></div>\n <span className={css.bugStatus}>{linking === bug.itemKey ? '关联中…' : bug.status || '未知状态'}</span>\n <TomatoLinkButton itemKey={bug.itemKey} />\n {candidate && !readOnly && <Button size=\"sm\" variant=\"outline\" disabled={disabled || loading || Boolean(linking) || !data?.canLink} onClick={() => void link(bug)}>关联</Button>}\n </li>\n }\n return <section className={css.bugs} aria-label=\"关联 Bug\" aria-busy={loading}>\n <div className={css.bugToolbar}>\n <div className={css.bugHeading}><h3>关联 Bug</h3><Button size=\"sm\" variant=\"ghost\" disabled={disabled || loading || Boolean(linking)} onClick={() => { setVersion(value => value + 1); setSearchVersion(value => value + 1) }}>刷新</Button></div>\n {!readOnly && data && !loading &&\n <form className={css.bugSearch} onSubmit={event => { event.preventDefault(); setSubmitted(query.trim()); setSearchVersion(value => value + 1) }}>\n <input aria-label=\"搜索 Bug\" maxLength={120} placeholder=\"搜索其他 Bug 标题或编号\" value={query} disabled={disabled || Boolean(linking)} onChange={event => { setQuery(event.target.value); if (!event.target.value.trim()) setSubmitted('') }} />\n <Button size=\"sm\" type=\"submit\" variant=\"outline\" disabled={disabled || searching || !query.trim() || Boolean(linking)}>搜索</Button>\n </form>\n }\n </div>\n {loading ? <p className={css.bugEmpty}>正在读取…</p> : <div className={css.bugColumns} data-readonly={readOnly || undefined}>\n <section className={css.bugPanel} aria-label=\"已关联 Bug\">\n <div className={css.bugPanelHeading}><h4>已关联 <small>{data?.linked.length ?? 0}</small></h4></div>\n {data?.linked.length ? <ul className={css.bugList}>{data.linked.map(bug => row(bug))}</ul> : <p className={css.bugEmpty}>暂无关联 Bug</p>}\n </section>\n {!readOnly && data && <section className={css.bugPanel} aria-label=\"可关联缺陷\">\n <div className={css.bugPanelHeading}>\n <h4>{submitted ? '搜索结果' : '父需求下的缺陷'} <small>{searching ? '…' : candidates.length}</small></h4>\n {!submitted && data.parent && <span className={css.bugParent} title={data.parent.title}>{data.parent.itemKey}<TomatoLinkButton itemKey={data.parent.itemKey} /></span>}\n {submitted && <Button size=\"sm\" variant=\"ghost\" onClick={() => { setSubmitted(''); setQuery('') }}>返回</Button>}\n </div>\n {searching ? <p className={css.bugEmpty}>正在搜索…</p> : candidates.length ? <ul className={css.bugList}>{candidates.map(bug => row(bug, true))}</ul> : <p className={css.bugEmpty}>{submitted ? '未找到可关联的 Bug' : '暂无可关联的缺陷'}</p>}\n </section>}\n </div>}\n {error && <p role=\"alert\" className={css.error}>{error}</p>}\n </section>\n}\n","import { addDays, datesBetween } from './worktime-model.ts'\n\n/** Reporting weeks follow Monday–Sunday, independently of the calendar viewport. */\nexport function reportWeek(day: string): string {\n const weekday = new Date(`${day}T00:00:00Z`).getUTCDay()\n return addDays(day, -((weekday + 6) % 7))\n}\n\n/** At most two selected Tasks share one person-day, in half-day units. */\nexport function suggestReportDays(tasks: Array<{ itemKey: string; start: string; end: string }>, start: string) {\n const days: Record<string, number> = Object.fromEntries(tasks.map(task => [task.itemKey, 0]))\n const conflicts: Array<{ date: string; itemKeys: string[] }> = []\n for (const date of datesBetween(start, addDays(start, 6))) {\n const active = tasks.filter(task => task.start <= date && date <= task.end)\n if (active.length > 2) {\n conflicts.push({ date, itemKeys: active.map(task => task.itemKey) })\n continue\n }\n for (const task of active) days[task.itemKey]! += active.length === 2 ? .5 : 1\n }\n return { days, conflicts }\n}\n","import { typeTone } from './item-type-colors.ts'\nimport { Tag } from './Tag.tsx'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { Button, Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { addDays } from '../worktime-model.ts'\nimport { reportWeek, suggestReportDays } from '../task-report-model.ts'\nimport type { TaskReportConstraints, TaskReportInput, TaskReportResult } from '../task-report.ts'\nimport { TomatoLinkButton } from './TomatoLinkButton.tsx'\nimport css from './worktime.module.css'\n\ninterface ReportTask {\n itemKey: string; itemType?: string; title: string; status: string; start: string; end: string; days: number\n actualDays: number | null; actualStart: string; actualEnd: string\n}\ntype Request = <T>(path: string, input?: unknown, signal?: AbortSignal) => Promise<T>\nconst today = () => new Intl.DateTimeFormat('sv-SE', { timeZone: 'Asia/Shanghai' }).format(new Date())\nconst terminal = (status: string) => ['工时核对', '工时核对中', '已完成', '已取消', '延期解决'].includes(status)\nconst errorText = (error: unknown) => error instanceof Error ? error.message : '报工失败'\nconst outcomeText = { success: '报工成功', skipped: '已报工,跳过', failed: '未完成', partial: '部分完成', unknown: '结果待核对' }\n\nexport function TaskReport({ request, onClose, onSaved, onNotify }: {\n request: Request; onClose: () => void; onSaved: () => void; onNotify: (text: string, error?: boolean) => void\n}) {\n const [week, setWeek] = useState(() => reportWeek(today()))\n const end = addDays(week, 6)\n const [version, setVersion] = useState(0)\n const [tasks, setTasks] = useState<ReportTask[]>([])\n const [selected, setSelected] = useState<Set<string>>(new Set())\n const [drafts, setDrafts] = useState<Record<string, { days?: string; start?: string; end?: string }>>({})\n const [results, setResults] = useState<Record<string, TaskReportResult>>({})\n const [loading, setLoading] = useState(true)\n const [busy, setBusy] = useState(false)\n const submitting = useRef(false)\n const [error, setError] = useState('')\n const [uncertain, setUncertain] = useState(false)\n const [constraints, setConstraints] = useState<TaskReportConstraints>({})\n const selectedTasks = useMemo(() => tasks.filter(task => selected.has(task.itemKey)), [tasks, selected])\n const suggestions = useMemo(() => {\n // Already reported Tasks still occupy their day when reporting remaining Tasks.\n const counted = tasks.filter(task => selected.has(task.itemKey) || ['工时核对', '工时核对中', '已完成'].includes(task.status))\n const allocation = suggestReportDays(counted, week)\n return { ...allocation, conflicts: allocation.conflicts.filter(value => value.itemKeys.some(key => selected.has(key))) }\n }, [tasks, selected, week])\n const daysFor = (task: ReportTask) => Number(drafts[task.itemKey]?.days ?? suggestions.days[task.itemKey] ?? 0)\n const startFor = (task: ReportTask) => drafts[task.itemKey]?.start ?? (task.actualStart || task.start)\n const endFor = (task: ReportTask) => drafts[task.itemKey]?.end ?? (task.actualEnd || task.end)\n const total = selectedTasks.reduce((sum, task) => sum + daysFor(task), 0)\n const invalid = selectedTasks.some(task => !Number.isFinite(daysFor(task)) || daysFor(task) <= 0 || !Number.isInteger(daysFor(task) * 2)\n || !startFor(task) || !endFor(task) || endFor(task) < startFor(task)\n || (constraints.finishRange && (endFor(task) < constraints.finishRange[0] || endFor(task) > constraints.finishRange[1]))\n || (constraints.daysMin != null && daysFor(task) < constraints.daysMin) || (constraints.daysMax != null && daysFor(task) > constraints.daysMax))\n useEffect(() => {\n const controller = new AbortController()\n setLoading(true); setError(''); setTasks([]); setSelected(new Set()); setDrafts({}); setResults({}); setUncertain(false)\n void Promise.all([\n request<{ tasks: ReportTask[]; truncated?: boolean }>(`/history?start=${week}&end=${end}&assignee=currentUser()`, undefined, controller.signal),\n request<TaskReportConstraints>('/report-options', undefined, controller.signal),\n ]).then(([data, limits]) => {\n if (controller.signal.aborted) return\n if (data.truncated) throw new Error('本周 Task 过多,未获取完整数据,请在番茄中报工')\n setTasks(data.tasks)\n setConstraints(limits)\n // A cross-week Task writes whole-item actual effort. Require explicit selection.\n setSelected(new Set(data.tasks.filter(task => !terminal(task.status) && task.start >= week && task.end <= end).map(task => task.itemKey)))\n }).catch(error => { if (!controller.signal.aborted) setError(errorText(error)) }).finally(() => { if (!controller.signal.aborted) setLoading(false) })\n return () => controller.abort()\n }, [week, end, version, request])\n function toggle(key: string) {\n setSelected(current => { const next = new Set(current); if (next.has(key)) next.delete(key); else next.add(key); return next })\n }\n function edit(key: string, field: 'days' | 'start' | 'end', value: string) {\n setDrafts(current => ({ ...current, [key]: { ...current[key], [field]: value } }))\n }\n async function submit() {\n if (submitting.current || !selectedTasks.length || invalid || suggestions.conflicts.length || uncertain) return\n submitting.current = true; setBusy(true); setError('')\n const payload: TaskReportInput[] = selectedTasks.map(task => ({\n itemKey: task.itemKey, expectedStatus: task.status, expectedStart: task.start, expectedEnd: task.end,\n expectedActualDays: task.actualDays, expectedActualStart: task.actualStart, expectedActualEnd: task.actualEnd,\n days: daysFor(task), actualStart: startFor(task), actualEnd: endFor(task),\n }))\n try {\n const data = await request<{ results: TaskReportResult[] }>('/report', { start: week, end, tasks: payload })\n setResults(Object.fromEntries(data.results.map(result => [result.itemKey, result])))\n setSelected(new Set())\n setTasks(current => current.map(task => {\n const result = data.results.find(value => value.itemKey === task.itemKey)\n const input = payload.find(value => value.itemKey === task.itemKey)\n return result ? { ...task, status: result.currentStatus || task.status,\n ...(result.fieldsWritten && input ? { actualDays: input.days, actualStart: input.actualStart, actualEnd: input.actualEnd } : {}) } : task\n }))\n setUncertain(data.results.some(result => result.outcome === 'unknown'))\n const success = data.results.filter(result => result.outcome === 'success').length\n const failed = data.results.filter(result => !['success', 'skipped'].includes(result.outcome)).length\n onNotify(`报工完成:成功 ${success} 项${failed ? `,${failed} 项需处理` : ''}`, failed > 0)\n if (!failed && data.results.length === payload.length) onClose()\n } catch (error) {\n setError(`未能确认提交结果,请刷新并核对各 Task 后再操作:${errorText(error)}`)\n setUncertain(true)\n onNotify('报工结果待核对,请刷新查看', true)\n } finally { submitting.current = false; setBusy(false); onSaved() }\n }\n return <Modal open title=\"一键报工\" closeLabel=\"关闭\" className={css.reportDialog!} onClose={() => { if (!busy) onClose() }}\n footer={<><span className={css.reportTotal}>已选 {selectedTasks.length} 项 · {Number.isFinite(total) ? total : 0} 人天</span><Button variant=\"ghost\" disabled={busy} onClick={onClose}>关闭</Button><Button variant=\"primary\" disabled={busy || loading || !selectedTasks.length || invalid || !!suggestions.conflicts.length || uncertain} onClick={() => void submit()}>{busy ? '正在报工…' : '确认工时并流转'}</Button></>}>\n <div className={`${css.form} ${css.reportForm}`}>\n <div className={css.reportToolbar} role=\"toolbar\" aria-label=\"报工周切换\">\n <div className={css.reportWeekNav}>\n <button type=\"button\" className={css.reportNavButton} aria-label=\"上一周\" title=\"上一周\" disabled={busy} onClick={() => setWeek(addDays(week, -7))}><svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"m10 4-4 4 4 4\" /></svg></button>\n <label className={css.reportWeekPicker}>\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><rect x=\"2.5\" y=\"3.5\" width=\"11\" height=\"10\" rx=\"2\" /><path d=\"M5 2v3m6-3v3M3 7h10\" /></svg>\n <span>{week.replaceAll('-', '.')} <b>—</b> {end.replaceAll('-', '.')}</span>\n <input type=\"date\" aria-label=\"报工所在周\" value={week} disabled={busy} onClick={event => { try { event.currentTarget.showPicker?.() } catch { /* Native date control remains available. */ } }} onChange={event => { if (event.target.value) setWeek(reportWeek(event.target.value)) }} />\n </label>\n <button type=\"button\" className={css.reportNavButton} aria-label=\"下一周\" title=\"下一周\" disabled={busy} onClick={() => setWeek(addDays(week, 7))}><svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"m6 4 4 4-4 4\" /></svg></button>\n </div>\n <div className={css.reportWeekActions}>\n <button type=\"button\" className={css.reportToolbarButton} disabled={busy} aria-pressed={week === reportWeek(today())} onClick={() => setWeek(reportWeek(today()))}>本周</button>\n <button type=\"button\" className={css.reportToolbarButton} disabled={busy || loading} onClick={() => setVersion(value => value + 1)}><svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M13 6a5.2 5.2 0 1 0 .2 3M13 2.5V6H9.5\" /></svg>刷新</button>\n </div>\n </div>\n <p className={css.help}>单位:人天,最小 0.5。同一天一个 Task 默认 1,两个各 0.5;已报工 Task 仍计入当日任务数。修改后写入实际工时并流转。</p>\n {suggestions.conflicts.length > 0 && <p className={css.notice} role=\"alert\">{suggestions.conflicts.map(value => `${value.date} 有 ${value.itemKeys.length} 个 Task`).join(';')}。最小单位为 0.5,请取消部分选择或先调整排期。</p>}\n {selectedTasks.some(task => task.start < week || task.end > end) && <p className={css.notice}>跨周 Task 的建议工时仅统计本周;提交会覆盖整项 Task 的实际工时,请核对总工时及实际日期。</p>}\n {constraints.finishRange && <p className={css.help}>番茄允许的实际完成日期:{constraints.finishRange.join(' — ')}。</p>}\n {invalid && <p className={css.error}>请核对工时和日期:工时须为正数且以 0.5 递增,日期和工时须符合番茄允许范围。</p>}\n {error && <p role=\"alert\" className={css.error}>{error}</p>}\n {uncertain && <p className={css.notice}>部分结果待核对,请先点击刷新查看服务器数据,再决定是否继续。</p>}\n {loading ? <p role=\"status\">正在读取本周 Task…</p> : tasks.length === 0 ? <p>本周没有 Task</p> : <div className={css.reportTableScroll}><table className={css.reportTable}>\n <thead><tr><th>选择</th><th>Task</th><th>状态</th><th>计划 / 已报</th><th>本次实际工时</th><th>实际开始</th><th>实际结束</th></tr></thead>\n <tbody>{tasks.map(task => {\n const result = results[task.itemKey]\n const disabled = busy || terminal(task.status) || uncertain || !!result\n return <tr key={task.itemKey}>\n <td><input type=\"checkbox\" aria-label={`选择 ${task.itemKey}`} checked={selected.has(task.itemKey)} disabled={disabled} onChange={() => toggle(task.itemKey)} /></td>\n <td><strong>{task.itemType === '跟踪任务' && <Tag tone={typeTone(task.itemType)}>跟踪任务</Tag>}{task.title}</strong><div className={css.itemLink}><span>{task.itemKey}</span><TomatoLinkButton itemKey={task.itemKey} disabled={busy} /></div><small>{task.start} — {task.end}{(task.start < week || task.end > end) && ' · 跨周'}</small>{result && <p className={result.outcome === 'success' || result.outcome === 'skipped' ? css.help : css.error}>{outcomeText[result.outcome]}{result.steps.length ? ` · ${result.steps.join(';')}` : ''}{result.error ? `:${result.error}` : ''}</p>}</td>\n <td>{task.status}</td><td>{task.days} / {task.actualDays ?? '—'}</td>\n <td><input type=\"number\" min=\"0.5\" step=\"0.5\" aria-label={`${task.itemKey} 实际工时`} value={drafts[task.itemKey]?.days ?? suggestions.days[task.itemKey] ?? task.actualDays ?? ''} disabled={disabled || !selected.has(task.itemKey)} onChange={event => edit(task.itemKey, 'days', event.target.value)} /></td>\n <td><input type=\"date\" aria-label={`${task.itemKey} 实际开始`} value={drafts[task.itemKey]?.start ?? (task.actualStart || task.start)} disabled={disabled || !selected.has(task.itemKey)} onChange={event => edit(task.itemKey, 'start', event.target.value)} /></td>\n <td><input type=\"date\" aria-label={`${task.itemKey} 实际结束`} value={drafts[task.itemKey]?.end ?? (task.actualEnd || task.end)} disabled={disabled || !selected.has(task.itemKey)} onChange={event => edit(task.itemKey, 'end', event.target.value)} /></td>\n </tr>\n })}</tbody></table></div>}\n </div>\n </Modal>\n}\n","import { useEffect, useState } from 'react'\nimport type { RequirementOption } from '../requirement-search.ts'\nimport { TomatoLinkButton } from './TomatoLinkButton.tsx'\nimport css from './worktime.module.css'\n\ntype Request = <T>(path: string, input?: unknown, signal?: AbortSignal) => Promise<T>\n\nexport function RequirementPicker({ items, selected, disabled, request, onSelect }: {\n items: RequirementOption[]; selected: string; disabled: boolean; request: Request; onSelect: (key: string) => void\n}) {\n const [query, setQuery] = useState('')\n const [results, setResults] = useState<RequirementOption[]>([])\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState('')\n const [truncated, setTruncated] = useState(false)\n const q = query.trim()\n useEffect(() => {\n if (!q) { setResults([]); setError(''); setLoading(false); setTruncated(false); return }\n const controller = new AbortController()\n setLoading(true); setError(''); setResults([]); setTruncated(false)\n const timer = window.setTimeout(() => {\n void request<{ items: RequirementOption[]; truncated: boolean }>(`/requirements?q=${encodeURIComponent(q)}`, undefined, controller.signal).then(data => {\n if (!controller.signal.aborted) { setResults(data.items); setTruncated(data.truncated) }\n }).catch(error => { if (!controller.signal.aborted) setError(error instanceof Error ? error.message : '搜索失败') })\n .finally(() => { if (!controller.signal.aborted) setLoading(false) })\n }, 300)\n return () => { window.clearTimeout(timer); controller.abort() }\n }, [q, request])\n return <div className={css.requirementPicker}>\n <input type=\"search\" autoFocus aria-label=\"搜索需求编号或标题\" placeholder=\"搜索需求编号或标题(不限负责人)\" maxLength={120} value={query} disabled={disabled}\n onChange={event => { setQuery(event.target.value); onSelect('') }} />\n {!q ? <select aria-label=\"我的需求\" value={selected} disabled={disabled} onChange={event => onSelect(event.target.value)}>\n <option value=\"\">从我的需求中选择</option>\n {items.map(item => <option key={item.itemKey} value={item.itemKey}>{item.itemKey} · {item.title}</option>)}\n </select> : <>\n {loading ? <p role=\"status\" className={css.help}>正在搜索…</p> : error ? <p role=\"alert\" className={css.error}>{error}</p> : results.length === 0 ? <p className={css.help}>没有找到可访问的需求,请尝试完整编号或其他关键词。</p> :\n <div className={css.requirementResults}>{results.map(item => <div className={css.requirementResult} key={item.itemKey}>\n <button type=\"button\" className={css.requirementChoice} aria-pressed={selected === item.itemKey} disabled={disabled} onClick={() => onSelect(item.itemKey)}>\n <strong>{item.title}</strong><span>{item.itemKey} · {item.status || '状态未知'} · {item.assignees.join('、') || '未设置负责人'}</span>\n </button><TomatoLinkButton itemKey={item.itemKey} disabled={disabled} />\n </div>)}</div>}\n {truncated && <p className={css.help}>仅显示前 20 条,请输入更具体的标题或完整编号。</p>}\n </>}\n <small className={css.help}>新分配的 Task 由当前登录用户负责。</small>\n </div>\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { typeTone } from './item-type-colors.ts'\nimport type { CSSProperties, DragEvent } from 'react'\nimport { Modal, Button, Toast } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { TomatoItem } from './TomatoBoard'\nimport type { WorktimeMetadata, WorktimeUnit, WorktimeTaskChange, WorktimeRequirementChange } from '../worktime-model.ts'\nimport { addDays, applyRequirementChange, applyTaskChange, calendarDragAllowed, calendarDragRanges, calendarStart, dateKey, datesBetween, availableWorktimeSlots, taskTitle, unitDates, unitHasCreatedTasks } from '../worktime-model.ts'\nimport { worktimeText as t } from './worktime-locale.ts'\nimport { AssigneePicker } from './AssigneePicker.tsx'\nimport { TaskBugs } from './TaskBugs.tsx'\nimport { TomatoLinkButton } from './TomatoLinkButton.tsx'\nimport { TaskReport } from './TaskReport.tsx'\nimport { RequirementPicker } from './RequirementPicker.tsx'\nimport css from './worktime.module.css'\n\ntype HistoryTask = { itemType?: string; itemKey: string; title: string; status: string; start: string; end: string; days: number }\ntype CalendarDrag = { task?: HistoryTask; unit?: WorktimeUnit; anchor: string; edge: 'move' | 'start' | 'end' }\ntype DragPreview = { ranges: Array<{ start: string; end: string }>; target: string; kind: 'unit' | 'task' | 'tracking'; invalid: boolean }\ntype Stage = keyof typeof t.stageLabels\ntype RangeDraft = { key: string; id?: string; revision?: number; start: string; end: string; locked?: boolean }\nconst stages = Object.keys(t.stageLabels) as Stage[]\nconst errorText = (error: unknown) => error instanceof Error ? error.message : t.readFailed\nasync function api<T>(path: string, input?: unknown, signal?: AbortSignal): Promise<T> {\n const response = await fetch(`/api/tomato-board/worktime${path}`, {\n method: input === undefined ? 'GET' : 'POST', headers: { 'content-type': 'application/json', accept: 'application/json' },\n ...(input === undefined ? {} : { body: JSON.stringify(input) }), ...(signal ? { signal } : {}),\n })\n // Routes are registered when the DSH process starts, so a refreshed page can\n // still talk to an older host half until the app is restarted.\n if (response.status === 404) throw new Error(t.hostStale)\n let data\n try { data = await response.json() } catch { throw new Error(`${t.readFailed} (${response.status})`) }\n if (!response.ok) throw new Error(/缺少操作单元|未知路由|Not Found/u.test(String(data.error ?? '')) ? t.hostStale : data.error || `${t.readFailed} (${response.status})`)\n return data as T\n}\nconst todayKey = () => dateKey(new Date())\nconst sorted = (units: WorktimeUnit[]) => [...units].sort((a, b) => (a.start < b.start ? -1 : a.start > b.start ? 1 : 0))\nconst daysIn = (start: string, end: string) => { try { return datesBetween(start, end).length } catch { return 0 } }\n\n/** Five-week planning calendar: pick days, then one plan per requirement. */\nexport function Worktime({ active = true, assignee, users, onAssigneeChange, onRefresh }: { active?: boolean; assignee: string; users: Array<{ username: string; name: string }>; onAssigneeChange: (username: string) => void; onRefresh: () => void }) {\n const pageRef = useRef<HTMLDivElement>(null)\n const notificationId = useRef(0)\n const [notification, setNotification] = useState<{ id: number; text: string; error: boolean } | null>(null)\n const dismissNotification = useCallback(() => setNotification(null), [])\n const notify = useCallback((text: string, error = false) => {\n setNotification({ id: ++notificationId.current, text, error })\n }, [])\n const [items, setItems] = useState<TomatoItem[]>([])\n const [anchor, setAnchor] = useState(todayKey)\n const [units, setUnits] = useState<WorktimeUnit[]>([])\n const [archivedUnits, setArchivedUnits] = useState<WorktimeUnit[]>([])\n const [history, setHistory] = useState<HistoryTask[]>([])\n const [requirementChange, setRequirementChange] = useState<WorktimeRequirementChange | null>(null)\n const [taskChange, setTaskChange] = useState<WorktimeTaskChange | null>(null)\n const mutationPending = useRef(false)\n const readEpoch = useRef(0)\n const [error, setErrorValue] = useState('')\n const setError = useCallback((value: string) => {\n setErrorValue(value)\n if (value) notify(value, true)\n }, [notify])\n const [historyError, setHistoryError] = useState('')\n const [loading, setLoading] = useState(false)\n const [version, setVersion] = useState(0)\n const [selectedStory, setSelectedStory] = useState('')\n const [selection, setSelection] = useState<{ start: string; end: string } | null>(null)\n const [choosing, setChoosing] = useState(false)\n const [dragging, setDragging] = useState(false)\n const [editingKey, setEditingKey] = useState('')\n const [editingTask, setEditingTask] = useState<HistoryTask | null>(null)\n const [reporting, setReporting] = useState(false)\n const draggedTask = useRef<CalendarDrag | null>(null)\n const [dragPreview, setDragPreview] = useState<DragPreview | null>(null)\n const dragImage = useRef<HTMLCanvasElement | null>(null)\n const [saving, setSaving] = useState(false)\n const [message, setMessageValue] = useState('')\n const setMessage = useCallback((value: string) => {\n setMessageValue(value === t.taskSyncing ? value : '')\n if (value && value !== t.taskSyncing) notify(value)\n else dismissNotification()\n }, [notify, dismissNotification])\n const selecting = useRef(false)\n const pending = useRef<{ start: string; end: string } | null>(null)\n const readOnlyRef = useRef(false)\n // A pointer gesture already opened the dialog; the trailing click must not re-pick.\n const justReleased = useRef(false)\n const start = calendarStart(anchor)\n const end = addDays(start, 34)\n const dates = useMemo(() => datesBetween(start, end), [start, end])\n const requirements = useMemo(() => items.filter(item => ['Story', 'EnablerStory'].includes(item.itemType)), [items])\n const range = selection ? [selection.start, selection.end].sort() as [string, string] : null\n const readOnly = assignee !== 'currentUser()'\n const calendarUnits = useMemo(() => applyRequirementChange(units, requirementChange).map(unit => ({ ...unit, tasks: applyTaskChange(unit.tasks, taskChange) })), [units, requirementChange, taskChange])\n const calendarHistory = useMemo(() => applyTaskChange(history, taskChange), [history, taskChange])\n const [bugCounts, setBugCounts] = useState<Record<string, number>>({})\n const bugCountRevisions = useRef(new Map<string, number>())\n const updateBugCount = useCallback((itemKey: string, count: number) => {\n bugCountRevisions.current.set(itemKey, (bugCountRevisions.current.get(itemKey) ?? 0) + 1)\n setBugCounts(current => current[itemKey] === count ? current : { ...current, [itemKey]: count })\n }, [])\n const visibleTaskKeys = useMemo(() => [...new Set([\n ...calendarUnits.flatMap(unit => unit.tasks.filter(task => task.status !== 'created')), ...calendarHistory,\n ].filter(task => task.itemKey && task.start <= end && task.end >= start).map(task => task.itemKey!))].sort().join(','), [calendarUnits, calendarHistory, start, end])\n useEffect(() => {\n if (!visibleTaskKeys) return\n const controller = new AbortController()\n const keys = visibleTaskKeys.split(',')\n const revisions = new Map(keys.map(key => [key, bugCountRevisions.current.get(key) ?? 0]))\n // Counts arrive separately so Task dates never wait for relationship queries.\n void (async () => {\n for (let offset = 0; offset < keys.length && !controller.signal.aborted; offset += 20) {\n try {\n const result = await api<{ counts: Record<string, number> }>('/task-bug-counts', { itemKeys: keys.slice(offset, offset + 20) }, controller.signal)\n if (controller.signal.aborted) return\n const fresh = Object.fromEntries(Object.entries(result.counts).filter(([key]) => revisions.get(key) === (bugCountRevisions.current.get(key) ?? 0)))\n setBugCounts(current => ({ ...current, ...fresh }))\n } catch { /* A missing count must not hide Tasks or replace known counts with zero. */ }\n }\n })()\n return () => controller.abort()\n }, [visibleTaskKeys, version])\n useEffect(() => { pending.current = selection }, [selection])\n useEffect(() => { readOnlyRef.current = readOnly }, [readOnly])\n useEffect(() => {\n setHistory([]); setUnits([]); setArchivedUnits([])\n setEditingTask(null); setEditingKey(''); setChoosing(false); setSelection(null); setReporting(false)\n }, [assignee])\n useEffect(() => {\n const controller = new AbortController()\n const epoch = readEpoch.current\n setLoading(true)\n const query = encodeURIComponent(assignee)\n void Promise.all([\n api<{ units: WorktimeUnit[]; archivedUnits?: WorktimeUnit[] }>(`?assignee=${query}`, undefined, controller.signal).then(data => {\n if (!controller.signal.aborted && !mutationPending.current && epoch === readEpoch.current) { setUnits(data.units); setArchivedUnits(data.archivedUnits ?? []) }\n }).finally(() => { if (!controller.signal.aborted) setLoading(false) }),\n fetch(`/api/tomato-board/items?assignee=${query}`, { signal: controller.signal, headers: { accept: 'application/json' } }).then(async response => {\n const data = await response.json() as { items?: TomatoItem[]; error?: string }\n if (!response.ok) throw new Error(data.error || t.readFailed)\n if (!controller.signal.aborted) setItems(data.items ?? [])\n }),\n ]).catch(error => { if (!controller.signal.aborted && !mutationPending.current && epoch === readEpoch.current) setError(errorText(error)) })\n return () => controller.abort()\n }, [version, assignee])\n useEffect(() => {\n const controller = new AbortController(); setHistoryError('')\n const epoch = readEpoch.current\n void api<{ tasks: HistoryTask[]; truncated?: boolean }>(`/history?start=${start}&end=${end}&assignee=${encodeURIComponent(assignee)}`, undefined, controller.signal).then(data => {\n if (controller.signal.aborted || mutationPending.current || epoch !== readEpoch.current) return\n setHistory(data.tasks)\n if (data.truncated) setHistoryError(t.historyFailed)\n }).catch(error => { if (!controller.signal.aborted && !mutationPending.current && epoch === readEpoch.current) setHistoryError(`${t.historyFailed}:${errorText(error)}`) })\n return () => controller.abort()\n }, [start, end, version, assignee])\n useEffect(() => {\n if (!active) return\n const refresh = () => {\n if (document.visibilityState === 'hidden' || mutationPending.current) return\n setVersion(value => value + 1)\n }\n window.addEventListener('focus', refresh)\n document.addEventListener('visibilitychange', refresh)\n const timer = window.setInterval(refresh, 60_000)\n return () => {\n window.removeEventListener('focus', refresh)\n document.removeEventListener('visibilitychange', refresh)\n window.clearInterval(timer)\n }\n }, [active])\n useEffect(() => {\n if (active) return\n selecting.current = false\n setDragging(false)\n draggedTask.current = null\n setDragPreview(null)\n }, [active])\n // Releasing the pointer finishes a click or a drag, and the plan dialog opens\n // immediately — the calendar never waits for a second confirmation step.\n useEffect(() => {\n const stop = () => {\n if (!selecting.current) return\n selecting.current = false\n setDragging(false)\n if (readOnlyRef.current || !pending.current) return\n justReleased.current = true\n window.setTimeout(() => { justReleased.current = false }, 0)\n setSelectedStory(''); setError(''); setChoosing(true)\n }\n window.addEventListener('pointerup', stop)\n window.addEventListener('pointercancel', stop)\n return () => { window.removeEventListener('pointerup', stop); window.removeEventListener('pointercancel', stop) }\n }, [])\n const beginSelection = (day: string) => { selecting.current = true; setDragging(true); setMessage(''); setSelection({ start: day, end: day }) }\n // The day number is a button, so its own click opens the plan dialog directly.\n const pickDay = (day: string) => { setMessage(''); setSelection({ start: day, end: day }); setSelectedStory(''); setError(''); setChoosing(true) }\n const stretchSelection = (day: string) => { if (selecting.current) setSelection(current => current ? { ...current, end: day } : { start: day, end: day }) }\n const closePicker = () => { setChoosing(false); setSelection(null); setSelectedStory('') }\n async function saveSelection(itemKey: string) {\n if (!range || saving) return\n const duplicate = units.find(unit => unit.itemKey === itemKey && unit.start === range[0] && unit.end === range[1])\n if (duplicate) { setEditingKey(itemKey); closePicker(); setMessage(t.duplicate); return }\n setSaving(true); setError('')\n try {\n await api('/unit', { id: crypto.randomUUID(), itemKey, start: range[0], end: range[1] })\n // A touching range is merged server-side, so the absorbed unit is gone: re-read the list.\n const fresh = await api<{ units: WorktimeUnit[]; archivedUnits?: WorktimeUnit[] }>(`?assignee=${encodeURIComponent(assignee)}`)\n setUnits(fresh.units); setArchivedUnits(fresh.archivedUnits ?? [])\n setEditingKey(itemKey); closePicker(); setMessage(t.saved)\n } catch (error) { setError(errorText(error)) } finally { setSaving(false) }\n }\n async function mutateTask(task: HistoryTask, action: 'move' | 'delete', next?: { start: string; end: string }) {\n if (readOnly || saving || mutationPending.current) throw new Error(t.taskBusy)\n if (action === 'move' && (!next || !daysIn(next.start, next.end))) throw new Error(t.rangeInvalid)\n const change: WorktimeTaskChange = action === 'delete' ? { itemKey: task.itemKey, action }\n : { itemKey: task.itemKey, action, start: next!.start, end: next!.end }\n mutationPending.current = true; readEpoch.current += 1\n setTaskChange(change); setEditingTask(null); setSaving(true); setError(''); setMessage(t.taskSyncing)\n try {\n await api('/task', { itemKey: task.itemKey, action, expectedStart: task.start, expectedEnd: task.end,\n ...(next ?? {}), ...(action === 'delete' ? { confirm: true } : {}) })\n setUnits(current => current.map(unit => ({ ...unit, tasks: applyTaskChange(unit.tasks, change) })))\n setHistory(current => applyTaskChange(current, change))\n setMessage(action === 'delete' ? t.taskDeleted : t.taskMoved)\n setVersion(value => value + 1); onRefresh()\n } catch (error) {\n setMessage(''); setError(`${t.taskRolledBack}:${errorText(error)}`)\n } finally {\n readEpoch.current += 1; mutationPending.current = false\n setTaskChange(null); setSaving(false)\n setVersion(value => value + 1)\n }\n }\n async function mutateRequirement(unit: WorktimeUnit, change: WorktimeRequirementChange) {\n if (readOnly || saving || mutationPending.current) throw new Error(t.taskBusy)\n if (change.action === 'resize' && !daysIn(change.start, change.end)) throw new Error(t.rangeInvalid)\n mutationPending.current = true; readEpoch.current += 1\n setRequirementChange(change); setEditingKey(''); setSaving(true); setError(''); setMessage(t.taskSyncing)\n try {\n const data = await api<{ units: WorktimeUnit[] }>('/requirement', { ...change, itemKey: unit.itemKey,\n units: [{ id: unit.id, revision: unit.revision }] })\n setUnits(data.units); setMessage(t.requirementSaved); setVersion(value => value + 1); onRefresh()\n } catch (error) { setMessage(''); setError(`${t.taskRolledBack}:${errorText(error)}`) }\n finally {\n readEpoch.current += 1; mutationPending.current = false\n setRequirementChange(null); setSaving(false)\n }\n }\n function previewRanges(source: CalendarDrag, day: string) {\n const active = source.task ?? source.unit!\n return calendarDragRanges([active], active, source.anchor, source.edge, day)\n }\n function updateDragPreview(day: string) {\n const source = draggedTask.current\n if (!source) return\n setDragPreview(current => current?.target === day ? current : {\n ranges: previewRanges(source, day), target: day, kind: source.unit ? 'unit' : source.task?.itemType === '跟踪任务' ? 'tracking' : 'task',\n invalid: !calendarDragAllowed(source.task ?? source.unit!, source.edge, day),\n })\n }\n function weekDropDay(event: DragEvent<HTMLElement>, weekDates: string[]) {\n const bounds = event.currentTarget.getBoundingClientRect()\n return weekDates[Math.min(6, Math.max(0, Math.floor((event.clientX - bounds.left) / bounds.width * 7)))]!\n }\n async function dropTask(day: string) {\n const source = draggedTask.current\n draggedTask.current = null; setDragPreview(null)\n if (!source || source.anchor === day || readOnly) return\n if (!calendarDragAllowed(source.task ?? source.unit!, source.edge, day)) { setError(t.rangeInvalid); return }\n const next = previewRanges(source, day)[0]!\n const delta = Math.round((Date.parse(`${day}T12:00:00Z`) - Date.parse(`${source.anchor}T12:00:00Z`)) / 86400000)\n try {\n if (source.unit) {\n await mutateRequirement(source.unit, source.edge === 'move'\n ? { action: 'move', id: source.unit.id, delta }\n : { action: 'resize', id: source.unit.id, ...next })\n } else if (source.task) {\n await mutateTask(source.task, 'move', next)\n }\n } catch (error) { setError(errorText(error)) }\n }\n // Local created records are allocation journals, not live Task snapshots.\n const knownKeys = new Set(calendarUnits.flatMap(unit => unit.tasks.flatMap(task => task.status !== 'created' && task.itemKey ? [task.itemKey] : [])))\n const remote = calendarHistory.filter(task => !knownKeys.has(task.itemKey))\n const weeks: string[][] = []\n for (let i = 0; i < dates.length; i += 7) weeks.push(dates.slice(i, i + 7))\n type Bar = { key: string; kind: 'unit' | 'task' | 'tracking'; startCol: number; span: number; lane: number; label: string; tip: string; unverified?: boolean; task?: HistoryTask; unit?: WorktimeUnit; anchor?: string; onClick: () => void }\n function beginBarDrag(event: DragEvent<HTMLElement>, bar: Bar, edge: 'move' | 'start' | 'end' = 'move') {\n event.stopPropagation()\n const data = bar.task ?? bar.unit\n if (!data || !bar.anchor || readOnly || saving) { event.preventDefault(); return }\n const bounds = event.currentTarget.getBoundingClientRect()\n const offset = Math.min(bar.span - 1, Math.max(0, Math.floor((event.clientX - bounds.left) / bounds.width * bar.span)))\n const anchor = edge === 'move' ? addDays(bar.anchor, offset) : edge === 'start' ? data.start : data.end\n draggedTask.current = { ...(bar.task ? { task: bar.task } : {}), ...(bar.unit ? { unit: bar.unit } : {}), anchor, edge }\n event.dataTransfer.effectAllowed = 'move'; event.dataTransfer.setData('text/plain', data.itemKey)\n if (!dragImage.current) { dragImage.current = document.createElement('canvas'); dragImage.current.width = 1; dragImage.current.height = 1 }\n event.dataTransfer.setDragImage(dragImage.current, 0, 0)\n setDragPreview({ ranges: previewRanges(draggedTask.current, anchor), target: anchor, kind: bar.unit ? 'unit' : bar.task?.itemType === '跟踪任务' ? 'tracking' : 'task', invalid: false })\n }\n /** macOS-calendar style: clip each unit/task into the week, then stack overlapping bars into lanes. */\n const buildBars = (weekDates: string[]): Bar[] => {\n const weekStart = weekDates[0]!\n const weekEnd = weekDates[6]!\n const bars: Bar[] = []\n const clip = (s: string, e: string) => {\n if (!s || !e || e < weekStart || s > weekEnd) return null\n const i = weekDates.indexOf(s < weekStart ? weekStart : s)\n const j = weekDates.indexOf(e > weekEnd ? weekEnd : e)\n return i < 0 || j < 0 ? null : { startCol: i + 1, span: j - i + 1 }\n }\n for (const unit of calendarUnits) {\n const c = clip(unit.start, unit.end)\n if (c) bars.push({ key: `u-${unit.id}-${weekStart}`, kind: 'unit', ...c, lane: 0, unit, anchor: unit.start < weekStart ? weekStart : unit.start, label: unit.title, tip: `${t.request} · ${unit.itemKey} · ${unit.start} ~ ${unit.end} · ${datesBetween(unit.start, unit.end).length}${t.days}`, onClick: () => setEditingKey(unit.itemKey) })\n for (const [i, task] of unit.tasks.entries()) {\n if (task.status === 'created') continue\n const tc = clip(task.start, task.end)\n if (!tc) continue\n bars.push({ key: `t-${unit.id}-${i}-${weekStart}`, kind: 'task', ...tc, lane: 0, unverified: true, ...(task.itemKey ? { task: { ...task, itemKey: task.itemKey }, anchor: task.start < weekStart ? weekStart : task.start } : {}), label: task.title, tip: task.error || `${t.task} · ${task.start} ~ ${task.end} · ${task.days}${t.personDays}${task.itemKey ? ` · ${task.itemKey}` : ''} · ${task.status === 'pending' ? t.pending : t.uncertain}`, onClick: () => task.itemKey ? setEditingTask({ ...task, itemKey: task.itemKey }) : setEditingKey(unit.itemKey) })\n }\n }\n for (const task of remote) {\n const c = clip(task.start, task.end)\n if (!c) continue\n bars.push({ key: `r-${task.itemKey}-${weekStart}`, kind: task.itemType === '跟踪任务' ? 'tracking' : 'task', ...c, lane: 0, task, anchor: task.start < weekStart ? weekStart : task.start, label: task.title, tip: `${task.itemType || t.task} · ${task.status} · ${task.itemKey} · ${task.start} ~ ${task.end}`, onClick: () => setEditingTask(task) })\n }\n bars.sort((a, b) => a.startCol - b.startCol || b.span - a.span)\n const laneEnds: number[] = []\n for (const bar of bars) {\n let lane = laneEnds.findIndex(laneEnd => laneEnd < bar.startCol)\n if (lane === -1) { lane = laneEnds.length; laneEnds.push(0) }\n bar.lane = lane\n laneEnds[lane] = bar.startCol + bar.span - 1\n }\n return bars\n }\n const editingUnits = editingKey ? sorted(calendarUnits.filter(unit => unit.itemKey === editingKey)) : []\n return <div ref={pageRef} className={css.page} style={{ '--wt-accent': typeTone('Story'), '--wt-task': typeTone('Task'), '--wt-tracking': typeTone('跟踪任务') } as CSSProperties}>\n {active && reporting && <TaskReport request={api} onClose={() => setReporting(false)} onSaved={() => { setVersion(v => v + 1); onRefresh() }} onNotify={notify} />}\n {active && notification && <Toast key={notification.id} text={notification.text} anchor={pageRef.current} holdMs={notification.error ? 5000 : 2000} onDone={dismissNotification} />}\n <div className={css.toolbar}>\n <div className={css.period}><h2>{start.replaceAll('-', '.')} <span>—</span> {end.replaceAll('-', '.')}</h2><div className={css.legend}><span className={css.storyDot} />{t.request}<span className={css.taskDot} />{t.task}<span className={css.trackingDot} />跟踪任务{!readOnly && <small>{t.dayPickHint}</small>}</div></div>\n <div className={css.navigation}>\n <AssigneePicker users={users} value={assignee} onChange={onAssigneeChange} label={null} className={css.userPicker!} currentUserName={t.currentUser} ariaLabel={t.switchUser} />\n {readOnly && <span className={css.readOnlyTag}>{t.readOnlyView}</span>}\n <button type=\"button\" aria-label={t.previous} onClick={() => setAnchor(addDays(anchor, -7))}>‹</button>\n <button type=\"button\" onClick={() => setAnchor(todayKey())}>{t.today}</button>\n <button type=\"button\" aria-label={t.next} onClick={() => setAnchor(addDays(anchor, 7))}>›</button>\n <button type=\"button\" disabled={loading} onClick={() => { setVersion(v => v + 1); onRefresh() }}>{loading ? t.loading : t.refresh}</button>\n {!readOnly && <button type=\"button\" disabled={saving} onClick={() => setReporting(true)}>一键报工</button>}\n </div>\n </div>\n {historyError && <p role=\"status\" className={css.notice}>{historyError}</p>}\n {message && <p role=\"status\" className={css.notice}>{message}</p>}\n <section className={css.calendarArea} aria-label={t.dateSelection}>\n <div className={`${css.previewStatus} ${dragPreview?.invalid ? css.previewDisabledStatus : ''}`} role=\"status\" aria-live=\"polite\">{dragPreview && <>{dragPreview.invalid ? t.invalidDrag : t.previewRange} · {dragPreview.ranges.map(value => `${value.start} — ${value.end}`).join(' / ')}</>}</div>\n <div className={`${css.calendar} ${dragging ? css.dragging : ''} ${dragPreview ? css.previewing : ''}`}>\n <div className={css.weekHeader}>{t.weekdays.map(day => <div className={css.weekday} key={day}>{day}</div>)}</div>\n {weeks.map(weekDates => {\n const bars = buildBars(weekDates)\n const laneCount = bars.reduce((count, bar) => Math.max(count, bar.lane + 1), 0)\n return <div className={css.week} key={weekDates[0]}>\n <div className={css.weekScroll} role=\"region\" aria-label={`${weekDates[0]} — ${weekDates[6]}`} tabIndex={0}>\n <div className={css.weekContent} style={{ height: `${34 + laneCount * 23}px` }}\n onDragOver={event => { if (!draggedTask.current || readOnly || saving) return; event.preventDefault(); const day = weekDropDay(event, weekDates); event.dataTransfer.dropEffect = calendarDragAllowed(draggedTask.current.task ?? draggedTask.current.unit!, draggedTask.current.edge, day) ? 'move' : 'none'; updateDragPreview(day) }}\n onDrop={event => { if (!draggedTask.current || readOnly || saving) return; event.preventDefault(); event.stopPropagation(); void dropTask(weekDropDay(event, weekDates)) }}>\n {weekDates.map((day, di) => {\n const selected = range && day >= range[0] && day <= range[1]\n const previewed = dragPreview?.ranges.some(value => value.start <= day && day <= value.end)\n const isToday = day === todayKey()\n return <div key={day} className={`${css.day} ${di < 2 ? css.weekend : ''}`} data-highlighted={selected || previewed ? true : undefined}\n aria-disabled={dragPreview?.invalid && dragPreview.target === day ? true : undefined} data-date={day} onPointerDown={readOnly ? undefined : event => {\n const target = event.target as HTMLElement\n // The day number is a pick target too, so a drag may start on it.\n if (event.button !== 0 || target.closest('a,input,textarea,select') || (target.closest('button') && !target.closest('[data-pick]'))) return\n event.preventDefault(); beginSelection(day)\n }} onPointerEnter={readOnly ? undefined : () => stretchSelection(day)}>\n <button type=\"button\" data-pick=\"day\" className={css.dayNumber} aria-label={day} aria-pressed={!!selected} aria-current={isToday ? 'date' : undefined} disabled={readOnly} onClick={() => { if (!justReleased.current) pickDay(day) }}>\n <small>{day.slice(5, 7)}/</small>{Number(day.slice(8))}\n </button>\n </div>\n })}\n <div className={css.events}>\n {bars.map(bar => <button key={bar.key} type=\"button\" title={bar.tip}\n draggable={!readOnly && !saving && !!(bar.task || bar.unit)} onDragStart={event => beginBarDrag(event, bar)} onDragEnd={() => { draggedTask.current = null; setDragPreview(null) }} onClick={bar.onClick} className={`${css.bar} ${bar.kind === 'unit' ? css.barUnit : bar.unverified ? css.barUnverified : bar.kind === 'tracking' ? css.barTracking : css.barTask}`} style={{ gridColumn: `${bar.startCol} / span ${bar.span}`, gridRow: String(bar.lane + 1) }}>\n <span className={css.barLabel}>{bar.label}</span>\n {bar.task && (bugCounts[bar.task.itemKey] ?? 0) > 0 && <span className={css.taskBugBadge} aria-label={`关联 ${bugCounts[bar.task.itemKey]} 个 Bug`} title={`关联 ${bugCounts[bar.task.itemKey]} 个 Bug`}>{bugCounts[bar.task.itemKey]}</span>}\n {!readOnly && !saving && (bar.task || bar.unit) && <>\n {(bar.task ?? bar.unit)!.start >= weekDates[0]! && <span className={`${css.resizeHandle} ${css.resizeStart}`} draggable title={t.resizeStart} onDragStart={event => beginBarDrag(event, bar, 'start')} onClick={event => event.stopPropagation()} />}\n {(bar.task ?? bar.unit)!.end <= weekDates[6]! && <span className={`${css.resizeHandle} ${css.resizeEnd}`} draggable title={t.resizeEnd} onDragStart={event => beginBarDrag(event, bar, 'end')} onClick={event => event.stopPropagation()} />}\n </>}\n </button>)}\n </div>\n </div>\n </div>\n <div className={css.weekHighlights} aria-hidden=\"true\">\n {weekDates.map(day => {\n const selected = range && day >= range[0] && day <= range[1]\n const previewed = dragPreview?.ranges.some(value => value.start <= day && day <= value.end)\n const previewStart = dragPreview?.ranges.some(value => value.start === day)\n const previewEnd = dragPreview?.ranges.some(value => value.end === day)\n const disabled = dragPreview?.invalid && (previewed || dragPreview.target === day)\n return <div key={day} className={`${css.highlightCell} ${selected ? css.selectedDay : ''} ${previewed ? dragPreview?.kind === 'tracking' ? css.previewTrackingDay : dragPreview?.kind === 'task' ? css.previewTaskDay : css.previewUnitDay : ''} ${previewStart ? css.previewStartDay : ''} ${previewEnd ? css.previewEndDay : ''} ${disabled ? css.previewDisabledDay : ''}`} />\n })}\n </div>\n </div>\n })}\n </div>\n </section>\n {active && choosing && range && <Modal open title={t.pickTitle} closeLabel={t.close} onClose={() => { if (!saving) closePicker() }} className={css.dialogNarrow!}\n footer={<><Button variant=\"ghost\" disabled={saving} onClick={closePicker}>{t.cancel}</Button><Button variant=\"primary\" disabled={!selectedStory || saving} onClick={() => void saveSelection(selectedStory)}>{saving ? t.saving : t.confirmPick}</Button></>}>\n <div className={css.form}>\n <RequirementPicker items={requirements} selected={selectedStory} disabled={saving} request={api} onSelect={setSelectedStory} />\n {error && <p className={css.error} role=\"alert\">{error}</p>}\n </div>\n </Modal>}\n {active && editingTask && <TaskEditor key={editingTask.itemKey} task={editingTask} readOnly={readOnly} busy={saving} onClose={() => setEditingTask(null)} onMutate={mutateTask} onNotify={notify} onBugCountChange={updateBugCount} />}\n {active && editingKey && editingUnits.length > 0 && <GroupEditor key={editingKey} itemKey={editingKey} units={editingUnits} archivedUnits={archivedUnits} onClose={() => setEditingKey('')} onSaved={notice => { setVersion(v => v + 1); onRefresh(); if (notice) setMessage(notice) }} />}\n </div>\n}\n\n/** One requirement is one plan: every date range it owns is allocated together. */\nfunction GroupEditor({ itemKey, units: initialUnits, archivedUnits: initialArchivedUnits, onClose, onSaved }: { itemKey: string; units: WorktimeUnit[]; archivedUnits: WorktimeUnit[]; onClose: () => void; onSaved: (notice?: string) => void }) {\n const [units, setUnits] = useState(initialUnits)\n const [archivedUnits, setArchivedUnits] = useState(initialArchivedUnits)\n const historyUnits = [...units, ...archivedUnits.filter(unit => unit.itemKey === itemKey)]\n const title = units[0]?.title || itemKey\n const savedUnits = useRef(units)\n const [meta, setMeta] = useState<WorktimeMetadata | null>(null)\n const [error, setError] = useState('')\n const [busy, setBusy] = useState(true)\n const [cost, setCost] = useState(units[0]?.cost || '')\n const [team, setTeam] = useState(units[0]?.team || '')\n const [category, setCategory] = useState(units[0]?.category || '')\n const [ranges, setRanges] = useState<RangeDraft[]>(() => units.map(unit => ({ key: unit.id, id: unit.id, revision: unit.revision, start: unit.start, end: unit.end, locked: unitHasCreatedTasks(unit, units) })))\n // Prefill unsent drafts only; confirmed Tasks are shown separately.\n const [drafts, setDrafts] = useState(() => Object.fromEntries(stages.map(stage => {\n return [stage, { days: '', title: taskTitle(title, stage) }]\n })) as Record<Stage, { days: string; title: string }>)\n // Existing Tasks keep their dates and consume capacity; extra slots form the next batch.\n const hasCreated = historyUnits.some(unit => unit.tasks.some(task => task.status === 'created'))\n const rangeCount = ranges.length\n const rangesChanged = ranges.length !== savedUnits.current.length || ranges.some(range => {\n const original = savedUnits.current.find(unit => unit.id === range.id)\n return !original || original.start !== range.start || original.end !== range.end\n })\n const count = useMemo(() => {\n const valid = ranges.filter(range => range.start && range.end && range.end >= range.start)\n try { return valid.length ? availableWorktimeSlots(unitDates(valid), historyUnits.flatMap(unit => unit.tasks), unitDates(historyUnits)).length / 2 : 0 } catch { return 0 }\n }, [ranges, units, archivedUnits, itemKey])\n const plannedCount = useMemo(() => {\n const valid = ranges.filter(range => range.start && range.end && range.end >= range.start)\n try { return valid.length ? unitDates(valid).length : 0 } catch { return 0 }\n }, [ranges])\n const createdTasks = historyUnits.flatMap(unit => unit.tasks).filter(task => task.status === 'created')\n const createdDays = createdTasks.reduce((sum, task) => sum + task.days, 0)\n const total = stages.reduce((sum, stage) => sum + (Number(drafts[stage].days) || 0), 0)\n const over = total > count + 1e-6\n useEffect(() => {\n const controller = new AbortController()\n void Promise.all([\n api<WorktimeMetadata>(`/metadata?itemKey=${encodeURIComponent(itemKey)}`, undefined, controller.signal),\n api<{ units: WorktimeUnit[]; archivedUnits?: WorktimeUnit[] }>(`?itemKey=${encodeURIComponent(itemKey)}`, undefined, controller.signal),\n ]).then(([data, snapshot]) => {\n if (controller.signal.aborted) return\n setUnits(snapshot.units); setArchivedUnits(snapshot.archivedUnits ?? []); savedUnits.current = snapshot.units\n setRanges(snapshot.units.map(unit => ({ key: unit.id, id: unit.id, revision: unit.revision, start: unit.start, end: unit.end, locked: unitHasCreatedTasks(unit, snapshot.units) })))\n setMeta(data); setCost(current => current || data.suggestedCost); setTeam(current => current || data.suggestedTeam)\n setCategory(current => current || data.categories.find(value => /bug|BUG|Bug/u.test(title) ? /bug|BUG|Bug/u.test(value) : value === '软件开发') || data.categories[0] || '')\n }).catch(error => { if (!controller.signal.aborted) setError(errorText(error)) }).finally(() => { if (!controller.signal.aborted) setBusy(false) })\n return () => controller.abort()\n }, [itemKey, title])\n const inputTasks = stages.filter(stage => Number(drafts[stage].days) > 0).map(stage => ({ stage, days: Number(drafts[stage].days), title: drafts[stage].title }))\n const createBlockReasons = [\n !rangeCount && '请添加时间段',\n rangeCount > 0 && count <= 0 && '当前没有剩余可分配人天,请增加时间段',\n !meta && (error ? 'Task 创建信息读取失败,请关闭弹窗后重试' : '正在读取 Task 创建信息'),\n meta && !cost && '请选择工时成本归属',\n meta && !team && '请选择所属团队',\n meta && !category && '请选择任务分类',\n !inputTasks.length && '请至少填写一个阶段的人天',\n over && `${t.overAllocate}(${total} / ${count} 人天)`,\n ].filter((value): value is string => typeof value === 'string')\n const changeRange = (key: string, patch: Partial<RangeDraft>) => setRanges(current => current.map(range => range.key === key ? { ...range, ...patch } : range))\n /** Persist ranges first so creation always sees the exact saved revisions. */\n async function persistRanges(): Promise<Array<{ id: string; revision: number }>> {\n if (!ranges.length && !rangesChanged) throw new Error(t.rangeEmpty)\n for (const range of ranges) {\n if (!range.start || !range.end) throw new Error(t.rangeIncomplete)\n if (range.end < range.start) throw new Error(t.rangeInvalid)\n datesBetween(range.start, range.end)\n }\n const data = await api<{ units: WorktimeUnit[] }>('/ranges', {\n itemKey, units: savedUnits.current.map(unit => ({ id: unit.id, revision: unit.revision })),\n ranges: ranges.map(range => ({ id: range.id || range.key, start: range.start, end: range.end })),\n cost, team, category,\n })\n savedUnits.current = data.units\n const next = sorted(data.units).map(unit => ({ key: unit.id, id: unit.id, revision: unit.revision,\n start: unit.start, end: unit.end, locked: unitHasCreatedTasks(unit, data.units) }))\n setRanges(next)\n return next.filter(range => range.id).map(range => ({ id: range.id!, revision: range.revision ?? 0 }))\n }\n async function saveRanges() {\n setBusy(true); setError('')\n try { await persistRanges(); onSaved(t.saved); onClose() } catch (error) { setError(errorText(error)) } finally { setBusy(false) }\n }\n async function create() {\n setBusy(true); setError('')\n try {\n const claims = await persistRanges()\n if (over) throw new Error(`${t.overAllocate}:${total} > ${count} ${t.personDays}`)\n const result = await api<{ unit: WorktimeUnit; units?: WorktimeUnit[]; error?: string }>('/create', { units: claims, cost, team, category, tasks: inputTasks })\n if (result.error) { onSaved(); setError(result.error) } else { onSaved(t.createdMessage); onClose() }\n } catch (error) { setError(errorText(error)) } finally { setBusy(false) }\n }\n const renderSelect = (label: string, value: string, values: string[], change: (value: string) => void) => <label>{label}<select required value={value} disabled={busy} onChange={event => change(event.target.value)}><option value=\"\">{t.placeholder}</option>{values.map(option => <option key={option}>{option}</option>)}</select></label>\n return <Modal open title={`${t.edit} · ${itemKey}`} description={title} closeLabel={t.close} onClose={() => { if (!busy) onClose() }} className={css.dialog!}\n footer={<><Button variant=\"ghost\" disabled={busy} onClick={onClose}>{t.close}</Button><Button variant=\"outline\" disabled={busy || (!rangeCount && !rangesChanged)} onClick={() => void saveRanges()}>{busy ? t.saving : t.saveRanges}</Button><Button variant=\"primary\" disabled={busy || createBlockReasons.length > 0} onClick={() => void create()}>{busy ? t.creating : t.create}</Button></>}>\n <div className={css.form}>\n <div className={css.unitSummary}><span>{itemKey}</span><strong>{plannedCount} {t.days}</strong><TomatoLinkButton itemKey={itemKey} /></div>\n <p className={css.help}>{t.createdAllocation} {createdDays} {t.personDays} · {t.currentCapacity} {count} {t.personDays}</p>\n {!busy && createBlockReasons.length > 0 && <p className={css.error} role=\"alert\">暂不能创建:{createBlockReasons.join(';')}。</p>}\n <div className={css.stageHeading}><h3>{t.range}</h3><span>{ranges.length}</span></div>\n <p className={css.help}>{t.rangeHint}</p>\n <div className={css.ranges}>{ranges.map((range, index) => <div className={css.rangeRow} key={range.key}>\n <input type=\"date\" aria-label={`${t.start}${index + 1}`} value={range.start} disabled={range.locked || busy} onChange={event => changeRange(range.key, { start: event.target.value })} />\n <span>—</span>\n <input type=\"date\" aria-label={`${t.end}${index + 1}`} min={range.start} value={range.end} disabled={range.locked || busy} onChange={event => changeRange(range.key, { end: event.target.value })} />\n <small>{daysIn(range.start, range.end)} {t.days}{range.locked ? ` · ${t.created}` : ''}</small>\n <button type=\"button\" disabled={busy} aria-label={`${t.deleteRange} ${index + 1}`} title={t.rangeDeleteHint} onClick={() => setRanges(current => current.filter(value => value.key !== range.key))}>{t.deleteRange}</button>\n </div>)}</div>\n <button type=\"button\" className={css.addRange} disabled={busy} onClick={() => setRanges(current => [...current, { key: crypto.randomUUID(), start: '', end: '' }])}>{t.addRange}</button>\n {!meta && !error && <p role=\"status\">{t.loading}</p>}\n {meta && <><div className={css.twoColumns}><label>{t.project}<input readOnly value={meta.project} /></label><label>{t.owner}<input readOnly value={meta.assigneeName} /></label>{renderSelect(t.cost, cost, meta.costs, setCost)}{renderSelect(t.team, team, meta.teams, setTeam)}{renderSelect(t.category, category, meta.categories, setCategory)}</div><p className={css.help}>{meta.suggestionSource}</p></>}\n {hasCreated && <><div className={css.stageHeading}><h3>{t.createdAllocation}</h3><span>{createdDays} {t.personDays}</span></div>\n {createdTasks.map((task, i) => <div className={css.result} key={task.itemKey || i}><strong>{t.stageLabels[task.stage as Stage]} · {task.title}</strong><small>{task.start} — {task.end} · {task.days} {t.personDays} · {t.created}</small>{task.itemKey && <div className={css.itemLink}><span>{task.itemKey}</span><TomatoLinkButton itemKey={task.itemKey} /></div>}{task.skipped?.length ? <small>{t.skippedFields}:{task.skipped.join('、')}</small> : null}</div>)}\n </>}\n {rangeCount > 0 && <><div className={css.stageHeading}><h3>{t.currentStages}</h3><span>{t.total} <b>{total}</b> / {count} {t.personDays}{total < count - 1e-6 && <> · {t.unallocated} {Number((count - total).toFixed(2))}</>}</span></div>\n <p className={css.help}>{t.splitHint}</p>\n <div className={css.stages}>{stages.map(stage => <div key={stage} className={css.stageRow}>\n <label>{t.stageLabels[stage]}<input type=\"number\" min=\"0.5\" step=\"0.5\" inputMode=\"decimal\" placeholder=\"0\" disabled={busy} aria-label={`${t.stageLabels[stage]} ${t.personDays}`} value={drafts[stage].days} onChange={event => setDrafts(current => ({ ...current, [stage]: { ...current[stage], days: event.target.value } }))} /></label>\n <label>{t.taskTitle}<input value={drafts[stage].title} disabled={busy} aria-label={`${t.stageLabels[stage]} ${t.taskTitle}`} onChange={event => setDrafts(current => ({ ...current, [stage]: { ...current[stage], title: event.target.value } }))} /></label>\n </div>)}</div>\n {over && <p className={css.error} role=\"alert\">{t.overAllocate}:{total} > {count} {t.personDays}</p>}\n </>}\n {hasCreated && <p className={css.notice}>{t.locked}</p>}\n {historyUnits.flatMap(unit => unit.tasks).filter(task => task.status !== 'created').map((task, i) => <div className={css.result} key={i}><strong>{task.title}</strong><small>{task.start} — {task.end} · {task.days} {t.personDays} · {task.status === 'pending' ? t.pending : t.uncertain}</small>{task.itemKey && <div className={css.itemLink}><span>{task.itemKey}</span><TomatoLinkButton itemKey={task.itemKey} /></div>}{task.error && <p className={css.error}>{task.error}</p>}</div>)}\n {error && <p role=\"alert\" className={css.error}>{error}</p>}\n </div>\n </Modal>\n}\n\n/** Task changes always persist to Tomato; requirement ranges stay in the calendar. */\nfunction TaskEditor({ task, readOnly, busy: calendarBusy, onClose, onMutate, onNotify, onBugCountChange }: {\n task: HistoryTask; readOnly: boolean; busy: boolean; onClose: () => void\n onNotify: (text: string, error?: boolean) => void\n onBugCountChange: (itemKey: string, count: number) => void\n onMutate: (task: HistoryTask, action: 'move' | 'delete', next?: { start: string; end: string }) => Promise<void>\n}) {\n const [start, setStart] = useState(task.start)\n const [end, setEnd] = useState(task.end)\n const [confirmDelete, setConfirmDelete] = useState(false)\n const [error, setError] = useState('')\n const [linking, setLinking] = useState(false)\n const busy = calendarBusy || linking\n const statusLabel = ({ created: '已创建', pending: '待创建', creating: '创建中', uncertain: '待核对' } as Record<string, string>)[task.status] ?? task.status\n async function submit(action: 'move' | 'delete') {\n if (action === 'delete' && !confirmDelete) { setConfirmDelete(true); return }\n setError('')\n try { await onMutate(task, action, { start, end }) } catch (error) { setError(errorText(error)) }\n }\n return <Modal open title={`${task.itemType || t.task} · ${task.itemKey}`} description={task.title} closeLabel={t.close} onClose={() => { if (!busy) onClose() }} className={css.taskDialog!}\n footer={<><Button variant=\"ghost\" disabled={busy} onClick={onClose}>{t.close}</Button>{!readOnly && <><Button variant=\"outline\" disabled={busy} onClick={() => void submit('delete')}>{confirmDelete ? t.confirmDelete : t.deleteTask}</Button><Button variant=\"primary\" disabled={busy || !daysIn(start, end) || (start === task.start && end === task.end)} onClick={() => void submit('move')}>{busy ? t.saving : t.saveTaskDates}</Button></>}</>}>\n <div className={css.form}><div className={css.unitSummary}><span>{task.days} {t.personDays}{statusLabel && ` · ${statusLabel}`}</span><TomatoLinkButton itemKey={task.itemKey} /></div>\n <div className={css.twoColumns}>\n <label>{t.start}<input type=\"date\" value={start} disabled={readOnly || busy} onChange={event => setStart(event.target.value)} /></label>\n <label>{t.end}<input type=\"date\" min={start} value={end} disabled={readOnly || busy} onChange={event => setEnd(event.target.value)} /></label>\n </div>\n <TaskBugs itemKey={task.itemKey} readOnly={readOnly} disabled={calendarBusy} request={api} onBusyChange={setLinking} onNotify={onNotify} onCountChange={onBugCountChange} />\n {confirmDelete && <p className={css.notice}>{t.taskDeleteHint}</p>}{error && <p role=\"alert\" className={css.error}>{error}</p>}\n </div>\n </Modal>\n}\n","import type { TomatoItem } from './TomatoBoard.tsx'\n\ntype CacheStorage = Pick<Storage, 'getItem' | 'setItem'>\nexport interface BoardCache { version: 1; items: TomatoItem[]; truncated: boolean; updatedAt: number }\nconst prefix = 'taskboard.tomatoItems.v1:'\nconst textFields = ['itemKey', 'title', 'status', 'itemType', 'workspace', 'workspaceKey', 'workspaceName', 'creator', 'createdAt', 'priority', 'tomatoUrl'] as const\n\nfunction browserStorage(): CacheStorage | null {\n try { return typeof window === 'undefined' ? null : window.localStorage }\n catch { return null /* Browser storage may be disabled. */ }\n}\n\n/** Each assignee has a separate last-successful snapshot; invalid caches never block loading. */\nexport function readBoardCache(assignee: string, storage: CacheStorage | null = browserStorage()): BoardCache | null {\n try {\n const raw = storage?.getItem(prefix + encodeURIComponent(assignee))\n if (!raw) return null\n const value = JSON.parse(raw) as BoardCache\n if (!value || value.version !== 1 || typeof value.truncated !== 'boolean' || !Number.isFinite(value.updatedAt)\n || !Array.isArray(value.items) || value.items.length > 20_000) return null\n if (!value.items.every(item => item && textFields.every(field => typeof item[field] === 'string')\n && Array.isArray(item.assignees) && item.assignees.every(owner => typeof owner === 'string'))) return null\n return value\n } catch { return null /* Ignore damaged or inaccessible local snapshots. */ }\n}\n\n/** Failed requests must not replace the last successful snapshot. */\nexport function writeBoardCache(assignee: string, data: Pick<BoardCache, 'items' | 'truncated'>, storage: CacheStorage | null = browserStorage()): void {\n try { storage?.setItem(prefix + encodeURIComponent(assignee), JSON.stringify({ ...data, version: 1, updatedAt: Date.now() })) }\n catch { /* Quota or disabled storage must not turn a successful refresh into an error. */ }\n}\n","import { typeTone } from './item-type-colors.ts'\nimport { useEffect, useLayoutEffect, useRef, useState, useSyncExternalStore } from 'react'\nimport type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-api-session-controller/client'\nimport type { WorkspaceView } from '@deepseek-ai/dsh-api-workspace-controller/client'\nimport type {} from '@deepseek-ai/dsh-api-workspace-controller/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-layout/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-sidebar/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport {\n Button, IconChevronDownOutline14, IconCloseOutline16, IconCopyOutline16, IconRefreshOutline16, Menu, Modal, Toast, writeClipboard,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { MenuEntry } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { SessionId } from '@deepseek-ai/dsh-session/types'\nimport { TomatoLinkButton } from './TomatoLinkButton.tsx'\nimport css from './tomato-board.module.css'\nimport { PrAssistant } from './PrAssistant.tsx'\nimport { TeamManagement } from './TeamManagement.tsx'\nimport { Worktime } from './Worktime.tsx'\nimport { AssigneePicker } from './AssigneePicker.tsx'\nimport { worktimeText } from './worktime-locale.ts'\nimport { Tag } from './Tag'\nimport { readBoardCache, writeBoardCache } from './board-cache.ts'\n\nexport interface TomatoItem {\n itemKey: string\n title: string\n status: string\n itemType: string\n workspace: string\n workspaceKey: string\n workspaceName: string\n creator: string\n createdAt: string\n assignees: string[]\n priority: string\n tomatoUrl: string\n}\n\ninterface FilterDirectory {\n users: Array<{ username: string; name: string }>\n workspaces: Array<{ key: string; name: string }>\n}\n\ninterface LaneOrder {\n head: string | null\n next: Record<string, string | null>\n}\n\ninterface TomatoTransition {\n transition: string\n targetStatus: string\n disabled: boolean\n disabledReason?: string\n}\n\ninterface TomatoTransitionState {\n currentStatus: string\n tomatoUrl: string\n transitions: TomatoTransition[]\n}\n\ninterface BoardState {\n open: boolean\n loading: boolean\n // 本次打开期间已成功加载过一次的标记:空列表也算加载完成,\n // 用来区分「还没加载」和「加载了但结果为空」。\n loaded: boolean\n items: TomatoItem[]\n error: string | null\n successMessage: string | null\n selectedItem: TomatoItem | null\n truncated: boolean\n assignee: string\n showingCache: boolean\n}\n\nconst initialCache = readBoardCache('currentUser()')\nlet state: BoardState = { open: false, loading: false, loaded: false, items: initialCache?.items ?? [], error: null, successMessage: null, selectedItem: null,\n truncated: initialCache?.truncated ?? false, assignee: 'currentUser()', showingCache: initialCache !== null }\nlet refreshSequence = 0\nlet refreshController: AbortController | null = null\nconst listeners = new Set<() => void>()\nconst emit = (patch: Partial<BoardState>) => {\n state = { ...state, ...patch }\n for (const listener of listeners) listener()\n}\nconst subscribe = (listener: () => void) => {\n listeners.add(listener)\n return () => listeners.delete(listener)\n}\nconst snapshot = () => state\n\n// 真实番茄事项 itemKey 形如 `Gitee-Test-2026-737`、`Proxima-1116`:字母前缀(可含连字符分段)+ 数字结尾。\n// 只匹配该格式可避免把任意 `[xxx]` 开头的普通对话标题(如 `[分析]`、`[每日复盘]`)误判为番茄事项,\n// 进而错误地在对话头上渲染出状态流转按钮并触发无意义的 CLI 调用。\nconst TOMATO_ITEM_KEY_PATTERN = /^\\[([A-Za-z][A-Za-z0-9]*(?:-[A-Za-z0-9]+)*-\\d+)\\]/u\n\nconst TOMATO_STATUS_ORDER = [\n '新建', 'Bugfix', '修复中', '开发中', '待测试', '测试中', '测试通过', '已完成',\n '已取消', '延期解决', '测试完成', '待开发', '不修复', '已挂起',\n]\nconst TOMATO_FILTER_BLACKLIST_KEY = 'taskboard.tomatoFilterBlacklist.v1'\nconst TOMATO_SEARCH_KEY = 'taskboard.tomatoSearch.v1'\nconst TOMATO_SESSION_LINKS_KEY = 'taskboard.tomatoSessionLinks.v1'\nconst TOMATO_MUTED_ITEMS_KEY = 'taskboard.tomatoMutedItems.v1'\nconst TOMATO_LANE_ORDER_KEY = 'taskboard.tomatoLaneOrder.v1'\n\nfunction readLaneOrder(): LaneOrder {\n try {\n const value = JSON.parse(window.localStorage.getItem(TOMATO_LANE_ORDER_KEY) ?? '{}')\n return {\n head: typeof value?.head === 'string' ? value.head : null,\n next: value?.next && typeof value.next === 'object' ? value.next as Record<string, string | null> : {},\n }\n } catch {\n return { head: null, next: {} }\n }\n}\n\nfunction laneOrderValues(order: LaneOrder): string[] {\n const values: string[] = []\n const seen = new Set<string>()\n let current = order.head\n while (current && !seen.has(current) && values.length < 1000) {\n values.push(current)\n seen.add(current)\n current = order.next[current] ?? null\n }\n return values\n}\n\nfunction createLaneOrder(values: string[]): LaneOrder {\n const next: Record<string, string | null> = {}\n values.forEach((value, index) => { next[value] = values[index + 1] ?? null })\n return { head: values[0] ?? null, next }\n}\n\nfunction applyLaneOrder(statuses: string[], order: LaneOrder): string[] {\n const available = new Set(statuses)\n const tracked = laneOrderValues(order).filter(status => available.has(status))\n const trackedSet = new Set(tracked)\n return [...tracked, ...statuses.filter(status => !trackedSet.has(status))]\n}\n\nfunction readSessionLinks(): Record<string, string> {\n try {\n const value = JSON.parse(window.localStorage.getItem(TOMATO_SESSION_LINKS_KEY) ?? '{}')\n return value && typeof value === 'object' ? value as Record<string, string> : {}\n } catch {\n return {}\n }\n}\n\nfunction linkedSessionId(itemKey: string): SessionId | '' {\n const value = readSessionLinks()[itemKey]\n return typeof value === 'string' && value ? value as SessionId : ''\n}\n\nfunction saveSessionLink(itemKey: string, sessionId: SessionId) {\n const links = readSessionLinks()\n links[itemKey] = sessionId\n window.localStorage.setItem(TOMATO_SESSION_LINKS_KEY, JSON.stringify(links))\n}\n\nfunction readFilterBlacklist(): { types: Set<string>; statuses: Set<string>; workspaces: Set<string> } {\n try {\n const value = JSON.parse(window.localStorage.getItem(TOMATO_FILTER_BLACKLIST_KEY) ?? '{}')\n return {\n types: new Set(Array.isArray(value?.types) ? value.types.filter((item: unknown): item is string => typeof item === 'string') : []),\n statuses: new Set(Array.isArray(value?.statuses) ? value.statuses.filter((item: unknown): item is string => typeof item === 'string') : []),\n workspaces: new Set(Array.isArray(value?.workspaces) ? value.workspaces.filter((item: unknown): item is string => typeof item === 'string') : []),\n }\n } catch {\n return { types: new Set(), statuses: new Set(), workspaces: new Set() }\n }\n}\n\nfunction readMutedItems(): Set<string> {\n try {\n const value = JSON.parse(window.localStorage.getItem(TOMATO_MUTED_ITEMS_KEY) ?? '[]')\n return new Set(Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : [])\n } catch {\n return new Set()\n }\n}\n\nfunction readSearch(): string {\n try {\n return window.localStorage.getItem(TOMATO_SEARCH_KEY) ?? ''\n } catch {\n return ''\n }\n}\n\nfunction saveSearch(value: string) {\n try {\n if (value) window.localStorage.setItem(TOMATO_SEARCH_KEY, value)\n else window.localStorage.removeItem(TOMATO_SEARCH_KEY)\n } catch {\n // localStorage may be unavailable in restricted browser contexts; the in-memory search still works.\n }\n}\n\nasync function refresh(assignee = 'currentUser()') {\n const sequence = ++refreshSequence\n refreshController?.abort()\n const controller = new AbortController()\n refreshController = controller\n const cached = readBoardCache(assignee)\n const changedOwner = state.assignee !== assignee\n emit({ loading: true, error: null, successMessage: null, assignee, selectedItem: null,\n showingCache: changedOwner ? cached !== null : state.items.length > 0 || cached !== null,\n ...(changedOwner || !state.items.length ? { items: cached?.items ?? [], truncated: cached?.truncated ?? false, showingCache: cached !== null } : {}),\n })\n try {\n const query = new URLSearchParams({ assignee })\n const response = await fetch(`/api/tomato-board/items?${query}`, { signal: controller.signal, headers: { accept: 'application/json' } })\n const body = await response.json() as { items?: TomatoItem[]; truncated?: boolean; error?: string }\n if (!response.ok) throw new Error(body.error || `请求失败 (${response.status})`)\n if (sequence !== refreshSequence || controller.signal.aborted) return\n if (!Array.isArray(body.items)) throw new Error('番茄事项返回格式异常')\n writeBoardCache(assignee, { items: body.items, truncated: body.truncated === true })\n emit({ items: body.items, truncated: body.truncated === true, loaded: true, showingCache: false, successMessage: `已刷新 ${body.items.length} 条事项` })\n } catch (error) {\n if (sequence === refreshSequence && !controller.signal.aborted) emit({ error: error instanceof Error ? error.message : '番茄事项读取失败' })\n } finally {\n if (sequence === refreshSequence) { emit({ loading: false }); refreshController = null }\n }\n}\n\nfunction dismissSuccessMessage() {\n emit({ successMessage: null })\n}\n\nfunction closeWorkbench(ctx: Context) {\n refreshSequence += 1\n refreshController?.abort(); refreshController = null\n // 关闭时清掉 loaded 和 error:下次打开工作台会重新拉取一次最新数据。\n emit({ open: false, loading: false, selectedItem: null, loaded: false, error: null, successMessage: null })\n ctx.layout.selectPanel(null)\n}\n\nfunction TomatoBoardAction({ wide, openWorkbench }: { wide: boolean; openWorkbench: () => void }) {\n return (\n <button className={css.sidebarAction} type=\"button\" title=\"番茄工作台\" onClick={openWorkbench}>\n <span className={css.tomatoIcon} aria-hidden=\"true\">T</span>\n {wide && <span>番茄工作台</span>}\n </button>\n )\n}\n\nfunction TomatoBoardTopbarAction({ openWorkbench }: { openWorkbench: () => void }) {\n return (\n <button className={css.topbarAction} type=\"button\" title=\"打开番茄工作台\" onClick={openWorkbench}>\n <span className={css.tomatoIcon} aria-hidden=\"true\">T</span>\n <span>番茄工作台</span>\n </button>\n )\n}\n\nfunction CreateConversationDialog({ ctx, item }: { ctx: Context; item: TomatoItem }) {\n const [workspaceId, setWorkspaceId] = useState('')\n const [workspaceMenuOpen, setWorkspaceMenuOpen] = useState(false)\n const [creating, setCreating] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const workspaces = useSyncExternalStore(\n listener => ctx.workspaces.list.subscribe(listener),\n () => ctx.workspaces.list.getSnapshot(),\n () => ctx.workspaces.list.getSnapshot(),\n )\n const selectedWorkspace = workspaces.items.find(workspace => workspace.workspaceId === workspaceId)\n\n async function createConversation() {\n if (!selectedWorkspace || creating) return\n setCreating(true)\n setError(null)\n try {\n const createdSessionId = await ctx.sessions.create({ workspaceId: selectedWorkspace.workspaceId })\n const session = ctx.sessions.binding(createdSessionId)?.session\n if (!session) throw new Error('新建对话未能在 Harness 中加载')\n const title = `[${item.itemKey}] ${item.title}`\n const renamed = await session.rename(title)\n if (!renamed.ok) throw new Error(`对话标题设置失败:${renamed.error.message}`)\n const prompt = [\n `请处理番茄事项 ${item.itemKey}。`,\n `标题:${item.title}`,\n `类型:${item.itemType || '未设置'}`,\n `状态:${item.status || '未设置'}`,\n `优先级:${item.priority || '未设置'}`,\n ].join('\\n')\n const prompted = await session.prompt([{ type: 'text', text: prompt }], 'queue')\n if (!prompted.ok) throw new Error(`事项上下文写入失败:${prompted.error.message}`)\n saveSessionLink(item.itemKey, createdSessionId)\n ctx.sessions.open(createdSessionId)\n closeWorkbench(ctx)\n } catch (reason) {\n setError(reason instanceof Error ? reason.message : 'Harness 对话创建失败')\n } finally {\n setCreating(false)\n }\n }\n\n return (\n <Modal\n open\n onClose={() => emit({ selectedItem: null })}\n title=\"选择处理该事项的仓库\"\n closeLabel=\"关闭\"\n description={item.title}\n className={css.createDialog!}\n footer={(\n <>\n <Button variant=\"ghost\" onClick={() => emit({ selectedItem: null })}>取消</Button>\n <Button variant=\"primary\" disabled={!selectedWorkspace || creating} onClick={() => void createConversation()}>\n {creating ? '正在创建…' : '创建并进入对话'}\n </Button>\n </>\n )}\n >\n <div className={css.dialogBody}>\n <span>{item.itemKey}</span>\n {error ? <div className={css.error} role=\"alert\">{error}</div> : null}\n <Menu\n open={workspaceMenuOpen}\n portal\n items={workspaces.items.map((workspace: WorkspaceView) => ({\n id: workspace.workspaceId,\n label: workspace.title,\n }))}\n selectedId={workspaceId || undefined}\n onSelect={id => {\n setWorkspaceId(id)\n setWorkspaceMenuOpen(false)\n }}\n onClose={() => setWorkspaceMenuOpen(false)}\n anchor={(\n <Button\n className={css.workspaceTrigger}\n variant=\"outline\"\n aria-haspopup=\"menu\"\n aria-expanded={workspaceMenuOpen}\n onClick={() => setWorkspaceMenuOpen(open => !open)}\n >\n <span>{selectedWorkspace?.title ?? '选择 Harness 项目…'}</span>\n <span aria-hidden=\"true\">⌄</span>\n </Button>\n )}\n />\n {selectedWorkspace ? <code>{selectedWorkspace.path}</code> : null}\n </div>\n </Modal>\n )\n}\n\nfunction TomatoBoardPanel({ ctx }: { ctx: Context }) {\n const board = useSyncExternalStore(subscribe, snapshot, snapshot)\n const workbenchRef = useRef<HTMLElement>(null)\n const filterMenuRef = useRef<HTMLDetailsElement>(null)\n const [page, setPage] = useState<'board' | 'team' | 'worktime' | 'pr'>('board')\n const [visitedTabs, setVisitedTabs] = useState({ pr: false, team: false, worktime: false })\n const [teamToolbar, setTeamToolbar] = useState<React.ReactNode>(null)\n const [search, setSearch] = useState(readSearch)\n const [blacklist, setBlacklist] = useState(readFilterBlacklist)\n const [mutedItems, setMutedItems] = useState(readMutedItems)\n const [copyNotice, setCopyNotice] = useState<{ id: number; text: string } | null>(null)\n const [selectedAssignee, setSelectedAssignee] = useState(() => state.assignee)\n const [filterDirectory, setFilterDirectory] = useState<FilterDirectory>({ users: [], workspaces: [] })\n const [directoryVersion, setDirectoryVersion] = useState(0)\n const [laneOrder, setLaneOrder] = useState(readLaneOrder)\n const [draggedLane, setDraggedLane] = useState<string | null>(null)\n const [dropLane, setDropLane] = useState<{ status: string; after: boolean } | null>(null)\n const laneElements = useRef(new Map<string, HTMLElement>())\n const previousLanePositions = useRef(new Map<string, DOMRect>())\n const sessions = useSyncExternalStore(\n listener => ctx.sessions.list.subscribe(listener),\n () => ctx.sessions.list.getSnapshot(),\n () => ctx.sessions.list.getSnapshot(),\n )\n\n useEffect(() => {\n // 用 loaded 而不是 items.length 判断:成功返回空列表时也算加载完成,\n // 否则 loading 变回 false 会再次命中本 effect,形成无限请求循环。\n if (board.open && !board.loaded && !board.loading && !board.error) void refresh(selectedAssignee)\n }, [board.error, board.loaded, board.loading, board.open, selectedAssignee])\n useEffect(() => {\n if (!board.open) return\n void fetch('/api/tomato-board/filters', { headers: { accept: 'application/json' } })\n .then(response => response.ok ? response.json() : Promise.reject(new Error(`HTTP ${response.status}`)))\n .then(value => setFilterDirectory(value as FilterDirectory))\n .catch(() => {})\n }, [board.open, directoryVersion])\n useEffect(() => {\n if (!board.open) return\n // Selection changes cover new sessions and navigation from other entry points.\n // Metadata updates (streaming, titles, unread status) must not dismiss the board.\n let currentSession = ctx.sessions.list.getSnapshot().current\n const unsubscribe = ctx.sessions.list.subscribe(() => {\n const nextSession = ctx.sessions.list.getSnapshot().current\n if (nextSession === currentSession) return\n currentSession = nextSession\n closeWorkbench(ctx)\n })\n const closeOnSessionClick = (event: MouseEvent) => {\n if (event.button !== 0 || !(event.target instanceof Element)) return\n if (workbenchRef.current?.contains(event.target)) return\n if (event.target.closest('[role=\"dialog\"], [role=\"menu\"]')) return\n // Harness marks session rows (including search results) with aria-selected;\n // project rows only have aria-expanded. Clicking the already selected session\n // must also return to the conversation, even though its ID stays unchanged.\n const row = event.target.closest('[role=\"treeitem\"][aria-selected]')\n if (!row) return\n const control = event.target.closest('button, a, input, select, textarea, [role=\"button\"]')\n if (control && control !== row) return\n closeWorkbench(ctx)\n }\n // Bubble after the row's navigation handler; menus can stop propagation and\n // dragging a row never counts as a navigation click.\n document.addEventListener('click', closeOnSessionClick)\n return () => {\n unsubscribe()\n document.removeEventListener('click', closeOnSessionClick)\n }\n }, [board.open])\n useEffect(() => {\n const closeFilterMenu = (event: PointerEvent) => {\n const menu = filterMenuRef.current\n if (menu?.open && event.target instanceof Node && !menu.contains(event.target)) menu.open = false\n }\n const closeFilterMenuOnEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && filterMenuRef.current?.open) filterMenuRef.current.open = false\n }\n document.addEventListener('pointerdown', closeFilterMenu, true)\n document.addEventListener('keydown', closeFilterMenuOnEscape)\n return () => {\n document.removeEventListener('pointerdown', closeFilterMenu, true)\n document.removeEventListener('keydown', closeFilterMenuOnEscape)\n }\n }, [])\n useLayoutEffect(() => {\n const previous = previousLanePositions.current\n if (previous.size === 0) return\n if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\n previous.clear()\n return\n }\n for (const [status, element] of laneElements.current) {\n const before = previous.get(status)\n if (!before) continue\n const after = element.getBoundingClientRect()\n const deltaX = before.left - after.left\n const deltaY = before.top - after.top\n if (deltaX || deltaY) {\n element.animate(\n [{ transform: `translate(${deltaX}px, ${deltaY}px)` }, { transform: 'translate(0, 0)' }],\n { duration: 240, easing: 'cubic-bezier(.2,.8,.2,1)' },\n )\n }\n }\n previous.clear()\n }, [laneOrder])\n if (!board.open) return null\n\n function openItem(item: TomatoItem) {\n const stored = linkedSessionId(item.itemKey)\n const titlePrefix = `[${item.itemKey}]`\n // 只有至少跑过一轮对话的会话才算「已关联」:blank 会话(创建后没跑起来、\n // 流程失败留下的空壳等)不拦截点击,让它走选项目的新建流程。\n const hasConversation = (id: SessionId) => sessions.byId[id]?.blank === false\n const discovered = sessions.ids.find(id => {\n const summary = sessions.byId[id]\n const matched = summary?.title?.startsWith(titlePrefix) === true || summary?.displayTitle?.startsWith(titlePrefix) === true\n return matched && hasConversation(id)\n })\n const associated = stored && hasConversation(stored) ? stored : discovered\n if (associated) {\n saveSessionLink(item.itemKey, associated)\n ctx.sessions.open(associated)\n closeWorkbench(ctx)\n return\n }\n emit({ selectedItem: item })\n }\n\n const normalizedSearch = search.trim().toLowerCase()\n const filteredItems = board.items.filter(item => (\n !blacklist.types.has(item.itemType)\n && !blacklist.statuses.has(item.status)\n && !blacklist.workspaces.has(item.workspaceKey)\n && !blacklist.workspaces.has(item.workspaceName)\n && (!normalizedSearch || [\n item.itemKey, item.title, item.itemType, item.status, item.workspaceKey, item.workspaceName, item.creator, item.assignees.join(' '), item.priority,\n ].join(' ').toLowerCase().includes(normalizedSearch))\n ))\n const typeOptions = [...new Set(board.items.map(item => item.itemType).filter(Boolean))].sort((left, right) => left.localeCompare(right))\n const statusOptions = applyLaneOrder([...new Set([\n ...TOMATO_STATUS_ORDER,\n ...board.items.map(item => item.status).filter(status => !TOMATO_STATUS_ORDER.includes(status)),\n ])], laneOrder)\n // Workspace options derive purely from the current assignee's items (the\n // board query is already assignee-scoped server-side), so the count is\n // however many workspaces that assignee actually spans — never the logged-in\n // account's full directory. The item filter checks key AND name so both\n // identity forms hide correctly.\n const workspaceOptions = (() => {\n const entries = new Map<string, { value: string; label: string }>()\n for (const item of board.items) {\n const value = item.workspaceKey || item.workspaceName || item.workspace\n if (!value) continue\n const label = item.workspaceName && item.workspaceKey && item.workspaceName !== item.workspaceKey ? `${item.workspaceName} (${item.workspaceKey})` : value\n if (!entries.has(value)) entries.set(value, { value, label })\n }\n return [...entries.values()]\n })()\n const defaultStatuses = [...new Set([\n ...TOMATO_STATUS_ORDER.filter(status => filteredItems.some(item => item.status === status)),\n ...filteredItems.map(item => item.status).filter(status => !TOMATO_STATUS_ORDER.includes(status)),\n ])]\n const statuses = applyLaneOrder(defaultStatuses, laneOrder)\n\n const persistBlacklist = (next: typeof blacklist) => {\n window.localStorage.setItem(TOMATO_FILTER_BLACKLIST_KEY, JSON.stringify({\n types: [...next.types],\n statuses: [...next.statuses],\n workspaces: [...next.workspaces],\n }))\n return next\n }\n const toggleBlacklist = (kind: 'types' | 'statuses' | 'workspaces', value: string) => setBlacklist(current => {\n const nextValues = new Set(current[kind])\n if (nextValues.has(value)) nextValues.delete(value)\n else nextValues.add(value)\n return persistBlacklist({ ...current, [kind]: nextValues })\n })\n const setWorkspaceFilterAll = (visible: boolean) => setBlacklist(current => persistBlacklist({\n ...current,\n workspaces: visible ? new Set<string>() : new Set(workspaceOptions.map(option => option.value)),\n }))\n\n const toggleMutedItem = (itemKey: string) => setMutedItems(current => {\n const next = new Set(current)\n if (next.has(itemKey)) next.delete(itemKey)\n else next.add(itemKey)\n window.localStorage.setItem(TOMATO_MUTED_ITEMS_KEY, JSON.stringify([...next]))\n return next\n })\n\n const moveLane = (dragged: string, target: string, after: boolean) => {\n if (dragged === target) return\n previousLanePositions.current = new Map([...laneElements.current].map(([status, element]) => [status, element.getBoundingClientRect()]))\n setLaneOrder(current => {\n const visible = applyLaneOrder(defaultStatuses, current).filter(status => status !== dragged)\n const targetIndex = visible.indexOf(target)\n visible.splice(targetIndex + (after ? 1 : 0), 0, dragged)\n const previousTracked = laneOrderValues(current)\n const trackedSet = new Set([...previousTracked, dragged, target])\n const hiddenTracked = previousTracked.filter(status => !visible.includes(status))\n const next = createLaneOrder([...visible.filter(status => trackedSet.has(status)), ...hiddenTracked])\n window.localStorage.setItem(TOMATO_LANE_ORDER_KEY, JSON.stringify(next))\n return next\n })\n }\n\n return (\n <section ref={workbenchRef} className={css.workbench} aria-label=\"番茄工作台\">\n <header className={css.header}>\n <div className={css.titleRow}>\n <h1>番茄工作台</h1>\n <div className={css.actions}>\n {page === 'team' && teamToolbar}\n {page === 'board' && <><label className={css.searchField}>\n <span aria-hidden=\"true\">⌕</span>\n <input\n type=\"search\"\n value={search}\n onChange={event => { const value = event.target.value; setSearch(value); saveSearch(value) }}\n placeholder=\"搜索标题、编号或类型…\"\n aria-label=\"搜索标题或 tag\"\n />\n </label>\n <details ref={filterMenuRef} className={css.filterMenu}>\n <summary aria-label=\"空间、负责人、类型和状态筛选\" title=\"空间、负责人、类型和状态筛选\">\n <span aria-hidden=\"true\">▽</span>\n {(blacklist.types.size > 0 || blacklist.statuses.size > 0 || blacklist.workspaces.size > 0 || selectedAssignee !== 'currentUser()') && <i />}\n </summary>\n <div className={css.filterPopover}>\n <WorkspaceFilterRow options={workspaceOptions} hidden={blacklist.workspaces} onToggle={value => toggleBlacklist('workspaces', value)} onSetAll={setWorkspaceFilterAll} />\n <AssigneePicker users={filterDirectory.users} value={selectedAssignee} onChange={value => { setSelectedAssignee(value); void refresh(value) }} />\n <FilterRow label=\"类型\" options={typeOptions} hidden={blacklist.types} onToggle={value => toggleBlacklist('types', value)} />\n <FilterRow label=\"状态\" options={statusOptions} hidden={blacklist.statuses} onToggle={value => toggleBlacklist('statuses', value)} />\n </div>\n </details>\n <Button\n variant=\"toolbar\"\n size=\"sm\"\n className={css.headerIconButton}\n icon={<IconRefreshOutline16 />}\n title=\"刷新番茄事项\"\n aria-label=\"刷新番茄事项\"\n disabled={board.loading}\n onClick={() => { void refresh(selectedAssignee); setDirectoryVersion(value => value + 1) }}\n />\n </>}\n <Button\n variant=\"toolbar\"\n size=\"sm\"\n className={css.headerIconButton}\n icon={<IconCloseOutline16 />}\n title=\"关闭番茄工作台\"\n aria-label=\"关闭番茄工作台\"\n onClick={() => closeWorkbench(ctx)}\n />\n </div>\n </div>\n <nav className={css.pageTabs} aria-label=\"番茄工作台页面\">\n <button type=\"button\" aria-current={page === 'board' ? 'page' : undefined} onClick={() => setPage('board')}>事项看板</button>\n <button type=\"button\" aria-current={page === 'worktime' ? 'page' : undefined} onClick={() => { setVisitedTabs(current => ({ ...current, worktime: true })); setPage('worktime') }}>{worktimeText.title}</button>\n <button type=\"button\" aria-current={page === 'pr' ? 'page' : undefined} onClick={() => { setVisitedTabs(current => ({ ...current, pr: true })); setPage('pr') }}>PR 助手</button>\n <button type=\"button\" aria-current={page === 'team' ? 'page' : undefined} onClick={() => { setVisitedTabs(current => ({ ...current, team: true })); setPage('team') }}>团队管理</button>\n </nav>\n </header>\n {visitedTabs.pr && <div className={css.tabPanel} hidden={page !== 'pr'}><PrAssistant active={page === 'pr'} ctx={ctx} close={() => closeWorkbench(ctx)} /></div>}\n {visitedTabs.team && <div className={css.tabPanel} hidden={page !== 'team'}><TeamManagement active={page === 'team'} toolbarTarget={setTeamToolbar} onOpenItem={openItem} /></div>}\n {visitedTabs.worktime && <div className={css.tabPanel} hidden={page !== 'worktime'}><Worktime active={page === 'worktime'} key={selectedAssignee} assignee={selectedAssignee} users={filterDirectory.users} onAssigneeChange={value => { setSelectedAssignee(value); void refresh(value) }} onRefresh={() => { void refresh(selectedAssignee) }} /></div>}\n {page === 'board' ? <>\n {board.successMessage && <Toast\n text={board.successMessage}\n anchor={workbenchRef.current}\n holdMs={1500}\n onDone={dismissSuccessMessage}\n />}\n {copyNotice && <Toast key={copyNotice.id} text={copyNotice.text} anchor={workbenchRef.current} holdMs={1800} onDone={() => setCopyNotice(null)} />}\n {board.error && <div className={css.error} role=\"alert\">{board.error}</div>}\n {board.showingCache && <p className={css.notice} role=\"status\">{board.loading ? '正在显示上次缓存,后台更新中…' : '当前显示上次缓存,刷新成功后会自动更新。'}</p>}\n {board.loading && board.items.length === 0 && <p className={css.empty} role=\"status\">正在读取事项…</p>}\n {board.truncated && <p className={css.notice} role=\"status\">事项数量已达配置上限,当前仅展示前 {board.items.length} 条。</p>}\n <div className={css.board}>\n {statuses.map(status => {\n const items = filteredItems\n .filter(item => item.status === status)\n // 泳道内卡片按创建时间从新到旧(新创建的排最上面)\n .sort((left, right) => right.createdAt.localeCompare(left.createdAt))\n return (\n <section\n ref={element => { if (element) laneElements.current.set(status, element); else laneElements.current.delete(status) }}\n className={`${css.lane} ${draggedLane === status ? css.laneDragging : ''} ${dropLane?.status === status ? (dropLane.after ? css.laneDropAfter : css.laneDropBefore) : ''}`}\n key={status}\n aria-labelledby={`tomato-lane-${status}`}\n onDragOver={event => {\n if (!draggedLane || draggedLane === status) return\n event.preventDefault()\n const bounds = event.currentTarget.getBoundingClientRect()\n setDropLane({ status, after: event.clientX >= bounds.left + bounds.width / 2 })\n }}\n onDrop={event => {\n event.preventDefault()\n if (draggedLane && dropLane?.status === status) moveLane(draggedLane, status, dropLane.after)\n setDraggedLane(null)\n setDropLane(null)\n }}\n >\n <header\n className={css.laneHeader}\n draggable\n title=\"拖拽调整泳道顺序\"\n onDragStart={event => {\n event.dataTransfer.effectAllowed = 'move'\n event.dataTransfer.setData('text/plain', status)\n const lane = event.currentTarget.parentElement\n if (lane) {\n const bounds = lane.getBoundingClientRect()\n event.dataTransfer.setDragImage(\n lane,\n Math.min(Math.max(event.clientX - bounds.left, 0), bounds.width),\n Math.min(Math.max(event.clientY - bounds.top, 0), bounds.height),\n )\n }\n setDraggedLane(status)\n }}\n onDragEnd={() => { setDraggedLane(null); setDropLane(null) }}\n >\n <h2 id={`tomato-lane-${status}`}>{status}</h2>\n <span>{items.length}</span>\n </header>\n <div className={css.cards}>\n {items.map(item => (\n <article\n className={`${css.card} ${mutedItems.has(item.itemKey) ? css.cardMuted : ''}`}\n key={item.itemKey}\n tabIndex={0}\n role=\"button\"\n onClick={() => openItem(item)}\n onKeyDown={event => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n openItem(item)\n }\n }}\n >\n <div className={css.cardTopline}>\n <div className={css.cardIdentity}>\n <span className={css.key}>{item.itemKey}</span>\n <Button className={css.copyButton} variant=\"ghost\" size=\"sm\" title=\"复制事项编号\" aria-label={`复制事项编号 ${item.itemKey}`}\n onClick={async event => {\n event.stopPropagation()\n const copied = await writeClipboard(item.itemKey)\n dismissSuccessMessage()\n setCopyNotice(current => ({ id: (current?.id ?? 0) + 1, text: copied ? `已复制 ${item.itemKey}` : '复制失败,请手动复制事项编号' }))\n }}\n onKeyDown={event => event.stopPropagation()}>\n <IconCopyOutline16 size={14} />\n </Button>\n </div>\n <div className={css.cardButtons}>\n <Button\n className={css.muteButton}\n variant=\"ghost\"\n size=\"sm\"\n title={mutedItems.has(item.itemKey) ? '取消置灰' : '置灰标记'}\n aria-label={mutedItems.has(item.itemKey) ? `取消置灰 ${item.itemKey}` : `置灰 ${item.itemKey}`}\n aria-pressed={mutedItems.has(item.itemKey)}\n onClick={event => {\n event.stopPropagation()\n toggleMutedItem(item.itemKey)\n }}\n onKeyDown={event => event.stopPropagation()}\n >\n ●\n </Button>\n <TomatoLinkButton itemKey={item.itemKey} />\n </div>\n </div>\n <strong>{item.title}</strong>\n <div className={css.cardMeta}>\n <Tag tone={typeTone(item.itemType)}>{item.itemType}</Tag>\n {(item.workspaceName || item.workspaceKey) && <Tag title=\"空间\">{item.workspaceName && item.workspaceKey && item.workspaceName !== item.workspaceKey ? `${item.workspaceName} (${item.workspaceKey})` : item.workspaceKey || item.workspaceName}</Tag>}\n {item.priority && <Tag title=\"优先级\">{priorityLabel(item.priority)}</Tag>}\n {item.creator && <Tag title=\"创建人\">创建 {item.creator}</Tag>}\n </div>\n </article>\n ))}\n </div>\n </section>\n )\n })}\n {!board.loading && !board.error && statuses.length === 0 && (\n <div className={css.empty}>当前没有可显示的番茄事项</div>\n )}\n </div>\n </> : null}\n {board.selectedItem ? <CreateConversationDialog ctx={ctx} item={board.selectedItem} /> : null}\n </section>\n )\n}\n\nconst PRIORITY_LABELS: Record<string, string> = {\n '69e65065-4b34-4109-bca9-0154e548554a': 'P0',\n '8f7912a5-9176-4a79-a269-2269ac42b5a2': 'P1',\n 'ca8c3e43-3e7b-444d-8940-d0967d944921': 'P2',\n 'ec31e4c1-b55b-479d-be97-86d5f7bf38ef': 'P2',\n '1a3e1092-7d70-42ee-ad38-0e8d953c4c23': 'P3',\n 'faae52da-28c8-46fc-96dd-db9cdb28b557': 'P4',\n}\nconst priorityLabel = (value: string) => PRIORITY_LABELS[value] ?? value\n\n\nfunction FilterRow({ label, options, hidden, onToggle }: {\n label: string\n options: string[]\n hidden: ReadonlySet<string>\n onToggle: (value: string) => void\n}) {\n return (\n <div className={css.filterRow}>\n <span>{label}</span>\n <div>\n {options.map(option => (\n <Tag\n key={option}\n interactive\n pressed={!hidden.has(option)}\n tone={label === '类型' ? typeTone(option) : undefined}\n onClick={() => onToggle(option)}\n >\n {option}\n </Tag>\n ))}\n </div>\n </div>\n )\n}\n\nconst WORKSPACE_SELECT_ALL = 'workspace:select-all'\nconst WORKSPACE_SELECT_NONE = 'workspace:select-none'\n\n/** Multi-select workspace dropdown composed on the shared Menu primitive. */\nfunction WorkspaceFilterRow({ options, hidden, onToggle, onSetAll }: {\n options: Array<{ value: string; label: string }>\n hidden: ReadonlySet<string>\n onToggle: (value: string) => void\n onSetAll: (visible: boolean) => void\n}) {\n const [open, setOpen] = useState(false)\n const rootRef = useRef<HTMLDivElement>(null)\n const visibleValues = options.filter(option => !hidden.has(option.value)).map(option => option.value)\n const summary = options.length === 0\n ? '暂无空间'\n : hidden.size === 0\n ? `全部空间 · ${options.length}`\n : visibleValues.length === 0\n ? '未选择空间'\n : `已选空间 ${visibleValues.length} / ${options.length}`\n // First Esc closes this dropdown only; the host filter popover stays open.\n useEffect(() => {\n if (!open) return\n const onKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') { event.stopPropagation(); setOpen(false) }\n }\n const root = rootRef.current\n root?.addEventListener('keydown', onKey, true)\n return () => root?.removeEventListener('keydown', onKey, true)\n }, [open])\n const items: MenuEntry[] = options.map(option => ({ id: option.value, label: option.label }))\n const footer: MenuEntry[] = [\n { id: WORKSPACE_SELECT_ALL, label: '全部显示' },\n { id: WORKSPACE_SELECT_NONE, label: '全部隐藏' },\n ]\n return (\n <div className={css.filterRow} ref={rootRef}>\n <span>空间</span>\n <div className={css.workspaceSelect}>\n <Menu\n open={open}\n items={items}\n footer={footer}\n selectedIds={visibleValues}\n onSelect={(id) => {\n if (id === WORKSPACE_SELECT_ALL) onSetAll(true)\n else if (id === WORKSPACE_SELECT_NONE) onSetAll(false)\n else onToggle(id)\n }}\n onClose={() => { setOpen(false) }}\n anchor={\n <button\n type=\"button\"\n className={css.workspaceTrigger}\n aria-expanded={open}\n title={summary}\n onClick={() => { setOpen(!open) }}\n >\n <span>{summary}</span>\n <i className={css.workspaceChevron} aria-hidden><IconChevronDownOutline14 /></i>\n </button>\n }\n />\n </div>\n </div>\n )\n}\n\nfunction TomatoConversationShortcut({ ctx, sessionId, useSessions }: PropsRuntime<'conversation.session.header.actions'> & { ctx: Context }) {\n const itemKey = useSessions(state => {\n const summary = state.byId[sessionId]\n const title = summary?.title ?? summary?.displayTitle ?? ''\n const match = TOMATO_ITEM_KEY_PATTERN.exec(title)?.[1]?.trim()\n if (!match) return ''\n // 仅当该对话确实由番茄工作台创建并记录在本机映射中时,才认定它是番茄事项对话。\n // 这样即便普通新建对话的标题恰好命中 itemKey 格式,也不会被误带上状态流转 UI。\n return linkedSessionId(match) === sessionId ? match : ''\n })\n const [menuOpen, setMenuOpen] = useState(false)\n const [loading, setLoading] = useState(false)\n const [transitioning, setTransitioning] = useState(false)\n const [transitionState, setTransitionState] = useState<TomatoTransitionState>({\n currentStatus: '',\n tomatoUrl: '',\n transitions: [],\n })\n const [transitionError, setTransitionError] = useState<string | null>(null)\n\n useEffect(() => {\n if (!itemKey) return\n const controller = new AbortController()\n setLoading(true)\n setTransitionError(null)\n setTransitionState({ currentStatus: '', tomatoUrl: '', transitions: [] })\n void fetch(`/api/tomato-board/transitions/${encodeURIComponent(itemKey)}`, {\n headers: { accept: 'application/json' },\n signal: controller.signal,\n }).then(async response => {\n const body = await response.json() as TomatoTransitionState & { error?: string }\n if (!response.ok) throw new Error(body.error || `请求失败 (${response.status})`)\n setTransitionState({\n currentStatus: body.currentStatus || '',\n tomatoUrl: body.tomatoUrl || '',\n transitions: body.transitions ?? [],\n })\n }).catch(error => {\n if (error instanceof Error && error.name === 'AbortError') return\n setTransitionError(error instanceof Error ? error.message : '番茄流转状态读取失败')\n }).finally(() => {\n if (!controller.signal.aborted) setLoading(false)\n })\n return () => controller.abort()\n }, [itemKey])\n\n if (!itemKey) return null\n\n async function transitionTo(transitionName: string) {\n if (transitioning) return\n setMenuOpen(false)\n setTransitioning(true)\n setTransitionError(null)\n try {\n const query = new URLSearchParams({ transition: transitionName })\n const response = await fetch(`/api/tomato-board/transition/${encodeURIComponent(itemKey)}?${query}`, {\n method: 'POST',\n headers: { accept: 'application/json' },\n })\n const body = await response.json() as {\n currentStatus?: string\n error?: string\n details?: { stderr?: string; stdout?: string }\n }\n if (!response.ok) {\n const selected = transitionState.transitions.find(transition => transition.transition === transitionName)\n const failure = [body.error, body.details?.stderr, body.details?.stdout].filter(Boolean).join('\\n')\n const requiredFieldsMissing = /字段.{0,24}必填|必填.{0,24}字段|流转前需填写/u.test(failure)\n if (selected?.targetStatus === '待测试' && requiredFieldsMissing) {\n const session = ctx.sessions.binding(sessionId)?.session\n if (!session) throw new Error('当前 Harness 对话未加载,无法交给 AI 继续处理')\n const prompt = [\n `番茄事项 ${itemKey} 流转到「待测试」失败,CLI 提示存在必填字段缺失。`,\n '请先读取番茄事项详情,并结合当前对话和仓库代码进行分析。',\n '基于证据补齐并回读确认以下字段:根因分析、RD引入原因分析、原因描述、修复版本、解决方案。',\n '不要编造业务事实;证据不足时先向我确认。',\n '只有这些字段已经持久化且回读一致后,才能重新执行「修复完成」流转到「待测试」,最后再次回读状态验证。',\n `CLI 失败信息:${failure || '未返回具体原因'}`,\n ].join('\\n')\n const prompted = await session.prompt([{ type: 'text', text: prompt }], 'queue')\n if (!prompted.ok) throw new Error(`无法把流转任务交给 AI:${prompted.error.message}`)\n setTransitionError('必填字段缺失,已交给当前对话中的 AI 分析并继续处理')\n return\n }\n throw new Error(failure || `请求失败 (${response.status})`)\n }\n const transitionsResponse = await fetch(`/api/tomato-board/transitions/${encodeURIComponent(itemKey)}`, {\n headers: { accept: 'application/json' },\n })\n const transitionsBody = await transitionsResponse.json() as TomatoTransitionState & { error?: string }\n if (!transitionsResponse.ok) {\n throw new Error(transitionsBody.error || `状态刷新失败 (${transitionsResponse.status})`)\n }\n setTransitionState({\n currentStatus: transitionsBody.currentStatus || body.currentStatus || '',\n tomatoUrl: transitionsBody.tomatoUrl || '',\n transitions: transitionsBody.transitions ?? [],\n })\n } catch (error) {\n setTransitionError(error instanceof Error ? error.message : '番茄事项流转失败')\n } finally {\n setTransitioning(false)\n }\n }\n\n const availableTransitions = transitionState.transitions.filter(transition => !transition.disabled)\n const delegatedToAgent = transitionError?.startsWith('必填字段缺失') === true\n const transitionTitle = transitionError\n ? delegatedToAgent ? transitionError : `番茄流转失败:${transitionError}`\n : loading\n ? '正在查询番茄事项状态'\n : availableTransitions.length === 0\n ? `当前状态「${transitionState.currentStatus || '未知'}」没有可用流转`\n : `当前状态:${transitionState.currentStatus || '未知'}`\n return (\n <>\n <Menu\n open={menuOpen}\n portal\n align=\"end\"\n items={transitionState.transitions.map(transition => ({\n id: transition.transition,\n label: `流转到 ${transition.targetStatus}`,\n disabled: transition.disabled,\n }))}\n onSelect={transitionName => void transitionTo(transitionName)}\n onClose={() => setMenuOpen(false)}\n anchor={(\n <Button\n variant=\"toolbar\"\n size=\"sm\"\n className={css.transitionTrigger}\n title={transitionTitle}\n aria-label={transitionTitle}\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n disabled={loading || transitioning || availableTransitions.length === 0}\n onClick={() => setMenuOpen(open => !open)}\n >\n {transitioning || delegatedToAgent || transitionError\n ? transitioning ? '正在流转…' : delegatedToAgent ? 'AI 已接手' : '流转失败'\n : (\n <>\n <span className={css.transitionCaption}>状态</span>\n <strong>{transitionState.currentStatus || '查询中…'}</strong>\n {availableTransitions.length > 0 ? (\n <>\n <span className={css.transitionDivider} aria-hidden=\"true\" />\n <span className={css.transitionAction}>流转</span>\n <IconChevronDownOutline14 className={css.transitionChevron} />\n </>\n ) : null}\n </>\n )}\n </Button>\n )}\n />\n <TomatoLinkButton itemKey={itemKey} disabled={!transitionState.tomatoUrl} />\n </>\n )\n}\n\nexport const inject = ['slots', 'layout', 'sessions', 'workspaces', 'remote', 'remote.session']\n\nexport function apply(ctx: Context): void {\n ctx.slots.inject('main', () => ctx.slots.register(\n { name: 'main', key: 'tomato-board', id: 'tomato-board-panel' },\n () => <TomatoBoardPanel ctx={ctx} />,\n ))\n const openWorkbench = () => {\n emit({ open: true, loaded: false, error: null })\n ctx.layout.selectPanel('tomato-board')\n }\n ctx.slots.inject('conversation.session.header.actions', () => ctx.slots.register(\n { name: 'conversation.session.header.actions', id: 'tomato-shortcut', order: 12 },\n props => <TomatoConversationShortcut {...props} ctx={ctx} />,\n ))\n ctx.slots.inject('sidebar.footer.action', () => ctx.slots.register(\n { name: 'sidebar.footer.action', id: 'tomato-board' },\n props => <TomatoBoardAction {...props} openWorkbench={openWorkbench} />,\n ))\n // The shell's session header is the visible top bar in the Web client. Keep the\n // sidebar shortcut as a compact fallback for narrow or collapsed layouts.\n ctx.slots.inject('conversation.session.header.actions', () => ctx.slots.register(\n { name: 'conversation.session.header.actions', id: 'tomato-board-topbar', order: 11 },\n () => <TomatoBoardTopbarAction openWorkbench={openWorkbench} />,\n ))\n}\n"],"mappings":"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"}
|